Mündəricat:

ZenWheels Microcar üçün Hackable Uzaqdan İdarəetmə: 7 addım
ZenWheels Microcar üçün Hackable Uzaqdan İdarəetmə: 7 addım

Video: ZenWheels Microcar üçün Hackable Uzaqdan İdarəetmə: 7 addım

Video: ZenWheels Microcar üçün Hackable Uzaqdan İdarəetmə: 7 addım
Video: 3 сезон 4 главы fortnite новая карта Фортнайт #3 2024, Iyun
Anonim
Image
Image
Məclis
Məclis

Bu təlimatda ZenWheels mikrokar üçün xüsusi bir uzaqdan idarəetmə quracağıq. ZenWheels mikro avtomobili, Android və ya Iphone tətbiqi ilə idarə edilə bilən 5 sm ölçülü oyuncaq avtomobildir. Ünsiyyət protokolu haqqında məlumat əldə etmək və arduino və giroskopdan istifadə edərək uzaqdan idarəetmə qurmağı öyrənmək üçün sizə Android tətbiqini tərs mühəndis etməyi göstərəcəyəm.

Addım 1: Komponentlər və Alətlər

Parçalar:

1. ZenWheels mikrokar

2. Arduino pro mini 328p

3. Çörək lövhəsi

4. MPU6050 giroskopu

5. enerji mənbəyi <= 5 v (çörək taxtasına qoşa biləcəyimiz bəzi batareya)

6. U formalı tullanan kabellər (isteğe bağlı). Çörək taxtasında daha yaxşı göründükləri üçün bu tullanan kabellərdən istifadə etdim. Bunun əvəzinə adi keçid kabelləri istifadə edilə bilər

7. HC-05 bluetooth modulu (AT rejiminə daxil olmaq üçün düymə ilə)

Alətlər:

1. Arduino pro mini proqramlaşdırmaq üçün FT232RL seriyalı FTDI adapterindən USB

2. Arduino IDE

3. Android Telefon

4. Android Studio [İsteğe bağlı]

Addım 2: ZenWheels Android Tətbiqini tərsinə çevirin [isteğe bağlı]

Bu hissəni başa düşmək üçün bəzi Java və Android bilikləri tələb olunur.

Layihənin məqsədi mikroavtobusu giroskopla idarə etməkdir. Bunun üçün bu oyuncaqla android tətbiqi arasındakı bluetooth əlaqəsi haqqında daha çox məlumat əldə etməliyik.

Bu addımda mikrokarla android tətbiqi arasındakı əlaqə protokolunu necə tərsinə mühəndis edəcəyimi izah edəcəyəm. Yalnız uzaqdan idarəetmə qurmaq istəyirsinizsə, bu addım lazım deyil. Protokolu kəşf etməyin bir yolu mənbə koduna baxmaqdır. Hmm, amma bu, düz deyil, android tətbiqləri tərtib edilir və Google Play vasitəsilə apk yükləyə bilərsiniz.

Buna görə bunu etmək üçün əsas bir bələdçi hazırladım:

1. APK yükləyin. Bir Android Paket Kit (qısa olaraq APK), Android əməliyyat sisteminin mobil tətbiqlərin paylanması və quraşdırılması üçün istifadə etdiyi paket fayl formatıdır.

Əvvəlcə proqramı Google play mağazasında axtarın, bizim vəziyyətimizdə "zenwheels" axtarın və tətbiqin bağlantısını əldə edəcəksiniz

Sonra google -da "onlayn apk yükləyicisi" axtarın və apk -ı yükləmək üçün birini istifadə edin. Adətən tətbiq bağlantısını istəyəcəklər (əvvəllər əldə etdiyimiz), sonra bir yükləmə düyməsini basaraq kompüterimizdə saxlayacağıq.

2. APK -nı yenidən tərtib edin. Vəziyyətimizdəki bir dekompilyator APK götürən və Java mənbə kodunu istehsal edən bir vasitədir.

Ən sadə həll işi etmək üçün onlayn dekompilyatordan istifadə etməkdir. Google -da "onlayn dekompilyator" axtardım və https://www.javadecompilers.com/ seçdim. Yalnız əvvəllər əldə etdiyiniz APK yükləməlisiniz

dekompilyasiya düyməsini basın. Sonra yalnız mənbələri yükləyin.

3. Kodu nəzərdən keçirərək mühəndisi tərsinə çevirməyə çalışın

Layihəni açmaq üçün bir mətn redaktoru və ya daha yaxşı bir IDE (inteqrasiya edilmiş inkişaf mühiti) lazımdır. Android Layihələri üçün standart IDE Android Studio'dur (https://developer.android.com/studio). Android Studio qurduqdan sonra layihə qovluğunu açın.

Avtomobilimiz bluetooth ilə idarə olunduğundan, "bluetooth" sözü ilə ayrılmış kodda axtarışa başladım, "BluetoothSerialService" ünsiyyətin əlində olduğunu gördüm. Bu sinif ünsiyyəti idarə edərsə, göndərmə əmr metoduna malik olmalıdır. Məlum olur ki, bluetooth kanalı vasitəsilə məlumat göndərən bir yazma üsulu var:

ictimai boşluq yazma (bayt çıxarmaq)

Bu yaxşı bir başlanğıcdır. Yazmağı axtardım (istifadə olunan metod və "BluetoothSerialService" inizi genişləndirən "ZenWheelsMicrocar" sinfi var. Bu sinif Bluetooth üzərindən ünsiyyətimizin ən çox məntiqini ehtiva edir. Digər hissəsi məntiq nəzarətçilərdədir: BaseController və StandardController.

BaseController -də xidmətin başlanğıcına, həmçinin sükan və qaz tənzimləyici kanallarının təriflərinə sahibik, kanallar əslində bir növ əmrin yerinə yetiriləcəyini təyin etmək üçün komanda prefiksləridir:

qorunan ZenWheelsMicrocar mikrokar = yeni ZenWheelsMicrocar (bu, bu.btHandler);

qorunan ChannelOutput çıxışları = {yeni TrimChannelOutput (ZenWheelsMicrocar. STEERING_CHANNEL), yeni TrimChannelOutput (ZenWheelsMicrocar. THROTTLE_CHANNEL)};

StandardController -də sükan idarə olunur:

ictimai boşluq idarəetmə (TouchEvent touchEvent) {

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

Metodu təhlil edərək, steeringOutput.channel 129 (sükan üçün istifadə olunan kanal) dəyərinə malikdir və steeringOutput.resolveValue () -90 ilə 90 arasında ola bilər. Kanal dəyəri (129) birbaşa göndərilir və sükan dəyəri dəyişdirilir bit əməliyyatları tətbiq edərək:

şəxsi son int dəyəri_dönüşü_ (int dəyəri) {

boolean mənfi = yalan; əgər (dəyər <0) {mənfi = f6D; } int dəyəri2 = dəyər & 63; if (mənfi) {qaytarılma dəyəri2 | 64; } qaytarılma dəyəri2; }

StandardController -də oxşar bir üsul var

ictimai boşluq tutacaq

Addım 3: Komponentlər

Parçalar:

1. Arduino pro mini 328p 2 $

2. Çörək lövhəsi

3. MPU6050 giroskopu 1.2 $

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

5. 4 ədəd 4 ədəd AA batareya paketi

6. U formalı tullanan kabellər (isteğe bağlı). Çörək taxtasında daha yaxşı göründükləri üçün bu keçid kabellərini istifadə etdim və ledlər bu şəkildə daha çox görünür. Bu kabellər yoxdursa, onları dupont telləri ilə əvəz edə bilərsiniz.

Yuxarıdakı qiymətlər eBay -dan götürülmüşdür.

Alətlər:

1. Arduino pro mini proqramlaşdırmaq üçün FT232RL seriyalı FTDI adapterindən USB

2. Arduino IDE

3. Android Studio (özünüzü tərs mühəndis etmək istəyirsinizsə, isteğe bağlı)

Addım 4: Montaj

Məclis
Məclis

Quraşdırma çox sadədir, çünki bunu çörək taxtasında edirik:)

- əvvəlcə komponentlərimizi çörək taxtasına yerləşdiririk: mikrokontrolör, bluetooth modulu və giroskop

- HC-05 bluetooth RX və TX pinlərini arduino 10 və 11 pinlərinə qoşun. Gyroscope SDA və SCL arduino A4 və A5 pinlərinə bağlanmalıdır

- güc pinlərini bluetooth, gyro və arduino -ya qoşun. sancaqlar çörək taxtasının yan tərəfindəki + və - ilə bağlanmalıdır

- son olaraq çörək taxtasına bir enerji təchizatı bağlayın (3.3V ilə 5V arasında), kiçik bir LiPo bir hüceyrəli batareya istifadə etdim, amma güc aralığında olduğu müddətdə hər kəs bunu edəcək.

Ətraflı məlumat üçün yuxarıdakı şəkilləri yoxlayın

Addım 5: HC-05 Bluetooth-u Microcar ilə qoşun

HC-05 Bluetooth-u Microcar ilə qoşun
HC-05 Bluetooth-u Microcar ilə qoşun
HC-05 Bluetooth-u Microcar ilə qoşun
HC-05 Bluetooth-u Microcar ilə qoşun
HC-05 Bluetooth-u Microcar ilə qoşun
HC-05 Bluetooth-u Microcar ilə qoşun

Bunun üçün bir Android telefonu, bluetooth HC-05 modulu və telli FTDI seriyalı adapterə ehtiyacınız olacaq. Ayrıca Bluetooth modulu ilə əlaqə qurmaq üçün Arduino IDE -dən istifadə edəcəyik.

Əvvəlcə mikrokar bluetooth ünvanını öyrənməliyik:

- telefonunuzda bluetooth aktiv edin

- maşını işə salın və Android -də parametrlərinizin bluetooth bölməsinə keçin

- yeni cihazlar axtarın və "Microcar" adlı bir cihaz görünməlidir

- bu cihazla qoşun

- sonra bluetooth MAC çıxarmaq üçün bu proqramı google play Serial Bluetooth Terminalından istifadə etdim

Bu proqramı quraşdırdıqdan sonra menyuya -> cihazlara gedin və orada bütün bluetooth qoşalaşmış cihazların olduğu bir siyahı olacaq. Yalnız "Microcar" minasının altındakı kodla maraqlanırıq 00: 06: 66: 49: A0: 4B

Sonra FTDI adapterini bluetooth moduluna qoşun. Əvvəlcə VCC və GROUND pinləri və sonra bluetooth TX -ə FTDI RX və bluetooth RX -ə FTDI TX. Ayrıca Bluetooth modulunda VCC -yə qoşulmalı olan bir pin olmalıdır. Bunu etmək üçün bluetooth modulu "proqramlaşdırıla bilən bir rejim" ə girir. Modulumda VCC -ni o xüsusi pinə bağlayan bir düymə var. FTDI -ni USB -yə qoşduğunuzda, bu xüsusi proqramlaşdırıla bilən rejimə daxil olmaq üçün bağlı pin / düymə sıxılmış vəziyyətdə olmalıdır. Bluetooth hər 2 saniyədə yavaş -yavaş yanıb -sönərək bu iş rejiminə daxil olduğunu təsdiqləyir.

Arduino IDE -də serial portunu seçin, sonra seriyalı monitoru açın (Həm NL, həm də CR 9600 baud dərəcəsi ilə). AT yazın və modul "OK" ilə təsdiqlənməlidir.

Modulu master rejiminə qoymaq üçün "AT+ROLE = 1" yazın. Bluetooh modulunuzla cütləşmək üçün yazın: "AT+BIND = 0006, 66, 49A04B", "00: 06: 66: 49: A0: 4B" nin "0006, 66, 49A04B" yə necə çevrildiyinə diqqət yetirin. Bluetooh MAC üçün eyni çevrilməni etməlisiniz.

İndi Zenwheels avtomobilini işə salın, sonra FTDI -ni ayırın və düyməni basmadan / xüsusi pin bağlamadan yenidən qoşun. Bir müddət sonra maşına qoşulmalıdır və avtomobilin müəyyən bir əlaqə qurduğunu görərsən.

Giderme:

- Sahib olduğum bütün Bluetooth modullarından yalnız düyməni olan birinin usta işlədiyini gördüm!

- maşının tam doldurulduğundan əmin olun

- maşının telefona bağlı olmadığından əmin olun

- Bluetooth AT rejiminə girərsə (yavaş -yavaş yanıb -sönür), lakin əmrinə cavab vermirsə, həm NL & CR -ə malik olduğunuzdan əmin olun, həm də digər BAUD dərəcələri ilə sınaqdan keçirin.

- RX -in TX -ə qoşulduğunu və əksinə iki dəfə yoxlayın

- bu təlimatı sınayın

Addım 6: Kod və İstifadə

Əvvəlcə iki kitabxananı yükləməli və quraşdırmalısınız:

1. Giroskop üçün MPU6050 kitabxanası

2. I2CDev kitabxana mənbəyi

Sonra kitabxanamı buradan yükləyin və quraşdırın və ya aşağıdan kopyalayın:

/** * Kitabxanalar: * https://github.com/jrowberg/i2cdevlib * https://github.com/jrowberg/i2cdevlib */#include "I2Cdev.h" #include "MPU6050_6Axis_MotionApps20.h" #include "Wire.h " #" "SoftwareSerial.h" daxil edin

const int MAX_ANGLE = 45;

const bayt əmriStering = 129; const bayt əmriSpeed = 130;

bool başlatma = yanlış; // DMP başlanğıcı uğurlu olsaydı doğru olaraq təyin edin

uint8_t mpuIntStatus; // MPU uint8_t devStatus -dan faktiki fasilə statusu baytını saxlayır; // hər cihaz əməliyyatından sonra vəziyyəti qaytarın (0 = uğur,! 0 = səhv) uint16_t packetSize; // gözlənilən DMP paket ölçüsü (standart 42 baytdır) uint16_t fifoCount; // hazırda FIFO -da olan bütün baytların sayı uint8_t fifoBuffer [64]; // FIFO saxlama buferi Quaternion q; // [w, x, y, z] quaternion konteyner VectorFloat çəkisi; // [x, y, z] cazibə vektoru float ypr [3]; // [yaw, pitch, roll] yaw/pitch/roll konteyner və cazibə vektoru uçucu bool mpuInterrupt = false; // MPU kəsmə pininin yüksək olub olmadığını göstərir

imzasız uzun lastPrintTime, lastMoveTime = 0;

SoftwareSerial BTserial (10, 11);

MPU6050 mpu;

boş quraşdırma ()

{Serial.begin (9600); BTserial.begin (38400); Serial.println ("Proqram başladı"); başlatma = başlatmaGiroskop (); }

boşluq döngəsi () {

if (! başlatma) {qayıt; } mpuInterrupt = yanlış; mpuIntStatus = mpu.getIntStatus (); fifoCount = mpu.getFIFOCount (); if (hasFifoOverflown (mpuIntStatus, fifoCount)) {mpu.resetFIFO (); qayıtmaq; } if (mpuIntStatus & 0x02) {while (fifoCount <packetSize) {fifoCount = mpu.getFIFOCount (); } mpu.getFIFOBytes (fifoBuffer, packetSize); fifoCount -= paket ölçüsü; mpu.dmpGetQuaternion (& q, fifoBuffer); mpu.dmpGetGravity (& cazibə qüvvəsi, & q); mpu.dmpGetYawPitchRoll (ypr, & q, & cazibə qüvvəsi); idarə etmək (ypr [0] * 180/M_PI, ypr [1] * 180/M_PI, ypr [2] * 180/M_PI); }}

/*

* 0 -dan maksimum sola və 180 -dən maksimum sağa doğru olan 0 -dan 180 -ə qədər bucaq alır millis () - lastMoveTime = 90) {resultAngle = xəritə (bucaq, 91, 180, 1, 60); } else if (bucaq 0) {resultSpeed = xəritə (sürət, 0, 90, 0, 60); } else if (sürət <0) {resultSpeed = xəritə (sürət, 0, -90, 120, 60); } Serial.print ("actualAngle ="); Serial.print (bucaq); Serial.print (";"); Serial.print ("actualSpeed ="); Serial.print (resultSpeed); Serial.println (";"); BTserial.write (commandStering); BTserial.write (resultAngle); BTserial.write (commandSpeed); BTserial.write ((bayt) resultSpeed); lastMoveTime = milis (); }

boş idarəetmə (int x, int y, int z)

{x = məhdudlaşdır (x, -1 * MAX_ANGLE, MAX_ANGLE); y = məhdudlaşdır (y, -1 * MAX_ANGLE, MAX_ANGLE); z = məhdudlaşdır (z, -MAX_ANGLE, MAX_ANGLE); int açısı = xəritə (y, -MAX_ANGLE, MAX_ANGLE, 0, 180); int sürəti = xəritə (z, -MAX_ANGLE, MAX_ANGLE, 90, -90); printDebug (x, y, z, bucaq, sürət); moveZwheelsCar (bucaq, sürət); }

void printDebug (int x, int y, int z, int açısı, int sürəti)

{if (millis () - lastPrintTime <1000) {qaytar; } 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 ("bucaq ="); Serial.print (bucaq); Serial.print (";"); Serial.print ("speed ="); Serial.print (speed); Serial.println (";"); lastPrintTime = milis (); }

bool başlatmaGiroskop ()

{Wire.begin (); mpu.initialize (); Serial.println (mpu.testConnection ()? F ("MPU6050 bağlantısı uğurlu"): F ("MPU6050 bağlantısı uğursuz oldu")); devStatus = mpu.dmpInitialize (); mpu.setXGyroOffset (220); mpu.setYGyroOffset (76); mpu.setZGyroOffset (-85); mpu.setZAccelOffset (1788); if (devStatus! = 0) {Serial.print (F ("DMP Başlatması uğursuz oldu (kod")); Serial.println (devStatus); yalnış qaytar;} mpu.setDMPEnabled (doğru); Serial.println (F ("Aktivləşdirmə) kəsilmə aşkarlanması (Arduino xarici müdaxilə 0)… ")); attachInterrupt (0, dmpDataReady, RISING); mpuIntStatus = mpu.getIntStatus (); Serial.println (F (" DMP hazırdır! İlk kəsilməni gözləyir … ")); packetSize = mpu.dmpGetFIFOPacketSize (); doğruya qayıt;}

void dmpDataReady ()

{mpuInterrupt = doğru; }

boolean hasFifoOverflown (int mpuIntStatus, int fifoCount)

{mpuIntStatus və 0x10 qayıt || fifoCount == 1024; }

FTDI adapterindən istifadə edərək kodu arduinoya yükləyin və sonra batareyaları qoşun.

Uzaqdan istifadə:

Arduino işə salındıqdan sonra avtomobili də işə salın. HC-05 modulu avtomobilə qoşulmalıdır, bu baş verdikdə avtomobil səs çıxaracaq. İşləmirsə, əvvəlki addımı və problemlərin aradan qaldırılması bölməsini yoxlayın.

Çörək taxtasını irəli meyl edirsinizsə, avtomobil irəli, sağa və maşın sağa hərəkət etməlidir. Bir az irəli və bir az sola meyl etmək kimi daha tədricən hərəkətlər edir, bu vəziyyətdə avtomobil yavaş -yavaş sola gedərdi.

Çörək taxtasına meyl edərkən avtomobil fərqli bir şəkildə gedirsə, əvvəlcə çörəyi fərqli istiqamətlərdə tutun.

Bu necə işləyir:

Eskiz hər 100 ms -də giroskopun koordinatlarını alır, hesablamalar aparır və sonra avtomobilin əmrlərini bluetooth vasitəsilə ötürür. Əvvəlcə x, y və z x bucaqları ilə çağırılan "idarə etmək" üsulu var. Bu üsul sükanı 0 ilə 180 dərəcə arasında dəyişir və sürətləndirməni -90 ilə 90 arasında dəyişir. Bu üsul çağırır

sükan və sürətləndirməni ZenWheels spesifikasiyasına çevirən və sonra bluetooth istifadə edərək əmrləri ötürən boş hərəkətZwheelsCar (bayt bucağı, int sürəti).

Transformasiyanı iki addımda etməyimin səbəbi yenidən istifadə oluna bilməsidir. Bu eskizi başqa bir cihaza uzaqdan idarə etmək üçün uyğunlaşdırmaq lazım olsaydı, sürəti və sükanı bəzi faydalı dəyərlərə uyğunlaşdıran "idarə etmək" əsas metodundan başlayardım.

Addım 7: Alternativlər

"Tərs mühəndislik" ə alternativ. Android tətbiqindən başlayaraq layihəni necə tərsinə mühəndis etmək barədə danışdım. Ancaq bunun alternativi var ki, FTDI + bluetooth seriyasını (master parametrlərini göstərmədən müntəzəm HC-05) qura bilərsiniz. Sonra ZenWheels tətbiqindən "mikrokar" yerinə HC-05-ə qoşulun.

Əmrləri deşifr etmək üçün sükanı bir mövqedə tutmalısınız, sonra python skriptindən istifadə edərək serial rabitəsini təhlil edin. Bir python skriptini təklif edirəm, çünki çap olunmayan simvollar var və Arduino IDE bunun üçün uyğun deyil. Sükanı bir mövqedə saxlasanız, tətbiqin eyni iki baytı müntəzəm olaraq ötürəcəyini müşahidə edəcəksiniz. Təkər mövqeyini dəyişsəniz, ilk bayt eyni qalacaq, ikincisi dəyişəcək. Bir çox sınaqdan sonra sükan idarəetmə alqoritmi, sonra tərs mühəndis qazı və s.

Arduino əsaslı pulta alternativ RaspberryPi pultu olardı. Moruq pi -nin "master" rejimində qurulması ağrısız olan bir bluetooth modulu var və python bluetooth kitabxanası cazibədarlıq kimi işləyir. Alexa echo istifadə edərək maşını idarə etmək kimi daha maraqlı layihələr də mümkündür:)

Ümid edirəm ki, layihədən zövq aldınız və aşağıda şərhlər buraxın!

Tövsiyə: