Оглавление:

Управление сервоприводом с помощью MPU6050 между Arduino и ESP8266 с помощью HC-12: 6 шагов
Управление сервоприводом с помощью MPU6050 между Arduino и ESP8266 с помощью HC-12: 6 шагов

Видео: Управление сервоприводом с помощью MPU6050 между Arduino и ESP8266 с помощью HC-12: 6 шагов

Видео: Управление сервоприводом с помощью MPU6050 между Arduino и ESP8266 с помощью HC-12: 6 шагов
Видео: MPU-6050 - Гироскоп + акселeрометр 2024, Ноябрь
Anonim
Управление сервоприводом с помощью MPU6050 между Arduino и ESP8266 с помощью HC-12
Управление сервоприводом с помощью MPU6050 между Arduino и ESP8266 с помощью HC-12

В этом проекте мы контролируем положение серводвигателя с помощью mpu6050 и HC-12 для связи между Arduino UNO и ESP8266 NodeMCU.

Шаг 1: ОБ ЭТОМ ПРОЕКТЕ

Это еще один проект IoT на базе RF-модуля HC-12. Здесь данные imu (mpu6050) от Arduino используются для управления серводвигателем (подключенным к Nodemcu). Здесь визуализация данных также выполняется на стороне Arduino, где данные шага mpu6050 (вращение вокруг оси x) визуализируются с помощью эскиза обработки (обсуждается позже). По сути, этот проект - лишь небольшая разминка для запоминания различных аспектов управления Imu и Servo с помощью Arduino и ESP8266 nodemcu.

ЗАДАЧА

Цель этого довольно ясна: мы контролируем положение серводвигателя, используя значение шага IMU. И все вместе этот шаг и синхронизированное положение мотора визуализируются с помощью Обработки.

Шаг 2: Требуется оборудование

Модуль Wi-Fi NodeMCU ESP8266 12E

Макетная плата без пайки

Перемычка

MPU6050 Accelo + гироскоп

ВЧ-модули HC-12 (пара)

Серводвигатель SG90

Шаг 3: Схема и подключения

Схема и соединения
Схема и соединения
Схема и соединения
Схема и соединения

Подключения прямолинейны. Вы можете запитать сервопривод от 3.3V вашего Nodemcu. Вы также можете использовать Vin для питания сервопривода, если ваш nodemcu имеет такое большое напряжение на этом контакте. Но у большинства плат Lolin нет 5V на Vin (зависит от производителя).

Эти принципиальные схемы составлены с помощью EasyADA.

Шаг 4: РАБОТА

РАБОТАЮЩИЙ
РАБОТАЮЩИЙ

Как только эскиз arduino запущен, он отправит угол наклона (который находится в диапазоне от -45 до 45) на приемник hc12 Nodemcu, который будет отображен с положением сервопривода от 0 до 180 градусов. Здесь мы использовали угол наклона от -45 до +45 градусов, чтобы мы могли легко сопоставить его с положением сервопривода.

Теперь вы думаете, почему мы можем просто использовать метод карты следующим образом:

int pos = карта (val, -45, 45, 0, 180);

Поскольку отрицательный угол, посланный передатчиком hc12, принимается как:

1-я половина: (T) от 0 до 45 => от 0 до 45 (R)

2-я половина: (T) от -45 до -1 => 255 до 210 (R)

Таким образом, вы должны сопоставить его от 0 до 180 как

если (val> = 0 && val <= 45) pos = (val * 2) +90; иначе pos = (val-210) * 2;

Я избегаю метода карты из-за какой-то несущественной ошибки. Вы можете попробовать это и прокомментировать, что работает с вами

если (val> = 0 && val <= 45) pos = map (val, 0, 45, 90, 180); иначе pos = map (val, 255, 210, 0, 90); // 4-й аргумент может быть 2 (вы можете проверить)

Расчет угла тангажа MPU6050

Я использую библиотеку MPU6050_tockn, которая основана на выдаче необработанных данных из IMU.

int pitchAngle = mpu6050.getAngleX ()

Это даст нам угол поворота вокруг оси x. Как вы видите на рисунке, мой imu вертикально расположен на макете, поэтому не путайте его с питчем и креном. На самом деле вы всегда должны видеть, что ось напечатана на коммутационной плате.

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

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

#включают

const int MPU6050_addr = 0x68; int16_t AcX, AcY, AcZ, Temp, GyroX, GyroY, GyroZ; пустая настройка () {Wire.begin (); Wire.beginTransmission (MPU6050_addr); Wire.write (0x6B); Wire.write (0); Wire.endTransmission (истина); Serial.begin (9600); } void loop () {Wire.beginTransmission (MPU6050_addr); Wire.write (0x3B); Wire.endTransmission (ложь); Wire.requestFrom (MPU6050_addr, 14, истина); AcX = Wire.read () << 8 | Wire.read (); AcY = Wire.read () << 8 | Wire.read (); AcZ = Wire.read () << 8 | Wire.read (); Temp = Wire.read () << 8 | Wire.read (); GyroX = Wire.read () << 8 | Wire.read (); GyroY = Wire.read () << 8 | Wire.read (); GyroZ = Wire.read () << 8 | Wire.read ();

int xAng = карта (AcX, minVal, maxVal, -90, 90); int yAng = карта (AcY, minVal, maxVal, -90, 90); int zAng = карта (AcZ, minVal, maxVal, -90, 90); x = RAD_TO_DEG * (atan2 (-yAng, -zAng) + PI); y = RAD_TO_DEG * (atan2 (-xAng, -zAng) + PI); z = RAD_TO_DEG * (atan2 (-yAng, -xAng) + PI); Serial.print ("AngleX ="); // Шаг Serial.println (x); Serial.print ("AngleY ="); // Катим Serial.println (y); Serial.print ("AngleZ ="); // Рыскание Serial.println (z); }

Но не обязательно, чтобы вы писали столько кода, чтобы получить угол. Вы должны знать факты за кулисами, но использование библиотеки других людей очень эффективно во многих проектах. Вы можете прочитать об этом imu и других подходах, чтобы получить больше отфильтрованных данных, по следующей ссылке: Explore-mpu6050.

В моем коде arduino на передающей стороне всего 30 строк с помощью библиотеки MPU6050_tockn, поэтому использование библиотеки хорошо, если вам не нужны некоторые основные изменения функциональности IMU. Библиотека I2Cdev Джеффа Роуберга очень полезна, если вам нужны отфильтрованные данные с использованием DMP (цифрового процессора движения) IMU.

Интеграция с процессингом

Здесь обработка используется для визуализации данных вращения вокруг оси x IMU, вычисленных по необработанным данным, поступающим из MPU6050. Мы получаем входящие необработанные данные в SerialEvent следующим образом:

void serialEvent (Serial myPort) {

inString = myPort.readString (); try {// Разбираем данные // println (inString); Строка dataStrings = split (inString, ':'); if (dataStrings.length == 2) {if (dataStrings [0].equals ("RAW")) {for (int i = 0; i <dataStrings.length - 1; i ++) {raw = float (dataStrings [я + 1]); }} еще {println (inString); }}} catch (Exception e) {println ("Перехваченное исключение"); }}

Здесь вы можете увидеть визуализацию на изображении, прикрепленном на этом этапе. Данные о положении, полученные на конце nodemcu, также видны на последовательном мониторе, как показано на изображении.

Шаг 5: КОД

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

my_code

Репо включает в себя 2 скетча arduino для передатчика (arduino + IMU) и приемника (Nodemcu + Servo).

И один эскиз обработки. Пометьте репо, если это помогает вашему проекту.

В этом наставлении, R- приемник и T- передатчик

Шаг 6: ВИДЕО ДЕМОНСТРАЦИЯ

Видео прикреплю завтра. Следуйте за мной, чтобы получать уведомления.

Спасибо вам всем!

Рекомендуемые: