NexxDigital - компьютеры и операционные системы

Акселерометры используют для определения вектора ускорения. Акселерометр ADXL335 имеет три оси, и благодаря этому он может определять вектор ускорения в трёхмерном пространстве.

Ввиду того, что сила земного притяжения - это тоже вектор, мы можем определять ориентацию акселерометра в трёхмерном пространстве относительно центра Земли.

На иллюстрации приведены рисунки из паспорта на акселерометр ADXL335 . Здесь изображены координатные оси чувствительности акселерометра по отношению к геометрическому размещению корпуса устройства в пространстве, а также значения ускорений, принимаемые с 3-х каналов акселерометра в зависимости от его ориентации в пространстве. Данные приводятся для находящегося в состоянии покоя датчика, на который действует только сила земного тяготения.

Рассмотрим подробнее, что же показывает нам акселерометр. Пусть датчик лежит горизонтально, например, на столе. Тогда проекция вектора ускорения будет равна "1g" по оси Z, или Z out = 1g. По остальным двум осям будут нули: X out = 0 и Y out = 0. При повороте датчика «на спину», он будет направлен в противоположную сторону относительно вектора силы тяжести, т.е. Z out = −1g. Аналогично измерения снимаются по всем трём осям. Понятно, что акселерометр может быть расположен как угодно в пространстве, поэтому со всех трёх каналов мы будем снимать отличные от нуля показания.

Если датчик сильно тряхнуть вдоль вертикальной оси Z, то значение Z out будет больше, чем "1g". Максимальное измеряемое ускорение составляет "±3g" по каждой из осей («плюс» и «минус» тут обозначают направление ускорения).

Думаю, с принципом работы акселерометра разобрались. Теперь рассмотрим схему подключения.

2 Схема подключения акселерометра к Arduino

Чип аналогового акселерометра ADXL335 довольно мелкий и помещён в BGA корпус, и в домашних условиях его сложно смонтировать на плату. Поэтому я буду использовать готовый модуль GY-61 с акселерометром ADXL335 .

Для питания акселерометра необходимо подать на вывод VCC модуля напряжение +3,3 В . Измерительные каналы датчика подключаются к аналоговым выводам Arduino, например, "A0", "A1" и "A2". Это вся схема:)


Схема подключения аналогового трёхосевого акселерометра ADXL335 к Arduino

3 Калибровка аналогового акселерометра ADXL335

Arduino имеет 10-разрядный АЦП, а максимальное допустимое напряжение на выводе - 5 вольт. Измеренные напряжения кодируются битами, которые могут принимать только 2 значения - 0 или 1. Это значит, что весь диапазон измерений будет поделён на (1+1) 10 , т.е. на 1024 равных отрезка. Для того чтобы перевести снимаемые показания в вольты, нужно каждое измеренное на аналоговом входе значение поделить на 1024 (отрезка), а затем умножить на 5 (вольт).

Загрузим вот такой скетч в память Arduino. Будем считывать с аналоговых входов показания по трём каналам, преобразовывать их в напряжение и выводить в последовательный порт.

//определяем аналоговые пины: const int xPin = A0; const int yPin = A1; const int zPin = A2; void setup() { //инициализируем послед. порт: Serial.begin(9600); } void loop() { // считываем показания: int xRead = analogRead(xPin); int yRead = analogRead(yPin); int zRead = analogRead(zPin); //Выводим показания в порт в Вольтах: Serial.print("x: "); Serial.print(xRead * 5 / 1024.0); Serial.print(" | y: "); Serial.print(yRead * 5 / 1024.0); Serial.print(" | z: "); Serial.println(zRead * 5 / 1024.0); delay(100); //задержка 100 мс }

Посмотрим, что же реально приходит с акселерометра на примере оси Z (см. последний столбец на иллюстрации). Когда датчик расположен горизонтально и смотрит вверх, приходят числа (2,03±0,01). Это должно соответствовать ускорению "1g" по оси Z и углу 0° согласно паспорту на ADXL335. Перевернём датчик. Приходят числа (1,69±0,01), что должно соответствовать "−1g" и углу 180°.


4 Определение ускорений по трём осям акселерометра

Снимем значения с акселерометра при углах 90° и 270° и занесём в таблицу. Таблица показывает углы поворота акселерометра (столбец "A") и соответствующие им значения Z out в вольтах (столбец "B").


Для наглядности приведён график напряжений на выходе Z out в зависимости от угла поворота. Голубое поле - это область значений в спокойном состоянии (при ускорении 1g). Розовое поле на графике - это запас для того чтобы мы могли измерять ускорение до +3g и до −3g.

При угле поворота 90° на ось Z приходится нулевое ускорение. Т.е. значение 1,67 вольт - это условный ноль Z 0 . Тогда определим ускорение так: g = Z out - Z 0 / S z , здесь Z out - измеренное значение в милливольтах, Z 0 - значение при нулевом ускорении в милливольтах, S z - чувствительность датчика по оси Z, измеренная в мВ/g.

Чувствительность акселерометра приведена в паспорте и равна в среднем 300 мВ/g или 0,3 В/g, но вообще лучше провести калибровку акселерометра и вычислить значение чувствительности конкретно для вашего датчика по формуле: S z = Z(0°) - Z(90°) В данном случае чувствительность акселерометра по оси Z = 2,03 - 1,68 = 0,35 В/g. Аналогично чувствительность нужно будет посчитать для осей X и Y.

В столбце "С" таблицы приводится расчётное ускорение при чувствительности, равной 350 мВ/g. Как видно, расчёты практически совпадают с номинальными величинами, которые даются на первом рисунке из паспорта на датчик ADXL335, т.е. наш датчик довольно точно показывает свою ориентацию в пространстве (я показал это просто для самопроверки, дальше это не пригодится).

5 Определение углов поворота акселерометра

Вспомнив базовый курс школьной геометрии, выведем формулу для вычисления углов поворота акселерометра: angle_X = arctg[ √(G z 2 + G y 2) / G x ]. Значения получаются в радианах. Чтобы перевести радианы в градусы, поделим результат на число π и умножим на 180°.

В итоге полный скетч, вычисляющий ускорения и углы поворота акселерометра по всем осям, приведён на врезке. В комментариях даны пояснения к коду программы.

Const int xPin = A0; //определяем аналоговые пины, const int yPin = A1; //к которым подключим const int zPin = A2; //три канала акселерометра const float Vmax = 5.0; //макс. допустимое напряжение на аналоговом входе const float x0 = 1.71; //значения по осям при нулевых "g"; const float y0 = 1.69; //эти значения вы должны определить const float z0 = 1.68; //самостоятельно (см.шаг 4) const float sens_x = 0.35; //чувствительность по осям в В/g; const float sens_y = 0.35; //эти значения вы должны определить const float sens_z = 0.35; //самостоятельно (см.шаг 4) void setup() { Serial.begin(9600); //инициализация последовательного порта } void loop() { unsigned int value_x = analogRead(xPin); //считываем значения с акселерометра unsigned int value_y = analogRead(yPin); unsigned int value_z = analogRead(zPin); float Gx=(value_x*Vmax/1024.0 − x0)/sens_x; //определяем ускорения по осям float Gy=(value_y*Vmax/1024.0 − y0)/sens_y; float Gz=(value_z*Vmax/1024.0 − z0)/sens_z; Serial.print("Gx:\t" + String(Gx)); //выводим ускорения в послед. порт Serial.print("\t| Gy:\t" + String(Gy)); Serial.println("\t| Gz:\t" + String(Gz)); float angle_x = atan(sqrt(Gz*Gz + Gy*Gy) / Gx)*180 / PI; //ищем углы поворота float angle_y = atan(sqrt(Gx*Gx + Gz*Gz) / Gy)*180 / PI; float angle_z = atan(sqrt(Gx*Gx + Gy*Gy) / Gz)*180 / PI; Serial.print("x:\t" + String(round(angle_x))); //выводим углы поворота акселерометра Serial.print("o\t| y:\t" + String(round(angle_y))); Serial.println("o\t| z:\t" + String(round(angle_z)) + "o"); Serial.println(); delay(500); }

При выводе в порт Serial.print() символ \t обозначает знак табуляции, чтобы столбцы были ровные, и значения располагались друг под другом. Символ + означает конкатенацию (объединение) нескольких строк. Оператор String() явно указывает компилятору, что численное значение нужно преобразовать в строку. Оператор round() округляет угол с точностью до 1°.


Подключение аналогового акселерометра ADXL335 к Arduino с помощью макетной платы

Итак, мы с вами научились снимать и обрабатывать данные с аналогового акселерометра ADXL335 при помощи Arduino.

Определите «нулевые» значения напряжений и чувствительности по осям X, Y и Z для вашего датчика с помощью скетча, описанного в разделе «Калибровка аналогового акселерометра ADXL335». Иначе углы и ускорения будут вычисляться со значительными ошибками.

Новые статьи

● Проект 24: 3-осевой гироскоп + акселерометр на примере GY-521

В этом эксперименте мы познакомимся с акселерометром и гироскопом и будем с помощью Arduino получать показания с этих датчиков.

Необходимые компоненты:

Модуль GY-521 на микросхеме MPU6050 содержит гироскоп, акселерометр и температурный сенсор. На плате модуля GY-521 расположена необходимая обвязка MPU6050, в том числе подтягивающие резисторы, стабилизатор напряжения на 3,3 В с малым падением напряжения с фильтрующими конденсаторами. Обмен с микроконтроллером осуществляется по шине I2C.

Гироскоп представляет собой устройство, реагирующее на изменение углов ориентации контролируемого тела. Акселерометр - это устройство, которое измеряет проекцию кажущегося ускорения, то есть разницы между истинным ускорением объекта и гравитационным ускорением.
Схема соединений платы GY-521 к Arduino показана на рис. 24.1.

Рис. 24.1. Схема соединения GY-521 к Arduino


Код простого скетча для считывания значений гироскопа и акселерометра с датчика MPU6050 показан в листинге 24.1.

// подключение библиотек #include "I2Cdev.h" #include "MPU6050.h" #include "Wire.h" MPU6050 accelgyro; int16_t ax, ay, az; int16_t gx, gy, gz; void setup () { } Wire.begin(); Serial.begin(38400 ); // инициализация Serial.println("Initializing I2C devices..." ); accelgyro.initialize(); delay(100 ); } void loop () { // чтение значений гироскопа и акселерометра accelgyro.getMotion6(&ax, &ay, &az, &gx, &gy, &gz); // вывод значений в монитор Serial.print("a/g:\t" ); Serial.print(ax); Serial.print("\t" ); Serial.print(ay); Serial.print("\t" ); Serial.print(az); Serial.print("\t" ); Serial.print(gx); Serial.print("\t" ); Serial.print(gy); Serial.print("\t" ); Serial.println(gz); }
Порядок подключения:

1. Подключаем плату GY521 к плате Arduino по схеме на рис. 24.1.
2. Загружаем в плату Arduino скетч из листинга 24.1.
3. Открываем монитор последовательного порта Arduino IDE и смотрим вывод данных гироскопа и акселерометра (см. рис. 24.2).
4. При поворотах датчика данные изменяются.

Рис. 24.2. Вывод данных гироскопа и акселерометра в монитор Arduino IDE


Область применения таких датчиков достаточно широка. Данный модуль часто применяют для стабилизации полета квадрокоптера по причине совместного использования гироскопа и акселерометра. Кроме этого, модуль можно использовать для координации различных устройств - от просто детектора движения до системы ориентации различных роботов или управления движениями какими-либо устройствами. Область подобных сенсорных устройств достаточно новая и интересная для изучения и применения в любительской технике.

Позволяет определять ускорение действующее в направлении осей X, Y, Z и применяется для определения ориентации объекта в пространстве: углов крена и тангажа.

Видеообзор

Подключение и настройка

Акселерометр общается с управляющей электроникой по протоколу I²C / TWI . Для подключения используется два 3-проводных шлейфа . При подключении модуля к Arduino удобно использовать . Для получения данных с акселерометра мы написали библиотеку Troyka-IMU . Она скрывает в себе все тонкости протокола, через который передаются данные c акселерометра и предоставляет простые и понятные функции для вывода значений.

Пример работы

В качестве примера выведем в Serial порт направление и величину ускорения свободного падения по осям X, Y, Z.

accelerometer.ino // библиотека для работы I²C #include // библиотека для работы с модулями IMU #include // создаём объект для работы с акселерометром Accelerometer accel; void setup() { // открываем последовательный порт Serial.begin (115200 ) ; // выводим сообщение о начале инициализации Serial.println ("Accelerometer init..." ) ; // инициализация акселерометра accel.begin () ; // устанавливаем чувствительность акселерометра // 2g - по умолчанию, 4g, 8g accel.setRange (RANGE_2G) ; // выводим сообщение об удачной инициализации Serial.println ("Initialization completed" ) ; } void loop() { // вывод направления и величины ускорения в м/с² по оси X Serial.print (accel.readAX () ) ; Serial.print ("\t \t " ) ; // вывод направления и величины ускорения в м/с² по оси Y Serial.print (accel.readAY () ) ; Serial.print ("\t \t " ) ; // вывод направления и величины ускорения в м/с² по оси Z Serial.print (accel.readAZ () ) ; Serial.print ("\t \t " ) ; Serial.println ("" ) ; delay(100 ) ; /* // вывод направления и величины ускорения в м/с² по X, Y и Z float x, y, z; accel.readAXYZ(&x, &y, &z); Serial.print(x); Serial.print("\t\t"); Serial.print(y); Serial.print("\t\t"); Serial.print(z); Serial.println(""); delay(100); */ }

Элементы платы

Акселерометр на LIS331DLH

Акселерометр основан на чипе LIS331DLH и представляет собой миниатюрный датчик ускорения выполненный по технологии MEMS компании STMicroelectronicsd в корпусе LGA 16 (3x3x1 мм). Общение акселерометра с управляющей электроникой осуществляется по протоколу I²C / TWI . Адрес устройства равен 0b0011000.

Акселерометр - это устройство, которое позволяет измерить динамическое и статическое ускорение по трём осям X, Y и Z. Благодаря статическому ускорению можно определить положение в пространстве (акселерометр как датчик поворота), а благодаря динамическому (движение или встряска) - направление ускорения.

Цифровой акселерометр ADXL345 - это 3-осевой акселерометр с высоким разрешением (13 бит) по осям с пределом до ±16g. Модуль обладает пониженным энергопотреблением и малыми размерами. Информационный обмен с модулем осуществляется по последовательным интерфейсам I2C или SPI (3- или 4-проводной).

Существует множество модулей для Arduino с акселерометром ADXL345. Модуль может выглядеть, например, так:

Показанный модуль имеет название GY-291. У модуля имеются следующие выводы:

Вывод модуля Назначение Подключать к выводу Arduino
SPI I2C
GND Земля GND GND
VCC Питание +3,3V +3,3V
CS Выбор ведомого интерфейса SPI 10 -
INT1 Выход прерывания 1 (*) - -
INT2 Выход прерывания 2 (*) - -
SDO Данные от ведомого 12 -
SDA Данные от мастера интерфейса SPI
Шина данных интерфейса I2C
11 A4
SCL Шина тактирования 13 A5

(*) Работы с прерываниями ADXL345 касаться в этой статье не будем. Вот есть хорошая , в которой достаточно подробно описан вопрос работы с прерываниями.

В зависимости от выбранного интерфейса - SPI или I2C - подключение модуля будет соответствующим, как показано в таблице. Но в обоих случаях очень простым.

Рассмотрим структуру регистров микросхемы ADXL345:


Кроме того, нас интересует регистр управления питанием, т.к. он отвечает за режим работы устройства:

Как видим, бит D3 (Measure ) переключает акселерометр в режим измерения.

2 по интерфейсу SPI

Акселерометр ADXL345 поддерживает 3- и 4-проводные варианты интерфейса SPI. Мы рассмотрим только 4-проводное подключение. Кроме того, акселерометр работает в режиме 3 интерфейса SPI (помните, мы уже обсуждали: CPOL =1, CPHA =1). Диаграмма, показывающая обмен с акселерометром ADXL345 по 4-проводному интерфейсу SPI:


Здесь бит MB - это признак того, что мы собираемся читать много байтов за раз (если бит установлен в 1). Для тестирования работы с SPI устройствами и быстрого освоения порядка обмена с ними я обычно использую отладочную плату с микросхемой FT2232H. Эта микросхема поддерживает множество режимов, в том числе I2C и SPI. Управление работой микросхемы FT2232H - с помощью программы SPI via FTDI , о которой я уже неоднократно рассказывал.

Подключим акселерометр к отладочной плате и прочитаем регистр DEVID , в котором хранится постоянное значение-идентификатор акселерометра ADXL345. Значение идентификатора должно быть 0xE5.


Не забудем перед чтением записать команду 0x80, которая укажет акселерометру, что мы собираемся читать, начиная с регистра по адресу 0x0 (см. диаграмму выше, рисунок 38 - SPI 4-Wire Read):


Видно, что в регистре содержится число 0xE5, которое и является значением идентификатора акселерометра ADXL345, согласно техническому описанию (datasheet). Вот как это выглядит на временной диаграмме:


Устройство отвечает, всё нормально. Теперь нам нужно перевести акселерометр в режим измерений. Для этого необходимо записать в регистр POWER_CTL (адрес регистра 0x2D) число 0x08 (установить бит Measure в HIGH). После этого можно начинать читать регистры с 0x32 по 0x37, в которых хранятся данные об ускорениях по трём осям. Сделаем это с помощью Arduino. Напишем такой скетч:

Скетч для чтения данных ADXL345 по SPI (разворачивается) #include const byte READ = 0x80; // бит маркер чтения const byte MB = 0x40; // бит MB (многобайтовая передача) const int CS = 10; // пин выбора ведомого void setup() { Serial.begin(115200); SPI.begin(); SPI.setClockDivider(SPI_CLOCK_DIV32); // делитель частоты 500 кГц SPI.setDataMode(SPI_MODE3); // задаём 3-ий режим SPI byte id; readRegister(0x00, 1, id); // читаем регистр DEVID Serial.print("ID = "); Serial.println(id, HEX); writeRegister(0x2D, 0x08); // переводим ADXL345 в режим измерения } void loop() { byte buff; readRegister(0x32, 6, buff); // читаем значения по осям X, Y, Z int x = ((int)buff } // записывает значение в регистр void writeRegister(byte reg, byte value) { digitalWrite(CS, LOW); SPI.transfer(reg); SPI.transfer(value); digitalWrite(CS, HIGH); } // читает из регистра заданное число байтов void readRegister(byte reg, int bytesToRead, byte *outBuff) { digitalWrite(CS, LOW); reg = reg | READ; // покажем акселерометру, что хотим из него читать if (bytesToRead > 1) { reg = reg | MB; // и читать хотим много байтов } SPI.transfer(reg); // записываем адрес регистра, с которого начинаем чтение for (int i=0; i}

Вот так выглядит временная диаграмма работы этого скетча:


Ясно, почему первый байт передачи от Arduino при чтении значений ускорений по осям - число 0xF2? Это адрес первого регистра, с которого начинаем чтение (0x32), объединённый по ИЛИ с 0x80 - маркером чтения READ - и с 0x40 - маркером многобайтовой передачи MB : 0x32 OR 0x80 OR 0x40 = 0011_0010 OR 1000_0000 OR 0100_0000 = 1110_1101 = 0xF2

Что означают считанные значения? Этот вопрос рассматривается в последнем разделе статьи. Кроме того, существует ряд библиотек для Arduino, которые упрощают настройку и чтение данных с акселерометра, позволяя не думать о таких низкоуровневых вещах как регистры, биты и байты. Ссылки на библиотеки также приведены в конце статьи.

3 Работа с цифровым акселерометром ADXL345 по интерфейсу I2C

Временная диаграмма информационного обмена с ADXL345 по интерфейсу I2C выглядит так:


Давайте перепишем скетч для Arduino, который будет делать всё то же самое, только с обменом по интерфейсу I2C:

Скетч для чтения данных ADXL345 по I2C (разворачивается) #include const int adxl345 = 0x53; // I2C адрес ADXL345 void setup() { Serial.begin(9600); Wire.begin(); // запишем адрес регистра DEVID Wire.beginTransmission(adxl345); Wire.write(byte(0x00)); Wire.endTransmission(); // прочитаем регистр DEVID: Wire.requestFrom(adxl345, 1); while (Wire.available()) { byte c = Wire.read(); Serial.print("ID = "); Serial.println(c, HEX); } // переведём акселерометр в режим измерений Wire.beginTransmission(adxl345); Wire.write(byte(0x2D)); Wire.write(byte(0x08)); Wire.endTransmission(); } void loop() { // запишем адрес начала данных по осям X, Y и Z: Wire.beginTransmission(adxl345); Wire.write(byte(0x32)); Wire.endTransmission(); // прочитаем 6 байтов значений XYZ: int i = 0; byte xyz; Wire.requestFrom(adxl345, 6); while (Wire.available()) { byte c = Wire.read(); xyz[i] = c; i++; } // посчитаем и отобразим значения X, Y, Z: int x = word(xyz, xyz); int y = word(xyz, xyz); int z = word(xyz, xyz); Serial.print(x); Serial.print("\t"); Serial.print(y); Serial.print("\t"); Serial.println(z); delay(100); }

Диаграмма чтения регистра DEVID цифрового акселерометра ADXL345 при обмене по последовательному интерфейсу I2C будет в этом случае такой:


Как видно, ADXL345 возвращает нам ожидаемое значение 0xE5. А вот так будет выглядеть диаграмма чтения регистров, в которых хранятся данные по осям XYZ:

Тут всё ещё проще, чем при работе с интерфейсом SPI.

4 Разбор показаний цифрового акселерометра ADXL345

Посмотрите на фотографию ниже. На плате модуля нарисованы три оси: X, Y и Z. Они показывают направление осей акселерометра. Направления осей обусловлены расположением микросхемы ADXL345 на плате. В данном случае ось X акселерометра направлена горизонтально вправо, ось Z направлена горизонтально на нас, ось Y - вертикально вверх.


А вот что выводит наш скетч в монитор последовательного порта среды Arduino IDE (надо уточнить, что данный вывод наблюдается в режиме покоя - акселерометр неподвижно лежит на столе в положении, как на приведённом фото):

В трёх столбцах представлено значение статического ускорения, измеренное акселерометром по осям X, Y и Z, соответственно. В среднем столбце - показания оси Y - значения больше, чем в двух других. Эти значения даны в условных отсчётах, как они записаны в регистрах акселерометра. Акселерометр ADXL345 имеет несколько диапазонов измерений. Давайте посмотрим на сводную таблицу диапазонов и разрешений датчика акселерометра:


Напомню, что g - это ускорение свободного падения, численно равное примерно 9,81 метр в секунду за секунду (м/с 2).

Диапазон по умолчанию - от −16g до +16g (размах 32g ). Согласно таблице, на этот диапазон ускорений приходится 13 бит точности или 2 13 = 8192 отсчёта. Таким образом, на 1 отсчёт приходится ускорение 32g/8192 = 0,00390625g=0,00390625×9,81 ≈ 0,038 м/с 2 . Имея это в виду, получается, что в данном выводе скетча ускорение составляет:

Что ж, вполне логично. Ось Y направлена вертикально, т.е. вдоль вектора силы земного притяжения, и значение ускорения примерно равно константе g . Ускорения по осям X и Z, которые лежат в одной горизонтальной плоскости, примерно одинаковы и находятся около 0. Из-за кривизны стола, на котором стоит датчик, значения немного отличаются. Если бы я выровнял акселерометр по уровню, то его показания были бы более точные. В идеальном случае по оси Y должно быть ускорение 9,8 м/с 2 , а по осям X и Z - 0.

Кроме того, датчик ADXL345 имеет возможность тонкой настройки и калибровки. В данном примере мы этого не делали, а использовали акселерометр с заводскими настройками, как есть. Отсутствие калибровки также может вносить некоторые искажения в показания датчика. Рекомендую применять специальные библиотеки Arduino, которые упрощают взаимодействие с акселерометром ADXL345, в частности, позволяют проводить тонкую настройку.

Скачать библиотеку ADXL345

В архиве также лежит техническое описание (datasheet) на цифровой акселерометр ADXL345. Установка библиотеки производится путём копирования разархивированной папки с библиотекой в директорию libraries среды Arduino IDE.

  • скачать библиотеку Arduino для акселерометра ADXL345 с Depositfiles.

Этот акселерометр я покупал под совершенно конкретную задачу - хотел сделать устройство, которое не дает спать на спине дольше заданного времени. Что характерно, все получилось, однако у акселерометра есть несколько интересных особенностей.

Собственно, о них и хочу упомянуть.

Прежде всего надо понимать, что акселерометры бывают с цифровыми и аналоговыми интерфейсами. Первые хороши тем, что меньше подвержены помехам и позволяют подключать к единой шине множество периферийных устройств - явная экономия пинов контроллера. Минус, однако в том, что для работы с такой периферией нужно в коде реализовать протокол обмена, а это расход другого ценного ресурса - памяти.

Однако при подключении всего лишь одного датчика сэкономить выводы контроллера цифровым протоколом не получится, поскольку по количеству требуемых линий что цифра, что аналог получаются идентичными.

Гребеночку уже напаял, да

Поэтому я и сделал выбор в пользу аналогового акселерометра ADXL335 ( для любопытных). Ведь с ним можно и память сэкономить, и общаться гораздо проще - достаточно банального analogRead().

Т.е. простейший код для чтения показаний действительно прост, как амеба:

