Daftar Isi:

Remote Control yang Dapat Diretas untuk ZenWheels Microcar: 7 Langkah
Remote Control yang Dapat Diretas untuk ZenWheels Microcar: 7 Langkah

Video: Remote Control yang Dapat Diretas untuk ZenWheels Microcar: 7 Langkah

Video: Remote Control yang Dapat Diretas untuk ZenWheels Microcar: 7 Langkah
Video: 50 САМЫХ ИННОВАЦИОННЫХ ЛИЧНЫХ ТРАНСПОРТНЫХ СРЕДСТВ 2021–2022 гг. 2024, Juni
Anonim
Image
Image
perakitan
perakitan

Dalam tutorial ini kita akan membuat remote control khusus untuk microcar ZenWheels. Microcar ZenWheels adalah mobil mainan berukuran 5 cm yang dapat dikontrol melalui aplikasi Android atau Iphone. Saya akan menunjukkan kepada Anda cara merekayasa balik aplikasi Android untuk mengetahui tentang protokol komunikasi dan bagaimana Anda dapat membangun kendali jarak jauh menggunakan arduino dan giroskop.

Langkah 1: Komponen & Alat

Bagian:

1. Mobil mikro ZenWheels

2. Arduino pro mini 328p

3. Papan tempat memotong roti

4. giroskop MPU6050

5. sumber listrik <=5 v (beberapa baterai yang bisa kita pasang ke breadboard)

6. Kabel jumper berbentuk U (opsional). Saya telah menggunakan kabel jumper ini karena terlihat lebih baik di papan tempat memotong roti. Kabel jumper biasa dapat digunakan sebagai gantinya

7. Modul bluetooth HC-05 (dengan tombol untuk masuk ke mode AT)

Peralatan:

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

2. Arduino IDE

3. Ponsel Android

4. Android Studio [Opsional]

Langkah 2: Rekayasa Terbalik Aplikasi Android ZenWheels [opsional]

Beberapa pengetahuan tentang Java dan Android diperlukan untuk memahami bagian ini.

Tujuan proyek adalah untuk mengontrol microcar menggunakan giroskop. Untuk ini kita perlu mengetahui lebih lanjut tentang komunikasi bluetooth antara mainan ini dan aplikasi android.

Pada langkah ini saya akan menjelaskan bagaimana merekayasa balik protokol komunikasi antara microcar dan aplikasi android. Jika Anda hanya ingin membuat remote, langkah ini tidak perlu dilakukan. Salah satu cara untuk menemukan protokol adalah dengan melihat kode sumbernya. Hmm tapi ini tidak langsung, aplikasi android dikompilasi dan seseorang dapat menginstal apk melalui google play.

Jadi saya telah membuat panduan dasar untuk melakukan ini:

1. Unduh APK. Android Package Kit (disingkat APK) adalah format file paket yang digunakan oleh sistem operasi Android untuk distribusi dan pemasangan aplikasi seluler

Pertama cari aplikasi di google play store, dalam kasus kami cari "zenwheels" dan Anda akan mendapatkan tautan aplikasi

Kemudian cari di google untuk "pengunduh apk online" dan gunakan salah satunya untuk mengunduh apk. Biasanya mereka akan menanyakan link aplikasi (yang sudah kita dapatkan sebelumnya), kemudian kita akan menekan tombol download dan menyimpannya di komputer kita.

2. Dekompilasi APK. Decompiler dalam situasi kami adalah alat yang mengambil APK dan menghasilkan kode sumber Java.

Solusi paling sederhana adalah dengan menggunakan decompiler online untuk melakukan pekerjaan itu. Saya telah mencari google untuk " decompliler online " dan saya telah memilih https://www.javadecompilers.com/. Anda hanya perlu mengunggah APK yang telah Anda peroleh sebelumnya dan

tekan dekompilasi. Kemudian Anda tinggal mengunduh sumbernya.

3. Cobalah untuk merekayasa balik melihat melalui kode

Untuk membuka proyek, Anda memerlukan editor teks atau IDE (lingkungan pengembangan terintegrasi) yang lebih baik. IDE default untuk Proyek Android adalah Android Studio (https://developer.android.com/studio). Setelah Anda menginstal Android Studio, buka folder proyek.

Karena mobil kami dikendalikan oleh bluetooth, saya memulai pencarian saya dalam kode yang didekompilasi dengan kata kunci "bluetooth", dari kejadian yang saya temukan "BluetoothSerialService" sedang menangani komunikasi. Jika kelas ini menangani komunikasi maka harus memiliki metode perintah kirim. Ternyata ada satu metode tulis yang mengirim data melalui saluran bluetooth:

penulisan batal publik (byte keluar)

Ini adalah awal yang baik, saya telah mencari.write(metode yang digunakan dan ada kelas "ZenWheelsMicrocar" yang memperluas "BluetoothSerialService" kami. Kelas ini berisi sebagian besar logika komunikasi kami melalui Bluetooth. Bagian lain dari logikanya ada di pengontrol: BaseController dan StandardController.

Di BaseController kami memiliki inisialisasi layanan, dan juga definisi saluran kemudi dan throttle, saluran sebenarnya adalah awalan perintah untuk menentukan bahwa beberapa jenis perintah akan mengikuti:

protected ZenWheelsMicrocar microcar = new ZenWheelsMicrocar(this, this.btHandler);

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

Dalam StandardController, kemudi ditangani dalam:

public void handleSteering(TouchEvent touchEvent) {

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

Menganalisis metode, steeringOutput.channel memiliki nilai 129 (saluran yang digunakan untuk kemudi) dan steeringOutput.resolveValue() mungkin memiliki nilai antara -90 dan 90. Nilai saluran (129) dikirim langsung, dan nilai kemudi diubah dengan menerapkan operasi bitwise:

private final int value_convert_out(nilai int) {

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

Ada metode serupa di StandardController yang disebut

public void handleThrottle(TouchEvent touchEvent)

Langkah 3: Komponen

Bagian:

1. Arduino pro mini 328p 2 $

2. Papan tempat memotong roti

3. Giroskop MPU6050 1.2$

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

5. Paket baterai 4 x AA dengan 4 baterai

6. Kabel jumper berbentuk U (opsional). Saya telah menggunakan kabel jumper ini karena terlihat lebih baik di papan tempat memotong roti, dan led lebih terlihat dengan cara ini. Jika Anda tidak memiliki kabel ini, Anda dapat menggantinya dengan kabel dupont.

Harga di atas diambil dari eBay.

Peralatan:

1. USB ke adaptor FTDI serial FT232RL untuk memprogram arduino pro mini

2. Arduino IDE

3. Android Studio (opsional jika Anda ingin merekayasa balik sendiri)

Langkah 4: Perakitan

perakitan
perakitan

Perakitannya sangat sederhana karena kami melakukannya di papan tempat memotong roti:)

- pertama kami menempatkan komponen kami di papan tempat memotong roti: mikrokontroler, modul bluetooth, dan giroskop

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

- sambungkan pin daya ke bluetooth, gyro, dan arduino. pin harus terhubung ke + dan - di sisi papan tempat memotong roti

- terakhir sambungkan catu daya (antara 3.3V hingga 5V) ke papan tempat memotong roti, saya telah menggunakan baterai satu sel LiPo kecil tetapi apa pun akan dilakukan selama berada dalam kisaran daya

Silakan periksa gambar di atas untuk lebih jelasnya

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 ponsel Android, modul bluetooth HC-05, dan adaptor FTDI serial dengan kabel. Kami juga akan menggunakan Arduino IDE untuk berkomunikasi dengan modul bluetooth.

Pertama kita perlu mencari tahu alamat bluetooth microcar:

- aktifkan bluetooth di ponsel Anda

- nyalakan mobil dan buka bagian bluetooth dari pengaturan Anda di Android

- cari perangkat baru dan beberapa perangkat bernama "Microcar" akan muncul

- pasangkan dengan perangkat ini

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

Setelah menginstal aplikasi ini, buka menu -> perangkat dan di sana Anda akan memiliki daftar dengan semua perangkat yang dipasangkan bluetooth. Kami hanya tertarik dengan kode di bawah tambang "Microcar" adalah 00:06:66:49:A0:4B

Selanjutnya sambungkan adaptor FTDI ke modul bluetooth. Pertama pin VCC dan GROUND lalu FTDI RX ke bluetooth TX dan FTDI TX ke bluetooth RX. Juga harus ada pin pada modul bluetooth yang harus terhubung ke VCC. Dengan melakukan ini, modul bluetooth memasuki "mode yang dapat diprogram". Modul saya memiliki tombol yang menghubungkan VCC ke pin khusus itu. Ketika Anda mencolokkan FTDI ke USB itu harus dengan pin terhubung / tombol ditekan untuk masuk dalam mode programmable khusus ini. Bluetooth mengonfirmasi memasuki mode operasi ini dengan berkedip perlahan setiap 2 detik.

Pada Arduino IDE pilih serial port, lalu buka serial monitor (Baik NL dan CR dengan baud rate 9600). Ketik AT dan modul harus mengonfirmasi dengan "OK".

Ketik "AT+ROLE=1" untuk menempatkan modul dalam mode master. Untuk memasangkan dengan modul bluetooh Anda, tulis: "AT+BIND=0006, 66, 49A04B", Perhatikan bagaimana "00:06:66:49:A0:4B" kami diubah menjadi "0006, 66, 49A04B". Nah, Anda harus melakukan transformasi yang sama untuk MAC bluetooh Anda.

Sekarang hidupkan mobil Zenwheels kemudian cabut FTDI dan pasang kembali tanpa menekan tombol / pin khusus terhubung. Setelah beberapa saat itu harus terhubung ke mobil dan Anda akan melihat mobil membuat suara koneksi tertentu berhasil.

Penyelesaian masalah:

- Saya menemukan bahwa dari semua modul Bluetooth yang saya miliki, hanya satu dengan tombol yang berfungsi sebagai master!

- pastikan mobil terisi penuh

- pastikan mobil tidak terhubung ke telepon

- jika Bluetooth masuk dalam mode AT (berkedip perlahan) tetapi tidak merespon perintah pastikan Anda memiliki KEDUA NL & CR, dan juga bereksperimen dengan tarif BAUD lainnya

- periksa kembali RX terhubung ke TX dan sebaliknya

- coba tutorial ini

Langkah 6: Kode & Penggunaan

Pertama, Anda perlu mengunduh dan menginstal dua perpustakaan:

1. Pustaka MPU6050 untuk giroskop

2. Sumber perpustakaan I2CDev

Kemudian unduh dan instal perpustakaan 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" #include "SoftwareSerial.h"

const int MAX_ANGLE = 45;

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

inisialisasi bool = false; // set true jika init DMP berhasil

uint8_t mpuIntStatus; // menyimpan byte status interupsi aktual dari MPU uint8_t devStatus; // mengembalikan status setelah setiap operasi perangkat (0 = sukses, !0 = error) uint16_t packetSize; // ukuran paket DMP yang diharapkan (default adalah 42 byte) uint16_t fifoCount; // jumlah semua byte saat ini di FIFO uint8_t fifoBuffer[64]; // buffer penyimpanan FIFO Quaternion q; // [w, x, y, z] quaternion container VectorFloat gravity; // [x, y, z] vektor gravitasi float ypr[3]; // [yaw, pitch, roll] yaw/pitch/roll container dan vektor gravitasi volatil bool mpuInterrupt = false; // menunjukkan apakah pin interupsi MPU menjadi tinggi

unsigned long lastPrintTime, lastMoveTime = 0;

SoftwareSerial BTserial(10, 11);

MPU6050 mpu;

batalkan pengaturan()

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

lingkaran kosong() {

if (!inisialisasi) { kembali; } mpuInterrupt = salah; mpuIntStatus = mpu.getIntStatus(); fifoCount = mpu.getFIFOCount(); if (hasFifoOverflown(mpuIntStatus, fifoCount)) { mpu.resetFIFO(); kembali; } if (mpuIntStatus & 0x02) { while (fifoCount < ukuran paket) { fifoCount = mpu.getFIFOCount(); } mpu.getFIFOBytes(fifoBuffer, packetSize); fifoCount -= ukuran paket; mpu.dmpGetQuaternion(&q, fifoBuffer); mpu.dmpGetGravity(&gravitasi, &q); mpu.dmpGetYawPitchRoll(ypr, &q, &gravitasi); 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 adalah maks kiri dan 180 adalah kanan maks * Menerima kecepatan dari -90 hingga 90 di mana -90 adalah maks mundur dan 90 adalah maks maju */ void moveZwheelsCar(byte angle, int speed) { if (milis() - lastMoveTime = 90) { resultAngle = peta(sudut, 91, 180, 1, 60); } else if (sudut 0) { resultSpeed = map(speed, 0, 90, 0, 60); } else if (kecepatan < 0) { resultSpeed = map(speed, 0, -90, 120, 60); } Serial.print("actualAngle=");Serial.print(angle);Serial.print("; "); Serial.print("actualSpeed=");Serial.print(resultSpeed);Serial.println("; "); BTserial.write(commandStering); BTserial.write(resultAngle); BTserial.write(commandSpeed); BTserial.write((byte) resultSpeed); lastMoveTime = milis(); }

void steer(int x, int y, int z)

{ x = kendala(x, -1 * MAX_ANGLE, MAX_ANGLE); y = kendala(y, -1 * MAX_ANGLE, MAX_ANGLE); z = kendala(z, -MAX_ANGLE, MAX_ANGLE); int sudut = peta(y, -MAX_ANGLE, MAX_ANGLE, 0, 180); int kecepatan = peta(z, -MAX_ANGLE, MAX_ANGLE, 90, -90); printDebug(x, y, z, sudut, kecepatan); moveZwheelsCar(sudut, kecepatan); }

void printDebug(int x, int y, int z, int sudut, int kecepatan)

{ if (millis() - lastPrintTime < 1000) { kembali; } 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(kecepatan);Serial.println("; "); lastPrintTime = milis(); }

bool inisialisasiGiroskop()

{ Kawat.mulai(); mpu.initialize(); Serial.println(mpu.testConnection() ? F("Koneksi MPU6050 berhasil"): F("Koneksi MPU6050 gagal")); devStatus = mpu.dmpInitialize(); mpu.setXGyroOffset(220); mpu.setYGyroOffset(76); mpu.setZGyroOffset(-85); mpu.setZAccelOffset(1788); if (devStatus != 0) { Serial.print(F("Inisialisasi DMP gagal (kode "));Serial.println(devStatus); return false; } mpu.setDMPEnabled(true); Serial.println(F("Mengaktifkan deteksi interupsi (Arduino external interrupt 0)…")); attachInterrupt(0, dmpDataReady, RISING); mpuIntStatus = mpu.getIntStatus(); Serial.println(F("DMP ready! Menunggu interupsi pertama…")); packetSize = mpu.dmpGetFIFOPacketSize(); mengembalikan nilai true; }

batalkan dmpDataReady()

{ mpuInterrupt = benar; }

boolean hasFifoOverflown(int mpuIntStatus, int fifoCount)

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

Unggah kode menggunakan adaptor FTDI ke arduino kemudian sambungkan baterai.

Menggunakan remote:

Setelah arduino dihidupkan, nyalakan juga mobil. Modul HC-05 harus terhubung ke mobil, ketika itu terjadi mobil akan mengeluarkan suara. Jika tidak berhasil, periksa langkah sebelumnya dan bagian pemecahan masalah.

Jika Anda mencondongkan papan tempat memotong roti ke depan, mobil harus bergerak maju, ke kanan, dan mobil harus bergerak ke kanan. Ia juga melakukan gerakan yang lebih bertahap seperti mencondongkan tubuh sedikit ke depan dan sedikit ke kiri dalam hal ini mobil akan bergerak perlahan ke kiri.

Jika mobil berjalan ke arah yang berbeda saat mencondongkan papan tempat memotong roti terlebih dahulu pegang papan tempat memotong roti ke arah yang berbeda.

Bagaimana itu bekerja:

Sketsa mendapatkan koordinat giroskop setiap 100 ms, membuat perhitungan dan kemudian mengirimkan perintah mobil melalui bluetooth. Pertama ada metode "mengarahkan" yang dipanggil dengan sudut mentah x, y dan z. Metode ini mengubah kemudi antara 0 dan 180 derajat dan percepatan antara -90 dan 90. Metode ini memanggil

void moveZwheelsCar(byte angle, int speed) yang mengubah kemudi dan akselerasi ke spesifikasi ZenWheels dan kemudian mengirimkan perintah menggunakan bluetooth.

Alasan saya melakukan transformasi dalam dua langkah, adalah dapat digunakan kembali. jika saya perlu menyesuaikan sketsa ini dengan remote control beberapa perangkat lain saya akan mulai dari metode dasar "mengarahkan" yang sudah memetakan kecepatan dan kemudi ke beberapa nilai yang berguna.

Langkah 7: Alternatif

Sebuah alternatif untuk "rekayasa terbalik". Saya telah berbicara tentang cara merekayasa balik proyek dengan memulai dengan aplikasi Android. Tetapi ada alternatif untuk ini, Anda dapat mengatur FTDI + budak bluetooth serial (HC-05 biasa tanpa menentukan pengaturan master). Kemudian dari aplikasi ZenWheels sambungkan ke HC-05 alih-alih "microcar".

Untuk memecahkan kode perintah, Anda harus menahan kemudi di beberapa posisi, lalu menggunakan skrip python, analisis komunikasi serial. Saya menyarankan skrip python karena ada karakter yang tidak dapat dicetak dan Arduino IDE tidak cocok untuk itu. Anda akan mengamati bahwa jika Anda memegang kemudi di satu posisi, aplikasi akan mengirimkan dua byte yang sama secara teratur. Jika Anda memvariasikan posisi roda, byte pertama akan tetap sama, detik akan berubah. Setelah banyak percobaan, Anda dapat menemukan algoritme kemudi, lalu merekayasa balik throttle, dll.

Alternatif untuk remote berbasis arduino adalah remote RaspberryPi. Pi raspberry memiliki modul bluetooth tersemat yang tidak sulit untuk diatur dalam mode "master" dan perpustakaan bluetooth python bekerja seperti pesona. Juga beberapa proyek yang lebih menarik dimungkinkan seperti mengendalikan mobil menggunakan Alexa echo:)

Saya harap Anda menikmati proyek ini dan silakan tinggalkan komentar di bawah!

Direkomendasikan: