Isi kandungan:

Alat kawalan jauh yang boleh digodam untuk Microcar ZenWheels: 7 Langkah
Alat kawalan jauh yang boleh digodam untuk Microcar ZenWheels: 7 Langkah

Video: Alat kawalan jauh yang boleh digodam untuk Microcar ZenWheels: 7 Langkah

Video: Alat kawalan jauh yang boleh digodam untuk Microcar ZenWheels: 7 Langkah
Video: RC Jet Pemula Yang Tahan Banting dan Tahan Air 2024, Jun
Anonim
Image
Image
perhimpunan
perhimpunan

Dalam tutorial ini kita akan membina alat kawalan jauh khusus untuk mikrokar ZenWheels. Microcar ZenWheels adalah kereta mainan 5 cm yang dapat dikawal melalui aplikasi Android atau Iphone. Saya akan menunjukkan kepada anda bagaimana membalikkan aplikasi Android untuk mengetahui tentang protokol komunikasi dan bagaimana anda boleh membina alat kawalan jauh menggunakan arduino dan giroskop.

Langkah 1: Komponen & Alat

Bahagian:

1. Microcar ZenWheels

2. Arduino pro mini 328p

3. Papan roti

4. Giroskop MPU6050

5. sumber kuasa <= 5 v (beberapa bateri yang boleh kita pasangkan ke papan roti)

6. Kabel pelompat berbentuk U (pilihan). Saya telah menggunakan kabel pelompat ini kerana kelihatan lebih baik di papan roti. Kabel pelompat biasa boleh digunakan sebagai gantinya

7. Modul bluetooth HC-05 (dengan butang untuk memasuki mod AT)

Alat:

1. USB ke siri FTDI adaptor FT232RL untuk memprogram Arduino pro mini

2. Arduino IDE

3. Telefon Android

4. Android Studio [Pilihan]

Langkah 2: Kejuruteraan Balik Aplikasi Android ZenWheels [pilihan]

Sebilangan pengetahuan mengenai Java dan Android diperlukan untuk memahami bahagian ini.

Matlamat projek adalah untuk mengawal mikrokar menggunakan giroskop. Untuk ini, kita perlu mengetahui lebih lanjut mengenai komunikasi bluetooth antara mainan ini dan aplikasi android.

Dalam langkah ini saya akan menerangkan cara membalikkan protokol komunikasi antara mikrokar dan aplikasi android. Sekiranya anda hanya mahu membina alat kawalan jauh, langkah ini tidak diperlukan. Salah satu cara untuk menemui protokol adalah dengan melihat kod sumber. Hmm tetapi ini tidak langsung, aplikasi android disusun dan seseorang boleh memasang apk melalui google play.

Oleh itu, saya telah membuat panduan asas untuk melakukan ini:

1. Muat turun APK. Kit Pakej Android (APK ringkas) adalah format fail paket yang digunakan oleh sistem operasi Android untuk pengedaran dan pemasangan aplikasi mudah alih

Cari dahulu aplikasi di kedai permainan google, dalam carian kes kami "zenwheels" dan anda akan mendapat pautan aplikasi

Kemudian cari di google untuk "pengunduh apk dalam talian" dan gunakan untuk memuat turun apk. Biasanya mereka akan meminta pautan aplikasi (yang telah kita peroleh sebelumnya), maka kita akan menekan butang muat turun dan menyimpannya di komputer kita.

2. Susun APK. Pengurai dalam situasi kita adalah alat yang mengambil APK dan menghasilkan kod sumber Java.

Penyelesaian paling mudah adalah menggunakan penyahkomputer dalam talian untuk menjalankan tugas. Saya telah mencari google untuk "decompliler dalam talian" dan saya telah memilih https://www.javadecompilers.com/. Anda hanya perlu memuat naik APK yang anda perolehi sebelumnya dan

tekan penguraian. Kemudian anda hanya memuat turun sumbernya.

3. Cuba ubah jurutera dengan melihat kodnya

Untuk membuka projek, anda memerlukan penyunting teks atau lebih baik IDE (persekitaran pembangunan bersepadu). IDE lalai untuk Projek Android adalah Android Studio (https://developer.android.com/studio). Setelah anda memasang Android Studio, buka folder projek.

Oleh kerana kereta kami dikendalikan oleh bluetooth, saya memulakan pencarian saya dalam kod yang disahkompilasi dengan kata kunci "bluetooth", dari kejadian yang saya dapati "BluetoothSerialService" mengendalikan komunikasi. Sekiranya kelas ini mengendalikan komunikasi maka ia mesti mempunyai kaedah perintah hantar. Ternyata ada satu kaedah menulis yang mengirimkan data melalui saluran bluetooth:

pembatalan kosong awam (bait keluar)

Ini adalah permulaan yang baik, saya telah mencari.write (kaedah yang digunakan dan terdapat kelas "ZenWheelsMicrocar" yang meluaskan "BluetoothSerialService" kami. Kelas ini mengandungi sebahagian besar logik komunikasi kami melalui Bluetooth. Bahagian lain dari logiknya ada pada pengawal: BaseController dan StandardController.

Di BaseController kita mempunyai inisialisasi layanan, dan juga definisi saluran kemudi dan pendikit, saluran sebenarnya adalah awalan perintah untuk menentukan bahawa beberapa jenis perintah akan mengikuti:

dilindungi ZenWheelsMicrocar microcar = ZenWheelsMicrocar baru (ini, ini.btHandler);

keluaran ChannelOutput output = {TrimChannelOutput baru (ZenWheelsMicrocar. STEERING_CHANNEL), TrimChannelOutput baru (ZenWheelsMicrocar. THROTTLE_CHANNEL)};

Di StandardController, stereng dikendalikan dalam:

pengendalian kekosongan awamSteering (TouchEvent touchEvent) {

… This.microcar.setChannel (steeringOutput.channel, steeringOutput.resolveValue ()); }

Menganalisis kaedah, steeringOutput.channel mempunyai nilai 129 (saluran yang digunakan untuk stereng) dan steeringOutput.resolveValue () mungkin mempunyai nilai antara -90 dan 90. Nilai saluran (129) dihantar secara langsung, dan nilai kemudi diubah dengan menggunakan operasi bitwise:

nilai int akhir peribadi_convert_out (nilai int) {

boolean negatif = salah; jika (nilai <0) {negatif = f6D; } int nilai2 = nilai & 63; jika (negatif) {nilai pulangan2 | 64; } nilai pulangan2; }

Terdapat kaedah yang serupa dalam StandardController yang dipanggil

pemegang kekosongan awam Throttle (TouchEvent touchEvent)

Langkah 3: Komponen

Bahagian:

1. Arduino pro mini 328p 2 $

2. Papan roti

3. Giroskop MPU6050 1.2 $

4. Modul 6 pin HC-05 master-slave 3 $

5. Pek bateri 4 x AA dengan 4 bateri

6. Kabel pelompat berbentuk U (pilihan). Saya telah menggunakan kabel pelompat ini kerana ia kelihatan lebih baik di papan roti, dan plumbum lebih kelihatan dengan cara ini. Sekiranya anda tidak mempunyai kabel ini, anda boleh menggantinya dengan wayar dupont.

Harga di atas diambil dari eBay.

Alat:

1. USB ke siri FTDI adapter FT232RL untuk memprogram arduino pro mini

2. Arduino IDE

3. Android Studio (pilihan jika anda mahu membuat pembalikan secara automatik)

Langkah 4: Perhimpunan

perhimpunan
perhimpunan

Pemasangannya sangat mudah kerana kami melakukannya di papan roti:)

- pertama kita meletakkan komponen kita di papan roti: mikrokontroler, modul bluetooth dan giroskop

- sambungkan pin RX dan TX bluetooth HC-05 ke pin arduino 10 dan 11. Giroskop SDA dan SCL harus disambungkan ke pin arduino A4 dan A5

- sambungkan pin kuasa ke bluetooth, gyro dan arduino. pin harus disambungkan ke + dan - di sisi papan roti

- terakhir sambungkan bekalan kuasa (antara 3.3V hingga 5V) ke papan roti, saya telah menggunakan bateri LiPo satu sel kecil tetapi apa-apa yang akan dilakukan selagi berada dalam julat kuasa

Sila periksa gambar di atas untuk maklumat lebih lanjut

Langkah 5: Pasangkan Bluetooth HC-05 ke Microcar

Pasangkan Bluetooth HC-05 ke Microcar
Pasangkan Bluetooth HC-05 ke Microcar
Pasangkan Bluetooth HC-05 ke Microcar
Pasangkan Bluetooth HC-05 ke Microcar
Pasangkan Bluetooth HC-05 ke Microcar
Pasangkan Bluetooth HC-05 ke Microcar

Untuk ini, anda memerlukan telefon Android, modul bluetooth HC-05 dan penyesuai FTDI bersiri dengan wayar. Kami juga akan menggunakan Arduino IDE untuk berkomunikasi dengan modul bluetooth.

Mula-mula kita perlu mengetahui alamat bluetooth mikrokar:

- aktifkan bluetooth pada telefon anda

- hidupkan kereta dan pergi ke bahagian bluetooth tetapan anda di Android

- cari peranti baru dan beberapa peranti yang disebut "Microcar" akan muncul

- pasangkan dengan peranti ini

- kemudian untuk mengekstrak MAC bluetooth, saya telah menggunakan aplikasi ini dari Google Play Serial Bluetooth Terminal

Setelah memasang aplikasi ini, pergi ke menu -> peranti dan di sana anda akan mempunyai senarai dengan semua alat berpasangan bluetooth. Kami hanya berminat dengan kod di bawah lombong "Microcar" iaitu 00: 06: 66: 49: A0: 4B

Seterusnya sambungkan penyesuai FTDI ke modul bluetooth. Pin VCC dan GROUND pertama dan kemudian FTDI RX ke bluetooth TX dan FTDI TX ke bluetooth RX. Juga harus ada pin pada modul bluetooth yang harus disambungkan ke VCC. Melakukan ini modul bluetooth memasuki "mod yang dapat diprogramkan". Modul saya mempunyai butang yang menghubungkan VCC ke pin khas itu. Apabila anda memasukkan FTDI ke dalam USB, dengan pin yang disambungkan / butang ditekan untuk masuk dalam mod yang dapat diprogramkan khas ini. Bluetooth mengesahkan memasuki modus operasi ini dengan berkedip perlahan setiap 2 saat.

Di Arduino IDE pilih port bersiri, kemudian buka monitor bersiri (Kedua NL dan CR dengan 9600 baud rate). Taip AT dan modul harus disahkan dengan "OK".

Ketik "AT + ROLE = 1" untuk meletakkan modul dalam mod induk. Untuk berpasangan dengan modul bluetooh anda tulis: "AT + BIND = 0006, 66, 49A04B", Perhatikan bagaimana "00: 06: 66: 49: A0: 4B" kami diubah menjadi "0006, 66, 49A04B". Anda mesti melakukan transformasi yang sama untuk MAC bluetooh anda.

Sekarang hidupkan kereta Zenwheels kemudian cabut FTDI dan pasangkannya semula tanpa butang ditekan / pin khas disambungkan. Selepas beberapa saat ia akan menyambung ke kereta dan anda akan melihat kereta itu membuat sambungan tertentu berjaya.

Penyelesaian masalah:

- Saya dapati bahawa dari semua modul Bluetooth yang saya ada, hanya satu dengan butang yang berfungsi sebagai master!

- pastikan kereta dicas sepenuhnya

- pastikan kereta tidak disambungkan ke telefon

- jika Bluetooth masuk dalam mod AT (berkedip perlahan) tetapi ia tidak bertindak balas terhadap arahan memastikan anda mempunyai KEDUA NL & CR, dan juga bereksperimen dengan kadar BAUD lain

- periksa semula RX disambungkan ke TX dan sebaliknya

- cuba tutorial ini

Langkah 6: Kod & Penggunaan

Mula-mula anda perlu memuat turun dan memasang dua perpustakaan:

1. Perpustakaan MPU6050 untuk giroskop

2. Sumber perpustakaan I2CDev

Kemudian muat turun dan pasang pustaka saya dari sini atau salin dari bawah:

/ ** * Perpustakaan: * https://github.com/jrowberg/i2cdevlib * https://github.com/jrowberg/i2cdevlib * / #include "I2Cdev.h" #include "MPU6050_6Axis_MotionApps20.h" #include "Wire.h "#masuk" SoftwareSerial.h"

const int MAX_ANGLE = 45;

const byte commandStering = 129; const byte commandSpeed = 130;

permulaan bool = salah; // tetapkan benar sekiranya DMP init berjaya

uint8_t mpuIntStatus; // memegang byte status gangguan sebenar dari MPU uint8_t devStatus; // kembali status selepas setiap operasi peranti (0 = berjaya,! 0 = ralat) uint16_t packetSize; // ukuran paket DMP yang dijangkakan (lalai adalah 42 bait) uint16_t fifoCount; // kiraan semua bait yang ada di FIFO uint8_t fifoBuffer [64]; // Penyangga simpanan FIFO Quaternion q; // [w, x, y, z] bekas kuarter VectorVloat graviti; // [x, y, z] pelampung vektor graviti ypr [3]; // [yaw, pitch, roll] yaw / pitch / roll container and gravity vector volatile bool mpuInterrupt = false; // menunjukkan adakah pin gangguan MPU telah tinggi

LastPrintTime long unsigned, lastMoveTime = 0;

SoftwareSerial BTserial (10, 11);

MPU6050 mpu;

persediaan tidak sah ()

{Serial.begin (9600); BTserial.begin (38400); Serial.println ("Program dimulakan"); inisialisasi = initializeGyroscope (); }

gelung kosong () {

jika (! inisialisasi) {kembali; } mpuInterrupt = salah; mpuIntStatus = mpu.getIntStatus (); fifoCount = mpu.getFIFOCount (); jika (hasFifoOverflown (mpuIntStatus, fifoCount)) {mpu.resetFIFO (); kembali; } if (mpuIntStatus & 0x02) {while (fifoCount <packetSize) {fifoCount = mpu.getFIFOCount (); } mpu.getFIFOBytes (fifoBuffer, packetSize); fifoCount - = packetSize; mpu.dmpGetQuaternion (& q, fifoBuffer); mpu.dmpGetGravity (& graviti, & q); mpu.dmpGetYawPitchRoll (ypr, & q, & gravity); steer (ypr [0] * 180 / M_PI, ypr [1] * 180 / M_PI, ypr [2] * 180 / M_PI); }}

/*

* Menerima sudut dari 0 hingga 180 di mana 0 kiri maksimum dan 180 maksimum kanan * Menerima kelajuan dari -90 hingga 90 di mana -90 maksimum ke belakang dan 90 maksimum ke hadapan * / batal bergerakZwheelsCar (sudut byte, kelajuan int) {jika (milis () - lastMoveTime = 90) {resultAngle = peta (sudut, 91, 180, 1, 60); } lain jika (sudut 0) {resultSpeed = peta (kelajuan, 0, 90, 0, 60); } lain jika (kelajuan <0) {resultSpeed = peta (kelajuan, 0, -90, 120, 60); } Serial.print ("sebenarAngle ="); Serial.print (sudut); Serial.print (";"); Serial.print ("sebenarSpeed ="); Serial.print (resultSpeed); Serial.println (";"); BTserial.write (commandStering); BTserial.write (resultAngle); BTserial.write (commandSpeed); BTserial.write ((byte) resultSpeed); lastMoveTime = milis (); }

pengosong kosong (int x, int y, int z)

{x = had (x, -1 * MAX_ANGLE, MAX_ANGLE); y = kekangan (y, -1 * MAX_ANGLE, MAX_ANGLE); z = kekangan (z, -MAX_ANGLE, MAX_ANGLE); int angle = peta (y, -MAX_ANGLE, MAX_ANGLE, 0, 180); int speed = peta (z, -MAX_ANGLE, MAX_ANGLE, 90, -90); printDebug (x, y, z, sudut, kelajuan); moveZwheelsCar (sudut, kelajuan); }

void printDebug (int x, int y, int z, int angle, int speed)

{if (millis () - lastPrintTime <1000) {pulangan; } Serial.print ("z ="); Serial.print (x); Serial.print (";"); Serial.print ("y ="); Serial.print (y); Serial.print (";"); Serial.print ("z ="); Serial.print (z); Serial.print (";"); Serial.print ("angle ="); Serial.print (angle); Serial.print (";"); Serial.print ("speed ="); Serial.print (speed); Serial.println (";"); lastPrintTime = milis (); }

bool memulakanGiroskop ()

{Wire.begin (); mpu.initialize (); Serial.println (mpu.testConnection ()? F ("Sambungan MPU6050 berjaya"): F ("Sambungan MPU6050 gagal")); devStatus = mpu.dmpInitialize (); mpu.setXGyroOffset (220); mpu.setYGyroOffset (76); mpu.setZGyroOffset (-85); mpu.setZAccelOffset (1788); if (devStatus! = 0) {Serial.print (F ("Permulaan DMP gagal (kod")); Serial.println (devStatus); kembali palsu;} mpu.setDMPEnabled (benar); Serial.println (F ("Mengaktifkan pengesanan gangguan (Arduino gangguan luaran 0)… ")); attachInterrupt (0, dmpDataReady, RISING); mpuIntStatus = mpu.getIntStatus (); Serial.println (F (" DMP siap! Menunggu gangguan pertama … ")); packetSize = mpu.dmpGetFIFOPacketSize (); kembali benar;}

batal dmpDataReady ()

{mpuInterrupt = benar; }

boolean hasFifoOverflown (int mpuIntStatus, int fifoCount)

{return mpuIntStatus & 0x10 || fifoCount == 1024; }

Muat naik kod menggunakan penyesuai FTDI ke arduino kemudian sambungkan baterinya.

Menggunakan alat kawalan jauh:

Setelah arduino dihidupkan, hidupkan juga kereta. Modul HC-05 harus disambungkan ke kereta, apabila berlaku kereta akan mengeluarkan suara. Sekiranya tidak berjaya sila periksa langkah sebelumnya dan bahagian penyelesaian masalah.

Sekiranya anda memiringkan papan roti ke depan, kereta harus bergerak ke depan, ke kanan dan kereta harus bergerak ke kanan. Ia juga melakukan pergerakan yang lebih beransur-ansur seperti condong sedikit ke depan dan sedikit kiri dalam hal ini, kereta akan bergerak perlahan ke kiri.

Sekiranya kereta bergerak dengan cara yang berbeza ketika mencondongkan papan roti terlebih dahulu pegang papan roti ke arah yang berbeza.

Bagaimana ia berfungsi:

Sketsa mendapat koordinat giroskop setiap 100 ms, membuat pengiraan dan kemudian menghantar melalui perintah kereta melalui bluetooth. Pertama terdapat kaedah "steer" yang dipanggil dengan sudut x, y dan z mentah. Kaedah ini mengubah stereng antara 0 hingga 180 darjah dan pecutan antara -90 hingga 90. Kaedah ini memanggil

void moveZwheelsCar (sudut byte, int speed) yang menukar stereng dan pecutan ke spesifikasi ZenWheels dan kemudian menghantar perintah menggunakan bluetooth.

Sebab saya melakukan transformasi dalam dua langkah, adalah penggunaan semula. jika saya perlu menyesuaikan lakaran ini ke alat kawalan jauh beberapa peranti lain, saya akan bermula dari kaedah asas "steer" yang sudah memetakan kelajuan dan kemudi ke beberapa nilai yang berguna.

Langkah 7: Alternatif

Alternatif untuk "kejuruteraan terbalik". Saya telah membincangkan cara membuat projek semula dengan memulakan aplikasi Android. Tetapi ada alternatif untuk ini, anda dapat menyiapkan hamba Bluetooth FTDI + bersiri (HC-05 biasa tanpa menentukan tetapan induk). Kemudian dari aplikasi ZenWheels sambungkan ke HC-05 dan bukannya "microcar".

Untuk menyahkod perintah, anda perlu menahan roda kemudi dalam beberapa kedudukan, kemudian menggunakan skrip python menganalisis komunikasi bersiri. Saya mencadangkan skrip python kerana tidak ada watak yang boleh dicetak dan Arduino IDE tidak sesuai untuk itu. Anda akan melihat bahawa jika anda memegang roda dalam satu posisi, aplikasi akan menghantar dua bait yang sama secara berkala. Sekiranya anda mengubah kedudukan roda, byte penumbuk tetap sama, kedua akan berubah. Selepas banyak percubaan, anda boleh membuat algoritma stereng, kemudian pendikit jurutera terbalik dll.

Alternatif untuk remote berasaskan arduino adalah remote RaspberryPi. Raspberry pi mempunyai modul bluetooth tersemat yang tidak menyakitkan untuk disiapkan dalam mod "master" dan pustaka bluetooth python berfungsi seperti daya tarikan. Juga terdapat beberapa projek yang lebih menarik seperti mengendalikan kereta menggunakan Alexa echo:)

Saya harap anda menikmati projek ini dan tinggalkan komen di bawah!

Disyorkan: