Satura rādītājs:

Uzlaužama tālvadības pults ZenWheels Microcar: 7 soļi
Uzlaužama tālvadības pults ZenWheels Microcar: 7 soļi

Video: Uzlaužama tālvadības pults ZenWheels Microcar: 7 soļi

Video: Uzlaužama tālvadības pults ZenWheels Microcar: 7 soļi
Video: QuantowGear RC car issues 2/2 2024, Jūnijs
Anonim
Image
Image
Montāža
Montāža

Šajā apmācībā mēs izveidosim pielāgotu tālvadības pulti mikroauto ZenWheels. ZenWheels mikroautomobilis ir 5 cm rotaļu automašīna, kuru var vadīt, izmantojot Android vai Iphone lietojumprogrammu. Es jums parādīšu, kā pārveidot Android lietojumprogrammu, lai uzzinātu par sakaru protokolu un to, kā izveidot ar tālvadības pulti, izmantojot arduino un žiroskopu.

1. darbība: komponenti un rīki

Daļas:

1. ZenWheels mikroauto

2. Arduino pro mini 328p

3. Maizes dēlis

4. MPU6050 žiroskops

5. strāvas avots <= 5 v (daži akumulatori, kurus mēs varam pievienot maizei)

6. U formas džempera kabeļi (pēc izvēles). Esmu izmantojis šos džemperu kabeļus, jo tie labāk izskatās uz maizes dēļa. Tā vietā var izmantot parastos džemperu kabeļus

7. Bluetooth modulis HC-05 (ar pogu AT režīma ievadīšanai)

Rīki:

1. USB uz sērijas FTDI adapteri FT232RL, lai programmētu Arduino pro mini

2. Arduino IDE

3. Android tālrunis

4. Android Studio [pēc izvēles]

2. darbība. ZenWheels Android lietojumprogrammas apgrieztā izstrāde [pēc izvēles]

Lai saprastu šo daļu, ir nepieciešamas zināmas Java un Android zināšanas.

Projekta mērķis ir kontrolēt mikroauto, izmantojot žiroskopu. Šim nolūkam mums ir jāzina vairāk par Bluetooth komunikāciju starp šo rotaļlietu un android lietotni.

Šajā solī es paskaidrošu, kā mainīt inženierijas sakaru protokolu starp mikroauto un Android lietotni. Ja vēlaties tikai izveidot tālvadības pulti, šis solis nav nepieciešams. Viens veids, kā atklāt protokolu, ir apskatīt avota kodu. Hmm, bet tas nav vienkārši, Android lietojumprogrammas tiek apkopotas, un apk var instalēt, izmantojot Google Play.

Tāpēc es esmu izveidojis pamata rokasgrāmatu, kā to izdarīt:

1. Lejupielādējiet APK. Android pakotņu komplekts (īsumā APK) ir pakotnes faila formāts, ko Android operētājsistēma izmanto mobilo lietotņu izplatīšanai un instalēšanai

Vispirms meklējiet lietojumprogrammu Google Play veikalā, mūsu gadījumā meklējiet "zenwheels", un jūs iegūsit lietojumprogrammas saiti

Pēc tam meklējiet google "tiešsaistes apk downloader" un izmantojiet vienu, lai lejupielādētu apk. Parasti viņi lūgs lietotnes saiti (to, ko esam ieguvuši iepriekš), tad mēs nospiedīsim lejupielādes pogu un saglabāsim to savā datorā.

2. Dekompilējiet APK. Mūsu situācijā dekompilētājs ir rīks, kas paņem APK un izveido Java avota kodu.

Vienkāršākais risinājums ir izmantot tiešsaistes dekompilētāju, lai veiktu darbu. Es Google meklēju "tiešsaistes dekompilētājs" un esmu izvēlējies vietni https://www.javadecompilers.com/. Jums vienkārši jāaugšupielādē iepriekš iegūtais APK un

nospiediet dekompilēt. Tad jūs vienkārši lejupielādējat avotus.

3. Mēģiniet mainīt inženieri, meklējot kodu

Lai atvērtu projektu, jums ir nepieciešams teksta redaktors vai labāks IDE (integrēta izstrādes vide). Android projektu noklusējuma IDE ir Android Studio (https://developer.android.com/studio). Pēc Android Studio instalēšanas atveriet projekta mapi.

Tā kā mūsu automašīnu kontrolē Bluetooth, es sāku meklēšanu dekompilētā kodā ar atslēgvārdu "bluetooth", un no konstatētajiem gadījumiem es atklāju, ka saziņa ir saistīta ar "BluetoothSerialService". Ja šī klase apstrādā saziņu, tai ir jābūt nosūtīšanas komandas metodei. Izrādās, ka ir viena rakstīšanas metode, kas sūta datus, izmantojot Bluetooth kanālu:

public void write (baits out)

Šis ir labs sākums, es meklēju.write (tiek izmantota metode, un ir klase "ZenWheelsMicrocar", kas paplašina mūsu "BluetoothSerialService". Šī klase satur lielāko daļu mūsu saziņas loģikas, izmantojot Bluetooth. loģika ir kontrolieros: BaseController un StandardController.

BaseController mums ir pakalpojuma inicializācija, kā arī stūres un droseļvārsta kanālu definīcijas, kanāli patiesībā ir komandu prefiksi, lai norādītu, ka sekos kāda veida komanda:

aizsargāts ZenWheelsMicrocar microcar = jauns ZenWheelsMicrocar (šis, šis.btHandler);

aizsargātas ChannelOutput izejas = {new TrimChannelOutput (ZenWheelsMicrocar. STEERING_CHANNEL), new TrimChannelOutput (ZenWheelsMicrocar. THROTTLE_CHANNEL)};

Standarta kontrollerī stūrēšana tiek veikta:

public void handleSteering (TouchEvent touchEvent) {

… This.microcar.setChannel (stūresOutput.kanāls, stūresOutput.resolveValue ()); }

Analizējot metodi, stūreiOutput.channel ir vērtība 129 (stūrēšanai izmantotais kanāls), un stūresOutput.resolveValue () vērtība var būt no -90 līdz 90. Kanāla vērtība (129) tiek nosūtīta tieši, un stūres vērtība tiek mainīta izmantojot bitu darbības:

private final int value_convert_out (int vērtība) {

Būla negatīvs = nepatiess; ja (vērtība <0) {negatīvs = f6D; } int vērtība2 = vērtība & 63; ja (negatīvs) {atgriešanās vērtība2 | 64; } atgriešanās vērtība2; }

Ir līdzīga metode StandardController sauc

publisks tukšuma rokturis Droseļvārsts (TouchEvent touchEvent)

3. darbība: sastāvdaļas

Daļas:

1. Arduino pro mini 328p 2 $

2. Maizes dēlis

3. MPU6050 žiroskops 1,2 $

4. HC-05 meistara-verga 6 kontaktu modulis 3 $

5. 4 x AA bateriju komplekts ar 4 baterijām

6. U formas džempera kabeļi (pēc izvēles). Esmu izmantojis šos savienojuma kabeļus, jo tie labāk izskatās uz maizes dēļa, un gaismas diodes ir labāk redzamas šādā veidā. Ja jums nav šo kabeļu, varat tos nomainīt ar dupont vadiem.

Iepriekš minētās cenas ir ņemtas no eBay.

Rīki:

1. USB uz sērijas FTDI adapteri FT232RL arduino pro mini programmēšanai

2. Arduino IDE

3. Android Studio (pēc izvēles, ja vēlaties pārveidot inženieriju pats)

4. solis: montāža

Montāža
Montāža

Salikšana ir ļoti vienkārša, jo mēs to darām uz maizes dēļa:)

- vispirms mēs novietojam savus komponentus uz maizes dēļa: mikrokontrolleru, Bluetooth moduli un žiroskopu

- savienojiet HC-05 Bluetooth RX un TX tapas ar arduino 10 un 11 tapām. Žiroskops SDA un SCL jāpievieno arduino A4 un A5 tapām

- savienojiet strāvas tapas ar Bluetooth, žiroskopu un arduino. tapām jābūt savienotām ar + un - maizes dēļa sānos

- pēdējo reizi pievienojiet barošanas bloku (no 3,3 V līdz 5 V) pie maizes dēļa, es esmu izmantojis nelielu viena elementa LiPo akumulatoru, bet jebkurš darbosies tik ilgi, kamēr tas ir jaudas diapazonā

Lūdzu, pārbaudiet iepriekš redzamos attēlus, lai iegūtu sīkāku informāciju

5. darbība: savienojiet pārī HC-05 Bluetooth ar mikroautobusu

Savienojiet pārī Bluetooth HC-05 ar mikroautobusu
Savienojiet pārī Bluetooth HC-05 ar mikroautobusu
Savienojiet pārī Bluetooth HC-05 ar mikroautobusu
Savienojiet pārī Bluetooth HC-05 ar mikroautobusu
Savienojiet pārī Bluetooth HC-05 ar mikroautobusu
Savienojiet pārī Bluetooth HC-05 ar mikroautobusu

Šim nolūkam jums būs nepieciešams Android tālrunis, Bluetooth HC-05 modulis un sērijas FTDI adapteris ar vadiem. Mēs arī izmantosim Arduino IDE, lai sazinātos ar Bluetooth moduli.

Vispirms mums jānoskaidro mikroauto Bluetooth adrese:

- iespējojiet Bluetooth savā tālrunī

- ieslēdziet automašīnu un dodieties uz Android iestatījumu sadaļu Bluetooth

- meklējiet jaunas ierīces un parādīsies kāda ierīce ar nosaukumu "Microcar"

- savienojiet pārī ar šo ierīci

- tad, lai iegūtu Bluetooth MAC, esmu izmantojis šo lietotni no Google Play sērijas Bluetooth termināļa

Pēc šīs lietotnes instalēšanas dodieties uz izvēlni -> ierīces, un tur jums būs saraksts ar visām Bluetooth pārī savienotajām ierīcēm. Mūs interesē tikai kods zem raktuves "Microcar" 00: 06: 66: 49: A0: 4B

Pēc tam pievienojiet FTDI adapteri Bluetooth modulim. Vispirms VCC un GROUND tapas un pēc tam FTDI RX uz Bluetooth TX un FTDI TX uz Bluetooth RX. Arī uz Bluetooth moduļa jābūt piespraudei, kas jāpievieno VCC. To darot, Bluetooth modulis pāriet "programmējamā režīmā". Manam modulim ir poga, kas savieno VCC ar šo īpašo tapu. Pievienojot FTDI USB, tam vajadzētu būt ar piespiestu tapu / pogu, lai ieietu šajā īpašajā programmējamajā režīmā. Bluetooth apstiprina ieiešanu šajā darbības režīmā, lēni mirgot ik pēc 2 sekundēm.

Arduino IDE atlasiet seriālo portu, pēc tam atveriet seriālo monitoru (gan NL, gan CR ar 9600 batu pārraides ātrumu). Ierakstiet AT un modulim jāapstiprina ar "OK".

Ievadiet “AT+ROLE = 1”, lai moduli ieslēgtu galvenajā režīmā. Lai izveidotu savienojumu pārī ar bluetooh moduli, rakstiet: "AT+BIND = 0006, 66, 49A04B", ievērojiet, kā mūsu "00: 06: 66: 49: A0: 4B" tiek pārveidots par "0006, 66, 49A04B". Nu, jums vajadzētu darīt to pašu pārveidojumu arī jūsu bluetooh MAC.

Tagad ieslēdziet automašīnu Zenwheels, pēc tam atvienojiet FTDI un pievienojiet to vēlreiz, nenospiežot pogu / nepievienojot īpašu tapu. Pēc kāda laika tam vajadzētu izveidot savienojumu ar automašīnu, un jūs pamanīsit, ka automašīna rada veiksmīgu savienojumu.

Problēmu novēršana:

- Es atklāju, ka no visiem Bluetooth moduļiem, kas man bija, tikai viens ar pogu strādāja par meistaru!

- pārliecinieties, ka automašīna ir pilnībā uzlādēta

- pārliecinieties, vai automašīna nav savienota ar tālruni

- ja Bluetooth ieslēdzas AT režīmā (mirgo lēni), bet tas nereaģē uz komandu, pārliecinieties, ka jums ir gan NL, gan CR, kā arī eksperimentējiet ar citiem BAUD ātrumiem

- vēlreiz pārbaudiet, vai RX ir pievienots TX un otrādi

- izmēģiniet šo apmācību

6. darbība: kods un lietošana

Vispirms jums ir jālejupielādē un jāinstalē divas bibliotēkas:

1. MPU6050 bibliotēka žiroskopam

2. I2CDev bibliotēkas avots

Pēc tam lejupielādējiet un instalējiet manu bibliotēku no šejienes vai nokopējiet to no apakšas:

/** * Bibliotēkas: * 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 baitu komandaStering = 129; const baitu komandaSpeed = 130;

bool inicializācija = nepatiesa; // iestatīt patiesu, ja DMP iniciators bija veiksmīgs

uint8_t mpuIntStatus; // satur faktisko pārtraukšanas statusa baitu no MPU uint8_t devStatus; // atgriešanās statuss pēc katras ierīces darbības (0 = veiksme,! 0 = kļūda) uint16_t packetSize; // paredzamais DMP paketes izmērs (noklusējums ir 42 baiti) uint16_t fifoCount; // visu baitu skaits, kas pašlaik atrodas FIFO uint8_t fifoBuffer [64]; // FIFO krātuves buferis Quaternion q; // [w, x, y, z] kvaterniona konteiners VectorFloat gravity; // [x, y, z] gravitācijas vektora pludiņš ypr [3]; // [pagrieziens, slīpums, rullis] satricinājums/slīpuma/ruļļa konteiners un gravitācijas vektors gaistošs bools mpuInterrupt = false; // norāda, vai MPU pārtraukšanas tapa ir paaugstinājusies

neparakstīts garš lastPrintTime, lastMoveTime = 0;

SoftwareSerial BTserial (10, 11);

MPU6050 mpu;

anulēts iestatījums ()

{Sērijas sākums (9600); BTserial.begin (38400); Serial.println ("Programma sākta"); inicializācija = initializeGyroscope (); }

void loop () {

ja (! inicializācija) {return; } mpuInterrupt = nepatiess; mpuIntStatus = mpu.getIntStatus (); fifoCount = mpu.getFIFOCount (); if (hasFifoOverflown (mpuIntStatus, fifoCount)) {mpu.resetFIFO (); atgriešanās; } if (mpuIntStatus & 0x02) {while (fifoCount <packetSize) {fifoCount = mpu.getFIFOCount (); } mpu.getFIFOBytes (fifoBuffer, packetSize); fifoCount -= packetSize; mpu.dmpGetQuaternion (& q, fifoBuffer); mpu.dmpGetGravity (& gravitācija, & q); mpu.dmpGetYawPitchRoll (ypr, & q, & gravity); stūrēt (ypr [0] * 180/M_PI, ypr [1] * 180/M_PI, ypr [2] * 180/M_PI); }}

/*

* Saņem leņķi no 0 līdz 180, kur 0 ir maksimāli pa kreisi un 180 ir maksimāli pa labi millis () - lastMoveTime = 90) {resultAngle = karte (leņķis, 91, 180, 1, 60); } cits if (leņķis 0) {resultSpeed = karte (ātrums, 0, 90, 0, 60); } cits if (ātrums <0) {resultSpeed = karte (ātrums, 0, -90, 120, 60); } Serial.print ("factAngle ="); Serial.print (leņķis); Serial.print (";"); Serial.print ("factSpeed ="); Serial.print (resultSpeed); Serial.println (";"); BTserial.write (commandStering); BTserial.write (resultAngle); BTserial.write (commandSpeed); BTserial.write ((baits) resultSpeed); lastMoveTime = milis (); }

tukšs stūris (int x, int y, int z)

{x = ierobežot (x, -1 * MAX_ANGLE, MAX_ANGLE); y = ierobežot (y, -1 * MAX_ANGLE, MAX_ANGLE); z = ierobežot (z, -MAX_ANGLE, MAX_ANGLE); int leņķis = karte (y, -MAX_ANGLE, MAX_ANGLE, 0, 180); int ātrums = karte (z, -MAX_ANGLE, MAX_ANGLE, 90, -90); printDebug (x, y, z, leņķis, ātrums); moveZwheelsCar (leņķis, ātrums); }

void printDebug (int x, int y, int z, int leņķis, int ātrums)

{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 (";"); Sērijas nospiedums ("leņķis ="); Sērijas nospiedums (leņķis); Sērijas nospiedums (";"); Serial.print ("speed ="); Serial.print (speed); Serial.println (";"); lastPrintTime = milis (); }

bool initializeGyroscope ()

{Wire.begin (); mpu.initialize (); Serial.println (mpu.testConnection ()? F ("MPU6050 savienojums izdevies"): F ("MPU6050 savienojums neizdevās")); devStatus = mpu.dmpInitialize (); mpu.setXGyroOffset (220); mpu.setYGyroOffset (76); mpu.setZGyroOffset (-85); mpu.setZAccelOffset (1788); if (devStatus! = 0) {Serial.print (F ("DMP inicializācija neizdevās (kods))); Serial.println (devStatus); atgriezt nepatiesu;} mpu.setDMPEnabled (true); Serial.println (F (" Iespējo pārtraukuma noteikšana (Arduino ārējais pārtraukums 0)… ")); attachInterrupt (0, dmpDataReady, RISING); mpuIntStatus = mpu.getIntStatus (); Serial.println (F (" DMP gatavs! Gaida pirmo pārtraukumu … ")); packetSize = mpu.dmpGetFIFOPacketSize (); atgriezt patiesu;}

void dmpDataReady ()

{mpuInterrupt = true; }

Būla hasFifoOverflown (int mpuIntStatus, int fifoCount)

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

Augšupielādējiet kodu, izmantojot FTDI adapteri, arduino, pēc tam pievienojiet baterijas.

Izmantojot tālvadības pulti:

Pēc arduino ieslēgšanas ieslēdziet arī automašīnu. Modulim HC-05 vajadzētu pieslēgties automašīnai, ja tas notiek, automašīna izstaro skaņu. Ja tas nedarbojas, lūdzu, pārbaudiet iepriekšējo darbību un problēmu novēršanas sadaļu.

Ja jūs noliekat maizes dēli uz priekšu, automašīnai jāvirzās uz priekšu, pa labi un automašīnai jāpārvietojas pa labi. Tas arī veic pakāpeniskākas kustības, piemēram, nedaudz noliecoties uz priekšu un mazliet pa kreisi, šajā gadījumā automašīna lēnām iet pa kreisi.

Ja automašīna pārvietojas citādi, noliekot maizes dēli, vispirms turiet maizes dēli dažādos virzienos.

Kā tas strādā:

Skice iegūst žiroskopa koordinātas ik pēc 100 ms, veic aprēķinus un pēc tam Bluetooth pārraida automašīnas komandas. Vispirms ir "stūrēšanas" metode, kas tiek izsaukta ar neapstrādātiem x, y un z leņķiem. Šī metode pārveido stūrēšanu no 0 līdz 180 grādiem un paātrinājumu no -90 līdz 90. Šī metode izsauc

void moveZwheelsCar (baitu leņķis, int ātrums), kas pārvērš stūrēšanu un paātrinājumu par ZenWheels specifikācijām un pēc tam pārraida komandas, izmantojot Bluetooth.

Iemesls, kāpēc esmu veicis pārveidošanu divos posmos, ir atkārtota izmantošana. ja man būtu jāpielāgo šī skice kādas citas ierīces tālvadībai, es sāktu no pamatmetodes "stūrēt", kas jau kartē ātrumu un stūrēšanu līdz dažām noderīgām vērtībām.

7. solis: alternatīvas

Alternatīva "reversajai inženierijai". Esmu runājis par to, kā mainīt projektu, sākot ar Android lietojumprogrammu. Bet tam ir alternatīva, jūs varat iestatīt sērijas FTDI + bluetooth vergu (parasts HC-05, nenorādot galvenos iestatījumus). Pēc tam no lietotnes ZenWheels izveidojiet savienojumu ar HC-05, nevis "mikroauto".

Lai atšifrētu komandas, jums jāuztur stūre noteiktā stāvoklī, pēc tam, izmantojot python skriptu, analizējiet sērijas sakarus. Es iesaku python skriptu, jo ir nedrukājamas rakstzīmes, un Arduino IDE tam nav piemērots. Jūs ievērosiet, ka, turot riteni vienā pozīcijā, lietotne regulāri pārraidīs tos pašus divus baitus. Ja maināt riteņa pozīciju, dūres baits nemainīsies, otrais mainīsies. Pēc daudziem izmēģinājumiem jūs varat nākt klajā ar stūres algoritmu, pēc tam atpakaļgaitas inženiera droseļvārstu utt.

Alternatīva arduino balstītai tālvadības pultij būtu RaspberryPi tālvadības pults. Raspberry pi ir iebūvēts Bluetooth modulis, kuru ir nesāpīgi iestatīt "master" režīmā, un python bluetooth bibliotēka darbojas kā šarms. Ir iespējami arī daži interesantāki projekti, piemēram, automašīnas vadīšana, izmantojot Alexa echo:)

Es ceru, ka jums patika projekts, un, lūdzu, atstājiet komentārus zemāk!

Ieteicams: