Tartalomjegyzék:

Feltörhető távirányító a ZenWheels Microcar számára: 7 lépés
Feltörhető távirányító a ZenWheels Microcar számára: 7 lépés

Videó: Feltörhető távirányító a ZenWheels Microcar számára: 7 lépés

Videó: Feltörhető távirányító a ZenWheels Microcar számára: 7 lépés
Videó: 1:76 Super Mini Fully Proportional Control Mini RC Car #shorts #shortvideo #rccar #remotecontrol 2024, Június
Anonim
Image
Image
Összeszerelés
Összeszerelés

Ebben az oktatóanyagban egyedi távirányítót fogunk készíteni a ZenWheels mikroautóhoz. A ZenWheels mikrokocsi egy 5 cm -es játékautó, amely Android vagy iPhone alkalmazáson keresztül vezérelhető. Megmutatom, hogyan lehet visszafordítani az Android alkalmazást, hogy megtudja a kommunikációs protokollt, és hogyan építhet távirányítót arduino és giroszkóp segítségével.

1. lépés: Alkatrészek és eszközök

Alkatrészek:

1. A ZenWheels mikrokocsi

2. Arduino pro mini 328p

3. Kenyeretábla

4. MPU6050 giroszkóp

5. áramforrás <= 5 v (néhány elem, amelyet a kenyérlapra rögzíthetünk)

6. U alakú áthidaló kábelek (opcionális). Azért használtam ezeket az áthidaló kábeleket, mert jobban néznek ki a kenyértáblán. Helyette szokásos áthidaló kábelek használhatók

7. HC-05 bluetooth modul (az AT módba való belépéshez szükséges gombbal)

Eszközök:

1. USB -soros FTDI adapter FT232RL az Arduino pro mini programozásához

2. Arduino IDE

3. Android telefon

4. Android Studio [opcionális]

2. lépés: A ZenWheels Android -alkalmazás fordított tervezése [opcionális]

Ennek a résznek a megértéséhez némi Java- és Android -ismeret szükséges.

A projekt célja a mikrokocsi giroszkóp segítségével történő vezérlése. Ehhez többet kell megtudnunk a játék és az Android -alkalmazás közötti bluetooth kommunikációról.

Ebben a lépésben elmagyarázom, hogyan lehet visszafordítani a mikrokocsi és az Android -alkalmazás közötti kommunikációs protokollt. Ha csak a távirányítót szeretné megépíteni, ez a lépés nem szükséges. A protokoll felfedezésének egyik módja a forráskód megtekintése. Hmm, de ez nem egyenes előre, androidos alkalmazásokat állítunk össze, és telepíthetjük az apk -t a Google Playen keresztül.

Tehát elkészítettem egy alapvető útmutatót ehhez:

1. Töltse le az APK -t. Az Android Package Kit (röviden APK) az a csomagfájl -formátum, amelyet az Android operációs rendszer használ a mobilalkalmazások terjesztéséhez és telepítéséhez

Először keresse meg az alkalmazást a Google Play Áruházban, esetünkben keressen "zenwheels", és megkapja az alkalmazás linkjét

Ezután keressen rá a Google -on az "online apk downloader" kifejezésre, és töltse le az apk -t. Általában kérik az alkalmazás linkjét (amit korábban beszereztünk), majd megnyomunk egy letöltés gombot, és elmentjük a számítógépünkre.

2. Fordítsa le az APK -t. A helyzetünkben egy dekompiler egy olyan eszköz, amely felveszi az APK -t és Java forráskódot állít elő.

A legegyszerűbb megoldás egy online dekompresszor használata a feladat elvégzéséhez. Kerestem a google -ban az "online decompliler" kifejezést, és a https://www.javadecompilers.com/ webhelyet választottam. Csak fel kell töltenie a korábban beszerzett APK -t és

nyomja meg a decompile -t. Ezután töltse le a forrásokat.

3. Próbálja megfordítani a kódot

A projekt megnyitásához szövegszerkesztőre vagy jobb IDE -re (integrált fejlesztői környezetre) van szükség. Az Android -projektek alapértelmezett IDE -je az Android Studio (https://developer.android.com/studio). Az Android Studio telepítése után nyissa meg a projektmappát.

Mivel autónkat bluetooth vezérli, a keresést a dekompilált kódban a "bluetooth" kulcsszóval kezdtem, az előfordulásból azt találtam, hogy a "BluetoothSerialService" kezelte a kommunikációt. Ha ez az osztály kezeli a kommunikációt, akkor rendelkeznie kell küldési paranccsal. Kiderült, hogy van egy írási módszer, amely adatokat küld a Bluetooth -csatornán keresztül:

public void write (byte ki)

Ez egy jó kezdet, megkerestem a.write (használt módszert, és van egy "ZenWheelsMicrocar" osztály, amely kiterjeszti a "BluetoothSerialService" szolgáltatást. Ez az osztály tartalmazza a Bluetooth -on keresztüli kommunikáció logikájának nagy részét. a logika a vezérlőkben van: BaseController és StandardController.

A BaseControllerben megtalálható a szolgáltatás inicializálása, valamint a kormányzás és a fojtószelep csatornák meghatározása, a csatornák valójában parancs -előtagok, amelyek meghatározzák, hogy bizonyos típusú parancsok következzenek:

védett ZenWheelsMicrocar mikrokocsi = új ZenWheelsMicrocar (ez, ez.btHandler);

védett ChannelOutput kimenetek = {új TrimChannelOutput (ZenWheelsMicrocar. STEERING_CHANNEL), új TrimChannelOutput (ZenWheelsMicrocar. THROTTLE_CHANNEL)};

A StandardControllerben a kormányzás a következőképpen történik:

public void handleKormányzás (TouchEvent touchEvent) {

… This.microcar.setChannel (ohjausOutput.csatorna, kormányOutput.resolveValue ()); }

A metódus elemzése során a bitenkénti műveletek alkalmazásával:

private final int value_convert_out (int érték) {

logikai negatív = hamis; if (érték <0) {negatív = f6D; } int érték2 = érték & 63; ha (negatív) {visszatérési érték2 | 64; } visszatérési érték2; }

Van egy hasonló módszer a StandardControllerben, az ún

public void fogantyú Gáz (TouchEvent touchEvent)

3. lépés: Alkatrészek

Alkatrészek:

1. Arduino pro mini 328p 2 $

2. Kenyeretábla

3. MPU6050 giroszkóp 1,2 $

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

5. 4 x AA elemcsomag 4 elemmel

6. U alakú áthidaló kábelek (opcionális). Azért használtam ezeket az áthidaló kábeleket, mert jobban néznek ki a kenyértáblán, és a LED -ek így jobban láthatók. Ha nincsenek ezek a kábelek, kicserélheti őket dupont vezetékekre.

A fenti árak az eBay -ről származnak.

Eszközök:

1. USB -soros FTDI adapter FT232RL az arduino pro mini programozásához

2. Arduino IDE

3. Android Studio (opcionális, ha meg szeretné változtatni magát)

4. lépés: Összeszerelés

Összeszerelés
Összeszerelés

Az összeszerelés nagyon egyszerű, mert kenyérsütőn csináljuk:)

- először helyezzük el a komponenseket a kenyértáblára: a mikrokontrollert, a Bluetooth modult és a giroszkópot

- csatlakoztassa a HC-05 bluetooth RX és TX csapokat az arduino 10 és 11 érintkezőkhöz. Az SDA és SCL giroszkópot az arduino A4 és A5 csapokhoz kell csatlakoztatni

- Csatlakoztassa a tápcsatlakozókat a bluetooth -hoz, a giroszkóphoz és az arduino -hoz. a csapokat a kenyértábla oldalán lévő + és - jelhez kell csatlakoztatni

- utoljára csatlakoztasson egy tápegységet (3,3 V és 5 V között) a kenyértáblához, kicsi LiPo egycellás akkumulátort használtam, de bármelyik megteszi, amíg a teljesítménytartományban van

Kérjük, nézze meg a fenti képeket a további részletekért

5. lépés: Párosítsa a HC-05 Bluetooth-ot a mikrokocsival

Párosítsa a HC-05 Bluetooth-ot a mikrokocsival
Párosítsa a HC-05 Bluetooth-ot a mikrokocsival
Párosítsa a HC-05 Bluetooth-ot a mikrokocsival
Párosítsa a HC-05 Bluetooth-ot a mikrokocsival
Párosítsa a HC-05 Bluetooth-ot a mikrokocsival
Párosítsa a HC-05 Bluetooth-ot a mikrokocsival

Ehhez szüksége lesz egy Android telefonra, a Bluetooth HC-05 modulra és a soros FTDI adapterre. Továbbá az Arduino IDE -t fogjuk használni a bluetooth modullal való kommunikációhoz.

Először meg kell találnunk a mikrokocsi Bluetooth címét:

- engedélyezze a Bluetooth -ot a telefonján

- kapcsolja be az autót, és lépjen az Android beállításainak bluetooth szakaszába

- új eszközök keresése, és megjelenik egy "Microcar" nevű eszköz

- párosítsa ezzel az eszközzel

- majd a bluetooth MAC kinyeréséhez ezt az alkalmazást használtam a Google Play Serial Bluetooth Terminal -ból

Az alkalmazás telepítése után lépjen a menü -> eszközök menüpontra, és megjelenik egy lista az összes Bluetooth párosított eszközzel. Csak a "Microcar" bánya alatti kódra vagyunk kíváncsiak: 00: 06: 66: 49: A0: 4B

Ezután csatlakoztassa az FTDI adaptert a bluetooth modulhoz. Először a VCC és a GROUND csapok, majd az FTDI RX a Bluetooth TX és az FTDI TX a Bluetooth RX. Ezenkívül egy tűnek kell lennie a Bluetooth modulon, amelyet a VCC -hez kell csatlakoztatni. Ezzel a Bluetooth modul "programozható módba" lép. A modulom rendelkezik egy gombbal, amely összeköti a VCC -t a speciális tűvel. Ha az FTDI -t az USB -hez csatlakoztatja, akkor a tűt / gombot kell lenyomni, hogy belépjen ebbe a speciális programozható módba. A Bluetooth 2 másodpercenként lassan villogva erősíti meg, hogy belép ebbe az üzemmódba.

Az Arduino IDE -ben válassza ki a soros portot, majd nyissa meg a soros monitort (NL és CR egyaránt 9600 baud sebességgel). Írja be az AT parancsot, és a modulnak az "OK" gombbal kell megerősítenie.

Írja be az "AT+ROLE = 1" parancsot a modul master módba állításához. A bluetooh modullal való párosításhoz írja be: "AT+BIND = 0006, 66, 49A04B", Figyelje meg, hogyan alakul át a "00: 06: 66: 49: A0: 4B" a "0006, 66, 49A04B" formátumba. Nos, ugyanezt az átalakítást kell elvégeznie a bluetooh MAC esetében is.

Most kapcsolja be a Zenwheels autót, majd húzza ki az FTDI -t, és dugja be újra, anélkül, hogy megnyomná a gombot / nincs csatlakoztatva speciális csap. Egy idő után csatlakoznia kell az autóhoz, és észre kell vennie, hogy az autó sikeres hangot ad ki.

Hibaelhárítás:

- Azt tapasztaltam, hogy az összes Bluetooth modulom közül, amivel rendelkezem, csak a gombos modul működik mesterként!

- győződjön meg arról, hogy az autó teljesen fel van töltve

- győződjön meg arról, hogy az autó nincs csatlakoztatva a telefonhoz

- ha a Bluetooth AT üzemmódba lép (lassan villog), de nem reagál a parancsra, győződjön meg arról, hogy mindkettő NL & CR, és kísérletezzen más BAUD sebességgel

- ismételten ellenőrizze, hogy az RX csatlakoztatva van -e a TX -hez, és fordítva

- próbáld ki ezt az oktatóanyagot

6. lépés: Kód és használat

Először le kell töltenie és telepítenie kell két könyvtárat:

1. MPU6050 könyvtár a giroszkóphoz

2. I2CDev könyvtár forrás

Ezután töltse le és telepítse a könyvtáramat innen, vagy másolja le alulról:

/** * Könyvtárak: * 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 bájt parancsStering = 129; const bájt parancsSpeed = 130;

bool inicializálás = hamis; // igazítsa be, ha a DMP init sikeres volt

uint8_t mpuIntStatus; // tényleges megszakítási állapot bájtot tartalmaz az MPU -ból uint8_t devStatus; // visszatérési állapot minden eszközművelet után (0 = siker,! 0 = hiba) uint16_t packetSize; // várható DMP csomagméret (alapértelmezett 42 bájt) uint16_t fifoCount; // az összes bájt száma a FIFO -ban uint8_t fifoBuffer [64]; // FIFO tárolópuffer Quaternion q; // [w, x, y, z] kvaternion konténer VectorFloat gravity; // [x, y, z] gravitációs vektor float ypr [3]; // [rázkódás, dőlésszög, tekerés] rázkódás/dőlés/tekercstartály és gravitációs vektor illékony bool mpuInterrupt = false; // jelzi, hogy az MPU megszakító csapja magasra emelkedett -e

unsigned long lastPrintTime, lastMoveTime = 0;

SoftwareSerial BTserial (10, 11);

MPU6050 mpu;

üres beállítás ()

{Serial.begin (9600); BTserial.begin (38400); Serial.println ("A program elindult"); inicializálás = inicializálásGyroscope (); }

void loop () {

if (! inicializálás) {return; } mpuInterrupt = hamis; mpuIntStatus = mpu.getIntStatus (); fifoCount = mpu.getFIFOCount (); if (hasFifoOverflown (mpuIntStatus, fifoCount)) {mpu.resetFIFO (); Visszatérés; } if (mpuIntStatus & 0x02) {while (fifoCount <packetSize) {fifoCount = mpu.getFIFOCount (); } mpu.getFIFOBytes (fifoBuffer, packetSize); fifoCount -= packetSize; mpu.dmpGetQuaternion (& q, fifoBuffer); mpu.dmpGetGravity (& gravitáció, & q); mpu.dmpGetYawPitchRoll (ypr, & q, & gravitáció); kormányozni (ypr [0] * 180/M_PI, ypr [1] * 180/M_PI, ypr [2] * 180/M_PI); }}

/*

* 0 és 180 közötti szöget kap, ahol 0 a maximális bal és 180 a maximális jobb * Sebességet kap -90 és 90 között, ahol -90 a legnagyobb hátra és 90 a maximális előre */ void moveZwheelsCar (bájtos szög, belső sebesség) {if (millis () - lastMoveTime = 90) {resultAngle = map (szög, 91, 180, 1, 60); } else if (0 szög) {resultSpeed = térkép (sebesség, 0, 90, 0, 60); } else if (sebesség <0) {resultSpeed = térkép (sebesség, 0, -90, 120, 60); } Soros.nyomtatás ("ténylegesAngle ="); Soros.nyomtatás (szög); Sorosnyomat (";"); Serial.print ("ténylegesSpeed ="); Serial.print (eredménySpeed); Serial.println (";"); BTserial.write (commandStering); BTserial.write (resultAngle); BTserial.write (commandSpeed); BTserial.write ((byte) resultSpeed); lastMoveTime = millis (); }

üres kormányzás (int x, int y, int z)

{x = kényszer (x, -1 * MAX_ANGLE, MAX_ANGLE); y = kényszerít (y, -1 * MAX_ANGLE, MAX_ANGLE); z = korlátozás (z, -MAX_ANGLE, MAX_ANGLE); int szög = térkép (y, -MAX_ANGLE, MAX_ANGLE, 0, 180); int sebesség = térkép (z, -MAX_ANGLE, MAX_ANGLE, 90, -90); printDebug (x, y, z, szög, sebesség); moveZwheelsCar (szög, sebesség); }

void printDebug (int x, int y, int z, int szög, int sebesség)

{if (millis () - lastPrintTime <1000) {return; } Serial.print ("z ="); Serial.print (x); Serial.print (";"); Soros.nyomtatás ("y ="); Soros.nyomtatás (y); Soros.nyomtatás (";"); Soros.nyomtatás ("z ="); Soros.nyomtatás (z); Soros.nyomtatás (";"); Soros.nyomtatás ("szög ="); Soros.nyomat (szög); Soros.nyomtatás (";"); Serial.print ("speed ="); Serial.print (speed); Serial.println (";"); lastPrintTime = millis (); }

bool inicializálása Giroszkóp ()

{Wire.begin (); mpu.initialize (); Serial.println (mpu.testConnection ()? F ("Az MPU6050 kapcsolat sikeres"): F ("Az MPU6050 kapcsolat sikertelen")); devStatus = mpu.dmpInitialize (); mpu.setXGyroOffset (220); mpu.setYGyroOffset (76); mpu.setZGyroOffset (-85); mpu.setZAccelOffset (1788); if (devStatus! = 0) {Serial.print (F ("A DMP inicializálása nem sikerült (kód"))); Serial.println (devStatus); return false;} mpu.setDMPEnabled (true); Serial.println (F ("Engedélyezés megszakítás észlelése (Arduino külső megszakítás 0)… ")); attachInterrupt (0, dmpDataReady, RISING); mpuIntStatus = mpu.getIntStatus (); Serial.println (F (" DMP kész! Várakozás az első megszakításra … ")); packetSize = mpu.dmpGetFIFOPacketSize (); return true;}

void dmpDataReady ()

{mpuInterrupt = igaz; }

boolean hasFifoOverflown (int mpuIntStatus, int fifoCount)

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

Töltse fel a kódot az FTDI adapter segítségével az arduino -hoz, majd csatlakoztassa az elemeket.

A távirányító használata:

Az arduino bekapcsolása után kapcsolja be az autót is. A HC-05 modulnak csatlakoznia kell az autóhoz, ha ez megtörténik, az autó hangot ad ki. Ha nem működik, ellenőrizze az előző lépést és a hibaelhárítási részt.

Ha előrehajtja a kenyértáblát, az autónak előre, jobbra és az autónak jobbra kell haladnia. Ezenkívül fokozatosabb mozdulatokat is végez, például egy kicsit előre és balra dőlve, ebben az esetben az autó lassan balra haladna.

Ha az autó más irányba megy a kenyérsütő lejtésekor, először tartsa a kenyértáblát különböző irányokba.

Hogyan működik:

A vázlat 100 ms -onként megkapja a giroszkóp koordinátáit, számításokat végez, majd Bluetooth -on továbbítja az autóparancsokat. Először is van egy "kormányzás" módszer, amelyet a nyers x, y és z szögekkel hívnak meg. Ez a módszer a kormányzást 0 és 180 fok között, a gyorsulást pedig -90 és 90 fok között változtatja

void moveZwheelsCar (bájtszög, belső sebesség), amely a kormányzást és a gyorsítást a ZenWheels specifikációjává alakítja, majd a parancsokat bluetooth segítségével továbbítja.

Az ok, amiért két lépésben végeztem az átalakítást, az újrafelhasználhatóság. ha ezt a vázlatot más eszközök távvezérléséhez kell igazítanom, akkor a "kormányzás" alapmódszerből indulnék ki, amely már a sebességet és a kormányzást leképezi néhány hasznos értékre.

7. lépés: Alternatívák

Alternatíva a "fordított tervezéshez". Beszéltem arról, hogyan lehet visszafordítani a projektet az Android alkalmazással. De van alternatíva is, ha beállíthat egy soros FTDI + bluetooth slave-t (normál HC-05 a mesterbeállítások megadása nélkül). Ezután a ZenWheels alkalmazásból csatlakozzon a HC-05-hez a "mikrokocsi" helyett.

A parancsok dekódolásához a kormányt kell valamilyen helyzetben tartani, majd python -szkript segítségével elemezni kell a soros kommunikációt. Azért javaslok egy python szkriptet, mert vannak nem nyomtatható karakterek, és az Arduino IDE nem alkalmas erre. Megfigyelheti, hogy ha a kormányt egy pozícióban tartja, az alkalmazás rendszeresen ugyanazt a két bájtot továbbítja. Ha megváltoztatja a kerék helyzetét, az első bájt ugyanaz marad, a második pedig megváltozik. Sok kísérlet után előállhat a kormányzási algoritmussal, majd a fordított mérnöki gázzal stb.

Az arduino alapú távirányító alternatívája a RaspberryPi távirányító lenne. A Raspberry pi rendelkezik egy beágyazott Bluetooth modullal, amelyet fájdalommentesen lehet beállítani a "master" módban, és a python bluetooth könyvtár varázsként működik. Emellett néhány érdekesebb projekt is lehetséges, például az autó vezérlése az Alexa echo segítségével:)

Remélem tetszett a projekt, és kérjük, írja meg megjegyzéseit az alábbiakban!

Ajánlott: