Mundarija:

ZenWheels Microcar uchun masofadan boshqarish pulti: 7 qadam
ZenWheels Microcar uchun masofadan boshqarish pulti: 7 qadam

Video: ZenWheels Microcar uchun masofadan boshqarish pulti: 7 qadam

Video: ZenWheels Microcar uchun masofadan boshqarish pulti: 7 qadam
Video: Zen Wheels Precision Proportional Control Micro Car 2024, Iyun
Anonim
Image
Image
O'rnatish
O'rnatish

Ushbu qo'llanmada biz ZenWheels mikrokariga maxsus masofadan boshqarish pultini yaratamiz. ZenWheels mikrokarchasi - bu 5 sm uzunlikdagi o'yinchoqli avtomobil, uni Android yoki Iphone ilovasi orqali boshqarish mumkin. Men sizga qanday qilib Android protsessorini teskari muhandislik qilishni, aloqa protokoli va arduino va giroskop yordamida masofadan boshqarish pultini qanday qurishni ko'rsataman.

1 -qadam: Komponentlar va asboblar

Qismlar:

1. ZenWheels mikrokarasi

2. Arduino pro mini 328p

3. Non paneli

4. MPU6050 giroskopi

5. quvvat manbai <= 5 v (non paneliga ulashimiz mumkin bo'lgan ba'zi batareya)

6. U shaklidagi o'tish kabellari (ixtiyoriy). Men bu o'tish kabellarini ishlatganman, chunki ular taxtada yaxshiroq ko'rinadi. Buning o'rniga oddiy o'tish kabellari ishlatilishi mumkin

7. HC-05 bluetooth moduli (AT rejimiga kirish tugmasi bilan)

Asboblar:

1. Arduino pro mini -ni dasturlash uchun USB -ning ketma -ket FTDI adapteri FT232RL

2. Arduino IDE

3. Android telefon

4. Android Studio [ixtiyoriy]

2 -qadam: ZenWheels Android ilovasini teskari muhandislik [ixtiyoriy]

Bu qismni tushunish uchun Java va Android haqida ba'zi bilimlar talab qilinadi.

Loyihaning maqsadi - mikrokarni giroskop yordamida boshqarish. Buning uchun biz ushbu o'yinchoq va android ilovasi o'rtasidagi bluetooth aloqasi haqida ko'proq bilib olishimiz kerak.

Bu bosqichda men mikrokar va android ilovasi o'rtasidagi aloqa protokolini qanday teskari o'zgartirish kerakligini tushuntiraman. Agar siz masofadan boshqarish pultini yaratmoqchi bo'lsangiz, bu qadam kerak emas. Protokolni topishning bir usuli - manba kodini ko'rib chiqish. Hmm, lekin bu to'g'ridan -to'g'ri emas, android ilovalari tuzilgan va Google Play orqali apkni o'rnatish mumkin.

Shunday qilib, men buni amalga oshirish uchun asosiy ko'rsatma tayyorladim:

1. APK -ni yuklab oling. Android to'plami (qisqacha APK) - bu Android operatsion tizimi tomonidan mobil ilovalarni tarqatish va o'rnatish uchun ishlatiladigan paketli fayl formati.

Avval Google play do'konida dasturni qidiring, bizning holatda "zenwheels" ni qidiring va siz dastur havolasini olasiz

Keyin google -dan "onlayn apk yuklab oluvchi" ni qidiring va apk -ni yuklab olish uchun foydalaning. Odatda ular dastur havolasini so'rashadi (biz ilgari olgan), keyin biz yuklash tugmachasini bosamiz va uni kompyuterimizda saqlaymiz.

2. APK -ni qayta kompilyatsiya qiling. Bizning holatimizda dekompilyator - bu APK -ni olib, Java manba kodini ishlab chiqaruvchi vosita.

Eng oddiy echim - bu ishni bajarish uchun onlayn dekompilyatordan foydalanish. Men Google -dan "onlayn dekompilyator" ni qidirdim va https://www.javadecompilers.com/ ni tanladim. Siz ilgari olgan APK -ni yuklashingiz kerak

dekompilyatsiyani bosing. Keyin siz faqat manbalarni yuklab olasiz.

3. Kodni ko'rib chiqayotgan muhandisni teskari harakat qilib ko'ring

Loyihani ochish uchun sizga matn muharriri yoki yaxshiroq IDE (ishlab chiqish muhiti) kerak. Android loyihalari uchun standart IDE - Android Studio (https://developer.android.com/studio). Android Studio -ni o'rnatganingizdan so'ng, loyiha papkasini oching.

Bizning mashinamiz bluetooth orqali boshqarilganligi sababli, men qidiruvni "bluetooth" kalit so'zi bilan koddan topa boshladim, men "BluetoothSerialService" aloqani boshqarganini topdim. Agar bu sinf aloqani boshqarsa, unda buyruq yuborish usuli bo'lishi kerak. Ma'lum bo'lishicha, bluetooth kanali orqali ma'lumotlarni yuboradigan bitta yozish usuli bor:

ommaviy bekor yozish (bayt chiqish)

Bu yaxshi boshlanish, men.write ni qidirganman (ishlatilayotgan usulda va "BluetoothSerialService" ni kengaytiradigan "ZenWheelsMicrocar" klassi bor. Bu sinf Bluetooth orqali muloqotimiz mantig'ining ko'p qismini o'z ichiga oladi. Boshqa qismi) mantiq tekshirgichlarda: BaseController va StandardController.

BaseController -da biz xizmatni ishga tushiramiz, shuningdek Rulda -osiyo kanallarining ta'riflari, kanallar aslida buyruq turiga mos kelishini ko'rsatadigan buyruq prefikslari:

himoyalangan ZenWheelsMicrocar mikrokarasi = yangi ZenWheelsMicrocar (bu, bu.btHandler);

himoyalangan ChannelOutput chiqishi = {yangi TrimChannelOutput (ZenWheelsMicrocar. STEERING_CHANNEL), yangi TrimChannelOutput (ZenWheelsMicrocar. THROTTLE_CHANNEL)};

StandardController -da rul boshqariladi:

public void handleSteering (TouchEvent touchEvent) {

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

Usulni tahlil qilib, steeringOutput.channel 129 (kanalni boshqarish uchun ishlatiladi) qiymatiga ega va steeringOutput.resolveValue () qiymati -90 dan 90 gacha bo'lishi mumkin. Kanal qiymati (129) to'g'ridan -to'g'ri yuboriladi va rul qiymati o'zgartiriladi. bitli operatsiyalarni qo'llash orqali:

shaxsiy yakuniy int value_convert_out (int qiymati) {

mantiqiy salbiy = noto'g'ri; if (qiymati <0) {salbiy = f6D; } int qiymati2 = qiymat & 63; if (salbiy) {qaytish qiymati2 | 64; } qaytarish qiymati2; }

StandardController -da shunga o'xshash usul mavjud

umumiy bo'sh joy tutqichiThrottle (TouchEvent touchEvent)

3 -qadam: komponentlar

Qismlar:

1. Arduino pro mini 328p 2 $

2. Non paneli

3. MPU6050 giroskopi 1,2 $

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

5. 4 ta batareyali 4 ta AA batareya to'plami

6. U shaklidagi o'tish kabellari (ixtiyoriy). Men bu o'tish kabelidan foydalandim, chunki ular non panelida yaxshiroq ko'rinadi va svetodiodlar shu tarzda ko'rinadi. Agar sizda bunday kabellar bo'lmasa, ularni dupontli simlarga almashtirishingiz mumkin.

Yuqoridagi narxlar eBay -dan olingan.

Asboblar:

1. Arduino pro mini -ni dasturlash uchun USB -ning ketma -ket FTDI adapteri FT232RL

2. Arduino IDE

3. Android Studio (agar siz o'zingizni teskari muhandis qilmoqchi bo'lsangiz, ixtiyoriy)

4 -qadam: yig'ish

O'rnatish
O'rnatish

O'rnatish juda oddiy, chunki biz uni non panelida qilamiz:)

- birinchi navbatda biz o'z komponentlarimizni non paneliga joylashtiramiz: mikrokontroller, bluetooth moduli va giroskop

- HC-05 bluetooth RX va TX pinlarini arduino 10 va 11 pinlariga ulang. Gyroskop SDA va SCL arduino A4 va A5 pinlariga ulangan bo'lishi kerak

- quvvat pimlarini bluetooth, gyro va arduino -ga ulang. pinlar non paneli yonidagi + va - ga ulangan bo'lishi kerak

- oxirgi marta non paneliga quvvat manbaini (3,3V dan 5V gacha) ulang, men bitta LiPo batareyali kichik batareyadan foydalanganman, lekin har qanday quvvat diapazonida bo'lsa.

Qo'shimcha ma'lumot olish uchun yuqoridagi rasmlarni tekshiring

5-qadam: HC-05 Bluetooth-ni Microcar-ga ulang

HC-05 Bluetooth-ni Microcar-ga ulang
HC-05 Bluetooth-ni Microcar-ga ulang
HC-05 Bluetooth-ni Microcar-ga ulang
HC-05 Bluetooth-ni Microcar-ga ulang
HC-05 Bluetooth-ni Microcar-ga ulang
HC-05 Bluetooth-ni Microcar-ga ulang

Buning uchun sizga Android telefoni, bluetooth HC-05 moduli va simli FTDI seriyali adapter kerak bo'ladi. Shuningdek, biz bluetooth moduli bilan bog'lanish uchun Arduino IDE -dan foydalanamiz.

Avval mikroavtobus bluetooth manzilini bilishimiz kerak:

- telefoningizda bluetooth -ni yoqing

- mashinani yoqing va Android sozlamalarining bluetooth bo'limiga o'ting

- yangi qurilmalarni qidiring va "Microcar" deb nomlangan qurilma paydo bo'lishi kerak

- ushbu qurilma bilan ulang

- keyin bluetooth MAC -ni chiqarib olish uchun men ushbu ilovani Google Play Serial Bluetooth terminalidan ishlatganman

Ushbu ilovani o'rnatgandan so'ng, menyu -> qurilmalarga o'ting va u erda siz bluetooth bilan bog'langan barcha qurilmalar ro'yxatini ko'rasiz. Bizni faqat "Microcar" minasi ostidagi kod qiziqtiradi: 06: 66: 49: A0: 4B

Keyin FTDI adapterini bluetooth moduliga ulang. Avval VCC va GROUND pinlari, keyin bluetooth TX uchun FTDI RX va bluetooth RX uchun FTDI TX. Shuningdek, bluetooth modulida VCC ga ulangan pin bo'lishi kerak. Buning uchun bluetooth moduli "dasturlashtiriladigan rejim" ga kiradi. Mening modulda VCC ni maxsus pin bilan bog'laydigan tugma mavjud. FTDI -ni USB -ga ulaganingizda, bu maxsus dasturlashtiriladigan rejimga kirish uchun ulangan pin / tugma bosilgan bo'lishi kerak. Bluetooth har 2 soniyada sekin miltillab, ushbu ish rejimiga kirishni tasdiqlaydi.

Arduino IDE -da ketma -ket portni tanlang, so'ngra ketma -ket monitorni oching (NL ham, CR ham 9600 uzatish tezligi bilan). AT kiriting va modul "OK" bilan tasdiqlanishi kerak.

Modulni asosiy rejimga o'tkazish uchun "AT+ROLE = 1" yozing. Bluetooh moduli bilan bog'lanish uchun "AT+BIND = 0006, 66, 49A04B" deb yozing, "00: 06: 66: 49: A0: 4B" ning "0006, 66, 49A04B" ga qanday aylanganiga e'tibor bering. Xo'sh, siz bluetooh MAC uchun ham xuddi shunday o'zgartirishingiz kerak.

Endi Zenwheels avtomashinasini yoqing, so'ng FTDI -ni ajratib oling va tugma bosilmasdan / maxsus pin ulanmagan holda qayta ulang. Biroz vaqt o'tgach, u mashinaga ulanishi kerak va siz mashinaning ma'lum bir ulanishni muvaffaqiyatli bajarayotganini ko'rasiz.

Muammolarni bartaraf qilish; nosozliklarni TUZATISH:

- Menda mavjud bo'lgan barcha Bluetooth modullaridan faqat tugmachali usta ishlaganini aniqladim!

- mashina to'liq zaryadlanganligiga ishonch hosil qiling

- mashina telefonga ulanmaganligiga ishonch hosil qiling

- agar Bluetooth AT rejimiga kirsa (sekin miltillaydi), lekin u buyruqqa javob bermasa, BOTH NL & CR ga ega ekanligingizga ishonch hosil qiling, shuningdek boshqa BAUD stavkalari bilan tajriba o'tkazing.

- RX TX ga ulanganligini ikki marta tekshiring va aksincha

- ushbu qo'llanmani sinab ko'ring

6 -qadam: Kod va foydalanish

Avval siz ikkita kutubxonani yuklab olishingiz va o'rnatishingiz kerak:

1. Giroskop uchun MPU6050 kutubxonasi

2. I2CDev kutubxonasi manbasi

Keyin kutubxonamni bu erdan yuklab oling va o'rnating yoki pastdan nusxa oling:

/** * Kutubxonalar: * 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 bayt buyrug'iStering = 129; const bayt buyrug'iSpeed = 130;

bool boshlang'ich = noto'g'ri; // agar DMP boshlang'ichi muvaffaqiyatli bo'lsa, rost

uint8_t mpuIntStatus; // MPU uint8_t devStatus -dan haqiqiy uzilish holati baytiga ega; // har bir qurilma ishidan keyin holatni qaytarish (0 = muvaffaqiyat,! 0 = xato) uint16_t packetSize; // kutilgan DMP paket hajmi (standart 42 bayt) uint16_t fifoCount; // hozirda FIFOda mavjud bo'lgan barcha baytlar soni uint8_t fifoBuffer [64]; // FIFO saqlash buferi Quaternion q; // [w, x, y, z] quaternionli konteyner VectorFloat gravitatsiyasi; // [x, y, z] tortishish vektori float ypr [3]; // [yaw, pitch, roll] yaw/pitch/roll konteyner va tortishish vektori o'zgaruvchan bool mpuInterrupt = false; // MPU uzilish pimi yuqori ko'tarilganligini ko'rsatadi

imzosiz uzoq lastPrintTime, lastMoveTime = 0;

SoftwareSerial BTserial (10, 11);

MPU6050 MPa;

bo'sh o'rnatish ()

{Serial.begin (9600); BTserial.begin (38400); Serial.println ("Dastur boshlandi"); ishga tushirish = ishga tushirishGiroskop (); }

void loop () {

if (! ishga tushirish) {qaytish; } mpuInterrupt = noto'g'ri; mpuIntStatus = mpu.getIntStatus (); fifoCount = mpu.getFIFOCount (); agar (hasFifoOverflown (mpuIntStatus, fifoCount)) {mpu.resetFIFO (); qaytish; } if (mpuIntStatus & 0x02) {while (fifoCount <packetSize) {fifoCount = mpu.getFIFOCount (); } mpu.getFIFOBytes (fifoBuffer, packetSize); fifoCount -= packetSize; mpu.dmpGetQuaternion (& q, fifoBuffer); mpu.dmpGetGravity (& tortish kuchi, & q); mpu.dmpGetYawPitchRoll (ypr, & q, & tortishish); boshqarish (ypr [0] * 180/M_PI, ypr [1] * 180/M_PI, ypr [2] * 180/M_PI); }}

/*

* 0 dan 180 gacha burchak oladi, bu erda 0 maksimal chap va 180 maksimal o'ng * Tezlikni -90 dan 90 gacha qabul qiladi, bu erda -90 maksimal orqaga va 90 maksimal oldinga */ bo'sh harakat ZwheelsCar (bayt burchagi, int tezligi) {if (millis () - lastMoveTime = 90) {resultAngle = map (burchak, 91, 180, 1, 60); } else if (burchak 0) {resultSpeed = map (tezlik, 0, 90, 0, 60); } else if (tezlik <0) {resultSpeed = map (tezlik, 0, -90, 120, 60); } Serial.print ("actualAngle ="); Serial.print (burchak); Serial.print (";"); Serial.print ("actualSpeed ="); Serial.print (resultSpeed); Serial.println (";"); BTserial.write (commandStering); BTserial.write (resultAngle); BTserial.write (commandSpeed); BTserial.write ((bayt) resultSpeed); lastMoveTime = millis (); }

bekor boshqaruvchi (int x, int y, int z)

{x = cheklash (x, -1 * MAX_ANGLE, MAX_ANGLE); y = cheklash (y, -1 * MAX_ANGLE, MAX_ANGLE); z = cheklash (z, -MAX_ANGLE, MAX_ANGLE); int burchagi = xarita (y, -MAX_ANGLE, MAX_ANGLE, 0, 180); int tezligi = xarita (z, -MAX_ANGLE, MAX_ANGLE, 90, -90); printDebug (x, y, z, burchak, tezlik); moveZwheelsCar (burchak, tezlik); }

void printDebug (int x, int y, int z, int burchak, int tezligi)

{if (millis () - lastPrintTime <1000) {qaytish; } 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 ("burchak ="); Serial.print (burchak); Serial.print (";"); Serial.print ("tezlik ="); Serial.print (tezlik); Serial.println (";"); lastPrintTime = millis (); }

boolni ishga tushirishGiroskop ()

{Wire.begin (); mpu.initialize (); Serial.println (mpu.testConnection ()? F ("MPU6050 ulanishi muvaffaqiyatli"): F ("MPU6050 ulanishi bajarilmadi")); devStatus = mpu.dmpInitialize (); mpu.setXGyroOffset (220); mpu.setYGyroOffset (76); mpu.setZGyroOffset (-85); mpu.setZAccelOffset (1788); if (devStatus! = 0) {Serial.print (F ("DMP boshlang'ichi muvaffaqiyatsiz tugadi (kod")); Serial.println (devStatus); noto'g'ri qaytish;} mpu.setDMPEnabled (rost); Serial.println (F ("Yoqish) uzilishni aniqlash (Arduino tashqi uzilish 0)… ")); attachInterrupt (0, dmpDataReady, RISING); mpuIntStatus = mpu.getIntStatus (); Serial.println (F (" DMP tayyor! Birinchi uzilishni kutish … ")); packetSize = mpu.dmpGetFIFOPacketSize (); rostini qaytarish;}

void dmpDataReady ()

{mpuInterrupt = to'g'ri; }

boolean hasFifoOverflown (int mpuIntStatus, int fifoCount)

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

Kodni FTDI adapteri yordamida arduino -ga yuklang, so'ng batareyalarni ulang.

Masofadan boshqarish pultidan foydalanish:

Arduino yoqilgandan so'ng, mashinani ham yoqing. HC-05 moduli mashinaga ulanishi kerak, bu sodir bo'lganda mashina ovoz chiqaradi. Agar u ishlamasa, iltimos, oldingi qadam va muammolarni bartaraf etish bo'limini tekshiring.

Agar siz non taxtasini oldinga egib qo'ysangiz, mashina oldinga, o'ngga va mashina o'ngga siljishi kerak. Bundan tashqari, u asta -sekin harakatlarni amalga oshiradi, masalan, bir oz oldinga va bir oz chapga egilish, bu holda mashina sekin chapga ketadi.

Agar mashina non taxtasini qiyshaytirganda boshqacha yo'l tutsa, avval non taxtasini turli yo'nalishlarda ushlab turing.

U qanday ishlaydi:

Eskiz har 100 msda giroskop koordinatalarini oladi, hisob -kitob qiladi va keyin bluetooth orqali avtomobil buyruqlarini uzatadi. Birinchidan, x, y va z burchaklari bilan chaqiriladigan "boshqarish" usuli mavjud. Bu usul rulni 0 dan 180 gradusgacha va tezlikni -90 dan 90 gacha o'zgartiradi. Bu usul chaqiradi

void moveZwheelsCar (bayt burchagi, int tezligi), u rulni va tezlikni ZenWheels texnik xususiyatlariga o'zgartiradi va bluetooth yordamida buyruqlarni uzatadi.

Transformatsiyani ikki bosqichda amalga oshirishimning sababi - qayta foydalanish. Agar men ushbu eskizni boshqa qurilmani masofadan boshqarishga moslashtirishim kerak bo'lsa, men tezlikni va boshqarishni ba'zi foydali qiymatlarga moslashtiradigan "boshqarish" asosiy usulidan boshlagan bo'lardim.

7 -qadam: Variantlar

"Teskari muhandislik" ga alternativa. Men Android ilovasini ishga tushirib, loyihani qanday teskari o'zgartirish haqida gaplashdim. Ammo bunga alternativa bor, siz FTDI + bluetooth seriyali qulini o'rnatishingiz mumkin (asosiy sozlamalarni ko'rsatmasdan oddiy HC-05). Keyin ZenWheels ilovasidan "mikrokar" o'rniga HC-05 ga ulaning.

Buyruqlarni dekodlash uchun siz rulni biron bir holatda ushlab turishingiz kerak, keyin python skriptidan foydalanib ketma -ket aloqani tahlil qiling. Men python skriptini taklif qilaman, chunki chop etilmaydigan belgilar mavjud va Arduino IDE bunga mos kelmaydi. Agar siz g'ildirakni bir holatda ushlab tursangiz, ilova muntazam ravishda bir xil ikki bayt uzatilishini ko'rasiz. Agar siz g'ildirak o'rnini o'zgartirsangiz, birinchi bayt o'zgarmaydi, ikkinchisi o'zgaradi. Ko'p sinovlardan so'ng siz boshqaruv algoritmini, so'ngra teskari muhandis gaz kelebeğini va boshqalarni o'ylab topishingiz mumkin.

Arduino asosidagi masofadan boshqarish pultiga muqobil RaspberryPi pulti bo'ladi. Malinali pi -da o'rnatilgan "bluetooth" moduli bor, uni "master" rejimida o'rnatish og'riqsiz va bluetooth -ning piton kutubxonasi joziba kabi ishlaydi. Bundan tashqari, Alexa echo yordamida mashinani boshqarish kabi yana bir qancha qiziqarli loyihalar bo'lishi mumkin:)

Umid qilamanki, sizga loyiha yoqdi va quyida izoh qoldiring!

Tavsiya: