Innehållsförteckning:

Hackbar fjärrkontroll för ZenWheels Microcar: 7 steg
Hackbar fjärrkontroll för ZenWheels Microcar: 7 steg

Video: Hackbar fjärrkontroll för ZenWheels Microcar: 7 steg

Video: Hackbar fjärrkontroll för ZenWheels Microcar: 7 steg
Video: Våltar med rc-bil 2024, Juni
Anonim
Image
Image
hopsättning
hopsättning

I denna handledning ska vi bygga en anpassad fjärrkontroll för ZenWheels mikrobil. ZenWheels mikrobil är en 5 cm leksaksbil som kan styras via en Android- eller Iphone -applikation. Jag ska visa dig hur du omvandlar Android -applikationen för att ta reda på kommunikationsprotokollet och hur du kan bygga en fjärrkontroll med arduino och ett gyroskop.

Steg 1: Komponenter och verktyg

Delar:

1. ZenWheels mikrobil

2. Arduino pro mini 328p

3. Brödbräda

4. MPU6050 gyroskop

5. strömkälla <= 5 v (lite batteri som vi kan ansluta till brödbrädan)

6. U-formade bygelkablar (tillval). Jag har använt dessa bygelkablar eftersom de ser bättre ut på brödbrädan. Vanliga bygelkablar kan användas istället

7. HC-05 Bluetooth-modul (med en knapp för att gå in i AT-läge)

Verktyg:

1. USB till seriell FTDI -adapter FT232RL för att programmera Arduino pro mini

2. Arduino IDE

3. Android -telefon

4. Android Studio [Valfritt]

Steg 2: Omvänd teknik ZenWheels Android -applikation [valfritt]

Viss kunskap om Java och Android krävs för att förstå denna del.

Projektets mål är att styra mikrobilen med ett gyroskop. För detta måste vi ta reda på mer om Bluetooth -kommunikationen mellan denna leksak och Android -appen.

I det här steget kommer jag att förklara hur man omvandlar kommunikationsprotokollet mellan mikrobilen och Android -appen. Om du bara vill bygga fjärrkontrollen är detta steg inte nödvändigt. Ett sätt att upptäcka protokollet är att titta på källkoden. Hmm men det här är inte rakt fram, Android -program sammanställs och man kan installera apk via Google Play.

Så jag har gjort en grundläggande guide för att göra detta:

1. Ladda ner APK. En Android Package Kit (APK för kort) är paketfilformatet som används av Android -operativsystemet för distribution och installation av mobilappar

Sök först i applikationen i google play store, i vårt fall söker du på "zenwheels" så får du applikationslänken

Sök sedan på google efter "online apk downloader" och använd en för att ladda ner apk. Vanligtvis kommer de att be om applikationslänken (den vi har fått tidigare), sedan trycker vi på en nedladdningsknapp och sparar den i vår dator.

2. Dekompilera APK. En dekompilator i vår situation är ett verktyg som tar APK och producerar Java -källkod.

Den enklaste lösningen är att använda en online -dekompilator för att göra jobbet. Jag har sökt på google efter "online decompliler" och jag har valt https://www.javadecompilers.com/. Du behöver bara ladda upp APK -filen du har hämtat tidigare och

tryck på dekompilera. Sedan laddar du bara ner källorna.

3. Försök att bakåtkonstruera igenom koden

För att öppna projektet behöver du en textredigerare eller bättre en IDE (integrerad utvecklingsmiljö). Standard -IDE för Android -projekt är Android Studio (https://developer.android.com/studio). När du har installerat Android Studio öppnar du projektmappen.

Eftersom vår bil styrs av bluetooth startade jag min sökning i den dekompilerade koden med sökordet "bluetooth", från händelserna som jag har upptäckt att "BluetoothSerialService" hade hand om kommunikationen. Om denna klass hanterar kommunikationen måste den ha en kommando -metod för att skicka. Det visar sig att det finns en skrivmetod som skickar data via Bluetooth -kanalen:

offentligt ogiltigt skriv (byte ut)

Detta är en bra början, jag har sökt efter.write (metoden används och det finns en klass "ZenWheelsMicrocar" som utökar vår "BluetoothSerialService". Denna klass innehåller det mesta av logiken i vår kommunikation via Bluetooth. Den andra delen av logiken finns i kontrollerna: BaseController och StandardController.

I BaseController har vi serviceinitialisering, och även definitioner av styr- och gasreglagekanalerna, kanaler är faktiskt kommandoprefix för att specificera att någon typ av kommando kommer att följa:

skyddad ZenWheelsMicrocar mikrobil = ny ZenWheelsMicrocar (detta, this.btHandler);

skyddade ChannelOutput -utgångar = {ny TrimChannelOutput (ZenWheelsMicrocar. STEERING_CHANNEL), ny TrimChannelOutput (ZenWheelsMicrocar. THROTTLE_CHANNEL)};

I StandardController hanteras styrningen i:

public void handleSteering (TouchEvent touchEvent) {

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

Vid analys av metoden kan styrningOutput.kanalen ha värdet 129 (kanal som används för styrning) och styrningOutput.resolveValue () kan ha ett värde mellan -90 och 90. Kanalvärdet (129) skickas direkt och styrvärdet ändras genom att tillämpa bitvisa operationer:

private final int value_convert_out (int värde) {

booleskt negativt = falskt; om (värde <0) {negativ = f6D; } int värde2 = värde & 63; om (negativ) {returvärde2 | 64; } returvärde2; }

Det finns en liknande metod i StandardController kallad

public void handleThrottle (TouchEvent touchEvent)

Steg 3: Komponenter

Delar:

1. Arduino pro mini 328p 2 $

2. Brödbräda

3. MPU6050 gyroskop 1.2 $

4. HC-05 master-slav 6-stifts modul 3 $

5. 4 x AA -batteripaket med 4 batterier

6. U-formade bygelkablar (tillval). Jag har använt dessa bygelkablar eftersom de ser bättre ut på brödbrädan, och lysdioderna är mer synliga på detta sätt. Om du inte har dessa kablar kan du ersätta dem med dupont -ledningar.

Ovanstående priser är hämtade från eBay.

Verktyg:

1. USB till seriell FTDI -adapter FT232RL för att programmera arduino pro mini

2. Arduino IDE

3. Android Studio (valfritt om du själv vill bakåtkonstruera)

Steg 4: Montering

hopsättning
hopsättning

Monteringen är väldigt enkel eftersom vi gör det på en brödbräda:)

- först placerar vi våra komponenter på brödbrädan: mikrokontrollern, bluetooth -modulen och gyroskopet

- anslut HC-05 bluetooth RX- och TX-stiften till arduino 10 och 11 stift. Gyroskopet SDA och SCL bör anslutas till arduino A4- och A5 -stiften

- anslut strömstiften till bluetooth, gyro och arduino. stiften ska anslutas till + och - på sidan av brödbrädan

- Anslut senast en strömförsörjning (mellan 3,3V till 5V) till brödbrädan, jag har använt ett litet LiPo -batteri med en cell, men alla kommer att göra så länge det är inom effektområdet

Kontrollera bilderna ovan för mer information

Steg 5: Koppla ihop HC-05 Bluetooth med mikrobilen

Koppla ihop HC-05 Bluetooth med mikrobilen
Koppla ihop HC-05 Bluetooth med mikrobilen
Koppla ihop HC-05 Bluetooth med mikrobilen
Koppla ihop HC-05 Bluetooth med mikrobilen
Koppla ihop HC-05 Bluetooth med mikrobilen
Koppla ihop HC-05 Bluetooth med mikrobilen

För detta behöver du en Android-telefon, Bluetooth HC-05-modulen och den seriella FTDI-adaptern med ledningar. Vi kommer också att använda Arduino IDE för att kommunicera med bluetooth -modulen.

Först måste vi ta reda på mikrobilens Bluetooth -adress:

- aktivera bluetooth på din telefon

- slå på bilen och gå till Bluetooth -sektionen i dina inställningar i Android

- sök efter nya enheter och någon enhet som heter "Microcar" ska visas

- para med den här enheten

- för att extrahera Bluetooth MAC har jag använt den här appen från Google Play Serial Bluetooth Terminal

När du har installerat den här appen går du till menyn -> enheter och där har du en lista med alla Bluetooth -parade enheter. Vi är bara intresserade av koden nedanför "Microcar" -gruvan är 00: 06: 66: 49: A0: 4B

Anslut sedan FTDI -adaptern till Bluetooth -modulen. Först VCC- och GROUND -stift och sedan FTDI RX till bluetooth TX och FTDI TX till bluetooth RX. Det bör också finnas en stift på Bluetooth -modulen som ska anslutas till VCC. Genom att göra detta går Bluetooth -modulen in i ett "programmerbart läge". Min modul har en knapp som ansluter VCC till den speciella stiftet. När du ansluter FTDI till USB bör det vara med stiftet anslutet / knappen intryckt för att gå in i detta speciella programmerbara läge. Bluetooth bekräftar att du går in i detta driftläge genom att blinka långsamt varannan sekund.

Välj den seriella porten i Arduino IDE och öppna sedan seriell bildskärm (både NL och CR med 9600 baudhastighet). Skriv AT och modulen ska bekräfta med "OK".

Skriv "AT+ROLE = 1" för att sätta modulen i masterläge. För att para ihop med din bluetooh -modul skriver du: "AT+BIND = 0006, 66, 49A04B", Lägg märke till hur vår "00: 06: 66: 49: A0: 4B" omvandlas till "0006, 66, 49A04B". Du borde göra samma omvandling för din bluetooh MAC.

Slå nu på Zenwheels -bilen och dra sedan ur FTDI -kontakten och sätt i den igen utan att knappen trycks ned / specialpinnen är ansluten. Efter ett tag bör den ansluta till bilen och du kommer att märka att bilen ger en specifik anslutning lyckat ljud.

Felsökning:

- Jag upptäckte att från alla Bluetooth -moduler jag hade fungerade bara den med en knapp som en mästare!

- se till att bilen är fulladdat

- se till att bilen inte är ansluten till telefonen

- om Bluetooth går in i AT -läget (blinkar långsamt) men det inte svarar på kommandot, se till att du har Båda NL & CR, och experimentera med andra BAUD -hastigheter

- dubbelkolla att RX är ansluten till TX och vice versa

- prova denna handledning

Steg 6: Kod och användning

Först måste du ladda ner och installera två bibliotek:

1. MPU6050 -bibliotek för gyroskopet

2. I2CDev bibliotekskälla

Ladda sedan ner och installera mitt bibliotek härifrån eller kopiera det nedanifrån:

/** * Bibliotek: * 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; // set true om DMP init lyckades

uint8_t mpuIntStatus; // håller den faktiska avbrottsstatusbyte från MPU uint8_t devStatus; // returstatus efter varje enhetsåtgärd (0 = framgång,! 0 = fel) uint16_t packetSize; // förväntad DMP -paketstorlek (standard är 42 byte) uint16_t fifoCount; // räkna alla byte som för närvarande finns i FIFO uint8_t fifoBuffer [64]; // FIFO lagringsbuffert Quaternion q; // [w, x, y, z] quaternion container VectorFloat gravitation; // [x, y, z] gravitation vektor float ypr [3]; // [yaw, pitch, roll] yaw/pitch/roll container och gravitation vector volatile bool mpuInterrupt = false; // anger om MPU -avbrottstappen har gått högt

osignerad lång lastPrintTime, lastMoveTime = 0;

SoftwareSerial BTserial (10, 11);

MPU6050 mpu;

void setup ()

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

void loop () {

if (! initialization) {return; } mpuInterrupt = falskt; mpuIntStatus = mpu.getIntStatus (); fifoCount = mpu.getFIFOCount (); if (hasFifoOverflown (mpuIntStatus, fifoCount)) {mpu.resetFIFO (); lämna tillbaka; } if (mpuIntStatus & 0x02) {while (fifoCount <packetSize) {fifoCount = mpu.getFIFOCount (); } mpu.getFIFOBytes (fifoBuffer, packetSize); fifoCount -= packetSize; mpu.dmpGetQuaternion (& q, fifoBuffer); mpu.dmpGetGravity (& gravitation, & q); mpu.dmpGetYawPitchRoll (ypr, & q, & gravitation); styra (ypr [0] * 180/M_PI, ypr [1] * 180/M_PI, ypr [2] * 180/M_PI); }}

/*

* Tar emot vinkel från 0 till 180 där 0 är max vänster och 180 är max höger * Tar emot hastighet från -90 till 90 där -90 är max bakåt och 90 är max framåt */ void moveZwheelsCar (byte vinkel, int hastighet) {if (millis () - lastMoveTime = 90) {resultAngle = map (vinkel, 91, 180, 1, 60); } annars om (vinkel 0) {resultSpeed = map (hastighet, 0, 90, 0, 60); } annars if (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 (); }

void styre (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 = karta (y, -MAX_ANGLE, MAX_ANGLE, 0, 180); int hastighet = karta (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 -anslutningen lyckades"): F ("MPU6050 -anslutningen misslyckades")); devStatus = mpu.dmpInitialize (); mpu.setXGyroOffset (220); mpu.setYGyroOffset (76); mpu.setZGyroOffset (-85); mpu.setZAccelOffset (1788); if (devStatus! = 0) {Serial.print (F ("DMP -initialisering misslyckades (kod")); Serial.println (devStatus); return false;} mpu.setDMPEnabled (true); Serial.println (F ("Aktiverar avbrottsdetektering (Arduino externt avbrott 0)… ")); attachInterrupt (0, dmpDataReady, RISING); mpuIntStatus = mpu.getIntStatus (); Serial.println (F (" DMP redo! Väntar på första avbrott … ")); packetSize = mpu.dmpGetFIFOPacketSize (); return true;}

void dmpDataReady ()

{mpuInterrupt = true; }

boolean hasFifoOverflown (int mpuIntStatus, int fifoCount)

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

Ladda upp koden med FTDI -adaptern till arduino och anslut sedan batterierna.

Använda fjärrkontrollen:

Efter att arduino har slagits på, slå också på bilen. HC-05-modulen ska anslutas till bilen, när det händer kommer bilen att avge ett ljud. Om det inte fungerar, vänligen kontrollera föregående steg och felsökningsavsnittet.

Om du lutar frambrädan framåt ska bilen gå framåt, höger och bilen ska flytta åt höger. Den utför också mer gradvisa rörelser som att luta lite framåt och lite kvar i detta fall skulle bilen gå långsamt till vänster.

Om bilen går på ett annat sätt när du lutar brödbrädet, håll först brödbrädet i olika riktningar.

Hur det fungerar:

Skissen får gyroskopkoordinaterna var 100: e ms, gör beräkningar och överför sedan bilen via bluetooth. Först finns det en "styra" -metod som kallas med råa x-, y- och z -vinklarna. Denna metod omvandlar styrningen mellan 0 och 180 grader och accelerationen mellan -90 och 90. Denna metod kräver

void moveZwheelsCar (byte vinkel, int hastighet) som omvandlar styrningen och accelerationen till ZenWheels specifikationer och sedan överför kommandona med bluetooth.

Anledningen till att jag har gjort omvandlingen i två steg är återanvändbarhet. om jag skulle behöva anpassa denna skiss till fjärrkontroll någon annan enhet skulle jag utgå från basmetoden "styra" som redan kartlägger hastigheten och styrningen till några användbara värden.

Steg 7: Alternativ

Ett alternativ till "reverse engineering". Jag har pratat om hur man omvandlar projektet genom att börja med Android -applikationen. Men det finns ett alternativ till detta du kan ställa in en seriell FTDI + bluetooth-slav (vanlig HC-05 utan att ange huvudinställningarna). Anslut sedan från ZenWheels-appen till HC-05 istället för "mikrobilen".

För att avkoda kommandona måste du hålla ratten i någon position och sedan analysera den seriella kommunikationen med ett pythonskript. Jag föreslår ett python -skript eftersom det finns tecken som inte kan skrivas ut och Arduino IDE är inte lämpligt för det. Du kommer att märka att om du håller ratten i ett läge kommer appen att sända regelbundet samma två byte. Om du varierar hjulpositionen kommer nävebyten att förbli densamma, den andra ändras. Efter många försök kan du komma med styralgoritmen, sedan back -engine gas osv.

Ett alternativ till den arduino -baserade fjärrkontrollen skulle vara en RaspberryPi -fjärrkontroll. Raspberry pi har en inbäddad Bluetooth -modul som är smärtfri att ställa in i "master" -läget och python bluetooth -biblioteket fungerar som en charm. Några mer intressanta projekt är också möjliga som att styra bilen med Alexa -eko:)

Jag hoppas att du gillade projektet och lämna kommentarer nedan!

Rekommenderad: