Indholdsfortegnelse:

Hackbar fjernbetjening til ZenWheels Microcar: 7 trin
Hackbar fjernbetjening til ZenWheels Microcar: 7 trin

Video: Hackbar fjernbetjening til ZenWheels Microcar: 7 trin

Video: Hackbar fjernbetjening til ZenWheels Microcar: 7 trin
Video: SRP (Scotts Racing Products) Pro cut Wheel Well Opening tutorial 2024, Juni
Anonim
Image
Image
montage
montage

I denne vejledning skal vi bygge en brugerdefineret fjernbetjening til ZenWheels mikrovognen. ZenWheels mikrobil er en legetøjsbil på 5 cm, der kan styres via en Android- eller Iphone -applikation. Jeg vil vise dig, hvordan du konverterer Android -applikationen for at finde ud af om kommunikationsprotokollen, og hvordan du kan bygge en fjernbetjening ved hjælp af arduino og et gyroskop.

Trin 1: Komponenter og værktøjer

Dele:

1. ZenWheels mikrovogn

2. Arduino pro mini 328p

3. Brødbræt

4. MPU6050 gyroskop

5. strømkilde <= 5 v (noget batteri, som vi kan tilslutte til brødbrættet)

6. U-formede jumperkabler (ekstraudstyr). Jeg har brugt disse jumperkabler, fordi de ser bedre ud på brødbrættet. Almindelige jumperkabler kan bruges i stedet

7. HC-05 bluetooth-modul (med en knap til at gå til AT-tilstand)

Værktøjer:

1. USB til seriel FTDI -adapter FT232RL til programmering af Arduino pro mini

2. Arduino IDE

3. Android -telefon

4. Android Studio [Valgfrit]

Trin 2: Reverse Engineering ZenWheels Android -applikationen [valgfrit]

Noget kendskab til Java og Android er påkrævet for at forstå denne del.

Projektmålet er at styre mikrobilen ved hjælp af et gyroskop. Til dette skal vi finde ud af mere om bluetooth -kommunikationen mellem dette legetøj og Android -appen.

I dette trin vil jeg forklare, hvordan man konverterer kommunikationsprotokollen mellem mikrobilen og Android -appen til reverse. Hvis du bare vil bygge fjernbetjeningen, er dette trin ikke nødvendigt. En måde at opdage protokollen på er at se på kildekoden. Hmm, men det er ikke lige frem, Android -applikationer kompileres, og man kan installere apk'en via Google Play.

Så jeg har lavet en grundlæggende vejledning til at gøre dette:

1. Download APK'en. Et Android Package Kit (APK for kort) er det pakkefilformat, der bruges af Android -operativsystemet til distribution og installation af mobile apps

Søg først i applikationen i google play store, i vores tilfælde søger du på "zenwheels", og du får applikationslinket

Søg derefter på google efter "online apk downloader" og brug en til at downloade apk. Normalt vil de bede om applikationslinket (det, vi har fået tidligere), derefter trykker vi på en download -knap og gemmer det på vores computer.

2. Dekompiler APK. En dekompilator i vores situation er et værktøj, der tager APK'en og producerer Java -kildekode.

Den enkleste løsning er at bruge en online decompiler til at udføre jobbet. Jeg har søgt på google efter "online decompliler", og jeg har valgt https://www.javadecompilers.com/. Du skal bare uploade den APK, du har hentet tidligere og

tryk på dekompileringen. Så downloader du bare kilderne.

3. Prøv at reverse engineer se koden igennem

For at åbne projektet har du brug for en tekstredigerer eller bedre et IDE (integreret udviklingsmiljø). Standard -IDE til Android -projekter er Android Studio (https://developer.android.com/studio). Når du har installeret Android Studio, skal du åbne projektmappen.

Fordi vores bil er styret af bluetooth, startede jeg min søgning i den dekompilerede kode med søgeordet "bluetooth", fra de hændelser, jeg har fundet, "BluetoothSerialService" var i håndtag af kommunikationen. Hvis denne klasse håndterer kommunikationen, skal den have en sendkommandometode. Det viser sig, at der er én skrivemetode, der sender data via bluetooth -kanalen:

offentligt tomrum (byte ud)

Dette er en god start, jeg har ledt efter.write (metoden bruges, og der er en klasse "ZenWheelsMicrocar", der udvider vores "BluetoothSerialService". Denne klasse indeholder det meste af logikken i vores kommunikation via Bluetooth. Den anden del af logikken er i controllerne: BaseController og StandardController.

I BaseController har vi serviceinitialisering, og også definitioner af styre- og gasspjældskanalerne, kanaler er faktisk kommando -præfikser for at angive, at en eller anden form for kommando vil følge:

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

beskyttede ChannelOutput -udgange = {nyt TrimChannelOutput (ZenWheelsMicrocar. STEERING_CHANNEL), nyt TrimChannelOutput (ZenWheelsMicrocar. THROTTLE_CHANNEL)};

I StandardController håndteres styringen i:

public void handleSteering (TouchEvent touchEvent) {

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

Ved analyse af metoden har steeringOutput.channel værdien 129 (kanal, der bruges til styring) og steeringOutput.resolveValue () kan have en værdi mellem -90 og 90. Kanalværdien (129) sendes direkte, og styreværdien ændres ved at anvende bitvise operationer:

private final int value_convert_out (int value) {

boolsk negativ = falsk; hvis (værdi <0) {negativ = f6D; } int value2 = værdi & 63; hvis (negativ) {returværdi2 | 64; } returværdi2; }

Der er en lignende metode i StandardController kaldet

public void handleThrottle (TouchEvent touchEvent)

Trin 3: Komponenter

Dele:

1. Arduino pro mini 328p 2 $

2. Brødbræt

3. MPU6050 gyroskop 1,2 $

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

5. 4 x AA batteripakke med 4 batterier

6. U-formede jumperkabler (ekstraudstyr). Jeg har brugt disse jumperkabler, fordi de ser bedre ud på brødbrættet, og lysdioderne er mere synlige på denne måde. Hvis du ikke har disse kabler, kan du udskifte dem med dupont -ledninger.

Ovenstående priser er hentet fra eBay.

Værktøjer:

1. USB til seriel FTDI -adapter FT232RL til programmering af arduino pro mini

2. Arduino IDE

3. Android Studio (valgfrit hvis du selv vil reverse engineering)

Trin 4: Montering

montage
montage

Samlingen er meget enkel, fordi vi gør det på et brødbræt:)

- først placerer vi vores komponenter på brødbrættet: mikrokontrolleren, bluetooth -modulet og gyroskopet

- tilslut HC-05 bluetooth RX og TX benene til arduino 10 og 11 ben. Gyroskopet SDA og SCL skal tilsluttes arduino A4- og A5 -benene

- Slut strømstifterne til bluetooth, gyro og arduino. stifterne skal tilsluttes + og - på siden af brødbrættet

- sidst tilsluttede en strømforsyning (mellem 3,3V til 5V) til brødbrættet, jeg har brugt et lille LiPo -batteri, men ethvert vil gøre det, så længe det er inden for effektområdet

Se venligst billederne ovenfor for at få flere detaljer

Trin 5: Par HC-05 Bluetooth til mikrobilen

Par HC-05 Bluetooth til mikrobilen
Par HC-05 Bluetooth til mikrobilen
Par HC-05 Bluetooth til mikrobilen
Par HC-05 Bluetooth til mikrobilen
Par HC-05 Bluetooth til mikrobilen
Par HC-05 Bluetooth til mikrobilen

Til dette skal du bruge en Android-telefon, bluetooth HC-05-modulet og den serielle FTDI-adapter med ledninger. Vi bruger også Arduino IDE til at kommunikere med bluetooth -modulet.

Først skal vi finde ud af microcar bluetooth -adressen:

- aktiver bluetooth på din telefon

- tænd for bilen, og gå til Bluetooth -sektionen i dine indstillinger i Android

- søg efter nye enheder og en enhed kaldet "Microcar" skal vises

- par med denne enhed

- for derefter at udtrække Bluetooth MAC har jeg brugt denne app fra Google Play Serial Bluetooth Terminal

Efter installation af denne app skal du gå til menuen -> enheder, og der vil du have en liste med alle Bluetooth -parrede enheder. Vi er kun interesseret i koden under "Microcar" minen er 00: 06: 66: 49: A0: 4B

Tilslut derefter FTDI -adapteren til bluetooth -modulet. Først VCC- og GROUND -ben og derefter FTDI RX til bluetooth TX og FTDI TX til bluetooth RX. Der skal også være en pin på bluetooth -modulet, der skal tilsluttes VCC. Ved at gøre dette går Bluetooth -modulet over i en "programmerbar tilstand". Mit modul har en knap, der forbinder VCC til den særlige pin. Når du tilslutter FTDI til USB'en, skal det være med stiften tilsluttet / knappen trykket ned for at komme ind i denne specielle programmerbare tilstand. Bluetooth bekræfter indtastning af denne driftsmåde ved at blinke langsomt hvert 2. sekund.

Vælg den serielle port i Arduino IDE, og åbn derefter den serielle skærm (både NL og CR med 9600 baudrate). Skriv AT, og modulet skal bekræfte med "OK".

Skriv "AT+ROLE = 1" for at sætte modulet i master -tilstand. For at parre med dit bluetooh -modul skal du skrive: "AT+BIND = 0006, 66, 49A04B", bemærk hvordan vores "00: 06: 66: 49: A0: 4B" omdannes til "0006, 66, 49A04B". Nå, du bør gøre den samme transformation for din bluetooh MAC.

Tænd nu for Zenwheels -bilen, og tag derefter stikket ud af FTDI'en, og tilslut den igen uden at trykke på knappen / en særlig pin er tilsluttet. Efter et stykke tid skulle den oprette forbindelse til bilen, og du vil bemærke, at bilen får en bestemt forbindelse til at lyde vellykket.

Fejlfinding:

- Jeg fandt ud af, at fra alle de Bluetooth -moduler, jeg havde, fungerede kun den med en knap som en mester!

- sikre at bilen er fuldt opladet

- Sørg for, at bilen ikke er tilsluttet telefonen

- hvis Bluetooth går ind i AT -tilstand (blinker langsomt), men det ikke reagerer på kommandoen, skal du sikre, at du har begge NL & CR, og også eksperimentere med andre BAUD -hastigheder

- dobbelttjek, at RX er tilsluttet TX og omvendt

- prøv denne vejledning

Trin 6: Kode og brug

Først skal du downloade og installere to biblioteker:

1. MPU6050 bibliotek til gyroskopet

2. I2CDev bibliotekskilde

Download og installer derefter mit bibliotek herfra, eller kopier det nedenunder:

/** * 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 = falsk; // sæt sand, hvis DMP init var vellykket

uint8_t mpuIntStatus; // holder den faktiske afbrydelsesstatusbyte fra MPU uint8_t devStatus; // returstatus efter hver enhedsoperation (0 = succes,! 0 = fejl) uint16_t packetSize; // forventet DMP -pakkestørrelse (standard er 42 bytes) uint16_t fifoCount; // tæller alle bytes i øjeblikket i FIFO uint8_t fifoBuffer [64]; // FIFO opbevaringsbuffer Quaternion q; // [w, x, y, z] quaternion container VectorFloat tyngdekraft; // [x, y, z] tyngdekraftsvektor float ypr [3]; // [yaw, pitch, roll] yaw/pitch/roll container og tyngdekraftvektoren flygtig bool mpuInterrupt = false; // angiver, om MPU -afbrydelsesnålen er gået højt

unsigned long lastPrintTime, lastMoveTime = 0;

SoftwareSerial BTserial (10, 11);

MPU6050 mpu;

ugyldig opsætning ()

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

void loop () {

hvis (! initialisering) {return; } mpuInterrupt = falsk; mpuIntStatus = mpu.getIntStatus (); fifoCount = mpu.getFIFOCount (); hvis (hasFifoOverflown (mpuIntStatus, fifoCount)) {mpu.resetFIFO (); Vend tilbage; } 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, & tyngdekraft); styre (ypr [0] * 180/M_PI, ypr [1] * 180/M_PI, ypr [2] * 180/M_PI); }}

/*

* Modtager vinkel fra 0 til 180, hvor 0 er maks. Venstre og 180 er maks. Til højre * Modtager hastighed fra -90 til 90, hvor -90 er maks. Bagud og 90 er maks. Fremad// ugyldig bevægelseZwheelsCar (bytevinkel, int -hastighed) {hvis (millis () - lastMoveTime = 90) {resultAngle = map (vinkel, 91, 180, 1, 60); } ellers hvis (vinkel 0) {resultSpeed = map (hastighed, 0, 90, 0, 60); } ellers hvis (hastighed <0) {resultSpeed = map (hastighed, 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 (); }

tomrumsstyring (int x, int y, int z)

{x = begrænsning (x, -1 * MAX_ANGLE, MAX_ANGLE); y = begrænsning (y, -1 * MAX_ANGLE, MAX_ANGLE); z = begrænsning (z, -MAX_ANGLE, MAX_ANGLE); int vinkel = kort (y, -MAX_ANGLE, MAX_ANGLE, 0, 180); int -hastighed = kort (z, -MAX_ANGLE, MAX_ANGLE, 90, -90); printDebug (x, y, z, vinkel, hastighed); moveZwheelsCar (vinkel, hastighed); }

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

{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 forbindelse lykkedes"): F ("MPU6050 forbindelse mislykkedes")); devStatus = mpu.dmpInitialize (); mpu.setXGyroOffset (220); mpu.setYGyroOffset (76); mpu.setZGyroOffset (-85); mpu.setZAccelOffset (1788); hvis (devStatus! = 0) {Serial.print (F ("DMP -initialisering mislykkedes (kode")); Serial.println (devStatus); return false;} mpu.setDMPEnabled (true); Serial.println (F ("Aktivering afbrydelsesdetektering (Arduino ekstern afbrydelse 0)… ")); attachInterrupt (0, dmpDataReady, RISING); mpuIntStatus = mpu.getIntStatus (); Serial.println (F (" DMP klar! Venter på første afbrydelse … ")); packetSize = mpu.dmpGetFIFOPacketSize (); returner sandt;}

void dmpDataReady ()

{mpuInterrupt = sand; }

boolsk hasFifoOverflown (int mpuIntStatus, int fifoCount)

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

Upload koden ved hjælp af FTDI -adapteren til arduinoen, og tilslut derefter batterierne.

Brug af fjernbetjeningen:

Når arduinoen er tændt, skal du også tænde for bilen. HC-05-modulet skal oprette forbindelse til bilen, når det sker, udsender bilen en lyd. Hvis det ikke virker, skal du kontrollere det foregående trin og afsnittet om fejlfinding.

Hvis du hælder brødbrættet fremad, skal bilen køre fremad, til højre, og bilen skal bevæge sig til højre. Det udfører også mere gradvise bevægelser som at hælde lidt fremad og lidt tilbage i dette tilfælde ville bilen gå langsomt til venstre.

Hvis bilen kører på en anden måde, når du hælder brødbrættet, skal du først holde brødbrættet i forskellige retninger.

Hvordan det virker:

Skitsen får gyroskopkoordinaterne for hver 100 ms, foretager beregninger og sender derefter bilkommandoerne over bluetooth. Først er der en "styre" -metode, der bliver kaldt med de rå x-, y- og z -vinkler. Denne metode forvandler styringen mellem 0 og 180 grader og accelerationen mellem -90 og 90. Denne metode kalder

void moveZwheelsCar (byte vinkel, int hastighed), der konverterer styringen og accelerationen til ZenWheels specifikationer og derefter sender kommandoerne ved hjælp af bluetooth.

Grunden til, at jeg har foretaget transformationen i to trin, er genanvendelse. hvis jeg skulle tilpasse denne skitse til fjernbetjening af en anden enhed, ville jeg starte fra basismetoden "styre", der allerede kortlægger hastighed og styring til nogle nyttige værdier.

Trin 7: Alternativer

Et alternativ til "reverse engineering". Jeg har talt om, hvordan man konverterer projektet ved at starte med Android -applikationen. Men der er et alternativ til dette, du kan oprette en seriel FTDI + bluetooth-slave (almindelig HC-05 uden at angive hovedindstillingerne). Tilslut derefter fra ZenWheels-appen til HC-05 i stedet for "mikrobilen".

For at afkode kommandoerne skal du holde rattet i en eller anden position og derefter analysere den serielle kommunikation ved hjælp af et python -script. Jeg foreslår et python -script, fordi der er tegn, der ikke kan udskrives, og Arduino IDE det ikke er egnet til det. Du vil bemærke, at hvis du holder hjulet i en position, sender appen regelmæssigt de samme to bytes. Hvis du varierer hjulpositionen, vil knytnævebyten forblive den samme, den anden ændres. Efter mange forsøg kan du komme med styringsalgoritmen, derefter reverse engineer gas osv.

Et alternativ til den arduino -baserede fjernbetjening ville være en RaspberryPi -fjernbetjening. Raspberry pi har et integreret bluetooth -modul, der er smertefrit at oprette i "master" -tilstanden, og python bluetooth -biblioteket fungerer som en charme. Nogle flere interessante projekter er også mulige som at styre bilen ved hjælp af Alexa -ekko:)

Jeg håber, at du nød projektet og efterlad venligst kommentarer herunder!

Anbefalede: