Mundarija:

Arduino va ESP8266 o'rtasidagi MPU6050 yordamida HC-12: 6 bosqichli servolarni boshqarish
Arduino va ESP8266 o'rtasidagi MPU6050 yordamida HC-12: 6 bosqichli servolarni boshqarish

Video: Arduino va ESP8266 o'rtasidagi MPU6050 yordamida HC-12: 6 bosqichli servolarni boshqarish

Video: Arduino va ESP8266 o'rtasidagi MPU6050 yordamida HC-12: 6 bosqichli servolarni boshqarish
Video: Сравнение протоколов TCP и UDP 2024, Noyabr
Anonim
Arduino va ESP8266 o'rtasida HC-12 bilan MPU6050 yordamida Servo nazorat qilish
Arduino va ESP8266 o'rtasida HC-12 bilan MPU6050 yordamida Servo nazorat qilish

Ushbu loyihada biz Arduino UNO va ESP8266 NodeMCU o'rtasidagi aloqa uchun mpu6050 va HC-12 yordamida servo dvigatel holatini boshqaramiz.

1 -qadam: BU LOYIHA HAQIDA

Bu HC-12 RF-moduliga asoslangan boshqa IoT loyihasi. Bu erda arduino -dan imu (mpu6050) ma'lumotlari servo dvigatelni boshqarish uchun ishlatiladi (Nodemcu bilan bog'langan). Bu erda ma'lumotlarni vizualizatsiya qilish arduino tomonida ham amalga oshiriladi, u erda mpu6050 pitch ma'lumotlari (x o'qi atrofida aylanishi) ishlov berish eskizi bilan tasvirlanadi (keyinroq muhokama qilinadi). Asosan, bu loyiha Arduino va ESP8266 nodemcu bilan Imu va Servo boshqaruvining turli jihatlarini eslab qolish uchun bir oz isinishdir.

MAKSAD

Maqsad aniq, biz O'XH pitch qiymatidan foydalanib, Servo dvigatelining holatini boshqaramiz. Va bu qadam va sinxronlangan vosita pozitsiyasi "Processing" yordamida tasvirlanadi.

2 -qadam: Uskuna kerak

NodeMCU ESP8266 12E Wifi moduli

Lehimsiz non paneli

Jumper sim

MPU6050 accelo+gyro

HC-12 RF modullari (juftlik)

SG90 Servo dvigateli

3 -qadam: O'chirish va ulanishlar

O'chirish va ulanishlar
O'chirish va ulanishlar
O'chirish va ulanishlar
O'chirish va ulanishlar

Ulanishlar to'g'ridan -to'g'ri. Siz Nodemcu -ning 3,3V kuchlanishli servosini quvvatlantirishingiz mumkin. Agar siz nodemcu pimida shunchalik kuchlanishga ega bo'lsa, siz Vinni servo quvvat bilan ta'minlash uchun ham ishlatishingiz mumkin. Ammo ko'pchilik Lolin platalarida Vinda 5V yo'q (ishlab chiqaruvchiga bog'liq).

Ushbu sxemalar EasyADA yordamida tuzilgan.

4 -qadam: Ishlash

ISHLASH
ISHLASH

Arduino eskizi boshlanishi bilan u burchak burchagini (-45 dan 45 gacha) Nodemcu ning hc12 qabul qiluvchisiga yuboradi, u 0 dan 180 gradusli Servo pozitsiyasiga ega. Bu erda biz burchak burchagini -45 dan +45 darajagacha ishlatdik, shunda biz uni Servo pozitsiyasiga osongina joylashtiramiz.

Endi siz nima uchun xarita usulini quyidagicha ishlatishimiz mumkin deb o'ylayapsiz:-

int pos = xarita (val, -45, 45, 0, 180);

Chunki hc12 uzatuvchi tomonidan yuborilgan manfiy burchak quyidagicha qabul qilinadi:

Birinchi bo'lim: (T) 0 dan 45 => 0 dan 45 gacha (R)

Ikkinchi bo'lim: (T) -45 dan -1 => 255 dan 210 (R)

Shunday qilib, siz uni 0 dan 180 gacha xaritaga kiritishingiz kerak

agar (val> = 0 && val <= 45) pos = (val*2) +90; boshqa pos = (val-210)*2;

Men ahamiyatsiz xato tufayli xarita usulidan qochaman. Siz buni sinab ko'rishingiz va u siz bilan ishlashini izohlashingiz mumkin

if (val> = 0 && val <= 45) pos = map (val, 0, 45, 90, 180); else pos = xarita (val, 255, 210, 0, 90); // 4 -argument 2 bo'lishi mumkin (tekshirishingiz mumkin)

MPU6050 qadam burchagi hisobi

Men IMUdan xom ma'lumotlarni berishga asoslangan MPU6050_tockn kutubxonasidan foydalanayapman.

int pitchAngle = mpu6050.getAngleX ()

Bu bizga x o'qi atrofida aylanish burchagini beradi. Rasmda ko'rib turganingizdek, imu non taxtasiga vertikal ravishda joylashtirilgan, shuning uchun qadam va rulon bilan adashmang. Aslida siz har doim o'qning kesilgan taxtasida bosilganini ko'rishingiz kerak.

Ushbu kutubxona orqali siz ma'lum operatsiyalarni bajarish uchun maxsus registrlarni o'qishning ichki elektronikasi haqida qayg'urmasligingiz kerak. Siz faqat ishni aniqlaysiz va siz bajarasiz!

Btw, agar siz burchakni o'zingiz hisoblamoqchi bo'lsangiz. Siz buni quyidagicha osongina qilishingiz mumkin:

#qo'shing

const int MPU6050_addr = 0x68; int16_t AcX, AcY, AcZ, Temp, GyroX, GyroY, GyroZ; void setup () {Wire.begin (); Wire.beginTransmission (MPU6050_addr); Wire.write (0x6B); Wire.write (0); Wire.endTransmission (haqiqiy); Serial.begin (9600); } void loop () {Wire.beginTransmission (MPU6050_addr); Wire.write (0x3B); Wire.endTransmission (noto'g'ri); Wire.requestFrom (MPU6050_addr, 14, to'g'ri); 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 = xarita (AcX, minVal, maxVal, -90, 90); int yAng = xarita (AcY, minVal, maxVal, -90, 90); int zAng = xarita (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 ="); // Pitch Serial.println (x); Serial.print ("AngleY ="); // Roll Serial.println (y); Serial.print ("AngleZ ="); // Yaw Serial.println (z); }

Biroq, burchakni olish uchun siz shuncha kodni yozishingiz shart emas. Siz sahna ortidagi faktlarni bilishingiz kerak, lekin boshqa odamlar kutubxonasidan foydalanish ko'plab loyihalarda juda samarali. Quyidagi havoladan ko'proq filtrlangan ma'lumotlarni olish uchun ushbu imu va boshqa tasdiqlar haqida o'qishingiz mumkin: Explore-mpu6050.

Mening arduino kodim uzatish uchida MPU6050_tockn kutubxonasi yordamida atigi 30 ta satrdan iborat, shuning uchun IMU funksiyasiga ba'zi asosiy o'zgarishlar kerak bo'lmasa kutubxonadan foydalanish yaxshi. Jeff Rowbergning I2Cdev nomli kutubxonasi, agar siz O'Ining DMP (Raqamli harakat protsessori) yordamida filtrlangan ma'lumotlarni olishni xohlasangiz, juda foydali bo'ladi.

Qayta ishlash bilan integratsiya

Bu erda ishlov berish MPU6050-dan olingan xom ma'lumotlarga ko'ra hisoblangan IMU x o'qi haqidagi aylanish ma'lumotlarini vizualizatsiya qilish uchun ishlatiladi. Biz kiruvchi xom ma'lumotlarni SerialEvent -ga quyidagi tarzda olamiz:

bekor serialEvent (Serial myPort) {

inString = myPort.readString (); harakat qilib ko'ring // // ma'lumotlarni tahlil qilish // println (inString); String dataStrings = split (inString, ':'); if (dataStrings.length == 2) {if (dataStrings [0]. teng ("RAW")) {uchun (int i = 0; i <dataStrings.length - 1; i ++) {raw = float (dataStrings [i+1]); }} boshqa {println (inString); }}} catch (Exception e) {println ("Exception Exception"); }}

Bu erda siz ushbu bosqichda biriktirilgan rasmda vizualizatsiyani ko'rishingiz mumkin. Nodemcu oxirida olingan pozitsiya ma'lumotlari rasmda ko'rsatilgandek ketma -ket monitorda ham ko'rinadi.

5 -qadam: KOD

Men github omborini biriktirdim. Siz uni loyihalaringizda ishlatish uchun klonlashingiz va ajratishingiz mumkin.

mening kodim

Repoda transmitter (arduino+IMU) va qabul qiluvchi (Nodemcu+Servo) uchun 2 ta arduino eskiz mavjud.

Va bitta ishlov berish eskizi. Agar bu sizning loyihangizga yordam bersa, repo -ni belgilang.

Bu ko'rsatmali, R- qabul qiluvchi va T- uzatuvchi

6 -qadam: VIDEO KO'RSATISH

Videoni ertaga qo'shaman. Xabar olish uchun meni kuzatib boring.

Hammaga rahmat!

Tavsiya: