Innholdsfortegnelse:

Hackbar fjernkontroll for ZenWheels Microcar: 7 trinn
Hackbar fjernkontroll for ZenWheels Microcar: 7 trinn

Video: Hackbar fjernkontroll for ZenWheels Microcar: 7 trinn

Video: Hackbar fjernkontroll for ZenWheels Microcar: 7 trinn
Video: MicroCar Next generation Smartphone controlled toy car 2024, November
Anonim
Image
Image
montering
montering

I denne opplæringen skal vi bygge en tilpasset fjernkontroll for ZenWheels mikrobil. ZenWheels mikrobil er en lekebil på 5 cm som kan kontrolleres via en Android- eller Iphone -applikasjon. Jeg skal vise deg hvordan du reverserer Android -applikasjonen for å finne ut om kommunikasjonsprotokollen og hvordan du kan bygge en fjernkontroll ved hjelp av arduino og et gyroskop.

Trinn 1: Komponenter og verktøy

Deler:

1. ZenWheels mikrobil

2. Arduino pro mini 328p

3. Brødbrett

4. MPU6050 gyroskop

5. strømkilde <= 5 v (noe batteri som vi kan koble til brødbrettet)

6. U-formede startkabler (valgfritt). Jeg har brukt disse hoppekablene fordi de ser bedre ut på brødbrettet. Vanlige startkabler kan brukes i stedet

7. HC-05 Bluetooth-modul (med en knapp for å gå til AT-modus)

Verktøy:

1. USB til seriell FTDI -adapter FT232RL for å programmere Arduino pro mini

2. Arduino IDE

3. Android -telefon

4. Android Studio [Valgfritt]

Trinn 2: Reverse Engineering ZenWheels Android -applikasjonen [valgfritt]

Noe kunnskap om Java og Android er nødvendig for å forstå denne delen.

Prosjektmålet er å kontrollere mikrobilen ved hjelp av et gyroskop. For dette må vi finne ut mer om Bluetooth -kommunikasjonen mellom dette leketøyet og Android -appen.

I dette trinnet vil jeg forklare hvordan du reverserer kommunikasjonsprotokollen mellom mikrobilen og Android -appen. Hvis du bare vil bygge fjernkontrollen, er dette trinnet ikke nødvendig. En måte å oppdage protokollen på er å se på kildekoden. Hmm, men dette er ikke rett frem, Android -applikasjoner er kompilert, og man kan installere APK -en gjennom Google Play.

Så jeg har laget en grunnleggende guide for å gjøre dette:

1. Last ned APK. Et Android Package Kit (APK for kort) er pakkefilformatet som brukes av Android -operativsystemet for distribusjon og installasjon av mobilapper

Søk først i programmet på google play store, i vårt tilfelle søker du på "zenwheels", så får du søknadskoblingen

Søk deretter på google etter "online apk downloader" og bruk en til å laste ned apk. Vanligvis vil de be om programkoblingen (den vi har fått tidligere), så trykker vi på en nedlastingsknapp og lagrer den på datamaskinen vår.

2. Dekompiler APK. En dekompilator i vår situasjon er et verktøy som tar APK -en og produserer Java -kildekoden.

Den enkleste løsningen er å bruke en online dekompilator for å gjøre jobben. Jeg har søkt på google etter "online decompliler", og jeg har valgt https://www.javadecompilers.com/. Du trenger bare å laste opp APK -en du har hentet tidligere og

trykk på dekompileringen. Da er det bare å laste ned kildene.

3. Prøv å reversere med å se gjennom koden

For å åpne prosjektet trenger du en tekstredigerer eller bedre en IDE (integrert utviklingsmiljø). Standard IDE for Android Projects er Android Studio (https://developer.android.com/studio). Etter at du har installert Android Studio, åpner du prosjektmappen.

Fordi bilen vår er kontrollert av bluetooth, startet jeg søket mitt i den dekompilerte koden med søkeordet "bluetooth", fra hendelsene jeg fant "BluetoothSerialService" var i håndteringen av kommunikasjonen. Hvis denne klassen håndterer kommunikasjonen, må den ha en sendkommandometode. Det viser seg at det er én skrivemetode som sender data gjennom Bluetooth -kanalen:

offentlig tomromskriving (byte ut)

Dette er en god start, jeg har søkt etter.write (metoden som brukes, og det er en klasse "ZenWheelsMicrocar" som utvider vår "BluetoothSerialService". Denne klassen inneholder det meste av logikken i kommunikasjonen vår via Bluetooth. Den andre delen av logikken er i kontrollerne: BaseController og StandardController.

I BaseController har vi serviceinitialisering, og også definisjoner av styre- og gasspjeldkanalene, kanaler er faktisk kommandoprefikser for å spesifisere at en eller annen kommando vil følge:

beskyttet ZenWheelsMicrocar mikrobil = ny ZenWheelsMicrocar (dette, this.btHandler);

beskyttede ChannelOutput -utganger = {ny TrimChannelOutput (ZenWheelsMicrocar. STEERING_CHANNEL), ny TrimChannelOutput (ZenWheelsMicrocar. THROTTLE_CHANNEL)};

I StandardController håndteres styringen i:

public void handleSteering (TouchEvent touchEvent) {

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

Ved analyse av metoden kan styringsutgangen.kanalen ha verdien 129 (kanal som brukes til styring) og styringOutput.resolveValue () kan ha en verdi mellom -90 og 90. Kanalverdien (129) sendes direkte, og styreverdien endres ved å bruke bitvise operasjoner:

private final int value_convert_out (int verdi) {

boolsk negativ = usann; hvis (verdi <0) {negativ = f6D; } int value2 = verdi & 63; hvis (negativ) {returverdi2 | 64; } returverdi2; }

Det er en lignende metode i StandardController kalt

public void handleThrottle (TouchEvent touchEvent)

Trinn 3: Komponenter

Deler:

1. Arduino pro mini 328p 2 $

2. Brødbrett

3. MPU6050 gyroskop 1,2 $

4. HC-05 master-slave 6-pins modul 3 $

5. 4 x AA -batteripakke med 4 batterier

6. U-formede startkabler (valgfritt). Jeg har brukt disse hopperkablene fordi de ser bedre ut på brødbrettet, og lysdiodene er mer synlige på denne måten. Hvis du ikke har disse kablene, kan du erstatte dem med dupont -ledninger.

Ovennevnte priser er hentet fra eBay.

Verktøy:

1. USB til seriell FTDI -adapter FT232RL for å programmere arduino pro mini

2. Arduino IDE

3. Android Studio (valgfritt hvis du vil reversere deg selv)

Trinn 4: Montering

montering
montering

Monteringen er veldig enkel fordi vi gjør det på et brødbrett:)

- først plasserer vi komponentene våre på brødbrettet: mikrokontrolleren, bluetooth -modulen og gyroskopet

- koble HC-05 bluetooth RX- og TX-pinnene til arduino 10 og 11 pinner. Gyroskopet SDA og SCL bør kobles til arduino A4- og A5 -pinnene

- koble strømnålene til bluetooth, gyro og arduino. pinnene skal kobles til + og - på siden av brødbrettet

- sist koble en strømforsyning (mellom 3,3V til 5V) til brødbrettet, jeg har brukt et lite LiPo -batteri, men noen vil gjøre så lenge det er innenfor effektområdet

Sjekk bildene ovenfor for mer informasjon

Trinn 5: Koble HC-05 Bluetooth til mikrobilen

Koble HC-05 Bluetooth til mikrobilen
Koble HC-05 Bluetooth til mikrobilen
Koble HC-05 Bluetooth til mikrobilen
Koble HC-05 Bluetooth til mikrobilen
Koble HC-05 Bluetooth til mikrobilen
Koble HC-05 Bluetooth til mikrobilen

For dette trenger du en Android-telefon, Bluetooth HC-05-modulen og den serielle FTDI-adapteren med ledninger. Vi skal også bruke Arduino IDE til å kommunisere med bluetooth -modulen.

Først må vi finne ut microcar bluetooth -adressen:

- aktiver bluetooth på telefonen

- slå på bilen og gå til Bluetooth -delen av innstillingene dine i Android

- søk etter nye enheter og en enhet som heter "Microcar" skal vises

- par med denne enheten

- for å trekke ut bluetooth MAC, har jeg brukt denne appen fra Google Play Serial Bluetooth Terminal

Etter at du har installert denne appen, går du til meny -> enheter, og der har du en liste med alle Bluetooth -parede enheter. Vi er bare interessert i koden under "Microcar" -gruven er 00: 06: 66: 49: A0: 4B

Koble deretter FTDI -adapteren til Bluetooth -modulen. Først VCC og GROUND pins og deretter FTDI RX til bluetooth TX og FTDI TX til bluetooth RX. Det bør også være en pinne på bluetooth -modulen som skal kobles til VCC. Når du gjør dette går Bluetooth -modulen inn i en "programmerbar modus". Modulen min har en knapp som kobler VCC til den spesielle pinnen. Når du kobler FTDI til USB -en, bør den være med pinnen tilkoblet / knappen inne for å gå inn i denne spesielle programmerbare modusen. Bluetooth bekrefter å gå inn i denne modusen ved å blinke sakte hvert 2. sekund.

Velg den serielle porten i Arduino IDE, og åpne deretter den serielle skjermen (både NL og CR med 9600 baud rate). Skriv AT og modulen skal bekrefte med "OK".

Skriv "AT+ROLE = 1" for å sette modulen i hovedmodus. For å koble til bluetooh -modulen, skriver du: "AT+BIND = 0006, 66, 49A04B". Legg merke til hvordan "00: 06: 66: 49: A0: 4B" blir omgjort til "0006, 66, 49A04B". Vel, du bør gjøre den samme transformasjonen for din bluetooh MAC.

Slå på Zenwheels -bilen, og koble deretter fra FTDI og koble den til igjen uten at knappen trykkes ned / spesialpinnen er tilkoblet. Etter en stund skal den koble seg til bilen, og du vil merke at bilen gir en bestemt tilkobling som lykkes.

Feilsøking:

- Jeg fant ut at fra alle Bluetooth -modulene jeg hadde, fungerte bare den med en knapp som en mester!

- sørg for at bilen er fulladet

- Sørg for at bilen ikke er koblet til telefonen

- hvis Bluetooth går inn i AT -modus (blinker sakte), men den ikke reagerer på kommandoen, må du forsikre deg om at du har begge NL & CR, og også eksperimentere med andre BAUD -hastigheter

- dobbeltsjekk at RX er koblet til TX og omvendt

- prøv denne opplæringen

Trinn 6: Kode og bruk

Først må du laste ned og installere to biblioteker:

1. MPU6050 bibliotek for gyroskopet

2. I2CDev bibliotekskilde

Last ned og installer biblioteket mitt herfra eller kopier det nedenfra:

/** * Biblioteker: * 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;

bool initialisering = false; // satt true hvis DMP init var vellykket

uint8_t mpuIntStatus; // holder faktisk avbruddsstatusbyte fra MPU uint8_t devStatus; // returstatus etter hver enhetsoperasjon (0 = suksess,! 0 = feil) uint16_t packetSize; // forventet DMP -pakkestørrelse (standard er 42 byte) uint16_t fifoCount; // telling av alle byte som for øyeblikket er i FIFO uint8_t fifoBuffer [64]; // FIFO lagringsbuffer Quaternion q; // [w, x, y, z] quaternion container VectorFloat gravity; // [x, y, z] tyngdekraftvektor float ypr [3]; // [yaw, pitch, roll] yaw/pitch/roll container og tyngdekraftvektoren flyktig bool mpuInterrupt = false; // angir om MPU -avbruddsnålen har gått høyt

usignert lang lastPrintTime, lastMoveTime = 0;

SoftwareSerial BTserial (10, 11);

MPU6050 mpu;

ugyldig oppsett ()

{Serial.begin (9600); BTserial.begin (38400); Serial.println ("Programmet startet"); initialisering = initializeGyroscope (); }

void loop () {

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

/*

* Mottar vinkel fra 0 til 180 hvor 0 er maks venstre og 180 er maks høyre * Mottar hastighet fra -90 til 90 hvor -90 er maks bakover og 90 er maks forover */ tomrom moveZwheelsCar (bytevinkel, int -hastighet) {hvis (millis () - lastMoveTime = 90) {resultAngle = map (vinkel, 91, 180, 1, 60); } annet hvis (vinkel 0) {resultSpeed = map (hastighet, 0, 90, 0, 60); } annet hvis (hastighet <0) {resultSpeed = map (hastighet, 0, -90, 120, 60); } Serial.print ("actualAngle ="); Serial.print (vinkel); Serial.print (";"); Serial.print ("actualSpeed ="); Serial.print (resultSpeed); Serial.println (";"); BTserial.write (commandStering); BTserial.write (resultAngle); BTserial.write (commandSpeed); BTserial.write ((byte) resultSpeed); lastMoveTime = millis (); }

ugyldig styring (int x, int y, int z)

{x = begrensning (x, -1 * MAX_ANGLE, MAX_ANGLE); y = begrensning (y, -1 * MAX_ANGLE, MAX_ANGLE); z = begrensning (z, -MAX_ANGLE, MAX_ANGLE); int vinkel = kart (y, -MAX_ANGLE, MAX_ANGLE, 0, 180); int hastighet = kart (z, -MAX_ANGLE, MAX_ANGLE, 90, -90); printDebug (x, y, z, vinkel, hastighet); moveZwheelsCar (vinkel, hastighet); }

void printDebug (int x, int y, int z, int vinkel, int hastighet)

{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 ("vinkel ="); Serial.print (vinkel); Serial.print (";"); Serial.print ("speed ="); Serial.print (speed); Serial.println (";"); lastPrintTime = millis (); }

bool initializeGyroscope ()

{Wire.begin (); mpu.initialize (); Serial.println (mpu.testConnection ()? F ("MPU6050 tilkobling vellykket"): F ("MPU6050 tilkobling mislyktes")); devStatus = mpu.dmpInitialize (); mpu.setXGyroOffset (220); mpu.setYGyroOffset (76); mpu.setZGyroOffset (-85); mpu.setZAccelOffset (1788); if (devStatus! = 0) {Serial.print (F ("DMP -initialisering mislyktes (kode")); Serial.println (devStatus); return false;} mpu.setDMPEnabled (true); Serial.println (F ("Aktivering avbruddsdeteksjon (Arduino ekstern avbrudd 0)… ")); attachInterrupt (0, dmpDataReady, RISING); mpuIntStatus = mpu.getIntStatus (); Serial.println (F (" DMP klar! Venter på første avbrudd … ")); packetSize = mpu.dmpGetFIFOPacketSize (); returner sant;}

void dmpDataReady ()

{mpuInterrupt = true; }

boolsk hasFifoOverflown (int mpuIntStatus, int fifoCount)

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

Last opp koden med FTDI -adapteren til arduinoen, og koble deretter til batteriene.

Bruke fjernkontrollen:

Etter at arduinoen er slått på, slår du også på bilen. HC-05-modulen skal koble seg til bilen, når det skjer, vil bilen avgi en lyd. Hvis det ikke fungerer, vennligst sjekk forrige trinn og feilsøkingsdelen.

Hvis du skråner brødbrettet fremover, skal bilen gå fremover, til høyre og bilen skal bevege seg til høyre. Den utfører også mer gradvise bevegelser som å lene litt fremover og litt igjen i dette tilfellet ville bilen gå sakte til venstre.

Hvis bilen går en annen vei når du skråner brødbrettet, må du først holde brødbrettet i forskjellige retninger.

Hvordan det fungerer:

Skissen får gyroskopkoordinatene hver 100 ms, foretar beregninger og sender deretter bilkommandoene over bluetooth. Først er det en "styre" -metode som blir kalt med rå x-, y- og z -vinkelen. Denne metoden forvandler styringen mellom 0 og 180 grader og akselerasjonen mellom -90 og 90. Denne metoden kaller

void moveZwheelsCar (byte vinkel, int hastighet) som konverterer styringen og akselerasjonen til ZenWheels spesifikasjoner og deretter overfører kommandoene ved hjelp av bluetooth.

Grunnen til at jeg har gjort transformasjonen i to trinn, er gjenbruk. hvis jeg trenger å tilpasse denne skissen til fjernkontroll på en annen enhet, ville jeg starte fra basismetoden "styre" som allerede kartlegger hastigheten og styringen til noen nyttige verdier.

Trinn 7: Alternativer

Et alternativ til "reverse engineering". Jeg har snakket om hvordan du reverserer prosjektet ved å starte med Android -applikasjonen. Men det er et alternativ til dette du kan sette opp en seriell FTDI + bluetooth slave (vanlig HC-05 uten å angi hovedinnstillingene). Koble deretter fra ZenWheels-appen til HC-05 i stedet for "mikrobilen".

For å dekode kommandoene må du holde rattet i en viss posisjon, og deretter analysere den serielle kommunikasjonen ved hjelp av et python -script. Jeg foreslår et python -skript fordi det er tegn som ikke kan skrives ut, og Arduino IDE er ikke egnet for det. Du vil se at hvis du holder rattet i en posisjon, sender appen regelmessig de samme to byte. Hvis du varierer hjulposisjonen vil neven byte forbli den samme, den andre vil endres. Etter mange forsøk kan du komme opp med styringsalgoritmen, deretter gasskontroll etc.

Et alternativ til den arduino -baserte fjernkontrollen ville være en RaspberryPi -fjernkontroll. Raspberry pi har en innebygd Bluetooth -modul som er smertefri å sette opp i "master" -modus, og python bluetooth -biblioteket fungerer som en sjarm. Noen flere interessante prosjekter er også mulige, som å kontrollere bilen ved hjelp av Alexa -ekko:)

Jeg håper du likte prosjektet og legg igjen kommentarer nedenfor!

Anbefalt: