Подключение акселерометра к arduino: настройка и код программы

Как подключить акселерометр к Arduino

Вам понадобится

  • – Arduino;
  • – акселерометр ADXL335;
  • – персональный компьютер со средой разработки Arduino IDE.

Инструкция

Акселерометры используют для определения вектора ускорения. Акселерометр 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 = [Z(0 град.) – Z(90 град.)] * 1000. В данном случае чувствительность акселерометра по оси Z = (2,03 – 1,68)*1000 = 350 мВ.

Аналогично чувствительность нужно будет посчитать для осей X и Y.

В столбце “С” таблицы приводится ускорение, вычисленное для пяти углов при чувствительности, равной 350. Как видно, они практически совпадают с теми, которые показаны на рисунке 1.

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

В комментариях даны пояснения к коду программы.

При выводе в порт “Serial.print()” символ ” ” обозначает знак табуляции, чтобы столбцы были ровные и значения располагались друг под другом. “+” означает конкатенацию (соединение) строк. Причём оператор “String()” явно указывает компилятору, что численное значение нужно преобразовать в строку.

Оператор “round()” округляет угол с точностью до 1 градуса.

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

Полезный совет

Рекомендую определить “нулевые” значения напряжений и чувствительности по осям X, Y и Z, используя скетч, описанный в шаге 3. Иначе акселерометр будет выдавать углы со значительными ошибками.

Источники:

  • Паспорт на 3-осный аналоговый акселерометр ADXL335

Источник: https://www.kakprosto.ru/kak-918549-kak-podklyuchit-akselerometr-k-arduino

Аналоговые акселерометры ADXL337, ADXL377 и Arduino

ADXL337 и ADXL377 – это компактные, тонкие, маломощные 3-х осевые акселерометры, которые на выходе дают аналоговый сигнал в вольтах.

Основная разница между этими акселерометрами – диапазон измерений. ADXL337 измеряет ускорения в диапазоне ±3 g, а ADXL377 работает в диапазоне ±200 g и может использоваться для измерения более резких изменений движений контролируемого объекта, может использоваться для оценки вибраций.

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

На фото ниже приведены платы с установленными акселерометрами:

Акселерометры ADXL337 и ADXL377 можно (и рекомендуется!) покупать уже интегрированными в отдельный модуль. На модуле предусмотрена необходимая минимальная обвязка и готовые контакты для подключения к Arduino или другому микроконтроллеру.

Как видите, на обоих модулях одинаковое количество контактов. В таблице ниже приведена краткая информация о каждом из контактов на модулях:

Питание акселерометров ADXL337 и ADXL377

Здесь надо быть предельно осторожным. ADXL337 и ADXL377 оба должны запитываться максимальным напряжением 3.6 В! Это напряжение подается к контакту питания и к контакту Self Test. Можно использовать Arduino 5 В или 3.

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

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

Одним из достоинств акселерометров ADXL337 и ADXL377 является то, что они потребляют мало тока для работы. Обычно это около 300 мА.

Необходимые пояснения по использованию ADXL337 и ADXL377

Если вы запитываете ADXL337 или ADXL377 от 3.3 В, значение 1.65 В на контакте оси X будет соответствовать ускорению 0 g. Если на пине X у вас показания напряжения составляют 3.3 В, то на ADXL337 это значит, что сила составляет 3g.

В то время как при показаниях 3.3 В на ADXL377 означают, что нагрузка составляет 200g.

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

На модуле ADXL377 предусмотрены 4 отверстия для крепежа, так как этот датчик ускорения рассчитан на более экстремальные условия нагрузок.

На обоих модулях установлены конденсаторы на 0.01 мкФ возле выходов на оси X, Y, и Z. То есть, максимальные частоты, в пределах которых вы можете оценивать ускорение составляет 500 Гц.

Пример подключения к Arduino

Распайка

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

Если вы планируете использовать макетную плату или монтажную плату с расстоянием между контактами 0.1″, рекомендуем припаять прямую рельсу контактов с выходом типа папа. Если в планах у вас подключать акселерометр сразу к контроллеру, без макеток и монтажных плат, используйте провода.

Подключаем акселерометр к Arduino

В этом примере мы рассмотрим как можно использовать контроллер Arduino Uno для сбора и обработки данных с модуля акселерометра ADXL337 или ADXL377. Так как выходной сигнал с датчика аналоговый, нам надо подключить три контакта с отдельных осей координат к контактам 'Analog In' на Arduino. На рисунке ниже показана схема подключения модуля ADXL337. ADXL377 подключается так же.

Запитать акселерометр можно с помощью контакт 3.3 В и GND на Arduino. Контакты осей X, Y, и Z с датчика подключаются к ADC пинам (A0, A1, и A2 в рассматриваемом примере).

Пин self test (ST) можно не подключать, а можно подключить к земле (GND). Если вы хотите использовать ST контакт для двойной проверки функционирования сенсора, подключите его к 3.3 В.

Для дополнительной информации по этому поводу можете ознакомится с даташитами сенсоров: ADXL377 и ADXL377.

Программа для Arduino

После того как вы подключили акселерометр к Arduino, можно перейти к программированию. Полный скетч вы можете скачать с Github. Ссылка для ADXL337 и для ADXL377. Единственное отличие в этих скетчах – значение переменной scale.

Первые две строки кода в скетче служат для настройки параметров под ваш модуль датчика ускорения:

int scale = 3; boolean micro_is_5V = true;

Значение переменной scale устанавливается равным максимальному значению измеряемой силы g. Для ADXL337 это значение устанавливается равным 3, а для модели ADXL377 переменная принимает значение 200, так как сенсоры обеспечивают диапазоны измерений ±3g и ±200g соответственно.

Переменной micro_is_5V присваивается значение true, если используется контроллер с 5 В (например, Arduino Uno) и значение false,using если вы используете контроллер на 3.3 В (например, Arduino Pro Mini).

Это важный параметр, который напрямую влияет на дальнейшую интерпретацию данных с сенсора.

После этого используем функцию setup() для инициализации серийного соединения. Благодаря этому мы сможем выводить показания в окно серийного монитора Arduino IDE.

void setup() { // устанавливаем связь по серийному протоколу со скоростью передачи данных 115200 baud

Serial.begin(115200); }

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

void loop() { // получаем данные с акселерометра для каждой отдельной оси координат

int rawX = analogRead(A0);

Читайте также:  Parrot ar.drone 2.0: вторая версия "легенды" - arduino+

int rawY = analogRead(A1);

int rawZ = analogRead(A2);

Для того, чтобы получить числовое значение в диапазоне от 0 до 1023, которые соответствуют напряжению на входах Arduino, мы используем аналоговые входы A0, A1, и A2 и несколько считываемых значений.

Эти значения напряжений отражают последнее измеренное значение ускорения с сенсора. Например, если ADXL337 показывает 3.3 В на контакте X, это означает, что сейчас ускорение вдоль оси X составляет +3g. Причем зависит это от вашей модели контроллера.

Если вы используете микроконтроллер 3.3 В, считываемые аналоговые значения будут возвращать 1023 и храниться в переменной rawX. Если вы используете микроконтроллер 5 В, возвращаемые аналоговые значения будут равны 675. Храниться они будут в той же переменной.

Именно поэтому важно корректно настроить переменную micro_is_5V, чтобы мы знали как правильно интерпретировать текущие показания.

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

float scaledX, scaledY, scaledZ; // масштабированные значения для каждой оси

if (micro_is_5V) // микроконтроллер работает с 5 В

{ scaledX = mapf(rawX, 0, 675, -scale, scale); // 3.3/5 * 1023 =~ 675

} else // микроконтроллер 3.3 В

{ scaledX = mapf(rawX, 0, 1023, -scale, scale); }

Масштабированные значения хранятся в виде типа данных float. После этого мы проверяем, какой у нас контроллер (3.3 В или 5 В), с помощью булевой переменной micro_is_5V. По результатам проверки мы масштабируем целое значение x – rawX и превращаем его в значение со знаком после запятой, которое соответствует силе g.

Переменная для хранения новых значений называется scaledX. То же самое мы делаем для осей Y и Z. Детально рассматривать эти оси мы не будем, так как процесс преобразования совершенно идентичный. Важно запомнить, что на Arduino 5 В мы получаем 675 при напряжении на пине 3.3 В, а Arduino 3.3 В интерпретирует измерения, которые соответствуют 3.

3 В в виде значения 1023.

Функция mapf(), которая используется в скетче, работает так же как и стандартная Arduino функция map(). Основная причина, по которой используется именно mapf( ) – она может работать с десятичными значениями, а стандартная функция – только с целыми типа int.

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

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

Часть кода, которая отвечает за вывод данных по каждой из осей чувствительности акселерометра ADXL337 или ADXL377 приведена ниже:

// выводим в окно серийного монитора текущие показания акселерометра по осям чувствительности X,Y,Z

Serial.print(“X: “);

Serial.println(rawX); // выводим преобразованные показания с акселерометра по осям X,Y,Z

Serial.print(“X: “);

Serial.print(scaledX);

Serial.println(” g”);

Это позволяет нам увидеть данные в двух видах.

Перед снятием новых показаний, делаем задержку:

В примере выставлена задержка в 2 секунды (2000 миллисекунды), так как мы просто выводим показания сенсора в окно серийного монитора в целях ознакомления с акселерометром. В реальных проектах вы можете считывать данные с датчика с частотой 500 Гц. То есть, значение задержки можно сократить вплоть до 2 миллисекунд.

После этого возвращаемся в начало нашего цикла loop().

Надеемся, что эта статья поможет вам освоить работу акселерометров в связке с Arduino и вы используете полученные знания в ваших личных проектах.

Кстати, с помощью акселерометра вы можете определять не только ускорение, но и перемещения, которое совершает объект.

Подробная статья по определению угловых перемещений с помощью акселерометра и гироскопа: Arduino и MPU6050 для определения угла наклона.

Оставляйте Ваши комментарии, вопросы и делитесь личным опытом ниже. В дискуссии часто рождаются новые идеи и проекты!

Источник: http://arduino-diy.com/arduino-akselerometry-ADXL337-ADXL377

Ардуино: акселерометр MPU6050

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

На этот раз мы перейдем от теории к практике: подключим датчик к Ардуино, и напишем пару программ для работы с ним. Подключать будем модуль MPU6050 от RobotClass.

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

Характеристики модуля MPU6050 ROC:

  • напряжение питания: от 3,5 до 6 В;
  • потребляемый ток: 500 мкА;
  • ток в режиме пониженного потребления: 10 мкА при 1,25 Гц, 20 мкА при 5 Гц, 60 мкА при 20 Гц, 110 мкА при 40 Гц;
  • диапазон: ± 2, 4, 8, 16g;
  • разрядность АЦП: 16;
  • интерфейс: I2C (до 400 кГц).

На плате имеется 8 контактов:

  • VCC — положительный контакт питания;
  • GND — земля;
  • SDA — линия данных I2C;
  • SCL — линия синхроимпульсов I2C;
  • INT — настраиваемое прерывание;
  • AD0 — I2C адрес; по-умолчанию AD0 подтянут к земле, поэтому адрес устройства — 0x68; если соединить AD0 к контактом питания, то адрес изменится на 0x69;
  • XCL, XDA — дополнительный I2C интерфейс для подключения внешнего магнитометра.

1. Подключение MPU6050 к Ардуино

Соединим контакты датчика с Ардуино Уно согласно стандартной схеме для интерфейса I2C:

MPU6050 ROC GND VCC SDA SCL
Ардуино Уно GND +5V A4 A5

Принципиальная схема

Внешний вид макета

2. Программа для получения сырых данных с акселерометра MPU6050

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

#include “I2Cdev.h” #include “MPU6050.h” #define T_OUT 20 MPU6050 accel; unsigned long int t_next; void setup() { Serial.begin(9600); accel.initialize(); Serial.println(accel.testConnection() ? “MPU6050 connection successful” : “MPU6050 connection failed”); } void loop() { long int t = millis(); if( t_next < t ){ int16_t ax_raw, ay_raw, az_raw, gx_raw, gy_raw, gz_raw; t_next = t + T_OUT; accel.getMotion6(&ax_raw, &ay_raw, &az_raw, &gx_raw, &gy_raw, &gz_raw); Serial.println(ay_raw); // вывод в порт проекции ускорения на ось Y } }

Для работы программы потребуются библиотеки: MPU6050 и I2Cdev, ссылки на которые можно найти в конце урока.

Загружаем программу на Ардуино и открываем окно графика. Поворачиваем датчик вокруг оси X на 90 градусов в одну сторону, потом на 90 в другую. Получится примерно такая картина.

На графике хорошо видно, что при наклоне оси Y вертикально, акселерометр выдает значения близкие к 4000 тысячам. Откуда берется это число?

3. Точность измерения ускорения в MPU6050

Дело в том, что датчик MPU6050 позволяет настраивать точность измерений. Можно выбрать один из четырех классов точности: ±2G, 4G, 8G и 16G, где 1G — это одна земная гравитация.  Используемая нами библиотека по-умолчанию настраивает датчик на диапазон ±8G (прим. по ссылке внизу статьи библиотека по-умолчанию устанавливает ±2G).

С другой стороны, MPU6050 имеет 16 разрядный АЦП. 2 в степени 16 даст нам число 65 536. Поскольку датчик может измерять и отрицательное и положительное ускорение, то он будет выдавать нам числа от -32768 до +32768.

Сложив эти два факта вместе получаем, что при таких настройках 1G будет равен числу 4096 (ну а -1G равен числу -4096). Это вполне совпадает с наблюдаемыми на графике значениями!

Следующий шаг — преобразование этих странных чисел в привычные нам углы, измеряемые в градусах.

4. Программа для вычисления угла наклона акселерометра MPU6050

Добавим в предыдущую программу вычисление угла поворота датчика вокруг оси X:

#include “I2Cdev.h” #include “MPU6050.h” #define TO_DEG 57.29577951308232087679815481410517033f #define T_OUT 20 MPU6050 accel; float angle_ax; long int t_next; float clamp(float v, float minv, float maxv){ if( v>maxv ) return maxv; else if( v= 0){ angle_ax = 90 – TO_DEG*acos(ay); } else { angle_ax = TO_DEG*acos(-ay) – 90; } Serial.println(angle_ax); // вывод в порт угла поворота вокруг оси X } }

Загружаем программу в Ардуино и снова пробуем вращать датчик. Теперь на графике отображается угол наклона в градусах!

Ну вот, мы получили уже что-то пригодное для дальнейшего использования. Видно, что датчик поворачивался сначала на 30 с лишним градусов в одну сторону, потом примерно на 60 в другую. Работает!

Заключение

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

Полезные ссылки

Изменено: 5 Янв, 2018 23:06

Источник: http://robotclass.ru/tutorials/arduino-accelerometer-mpu6050/

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

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

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

На иллюстрации приведены рисунки из паспорта на акселерометр ADXL335.

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

Принцип снятия измерений с аналогового акселерометра ADXL335

Рассмотрим подробнее, что же показывает нам акселерометр. Пусть датчик лежит горизонтально, например, на столе. Тогда проекция вектора ускорения будет равна “1g” по оси Z, или Zout = 1g. По остальным двум осям будут нули: Xout = 0 и Yout = 0.

При повороте датчика «на спину», он будет направлен в противоположную сторону относительно вектора силы тяжести, т.е. Zout = −1g. Аналогично измерения снимаются по всем трём осям.

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

Если датчик сильно тряхнуть вдоль вертикальной оси Z, то значение Zout будет больше, чем “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 мс }

Читайте также:  Arduino attmega8: плата, характеристики, распиновка

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

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

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

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

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

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

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

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

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

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

Вспомнив базовый курс школьной геометрии, выведем формулу для вычисления углов поворота акселерометра: angle_X = arctg[ √(Gz2 + Gy2) / Gx ]. Значения получаются в радианах. Чтобы перевести радианы в градусы, поделим результат на число π и умножим на 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: ” + String(Gx)); //выводим ускорения в послед. порт Serial.print(” | Gy: ” + String(Gy)); Serial.println(” | Gz: ” + 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: ” + String(round(angle_x))); //выводим углы поворота акселерометра Serial.print(“o | y: ” + String(round(angle_y))); Serial.println(“o | z: ” + String(round(angle_z)) + “o”); Serial.println(); delay(500); }

При выводе в порт Serial.print() символ обозначает знак табуляции, чтобы столбцы были ровные, и значения располагались друг под другом.

Символ + означает конкатенацию (объединение) нескольких строк. Оператор String() явно указывает компилятору, что численное значение нужно преобразовать в строку.

Оператор round() округляет угол с точностью до 1°.

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

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

Полезный совет

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

Источник: https://soltau.ru/index.php/arduino/item/350-kak-podklyuchit-akselerometr-k-arduino

ADXL3xx

ADXL3xx Accelerometer

This tutorial shows you how to read from the ADXL3xx series (e.g. ADXL320, ADXL321, ADXL322, ADXL330) accelerometer and receive the values in the serial monitor of the Arduino Software (IDE) or another application that receives data over the serial port.

This tutorial was built using the breakout boards from Sparkfun. The adafruit accelerometer breakout board also works, though it must be wired differently.

The ADXL3xx outputs the acceleration on each axis as an analog voltage between 0 and 5 volts. To read this, all you need is the analogRead() function.

Hardware Required

  • Arduino or Genuino Board
  • ADXL3xx Accelerometer

Circuit

The accelerometer uses very little current, so it can be plugged into your board and run directly off of the output from the digital output pins.

To do this, you'll use three of the analog input pins as digital I/O pins, for power and ground to the accelerometer, and for the self-test pin.

You'll use the other three analog inputs to read the accelerometer's analog outputs.

image developed using Fritzing. For more circuit examples, see the Fritzing project page

Schematic:

click the image to enlarge

Here are the pin connections for the configuration shown above:

Breakout Board Pin Self-Test Z-Axis Y-Axis X-Axis Ground VDD
Arduino Analog Input Pin 1 2 3 4 5

Or, if you're using just the accelerometer:

ADXL3xx Pin Self-Test ZOut YOut XOut Ground VDD
Arduino Pin None (unconnected) Analog Input 1 Analog Input 2 Analog Input 3 GND 5V

Please, be aware that some accelerometers use 3.3V power supply and might be damaged by 5V. Check the supplier's documentation to find out which is the correct voltage.

Code

The accelerometer connections are defined as constants at the beginning of the sketch, using the two Analog pins 4 and 5 as source of power. This is accomplished using them as Digital I/O pins 18 and 19. If needed, A0 is D14, A1 is D15 and so on.

const int groundpin = 18;
const int powerpin = 19;

Setting pin 19 (A5) as HIGH and pin 18 (A4) as LOW provides the 5V with few milliamps needed by the accelerometer to work.

pinMode(groundpin, OUTPUT);
pinMode(powerpin, OUTPUT);
digitalWrite(groundpin, LOW);
digitalWrite(powerpin, HIGH);

This solution allows the breakout boards from Sparkfun to be connected directly to your Arduino or Genuino board. Different boards may be connected to standard 5V – or 3.3V -and GND pins. In this latter case, the code may be amended commenting the lines above in the void setup() section.

/*   ADXL3xx   Reads an Analog Devices ADXL3xx accelerometer and communicates the   acceleration to the computer. The pins used are designed to be easily   compatible with the breakout boards from SparkFun, available from:   http://www.sparkfun.com/commerce/categories.php?c=80   The circuit:   – analog 0: accelerometer self test   – analog 1: z-axis   – analog 2: y-axis   – analog 3: x-axis   – analog 4: ground   – analog 5: vcc   created 2 Jul 2008   by David A. Mellis   modified 30 Aug 2011   by Tom Igoe   This example code is in the public domain.   http://www.arduino.cc/en/Tutorial/ADXL3xx

*/

// these constants describe the pins. They won't change:

const int groundpin = 18;             // analog input pin 4 — ground
const int powerpin = 19;              // analog input pin 5 — voltage
const int xpin = A3;                  // x-axis of the accelerometer
const int ypin = A2;                  // y-axis
const int zpin = A1;                  // z-axis (only on 3-axis models)

void setup() {

  // initialize the serial communications:
  Serial.begin(9600);

  // Provide ground and power by using the analog inputs as normal digital pins.

  // This makes it possible to directly connect the breakout board to the
  // Arduino. If you use the normal 5V and GND pins on the Arduino,
  // you can remove these lines.
  pinMode(groundpin, OUTPUT);
  pinMode(powerpin, OUTPUT);
  digitalWrite(groundpin, LOW);
  digitalWrite(powerpin, HIGH);
}

void loop() {

  // print the sensor values:
  Serial.print(analogRead(xpin));
  // print a tab between values:
  Serial.print(” “);
  Serial.print(analogRead(ypin));
  // print a tab between values:
  Serial.print(” “);
  Serial.print(analogRead(zpin));
  Serial.println();
  // delay before next reading:
  delay(100);
}

Data

Источник: https://www.arduino.cc/en/Tutorial/ADXL3xx

Инерционный трекер своими руками

Это измененная и дополненная версия моего исходного сообщения на форуме Warthunder.

Здесь описан мой опыт изготовления и настройки инерционного датчика положения головы. Изменения и дополнения я буду выделять, либо публиковать отдельными сообщениями. Широко известен и описан, в том числе на форуме (имеется в виду forum.warthunder.ru). Представляет собой комбинацию гироскопа, акселерометра и магнитометра, устроенных в одной, двух или трёх микросхемах. Оцифрованные значения этих трёх датчиков отправляются на обработку в процессор, чаще всего Atmega в исполнении Arduino или клонов. Положение головы (или того, к чему прикрепили плату с датчиками), выраженное в угловой форме, по USB передаётся на PC для дальнейшего употребления. Я пробовал заставить эту конструкцию изображать из себя джойстик, но решил, что это не так удобно, как протокол Freetrack или Trackir, поэтому решил (и предлагаю) использовать FaceTrackNoIR со специальным плагином.
+ Удобнее фритреков и трекиров, так как не нужна видеокамера и нет зависимости от освещения + Весь код в открытом доступе, простор для экспериментов – По-прежнему нужны провода (но это решаемо, Bluetooth наше всё) – Не умеет фиксировать сдвиг головы (работа в процессе) Где взять Aliexpress, DX, eBay. По ключевым словам.

Предупреждение: не покупайте ардуино и COM-USB переходники с чипами от FTDI: производитель встроил в свой новый драйвер закладку, которая убивает “левые” чипы. Как отличить: в описании товара будет написано RT232RL или FTDI. Если есть сомнения, лучше свяжитесь с продавцом. Сам я беру платы с чипом CH340.

Читайте также:  Основы настройки и использования micro sd карт с arduino

Для тех, кто уже купил, восстановление: http://habrahabr.ru/post/241299/

Процессорная плата:

Arduino Nano: мой выбор [на момент написания исходной статьи]

 Arduino Pro Micro: приемлемо

Arduino Leonardo: то же самое, что и микро

Датчики:

GY-85[на момент написания статьи] лучший из всех, что я пробовал, работает сразу и без калибровки
GY-86 – работает хорошо, но при каждом включении нужно дать ему время на автокалибровку ок. 1 минуты. Плюс к тому, хорошее разрешение датчиков и умеет выдавать кватернион
GY-80 – работает; но на том коде, что я использовал, почему-то «пружинит», т.е. сам возвращается в нулевое положение
MPU-9150 – кода в открытом доступе нет. Код есть, датчик работает. Прошивку пока не написал, но собираюсь
GY-521 – не надо использовать, у него нет магнитометра Можно использовать совместно с GY-271/GY-273

Что с ними делать

Спаять, как на фото (или лучше). Обратите внимание, чтобы датчик не был расположен слишком близко к ардуино – иногда от этого начинает хуже работать (наводки на компас?)

Схема пайки:

Датчик->Arduino Nano VCC_IN->3v3 или 5v SCL->A5 SDA->A4 GND->GND

ДатчикArduino Pro Nano
VCC_IN 3v3 или 5v
GND GND
SCL A5
SDA A4

ДатчикArduino Pro Micro (Leonardo)
VCC_IN VCC
GND GND
SCL 3
SDA 2

Подготовка Код для ардуино распаковать, открыть программой (п. 3), подключить плату с припаянным датчиком, код скомпилировать и загрузить в процессор. 1. Подключить плату (с припаянным датчиком) к компьютеру с помощью шнура USB. Произойдёт автоматическое распознавание устройства и в системе появится новый COM-порт 2. Код для ардуино (из п.4) распаковать на диск. При распаковке образуется отдельная папка, где лежат все необходимые файлы 3. Запустить Arduino IDE (из п.3), в этой программе открыть (File->Open…) главный файл из распакованной папки. Главный – это с расширением .ino 4. В Arduino IDE выбрать тип платы Tools->Board и COM-порт, к которому подключена плата Tools->Serial Port 5. В IDE нажать круглую кнопку со стрелкой (Upload), дождаться, пока код скомпилируется и загрузится. 6. Закрыть IDE

Настройка FaceTrackNOIR

Цепляем конструкцию к наушникам, подключаем к компьютеру (если ещё не). Открываем программу, в разделе Tracker Source 1 выбираем «Hatire Arduino», в настройках (кнопка Settings) выбираем COM-порт, на котором находится Arduino, в закладке Command Serial parameters 115200/8/none/1/CTS-RTS, Delay init 1000, delay start 1000. Нажимаем Start. Через пару секунд начнут приходить данные (зелёные и серые цифры начнут меняться), а лицо с желтым прицелом придёт в движение. Заходим в Curves и настраиваем чувствительность по желанию. При этом полезно запустить Warthunder в пробный вылет, чтобы проверять настройки «в живую». Возможно, потребуется изменить конфигурацию осей (кнопка Settings) и их полярность (Global Settings на основном экране).

Источник: http://zakamik-ru.blogspot.com/2014/09/blog-post.html

Акселерометр ADXL345

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

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

Эта масса закреплена на определенном подвесе и по иссяканию импульса воздействия, то есть, как только ускорение становится равно нулю, инерционная масса становится в исходное положение, то есть в нулевое положение.

В формате микросхемы акселерометр не возможно изготовить чисто электрическую систему.

Таким образом в таком варианте (ADXL345) акселерометр представляет собой микроэлектромеханическую систему (MEMS), где присутствует как механика, так и электроника – механическая часть акселерометра обеспечивает движение инерционной массы, а электрическая преобразовывает это движение в некоторую электрическую величину.

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

Теперь перейдем к самому датчику акселерометру ADXL345. 

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

  • Напряжение питания от 2 до 3,6 вольт
  • Ток, потребляемый в рабочем режиме от 40 до 150 мкА, в зависимости от частоты опроса
  • Разрешающая способность от 10 до 13 бит
  • 3 оси акселерометра
  • Рабочий диапазон температур от -40 до +85 градусов Цельсия
  • Цифровые интерфейсы SPI (трех- или четырехпроводный) и I2C
  • Детектирование событий: толчок, двойной толчок, свободное падение, наличие активности по осям, отсутствие активности
  • 2 программируемых выхода событий
  • Корпус LGA размером 3×5×1 мм
  • Устойчив к ударам с ускорениями до 10000 g

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

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

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

Итак, для начала работы с акселерометром ADXL345 нам понадобятся микроконтроллер ATmega8, сам датчик, ЖК дисплей, несколько светодиодов, резисторов, конденсаторов и стабилизатор напряжения (если акселерометр в виде модуля, то стабилизатор нам не понадобится, так как он уже имеется в модуле датчика). Интерфейс будем использовать I2C, так как он требует всего 2 провода для передачи информации.

Схема устройства:

Варианты питания схемы могут варьироваться в зависимости от имеющихся, самая общая схема построена на стабилизаторах напряжения 5 вольт и 3,3 вольта.

Микросхема стабилизаторов напряжения можно применять любые – от линейных стабилизаторов (LM7805, AMS1117-adj или на фиксированное напряжение или другие стабилизаторы) до импульсных (MC34063, LM2596 и другие). 5 вольт необходимы для питания ЖК дисплея, от 3,3 вольт питается вся остальная схема. Датчик используется вышеописанный ADXL345.

Резисторы R12 и R13 необходимы для работы интерфейса I2C – подтягивают плюс питания к линиям передачи данных для формирования логической единицы.

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

Резистор R3 формирует на выводе reset микроконтроллера положительное напряжения для исключения самопроизвольного перезапуска. ЖК дисплей используется 2004А (4 строки по 20 символов), резистор R2 регулирует контраст символов на дисплее, резистор R1 ограничивает ток для подсветки дисплея, чтобы она не вышла из строя.

Светодиод HL1 показывает наличие напряжения питания в схеме, а светодиоды HL2 – HL7 используются как индикаторы наклона по осям X и Y. Резисторы R4 – R10 ограничивают ток, протекающий через светодиоды, чтобы они не вышли из строя. Микроконтроллер Atmega8 можно использовать как в DIP, так и в TQFP корпусе. При питании микроконтроллера от напряжения 5 вольт для I2C интерфейса между датчиком и контроллером нужно будет использовать согласование уровней (либо на специализированной микросхеме, либо на простой реализации на транзисторах) для обеспечения надежной работы схемы.

Извлекать данные из акселерометра ADXL345 совсем не сложно, однако просто считать значения из регистров не получится, по умолчанию датчик находится в режиме standby.

Перед началом работы (речь идет о программном коде) с акселерометром его необходимо инициализировать, а именно настроить регистры POWER_CTL (выйти из режима standby и запустить работу датчика) и DATA_FORMAT (согласно документации настроить формат данных – разрешение, выравнивание и др.).

Теперь можно просто периодически считывать данные из регистров данных осей и использовать эти данные в своих целях. Насчет выходов событий – все то же самое можно легко реализовать программно в микроконтроллере или же настроить остальные регистры.

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

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

Акселерометр применил в виде модуля для облегчения создания макетов с ним.

На дисплее отображается название микросхемы акселерометра, если ID, считанный из датчика, совпадает со значением 0xE5 (согласно даташиту). На второй строке располагаются значения трех осей, считанных из регистров датчика.

Далее на третьей строке рассчитанные значения углов отклонения акселерометра. По умолчанию все значения принимают цифры от 90 до -90 градусов в плоскости 180 градусов.

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

Для прошивки микроконтроллер необходимо знать конфигурацию фьюз битов:

Это чудо инженерной мысли (имеется ввиду датчик акселерометр) можно применять в различных сферах – от мобильной техники до медицинской.

Таким образом, можно детектировать падение больного или чего-то другого, активность перемещения персонала или оборудования и их состояние покоя, детектировать вибрации и толчки.

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

На этом, кажется, все, к статье прилагается исходник программы для микроконтроллера в AVR Studio 4, прошивка для микроконтроллера, документация на акселерометр, а также видео, демонстрирующее работу схемы с датчиком ADXL345.

ОбозначениеТипНоминалКоличествоПримечаниеМагазинМой блокнотIC1

VR1

VR2

IC2

HG1

R1

R2

R3, R12, R13

R4

R5-R10

R11, R14

C1, C3, C5

C2

C4

C6

S1

HL1, HL4, HL5

HL2, HL3, HL6, HL7

МК AVR 8-бит

ATmega8A

1 Поиск в Utsource В блокнот
Линейный регулятор

L7805AB

1 Поиск в Utsource В блокнот
Линейный регулятор

AMS1117-3.3

1 Поиск в Utsource В блокнот
Акселерометр ADXL345 1 Поиск в Utsource В блокнот
LCD-дисплей 2004A 1 Поиск в Utsource В блокнот
Резистор

22 Ом

1 Поиск в Utsource В блокнот
Подстроечный резистор 10 кОм 1 Поиск в Utsource В блокнот
Резистор

10 кОм

3 Поиск в Utsource В блокнот
Резистор

1 кОм

1 Поиск в Utsource В блокнот
Резистор

150 Ом

6 Поиск в Utsource В блокнот
Резистор

4.7 кОм

2 Поиск в Utsource В блокнот
Конденсатор 100 нФ 3 Поиск в Utsource В блокнот
Электролитический конденсатор 470 мкФ 1 Поиск в Utsource В блокнот
Электролитический конденсатор 220 мкФ 1 Поиск в Utsource В блокнот
Электролитический конденсатор 10 мкФ 1 Поиск в Utsource В блокнот
Тактовая кнопка TC-A109 1 Поиск в Utsource В блокнот
Светодиод Красный 3 Поиск в Utsource В блокнот
Светодиод Зеленый 4 Поиск в Utsource В блокнот
Добавить все

Скачать список элементов (PDF)

Прикрепленные файлы:

  • 52.hex (19 Кб)
  • 52.rar (76 Кб)
  • ADXL345 (1).pdf (482 Кб)

Источник: http://cxem.net/mc/mc374.php

Ссылка на основную публикацию
Adblock
detector