Мазмұны:

ZenWheels Microcar үшін қашықтан басқару пульті: 7 қадам
ZenWheels Microcar үшін қашықтан басқару пульті: 7 қадам

Бейне: ZenWheels Microcar үшін қашықтан басқару пульті: 7 қадам

Бейне: ZenWheels Microcar үшін қашықтан басқару пульті: 7 қадам
Бейне: ВОТ ТАКОЙ КИТАЙ МЫ ЖДАЛИ (ПЕРВЫЙ ОБЗОР НОВИНКИ)! ЛУЧШИЙ КИТАЙСКИЙ КРОССОВЕР 2023 ГОДА (DORCEN G70S) 2024, Маусым
Anonim
Image
Image
Ассамблея
Ассамблея

Бұл оқулықта біз ZenWheels микрокарасы үшін реттелетін қашықтан басқару пультін құрамыз. ZenWheels микрокарабы - бұл 5 см ойыншық, оны Android немесе Iphone қосымшасы арқылы басқаруға болады. Мен сізге байланыс протоколы мен arduino мен гироскоптың көмегімен қашықтан басқару пультін қалай құруға болатынын білу үшін Android қосымшасын қалай өзгерту керектігін көрсетемін.

1 -қадам: Компоненттер мен құралдар

Бөлшектер:

1. ZenWheels микрокарасы

2. Arduino pro mini 328p

3. Нан тақтасы

4. MPU6050 гироскопы

5. қуат көзі <= 5 в (біз тақтаға қосуға болатын батарея)

6. U-тәрізді секіргіш кабельдер (міндетті емес). Мен бұл өтпелі кабельдерді қолдандым, себебі олар тақтада жақсы көрінеді. Оның орнына кәдімгі өтпелі кабельдерді қолдануға болады

7. HC-05 bluetooth модулі (AT режиміне кіру түймесі бар)

Құралдар:

1. USB Arduino pro mini бағдарламалау үшін FTDI FTI3232 сериялық адаптерінен

2. Arduino IDE

3. Android телефоны

4. Android Studio [Қосымша]

2 -қадам: ZenWheels Android қосымшасына кері инженерлік жасау (міндетті емес)

Бұл бөлікті түсіну үшін Java мен Android туралы біраз білім қажет.

Жобаның мақсаты - микрокараны гироскоп көмегімен басқару. Бұл үшін біз бұл ойыншық пен андроид қосымшасы арасындағы bluetooth байланысы туралы көбірек білуіміз керек.

Бұл қадамда мен микрокар мен андроид қосымшасы арасындағы байланыс хаттамасын қалай кері өзгерту керектігін түсіндіремін. Егер сіз қашықтан басқару құралын жасағыңыз келсе, бұл қадам қажет емес. Протоколды табудың бір жолы - бастапқы кодты қарау. Хм, бірақ бұл бірден емес, андроид қосымшалары жинақталған және Google Play арқылы apk орнатуға болады.

Сондықтан мен мұны істеу үшін негізгі нұсқаулық жасадым:

1. APK жүктеңіз. Android пакеттер жинағы (қысқаша APK) - бұл мобильді қосымшаларды тарату және орнату үшін Android операциялық жүйесі қолданатын пакеттік файл пішімі.

Алдымен google play дүкенінен қосымшаны іздеңіз, біздің жағдайда «zenwheels» іздеңіз, сіз қосымшаның сілтемесін аласыз

Содан кейін google -ден «онлайн apk жүктеушісін» іздеңіз және оны жүктеу үшін біреуін пайдаланыңыз. Әдетте олар қосымшаның сілтемесін сұрайды (біз бұрын алғанбыз), содан кейін біз жүктеу түймесін басып, оны компьютерге сақтаймыз.

2. APK файлын қайта құрастырыңыз. Біздің жағдайда декомпилятор - бұл APK қабылдайтын және Java бастапқы кодын шығаратын құрал.

Ең қарапайым шешім - бұл жұмысты орындау үшін онлайн декомпиляторды қолдану. Мен google -ден «онлайн декомпиляторды» іздедім және https://www.javadecompilers.com/ сайтын таңдадым. Сізге бұрын алған APK жүктеу керек

декомпиляцияны басыңыз. Содан кейін сіз тек дереккөздерді жүктейсіз.

3. Инженерді кодты қарап шығуға тырысыңыз

Жобаны ашу үшін сізге мәтіндік редактор немесе жақсырақ IDE (интеграцияланған даму ортасы) қажет. Android жобалары үшін әдепкі IDE - Android Studio (https://developer.android.com/studio). Android Studio орнатқаннан кейін жоба қалтасын ашыңыз.

Біздің автокөлік bluetooth арқылы басқарылатындықтан, мен іздеуді «bluetooth» кілтсөзімен декомпиляцияланған кодтан бастадым, мен «BluetoothSerialService» байланыстың қолында болды деп таптым. Егер бұл сынып байланысты басқарса, онда жіберудің командалық әдісі болуы керек. Мәліметтерді bluetooth арнасы арқылы жіберетін бір жазу әдісі бар екені белгілі болды:

жалпыға жарамсыз жазу (байт шығару)

Бұл жақсы бастама, мен.write іздедім (қолданылатын әдіс және біздің «BluetoothSerialService» қызметімізді кеңейтетін «ZenWheelsMicrocar» класы бар. Бұл класс Bluetooth арқылы байланыс логикасының көп бөлігін қамтиды. Басқа бөлігі) логика контроллерлерде: BaseController және StandardController.

BaseController -де бізде қызметтің инициализациясы, сонымен қатар рульдік және дроссельдік арналардың анықтамалары бар, арналар командалық префикстер болып табылады, олар команданың қандай да бір түрінің орындалатынын көрсетеді:

қорғалған ZenWheelsMicrocar микрокар = жаңа ZenWheelsMicrocar (бұл, бұл.btHandler);

қорғалған ChannelOutput шығысы = {жаңа TrimChannelOutput (ZenWheelsMicrocar. STEERING_CHANNEL), жаңа TrimChannelOutput (ZenWheelsMicrocar. THROTTLE_CHANNEL)};

StandardController -де руль басқарылады:

public void handleSteering (TouchEvent touchEvent) {

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

Әдісті талдай отырып, steeringOutput.channel 129 мәніне ие (басқару үшін қолданылатын арна) және steeringOutput.resolveValue () мәні -90 мен 90 аралығында болуы мүмкін. Арна мәні (129) тікелей жіберіледі, ал рульдік мән өзгертіледі разрядты операцияларды қолдану арқылы:

жеке соңғы int value_convert_out (int мәні) {

логикалық теріс = жалған; if (мән <0) {теріс = f6D; } int мәні2 = мән & 63; if (теріс) {қайтарылатын мән2 | 64; } қайтарылатын мән2; }

StandardController -де ұқсас әдіс бар

public void handleThrottle (TouchEvent touchEvent)

3 -қадам: компоненттер

Бөлшектер:

1. Arduino pro mini 328p 2 $

2. Нан тақтасы

3. MPU6050 гироскопы 1,2 $

4. HC-05 master-slave 6 істікшелі модуль 3 $

5. 4 аккумуляторы бар 4 x AA батареялар жинағы

6. U-тәрізді секіргіш кабельдер (міндетті емес). Мен бұл өтпелі кабельдерді қолдандым, себебі олар тақтада жақсы көрінеді, ал светодиодтар осылайша көрінеді. Егер сізде бұл кабельдер болмаса, оларды дюпондық сымдарға ауыстыруға болады.

Жоғарыда көрсетілген бағалар eBay -ден алынған.

Құралдар:

1. Arduino pro mini бағдарламалау үшін FT232RL сериялық FTDI адаптерінен USB

2. Arduino IDE

3. Android Studio (егер сіз өзіңізге инженер болғыңыз келсе, міндетті емес)

4 -қадам: құрастыру

Ассамблея
Ассамблея

Құрастыру өте қарапайым, өйткені біз оны тақтада жасаймыз:)

- алдымен біз өз компоненттерімізді нан тақтасына орналастырамыз: микроконтроллер, bluetooth модулі және гироскоп

- HC-05 bluetooth RX және TX түйреуіштерін arduino 10 және 11 істіктерге жалғаңыз. SDA және SCL гироскопы arduino A4 және A5 түйреуіштеріне қосылуы керек

- қуат түйреуіштерін bluetooth, гиро және arduino -ға қосыңыз. түйреуіштер тақтаның + және - жағына қосылуы керек

- соңғы рет тақтаны қуат көзіне қосыңыз (3,3 В -тан 5 В -қа дейін), мен кішкене LiPo бір ұялы батареяны қолдандым, бірақ кез келгені қуат диапазонында болады.

Толық ақпарат алу үшін жоғарыдағы суреттерді тексеріңіз

5-қадам: HC-05 Bluetooth-ны Microcar-ке жұптаңыз

HC-05 Bluetooth-ны Microcar-пен байланыстырыңыз
HC-05 Bluetooth-ны Microcar-пен байланыстырыңыз
HC-05 Bluetooth-ны Microcar-ке қосыңыз
HC-05 Bluetooth-ны Microcar-ке қосыңыз
HC-05 Bluetooth-ны Microcar-пен байланыстырыңыз
HC-05 Bluetooth-ны Microcar-пен байланыстырыңыз

Бұл үшін сізге Android телефоны, bluetooth HC-05 модулі және сымдары бар сериялық FTDI адаптері қажет. Сонымен қатар, біз Bluetooth модулімен байланысу үшін Arduino IDE қолданамыз.

Алдымен біз микрокардың Bluetooth адресін білуіміз керек:

- телефонда bluetooth қосыңыз

- көлікті қосыңыз және Android -дегі параметрлердің Bluetooth бөліміне өтіңіз

- жаңа құрылғыларды іздеңіз және «Microcar» деп аталатын құрылғы пайда болуы керек

- осы құрылғымен жұптаңыз

- содан кейін bluetooth MAC алу үшін мен бұл қосымшаны Google Play Serial Bluetooth терминалынан қолдандым

Бұл қолданбаны орнатқаннан кейін мәзірге -> құрылғыларға өтіңіз, сонда сізде барлық Bluetooth жұпталған құрылғылары бар тізім болады. Бізді «Microcar» шахтасының астындағы код қана қызықтырады: 00: 06: 66: 49: A0: 4B

Содан кейін FTDI адаптерін bluetooth модуліне қосыңыз. Алдымен VCC және GROUND түйреуіштері, содан кейін bluetooth TX үшін FTDI RX және bluetooth RX үшін FTDI TX. Сондай -ақ, Bluetooth модулінде VCC -ге қосылатын түйреуіш болуы керек. Бұл жағдайда bluetooth модулі «бағдарламаланатын режимге» өтеді. Менің модульде VCC -ті арнайы түйреуішке қосатын түйме бар. FTDI -ді USB -ге қосқан кезде, бұл арнайы бағдарламаланатын режимге кіру үшін түймені / түймені басу керек. Bluetooth әр 2 секунд сайын баяу жыпылықтап, осы жұмыс режиміне кіруді растайды.

Arduino IDE -де сериялық портты таңдаңыз, содан кейін сериялық мониторды ашыңыз (NL де, CR де 9600 беру жылдамдығымен). AT теріңіз және модуль «OK» арқылы растауы керек.

Модульді негізгі режимге қою үшін «AT+ROLE = 1» теріңіз. Bluetooh модулімен жұптастыру үшін «AT+BIND = 0006, 66, 49A04B» деп жазыңыз, біздің «00: 06: 66: 49: A0: 4B» қалай «0006, 66, 49A04B» түріне айналғанына назар аударыңыз. Сіз блютух MAC үшін бірдей өзгеріс жасауыңыз керек.

Енді Zenwheels көлігін қосыңыз, содан кейін FTDI -ді ажыратыңыз және түймені баспай / арнайы түйреуішті қоспай қайта қосыңыз. Біраз уақыттан кейін ол көлікке қосылуы керек және сіз белгілі бір байланыс сәтті шыққанын байқайсыз.

Ақаулық себебін іздеу және түзету:

- Менде бар барлық Bluetooth модульдерінің ішінде түйме бар модуль ғана шебер болып жұмыс істейтінін білдім!

- көліктің толық зарядталғанына көз жеткізіңіз

- көліктің телефонға қосылмағанын тексеріңіз

- егер Bluetooth AT режиміне кірсе (баяу жыпылықтайды), бірақ ол командаға жауап бермесе, сізде BOTH NL & CR бар екеніне көз жеткізіңіз, сонымен қатар басқа BAUD тарифтерімен тәжірибе жасаңыз.

- RX TX -ке қосылғанын екі рет тексеріңіз және керісінше

- бұл оқулықты қолданып көріңіз

6 -қадам: код және қолдану

Алдымен сізге екі кітапхананы жүктеу және орнату қажет:

1. Гироскопқа арналған MPU6050 кітапханасы

2. I2CDev кітапханасының көзі

Содан кейін менің кітапханамды осы жерден жүктеңіз және орнатыңыз немесе төменнен көшіріңіз:

/** * Кітапханалар: * 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 байттық командаStering = 129; const байт пәрменіSpeed = 130;

bool инициализациясы = жалған; // егер DMP бастамасы сәтті болса, шын мәнін орнатыңыз

uint8_t mpuIntStatus; // MPU uint8_t devStatus -тан нақты үзіліс статусының байтын ұстайды; // құрылғының әр операциясынан кейін күйді қайтару (0 = сәттілік,! 0 = қате) uint16_t packetSize; // күтілетін DMP пакетінің өлшемі (әдепкі бойынша 42 байт) uint16_t fifoCount; // қазіргі уақытта FIFO -дағы барлық байттардың саны uint8_t fifoBuffer [64]; // FIFO сақтау буфері Quaternion q; // [w, x, y, z] төрттік контейнер VectorFloat гравитациясы; // [x, y, z] гравитациялық вектор float ypr [3]; // [аю, қадам, орама] yaw/pitch/roll контейнері және гравитациялық векторлық тұрақсыз bool mpuInterrupt = false; // MPU үзу түйреуішінің жоғары көтерілгенін көрсетеді

белгісіз ұзақ lastPrintTime, lastMoveTime = 0;

SoftwareSerial BTserial (10, 11);

MPU6050 мегапиксель;

жарамсыз орнату ()

{Serial.begin (9600); BTserial.begin (38400); Serial.println («Бағдарлама басталды»); инициализация = initializeGyroscope (); }

void loop () {

if (! инициализация) {қайтару; } mpuInterrupt = жалған; mpuIntStatus = mpu.getIntStatus (); fifoCount = mpu.getFIFOCount (); if (hasFifoOverflown (mpuIntStatus, fifoCount)) {mpu.resetFIFO (); қайтару; } if (mpuIntStatus & 0x02) {while (fifoCount <packetSize) {fifoCount = mpu.getFIFOCount (); } mpu.getFIFOBytes (fifoBuffer, packetSize); fifoCount -= packetSize; mpu.dmpGetQuaternion (& q, fifoBuffer); mpu.dmpGetGravity (& гравитация, & q); mpu.dmpGetYawPitchRoll (ypr, & q, & gravity); руль (ypr [0] * 180/M_PI, ypr [1] * 180/M_PI, ypr [2] * 180/M_PI); }}

/*

* 0 -ден 180 -ге дейінгі бұрышты алады, мұнда 0 максималды сол жақта және 180 оң жақта * -90 -дан 90 -ға дейінгі жылдамдықты қабылдайды, мұнда -90 максималды артқа және 90 максималды алға */ void moveZwheelsCar (байт бұрышы, int жылдамдығы) {if (millis () - lastMoveTime = 90) {resultAngle = map (бұрыш, 91, 180, 1, 60); } else if (0 бұрышы) {resultSpeed = map (жылдамдық, 0, 90, 0, 60); } else if (жылдамдық <0) {resultSpeed = map (жылдамдық, 0, -90, 120, 60); } Serial.print («actualAngle =»); Serial.print (бұрыш); Serial.print («;»); Serial.print («actualSpeed =»); Serial.print (resultSpeed); Serial.println («;»); BTserial.write (commandStering); BTserial.write (resultAngle); BTserial.write (commandSpeed); BTserial.write ((байт) resultSpeed); lastMoveTime = миллис (); }

жарамсыз руль (int x, int y, int z)

{x = шектеу (x, -1 * MAX_ANGLE, MAX_ANGLE); y = шектеу (y, -1 * MAX_ANGLE, MAX_ANGLE); z = шектеу (z, -MAX_ANGLE, MAX_ANGLE); int бұрышы = карта (y, -MAX_ANGLE, MAX_ANGLE, 0, 180); int жылдамдығы = карта (z, -MAX_ANGLE, MAX_ANGLE, 90, -90); printDebug (x, y, z, бұрыш, жылдамдық); moveZwheelsCar (бұрыш, жылдамдық); }

жарамсыз printDebug (int x, int y, int z, int бұрышы, int жылдамдығы)

{if (millis () - lastPrintTime <1000) {қайтару; } 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 («бұрыш =»); Serial.print (бұрыш); Serial.print («;»); Serial.print («speed =»); Serial.print (speed); Serial.println («;»); lastPrintTime = миллис (); }

bool инициализациясы гироскоп ()

{Wire.begin (); mpu.initialize (); Serial.println (mpu.testConnection ()? F («MPU6050 қосылымы сәтті»): F («MPU6050 байланысы сәтсіз аяқталды»)); devStatus = mpu.dmpInitialize (); mpu.setXGyroOffset (220); mpu.setYGyroOffset (76); mpu.setZGyroOffset (-85); mpu.setZAccelOffset (1788); if (devStatus! = 0) {Serial.print (F («DMP инициализациясы сәтсіз аяқталды (код»)); Serial.println (devStatus); жалған қайтару;} mpu.setDMPEnabled (шын); Serial.println (F («Қосу үзілісті анықтау (Arduino сыртқы үзілуі 0)… «)); attachInterrupt (0, dmpDataReady, RISING); mpuIntStatus = mpu.getIntStatus (); Serial.println (F (» DMP дайын! Бірінші үзіліс күтілуде … «)); packetSize = mpu.dmpGetFIFOPacketSize (); ақиқатты қайтару;}

void dmpDataReady ()

{mpuInterrupt = ақиқат; }

логикалық hasFifoOverflown (int mpuIntStatus, int fifoCount)

{mpuIntStatus & 0x10 қайтару || fifoCount == 1024; }

FTDI адаптері арқылы кодты arduino -ға жүктеңіз, содан кейін батареяларды қосыңыз.

Қашықтан басқару пультінің көмегімен:

Arduino қосылғаннан кейін машинаны қосыңыз. HC-05 модулі көлікке қосылуы керек, бұл кезде көлік дыбыс шығарады. Егер ол жұмыс істемесе, алдыңғы қадамды және ақауларды жою бөлімін тексеріңіз.

Егер сіз тақтаны алға қарай еңкейтсеңіз, машина алға, оңға, машина оңға жылжуы керек. Ол сондай -ақ бірте -бірте қозғалыстарды орындайды, мысалы, сәл алға және сәл солға еңкейту, бұл жағдайда машина баяу солға қарай жүреді.

Егер автокөлік нанды басқа жолмен бұрса, алдымен тақтаны әр түрлі бағытта ұстаңыз.

Бұл қалай жұмыс істейді:

Эскиз гироскоптың координаттарын әр 100 мс сайын алады, есептеулер жасайды, содан кейін bluetooth арқылы автокөліктің командаларын жібереді. Алдымен шикі x, y және z бұрыштарымен шақырылатын «руль» әдісі бар. Бұл әдіс рульді 0 мен 180 градусқа, ал үдеуді -90 мен 90 аралығында өзгертеді. Бұл әдіс шақырады

руль мен жылдамдықты ZenWheels сипаттамаларына түрлендіретін, содан кейін bluetooth көмегімен командаларды жіберетін void moveZwheelsCar (байт бұрышы, int жылдамдығы).

Мен трансформацияны екі қадаммен жасаған себебім - қайта пайдалану. Егер мен бұл эскизді басқа құрылғыға қашықтан басқаруға бейімдеуім керек болса, мен жылдамдықты және рульді кейбір пайдалы мәндерге салыстыратын негізгі «руль» әдісінен бастар едім.

7 -қадам: баламалар

«Кері инженерлікке» балама. Мен Android қосымшасынан бастап жобаны қалай кері өзгерту керектігін айттым. Бірақ бұған балама бар, сіз FTDI + bluetooth сериялық құлын орната аласыз (негізгі параметрлерді көрсетпестен тұрақты HC-05). Содан кейін ZenWheels қосымшасынан «микрокардың» орнына HC-05-ке қосылыңыз.

Пәрмендерді декодтау үшін сізге руль дөңгелегін бір қалыпта ұстап тұру керек, содан кейін питон сценарийін қолдана отырып, сериялық байланысты талдаңыз. Мен питон сценарийін ұсынамын, себебі басып шығарылмайтын таңбалар бар және Arduino IDE бұл үшін қолайлы емес. Егер сіз дөңгелекті бір күйде ұстасаңыз, бағдарлама үнемі екі байтты жіберетінін байқайсыз. Егер сіз дөңгелектің орнын өзгертсеңіз, бірінші байт өзгеріссіз қалады, екіншісі өзгереді. Көптеген сынақтардан кейін сіз рульдік басқару алгоритмін ойлап таба аласыз, содан кейін дроссельдің кері инженері және т.

Arduino негізіндегі пультке балама RaspberryPi пульті болады. Таңқурай пи кірістірілген bluetooth модуліне ие, оны «мастер» режимінде орнатуға ауыртпалықсыз және питонды Bluetooth кітапханасы әдемілік сияқты жұмыс істейді. Сонымен қатар, Alexa echo көмегімен көлікті басқару сияқты бірнеше қызықты жобалар болуы мүмкін:)

Сізге жоба ұнады деп үміттенемін және төменде түсініктеме қалдырыңыз!

Ұсынылған: