INHOUDSOPGAWE:

Afneembare afstandsbediening vir ZenWheels mikrokar: 7 stappe
Afneembare afstandsbediening vir ZenWheels mikrokar: 7 stappe

Video: Afneembare afstandsbediening vir ZenWheels mikrokar: 7 stappe

Video: Afneembare afstandsbediening vir ZenWheels mikrokar: 7 stappe
Video: Hoe sluit ik een soundbar aan op mijn TV? 2024, November
Anonim
Image
Image
Vergadering
Vergadering

In hierdie handleiding gaan ons 'n pasgemaakte afstandsbediening vir die ZenWheels -mikrowa bou. Die ZenWheels -mikrokar is 'n speelgoedmotor van 5 cm wat deur 'n Android- of Iphone -toepassing bestuur kan word. Ek gaan u wys hoe u die Android -toepassing agteruit kan ontwerp om meer te wete te kom van die kommunikasieprotokol en hoe u 'n afstandsbediening met arduino en 'n gyroscoop kan bou.

Stap 1: Komponente en gereedskap

Dele:

1. Die ZenWheels -mikrokar

2. Arduino pro mini 328p

3. Broodbord

4. MPU6050 gyroscoop

5. kragbron <= 5 v ('n battery wat ons aan die broodbord kan koppel)

6. U-vormige trukkabels (opsioneel). Ek het hierdie springkabels gebruik, want dit lyk beter op die broodbord. Gewone springkabels kan in plaas daarvan gebruik word

7. HC-05 bluetooth-module (met 'n knoppie om na die AT-modus te gaan)

Gereedskap:

1. USB na seriële FTDI -adapter FT232RL om die Arduino pro mini te programmeer

2. Arduino IDE

3. Android -selfoon

4. Android Studio [opsioneel]

Stap 2: Reverse Engineering die ZenWheels Android -toepassing [opsioneel]

'N Kennis van Java en Android is nodig om hierdie gedeelte te verstaan.

Die doel van die projek is om die mikrokar met 'n gyroscoop te beheer. Hiervoor moet ons meer uitvind oor die Bluetooth -kommunikasie tussen hierdie speelding en die Android -app.

In hierdie stap sal ek verduidelik hoe u die kommunikasieprotokol tussen die mikrowa en die Android -app kan omskakel. As u net die afstandbeheer wil bou, is hierdie stap nie nodig nie. Een manier om die protokol te ontdek, is om na die bronkode te kyk. Hmm, maar dit is nie reguit nie, Android -toepassings word saamgestel en u kan die APK via Google Play installeer.

Daarom het ek 'n basiese gids hiervoor opgestel:

1. Laai die APK af. 'N Android -pakketstel (kortweg APK) is die pakketlêerformaat wat deur die Android -bedryfstelsel gebruik word vir die verspreiding en installering van mobiele programme

Soek eers die toepassing in Google Play Store, soek in ons geval na "zenwheels" en u kry die aansoekskakel

Soek dan op Google na 'online apk downloader' en gebruik een om die apk af te laai. Gewoonlik sal hulle die aansoekskakel (die een wat ons vroeër gekry het) vra, dan druk ons op die aflaai -knoppie en stoor dit op ons rekenaar.

2. Dekompileer die APK. 'N Dekompilator in ons situasie is 'n instrument wat die APK neem en Java -bronkode produseer.

Die eenvoudigste oplossing is om 'n aanlyn dekompiler te gebruik om die werk te doen. Ek het op google gesoek na 'online decompliler' en ek het https://www.javadecompilers.com/ gekies. U hoef net die APK op te laai wat u vroeër gekry het en

druk op die dekompiler. Dan laai u net die bronne af.

3. Probeer om reverse engineer deur die kode te kyk

Om die projek oop te maak, benodig u 'n teksredakteur of beter 'n IDE (geïntegreerde ontwikkelingsomgewing). Die standaard IDE vir Android -projekte is Android Studio (https://developer.android.com/studio). Nadat u die Android Studio geïnstalleer het, maak die projekmap oop.

Omdat ons motor deur bluetooth beheer word, het ek my soektog in die gedekompileerde kode begin met die sleutelwoord "bluetooth", en ek het gevind dat "BluetoothSerialService" die kommunikasie hanteer het. As hierdie klas die kommunikasie hanteer, moet dit 'n stuuropdragmetode hê. Dit blyk dat daar een skryfmetode is wat data deur die bluetooth -kanaal stuur:

openbare leegte skryf (greep uit)

Dit is 'n goeie begin, ek het gesoek na die.write (metode wat gebruik word en daar is 'n klas "ZenWheelsMicrocar" wat ons "BluetoothSerialService" uitbrei. Hierdie klas bevat die meeste van die logika van ons kommunikasie via Bluetooth. Die ander deel van die logika is in die beheerders: BaseController en StandardController.

In die BaseController het ons die diensinitialisering, en ook definisies van die stuur- en gaskanale, kanale is eintlik opdragvoorvoegsels om aan te dui dat 'n tipe opdrag sal volg:

beskermde ZenWheelsMicrocar mikrokar = nuwe ZenWheelsMicrocar (hierdie, this.btHandler);

beskermde ChannelOutput -uitsette = {nuwe TrimChannelOutput (ZenWheelsMicrocar. STEERING_CHANNEL), nuwe TrimChannelOutput (ZenWheelsMicrocar. THROTTLE_CHANNEL)};

In die StandardController word die stuur hanteer:

openbaar leeg handvatsel Steering (TouchEvent touchEvent) {

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

Deur die metode te analiseer, het die steeringOutput.channel die waarde 129 (kanaal wat gebruik word vir stuur) en steeringOutput.resolveValue () kan 'n waarde tussen -90 en 90 hê. Die kanaalwaarde (129) word direk gestuur en die stuurwaarde word gewysig deur bitwise -bewerkings toe te pas:

private finale int value_convert_out (int waarde) {

booleaanse negatief = vals; as (waarde <0) {negatief = f6D; } int waarde2 = waarde & 63; as (negatief) {opbrengswaarde2 | 64; } opbrengswaarde2; }

Daar is 'n soortgelyke metode in die StandardController genaamd

openbare leegtehandvatsel (TouchEvent touchEvent)

Stap 3: Komponente

Dele:

1. Arduino pro mini 328p 2 $

2. Broodbord

3. MPU6050 gyroscoop 1.2 $

4. HC-05 hoofslaaf 6-pins module 3 $

5. 4 x AA battery pack met 4 batterye

6. U-vormige trukkabels (opsioneel). Ek het hierdie springkabels gebruik omdat dit beter lyk op die broodbord, en die leds is meer sigbaar op hierdie manier. As u nie hierdie kabels het nie, kan u dit vervang met dupont -drade.

Bogenoemde pryse is van eBay geneem.

Gereedskap:

1. USB na seriële FTDI -adapter FT232RL om die arduino pro mini te programmeer

2. Arduino IDE

3. Android Studio (opsioneel as u self wil reverse -ontwerp)

Stap 4: Montering

Vergadering
Vergadering

Die samestelling is baie eenvoudig, want ons doen dit op 'n broodbord:)

- eers plaas ons ons komponente op die broodbord: die mikrobeheerder, bluetooth -module en gyroscoop

- verbind die HC-05 bluetooth RX en TX penne met arduino 10 en 11 penne. Die gyroscoop SDA en SCL moet aan die arduino A4- en A5 -penne gekoppel word

- verbind die kragpenne met die bluetooth, gyro en die arduino. die penne moet aan die + en - aan die kant van die broodbord gekoppel word

- laas 'n kragtoevoer (tussen 3.3V tot 5V) op die broodbord aangesluit, ek het 'n klein LiPo -selfoonbattery gebruik, maar ek sal dit doen solank dit binne die kragbereik is

Kyk na die foto's hierbo vir meer besonderhede

Stap 5: Koppel die HC-05 Bluetooth aan die Microcar

Koppel die HC-05 Bluetooth aan die Microcar
Koppel die HC-05 Bluetooth aan die Microcar
Koppel die HC-05 Bluetooth aan die Microcar
Koppel die HC-05 Bluetooth aan die Microcar
Koppel die HC-05 Bluetooth aan die Microcar
Koppel die HC-05 Bluetooth aan die Microcar

Hiervoor benodig u 'n Android-telefoon, die bluetooth HC-05-module en die seriële FTDI-adapter met drade. Ons sal ook die Arduino IDE gebruik om met die Bluetooth -module te kommunikeer.

Eerstens moet ons die microcar bluetooth -adres uitvind:

- aktiveer bluetooth op u telefoon

- skakel die motor aan en gaan na die Bluetooth -afdeling van u instellings in Android

- soek na nuwe toestelle en 'n toestel met die naam "Microcar" moet verskyn

- koppel met hierdie toestel

- om die bluetooth MAC te onttrek, het ek hierdie app van Google Play Serial Bluetooth Terminal gebruik

Nadat u hierdie app geïnstalleer het, gaan u na die menu -> toestelle, en daar het u 'n lys met alle Bluetooth -gekoppelde toestelle. Ons is slegs geïnteresseerd in die kode onder die 'Microcar' myn: 00: 06: 66: 49: A0: 4B

Koppel dan die FTDI -adapter aan die bluetooth -module. Eers VCC- en GROUND -penne en dan FTDI RX na bluetooth TX en FTDI TX na bluetooth RX. Daar moet ook 'n pen op die bluetooth -module wees wat aan die VCC gekoppel moet word. As u dit doen, gaan die Bluetooth -module in 'n "programmeerbare modus". My module het 'n knoppie wat die VCC met die spesiale pen verbind. As u die FTDI in die USB aansluit, moet dit met die pen / knop ingedruk wees om in hierdie spesiale programmeerbare modus in te gaan. Die bluetooth bevestig dat u hierdie modus betree deur elke 2 sekondes stadig te knip.

Kies in die Arduino IDE die seriële poort en maak dan die seriële monitor oop (beide NL en CR met 9600 baud rate). Tik AT en die module moet bevestig met "OK".

Tik "AT+ROLE = 1" om die module in die hoofmodus te plaas. Om met u bluetooh -module te koppel, skryf: "AT+BIND = 0006, 66, 49A04B", let op hoe ons "00: 06: 66: 49: A0: 4B" omskep word in "0006, 66, 49A04B". U moet dieselfde transformasie vir u bluetooh MAC doen.

Skakel nou die Zenwheels -motor aan, ontkoppel dan die FTDI en steek dit weer in sonder dat die knoppie ingedruk word / spesiale pen gekoppel is. Na 'n rukkie moet dit met die motor verbind word, en u sal sien dat die motor 'n spesifieke verbinding suksesvolle geluid maak.

Probleemoplossing:

- Ek het gevind dat slegs die een met 'n knoppie van al die Bluetooth -modules wat ek gehad het, 'n meester was!

- verseker dat die motor ten volle gelaai is

- maak seker dat die motor nie aan die telefoon gekoppel is nie

- as die Bluetooth in die AT -modus gaan (stadig knip), maar dit reageer nie op bevel nie, maak seker dat u beide NL en CR het, en eksperimenteer ook met ander BAUD -tariewe

- kyk of die RX aan TX gekoppel is en omgekeerd

- probeer hierdie tutoriaal

Stap 6: Kode en gebruik

Eerstens moet u twee biblioteke aflaai en installeer:

1. MPU6050 biblioteek vir die gyroscoop

2. I2CDev biblioteek bron

Laai dan my biblioteek hier af en installeer dit, of kopieer dit van onder af:

/** * Biblioteke: * 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 inisialisering = vals; // stel waar as DMP init suksesvol was

uint8_t mpuIntStatus; // hou die werklike onderbrekingsstatusbyte van MPU uint8_t devStatus; // terugkeerstatus na elke apparaatbewerking (0 = sukses,! 0 = fout) uint16_t packetSize; // verwagte DMP -pakkiegrootte (standaard is 42 grepe) uint16_t fifoCount; // telling van alle grepe wat tans in FIFO uint8_t fifoBuffer [64] is; // FIFO -stoorbuffer Quaternion q; // [w, x, y, z] quaternion houer VectorFloat swaartekrag; // [x, y, z] swaartekragvektor float ypr [3]; // [yaw, pitch, roll] yaw/pitch/roll container en gravitasie vektor vlugtige bool mpuInterrupt = false; // dui aan of die MPU -onderbrekingspen hoog is

ongetekende lang lastPrintTime, lastMoveTime = 0;

SoftwareSerial BTserial (10, 11);

MPU6050 mpu;

leemte opstelling ()

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

leemte -lus () {

as (! inisialisering) {terugkeer; } mpuInterrupt = vals; mpuIntStatus = mpu.getIntStatus (); fifoCount = mpu.getFIFOCount (); as (hasFifoOverflown (mpuIntStatus, fifoCount)) {mpu.resetFIFO (); terugkeer; } if (mpuIntStatus & 0x02) {while (fifoCount <packetSize) {fifoCount = mpu.getFIFOCount (); } mpu.getFIFOBytes (fifoBuffer, packetSize); fifoCount -= packetSize; mpu.dmpGetQuaternion (& q, fifoBuffer); mpu.dmpGetGravity (& swaartekrag, & q); mpu.dmpGetYawPitchRoll (ypr, & q, & gravitasie); stuur (ypr [0] * 180/M_PI, ypr [1] * 180/M_PI, ypr [2] * 180/M_PI); }}

/*

* Ontvang hoek van 0 tot 180 waar 0 die maksimum links is en 180 die maksimum regs * Ontvang spoed van -90 tot 90 waar -90 maksimum agteruit is en 90 die maksimum vorentoe */ leegte beweeg ZwheelsCar (greephoek, int -spoed) {if (millis () - lastMoveTime = 90) {resultAngle = kaart (hoek, 91, 180, 1, 60); } anders as (hoek 0) {resultSpeed = kaart (spoed, 0, 90, 0, 60); } anders as (spoed <0) {resultSpeed = map (spoed, 0, -90, 120, 60); } Serial.print ("actualAngle ="); Serial.print (hoek); 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 (); }

leegte stuur (int x, int y, int z)

{x = beperking (x, -1 * MAX_ANGLE, MAX_ANGLE); y = beperking (y, -1 * MAX_ANGLE, MAX_ANGLE); z = beperking (z, -MAX_ANGLE, MAX_ANGLE); int hoek = kaart (y, -MAX_ANGLE, MAX_ANGLE, 0, 180); int spoed = kaart (z, -MAX_ANGLE, MAX_ANGLE, 90, -90); printDebug (x, y, z, hoek, spoed); moveZwheelsCar (hoek, spoed); }

void printDebug (int x, int y, int z, int hoek, int speed)

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

bool initializeGyroscope ()

{Wire.begin (); mpu.initialize (); Serial.println (mpu.testConnection ()? F ("MPU6050 verbinding suksesvol"): F ("MPU6050 verbinding misluk")); devStatus = mpu.dmpInitialize (); mpu.setXGyroOffset (220); mpu.setYGyroOffset (76); mpu.setZGyroOffset (-85); mpu.setZAccelOffset (1788); if (devStatus! = 0) {Serial.print (F ("DMP Initialization failed (code")); Serial.println (devStatus); return false;} mpu.setDMPEnabled (true); Serial.println (F ("Aktiveer interrupt -opsporing (Arduino eksterne onderbreking 0) … ")); attachInterrupt (0, dmpDataReady, RISING); mpuIntStatus = mpu.getIntStatus (); Serial.println (F (" DMP gereed! Wag vir eerste onderbreking … ")); packetSize = mpu.dmpGetFIFOPacketSize (); terugkeer waar;}

void dmpDataReady ()

{mpuInterrupt = waar; }

boolean hasFifoOverflown (int mpuIntStatus, int fifoCount)

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

Laai die kode op met die FTDI -adapter na die arduino en koppel dan die batterye.

Die gebruik van die afstandsbediening:

Nadat die arduino aangeskakel is, skakel die motor ook aan. Die HC-05-module moet aan die motor gekoppel word. As dit gebeur, sal die motor 'n geluid uitstraal. As dit nie werk nie, gaan na die vorige stap en die afdeling oor die oplos van probleme.

As u die broodbord vorentoe kantel, moet die motor vorentoe, regs en die motor regs beweeg. Dit voer ook geleidelike bewegings uit, soos om 'n bietjie vorentoe te buig en 'n bietjie links, in hierdie geval sal die motor stadig na links gaan.

As die motor op 'n ander manier gaan as u die broodbord kantel, hou die broodbord eers in verskillende rigtings.

Hoe dit werk:

Die skets kry elke 100 ms die koördinate van die gyroscoop, maak berekeninge en stuur dan die motor deur bluetooth. Eerstens is daar 'n 'stuur' -metode wat genoem word met die rou x-, y- en z -hoeke. Hierdie metode verander die stuur tussen 0 en 180 grade en die versnelling tussen -90 en 90. Hierdie metode roep

void moveZwheelsCar (bytehoek, int spoed) wat die stuur en versnelling omskakel na ZenWheels spesifikasies en dan die opdragte met behulp van bluetooth oordra.

Die rede waarom ek die transformasie in twee stappe gedoen het, is herbruikbaarheid. as ek hierdie skets sou moes aanpas by 'n ander toestel op afstandsbediening, sou ek begin met die basiese metode "stuur" wat die spoed en stuur alreeds na 'n paar nuttige waardes in kaart bring.

Stap 7: Alternatiewe

'N Alternatief vir die "reverse engineering". Ek het gepraat oor hoe om die projek agteruit te ontwerp deur te begin met die Android -toepassing. Maar daar is 'n alternatief hiervoor: u kan 'n seriële FTDI + bluetooth-slaaf opstel (gewone HC-05 sonder om die hoofinstellings te spesifiseer). Koppel dan via die ZenWheels-app aan die HC-05 in plaas van die 'mikrokar'.

Om die opdragte te dekodeer, moet u die stuurwiel in 'n sekere posisie hou, en dan die seriële kommunikasie met 'n luislangskrif ontleed. Ek stel 'n luislang voor, want daar is nie -drukbare karakters en Arduino IDE is nie daarvoor geskik nie. U sal sien dat as die wiel in een posisie gehou word, die app gereeld dieselfde twee grepe sal stuur. As u die wielposisie verander, bly die vuisbyte dieselfde, die tweede sal verander. Na baie proewe kan u die stuuralgoritme opdoen, dan die versneller van die omgekeerde ingenieur, ens.

'N Alternatief vir die arduino -gebaseerde afstandsbediening is 'n RaspberryPi -afstandsbediening. Die framboos -pi het 'n ingeboude Bluetooth -module wat sonder pyn in die 'meester' -modus opgestel kan word, en die python -bluetooth -biblioteek werk soos 'n sjarme. 'N Paar meer interessante projekte is moontlik, soos die bestuur van die motor met behulp van Alexa echo:)

Ek hoop dat u die projek geniet het en laat asseblief kommentaar hieronder!

Aanbeveel: