Talaan ng mga Nilalaman:

Hackable Remote Control para sa ZenWheels Microcar: 7 Hakbang
Hackable Remote Control para sa ZenWheels Microcar: 7 Hakbang

Video: Hackable Remote Control para sa ZenWheels Microcar: 7 Hakbang

Video: Hackable Remote Control para sa ZenWheels Microcar: 7 Hakbang
Video: Building a Bluetooth Remote Control Car 2024, Hunyo
Anonim
Image
Image
Assembly
Assembly

Sa tutorial na ito magtatayo kami ng isang pasadyang remote control para sa ZenWheels microcar. Ang microWheels ng ZenWheels ay isang 5 cm laruang kotse na makokontrol sa pamamagitan ng isang Android o Iphone application. Ipapakita ko sa iyo kung paano i-reverse engineer ang application ng Android upang malaman ang tungkol sa protocol ng komunikasyon at kung paano ka makakagawa ng isang remote control gamit ang arduino at isang gyroscope.

Hakbang 1: Mga Bahagi at Tool

Mga Bahagi:

1. Ang microWheels ng ZenWheels

2. Arduino pro mini 328p

3. Breadboard

4. MPU6050 gyroscope

5. pinagmulan ng kuryente <= 5 v (ilang baterya na maaari nating mai-attach sa breadboard)

6. U-hugis na mga jumper cable (opsyonal). Ginamit ko ang mga jumper cables na ito dahil mas maganda ang hitsura nila sa breadboard. Ang mga regular na jumper cables ay maaaring gamitin sa halip

7. module ng blu-HC-05 (na may isang pindutan para sa pagpasok sa AT mode)

Mga tool:

1. USB sa serial FTDI adapter FT232RL upang mai-program ang Arduino pro mini

2. Arduino IDE

3. Android Telepono

4. Android Studio [Opsyonal]

Hakbang 2: Baliktarin ang Engineering sa ZenWheels Android Application [opsyonal]

Ang ilang kaalaman sa Java at Android ay kinakailangan upang maunawaan ang bahaging ito.

Ang layunin ng proyekto ay upang makontrol ang microcar gamit ang isang gyroscope. Para sa mga ito kailangan naming malaman ang higit pa tungkol sa komunikasyon sa Bluetooth sa pagitan ng laruang ito at ng android app.

Sa hakbang na ito ipapaliwanag ko kung paano i-reverse engineer ang komunikasyon sa komunikasyon sa pagitan ng microcar at ng Android app. Kung nais mo lamang na itayo ang malayo ang hakbang na ito ay hindi kinakailangan. Ang isang paraan upang matuklasan ang protokol ay ang pagtingin sa source code. Hmm ngunit ito ay hindi tuwid na pasulong, ang mga android application ay naipon at ang isa ay maaaring mai-install ang apk sa pamamagitan ng google play.

Kaya't gumawa ako ng pangunahing gabay sa paggawa nito:

1. I-download ang APK. Ang isang Android Package Kit (APK para sa maikli) ay ang format ng file ng package na ginamit ng operating system ng Android para sa pamamahagi at pag-install ng mga mobile app

Paghahanap muna ng application sa google play store, sa aming case search na "zenwheels" at makukuha mo ang link ng application

Pagkatapos maghanap sa google para sa "online apk downloader" at gumamit ng isa upang i-download ang apk. Kadalasan hihilingin nila ang link ng application (ang naunang nakuha namin), pagkatapos ay pipindutin namin ang isang pindutang mag-download at i-save ito sa aming computer.

2. Pag-decompile ng APK. Ang isang decompiler sa aming sitwasyon ay isang tool na kumukuha ng APK at gumawa ng Java source code.

Ang pinakasimpleng solusyon ay ang paggamit ng isang online decompiler upang gawin ang trabaho. Hinanap ko sa google ang "online decompliler" at pinili ko ang https://www.javadecompilers.com/. Kailangan mo lang i-upload ang APK na nakuha mo kanina at

pindutin ang decompile. Pagkatapos i-download mo lamang ang mga mapagkukunan.

3. Subukang baligtarin ang inhenyero na tumitingin sa code

Upang buksan ang proyekto kailangan mo ng isang text editor o mas mahusay na isang IDE (integrated environment na pag-unlad). Ang default na IDE para sa Android Projects ay Android Studio (https://developer.android.com/studio). Matapos mong mai-install ang Android Studio buksan ang folder ng proyekto.

Dahil ang aming sasakyan ay kinokontrol ng bluetooth sinimulan ko ang aking paghahanap sa decompiled code gamit ang keyword na "bluetooth", mula sa mga pangyayari na nalaman kong "BluetoothSerialService" ay nasa hawakan ng komunikasyon. Kung ang klase na ito ang humahawak sa komunikasyon dapat magkaroon ito ng padala ng paraan ng utos. Lumabas na mayroong isang paraan ng pagsulat na nagpapadala ng data sa pamamagitan ng bluetooth channel:

publikong walang bisa na sumulat (byte out)

Ito ay isang magandang pagsisimula, hinanap ko ang.write (ginagamit ang pamamaraan at mayroong isang klase na "ZenWheelsMicrocar" na nagpapalawak ng aming "BluetoothSerialService". Naglalaman ang klase na ito ng karamihan sa lohika ng aming komunikasyon sa Bluetooth. Ang iba pang bahagi ng ang lohika ay nasa mga Controller: BaseController at StandardController.

Sa BaseController mayroon kaming pagsisimula sa serbisyo, at mga kahulugan din ng mga pagpipiloto at throttle channel, ang mga channel ay sa katunayan ay mga unlapi ng utos upang tukuyin na ang ilang uri ng utos ay susundan:

protektado ang ZenWheelsMicrocar microcar = bagong ZenWheelsMicrocar (ito, this.btHandler);

protektadong ChannelOutput output = {bagong TrimChannelOutput (ZenWheelsMicrocar. STEERING_CHANNEL), bagong TrimChannelOutput (ZenWheelsMicrocar. THROTTLE_CHANNEL)};

Sa StandardController ang pagpipiloto ay hinahawakan sa:

public void handleSteering (TouchEvent touchEvent) {

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

Sinusuri ang pamamaraan, ang steeringOutput.channel ay may halagang 129 (ginamit ang channel para sa pagpipiloto) at steeringOutput.resolveValue () ay maaaring magkaroon ng isang halaga sa pagitan ng -90 at 90. Ang halaga ng channel (129) ay direktang ipinadala, at ang halaga ng pagpipiloto ay nabago sa pamamagitan ng paglalapat ng kaunting pagpapatakbo:

pribadong panghuling int halaga_convert_out (int halaga) {

negatibo ng boolean = false; kung (halagang <0) {negatibo = f6D; } int halaga2 = halaga at 63; kung (negatibo) {return halaga2 | 64; } bumalik na halaga2; }

Mayroong isang katulad na pamamaraan sa StandardController na tinawag

public void handleThrottle (TouchEvent touchEvent)

Hakbang 3: Mga Bahagi

Mga Bahagi:

1. Arduino pro mini 328p 2 $

2. Breadboard

3. MPU6050 gyroscope 1.2 $

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

5. 4 x AA na baterya pack na may 4 na baterya

6. U-hugis na mga jumper cable (opsyonal). Ginamit ko ang mga jumper cables na ito dahil mas maganda ang hitsura nila sa breadboard, at ang mga leds ay mas nakikita sa ganitong paraan. Kung wala kang mga kable na ito maaari mong palitan ang mga ito ng mga dupont wires.

Ang mga presyo sa itaas ay kinuha mula sa eBay.

Mga tool:

1. USB sa serial FTDI adapter FT232RL upang mai-program ang arduino pro mini

2. Arduino IDE

3. Android Studio (opsyonal kung nais mong i-reverse engineer ang iyong sarili)

Hakbang 4: Assembly

Assembly
Assembly

Napakadali ng pagpupulong dahil ginagawa namin ito sa isang breadboard:)

- Una naming inilalagay ang aming mga bahagi sa breadboard: ang microcontroller, bluetooth module at gyroscope

- ikonekta ang mga HC-05 bluetooth RX at TX na pin sa arduino 10 at 11 na mga pin. Ang gyroscope SDA at SCL ay dapat na konektado sa mga arduino A4 at A5 na pin

- ikonekta ang mga power pin sa Bluetooth, gyro at ang arduino. ang mga pin ay dapat na konektado sa + at - sa gilid ng breadboard

- Huling ikonekta ang isang suplay ng kuryente (sa pagitan ng 3.3V hanggang 5V) sa breadboard, gumamit ako ng isang maliit na LiPo isang cell baterya ngunit ang anumang gagawin hangga't nasa saklaw ng kuryente

Mangyaring suriin ang mga larawan sa itaas para sa higit pang mga detalye

Hakbang 5: Ipares ang HC-05 Bluetooth sa Microcar

Ipares ang HC-05 Bluetooth sa Microcar
Ipares ang HC-05 Bluetooth sa Microcar
Ipares ang HC-05 Bluetooth sa Microcar
Ipares ang HC-05 Bluetooth sa Microcar
Ipares ang HC-05 Bluetooth sa Microcar
Ipares ang HC-05 Bluetooth sa Microcar

Para dito kakailanganin mo ang isang Android phone, ang module ng bluetooth HC-05 at ang serial FTDI adapter na may mga wire. Gagamitin din namin ang Arduino IDE upang makipag-usap sa module ng bluetooth.

Una kailangan nating malaman ang address ng microcar bluetooth:

- paganahin ang Bluetooth sa iyong telepono

- lakas sa kotse at pumunta sa seksyon ng bluetooth ng iyong mga setting sa Android

- maghanap para sa mga bagong aparato at ilang aparato na tinatawag na "Microcar" ay dapat na lumitaw

- ipares sa aparatong ito

- pagkatapos ay upang makuha ang bluetooth MAC, ginamit ko ang app na ito mula sa google play ng Serial Bluetooth Terminal

Matapos i-install ang app na ito, pumunta sa menu -> mga aparato at doon magkakaroon ka ng isang listahan sa lahat ng mga deveice na ipinares ng bluetooth. Interesado lamang kami sa code sa ibaba ng "Microcar" mine ay 00: 06: 66: 49: A0: 4B

Susunod na ikonekta ang FTDI adapter sa module ng bluetooth. Una ang mga VCC at GROUND na pin at pagkatapos ay ang FTDI RX sa bluetooth TX at FTDI TX sa bluetooth RX. Gayundin dapat mayroong isang pin sa module ng Bluetooth na dapat na konektado sa VCC. Ang paggawa nito ang module ng bluetooth ay pumapasok sa isang "programmable mode". Ang aking module ay may isang pindutan na nag-uugnay sa VCC sa espesyal na pin na iyon. Kapag na-plug in mo ang FTDI sa USB dapat ay may pin na konektado / pindutan na pinindot upang pumasok sa espesyal na programmable mode na ito. Kinukumpirma ng Bluetooth ang pagpasok sa mode na ito ng pagpapatakbo sa pamamagitan ng pag-blink ng dahan-dahan bawat 2 segundo.

Sa Arduino IDE piliin ang serial port, pagkatapos buksan ang serial monitor (Parehong NL at CR na may 9600 baud rate). I-type ang AT at dapat kumpirmahin ng module ang "OK".

I-type ang "AT + ROLE = 1" upang ilagay ang module sa master mode. Upang ipares sa iyong module ng bluetooh isulat ang: "AT + BIND = 0006, 66, 49A04B", Pansinin kung paano ang aming "00: 06: 66: 49: A0: 4B" ay binago sa "0006, 66, 49A04B". Kaya dapat mong gawin ang parehong pagbabago para sa iyong bluetooh MAC.

Ngayon ang lakas sa kotseng Zenwheels pagkatapos ay i-unplug ang FTDI at i-plug ito muli nang walang pindutang naipit / espesyal na pin na konektado. Pagkatapos ng ilang sandali dapat itong kumonekta sa kotse at mapapansin mo ang kotse na gumagawa ng isang tukoy na koneksyon matagumpay na tunog.

Pag-troubleshoot:

- Natagpuan ko na mula sa lahat ng mga module ng Bluetooth na mayroon ako, ang isa lamang na may isang pindutan ang nagtrabaho bilang isang master!

- matiyak na ang kotse ay nasingil ng buong

- siguraduhin na ang kotse ay hindi konektado sa telepono

- kung ang Bluetooth ay pumasok sa mode na AT (dahan-dahang kumikislap) ngunit hindi ito tumutugon sa utos na tiyaking mayroon kang BOTH NL & CR, at mag-eksperimento rin sa iba pang mga rate ng BAUD

- I-double check ang RX ay konektado sa TX at vice versa

- subukan ang tutorial na ito

Hakbang 6: Code at Paggamit

Una kailangan mong mag-download at mag-install ng dalawang aklatan:

1. MPU6050 library para sa gyroscope

2. I2CDev mapagkukunan ng library

Pagkatapos i-download at i-install ang aking library mula dito o kopyahin ito mula sa ibaba:

/ ** * Mga Aklatan: * https://github.com/jrowberg/i2cdevlib * https://github.com/jrowberg/i2cdevlib * / # isama ang "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;

pagpapasimula ng bool = false; // set true kung matagumpay ang DMP init

uint8_t mpuIntStatus; // humahawak ng aktwal na byte ng pagkaantala ng katayuan mula sa MPU uint8_t devStatus; // status ng pagbabalik pagkatapos ng bawat pagpapatakbo ng aparato (0 = tagumpay,! 0 = error) uint16_t packetSize; // inaasahang laki ng packet ng DMP (ang default ay 42 bytes) uint16_t fifoCount; // count ng lahat ng byte na kasalukuyang nasa FIFO uint8_t fifoBuffer [64]; // FIFO storage buffer Quaternion q; // [w, x, y, z] lalagyan ng quaternion na VectorFloat gravity; // [x, y, z] gravity vector float ypr [3]; // [yaw, pitch, roll] yaw / pitch / roll container at gravity vector pabagu-bago ng loob bool mpuInterrupt = false; // nagpapahiwatig kung ang MPU makagambala pin ay naging mataas

unsigned long lastPrintTime, lastMoveTime = 0;

SoftwareSerial BTserial (10, 11);

MPU6050 mpu;

walang bisa ang pag-setup ()

{Serial.begin (9600); BTserial.begin (38400); Serial.println ("Nagsimula ang programa"); pagsisimula = initializeGyroscope (); }

void loop () {

kung (! initialization) {return; } mpuInterrupt = false; mpuIntStatus = mpu.getIntStatus (); fifoCount = mpu.getFIFOCount (); kung (hasFifoOverflown (mpuIntStatus, fifoCount)) {mpu.resetFIFO (); bumalik; } kung (mpuIntStatus & 0x02) {habang (fifoCount <packetSize) {fifoCount = mpu.getFIFOCount (); } mpu.getFIFOBytes (fifoBuffer, packetSize); fifoCount - = packetSize; mpu.dmpGetQuaternion (& q, fifoBuffer); mpu.dmpGetGravity (& gravity, & q); mpu.dmpGetYawPitchRoll (ypr, & q, & gravity); patnubapan (ypr [0] * 180 / M_PI, ypr [1] * 180 / M_PI, ypr [2] * 180 / M_PI); }}

/*

* Nakatanggap ng anggulo mula 0 hanggang 180 kung saan ang 0 ay max na kaliwa at ang 180 ay max pakanan * Natatanggap ang bilis mula -90 hanggang 90 kung saan -90 ang max na paatras at 90 ang max na pasulong * / walang bisa ang moveZwheelsCar (byte anggulo, int bilis) {kung (millis () - lastMoveTime = 90) {resultAngle = mapa (anggulo, 91, 180, 1, 60); } iba pa kung (anggulo 0) {resultaSpeed = mapa (bilis, 0, 90, 0, 60); } iba pa kung (bilis <0) {resultSpeed = mapa (bilis, 0, -90, 120, 60); } Serial.print ("actualAngle ="); Serial.print (anggulo); Serial.print (";"); Serial.print ("actualSpeed ="); Serial.print (resultSpeed); Serial.println (";"); BTserial.write (commandStering); BTserial.write (resultaAngle); BTserial.write (commandSpeed); BTserial.write ((byte) resultaSpeed); lastMoveTime = millis (); }

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

{x = pipigilan (x, -1 * MAX_ANGLE, MAX_ANGLE); y = pipigilan (y, -1 * MAX_ANGLE, MAX_ANGLE); z = pipigilan (z, -MAX_ANGLE, MAX_ANGLE); int anggulo = mapa (y, -MAX_ANGLE, MAX_ANGLE, 0, 180); int bilis = mapa (z, -MAX_ANGLE, MAX_ANGLE, 90, -90); printDebug (x, y, z, anggulo, bilis); ilipatZwheelsCar (anggulo, bilis); }

void printDebug (int x, int y, int z, int anggulo, int bilis)

{if (millis () - lastPrintTime <1000) {return; } 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 ("anggulo ="); Serial.print (anggulo); Serial.print (";"); Serial.print ("bilis ="); Serial.print (bilis); Serial.println (";"); lastPrintTime = millis (); }

ipasimula ang boolGyroscope ()

{Wire.begin (); mpu.initialize (); Serial.println (mpu.testConnection ()? F ("Matagumpay ang koneksyon sa MPU6050"): F ("Nabigo ang koneksyon sa MPU6050")); devStatus = mpu.dmpInitialize (); mpu.setXGyroOffset (220); mpu.setYGyroOffset (76); mpu.setZGyroOffset (-85); mpu.setZAccelOffset (1788); kung (devStatus! = 0) {Serial.print (F ("Nabigo ang Initialization ng DMP (code")); Serial.println (devStatus); return false;} mpu.setDMPEnabled (true); Serial.println (F ("Enabling makagambala na pagtuklas (Arduino panlabas na makagambala 0)… ")); attachInterrupt (0, dmpDataReady, RISING); mpuIntStatus = mpu.getIntStatus (); Serial.println (F (" DMP handa na! Naghihintay para sa unang makagambala … ")); packetSize = mpu.dmpGetFIFOPacketSize (); bumalik na totoo;}

walang bisa dmpDataReady ()

{mpuInterrupt = totoo; }

boolean hasFifoOverflown (int mpuIntStatus, int fifoCount)

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

I-upload ang code gamit ang FTDI adapter sa arduino pagkatapos ay ikonekta ang mga baterya.

Gamit ang remote:

Matapos ang arduino ay pinapagana, mayroon ding lakas sa kotse. Ang module na HC-05 ay dapat na kumonekta sa kotse, kapag nangyari iyon ang kotse ay magpapalabas ng tunog. Kung hindi ito gumana mangyaring suriin ang nakaraang hakbang at ang seksyon ng pag-troubleshoot.

Kung ikiling mo ang pisara sa pasulong ang kotse ay dapat na sumulong, pakanan at ang kotse ay dapat na kumilos ng tama. Gumagawa rin ito ng mas unti-unting paggalaw tulad ng pagkahilig nang medyo pasulong at medyo natitira sa kasong ito ang kotse ay dahan-dahang pupunta sa kaliwa.

Kung ang kotse ay nagpunta sa iba't ibang paraan kapag nakakagiling sa pisara ay hawakan muna ang tinapay sa iba't ibang direksyon.

Paano ito gumagana:

Nakuha ng sketch ang koordinasyon ng gyroscope bawat 100 ms, gumagawa ng mga pagkalkula at pagkatapos ay ihatid sa pamamagitan ng bluetooth ang mga utos ng kotse. Una mayroong isang "patnubayan" na pamamaraan na tinatawag na may hilaw na x, y at z na mga anggulo. Binabago ng pamamaraang ito ang pagpipiloto sa pagitan ng 0 at 180 degree at ang pagbilis sa pagitan ng -90 at 90. Tumawag ang pamamaraang ito

walang bisa ang moveZwheelsCar (byte anggulo, int bilis) na nagko-convert ng pagpipiloto at pagpapabilis sa mga pagtutukoy ng ZenWheels at pagkatapos ay nagpapadala ng mga utos gamit ang Bluetooth.

Ang dahilan kung bakit ko nagawa ang pagbabago sa dalawang hakbang, ay ang kakayahang magamit muli. kung kakailanganin kong iakma ang sketch na ito upang malayuang makontrol ang ilang iba pang aparato magsisimula ako mula sa batayang pamamaraan na "patnubayan" na nai-mapa ang bilis at pagpipiloto sa ilang mga kapaki-pakinabang na halaga.

Hakbang 7: Mga kahalili

Isang kahalili sa "reverse engineering". Pinag-usapan ko kung paano i-reverse engineer ang proyekto sa pamamagitan ng pagsisimula sa Android application. Ngunit may isang kahalili dito maaari kang mag-set up ng isang serial FTDI + bluetooth na alipin (regular na HC-05 nang hindi tinukoy ang mga setting ng master). Pagkatapos mula sa ZenWheels app kumonekta sa HC-05 sa halip na ang "microcar".

Upang mai-decode ang mga utos na kakailanganin mong hawakan ang manibela sa ilang posisyon, pagkatapos ay pag-aralan ang isang script ng sawa na pag-aralan ang serial na komunikasyon. Nagmumungkahi ako ng isang script ng sawa dahil mayroong mga hindi nai-print na character at Arduino IDE hindi ito angkop para doon. Mapapansin mo na kung hawak mo ang gulong sa isang posisyon ay regular na magpapadala ang app ng parehong dalawang byte. Kung babaguhin mo ang posisyon ng gulong ang kamao byte ay mananatiling pareho sa pangalawa ay magbabago. Pagkatapos ng maraming pagsubok maaari kang makabuo ng steering algorithm, pagkatapos ay baligtarin ang throttle ng engineer atbp.

Ang isang kahalili sa remote na batay sa arduino ay magiging isang remote na RaspberryPi. Ang raspberry pi ay may naka-embed na module ng Bluetooth na walang sakit upang mai-set up sa "master" mode at ang python bluetooth library ay gumagana tulad ng isang kagandahan. Gayundin ang ilang higit pang mga kagiliw-giliw na proyekto ay posible tulad ng pagkontrol sa kotse gamit ang Alexa echo:)

Inaasahan kong nasiyahan ka sa proyekto at mangyaring mag-iwan ng mga komento sa ibaba!

Inirerekumendang: