Как подключить цифровой акселерометр ADXL345 к Arduino. Аналоговые акселерометры ADXL337, ADXL377 и Arduino Датчик ускорения ардуино для шлема мотоцикла

Акселерометры используют для определения вектора ускорения. Акселерометр 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». Иначе углы и ускорения будут вычисляться со значительными ошибками.

Инструкция

Акселерометры используют для определения вектора ускорения. Акселерометр ADXL335 имеет три оси, и благодаря этому он может определять вектор ускорения в трёхмерном пространстве. Ввиду того, что сила земного притяжения - это тоже вектор, то акселерометр может определять свою собственную ориентацию в трёхмерном пространстве относительно центра Земли.
На иллюстрации приведены рисунки из паспорта (http://www.analog.com/static/imported-files/data_sheets/ADXL335.pdf) на акселерометр ADXL335. Здесь изображены координатные оси чувствительности акселерометра по отношению к геометрическому размещению корпуса устройства в пространстве, а также таблица значений напряжения с 3-х каналов акселерометра в зависимости от его ориентации в пространстве. Данные в таблице приводятся для находящегося в состоянии покоя датчика.
Рассмотрим подробнее, что же показывает нам акселерометр. Пусть датчик лежит горизонтально, например, на столе. Тогда проекция вектора ускорения будет равна 1g по оси Z, или Zout = 1g. По остальным двум осям будут нули: Xout = 0 и Yout = 0. При повороте датчика "на спину", он будет направлен в противоположную сторону относительно вектора силы тяжести, т.е. Zout = -1g. Аналогично измерения снимаются по всем трём осям. Понятно, что акселерометр может быть расположен как угодно в пространстве, поэтому со всех трёх каналов мы будем снимать отличные от нуля показания.
Если датчик сильно тряхнуть вдоль вертикальной оси Z, то значение Zout будет больше, чем "1g". Максимальное измеряемое ускорение - "3g" по каждой из осей в любом из направлений (т.е. как с "плюсом", так и с "минусом").

Думаю, с принципом работы акселерометра разобрались. Теперь рассмотрим схему подключения.
Чип аналогового акселерометра ADXL335 довольно мелкий и помещён в BGA корпус, и в домашних условиях его сложно смонтировать на плату. Поэтому я буду использовать готовый модуль GY-61 с акселерометром ADXL335. Такие модули в китайских интернет-магазинах стоят практически копейки.
Для питания акселерометра необходимо подать на вывод VCC модуля напряжение +3,3 В. Измерительные каналы датчика подключаются к аналоговым выводам Arduino, например, "A0", "A1" и "A2". Это вся схема:)

Загрузим вот такой скетч в память Arduino. Будем считывать с аналоговых входов показания по трём каналам, преобразовывать их в напряжение и выводить их в последовательный порт.
Arduino имеет 10-разрядный АЦП, а максимальное допустимое напряжение на выводе - 5 вольт. Измеренные напряжения кодируются битами, которые могут принимать только 2 значения - 0 или 1. Это значит, что весь диапазон измерений будет поделён на (1+1) в 10-ой степени, т.е. на 1024 равных отрезка.
Для того чтобы перевести снимаемые показания в вольты, нужно каждое измеренное на аналоговом входе значение поделить на 1024 (отрезка), а затем умножить на 5 (вольт).
Посмотрим, что же реально приходит с акселерометра на примере оси Z (последний столбец). Когда датчик расположен горизонтально и смотрит вверх, приходят числа (2,03 +/-0,01). Значит, это должно соответствовать ускорению "+1g" по оси Z и углу 0 градусов. Перевернём датчик. Приходят числа (1,69 +/-0,01), что должно соответствовать "-1g" и углу 180 градусов.

Снимем значения с акселерометра при углах 90 и 270 градусов и занесём в таблицу. Таблица показывает углы поворота акселерометра (столбец "A") и соответствующие им значения Zout в вольтах (столбец "B").
Для наглядности приведён график напряжений на выходе Zout в зависимости от угла поворота. Голубое поле - это область значений в спокойном состоянии (при ускорении 1g). Розовое поле на графике - это запас для того чтобы мы могли измерять ускорение до +3g и до -3g.
При повороте 90 градусов на ось Z приходится нулевое ускорение. Т.е. значение 1,67 вольт - это условный ноль Zo для оси Z. Тогда найти ускорение можно так:
g = Zout - Zo / sensitivity_z, здесь Zout - измеренное значение в милливольтах, Zo - значение при нулевом ускорении в милливольтах, sensitivity_z - чувствительность датчика по оси Z. Чувствительность приведена в паспорте и равна в среднем 300 мВ/g, но вообще лучше провести калибровку акселерометра и вычислить значение чувствительности конкретно для вашего датчика по формуле:
sensitivity_z = * 1000. В данном случае чувствительность акселерометра по оси Z = (2,03 - 1,68)*1000 = 350 мВ. Аналогично чувствительность нужно будет посчитать для осей X и Y.
В столбце "С" таблицы приводится ускорение, вычисленное для пяти углов при чувствительности, равной 350. Как видно, они практически совпадают с теми, которые показаны на рисунке 1.

Вспомнив базовый курс геометрии, получим формулу для вычисления углов поворота акселерометра:
angle_X = arctg[ sqrt(Gz^2 + Gy^2) / Gx ].
Значения получаются в радианах. Чтобы перевести их в градусы, поделим на число "Пи" и умножим на 180.
В итоге полный скетч, вычисляющий ускорения и углы поворота акселерометра по всем осям, приведён на иллюстрации. В комментариях даны пояснения к коду программы.
При выводе в порт "Serial.print()" символ "\t" обозначает знак табуляции, чтобы столбцы были ровные и значения располагались друг под другом. "+" означает конкатенацию (соединение) строк. Причём оператор "String()" явно указывает компилятору, что численное значение нужно преобразовать в строку. Оператор "round()" округляет угол с точностью до 1 градуса.

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

Прежде чем приступить к рассмотрению модуля гироскопа и акселерометра, думаю, будет не лишним коротко разобраться что это такое. Гироскоп представляет собой устройство, реагирующее на изменение углов ориентации контролируемого тела. В классическом представлении это какой-то инерционный предмет, который быстро вращается на подвесах. Как результат вращающийся предмет всегда будет сохранять свое направление, а по положению подвесов можно определить угол отклонения. На самом же деле электронные гироскопы построены по другой схеме и устроены немного сложнее (вращающийся волчок впихнуть в микросхему было бы не просто). Акселерометр - это устройство, которое измеряет проекцию кажущегося ускорения, то есть разницы между истинным ускорением объекта и гравитационным ускорением. На простом примере такая система представляет собой некоторую массу, закрепленную на подвесе, обладающим упругостью (пружина для хорошего примера). Так вот если такую систему повернуть под каким-то углом, или бросить, или предать линейное ускорение, то упругий подвес отреагирует на движение под действием массы и отклонится и вот по этому отклонению определяется ускорение. Таким образом, гироскоп реагирует на изменение в пространстве независимо от направление движения, с помощью акселерометра же может измерять линейные ускорения предмета, а так же и искусственно рассчитываемое расположение предмета в пространстве. Каждое устройство имеет свои достоинства и недостатки.

Микросхема MPU6050 содержит на борту как акселерометр, так и гироскоп, а помимо этого еще и температурный сенсор. MPU6050 является главным элементом модуля GY-531. Помимо этой микросхемы на плате модуля расположена необходимая обвязка MPU6050, в том числе подтягивающие резисторы интерфейса I 2 C, а также стабилизатор напряжения на 3,3 вольта с малым падением напряжения (при питании уже в 3,3 вольта на выходе стабилизатора будет 3 ровно вольта) с фильтрующими конденсаторами. Ну и бонусом на плате распаян SMD светодиод с ограничивающим резистором как индикатор питающего напряжения. Размер платы модуля GY-521 10 х 20 мм.

Схема модуля представлена ниже (номиналы могут немного отличаться в разных версиях модуля):

Характеристики MPU6050 :

  • напряжения питания 2,375 - 3,46 вольт
  • потребляемый ток до 4 мА
  • интерфейс передачи данных - I2C
  • максимальная скорость I2C - 400 кГц
  • вход для других датчиков I2C
  • внутренний генератор на 8 МГц (вне модуля возможность подключить внешний кварцевый резонатор на 32,768 кГц или 19,2 МГц)

Нужно отметить возможность MPU6050 работать в мастер режиме I2C для AUX выводов, к которым можно подключить еще один внешний датчик (например магнитометр). Честно говоря, я не понимаю для чего это вообще нужно, если проще подключать дополнительные датчики к общей шине I2C микроконтроллера.

Функции MPU6050 :

  • трех осевой MEMS гироскоп с 16 битным АЦП
  • трех осевой MEMS акселерометр с 16 битным АЦП
  • Digital Motion Processor (DMP)
  • slave I 2 C для подключения к микроконтроллеру
  • master I 2 C для подключения к микросхеме дополнительного датчика
  • регистры данных датчиков
  • прерывания
  • температурный сенсор
  • самопроверка гироскопа и акселерометра
  • регистр идентификации устройства

Внешний вид модуля GY-521:

В комплекте идут штыревые соединения угловые и прямые. Припаян был прямой штыревой разъем.

Данные измерений датчиков можно считывать как из регистров хранения, так и пользоваться функциями FIFO. Имеется отдельный регистр под названием Who am I, значение, записанное в этом регистре постоянно и его можно только считать, можно использовать как идентификатор устройства, значение в регистре 104 или 0х68. Отдельным выводом является выход прерываний, который настраивается регистрами настройки под определенные события.

Датчики гироскопа и акселерометра изготовлены как MEMS (микроэлектромеханическая система) - внешнее воздействие на датчик сначала изменяет состояние механической части, затем изменение состояния механической части приводит к изменению сигнала электрической части. Одним словом в одном корпусе собрана не только электроника, но и механика. В микросхеме MPU6050 содержится сразу два MEMS датчика, производитель утверждает, что их взаимное воздействие друг на друга сведено к минимуму. Ну что же, совсем не плохо за цену готового модуля порядка 2 уе. Между прочим эти модули можно приобрести на торговых площадках aliexpress или ebay.

Разберемся как можно использовать датчики акселерометра и гироскопа. Температурный датчик трогать даже не будем - данные о температуре прочитали, перевели в человеческие значения и наслаждаемся. Гироскоп выдает значения мгновенной угловой скорости с разрешением, заданным в настройках, например 2000 градусов в секунду. Если прошить микроконтроллер и смотреть на получаемые данные, то увидим только нули. Если начать крутить датчик, то получим мгновенные значения угловой скорости. Заметьте, что скорость мы получаем в градусах в секунду, а это значит, что линейные скорости не влияют на эти показания - показания будут изменяться только при повороте датчика в пространстве. Далее с помощью этих данных можно получить ориентацию объекта в пространстве. Для этого нужно получить мгновенное значение угловой скорости и умножить его на промежуток времени между опросами датчика гироскопа. Пример разрешение 2000 градусов в секунду, промежуток между опросами датчика 0,1 секунда, значение мгновенной скорости 300, значит 300*0,1=30 - за это время ось гироскопа была повернута на 30 градусов. Далее каждое полученное значение нужно сложить с предыдущим. Если ось двигалась в одном направлении - значение 30 градусов, если в другом, то -30, таким образом, при возвращении датчика в исходное положение всегда (в идеале) будет 0, при отклонении от исходного положения, при выполнении вышеописанных действий, получим угол отклонения. Обрабатывая углы трех осей гироскопа можно получить ориентацию объекта в пространстве.

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

С акселерометром все проще. Измеряя ускорения трех осей датчика можно получить данные, преобразуя их с помощью геометрии, по которым можно также получить ориентацию объекта в пространстве. Помимо этого акселерометр измеряет линейные ускорения, то есть ориентация объекта может искажаться при движении датчика в линейных направлениях. Также с помощью акселерометра можно определять движение объекта или его столкновение. Например детектировать падение объекта или толчок о преграду, чтобы обходить это.

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

Если датчик приобрели, можно переходить к рассмотрению внутренностей модуля, а именно главного элемента - микросхемы MPU6050. Информация хранится в регистрах микросхемы, которых более 100 (!). И вот тут то и кроется огромный подводный камень. производитель не утрудился расписать в документации всю информацию, а привел лишь информацию о самом необходимом. На самом деле не известно даже сколько же всего там регистров, доступных для чтения или записи или того и другого. Также информации на некоторые регистры попросту нет, кроме его названия. Ну что же, придется экспериментально определять влияния значений, записанных в некоторые регистры.

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

Интерфейс I 2 C работает по стандартной схеме. Адрес микросхемы может быть двух значений (без бита чтения / записи) в зависимости от состояния вывода AD0 - b1101000, если AD0 соединен с землей и b1101001, если AD0 соединен с источником питания. Соответственно плюс бит чтения или записи.

Микросхема содержит Digital Motion Processor (DMP), он необходим для того, чтобы обрабатывать данные, получаемые из датчиков гироскопа и акселерометра. Все это делается для того, чтобы повысить точность получаемых данных, так как при обработке данных на микроконтроллере точность может пострадать из-за снижения скорости их обработки. Как правило, алгоритмы обработки движения должны работать с достаточно высокой частотой, обычно 200 Гц, как утверждает документация.

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

Для демонстрации работы модуля была собрана схема:

Здесь использован микроконтроллер Atmega8, данные выводятся на ЖК дисплей 2004А (4 строки по 20 символов). На экран выводится следующая информация, полученная и преобразованная от микросхемы MPU6050 модуля: 1. значения по трем осям акселерометра, 2. значения по трем осям гироскопа, 3. температура, 4. углы отклонения по данным акселерометра (рассчитаны ресурсами микроконтроллера), 5. поворот по оси Z по данным гироскопа (также путем подсчета микроконтроллером). В первом и втором пункте данные имеют мгновенный характер - то есть именно то, что считывается из регистров хранения, это значит, что для гироскопа это скорость, в состоянии покоя все значения будут равны нулю.

Помимо этого, имеется 6 светодиодов, которые загораются в зависимости от положения датчика по оси Y акселерометра.

Модуль датчиков содержит уже стабилизатор на 3,3 вольта, поэтому его можно подключать как к 5 вольта, так и к 3,3 вольтам. Микроконтроллер запитывается от напряжения 3,3 вольта, чтобы не делать согласование уровней I 2 C.

Собранное устройство на макетной плате:

Для программирования микроконтроллера конфигурация фьюз битов (Atmega8):

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

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

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

Список радиоэлементов

Обозначение Тип Номинал Количество Примечание Магазин Мой блокнот
MOD1 Модуль GU-521 1 На базе MPU6050 В блокнот
IC1 МК AVR 8-бит

ATmega8

1 В блокнот
VR1 Линейный регулятор

L7805AB

1 В блокнот
VR2 Линейный регулятор

AMS1117-3.3

1 В блокнот
HG1 LCD-дисплей 2004A 1 В блокнот
C1 470 мкФ 1 В блокнот
C2, C3, C5 Конденсатор 100 нФ 3 В блокнот
C4 Электролитический конденсатор 220 мкФ 1 В блокнот
C6 Электролитический конденсатор 10 мкФ 1

После выхода iPhone 4 многие много внимания было уделено новому дисплею, корпусу и прочим важным вещам. И лишь мимоходом отметили замену акселерометров на гироскопы для улучшения управления в играх. В своей статье для «Компьютерного обозрения» я отметил этот момент, в следствие чего даже консультировал одного из читателей. Почему бы не уделить этому моменту внимание и не разобраться зачем одни датчики были заменены на другие и чем они собственно отличаются?

Начнем с того, что и акселерометры и гироскопы являются инерционными датчиками. Акселерометры (лат. accelero - ускоряю и?????? - измеряю) - приборы, предназначенные для имерения проекции кажущегося ускорения.

Простейшая модель акселлерометра

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

Условная схема определения положения устройства в пространстве с применением двух акселлерометров

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

Определение на Вики настолько далеко от общего, что обратимся к первоисточнику.

Впервые определение гироскопу дал Леон Фуко, назвавший так свой прибор, с помощью которого он наблюдал суточное вращение Земли. В Большой Советской Энциклопедии приводится следующее «Гироскоп - быстро вращающееся твердое тело, ось которого может изменять свое направление в пространстве». В современных гироскопах могут происходить разнообразные физические процессы, не обязательно основанные на вращении твердого тела. Хотя и классические гироскопы все еще применяются.

Примеры гироскопов. Банальный волчок по своей природе является гироскопом.

Примером классического гироскопа является ротор в кардановом подвесе. При вращении ротора он будет сохранять неизменным свое положение в пространстве независимо от движения основания. Таким образом можно измерять угол поворота основания, а соответственно и корабля/самолета etc. Именно по гирокомпасам ходят суда и летают самолеты, не полагаясь на примерные показания магнитного компаса, особенно в полярных широтах, а данные о положении самолета в пространстве получаются с гировертикали и гирогоризонта.

Естественно, классический гироскоп не может применяться в электронике. Для этого используются вибрационные микромеханические гироскопы - датчики угловой скорости. Чувствительный элемент таких приборов закреплен, при попытке его поворота возникает кориолисова сила, пропорциональная угловой скорости. Не вдаваясь в подробности работы, которые вряд ли будут кому-то интересны скажем, что выходным сигналом ДУС является напряжение, пропорциональное угловой скорости. Такие датчики имеют небольшие габариты (около 10x10x2 мм) и могут быть легко интегрированы в печатную плату.

Мировым лидером в производстве таких датчиков является компания Analog Devices , датчик которой изображен на рисунке. Можно с большой долей вероятности утверждать, что именно датчики этой компании установлены в iPhone 4.

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

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

Изображения датчиков взяты с сайта представительства Analog Devices в СНГ и странах Балтии

Outputs of X,Y,Z axis are connected directly to analog inputs of Arduino.

R1 is 2.7k resistor, while R2 is variable 10k resistor. Please adjust R2 to have 3.0 V output at LM317 before connecting ADXL335 board. Connect the board and adjust again, because output voltage will drop since load is connected. If readings of the acceleration are unstable please connect additional capacitor between VSS and COM.

An accelerometer can be used not only measure acceleration, but also orientation. It’s because accelerometer sense the force of gravity which is pointed to the center of earth.

This is how sensing axis are orientated to ADXL335 (images from ADXL335 datasheet)

Readings from X,Y,Z axis reflects an orientation of an accelerometer.

Новые статьи

● Проект 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


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