Оглавление
- Код Ардуино
- 1Описание модуля GY-291 с акселерометром ADXL345
- Wiring MPU6050 Module with Arduino
- Установка платы датчика Холла
- Arduino и датчик MPU6050
- Arduino and MPU6050
- Работа схемы
- 4Скетч для Arduino, считывающий показания цифрового компаса HMC5883L
- Progetto: Gestione di due Servomotori utilizzando un modulo GY-521
- Расчет угла с помощью гироскопа mpu6050
- Погрешность гироскопа – «дрифт» (drift)
- 1Описание и характеристики датчикавлажности и температуры HTU21D
- Калибровка mpu6050
- Назначение связки гироскоп и акселерометр
- Step 7: Check Results in Serial Port
- Модуль ИК приемника KY-022
- Процессор полетного контроллера
- Исходный код программы на С
- Step 3: Hardware
- Гироскопический датчик (гироскоп) MPU-6050
- Шаг 1. Компоненты для подключения акселерометра к Arduino
Код Ардуино
Теперь перейдем к нашему скетчу:
#include <Wire.h> #include <MPU6050.h> #include <Servo.h> Servo sg90; int servo_pin = 2; MPU6050 sensor ; int16_t ax, ay, az ; int16_t gx, gy, gz ; void setup (){ sg90.attach ( servo_pin ); Wire.begin ( ); Serial.begin (9600); Serial.println ( "Initializing the sensor" ); sensor.initialize ( ); Serial.println (sensor.testConnection ( ) ? "Successfully Connected" : "Connection failed"); delay (1000); Serial.println ( "Taking Values from the sensor" ); delay (1000); } void loop (){ sensor.getMotion6 (&ax, &ay, &az, &gx, &gy, &gz); ax = map (ax, -17000, 17000, 0, 180) ; Serial.println (ax); sg90.write (ax); delay (200); }
1Описание модуля GY-291 с акселерометром ADXL345
Акселерометр – это устройство, которое позволяет измерить динамическое и статическое ускорение по трём осям X, Y и Z. Благодаря статическому ускорению можно определить положение в пространстве (акселерометр как датчик поворота), а благодаря динамическому (движение или встряска) – направление ускорения.
Цифровой акселерометр ADXL345 – это 3-осевой акселерометр с высоким разрешением (13 бит) по осям с пределом до ±16g. Модуль обладает пониженным энергопотреблением и малыми размерами. Информационный обмен с модулем осуществляется по последовательным интерфейсам I2C или SPI (3- или 4-проводной).
Существует множество модулей для Arduino с акселерометром ADXL345. Модуль может выглядеть, например, так:
Внешний вид модуля GY-291 с цифровым акселерометром ADXL345
Показанный модуль имеет название GY-291. У модуля имеются следующие выводы:
Вывод модуля | Назначение | Подключать к выводу Arduino | |
---|---|---|---|
SPI | I2C | ||
GND | Земля | GND | GND |
VCC | Питание | +3,3V | +3,3V |
CS | Выбор ведомого интерфейса SPI | 10 | – |
INT1 | Выход прерывания 1 (*) | – | – |
INT2 | Выход прерывания 2 (*) | – | – |
SDO | Данные от ведомого | 12 | – |
SDA | Данные от мастера интерфейса SPIШина данных интерфейса I2C | 11 | A4 |
SCL | Шина тактирования | 13 | A5 |
(*) Работы с прерываниями ADXL345 касаться в этой статье не будем. Вот есть хорошая статья, в которой достаточно подробно описан вопрос работы с прерываниями.
В зависимости от выбранного интерфейса – SPI или I2C – подключение модуля будет соответствующим, как показано в таблице. Но в обоих случаях очень простым.
Рассмотрим структуру регистров микросхемы ADXL345:
Карта регистров цифрового акселерометра ADXL345
Кроме того, нас интересует регистр управления питанием, т.к. он отвечает за режим работы устройства:
Регистр управления питанием цифрового акселерометра ADXL345
Как видим, бит D3 (Measure) переключает акселерометр в режим измерения.
Wiring MPU6050 Module with Arduino
Connections are fairly simple. Start by connecting VCC pin to the 5V output on the Arduino and connect GND to ground.
Now we are remaining with the pins that are used for I2C communication. Note that each Arduino Board has different I2C pins which should be connected accordingly. On the Arduino boards with the R3 layout, the SDA (data line) and SCL (clock line) are on the pin headers close to the AREF pin. They are also known as A5 (SCL) and A4 (SDA).
If you are using a different Arduino board, please refer below table.
SCL | SDA | |
Arduino Uno | A5 | A4 |
Arduino Nano | A5 | A4 |
Arduino Mega | 21 | 20 |
Leonardo/Micro | 3 | 2 |
The following diagram shows you how to wire everything.
Установка платы датчика Холла
Во-первых, для реализации тахометра, мне нужен был небольшой неодимовый магнит, который нужно было прикрепить на вал шпинделя. Перерыл все ящики — я ничего подходящего не нашел. Зато нашел старый, нерабочий cd-rom от ноутбука. Вот в нем, в катушке электромагнита открывания, как раз и нашел, то, что нужно — небольшой, прямоугольный неодимовый магнит!
Определив высоту и полярность, я приклеил магнит к валу на «суперклей» и обтянул вал с магнитом термоусадкой. На копус шпинделя приклеил прокладку, а уже на прокладку — плату. Как видите — получилось довольно аккуратно. Защитный колпачек в процессе обдумывания, так что, пока без него
Arduino и датчик MPU6050
Файл, приведенный ниже, будет работать с цифровыми датчиками ускорения MPU6050, которые подключены к плате Arduino через I2C протокол по адресу 0x68. Работоспособность проверена на платах Arduino Uno и Arduino Mega. Данный файл заголовка требует файл Wire.h перед добавлением “gyro_Accel.h”. Кроме того, перед вызовом встроенных функций, надо инициализировать шину I2Cс помощью команды Wire.begin();.
Программа для Arduino с файлом заголовка и примером расположены на Github
Логи версии:
Версия 0.1 beta (Дата:2014-06-22): Сам файл заголовка для калибровки и чтения данных с датчика MPU6050 через i2c протокол и пример использования заголовочного файла для расчета угла.
Версия 0.2 beta (Дата:2014-10-08): Исправлены баги в файле примера. “accel_x_scalled” и “accel_y_scalled” теперь возвращают корректные значения углов.
Arduino and MPU6050
Let’s take a look how we can connect and read the data from the MPU6050 sensor using the Arduino. We are using the I2C protocol for communication with the Arduino so we need only two wires for connecting it, plus the two wires for powering.
You can get the components needed for this Arduino Tutorial from the links below:
- MPU6050 IMU …………………………..…. Amazon / Banggood / AliExpress
- Arduino Board ………………………….….. Amazon / Banggood / AliExpress
- Breadboard and Jump Wires ………… Amazon / Banggood / AliExpress
Disclosure: These are affiliate links. As an Amazon Associate I earn from qualifying purchases.
Работа схемы
Схема измерителя уровня на основе платы Arduino и MPU6050 представлена на следующем рисунке. Схема достаточно простая и ее сравнительно легко можно собрать на макетной плате.
Взаимодействие с датчиком MPU6050 будет осуществляться по протоколу I2C, поэтому его контакт SDA подключен к контакту A4 платы Arduino, а контакт SCL — к контакту A5 платы Arduino. Bluetooth модуль HC-06 работает по порту последовательной связи, его контакт Rx подключен к контакту D11 платы Arduino, а его контакт Tx — к контакту D10 платы Arduino. Контакты D10 и D11 платы Arduino в программе конфигурируются так, чтобы работать как порт последовательной связи. Модуль HC-05 и датчик MSP6050 работают от напряжения +5V, поэтому в схеме они запитаны от контакта Vcc платы Arduino.
После того как вы соберете всю конструкцию на макетной плате она у вас должна получиться примерно следующего вида.
Как запитать схему
Вы можете подать питание на схему с помощью платы программирования FTDI (как сделали мы) или использовать батарейку на 9V или адаптер на 12V – в этом случае вы должны подсоединить их к контакту Raw платы Arduino pro mini – эта плата имеет в своем составе встроенный регулятор напряжения, который трансформирует поступающее входное напряжение в постоянное напряжение +5V.
4Скетч для Arduino, считывающий показания цифрового компаса HMC5883L
А теперь давайте рассмотрим типичную измерительную задачу: снимем показания магнитной индукции по трём осям. Этот пример описан в паспорте на устройство. Мы лишь переведём его на язык, понятный Arduino. Итак, скетч.
#include <Wire.h> // подключаем I2C библиотеку #define addr 0x1E // I2C 7-битный адрес датчика HMC5883 void setup() { Serial.begin(9600); // инициализация последовательного порта Wire.begin(); // инициализация I2C // Задаём режим работы датчика HMC5883: Wire.beginTransmission(addr); Wire.write(0x00); // выбираем регистр управления CRA (00) Wire.write(0x70); // записываем в него 0x70 Wire.write(0xA0); // записываем в регистр CRB (01) 0xA0 Wire.write(0x00); // записываем в регистр Mode (02) 0x00 Wire.endTransmission(); } void loop() { Wire.beginTransmission(addr); Wire.write(0x03); // переходим к регистру 0x03 Wire.endTransmission(); Wire.requestFrom(addr, 6); // запрашиваем 6 байтов while( Wire.available() ) { int h = Wire.read(); // старший байт значения по оси X int l = Wire.read(); // младший байт значения по оси X int x = word(h, l); // объединяем в двухбайтовое число int y = Wire.read(); // старший байт значения по оси Y y = y }
Здесь показаны разные варианты получения двухбайтового числа из двух отдельных байтов. Вот как мы это сделали: по отдельности считали старший байт и младший байт, а затем воспользовались оператором word, который объединил два байта в двухбайтовое число («слово»). Можно поступить так: считать старший байт, сдвинуть его на 8 разрядов влево, считать младший байт, а затем объединить их по OR (ИЛИ). В последнем случае приводится просто более короткий синтаксис предыдущего варианта. Выбирайте тот, который вам более удобен и понятен.
Рассмотрим временную диаграмму информационного обмена:
Временная диаграмма I2C при принятии данных от цифрового компаса HMC5883L
Первые 5 байтов до небольшой паузы – это то, что мы описали в секции void setup():
- выбор адреса ведомого устройства и режима записи;
- выбор первого регистра управления Control Register A (CRA) с адресом 0x00 (согласно вышеприведённой таблице);
- запись в первый регистр управления CRA числа 0x70 – усреднение по 8 точкам, 15 Гц, нормальные измерения (подробности см. в паспорте); HMC5883L переводит указатель к следующему регистру – Control Register B (CRB);
- запись в регистр CRB числа 0xA0, что соответствует установке чувствительности 5; HMC5883L переводит указатель к следующему регистру – Mode Register, регистр выбора режима;
- записываем в регистр режима число 0x00 – бесконечный режим измерения.
Далее идёт небольшая пауза примерно в 20 мкс, и передаются ещё два байта – это выбор адреса ведомого в режиме записи и запись адреса регистра – 0x03 – с которого мы будем начинать каждый цикл считывания данных, определённый нами в void loop(). Это первый регистр данных, как видно из таблицы выше.
Последние 7 байтов означают следующее:
- первый байт из 7-ми – выбор адреса ведомого устройства и режима чтения;
- следующие два – чтение двух байтов показаний с канала оси X;
- следующие два – оси Y;
- следующие два – оси Z.
В итоге, в мониторе порта мы видим показания магнитного датчика по трём осям:
Принятые данные цифрового компаса HMC5883L по трём осям
Если поворачивать датчик в пространстве, видно, как меняются показания.
Думаю, что калибровка и настройка цифрового компаса – тема для отдельной статьи.
Progetto: Gestione di due Servomotori utilizzando un modulo GY-521
Questo progetto è un esempio pratico per mostrarvi come sia abbastanza semplice interfacciare il modulo GY-521 con Arduino ed utilizzarlo per una specifica applicazione. Utilizzerò solo i valori degli assi dell’accelerometro e calcolerò gli angoli Pitch e Roll (come descritto nel mio tutorial) per far ruotare i due servomotori da 0° a 179° in base alla posizione dell’accelerometro. Prima di proseguire consiglio la visione del seguente video.
Breadboard
Come si può notare dallo schema elettrico ho alimentato i due servomotori con un’alimentazione esterna da 5V. Questo perchè i miei servo insieme consumano più di 500 mA. Inoltre, 500 mA è anche la corrente massima erogabile da una classica porta USB 2.0. Ora passiamo allo sketch da caricare su Arduino
// MPU6050 & Servo // https://www.giuseppecaccavale.it/ // Giuseppe Caccavale #include <SPI.h> #include <Wire.h> #include <Servo.h> #define MPU 0x68 // I2C address of the MPU-6050 Servo ServoX, ServoY; double AcX, AcY, AcZ; int Pitch, Roll; void setup() { Serial.begin(9600); ServoX.attach(8); ServoY.attach(9); init_MPU(); // Inizializzazione MPU6050 } void loop() { FunctionsMPU(); // Acquisisco assi AcX, AcY, AcZ. Roll = FunctionsPitchRoll(AcX, AcY, AcZ); //Calcolo angolo Roll Pitch = FunctionsPitchRoll(AcY, AcX, AcZ); //Calcolo angolo Pitch int ServoRoll = map(Roll, -90, 90, 0, 179); int ServoPitch = map(Pitch, -90, 90, 179, 0); ServoX.write(ServoRoll); ServoY.write(ServoPitch); Serial.print("Pitch: "); Serial.print(Pitch); Serial.print("\t"); Serial.print("Roll: "); Serial.print(Roll); Serial.print("\n"); } void init_MPU() { Wire.begin(); Wire.beginTransmission(MPU); Wire.write(0x6B); // PWR_MGMT_1 register Wire.write(0); // set to zero (wakes up the MPU-6050) Wire.endTransmission(true); delay(1000); } //Funzione per il calcolo degli angoli Pitch e Roll double FunctionsPitchRoll(double A, double B, double C) { double DatoA, DatoB, Value; DatoA = A; DatoB = (B * B) + (C * C); DatoB = sqrt(DatoB); Value = atan2(DatoA, DatoB); Value = Value * 180 / 3.14; return (int)Value; } //Funzione per l'acquisizione degli assi X,Y,Z del MPU6050 void FunctionsMPU() { Wire.beginTransmission(MPU); Wire.write(0x3B); // starting with register 0x3B (ACCEL_XOUT_H) Wire.endTransmission(false); Wire.requestFrom(MPU, 6, true); // request a total of 14 registers AcX = Wire.read() << 8 | Wire.read(); // 0x3B (ACCEL_XOUT_H) & 0x3C (ACCEL_XOUT_L) AcY = Wire.read() << 8 | Wire.read(); // 0x3D (ACCEL_YOUT_H) & 0x3E (ACCEL_YOUT_L) AcZ = Wire.read() << 8 | Wire.read(); // 0x3D (ACCEL_YOUT_H) & 0x3E (ACCEL_YOUT_L) }
Spero vi sia piaciuto questo tutorial, in ogni caso vi ringrazio per la lettura. Se avete problemi non esitate a lasciare un commento. A presto, ciao!
Расчет угла с помощью гироскопа mpu6050
Данные с гироскопа имеют вид:
В дальнейшем в статье мы будем рассматривать все на примере оси x. Для расчета угла необходимо проинтегрировать переменную “gyro_x_scalled”
является количеством итераций
Так же стоит отметить, что на каждом временном промежутке цикла значение “gyro_x_scalled” остается одинаковым. Существует насколько подходов и методов интегрирования для компенсации и этой погрешности, но мы их детально не будем рассматривать.
Для реализации дискретного интегрирования, будем использовать метод Эйлера как один из самых популярных алгоритмов. Математически интегрирование методом Эйлера можно записать следующим образом:
Мы предполагаем, что начальные углы относительно осей x, y, z после калибровки равны 0, 0 и 90 градусов соответственно, так что для итерации n=0:
Значение T (время каждой итерации) и динамика самого гироскопа (как быстро и насколько нелинейно изменяются углы), значительным образом влияет на точность расчетов. Чем медленнее изменяются углы и чем меньше промежуток между итерациями, тем более точным будет результат. В этом смысле жаль, что платы Arduino достаточно медленные, кристаллы у них работают с частотой 16 МГц и снятие измерений каждые 10-20 мс становится достаточно затруднительным (учитывая тот факт, что процессор занят не только расчетом угла, но и другими параллельными задачами). Мы можем использовать T в виде переменной или константы, я, лично, предпочитаю использовать константу для каждого цикла. В проекте динамические факторы не учитывались, просто использовалась частота итераций с разрывом в 20 мс (0.02 с).
Погрешность гироскопа – «дрифт» (drift)
Из-зза неидеальной калибровки гироскопа, “gyro_x_scalled” никогда не равна нулю и со временем “angle_x_gyro” изменяет свои значения. Для решения данной проблемы, проводится расчет угла с помощью акселерометра и полученные значения сравнывиются с углом гироскопа. Так как модуль MPU6050 располагается горизонтально, ускорение по оси z равно 1g (то есть, 9.81) как это показано на рисунке. Мы можем использовать этот вектор ускорения и его проекцию на ось y для расчета угла между осями x и y.
Угол, который рассчитывается с помощью акселерометра, рассчитывается по зависимости:
Основными проблемами при определении угла наклона с помощью акселерометра являются: сильная зашумленность сигнала и очень сильная чувствительность к вибрациям, без которых ни один механизм не работает. Более того, еслипри перемещении MPU6050 вдоль одной из осей координат, полученные значения будут мешать расчету угла. Так что для лучшего результата, углы с гироскопа и акселерометра объединяются с помощью фильтра:
Окончательно уравнение для определения угла наклона принимает вид:
На рисунке ниже приведена имплементация полученных зависимостей в оболочке Arduino IDE
1Описание и характеристики датчикавлажности и температуры HTU21D
Датчик HTU21D является цифровым датчиком для измерения температуры и влажности с подключением по интерфейсу I2C. Каждый датчик индивидуально калибруется и тестируется на заводе. Основные технические характеристики:
- напряжение питания: 1,5…3,6 В;
- ток потребления: ≤ 4 мА, в режиме ожидания – 0,08 мкА;
- диапазон измерения влажности: 0…100%;
- диапазон измерения температуры: -40…+125°C с точностью ±0,3°C;
Датчик измеряет температуру с разрешением 12…14 бит и влажность с разрешением 8…12 бит. Разрешение может быть изменено программно.
На самом деле HTU21D является представителем целого небольшого семейства датчиков температуры и влажности. Все они начинают свои названия с HTU2xx. В названии датчиков заложена следующая информация:
- Число после «HTU2» показывает точность измерения влажности: «0» соответствует ±5%, «1» соответствует ±3%.
- Буква после численного обозначения показывает тип датчика: D – цифровой (интерфейс I2C), P – аналоговый (PWM, ШИМ), S – сигма-дельта модуляция (SDM), преобразуемая в аналоговую.
- Опциональное «F» в конце означает наличие специального фильтра, который защищает датчик от пыли и влаги.
Наименование семейства датчиков HTU2xx
Сенсор имеет миниатюрные размеры. Зачастую датчик можно приобрести в составе готового модуля, который подключается непосредственно к контроллеру (Arduino или другому). Одна из многочисленных разновидностей готового модуля с датчиком показана на фотографии.
Модуль с датчиком HTU21D
На данном модуле минимум радиодеталей: собственно, сам датчик HTU21D, два подтягивающих линии SCL и SDA резистора номиналом по 4,7 кОм, а также фильтрующий конденсатор по питанию.
По умолчанию подтягивающие резисторы не подключены. Чтобы их задействовать, необходимо запаять имеющуюся на модуле перемычку. В противном случае при подключении модуля в схеме необходимо предусмотреть внешние подтягивающие резисторы.
Калибровка mpu6050
Калибровка гироскопа и акселерометра – это очень важный шаг. Приведенные значения для гироскопа имеют вид: “gyro_x_scalled = ”, так как для получения угла поворота относительно оси по данным угловой скорости, необходимо провести интегрирование. Если “gyro_x_scalled” содержит ошибку или неверно выбрана база, эта ошибка также интегрируется и превращается в значительную погрешность в результате. Так что в идеале измерения должны показывать нуль, если гироскоп не движется вокруг каких-либо осей координат. На практике добиться идеала практически невозможно, так что наша задача – минимизировать эту ошибку. Кроме того, для компенсации «дрифта», можно использовать акселерометр для расчета угла наклона, сравнения полученных данных с результатами гироскопа и последующей компенсацией данной погрешности. Расчет угла будет рассмотрен в этой статье отдельно ниже.
На рисунках далее показано использование функции MPU6050_OffsetCal()
непосредственно в программе в Arduino IDE.
Скетч Arduino для калибровки платы акселерометра/гироскопа MPU6050:
Результат работы скетча для калибровки в серийном мониторе
Назначение связки гироскоп и акселерометр
Для начала давайте разберёмся, зачем Arduino mpu 6050 (Gy-521) вообще нужен и что собой представляет гироскоп-акселерометр в целом. Такой датчик все мы видели в смартфонах, и там он выполняет следующие функции:
- Позволяет замерять шаги. Акселерометр способен отслеживать резкие движения устройства, а в зависимости от его настройки и чувствительности, считать некоторые из них за шаг.
- Измеряет поворот экрана. Здесь уже оба устройства работают в паре. Ведь когда вы поворачиваете смартфон набок, картинка должна изменить свою ориентацию для пользователя, и лишь с помощью гироскопа удаётся определить угол наклона, под которым ПО это должно будет сделать.
- Компас, карты и навигация. Акселерометр с гироскопом позволяют определить ориентацию устройства в пространстве, что необходимо в различных приложениях для мобильной навигации.
Вот и выходит, что данный датчик подойдёт для тех проектов, в которых вам необходимо измерить ориентацию или движения прибора в пространстве, без точных данных о его местоположении. Это может быть, как самодельная линейка со встроенным уровнем, чтобы пользователь мог определить, насколько ровно стоит та или иная мебель, так и устройство для кровати, встроенной в стену, включающее свет, когда она выдвигается.
Но применить модуль можно и с большей выдумкой, например, для измерения количества оборотов в секунду и регуляции мощности охладительной системы или автоматизации различных процессов.
Всё зависит исключительно от вашей выдумки и конкретного проекта.
Смотрите по теме: Подключаем гироскоп-акселерометр (MPU-6050) к плате Arduino
Чаще всего гироскоп для Ардуино применяется в системах автоматизации под так называемые «смартхаусы» (умные дома — прим. ред.), являясь своеобразным переключателем. Передавая определённые данные в МК, который затем отправляет их по блютуз-модулю к другому устройству, он может управлять всей техникой в доме.
Ещё один простой способ применения – использование вместо датчика движения на дверях, для включения света и кондиционирования, когда вы возвращаетесь домой.
Step 7: Check Results in Serial Port
once the upload is done, its time to open up the serial Monitor and observe output:
Don’t forget to match the serial port with the baud rate we defined in start of code which is 115200
If our wiring and hardware is proper, we should get values of each axis on Serial port for both Raw and Normalized gyroscopic change in sensor.
Initialize MPU6050 * Sleep Mode: Disabled * Clock Source: PLL with X axis gyroscope reference * Gyroscope: 2000 dps * Gyroscope offsets: 0 / 0 / 0 Xraw = -65.00 Yraw = 25.00 Zraw = -29.00 Xnorm = 0.00 Ynorm = 0.00 Znorm = 0.00 Xraw = -62.00 Yraw = 20.00 Zraw = -32.00 Xnorm = 0.00 Ynorm = 0.00 Znorm = 0.00 Xraw = -64.00 Yraw = 25.00 Zraw = -30.00 Xnorm = 0.00 Ynorm = 0.00 Znorm = 0.00 Xraw = -66.00 Yraw = 23.00 Zraw = -29.00 Xnorm = 0.00 Ynorm = 0.00 Znorm = 0.00 Xraw = -67.00 Yraw = 20.00 Zraw = -33.00 Xnorm = 0.00 Ynorm = 0.00 Znorm = 0.00 Xraw = -64.00 Yraw = 22.00 Zraw = -31.00 Xnorm = 0.00 Ynorm = 0.00 Znorm = 0.00
here is the logs of what we got on Serial Port.
Модуль ИК приемника KY-022
Модуль приемника инфракрасного излучения имеет габариты 24 х 15 мм и массу 1,6 г и представляет собой печатную плату на которой располагается сам приемный модуль и красный светодиод с добавочным сопротивлением .
Модуль имеет три вывода: центральный немаркированный – питание +5В, контакт «-» — общий, контакт «S» — информационный. Потребляемый ток 200 мкА в режиме ожидания, 500 мкА с работающим светодиодом.
В момент приема инфракрасного сигнала светодиод на плате мигает, что достаточно удобно при отладке конструкций на макетной плате.
Для полноценного использования ИК-приемника можно воспользоваться библиотекой IRremote . Для примера иллюстрирующего работу данного устройства можно использовать программу IR. В качестве источника сигналов можно использовать пульт дистанционного управления от телевизора.
Коды сигналов пульта телевизора
Аналогично модуль может принимать сигналы от пульта дистанционного управления светодиодной лампой.
При помощи этого датчика не сложно организовать многокомандное дистанционное управление в пределах прямой видимости, при расстоянии между приемником и передатчиком около 3-5 м.
Процессор полетного контроллера
От процессора будет зависеть то, насколько быстро будут обрабатываться поступающие к нему данные. Процессоры делятся по поколениям: F1, F3, F4, F6. Вот такие странные поколения, где пропущены 2-е и 6-е поколения. Отличаются они частотой работы и архитектурой:
- F1 — 72MHz;
- F3 — 72MHz;
- F4 — 168MHz;
- F7 — 216MHz.
Сейчас все новые полетные контроллеры поставляются с процессором 7-го поколения, так как обрабатывать фильтры и PID становится все труднее, прогресс шагает километровыми шагами в этой сфере. Но у многих пилотов ПК на процессорах 3-го поколения, так как F3 был самым (да и остается) массовым поколением со стабильной работой.
Исходный код программы на С
Arduino
#include «TinyWireM.h»
#include «TinyOzOLED.h»
int accelX, accelY, accelZ;
char mpu = 0x68;
float vectorprevious;
float vector;
float totalvector;
int Steps = 0;
void setup() {
TinyWireM.begin();
OzOled.init();
OzOled.clearDisplay();
OzOled.setNormalDisplay();
OzOled.sendCommand(0xA1); // установки ориентации дисплея
OzOled.sendCommand(0xC8);
TinyWireM.beginTransmission(mpu);
TinyWireM.write(0x6B); // установка регистра питания
TinyWireM.write(0b00000000); // отключаем спящий режим
TinyWireM.endTransmission();
TinyWireM.beginTransmission(mpu);
TinyWireM.write(0x1B); // конфигурация регистров гироскопа
TinyWireM.write(0x00000000); // 250° per second range (default)
TinyWireM.endTransmission();
TinyWireM.beginTransmission(mpu); //адрес I2C гироскопа
TinyWireM.write(0x1C); // конфигурация регистров акселерометра
TinyWireM.write(0b00000000); // 2g range +/- (default)
TinyWireM.endTransmission();
}
void loop() {
getAccel();
vector = sqrt( (accelX * accelX) + (accelY * accelY) + (accelZ * accelZ) );
//OzOled.printString(«Vec:», 0, 2);
//OzOled.printNumber(vector, 0, 5, 2);
totalvector = vector — vectorprevious;
//OzOled.printString(«Pre:», 0, 4);
//OzOled.printNumber(vectorprevious, 0, 5, 4);
//OzOled.printString(«Diff:», 0, 6);
//OzOled.printNumber(totalvector, 0, 5, 6);
if (totalvector > 6){
Steps++;
}
//String Step_count = String(Steps);
//char data;
//Step_count.toCharArray(data, 2);
//OzOled.printBigNumber(data, 6, 2, 3);
OzOled.printString(«Steps», 0, 4);
OzOled.printNumber(Steps, 0, 8, 4);
vectorprevious = vector;
delay(600);
//OzOled.clearDisplay();
}
void getAccel() {
TinyWireM.beginTransmission(mpu); //адрес I2C гироскопа
TinyWireM.write(0x3B); // регистр данных акселерометра
TinyWireM.endTransmission();
TinyWireM.requestFrom(mpu, 6); // считываем 6 байт, 2 for each DoF
accelX = TinyWireM.read() << 8|TinyWireM.read();
accelY = TinyWireM.read() << 8|TinyWireM.read();
accelZ = TinyWireM.read() << 8|TinyWireM.read();
// OzOled.printNumber(accelX, 0, 0, 0);
// OzOled.printNumber(accelY, 0, 0, 2);
//OzOled.printNumber(accelZ, 0, 0, 4);
}
1 |
#include «TinyWireM.h» intaccelX,accelY,accelZ; charmpu=0x68; floatvectorprevious; floatvector; floattotalvector; intSteps=; voidsetup(){ TinyWireM.begin(); OzOled.init(); OzOled.clearDisplay(); OzOled.setNormalDisplay(); OzOled.sendCommand(0xA1);// установки ориентации дисплея OzOled.sendCommand(0xC8); TinyWireM.beginTransmission(mpu); TinyWireM.write(0x6B);// установка регистра питания TinyWireM.write(0b00000000);// отключаем спящий режим TinyWireM.endTransmission(); TinyWireM.beginTransmission(mpu); TinyWireM.write(0x1B);// конфигурация регистров гироскопа TinyWireM.write(0x00000000);// 250° per second range (default) TinyWireM.endTransmission(); TinyWireM.beginTransmission(mpu);//адрес I2C гироскопа TinyWireM.write(0x1C);// конфигурация регистров акселерометра TinyWireM.write(0b00000000);// 2g range +/- (default) TinyWireM.endTransmission(); } voidloop(){ getAccel(); vector=sqrt((accelX*accelX)+(accelY*accelY)+(accelZ*accelZ)); //OzOled.printString(«Vec:», 0, 2); //OzOled.printNumber(vector, 0, 5, 2); totalvector=vector-vectorprevious; //OzOled.printString(«Pre:», 0, 4); //OzOled.printNumber(vectorprevious, 0, 5, 4); //OzOled.printString(«Diff:», 0, 6); //OzOled.printNumber(totalvector, 0, 5, 6); if(totalvector>6){ Steps++; } OzOled.printString(«Steps»,,4); OzOled.printNumber(Steps,,8,4); vectorprevious=vector; delay(600); //OzOled.clearDisplay(); voidgetAccel(){ TinyWireM.beginTransmission(mpu);//адрес I2C гироскопа TinyWireM.write(0x3B);// регистр данных акселерометра TinyWireM.endTransmission(); TinyWireM.requestFrom(mpu,6);// считываем 6 байт, 2 for each DoF accelX=TinyWireM.read()<<8|TinyWireM.read(); accelY=TinyWireM.read()<<8|TinyWireM.read(); accelZ=TinyWireM.read()<<8|TinyWireM.read(); // OzOled.printNumber(accelX, 0, 0, 0); // OzOled.printNumber(accelY, 0, 0, 2); //OzOled.printNumber(accelZ, 0, 0, 4); } |
Step 3: Hardware
MPU 6050 comes in a Module form, with 8 pins, but don’t worry, we will use only 4 important pins and it will be sufficient to integrate with our Arduino Board.
So we have VCC, ground, which takes any input from 2v to 5v, since this board has a voltage regulator on board and thus supports 3.3v logic high and 5v logic high.
Next we have few complimentary resistors and capacitors in SMD package and the most important PART the MPU6050 IC, which is a MEMS or say micro electro mechanical system, which changes voltage depending on change in axis position.
This IC also has SCL SDA, which are I2C pins and XDA and XCL which are auxiliary Serial pins, we won’t use them with Arduino for this tutorial, we have AD0 which is address select between Auxiliary and Primary ports, lastly we have INT interrupt pin,
connections for our Arduino UNO and NANO are as following:
VCC — 5v
GND — GND
SCL — A5
SDA — A4
(only SDA and SCL pins change for other Arduino boards.)
And that’s all for connection
( find all the components at UTSOURCE )
Гироскопический датчик (гироскоп) MPU-6050
MPU-6050 представляет собой 8-пиновый 3-осевой гироскоп, акселерометр и датчик температуры на едином чипе. По умолчанию данный модуль работает по интерфейсу I2C, но можно задействовать и интерфейс SPI. В нашем проекте мы будем использовать интерфейс (режим) I2C и в этом режиме нам понадобятся контакты SDA и SCL модуля.
Распиновка MPU-6050:Vcc – контакт для подачи питающего напряжения постоянного тока;GND – земля модуля;SDA – это контакт используется для передачи данных между модулем mpu6050 и микроконтроллером;SCL – вход синхронизации;XDA – линия передачи данных (опциональная) по протоколу I2C для конфигурирования и считывания данных с внешних датчиков (не используется в нашем проекте);XCL – вход синхронизации протокола I2C для конфигурирования и считывания данных с внешних датчиков (не используется в нашем проекте);ADO – I2C Slave Address LSB (не используется в нашем проекте);INT – контакт прерывания для индикации готовности данных.
На нашем сайте вы можете посмотреть следующие проекты на основе гироскопа MPU6050:
- подключение гироскопа MPU6050 к Arduino;
- измеритель уровня (уклономер) на основе Arduino и MPU6050;
- самобалансирующийся робот на Arduino Uno.
Шаг 1. Компоненты для подключения акселерометра к Arduino
Для проекта понадобятся несколько компонентов:
Микроконтроллер Arduino UNO R3
МК создан с использованием материалов контроллера ATmega328:
- цифровые входы и выходы в количестве 14 штук, причем половина приходится на ШИМ-выходы;
- аналогичные входы, количество – 6 штук;
- резонатор на основе кварца, мощностью 16 МГц;
- встроен usb-вход;
- контакт для подключения питания;
- на МК располагается кнопка, с помощью которой возможен сброс данных и кода;
- контакт для программирования данных, находящихся внутри схемы, именуемый ICSP.
Старт работы начинается с подачи электрического питания в плату. Пользователь подключает к плате со схемой блок питания или зарядное устройство. Также процедура осуществляется с помощью usb-кабеля, который подключен к компьютеру и микроконтроллеру. Для разработки программы понадобится бесплатная среда программирования – Arduino IDE.
Внимание! Пользователь разрабатывает приложения с использованием Ардуино, только если платы совместимы с архитектурой микроконтроллера. В противном случае программа не заработает.. Пользователь создает в бесплатной среде код, затем его компилирует и загружает проработанную программу в пространство памяти в Ардуино
Язык, на котором программируется код, Wiring максимально приближен к популярному среди программистов языку – C++. Кроме того МК поддерживает версии для осей Виндовс, Мак ОС и Линукс
Пользователь создает в бесплатной среде код, затем его компилирует и загружает проработанную программу в пространство памяти в Ардуино. Язык, на котором программируется код, Wiring максимально приближен к популярному среди программистов языку – C++. Кроме того МК поддерживает версии для осей Виндовс, Мак ОС и Линукс.
Модуль датчика для гироскопа акселерометра на Аrduino с 3 осями – GY-521 (MPU-6050)
В основе компонента лежит микросхема MPU-6050. В комплект входят 2 предмета – гироскоп и акселерометр. Данные устройства перед конструированием обрабатываются и затем переносятся прямиком в микроконтроллер через интерфейс
Модуль датчика помогает определять место и перемещение инструмента в пространстве. Измеряются дифферент и углы крена посредством вектора силы тяжести и скорости в процессе вращения. Также включена функция измерения температурного режима. Перемещение определяется линейным ускорением и угловой скоростью. Полная картина рисуется по 3 осям.
Компонент нередко сравнивают с человеческим вестибулярным аппаратом, который помогает людям чувствовать силу тяготения и удерживать равновесие.
Макетная плата, предназначенная для прототипирования
Отладка – неотъемлемая часть построения электронных схем. Макетная плата незаменима для конструкции электронной аппаратуры. Ранее в изобретательстве использовали традиционные макетные платы, но сейчас широко распространены макетные платы, которые удобны тем, что не требуют дополнительных спаек.
Таким образом, процесс сборки и отладки электронной схемы в разы ускоряется: не приходится часто использовать паяльник, чтобы поменять сломанные радиодетали.
Материал для изготовления беспаечных макетных плат – пластик. Кроме того, все контакты надежно скреплены к плате, поэтому частые переключения не испортят элемент.
Соединительные провода папа-папа
Обычные провода папа-папа нам подойдут, еще их называют провода-перемычки. Такие стоят недорого и продаются везде, на любом рынке или в любом онлайн-магазине для радиолюбителей.