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 )
Типы коннекторов
Это, конечно, не функция, но не рассказать об этом нельзя. На полетном контроллере есть 3 типа соединений между периферией:
- Пластиковые коннекторы
- Контактные площадки для припаивания
- Отверстия для припаивания
Пластиковые коннекторы в основном используются для подключения периферии, которую иногда нужно отключать и снимать, в этом их плюс — быстро снять/подключить. Они не очень прочные, но удобные.
Контактные площадки для припаивания удобны в использовании, но если контакт сильно нагреется во время использования, то есть вероятность, что он оторвется. То же самое и в вопросе о разрыве при сильном натяжении.
Отверстия для припаивания удобны тем, что провод гораздо прочнее будет «сидеть» в пазу. Также можно использовать угловые штифты для более удобного подключения периферии.
Расчет угла с помощью гироскопа 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 с).
Исходный код программы
Перед загрузкой кода программы в плату Arduino не забудьте скачать и установить библиотеку для работы с гироскопом MPU6050.
Arduino
/*
MPU6050 Library: https://github.com/jarzebski/Arduino-MPU6050 (c) 2014 by Korneliusz Jarzebski
*/
#include <Wire.h> //библиотека для связи по протоколу IIC
#include <MPU6050.h> //библиотека для работы с MPU6050
#include <SoftwareSerial.h>// библиотека последовательной связи
SoftwareSerial BT(10, 11); // RX, TX
MPU6050 mpu;
unsigned long timer = 0;
unsigned long timer2 = 0;
float timeStep = 0.01;
float pitch = 0;
float roll = 0;
float yaw = 0;
float temp =0;
void setup()
{
Serial.begin(115200);
BT.begin(9600); // инициализируем последовательную связь с модулем Bluetooth на скорости 9600 бод/с
// инициализируем MPU6050
while(!mpu.begin(MPU6050_SCALE_2000DPS, MPU6050_RANGE_2G))
{
Serial.println(«Could not find a valid MPU6050 sensor, check wiring!»);
delay(500);
}
mpu.calibrateGyro(); // старт калибровки гироскопа
mpu.setThreshold(3); // устанавливаем чувствительность гироскопа
}
void loop()
{
timer = millis();
//считываем данные температуры и гироскопа
Vector norm = mpu.readNormalizeGyro();
temp = mpu.readTemperature();
// рассчитываем показатели Pitch, Roll и Yaw
pitch = pitch + norm.YAxis * timeStep;
roll = roll + norm.XAxis * timeStep;
yaw = yaw + norm.ZAxis * timeStep;
// Print values
Serial.print(» Pitch = «);
Serial.print(pitch);
Serial.print(» Roll = «);
Serial.print(roll);
Serial.print(» Yaw = «);
Serial.print(yaw);
Serial.print(» Temp = «);
Serial.print(temp);
Serial.println(» *C»);
delay((timeStep*1000) — (millis() — timer)); // используем интервал 0.01 секунды для считывания данных
if ((millis()-timer2) > 200)
send_BT();
}
void send_BT()
{
int t;
int x;
int y;
if (roll>-100 && roll<100)
x = map (roll, -100, 100, 0, 100);
if (pitch>-100 && pitch<100)
y = map (pitch, -100, 100, 100, 200);
if (temp>0 && temp<50)
t = 200 + int(temp);
BT.write(x);
BT.write(y);
BT.write(t);
timer2 = millis();
}
1 |
/* SoftwareSerialBT(10,11);// RX, TX MPU6050mpu; unsignedlongtimer=; unsignedlongtimer2=; floattimeStep=0.01; floatpitch=; floatroll=; floatyaw=; floattemp=; voidsetup() { Serial.begin(115200); BT.begin(9600);// инициализируем последовательную связь с модулем Bluetooth на скорости 9600 бод/с // инициализируем MPU6050 while(!mpu.begin(MPU6050_SCALE_2000DPS,MPU6050_RANGE_2G)) { Serial.println(«Could not find a valid MPU6050 sensor, check wiring!»); delay(500); } mpu.calibrateGyro();// старт калибровки гироскопа mpu.setThreshold(3);// устанавливаем чувствительность гироскопа } voidloop() { timer=millis(); //считываем данные температуры и гироскопа Vectornorm=mpu.readNormalizeGyro(); temp=mpu.readTemperature(); // рассчитываем показатели Pitch, Roll и Yaw pitch=pitch+norm.YAxis*timeStep; roll=roll+norm.XAxis*timeStep; yaw=yaw+norm.ZAxis*timeStep; // Print values Serial.print(» Pitch = «); Serial.print(pitch); Serial.print(» Roll = «); Serial.print(roll); Serial.print(» Yaw = «); Serial.print(yaw); Serial.print(» Temp = «); Serial.print(temp); Serial.println(» *C»); delay((timeStep*1000)-(millis()-timer));// используем интервал 0.01 секунды для считывания данных if((millis()-timer2)>200) send_BT(); } voidsend_BT() { intt; intx; inty; if(roll>-100&&roll<100) x=map(roll,-100,100,,100); if(pitch>-100&&pitch<100) y=map(pitch,-100,100,100,200); if(temp>&&temp<50) t=200+int(temp); BT.write(x); BT.write(y); BT.write(t); timer2=millis(); } |
Шаг 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 осям.
Компонент нередко сравнивают с человеческим вестибулярным аппаратом, который помогает людям чувствовать силу тяготения и удерживать равновесие.
Макетная плата, предназначенная для прототипирования
Отладка – неотъемлемая часть построения электронных схем. Макетная плата незаменима для конструкции электронной аппаратуры. Ранее в изобретательстве использовали традиционные макетные платы, но сейчас широко распространены макетные платы, которые удобны тем, что не требуют дополнительных спаек.
Таким образом, процесс сборки и отладки электронной схемы в разы ускоряется: не приходится часто использовать паяльник, чтобы поменять сломанные радиодетали.
Материал для изготовления беспаечных макетных плат – пластик. Кроме того, все контакты надежно скреплены к плате, поэтому частые переключения не испортят элемент.
Соединительные провода папа-папа
Обычные провода папа-папа нам подойдут, еще их называют провода-перемычки. Такие стоят недорого и продаются везде, на любом рынке или в любом онлайн-магазине для радиолюбителей.
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, которые упрощают настройку и чтение данных с акселерометра, позволяя не думать о таких низкоуровневых вещах как регистры, биты и байты. Ссылки на библиотеки также приведены в конце статьи.
Назначение связки гироскоп и акселерометр
Для начала давайте разберёмся, зачем Arduino mpu 6050 (Gy-521) вообще нужен и что собой представляет гироскоп-акселерометр в целом. Такой датчик все мы видели в смартфонах, и там он выполняет следующие функции:
- Позволяет замерять шаги. Акселерометр способен отслеживать резкие движения устройства, а в зависимости от его настройки и чувствительности, считать некоторые из них за шаг.
- Измеряет поворот экрана. Здесь уже оба устройства работают в паре. Ведь когда вы поворачиваете смартфон набок, картинка должна изменить свою ориентацию для пользователя, и лишь с помощью гироскопа удаётся определить угол наклона, под которым ПО это должно будет сделать.
- Компас, карты и навигация. Акселерометр с гироскопом позволяют определить ориентацию устройства в пространстве, что необходимо в различных приложениях для мобильной навигации.
Вот и выходит, что данный датчик подойдёт для тех проектов, в которых вам необходимо измерить ориентацию или движения прибора в пространстве, без точных данных о его местоположении. Это может быть, как самодельная линейка со встроенным уровнем, чтобы пользователь мог определить, насколько ровно стоит та или иная мебель, так и устройство для кровати, встроенной в стену, включающее свет, когда она выдвигается.
Но применить модуль можно и с большей выдумкой, например, для измерения количества оборотов в секунду и регуляции мощности охладительной системы или автоматизации различных процессов.
Всё зависит исключительно от вашей выдумки и конкретного проекта.
Смотрите по теме: Подключаем гироскоп-акселерометр (MPU-6050) к плате Arduino
Чаще всего гироскоп для Ардуино применяется в системах автоматизации под так называемые «смартхаусы» (умные дома — прим. ред.), являясь своеобразным переключателем. Передавая определённые данные в МК, который затем отправляет их по блютуз-модулю к другому устройству, он может управлять всей техникой в доме.
Ещё один простой способ применения – использование вместо датчика движения на дверях, для включения света и кондиционирования, когда вы возвращаетесь домой.
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.
Step 6: Understand the Code
Basically in this example, we will see if our sensor is working so we will display the sensor data on serial monitor.
So we begin the serial monitor in setup part.
Serial.begin(115200);
In this While Loop, the sensor test sequence is executed.
while(!mpu.begin(MPU6050_SCALE_2000DPS, MPU6050_RANGE_2G)) { Serial.println("Could not find a valid MPU6050 sensor, check wiring!"); delay(500); }
// mpu.setGyroOffsetX(155); // mpu.setGyroOffsetY(15); // mpu.setGyroOffsetZ(15); ( uncomment by removing "//" )
there is a calibration line, which will virtually set our sensor flat.
// Calibrate gyroscope. The calibration must be at rest. // If you don't want calibrate, comment this line. mpu.calibrateGyro();
// Set threshold sensivty. Default 3. // If you don't want use threshold, comment this line or set 0. mpu.setThreshold(3);
In check loop section, basic hardware checking is done.
void checkSettings() { Serial.println(); Serial.print(" * Sleep Mode: "); Serial.println(mpu.getSleepEnabled() ? "Enabled" : "Disabled"); Serial.print(" * Clock Source: "); switch(mpu.getClockSource()) { case MPU6050_CLOCK_KEEP_RESET: Serial.println("Stops the clock and keeps the timing generator in reset"); break; case MPU6050_CLOCK_EXTERNAL_19MHZ: Serial.println("PLL with external 19.2MHz reference"); break; case MPU6050_CLOCK_EXTERNAL_32KHZ: Serial.println("PLL with external 32.768kHz reference"); break; case MPU6050_CLOCK_PLL_ZGYRO: Serial.println("PLL with Z axis gyroscope reference"); break; case MPU6050_CLOCK_PLL_YGYRO: Serial.println("PLL with Y axis gyroscope reference"); break; case MPU6050_CLOCK_PLL_XGYRO: Serial.println("PLL with X axis gyroscope reference"); break; case MPU6050_CLOCK_INTERNAL_8MHZ: Serial.println("Internal 8MHz oscillator"); break; } Serial.print(" * Gyroscope: "); switch(mpu.getScale()) { case MPU6050_SCALE_2000DPS: Serial.println("2000 dps"); break; case MPU6050_SCALE_1000DPS: Serial.println("1000 dps"); break; case MPU6050_SCALE_500DPS: Serial.println("500 dps"); break; case MPU6050_SCALE_250DPS: Serial.println("250 dps"); break; } Serial.print(" * Gyroscope offsets: "); Serial.print(mpu.getGyroOffsetX()); Serial.print(" / "); Serial.print(mpu.getGyroOffsetY()); Serial.print(" / "); Serial.println(mpu.getGyroOffsetZ()); Serial.println(); }
void loop() { Vector rawGyro = mpu.readRawGyro(); Vector normGyro = mpu.readNormalizeGyro();
We have 3 axis, called as x y and z, which can be called using variable name which we set as rawGyro, followed by axis name,to make a project, we will need these 3 values of x,y and z using this variablename.axis command.
Serial.print(" Xraw = "); Serial.print(rawGyro.XAxis); Serial.print(" Yraw = "); Serial.print(rawGyro.YAxis); Serial.print(" Zraw = "); Serial.println(rawGyro.ZAxis); Serial.print(" Xnorm = "); Serial.print(normGyro.XAxis); Serial.print(" Ynorm = "); Serial.print(normGyro.YAxis); Serial.print(" Znorm = "); Serial.println(normGyro.ZAxis);
atlast, to view the values at comfortable speed, lets increase the delay from 10 to 1000
delay(10); }
Code can be Found here!
Функции в программе 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 | бесконечность |
1 | 184 |
2 | 94 |
3 | 44 |
4 | 21 |
5 | 10 |
6 | 5 |
Если int BW не в диапазоне 0-6, фильтр низких частот отключается, что соответствует установке – бесконечность.
MPU6050_SetGains(int gyro,int accel)
Эта функция используется для установки максимального значения шкалы измерений
int gyro | Макс. знач.[угол/с] | int accel | Макс. знач. [м/с2] | |
250 | 2g | |||
1 | 500 | 1 | 4g | |
2 | 1000 | 2 | 8g | |
3 | 2000 | 3 | 16g |
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), что учтено в коде.
2Подключение датчика влажности и температуры HTU21D к Arduino
Датчик HTU21D управляется по интерфейсу I2C, и ему необходим 3-вольтовый сигнал управления (абсолютный максимум для ножек ввода-вывода, согласно техническому описанию, составляет 3,9 В). Arduino генерирует 5-вольтовый сигнал. Поэтому желательно подключать датчик с помощью преобразователя логического уровня по такой схеме:
Схема подключения датчика HTU21D к Arduino через преобразователь логического уровня
На данной схеме показаны резисторы 4.7 кОм, которые подтягивают линии SCL и SDA к питанию 3,3 В. Если вы замкнули перемычку в модуле, то эти резисторы не нужны.
Для того чтобы использовать датчик, скачаем библиотеку HTU21D (она также приложена в конце статьи). Установим библиотеку как обычно. Загрузим пример SparkFun_HTU21D_Demo (File Examples SparkFun HTU21D humidity and temperature sensor breakout). В мониторе порта побегут измеренные значения температуры и влажности. Вживую это может выглядеть так:
Подключение датчика HTU21D к Arduino через преобразователь логического уровня
При использовании Arduino и готовых библиотек никаких проблем возникнуть не должно, всё элементарно. Поэтому давайте разберёмся как управлять датчиком HTU21D без библиотек.
MPU6050 Module Hardware Overview
At the heart of the module is a low power, inexpensive 6-axis MotionTracking chip that combines a 3-axis gyroscope, 3-axis accelerometer, and a Digital Motion Processor (DMP) all in a small 4mm x 4mm package.
It can measure angular momentum or rotation along all the three axis, the static acceleration due to gravity, as well as dynamic acceleration resulting from motion, shock, or vibration.
The module comes with an on-board LD3985 3.3V regulator, so you can use it with a 5V logic microcontroller like Arduino without worry.
The MPU6050 consumes less than 3.6mA during measurements and only 5μA during idle. This low power consumption allows the implementation in battery driven devices.
In addition, the module has a power LED that lights up when the module is powered.
Measuring Acceleration
The MPU6050 can measure acceleration using its on-chip accelerometer with four programmable full scale ranges of ±2g, ±4g, ±8g and ±16g.
The MPU6050 has three 16-bit analog-to-digital converters that simultaneously sample the 3 axis of movement (along X, Y and Z axis).
Measuring Rotation
The MPU6050 can measure angular rotation using its on-chip gyroscope with four programmable full scale ranges of ±250°/s, ±500°/s, ±1000°/s and ±2000°/s.
The MPU6050 has another three 16-bit analog-to-digital converters that simultaneously samples 3 axes of rotation (around X, Y and Z axis). The sampling rate can be adjusted from 3.9 to 8000 samples per second.
Measuring Temperature
The MPU6050 includes an embedded temperature sensor that can measure temperature over the range of -40 to 85°C with accuracy of ±1°C.
Note that this temperature measurement is of the silicon die itself and not the ambient temperature. Such measurements are commonly used to offset the calibration of accelerometer and gyroscope or to detect temperature changes rather than measuring absolute temperatures.
The I2C Interface
The module uses the I2C interface for communication with the Arduino. It supports two separate I2C addresses: 0x68HEX and 0x69HEX. This allows two MPU6050s to be used on the same bus or to avoid address conflicts with another device on the bus.
The ADO pin determines the I2C address of the module. This pin has a built-in 4.7K pull-down resistor. Therefore, when you leave the ADO pin unconnected, the default I2C address is 0x68HEX and when you connect it to 3.3V, the line is pulled HIGH and the I2C address becomes 0x69HEX.
Adding External Sensors
To increase the level of accuracy even further, the MPU6050 module provides a feature for connecting external sensors. These external sensors are connected to the MPU6050 via a second I2C bus (XDA and XCL), which is completely independent of the main I2C bus.
This external connection is usually used to attach a magnetometer, which can measure magnetic fields on three axes. By itself, the MPU6050 has 6 Degrees of Freedom (DOF), three each for the accelerometer and the gyroscope. Adding a magnetometer adds an extra three DOF to the sensor, making it 9 DOF.
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.
Комплектующие
Создаётся данный датчик или МК, в зависимости от того, что вы собрались приобретать, из компонентов ATmega328.
Распиновка модуля Arduino MPU 6050
Так, в нём имеются:
- 14 штук различных пинов и цифровых выходов, половина из которых являются ШИМ-выходами.
- Специальные кварцевые резонаторы до 16 МГц мощностью.
- Встроенный вход под usb-кабель, который позволит вам сэкономить не только время, но и деньги, которые вы могли бы потратить на покупку адаптера.
- Контакты и распиновка для стандартного питания с нулем, фазой и заземлением.
- Контакты для сброса до заводских настроек, при которых весь машинный код и данные будут стёрты. Это полезно в том случае, если вы напортачили с программой и модуль превратился в бесполезную груду железа, и просто как экономия времени, если необходимо сменить прошивку.
- ICSP контакт, который необходим для того, чтобы запрограммировать машинный код, который будет находиться внутри системы.
Все эти компоненты и составляют 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.