Unsigned int x, y, z; void setup() { pinMode(A0, INPUT); pinMode(A1, INPUT); pinMode(A2, INPUT); Serial.begin(9600); } void loop() { x = analogRead(A0); y = analogRead(A1); z = analogRead(A2); Serial.println("xxxx | yyyy | zzzz"); Serial.print(x, DEC); Serial.print(" | "); Serial.print(y, DEC); Serial.print(" | "); Serial.print(z, DEC); Serial.println(" | "); delay(2000); }

В итоге пришло ровно то, что на картинке, и я с упоением занялся макетированием, причем сначала - на полноразмерной плате Arduino Mega 2560. И сильно удивился, поскольку поведение акселерометра не очень укладывалось в рамки здравого смысла. Ну, по крайней мере, пока здравый смысл не сказал что-то вроде «окей, даташит я не читал, но будем считать, что акселерометр так и работает».

Вот крупнее, если не верите, что это ADXL335

Иными словами, я ожидал увидеть на выходах акселерометра значения в диапазоне от 0В до верхнего предела питания, т.е. 3,3В или 5В, поскольку акселерометр работает с обоими, но об этом позже.

Вместо этого вывод в монитор показал примерно следующее. Примерно - потому что у меня не было стенда с идеальными вертикалями и горизонталями. Все вот этими вот руками.

Значения при максимуме по оси X:
X 405 Y 331 Z 344

Значения при минимуме по оси X:
X 268 Y 333 Z 344

Значения при максимуме по оси Y:
Y 400 X 338 Z 346

Значения при минимуме по оси Y:
Y 264 X 334 Z 346

Значения при максимуме по оси Z:
Z 410 X 337 Y 329

Значения при минимуме по оси Z:
Z 275 X 335 Y 331

Показания эти идентичны что для 3В, что для 5В.

Это первое, что следует иметь в виду, когда будете применять данный акселерометр в своем подсобном хозяйстве.

Второе - упомянутый выше дуализм в смысле питания. Суть в том, что ADXL335 рассчитан на диапазон напряжений от 1,8В до 3,6В. А до 5В его дотянули очень простым способом - поставили стабилизатор на 3,3В ко входу питания.

Решение несколько варварское, поскольку вне зависимости от входного напряжения, пусть даже оно и в допустимых для акселерометра 1,8-3,6В, ток пойдет через стабилизатор. А это довольно критично, если задаться целью сделать максимально экономичное устройство.

На этот случай, как выяснилось, есть более подходящие кандидаты. Именно: макетные платки с питанием от 3,3В или же гибридные, где 5В идет через стабилизатор, а 3,3В - напрямую к чипу. В любом случае, при покупке рекомендую внимательно изучать, что собрались приобретать и соотносить увиденное с желаемым.

Что касается меня, то я решил вопрос со стабилизатором просто. Так как питаться планировал от 3В, то и питающую линию подключил сразу после стабилизатора, и на этом закрыл вопрос.

Подключился вот в эту точку

Ну а в итоге у меня получилось устройство под кодовым именем «Позиционер», которое с помощью вибросигнала предупреждает о нежелательном сне на спине, о неправильной осанке или о малой подвижности.

Выглядит не очень презентабельно, поскольку корпуса - то, что я никогда делать не умел.

Батарейка - для масштаба

.

Ничего, скоро сошью чехольчик, и будет лучше.

А вот так работает макет, где как раз видно работящий акселерометр:

По итогам общения с акселерометром (конкретно в этой модификации) хочу сообщить следующее. Штука, на мой взгляд, очень хороша для новичков сразу по нескольким причинам:

1) Безопасно для макетных плат с напряжением 3.3В и 5В, поскольку вход питания один и защищен стабилизатором;

2) Стабильность показаний;

3) Просто в использовании за счет аналогового интерфейса - analogRead() и никакой черной магии.

Что касается минусов, то они вытекают из плюсов:

1) Чтобы экономить энергию, придется поработать руками - припаяться напрямую к чипу;

2) Существует возможность поймать помехи на аналоговой линии.

Доклад закончил. Скоро буду писать про шорты брюки.

Планирую купить +21 Добавить в избранное Обзор понравился +22 +39

Если заметили ошибку, выделите фрагмент текста и нажмите Ctrl+Enter
ПОДЕЛИТЬСЯ:
NexxDigital - компьютеры и операционные системы