Андрей Смирнов
Время чтения: ~20 мин.
Просмотров: 0

Гироскоп gy-521. датчики. ардуино

Содержание

Функции в программе Arduino для работы с mpu6050

MPU6050_ReadData()

Эта функция считывает данные с акселлерометра, гироскопа и датчика температуры. После считывания данных, значения переменных (temp_scalled, accel_x_scalled, accel_y_scalled, accel_z_scalled, gyro_x_scalled, gyro_y_scalled and gyro_z_scalled) обновляются.

MPU6050_ResetWake()

Эта функция сбрасывает настройки чипа на значения по-умолчанию. Рекомендуется использовать сброс настроек перед настройкой чипа на выполнения определенной задачи.

MPU6050_SetDLPF(int BW)

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

int BW Пропускная способность фильтра
0 или Anyбесконечность
1184
294
344
421
510
65

Если int BW не в диапазоне 0-6, фильтр низких частот отключается, что соответствует установке – бесконечность.

MPU6050_SetGains(int gyro,int accel)

Эта функция используется для установки максимального значения шкалы измерений

int gyroМакс. знач.[угол/с]int accelМакс. знач. [м/с2]
2502g
150014g
2100028g
32000316g

MPU6050_ReadData()

Эта функция использует масштабные коэффициенты для расчета результата. Если не используются значения (0-3), MPU6050_ReadData() отобразит необработанные значения с датчика с погрешностью калибровки. Для получения обработанных значений, установите переменные для калибровки (accel_x_OC, accel_y_OC, accel_z_OC, gyro_x_OC, gyro_y_OC and gyro_z_OC) в нуль.

MPU6050_OffsetCal()

Эта функция позволяет откалибровать акселерометр и гироскоп. Рассчитанные значения записываются в переменные accel_x_OC, accel_y_OC, accel_z_OC, gyro_x_OC, gyro_y_OC и gyro_z_OC для дальнейшей коррекции. Для проведения калибровки необходимо расположить оси x и y axes платы MPU6050 в горизонтальной плоскости, а ось z – перпендикулярно к основанию. Даже незначительные перемещения платы во время калибровки понижают точность расчета базовой точки. Ось z калибруется относительно силя земного притяжения — 9.81 м/с2 (1g), что учтено в коде.

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

Преобразователь питания

Стабилизатор NCP582 с выходом 3,3 вольта. Обеспечивает питание акселерометра ADXL335. Максимальный выходной ток составляет 150 мА.

Светодиодная индикация

Светодиод — индикатор ускорения действующее на ось .

  • горит, если ускорения положительное.
  • не горит, если ускорение отрицательное.

Контакты подключения трёхпроводных шлейфов

1 группа

  • Земля (G) — Соедините с пином микроконтроллера.
  • Питание (V) — Соедините с пином микроконтроллера.
  • Сигнальный (X) — Выход акселерометра по оси . Подключите к аналоговому входу микроконтроллера.

2 группа

  • Сигнальный (Y) — Выход акселерометра по оси . Подключите к аналоговому входу микроконтроллера.
  • Сигнальный (Z) — Выход акселерометра по оси . Подключите к аналоговому входу микроконтроллера.
  • Не используется.

Полевая мышь – описание и образ жизни

Калибровка mpu6050

Калибровка гироскопа и акселерометра – это очень важный шаг. Приведенные значения для гироскопа имеют вид: “gyro_x_scalled = ”, так как для получения угла поворота относительно оси по данным угловой скорости, необходимо провести интегрирование. Если “gyro_x_scalled” содержит ошибку или неверно выбрана база, эта ошибка также интегрируется и превращается в значительную погрешность в результате. Так что в идеале измерения должны показывать нуль, если гироскоп не движется вокруг каких-либо осей координат. На практике добиться идеала практически невозможно, так что наша задача – минимизировать эту ошибку. Кроме того, для компенсации «дрифта», можно использовать акселерометр для расчета угла наклона, сравнения полученных данных с результатами гироскопа и последующей компенсацией данной погрешности. Расчет угла будет рассмотрен в этой статье отдельно ниже.

На рисунках далее показано использование функции MPU6050_OffsetCal() непосредственно в программе в Arduino IDE.

Скетч Arduino для калибровки платы акселерометра/гироскопа MPU6050:

Результат работы скетча для калибровки в серийном мониторе

How It Works

The MPU6050 IMU has both 3-Axis accelerometer and 3-Axis gyroscope integrated on a single chip.

The gyroscope measures rotational velocity or rate of change of the angular position over time, along the X, Y and Z axis. It uses MEMS technology and the Coriolis Effect for measuring, but for more details on it you can check my particular How MEMS Sensors Work tutorial. The outputs of the gyroscope are in degrees per second, so in order to get the angular position we just need to integrate the angular velocity.

On the other hand, the MPU6050 accelerometer measures acceleration in the same way as explained in the previous video for the ADXL345 accelerometer sensor. Briefly, it can measure gravitational acceleration along the 3 axes and using some trigonometry math we can calculate the angle at which the sensor is positioned. So, if we fuse, or combine the accelerometer and gyroscope data we can get very accurate information about the sensor orientation.

The MPU6050 IMU is also called six-axis motion tracking device or 6 DoF (six Degrees of Freedom) device, because of its 6 outputs, or the 3 accelerometer outputs and the 3 gyroscope outputs.

See Also

Обзор датчика пространства GY-521 (MPU6050)

GY-521 (рис. 1) – модуль с гироскопом, акселерометром и термометром на базе микросхемы MPU-6050 используется в любительской робототехнике для определения положения в пространстве.

Рисунок 1. Модуль GY521.

Модуль GY-521 построен на базе микросхемы MPU6050. На плате модуля также расположена необходимая обвязка MPU6050, включая подтягивающие резисторы интерфейса I 2 C. Гироскоп используется для измерения линейных ускорений, а акселерометр – угловых скоростей. Совместное использование акселерометра и гироскопа позволяет определить движение тела в трехмерном пространстве.

Шаг 4: Запустите симуляцию

Наконец, откройте файл приложения Processing, а затем

Файл -> Открыть -> следовать этому каталогу C: Program Files (x86) Arduino library MPU6050 examples MPU6050_DMP6 Processing MPUTeapot

и откройте файл MPUTeapot.

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

Теперь возьмите гироскоп и проверьте рыскание / тангаж / крен. Если вы довольны тем, что все работает правильно, вы можете начать экспериментировать с вашими собственными проектами. Если вы хотите в полной мере использовать библиотеки I2Cdev или MPU6050 и их функции, обратитесь к их заголовочным файлам.

Я надеюсь в ближайшее время сделать инструктаж по изготовлению беспилотника «Сделай сам», поэтому, если вы нашли его полезным, почему бы не остаться в курсе будущих проектов, следуя за мной на Instructables и в Facebook / Twitter / Google+.

PayPal: http://www.paypal.me/HobbyTransform

Bitcoin: 1Mqe7et24Lz4DY1RUN4iAQVHkvJsdFArKR

Ethereum: 0x6d8248db1cdea6a783cb6b41ae67bb8e6144f479

Litecoin: LW6PWESqsr8xHw6EJ9WLbsQsAyTvPnwnxJ

Тире: Xemv7jud697v8tQmKfNFoMxfkd17ZayH2t

Ваша поддержка очень ценится! С Днем DIY!

Функция самотестирования ADXL335

Акселерометр ADXL335 имеет функцию самопроверки, которая позволяет проверить работу датчика в конечном приложении.

Рисунок 14 – Вывод ST (самопроверка) на модуле управляет этой функцией

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

Типичное изменение выходного сигнала:

  • -1,08 g (-325 мВ) по оси X
  • +1.08 g (+325 мВ) по оси Y
  • +1,83 g (+550 мВ) по оси Z

Этот вывод ST при нормальном использовании может быть подключен к земле или оставлен «висеть» в воздухе.

ПРЕДУПРЕЖДЕНИЕ

Подача на вывод ST напряжения выше 3,6 В может привести к повреждению акселерометра.

Примеры для Arduino

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

AccelerometerTest.ino
// библиотека для работы с аналоговым акселерометром
#include <TroykaAccelerometer.h>
 
// пины подключения осей акселерометра
#define PIN_X A1
#define PIN_Y A2
#define PIN_Z A0
 
// калибровочные значения одного из акселерометров
// для получения своих калибровочных значений воспользуйтесь скетчем «AccelerometerCalibration»
#define MIN_X   1.20
#define MAX_X   1.80
#define MIN_Y   1.20
#define MAX_Y   1.80
#define MIN_Z   1.25
#define MAX_Z   1.85
 
// создаём объект для работы с аналоговым акселерометром
TroykaAccelerometer accel(PIN_X, PIN_Y, PIN_Z);
 
void setup() {
  // открываем последовательный порт
  Serial.begin(9600);
  Serial.println("Serial begin is OK");
  // каждый акселерометр необходмо калибровать индивидуально
  // для получения калибровочных значений воспользуйтесь скетчем «AcelerometerCalibration»
  // калибруем акселерометр по калибровочным значениям одного из партии
  accel.calibrate(MIN_X, MAX_X, MIN_Y, MAX_Y, MIN_Z, MAX_Z);
}
 
void loop() {
  // выводим направление и величины ускорения в единицах «g»
  Serial.print(accel.readGX());
  Serial.print("\t");
  Serial.print(accel.readGY());
  Serial.print("\t");
  Serial.print(accel.readGZ());
  Serial.print("\t");
  // выводим направление и величины ускорения в «м/с²»
  Serial.print(accel.readAX());
  Serial.print("\t");
  Serial.print(accel.readAY());
  Serial.print("\t");
  Serial.println(accel.readAZ());
  delay(100);
}

Увеличение точности показаний

Акселерометр (Troyka-модуль) основан на чипе ADXL335, который в свою очередь работает от 3,3 вольт. Это значит, что на выходных пинах модуля будет максимум 3,3 вольта. В итоге с управляющими платами с 5 вольтовой логикой, например Arduino Uno, мы теряем практически половину значений АЦП, что уменьшаем точность показаний почти в два раза. Мы предлагаем небольшой лайфхак.

По умолчанию за опорное напряжение АЦП берётся опорное напряжение управляющей платы, что в случае Arduino Uno 5 вольт. Это можно изменить, тем самым увеличить точность датчика.

  1. Возьмём за опорное напряжение АЦП пин и соединим его с помощью провода папа-папа с пином 3,3 вольта.

  2. В скетче необходимо сообщить Arduino, что опорное напряжение для АЦП будет браться с пина . Для этого необходимо вызвать метод из библиотеки с параметром :
accel.setAnalogReference(EXTERNAL);

Теперь диапазон АЦП от нуля до 3,3 вольт. Что повышает точность показаний акселерометра почти в два раза.

Код прошивки

AccelerometerTestAref.ino
// библиотека для работы с аналоговым акселерометром
#include <TroykaAccelerometer.h>
 
// пины подключения осей акселерометра
#define PIN_X A1
#define PIN_Y A2
#define PIN_Z A0
 
// калибровочные значения одного из акселерометров
// для получения своих калибровочных значений воспользуйтесь скетчем «AccelerometerCalibration»
#define MIN_X   1.20
#define MAX_X   1.80
#define MIN_Y   1.20
#define MAX_Y   1.80
#define MIN_Z   1.25
#define MAX_Z   1.85
 
// создаём объект для работы с аналоговым акселерометром
TroykaAccelerometer accel(PIN_X, PIN_Y, PIN_Z);
 
void setup() {
  // открываем последовательный порт
  Serial.begin(9600);
  Serial.println("Serial begin is OK");
  // каждый акселерометр необходмо калибровать индивидуально
  // для получения калибровочных значений воспользуйтесь скетчем «AcelerometerCalibration»
  // калибруем акселерометр по калибровочным значениям одного из партии
  accel.calibrate(MIN_X, MAX_X, MIN_Y, MAX_Y, MIN_Z, MAX_Z);
  // изменяем источник опорного напряжения, на пин AREF
  accel.setAnalogReference(EXTERNAL);
}
 
void loop() {
  // выводим направление и величины ускорения в единицах «g»
  Serial.print(accel.readGX());
  Serial.print("\t");
  Serial.print(accel.readGY());
  Serial.print("\t");
  Serial.print(accel.readGZ());
  Serial.print("\t");
  // выводим направление и величины ускорения в «м/с²»
  Serial.print(accel.readAX());
  Serial.print("\t");
  Serial.print(accel.readAY());
  Serial.print("\t");
  Serial.println(accel.readAZ());
  delay(100);
}

Гироскоп-акселерометр GY-521 | 2 Схемы

Данный модуль представляет собой комбинированный датчик, объединяющий гироскоп, акселерометр и термометр. Акселерометр – это прибор, который измеряет ускорение тела. В состоянии покоя, либо равномерного прямолинейного движения на поверхности Земли акселерометр покажет только наличие ускорения, обусловленного действием поля силы тяжести Земли. Гироскоп способен реагировать на изменение ориентации тела в пространстве. И гироскоп, и акселерометр работают вдоль 3-х координатных осей. Для передачи информации устройство использует интерфейс I2C, это последовательный интерфейс позволяющий организовать обмен сообщениями по двухпроводной линии между 128 устройствами, одно из которых является главным, а остальные ведомыми . Модуль гироскоп-акселерометр приобретен на Aliexpress.com

Конструктивно модуль представляет собой печатную плату размером 20 х 15 мм, масса 1,5 г с припаянной гребенкой контактов.

Устройство поставляется в антистатическом пакете в комплекте с парой не припаянных контактных гребенок.

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

Подключение гироскопа к Arduino

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

Хотя в общей сложности GY-521 имеет 8 контактов для демонстрации совместной работы с Arduino UNO достаточно всего четырех проводов, остальные контакты нужны для более сложных вариантов взаимодействия . В данном простейшем случае в качестве ведущего устройства выступает плата Arduino UNO. Выводы SDA и SLC гироскопа подключаются соответственно к контактам A4 и A5 платы Arduino . Именно через эти выводы на Arduino UNO реализован данный интерфейс.

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

Гироскоп-акселерометр питается напряжением 3,3 В от Arduino, ток потребления составляет около 5 мА.

На плате гироскопа-акселерометра располагается индикатор питания.

В мониторе последовательного порта Arduino IDE. Видно, что если прикоснуться к микросхеме на плате датчика рукой, то датчик покажет рост температуры.

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

Влияние резкого поворота вдоль каждой из осей на показания гироскопа.

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

  1. Блум Д. Изучаем Arduino: инструменты и методы технического волшебства: Пер. с англ. — СПб.: БХВ-Петербург, 2015. — 336 с.
  2. http://robocraft.ru/blog/communication/780.html
  3. http://forumdvrobot.ru/forum/3-41-1
  4. https://ngin.pro/index.php?newsid=188
  5. http://arduinoprojects.ru/2014/10/подключение-гироскопа-gy-521-mpu-6050-к-arduio/
  6. https://arduino-kit.ru/catalog/id/modul-3-h-osevogo-giroskopa-i-akselerometra-gy-521-mpu-6050
  7. https://mysku.ru/blog/china-stores/40178.html
  8. http://playground.arduino.cc/Main/MPU-6050#sketch
  9. http://robocraft.ru/blog/projects/570.html

Загрузка…

Работа схемы

Схема подключения гироскопа MPU6050 к плате Arduino представлена на следующем рисунке.

Наш проект мы запитали по кабелю USB от компьютера. Потенциометр 10 кОм используется для регулировки яркости ЖК дисплея. У датчика MPU6050 мы задействовали 5 контактов:

  • контакт питания – к контакту 3.3v платы Arduino;
  • землю – к земле платы Arduino;
  • контакты SCL и SDA датчика MPU6050 – к контактам A4 и A5 платы Arduino;
  • контакт прерывания (INT) MPU6050 – к контакту прерывания 0 (D2) платы Arduino.

Контакты RS, RW и EN ЖК дисплея непосредственно подключены к контактам 8, gnd и 9 платы Arduino. Контакты данных ЖК дисплея подключены к контактам 10, 11, 12 и 13 платы Arduino.

Погрешность гироскопа – «дрифт» (drift)

Из-зза неидеальной калибровки гироскопа, “gyro_x_scalled” никогда не равна нулю и со временем “angle_x_gyro” изменяет свои значения. Для решения данной проблемы, проводится расчет угла с помощью акселерометра и полученные значения сравнывиются с углом гироскопа. Так как модуль MPU6050 располагается горизонтально, ускорение по оси z равно 1g (то есть, 9.81) как это показано на рисунке. Мы можем использовать этот вектор ускорения и его проекцию на ось y для расчета угла между осями x и y.

Угол, который рассчитывается с помощью акселерометра, рассчитывается по зависимости:

Основными проблемами при определении угла наклона с помощью акселерометра являются: сильная зашумленность сигнала и очень сильная чувствительность к вибрациям, без которых ни один механизм не работает. Более того, еслипри перемещении MPU6050 вдоль одной из осей координат, полученные значения будут мешать расчету угла. Так что для лучшего результата, углы с гироскопа и акселерометра объединяются с помощью фильтра:

Окончательно уравнение для определения угла наклона принимает вид:

На рисунке ниже приведена имплементация полученных зависимостей в оболочке Arduino IDE

Процесс посадки

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

Сразу же после высадки хорошо пролейте молодое растение. Потом поливайте его не меньше двух раз в неделю – по литру воды на каждый саженец. Как только бамбук окрепнет, поливать можно будет реже.

Как работает MEMS акселерометр?

Акселерометр MEMS (Micro Electro Mechanical Systems) состоит из микромеханической структуры, построенной поверх кремниевой пластины.

Рисунок 4 – Внутренняя работа MEMS акселерометра ADXL335

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

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

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

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

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

Работа с ADXL345 по SPI

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

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

ADXL345 соединён с отладочной платой на FT2232H

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

Чтение регистра ID акселерометра ADXL345 по SPI

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

Временная диаграмма чтения регистра ID акселерометра ADXL345 по SPI

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

Скетч для чтения данных ADXL345 по SPI (разворачивается)

#include <SPI.h>

const byte READ = 0x80; // бит маркер чтения
const byte MB = 0x40; // бит MB (многобайтовая передача)
const int CS = 10; // пин выбора ведомого

void setup() {
  Serial.begin(115200);
  SPI.begin(); 
  SPI.setClockDivider(SPI_CLOCK_DIV32); // делитель частоты 500 кГц
  SPI.setDataMode(SPI_MODE3); // задаём 3-ий режим SPI
    
  byte id;
  readRegister(0x00, 1, id); // читаем регистр DEVID
  Serial.print("ID = ");
  Serial.println(id, HEX);
  
  writeRegister(0x2D, 0x08); // переводим ADXL345 в режим измерения
}

void loop() {
  byte buff;
  readRegister(0x32, 6, buff); // читаем значения по осям X, Y, Z
  
  int x = ((int)buff }

// записывает значение в регистр
void writeRegister(byte reg, byte value) {
  digitalWrite(CS, LOW);
  SPI.transfer(reg); 
  SPI.transfer(value); 
  digitalWrite(CS, HIGH);
}

// читает из регистра заданное число байтов
void readRegister(byte reg, int bytesToRead, byte *outBuff) {
  digitalWrite(CS, LOW);
  reg = reg | READ; // покажем акселерометру, что хотим из него читать
  if (bytesToRead > 1) {
     reg = reg | MB; // и читать хотим много байтов
  }
  SPI.transfer(reg); // записываем адрес регистра, с которого начинаем чтение
  for (int i=0; i}

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

Временная диаграмма чтения значений по осям X, Y, Z акселерометра ADXL345

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

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

1Принцип действияцифрового акселерометра

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

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

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

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

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

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

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

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

Здесь надо быть предельно осторожным. ADXL337 и ADXL377 оба должны запитываться максимальным напряжением 3.6 В! Это напряжение подается к контакту питания и к контакту Self Test. Можно использовать Arduino 5 В или 3.3 В для считывания значений с отдельных осей акселерометра, а запитывать сам датчик ускорения от 3.3 В. Но не забывайте, что значения, которые вы получите с сенсора после аналогово-цифрового преобразования будут разными при 5 В и при 3.3 В! Поэтому надо уточнять диапазоны в зависимости от сигнала преобразования.

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

Шаг 2: Настраиваем схему

Давайте создадим нашу схему.

Подключите разъем Arduino 101 GND (заземление) к одному из контактов макетной платы. Мы взяли верхний левый разъем. Подключите 3 резистора в том же столбце где GND. Добавьте 3 светодиода, каждый отрицательный контакт подключен к другому концу его резистора.

Возьмите 3 провода-перемычки.

Вакансии

Программирование аппаратно-программных средств arduino, разработка чертежей в SolidWorks.

  • Подсоедините положительный контакт 1-го светодиода к цифровому выходу 9.
  • Подсоедините положительный контакт 2-го светодиода к цифровому выходу 6.
  • Подсоедините положительный контакт 3-го светодиода к цифровому выходу 5.

Ваша схема должна быть похожа на изображения выше.

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

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

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

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

При угле поворота 90° на ось Z приходится нулевое ускорение. Т.е. значение 1,67 вольт – это условный ноль Z. Тогда определим ускорение так: g = Zout – Z / Sz, здесь Zout – измеренное значение в милливольтах, Z – значение при нулевом ускорении в милливольтах, 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, т.е. наш датчик довольно точно показывает свою ориентацию в пространстве (я показал это просто для самопроверки, дальше это не пригодится).

Шаг 4: Функция передачи

Основными функциями кода являются:

  • Чтение углов наклона акселерометров.
  • Расчет передаточной функции эффекта перевернутой стороны для 7-сегментного светодиодного дисплея.

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

  • Вид спереди — Инклинометр в первоначальном положении
  • Вид спереди — Инклинометр вверх дном

Функция передачи для отображения 7-сегмент (от А до F) работает следующим образом:

От A до D, от B до E, от C до F, от D до A, от E до B, от F до C, от G до G

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

От: 1, 2, 3, 4

До: 4, 3, 2, 1

Как это работает?

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

При перемещении датчика в направлении вверх или вниз он дает нам значения от -17000 до 17000. Мы будем отображать их от 0 до 180 для перемещения серводвигателя. Теперь, когда мы перемещаем датчик в направлении вверх, выходной сигнал от датчика будет равен 180. Когда мы перемещаем датчик в направлении вниз, тогда выход датчика будет 0.

Как вывести мышей из машины

Рейтинг автора
5
Материал подготовил
Максим Иванов
Наш эксперт
Написано статей
129
Ссылка на основную публикацию
Похожие публикации