В этом материале мы узнаем как управлять серводвигателем с помощью датчика MPU6050, подключенного к нашему Ардуино.
В этом проекте мы будем управлять сервомотором, используя датчик MPU6050 (акселерометр и гироскоп). Мы подключим серводвигатель и датчик MPU6050 к Ардуино таким образом, чтобы всякий раз, когда мы двигаем MPU6050, сервомотор двигается в соответствии с ним.
Как это работает?
Структура акселерометра представляет собой массу, прикрепленную к пружине, которая имеет фиксированные внешние пластины и движется в одном направлении. Емкость между пластинами будет меняться всякий раз, когда применяется ускорение. Это изменение емкости будет измерено и будет соответствовать значению ускорения.
При перемещении датчика в направлении вверх или вниз он дает нам значения от -17000 до 17000. Мы будем отображать их от 0 до 180 для перемещения серводвигателя. Теперь, когда мы перемещаем датчик в направлении вверх, выходной сигнал от датчика будет равен 180. Когда мы перемещаем датчик в направлении вниз, тогда выход датчика будет 0.
Принципиальная электрическая схема
Прежде всего, подключите датчик MPU 6050 к Ардуино. Соединения MPU6050 и Arduino заключаются в следующем:
- Подключите VCC к MPU6050 к выходу 5V на Arduino.
- Подключите GND на MPU6050 к GND на Arduino.
- Подключите SCL к MPU6050 к A5 на Arduino.
- Подключите SDA к MPU6050 к A4 на Arduino.
Штыри A4 и A5 на Ардуино предназначены для связи SPI. Вот почему мы подключили SCL и SDA на MPU6050 к A5 и A4 на Arduino. После подключения к MPU6050 и Arduino подключите сервомотор к Ардуино. Соединения для серводвигателя и Arduino следующие:
- Подсоедините желтый провод серводвигателя к контакту 2 на Arduino.
- Подключите красный провод серводвигателя к контакту 5V на Arduino.
- Подключите черный провод серводвигателя к GND на 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); }
Объяснение кода
Прежде всего, мы включили библиотеку для датчика MPU6050 и серводвигателя. Библиотека Wire предназначена для связи SPI между датчиком Arduino и MPU6050.
#include <Wire.h> #include <MPU6050.h> #include <Servo.h>
Затем мы создали переменную с именем sg90 и типом Servo. Эта переменная поможет нам использовать функции серво библиотеки. Затем мы инициализировали вывод 2 для серводвигателя.
Servo sg90; int servo_pin = 2;
Затем мы создали переменную с именем и типом датчика: MPU6050. Эта переменная поможет нам использовать функции библиотеки. Затем мы инициализировали некоторые переменные, которые мы будем использовать для измерения выхода датчика MPU6050.
MPU6050 sensor ; int16_t ax, ay, az ; int16_t gx, gy, gz ;
В функции настройки мы подключили сервопривод к пину 2 на Ардуино. Это означает, что Arduino подаст входной сигнал серводвигателю через этот штифт. Затем мы начали проводную связь, и после этого мы начали серийное сообщение со скоростью 9600 бод.
sg90.attach ( servo_pin ); Wire.begin ( ); Serial.begin (9600);
Затем мы проверили, работает ли датчик MPU6050, или нет. Если он работает нормально, на экране будет напечатано «Принимать значения от датчика» ("Taking Values from the sensor"). Если он не подключен, на экране будет напечатано сообщение «Ошибка соединения» (“Connection failed").
Serial.println (sensor.testConnection ( ) ? "Successfully Connected" : "Connection failed"); delay (1000); Serial.println ( "Taking Values from the sensor" ); delay (1000);
В функции цикла мы взяли данные датчика MPU6050 и сделали меппинг значения с помощью которого мы сможем контролировать серво. Затем мы передаем это значение сервомотору, чтобы переместить его.
sensor.getMotion6 (&ax, &ay, &az, &gx, &gy, &gz); ax = map (ax, -17000, 17000, 0, 180) ; Serial.println (ax); sg90.write (ax); delay (200);
На этом всё. Желаем вам успешных проектов.
3 марта 2022 в 17:46
Скетч не работает. Серво дёргается сам по себе