Isi kandungan:

Mengawal Servo Menggunakan MPU6050 Antara Arduino dan ESP8266 Dengan Langkah HC-12: 6
Mengawal Servo Menggunakan MPU6050 Antara Arduino dan ESP8266 Dengan Langkah HC-12: 6

Video: Mengawal Servo Menggunakan MPU6050 Antara Arduino dan ESP8266 Dengan Langkah HC-12: 6

Video: Mengawal Servo Menggunakan MPU6050 Antara Arduino dan ESP8266 Dengan Langkah HC-12: 6
Video: Tutorial Modul Radio Menggunakan Modul HC 12 2024, November
Anonim
Mengawal Servo Menggunakan MPU6050 Antara Arduino dan ESP8266 Dengan HC-12
Mengawal Servo Menggunakan MPU6050 Antara Arduino dan ESP8266 Dengan HC-12

Dalam projek ini, kami mengawal kedudukan motor servo menggunakan mpu6050 dan HC-12 untuk komunikasi antara Arduino UNO dan ESP8266 NodeMCU.

Langkah 1: MENGENAI PROJEK INI

Ia adalah satu lagi projek IoT berdasarkan modul RF HC-12. Di sini, data imu (mpu6050) dari arduino digunakan untuk mengawal motor servo (dihubungkan dengan Nodemcu). Di sini, visualisasi data juga dilakukan di sisi arduino di mana data nada mpu6050 (putaran mengenai paksi-x) digambarkan dengan lakaran pemprosesan (dibincangkan kemudian). Pada dasarnya projek ini hanya sedikit pemanasan kerana mengingati pelbagai aspek kawalan Imu & Servo dengan Arduino dan ESP8266 nodemcu.

OBJEKTIF

Objektif ini cukup jelas, Kami mengawal kedudukan motor Servo menggunakan nilai nada IMU. Dan keseluruhan kedudukan motor dan kedudukan motor yang disegerakkan ini dilihat dengan Pemprosesan.

Langkah 2: Perkakasan Diperlukan

Modul Wifi NodeMCU ESP8266 12E

Papan roti tanpa solder

Kawat pelompat

MPU6050 accelo + gyro

Modul RF HC-12 (pasangan)

Motor servo SG90

Langkah 3: Litar & Sambungan

Litar & Sambungan
Litar & Sambungan
Litar & Sambungan
Litar & Sambungan

Sambungan lurus ke hadapan. Anda boleh menghidupkan servo dengan 3.3V Nodemcu anda. Anda juga boleh menggunakan Vin untuk menghidupkan servo jika nodemcu anda mempunyai voltan yang banyak pada pin itu. Tetapi kebanyakan papan Lolin tidak mempunyai 5V di Vin (bergantung pada pengeluarnya).

Gambarajah litar ini dibuat menggunakan EasyADA.

Langkah 4: KERJA

KERJA
KERJA

Sebaik sahaja sketsa arduino dimulakan, ia akan menghantar sudut nada (yang berkisar antara -45 hingga 45) ke penerima hc12 Nodemcu yang dipetakan dengan kedudukan Servo 0 hingga 180 darjah. Di sini kami menggunakan sudut nada dari -45 hingga +45 darjah sehingga kami dapat memetakannya dengan mudah ke posisi Servo.

Sekarang, anda berfikir mengapa kita hanya boleh menggunakan kaedah peta seperti berikut: -

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

Kerana sudut negatif yang dihantar oleh pemancar hc12 diterima sebagai:

Babak pertama: (T) 0 hingga 45 => 0 hingga 45 (R)

Babak ke-2: (T) -45 hingga -1 => 255 hingga 210 (R)

Oleh itu, anda perlu memetakannya ke 0 hingga 180 sebagai

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

Saya mengelakkan kaedah peta kerana terdapat kesilapan yang tidak berkaitan. Anda boleh mencubanya dan memberi komen yang sesuai dengan anda

jika (val> = 0 && val <= 45) pos = peta (val, 0, 45, 90, 180); pos lain = peta (val, 255, 210, 0, 90); // Argumen ke-4 boleh menjadi 2 (anda boleh menyemak)

Pengiraan Sudut Pitch MPU6050

Saya menggunakan perpustakaan MPU6050_tockn yang didasarkan pada pemberian data mentah dari IMU.

int pitchAngle = mpu6050.getAngleX ()

Ini akan memberi kita sudut putaran mengenai paksi-x. Seperti yang anda lihat dalam gambar, imu saya diletakkan secara menegak di papan roti, jadi jangan mengelirukan dengan nada dan gulungan. Sebenarnya anda mesti selalu melihat sumbu dicetak pada papan pemecah.

Melalui perpustakaan ini, anda tidak perlu bersusah payah mengenai elektronik dalaman membaca daftar khusus untuk operasi tertentu. anda hanya menentukan kerja dan anda selesai!

Btw jika anda mahu mengira sudut sendiri. Anda boleh melakukannya dengan mudah seperti berikut:

#sertakan

const int MPU6050_addr = 0x68; int16_t AcX, AcY, AcZ, Temp, GyroX, GyroY, GyroZ; batal persediaan () {Wire.begin (); Wire.beginTransmission (MPU6050_addr); Wire.write (0x6B); Wire.write (0); Wire.endTransmission (benar); Serial.begin (9600); } gelung kosong () {Wire.beginTransmission (MPU6050_addr); Wire.write (0x3B); Wire.endTransmission (palsu); Wire.requestFrom (MPU6050_addr, 14, benar); 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 = peta (AcX, minVal, maxVal, -90, 90); int yAng = peta (AcY, minVal, maxVal, -90, 90); int zAng = peta (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); }

Tetapi, anda tidak perlu menulis kod sebanyak ini untuk mendapatkan sudut. Anda harus mengetahui fakta di belakang tabir tetapi menggunakan perpustakaan orang lain sangat berkesan dalam banyak projek. Anda boleh membaca mengenai imu ini dan pendekatan lain untuk mendapatkan lebih banyak data yang difilter dari pautan berikut: Explore-mpu6050.

Kod arduino saya di hujung penghantaran hanya mempunyai 30 baris dengan bantuan perpustakaan MPU6050_tockn jadi menggunakan perpustakaan adalah baik melainkan anda tidak memerlukan beberapa perubahan inti pada fungsi IMU. Perpustakaan bernama I2Cdev oleh Jeff Rowberg sangat membantu jika anda menginginkan beberapa data yang disaring menggunakan DMP (pemproses gerakan digital) IMU.

Integrasi dengan Pemprosesan

Di sini Pemprosesan digunakan untuk memvisualisasikan data putaran mengenai paksi-x IMU seperti yang dihitung dengan data mentah yang berasal dari MPU6050. Kami menerima data mentah yang masuk dalam SerialEvent dengan cara berikut:

batal serialEvent (Serial myPort) {

inString = myPort.readString (); cuba {// Uraikan data // println (inString); Rentetan dataStrings = split (inString, ':'); if (dataStrings.length == 2) {if (dataStrings [0].equals ("RAW")) {untuk (int i = 0; i <dataStrings.length - 1; i ++) {raw = float (dataStrings [i + 1]); }} lain {println (inString); }}} tangkapan (Pengecualian e) {println ("Tertangkap Pengecualian"); }}

Di sini anda dapat melihat visualisasi pada gambar yang dilampirkan dalam langkah ini. Data kedudukan yang diterima di hujung nodemcu juga dilihat pada monitor bersiri seperti yang ditunjukkan dalam gambar.

Langkah 5: KOD

Saya telah melampirkan repositori github. Anda boleh mengklon & garpu untuk digunakan dalam projek anda.

kod_ku

Repo ini merangkumi 2 sketsa arduino untuk pemancar (arduino + IMU) & penerima (Nodemcu + Servo).

Dan satu lakaran pemprosesan. Bintangi repo jika ini membantu dalam projek anda.

Dalam arahan ini, R- Penerima & T- Pemancar

Langkah 6: DEMONSTRASI VIDEO

Saya akan melampirkan videonya esok. Ikut saya untuk diberitahu.

Terima kasih semua!

Disyorkan: