Sisällysluettelo:

Hakkeroitava ZenWheels -mikroauton kaukosäädin: 7 vaihetta
Hakkeroitava ZenWheels -mikroauton kaukosäädin: 7 vaihetta

Video: Hakkeroitava ZenWheels -mikroauton kaukosäädin: 7 vaihetta

Video: Hakkeroitava ZenWheels -mikroauton kaukosäädin: 7 vaihetta
Video: Process Hacker Essentials: Empowering IT Pros for Troubleshooting 2024, Kesäkuu
Anonim
Image
Image
Kokoonpano
Kokoonpano

Tässä opetusohjelmassa aiomme rakentaa mukautetun kaukosäätimen ZenWheels -mikroautolle. ZenWheels -mikroauto on 5 cm: n leluauto, jota voi ohjata Android- tai iPhone -sovelluksella. Aion näyttää sinulle, kuinka voit muuttaa Android -sovelluksen kääntämällä tiedonsiirtoprotokollaa ja kuinka voit rakentaa kaukosäätimen arduinon ja gyroskoopin avulla.

Vaihe 1: Komponentit ja työkalut

Osat:

1. ZenWheels -mikroauto

2. Arduino pro mini 328p

3. Leipälauta

4. MPU6050 gyroskooppi

5. virtalähde <= 5 v (paristo, jonka voimme kiinnittää leipälevyyn)

6. U-muotoiset hyppyjohdot (valinnainen). Olen käyttänyt näitä hyppyjohtoja, koska ne näyttävät paremmilta leipäpöydällä. Sen sijaan voidaan käyttää tavallisia hyppyjohtoja

7. HC-05 bluetooth-moduuli (painikkeella AT-tilaan siirtymiseen)

Työkalut:

1. USB -sarja FTDI -sovitin FT232RL Arduino pro minin ohjelmointiin

2. Arduino IDE

3. Android -puhelin

4. Android Studio [valinnainen]

Vaihe 2: ZenWheels -Android -sovelluksen käänteinen suunnittelu [valinnainen]

Tämän osan ymmärtäminen vaatii jonkin verran Java- ja Android -tuntemusta.

Hankkeen tavoitteena on ohjata mikroautoa gyroskoopilla. Tätä varten meidän on selvitettävä lisää tämän lelun ja Android -sovelluksen välisestä Bluetooth -viestinnästä.

Tässä vaiheessa selitän, miten mikroauton ja Android -sovelluksen välinen viestintäprotokolla voidaan muuttaa. Jos haluat vain rakentaa kaukosäätimen, tämä vaihe ei ole tarpeen. Yksi tapa löytää protokolla on katsoa lähdekoodia. Hmm, mutta tämä ei ole suoraviivaista, Android -sovellukset kootaan ja voi asentaa apk: n Google Playn kautta.

Joten olen tehnyt perusoppaan tähän:

1. Lataa APK. Android Package Kit (APK) on pakettitiedostomuoto, jota Android -käyttöjärjestelmä käyttää mobiilisovellusten jakeluun ja asentamiseen

Hae ensin sovelluksesta Google Play -kaupasta, tapauksessamme hae "zenwheels" ja saat sovelluslinkin

Hae sitten Googlesta "online apk downloader" ja käytä sitä ladataksesi apk. Yleensä he pyytävät sovelluslinkkiä (aiemmin saamamme), sitten painamme latauspainiketta ja tallennamme sen tietokoneellemme.

2. Pura APK. Tilanteemme purkaminen on työkalu, joka ottaa APK: n ja tuottaa Java -lähdekoodin.

Yksinkertaisin ratkaisu on käyttää online -dekompressoria työn suorittamiseen. Olen etsinyt googlella "online decompliler" ja valinnut https://www.javadecompilers.com/. Sinun tarvitsee vain ladata aiemmin hankittu APK ja

paina purkamista. Sitten lataat vain lähteet.

3. Yritä kääntää koodin läpi

Projektin avaamiseen tarvitaan tekstieditori tai parempi IDE (integroitu kehitysympäristö). Android -projektien oletus -IDE on Android Studio (https://developer.android.com/studio). Kun olet asentanut Android Studion, avaa projektikansio.

Koska autoa hallitaan bluetoothilla, aloitin haun dekoodatussa koodissa avainsanalla "bluetooth", havaitsemistani tapahtumista "BluetoothSerialService" oli tiedonsiirrossa. Jos tämä luokka käsittelee viestintää, sillä on oltava lähetyskomento. On käynyt ilmi, että on olemassa yksi kirjoitusmenetelmä, joka lähettää tietoja Bluetooth -kanavan kautta:

public void kirjoittaa (tavu ulos)

Tämä on hyvä alku, olen etsinyt.write -menetelmää (käytetty menetelmä ja on luokka "ZenWheelsMicrocar", joka laajentaa "BluetoothSerialService" -palvelua. Tämä luokka sisältää suurimman osan Bluetooth -viestinnän logiikasta. logiikka on ohjaimissa: BaseController ja StandardController.

BaseControllerissa meillä on palvelun alustus ja myös ohjaus- ja kaasukanavien määritelmät, kanavat ovat itse asiassa komentojen etuliitteitä, jotka määrittävät, että jonkin tyyppinen komento seuraa:

suojattu ZenWheelsMicrocar -mikroauto = uusi ZenWheelsMicrocar (tämä, tämä.btHandler);

suojattu ChannelOutput lähdöt = {uusi TrimChannelOutput (ZenWheelsMicrocar. STEERING_CHANNEL), uusi TrimChannelOutput (ZenWheelsMicrocar. THROTTLE_CHANNEL)};

StandardControllerissa ohjaus tapahtuu:

public void handle Ohjaus (TouchEvent touchEvent) {

… This.microcar.setChannel (ohjausOutput.kanava, ohjausOutput.resolveValue ()); }

Menetelmää analysoimalla ohjausOutput.kanavalla on arvo 129 (ohjaukseen käytetty kanava) ja ohjausOutput.resolveValue (): n arvo voi olla välillä -90 ja 90. Kanava -arvo (129) lähetetään suoraan ja ohjausarvoa muutetaan käyttämällä bittikohtaisia toimintoja:

private final int value_convert_out (int arvo) {

boolean -negatiivinen = epätosi; jos (arvo <0) {negatiivinen = f6D; } int arvo2 = arvo & 63; jos (negatiivinen) {palautusarvo2 | 64; } palautusarvo2; }

StandardControllerissa on samanlainen menetelmä nimeltään

public void kahva Kaasu (TouchEvent touchEvent)

Vaihe 3: Komponentit

Osat:

1. Arduino pro mini 328p 2 $

2. Leipälauta

3. MPU6050 gyroskooppi 1,2 dollaria

4. HC-05 isäntä-orja 6-nastainen moduuli 3 $

5. 4 x AA -paristo 4 paristolla

6. U-muotoiset hyppyjohdot (valinnainen). Olen käyttänyt näitä hyppyjohtoja, koska ne näyttävät paremmilta leipälaudalla ja ledit näkyvät paremmin tällä tavalla. Jos sinulla ei ole näitä kaapeleita, voit korvata ne dupont -johdoilla.

Yllä olevat hinnat on otettu eBaysta.

Työkalut:

1. USB -sarja FTDI -sovitin FT232RL arduino pro minin ohjelmointiin

2. Arduino IDE

3. Android Studio (valinnainen, jos haluat muuttaa itse)

Vaihe 4: Kokoonpano

Kokoonpano
Kokoonpano

Kokoonpano on hyvin yksinkertaista, koska teemme sen leipäpöydällä:)

- asetamme ensin komponentit leipälevylle: mikrokontrolleri, Bluetooth -moduuli ja gyroskooppi

- liitä HC-05 Bluetooth RX- ja TX-nastat arduino 10- ja 11-nastoihin. Gyroskooppi SDA ja SCL tulee liittää arduino A4- ja A5 -nastoihin

- Kytke virtatapit Bluetoothiin, gyroon ja arduinoon. nastat tulee liittää + ja - leipälevyn sivulle

- viimeksi liitä virtalähde (3,3 V - 5 V) leipälevyyn, olen käyttänyt pientä yhden kennon LiPo -akkua, mutta mikä tahansa toimii niin kauan kuin se on tehoalueella

Katso lisätietoja yllä olevista kuvista

Vaihe 5: Pariliitä HC-05 Bluetooth mikroautoon

Pariliitä HC-05 Bluetooth mikroautoon
Pariliitä HC-05 Bluetooth mikroautoon
Pariliitä HC-05 Bluetooth mikroautoon
Pariliitä HC-05 Bluetooth mikroautoon
Pariliitä HC-05 Bluetooth mikroautoon
Pariliitä HC-05 Bluetooth mikroautoon

Tätä varten tarvitset Android-puhelimen, bluetooth-HC-05-moduulin ja sarjakaapelin FTDI-sovittimen. Käytämme myös Arduino IDE: tä kommunikoidaksesi Bluetooth -moduulin kanssa.

Ensin meidän on selvitettävä mikroauton Bluetooth -osoite:

- ota Bluetooth käyttöön puhelimessasi

- Käynnistä auto ja siirry Android -asetusten Bluetooth -osioon

- etsi uusia laitteita ja jonkin laitteen nimeltä "Microcar" pitäisi näkyä

- muodosta pariliitos tämän laitteen kanssa

- sitten poimiaksesi bluetooth MAC: n, olen käyttänyt tätä sovellusta google play -sarjan Bluetooth -päätelaitteesta

Kun olet asentanut tämän sovelluksen, siirry valikkoon -> laitteet ja siellä on luettelo kaikista Bluetooth -pariliitoslaitteista. Olemme kiinnostuneita vain "Microcar" -kaivoksen alla olevasta koodista 00: 06: 66: 49: A0: 4B

Liitä seuraavaksi FTDI -sovitin bluetooth -moduuliin. Ensin VCC- ja GROUND -nastat ja sitten FTDI RX bluetooth TX: lle ja FTDI TX bluetooth RX: lle. Lisäksi Bluetooth -moduulissa pitäisi olla nasta, joka tulisi liittää VCC: hen. Tällöin bluetooth -moduuli siirtyy "ohjelmoitavaan tilaan". Moduulissani on painike, joka yhdistää VCC: n kyseiseen erityiseen nastaan. Kun kytket FTDI: n USB -liitäntään, sinun on kytkettävä nasta / painike, jotta pääset tähän erityiseen ohjelmoitavaan tilaan. Bluetooth vahvistaa tämän toimintatilan siirtymisen vilkkumalla hitaasti 2 sekunnin välein.

Valitse Arduino IDE: ssä sarjaportti ja avaa sitten sarjamonitori (sekä NL että CR 9600 baudinopeudella). Kirjoita AT ja moduulin tulee vahvistaa "OK".

Kirjoita "AT+ROLE = 1" laittaaksesi moduulin isäntätilaan. Muodosta pariliitos bluetooh -moduulin kanssa kirjoittamalla: "AT+BIND = 0006, 66, 49A04B", Huomaa, kuinka "00: 06: 66: 49: A0: 4B" muutetaan muotoon "0006, 66, 49A04B". Sinun pitäisi tehdä sama muutos bluetooh MAC: lle.

Käynnistä nyt Zenwheels -auto ja irrota sitten FTDI -pistoke pistorasiasta ja kytke se uudelleen ilman painiketta painettuna / erikoistappi kytketty. Jonkin ajan kuluttua sen pitäisi muodostaa yhteys autoon ja huomaat auton antavan tietyn yhteyden onnistuneen äänen.

Ongelmien karttoittaminen:

- Huomasin, että kaikista minulla olevista Bluetooth -moduuleista vain se, jossa oli painike, toimi päällikkönä!

- Varmista, että auto on ladattu täyteen

- Varmista, että auto ei ole yhteydessä puhelimeen

- jos Bluetooth siirtyy AT -tilaan (vilkkuu hitaasti), mutta se ei vastaa komentoon, varmista, että sinulla on molemmat NL & CR, ja kokeile myös muita BAUD -taajuuksia

- tarkista, että RX on kytketty TX: hen ja päinvastoin

- kokeile tätä opetusohjelmaa

Vaihe 6: Koodi ja käyttö

Ensin sinun on ladattava ja asennettava kaksi kirjastoa:

1. MPU6050 -kirjasto gyroskoopille

2. I2CDev -kirjaston lähde

Lataa ja asenna sitten kirjasto täältä tai kopioi se alta:

/** * Kirjastot: * 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 tavu komentoStering = 129; const tavu commandSpeed = 130;

boolin alustus = false; // aseta tosi, jos DMP -aloitus onnistui

uint8_t mpuIntStatus; // omistaa todellisen keskeytystilan tavun MPU: sta uint8_t devStatus; // palautustila jokaisen laitteen käytön jälkeen (0 = onnistunut,! 0 = virhe) uint16_t packetSize; // odotettu DMP -paketin koko (oletus on 42 tavua) uint16_t fifoCount; // kaikkien tällä hetkellä FIFO: ssa olevien tavujen määrä uint8_t fifoBuffer [64]; // FIFO -tallennuspuskuri Quaternion q; // [w, x, y, z] kvaternionisäiliö VectorFloat gravity; // [x, y, z] painovoimavektori float ypr [3]; // [yaw, pitch, roll] yaw/pitch/roll säiliö ja painovoimavektori haihtuva bool mpuInterrupt = false; // osoittaa, onko MPU -keskeytystappi korkea

allekirjoittamaton pitkä lastPrintTime, lastMoveTime = 0;

SoftwareSerial BTserial (10, 11);

MPU6050 mpu;

mitätön asennus ()

{Serial.begin (9600); BTserial.begin (38400); Serial.println ("Ohjelma käynnistyi"); alustus = initializeGyroscope (); }

void loop () {

jos (! alustus) {return; } mpuInterrupt = false; mpuIntStatus = mpu.getIntStatus (); fifoCount = mpu.getFIFOCount (); if (hasFifoOverflown (mpuIntStatus, fifoCount)) {mpu.resetFIFO (); palata; } if (mpuIntStatus & 0x02) {while (fifoCount <packetSize) {fifoCount = mpu.getFIFOCount (); } mpu.getFIFOBytes (fifoBuffer, packetSize); fifoCount -= packetSize; mpu.dmpGetQuaternion (& q, fifoBuffer); mpu.dmpGetGravity (& painovoima, & q); mpu.dmpGetYawPitchRoll (ypr, & q ja & gravity); ohjata (ypr [0] * 180/M_PI, ypr [1] * 180/M_PI, ypr [2] * 180/M_PI); }}

/*

* Vastaanottaa kulman 0: sta 180: een, missä 0 on maksimi vasen ja 180 on maksimi oikea millis () - lastMoveTime = 90) {resultAngle = kartta (kulma, 91, 180, 1, 60); } else if (kulma 0) {resultSpeed = kartta (nopeus, 0, 90, 0, 60); } else if (nopeus <0) {resultSpeed = kartta (nopeus, 0, -90, 120, 60); } Serial.print ("factAngle ="); Serial.print (kulma); Serial.print (";"); Serial.print ("factSpeed ="); Serial.print (resultSpeed); Serial.println (";"); BTserial.write (commandStering); BTserial.write (resultAngle); BTserial.write (commandSpeed); BTserial.write ((tavu) resultSpeed); lastMoveTime = millis (); }

tyhjäohjaus (int x, int y, int z)

{x = rajoita (x, -1 * MAX_ANGLE, MAX_ANGLE); y = rajoittaa (y, -1 * MAX_ANGLE, MAX_ANGLE); z = rajoittaa (z, -MAX_ANGLE, MAX_ANGLE); int kulma = kartta (y, -MAX_ANGLE, MAX_ANGLE, 0, 180); int nopeus = kartta (z, -MAX_ANGLE, MAX_ANGLE, 90, -90); printDebug (x, y, z, kulma, nopeus); moveZwheelsCar (kulma, nopeus); }

void printDebug (int x, int y, int z, int kulma, int nopeus)

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

bool InitializeGyroscope ()

{Wire.begin (); mpu.initialize (); Serial.println (mpu.testConnection ()? F ("MPU6050 -yhteys onnistui"): F ("MPU6050 -yhteys epäonnistui")); devStatus = mpu.dmpInitialize (); mpu.setXGyroOffset (220); mpu.setYGyroOffset (76); mpu.setZGyroOffset (-85); mpu.setZAccelOffset (1788); if (devStatus! = 0) {Serial.print (F ("DMP -alustus epäonnistui (koodi))); Serial.println (devStatus); return false;} mpu.setDMPEnabled (true); Serial.println (F (" Käytössä keskeytyksen tunnistus (Arduino ulkoinen keskeytys 0)… ")); attachInterrupt (0, dmpDataReady, RISING); mpuIntStatus = mpu.getIntStatus (); Serial.println (F (" DMP valmis! Odotetaan ensimmäistä keskeytystä … ")); packetSize = mpu.dmpGetFIFOPacketSize (); return true;}

void dmpDataReady ()

{mpuInterrupt = true; }

boolean hasFifoOverflown (int mpuIntStatus, int fifoCount)

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

Lataa koodi FTDI -sovittimella arduinoon ja kytke sitten paristot.

Kaukosäätimen käyttäminen:

Kun arduino on kytketty päälle, käynnistä myös auto. HC-05-moduulin tulee muodostaa yhteys autoon, kun näin tapahtuu, auto lähettää ääntä. Jos se ei toimi, tarkista edellinen vaihe ja vianmääritysosa.

Jos kallistat leipälautaa eteenpäin, auton pitäisi liikkua eteenpäin, oikealle ja auton oikealle. Se suorittaa myös asteittaisempia liikkeitä, kuten kallistumista hieman eteenpäin ja hieman vasemmalle, tässä tapauksessa auto menisi hitaasti vasemmalle.

Jos auto kulkee eri tavalla kallistettaessa leipälautaa, pidä ensin leipälautaa eri suuntiin.

Kuinka se toimii:

Luonnos hakee gyroskoopin koordinaatit 100 ms: n välein, tekee laskutoimituksia ja lähettää sitten auton komennot Bluetoothin kautta. Ensin on olemassa "ohjaava" menetelmä, jota kutsutaan raaka -x-, y- ja z -kulmilla. Tämä menetelmä muuttaa ohjauksen 0 ja 180 asteen välillä ja kiihtyvyyden -90 ja 90 asteen välillä. Tämä menetelmä vaatii

void moveZwheelsCar (tavukulma, sisäinen nopeus), joka muuttaa ohjauksen ja kiihdytyksen ZenWheels -määrityksiksi ja lähettää sitten komennot bluetoothin avulla.

Syy siihen, että tein muutoksen kahdessa vaiheessa, on uudelleenkäytettävyys. jos minun tarvitsisi mukauttaa tätä luonnosta kauko -ohjaukseen johonkin muuhun laitteeseen, aloittaisin perusmenetelmästä "ohjata", joka jo kartoittaa nopeuden ja ohjauksen hyödyllisiin arvoihin.

Vaihe 7: Vaihtoehdot

Vaihtoehto "käänteiselle suunnittelulle". Olen puhunut projektin käänteisestä suunnittelusta aloittamalla Android -sovelluksella. Mutta tähän on vaihtoehto, voit asettaa sarja-FTDI + bluetooth-orja (tavallinen HC-05 määrittämättä pääasetuksia). Yhdistä sitten ZenWheels-sovelluksesta HC-05: een "mikroauton" sijaan.

Komentojen purkamiseksi sinun on pidettävä ohjauspyörää jossain asennossa ja analysoitava sitten sarjaliikenne python -komentosarjan avulla. Ehdotan python -komentosarjaa, koska siinä ei ole tulostettavia merkkejä ja Arduino IDE ei sovellu siihen. Huomaat, että jos pidät pyörää yhdessä asennossa, sovellus lähettää säännöllisesti samat kaksi tavua. Jos vaihdat pyörän asentoa, nyrkkitavu pysyy samana, toinen muuttuu. Monien kokeilujen jälkeen voit keksiä ohjausalgoritmin, sitten käänteisen kaasun jne.

Vaihtoehto arduino -pohjaiselle kaukosäätimelle olisi RaspberryPi -kaukosäädin. Raspberry pi: ssä on upotettu bluetooth -moduuli, joka on kivuton asentaa "master" -tilaan ja python -bluetooth -kirjasto toimii kuin viehätys. Myös muutamia mielenkiintoisempia projekteja on mahdollista, kuten auton ohjaaminen Alexa -kaiun avulla:)

Toivottavasti pidit projektista ja jätä kommentit alle!

Suositeltava: