ГЛАВНАЯ Визы Виза в Грецию Виза в Грецию для россиян в 2016 году: нужна ли, как сделать

Ацп акселерометр ардуино среда визуализации. Аналоговые акселерометры ADXL337, ADXL377 и Arduino

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



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


Этот датчик также позволяет обнаружить свободное падение (выход 0G). Технически, MMA7361LC представляет собой малопотребляющий емкостный микромеханический акселерометр с функциями обработки сигнала, 1-полюсным низкочастотным фильтром, температурной компенсацией, самодиагностикой и возможностью выбора чувствительности. MMA7361LC может входить в спящий режим, что делает его идеальным для портативных устройств с батарейным питанием. Модуль может быть запитан как от источника 5 В, так и от 3.3 В.



Теперь на примере связки модуля MMA7361 и платы Arduino UNO покажем принцип работы с этим датчиком. К счастью, для подключения не нужны какие-либо дополнительные элементы, нужны только Arduino, модуль с акселерометром и провода. Схема и распиновка показаны ниже:




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


int x; // выходная переменная по оси x int y; // выходная переменная по оси y int z; // выходная переменная по оси z void setup() { Serial.begin(9600); // открываем порт, скорость передачи данных 9600 bps } void loop() { x = analogRead(5); // считываем вход A5 y = analogRead(4); // считываем вход A4 z = analogRead(3); // считываем вход A3 Serial.print("X = "); // выводим значение по x Serial.println(x); Serial.print("Y = "); // выводим значение по y Serial.println(y); Serial.print("Z = "); // выводим значение по z Serial.println(z); delay(100); }

ADXL335 — это аналоговый трехосный акселерометр, то есть датчик, с помощью которого можно получить угол относительного отклонения. Фактически, это три разных акселерометра в одном корпусе, каждый из которых отвечает за свою собственную ось X, Y либо же Z.

Вообще, Акселерометр — приспособление для измерения ускорения. Однако, из общего курса школьно физики мы знаем, что ускорение бывает двух видов: динамическое и статическое . С динамическим ускорением должно быть все понятно — толкнули датчик, придали ему ускорение, он должен это зафиксировать. Статическое ускорение — это воздействие силы тяжести на наш датчик. Дело в том, что к датчику даже в состоянии полного покоя приложено статическое ускорение равное g (ускорение свободного падения).

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

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

Для начала разберемся с правой частью картинки, на которой меняет свое значение Zout (ось Z). Согласно этой картинке, если положить наш датчик контактами вниз, то значение по оси Z будет равно единице (точнее одному g). Данное значение, как было сказано — проекция вектора статического ускорения на ось нашего датчика. Так как в данном случае вектор совпадает с осью Z, а ускорения свободного падения равняется g, мы и имеет значение Zout = 1g.
Если же мы перевернем датчик контактами вверх, то значение Zout изменится на противоположное. Стоит отметить, что все остальные ускорения равны нулю, связано это с уже упомянутым совпадением вектора статического ускорения с осью Z, а так же состоянием покоя всего датчика.
Аналогично можно рассмотреть все остальные пары. Единственное отличие в том, что датчик будет находится на ребре или боку.


Однако, вектор далеко не всегда будет совпадать с какой-либо из осей. Чаще всего этот вектор будет каким-либо распределен по всем трем осям — т.к. пространство трехмерное.

О датчике ADXL335

  • Максимально допустимым значение напряжения для ADXL335 является 3,6 вольта
  • Датчик справляется с ускорениями до 3g. Это можно использовать например, чтобы определить находится ли вся конструкция в движении, и даже в каком направлении она двигается. Можно измерять ускорение при начале движения и тем самым делать его более плавным, без резких рывков.

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

  • Внимание! Для питания выход 3v3 Arduino, а не 5v
  • Выходы X, Y, Z датчика соединить со входами ANALOG IN 0, 1, 2

Пример программного кода — программирование акселерометра

#define ADC_ref 5.0 #define analog_resolution 1024.0 unsigned int value_x; unsigned int value_y; unsigned int value_z; void setup() { Serial.begin(9600); } void loop() { value_x = analogRead(0); value_y = analogRead(1); value_z = analogRead(2); Serial.print(value_x/analog_resolution*ADC_ref, 5); Serial.print(" "); Serial.print(value_y/analog_resolution*ADC_ref, 5); Serial.print(" "); Serial.println(value_z/analog_resolution*ADC_ref, 5); delay(500); }

#define ADC_ref 5.0

#define analog_resolution 1024.0

unsigned int value_x ;

unsigned int value_y ;

unsigned int value_z ;

void setup () {

Serial . begin (9600 ) ; }

void loop () {

value_x = analogRead (0 ) ;

value_y = analogRead (1 ) ;

value_z = analogRead (2 ) ;

Serial . print (value_x / analog_resolution * ADC_ref , 5 ) ;

Serial . print (" " ) ;

(500 ) ; }

Обозначаем пару констант. ADC_ref — это максимальное значение в вольтах которое может снять аналоговый вход. analog_resolution — это разрешающая способность нашего аналогового входа. На arduino она равна 210 или 1024.
После объявления констант идет пара переменных в которых мы будем хранить показания снятые с нашего датчика и инициализация серийного порта, чтобы можно было получить какие-то данные на компьютере.
В функции loop мы в начале получаем данные с трех наших аналоговых пинов, к которым и подключен наш датчик, а после этого пересчитываем полученное число в вольты и выводим их на серийный порт. Зальем эту прошивку в нашу Arduino UNO, откроем серийный монитор (ctrl+shift+m) и соберем кое какие данные.

На включенном серийном мониторе можно увидеть:

Где первый столбец — показания по оси X, второй — Y, третий — Z

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

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

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

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

Обзор и технические характеристики акселерометров ADXL337 и ADXL377

Акселерометры 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);

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 для определения угла наклона .

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

Позволяет определять ускорение действующее в направлении осей 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.

Инструкция

Акселерометры используют для определения вектора ускорения. Акселерометр 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. Теперь мы можем использовать акселерометр в своих разработках.