Съдържание:

Хакерско дистанционно управление за микромобил ZenWheels: 7 стъпки
Хакерско дистанционно управление за микромобил ZenWheels: 7 стъпки

Видео: Хакерско дистанционно управление за микромобил ZenWheels: 7 стъпки

Видео: Хакерско дистанционно управление за микромобил ZenWheels: 7 стъпки
Видео: Flipper zero контроль доступа RFID 2024, Юни
Anonim
Image
Image
Монтаж
Монтаж

В този урок ще създадем персонализирано дистанционно управление за микроколата ZenWheels. Микрокар ZenWheels е 5 см автомобил -играчка, който може да се управлява чрез приложение за Android или Iphone. Ще ви покажа как да реконструирате приложението за Android, за да научите за комуникационния протокол и как можете да изградите дистанционно управление с помощта на arduino и жироскоп.

Стъпка 1: Компоненти и инструменти

Части:

1. Микроавтомобилът ZenWheels

2. Arduino pro mini 328p

3. Платформа

4. Жироскоп MPU6050

5. източник на захранване <= 5 v (някаква батерия, която можем да прикачим към макета)

6. Кабелни джъмпери с U-образна форма (по избор). Използвал съм тези джъмперни кабели, защото изглеждат по -добре на макета. Вместо това могат да се използват обикновени джъмперни кабели

7. Bluetooth-модул HC-05 (с бутон за влизане в режим AT)

Инструменти:

1. USB към сериен FTDI адаптер FT232RL за програмиране на Arduino pro mini

2. Arduino IDE

3. Android телефон

4. Android Studio [По избор]

Стъпка 2: Обратно инженерство на приложението ZenWheels за Android [по избор]

За разбиране на тази част са необходими известни познания за Java и Android.

Целта на проекта е да се управлява микроколата с помощта на жироскоп. За това трябва да научим повече за Bluetooth комуникацията между тази играчка и приложението за Android.

В тази стъпка ще обясня как да инженерирам комуникационния протокол между микроколата и приложението за Android. Ако просто искате да изградите дистанционно, тази стъпка не е необходима. Един от начините да откриете протокола е да погледнете изходния код. Хм, но това не е направо, андроид приложенията се компилират и човек може да инсталира apk чрез google play.

Затова направих основно ръководство за това:

1. Изтеглете APK файла. Комплект от пакети за Android (накратко APK) е файловият формат на пакета, използван от операционната система Android за разпространение и инсталиране на мобилни приложения

Първо потърсете приложението в google play store, в нашия случай потърсете „zenwheels“и ще получите връзката към приложението

След това потърсете в google за "онлайн изтегляне на apk" и използвайте един, за да изтеглите apk. Обикновено те ще поискат връзка към приложението (тази, която получихме по -рано), след което ние ще натиснем бутона за изтегляне и ще го запишем на нашия компютър.

2. Декомпилирайте APK файла. Декомпилаторът в нашата ситуация е инструмент, който взема APK и създава изходния код на Java.

Най -простото решение е да използвате онлайн декомпилатор, за да свършите работата. Търсих в google за "онлайн декомпилиране" и избрах https://www.javadecompilers.com/. Просто трябва да качите APK файла, който сте получили по -рано и

натиснете декомпилирането. След това просто изтегляте източниците.

3. Опитайте се да обърнете инженера, като гледате кода

За да отворите проекта, ви е необходим текстов редактор или по -добре IDE (интегрирана среда за разработка). IDE по подразбиране за проекти за Android е Android Studio (https://developer.android.com/studio). След като инсталирате Android Studio, отворете папката на проекта.

Тъй като колата ни се управлява от bluetooth, започнах търсенето си в декомпилиран код с ключовата дума "bluetooth", от случаите, които открих, че "BluetoothSerialService" е в дръжката на комуникацията. Ако този клас обработва комуникацията, той трябва да има метод за изпращане на команда. Оказва се, че има един метод за запис, който изпраща данни през Bluetooth канала:

public void write (байт вън)

Това е добро начало, потърсих.write (използва се метод и има клас "ZenWheelsMicrocar", който разширява нашата "BluetoothSerialService". Този клас съдържа по -голямата част от логиката на нашата комуникация през Bluetooth. Другата част от логиката е в контролерите: BaseController и StandardController.

В BaseController имаме инициализация на услугата, както и дефиниции на каналите за управление и дросели, каналите всъщност са командни префикси, за да се посочи, че ще последва някакъв вид команда:

защитен ZenWheelsMicrocar microcar = нов ZenWheelsMicrocar (този, this.btHandler);

защитен ChannelOutput изходи = {нов TrimChannelOutput (ZenWheelsMicrocar. STEERING_CHANNEL), нов TrimChannelOutput (ZenWheelsMicrocar. THROTTLE_CHANNEL)};

В StandardController управлението се управлява в:

public void handleSteering (TouchEvent touchEvent) {

… This.microcar.setChannel (рулевоизход.канал, управлениеОутпут.ресолвалуал ()); }

Анализирайки метода, channelOutput.channel на стойността 129 има стойност (канал, използван за управление) и чрез прилагане на побитови операции:

private final int value_convert_out (int value) {

логическо отрицателно = невярно; if (стойност <0) {отрицателен = f6D; } int стойност2 = стойност & 63; if (отрицателно) {възвращаема стойност2 | 64; } възвращаема стойност2; }

В StandardController има подобен метод, наречен

обществена дръжка на празнотата Дросел (TouchEvent touchEvent)

Стъпка 3: Компоненти

Части:

1. Arduino pro mini 328p 2 $

2. Платформа

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

4. 6-пинов модул HC-05 master-slave 3 $

5. 4 x AA батерии с 4 батерии

6. Кабелни джъмпери с U-образна форма (по избор). Използвал съм тези джъмпер кабели, защото изглеждат по -добре на макета, а светодиодите са по -видими по този начин. Ако нямате тези кабели, можете да ги замените с кабели dupont.

Горните цени са взети от eBay.

Инструменти:

1. USB към сериен FTDI адаптер FT232RL за програмиране на arduino pro mini

2. Arduino IDE

3. Android Studio (по избор, ако искате сами да направите обратно инженерство)

Стъпка 4: Монтаж

Монтаж
Монтаж

Сглобяването е много просто, защото го правим на макет:)

- първо поставяме нашите компоненти на макета: микроконтролера, Bluetooth модула и жироскопа

- свържете HC-05 bluetooth RX и TX щифтове към arduino 10 и 11 пина. Жироскопът SDA и SCL трябва да бъдат свързани към щифтовете A4 и A5 на arduino

- свържете захранващите щифтове към bluetooth, жироскоп и arduino. щифтовете трябва да бъдат свързани към + и - отстрани на макета

- за последно свържете захранване (между 3.3V до 5V) към макета, използвах малка LiPo едноклетъчна батерия, но всяка ще работи, стига да е в диапазона на мощност

Моля, проверете снимките по -горе за повече подробности

Стъпка 5: Сдвоете HC-05 Bluetooth с Microcar

Сдвоете Bluetooth HC-05 с Microcar
Сдвоете Bluetooth HC-05 с Microcar
Сдвоете Bluetooth HC-05 с Microcar
Сдвоете Bluetooth HC-05 с Microcar
Сдвоете Bluetooth HC-05 с Microcar
Сдвоете Bluetooth HC-05 с Microcar

За това ще ви трябва телефон с Android, Bluetooth модул HC-05 и сериен FTDI адаптер с проводници. Също така ще използваме Arduino IDE за комуникация с Bluetooth модула.

Първо трябва да разберем Bluetooth адреса на микрокар:

- активирайте Bluetooth на телефона си

- включете колата и отидете в секцията за Bluetooth на вашите настройки в Android

- търсене на нови устройства и трябва да се появи някакво устройство, наречено "Microcar"

- сдвояване с това устройство

- след това за извличане на Bluetooth MAC, използвах това приложение от серийния Bluetooth терминал на google play

След като инсталирате това приложение, отидете в меню -> устройства и там ще имате списък с всички сдвоени Bluetooth устройства. Интересуваме се само от кода под мината "Microcar" е 00: 06: 66: 49: A0: 4B

След това свържете FTDI адаптера към Bluetooth модула. Първо VCC и GROUND щифтове и след това FTDI RX към bluetooth TX и FTDI TX към bluetooth RX. Също така трябва да има щифт на Bluetooth модула, който трябва да бъде свързан към VCC. По този начин Bluetooth модулът влиза в "програмируем режим". Моят модул има бутон, който свързва VCC към този специален щифт. Когато включите FTDI в USB, той трябва да бъде със свързан щифт / бутон натиснат, за да влезете в този специален програмируем режим. Bluetooth потвърждава влизането в този режим на работа, като мига бавно на всеки 2 секунди.

В IDE на Arduino изберете серийния порт, след това отворете серийния монитор (както NL, така и CR с 9600 скорост на предаване). Въведете AT и модулът трябва да потвърди с "OK".

Въведете „AT+ROLE = 1“, за да поставите модула в главен режим. За да се сдвоите с вашия bluetooh модул, напишете: "AT+BIND = 0006, 66, 49A04B", Забележете как нашето "00: 06: 66: 49: A0: 4B" се трансформира в "0006, 66, 49A04B". Е, трябва да направите същата трансформация за вашия bluetooh MAC.

Сега включете колата Zenwheels, след това изключете FTDI и го включете отново без натиснат бутон / свързан специален щифт. След известно време тя трябва да се свърже с колата и ще забележите, че колата издава конкретен звук за успешна връзка.

Отстраняване на неизправности:

- Открих, че от всички Bluetooth модули, които имах, само този с бутон работеше като майстор!

- уверете се, че колата е заредена напълно

- уверете се, че колата не е свързана с телефона

- ако Bluetooth влезе в режим AT (мига бавно), но не реагира на команда, уверете се, че имате ОБЕЗИ 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 байт commandStering = 129; const байт commandSpeed = 130;

bool инициализация = false; // задайте true, ако DMP init е успешен

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] гравитационен вектор поплавък ypr [3]; // [криволичене, стъпка, търкаляне] съхранение/терена/ролка контейнер и гравитационен вектор летливи bool mpuInterrupt = false; // показва дали прекъсващият щифт на MPU е станал висок

unsigned long lastPrintTime, lastMoveTime = 0;

SoftwareSerial BTserial (10, 11);

MPU6050 mpu;

void setup ()

{Serial.begin (9600); BTserial.begin (38400); Serial.println ("Програмата стартира"); initialization = initializeGyroscope (); }

void loop () {

if (! инициализация) {return; } mpuInterrupt = false; 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 -= размер на пакета; 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 move ZwheelsCar (байт ъгъл, int скорост) {if (millis () - lastMoveTime = 90) {resultAngle = map (ъгъл, 91, 180, 1, 60); } иначе ако (ъгъл 0) {resultSpeed = карта (скорост, 0, 90, 0, 60); } иначе ако (скорост <0) {resultSpeed = карта (скорост, 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 = millis (); }

void steer (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 (ъгъл, скорост); }

void 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 ("angle ="); Serial.print (ъгъл); Serial.print (";"); Serial.print ("скорост ="); Serial.print (скорост); Serial.println (";"); lastPrintTime = millis (); }

bool initializeGyroscope ()

{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 Initialization failed (code")); Serial.println (devStatus); return false;} mpu.setDMPEnabled (true); Serial.println (F ("Активиране откриване на прекъсване (Arduino външно прекъсване 0) … ")); attachInterrupt (0, dmpDataReady, RISING); mpuIntStatus = mpu.getIntStatus (); Serial.println (F (" DMP готов! Изчакване на първо прекъсване … ")); packetSize = mpu.dmpGetFIFOPacketSize (); връщане true;}

void dmpDataReady ()

{mpuInterrupt = true; }

логическо hasFifoOverflown (int mpuIntStatus, int fifoCount)

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

Качете кода с помощта на FTDI адаптера към arduino и след това свържете батериите.

Използване на дистанционното:

След като arduino бъде включен, включете и колата. Модулът HC-05 трябва да се свърже с колата, когато това се случи, колата ще издава звук. Ако не работи, моля, проверете предишната стъпка и раздела за отстраняване на неизправности.

Ако наклоните макета напред, колата трябва да се движи напред, надясно и колата да се движи надясно. Той също така изпълнява по -постепенни движения като наклон малко напред и малко вляво в този случай колата ще тръгне бавно наляво.

Ако колата тръгне по различен начин, когато наклонявате дъската, първо дръжте дъската в различни посоки.

Как работи:

Скицата получава координатите на жироскопа на всеки 100 ms, прави изчисления и след това предава по bluetooth командите на колата. Първо има метод на "насочване", който се извиква със суровите ъгли x, y и z. Този метод трансформира кормилното управление между 0 и 180 градуса и ускорението между -90 и 90. Този метод изисква

void moveZwheelsCar (ъгъл на байта, int скорост), който преобразува управлението и ускорението в спецификациите на ZenWheels и след това предава командите чрез Bluetooth.

Причината, поради която направих трансформацията в две стъпки, е повторната употреба. ако трябва да адаптирам тази скица към дистанционното управление на друго устройство, бих започнал от базовия метод „управлявам“, който вече нанася скоростта и кормилното управление до някои полезни стойности.

Стъпка 7: Алтернативи

Алтернатива на "обратното инженерство". Говорих за това как да направя обратно инженерство на проекта, като започна с приложението за Android. Но има алтернатива на това, можете да настроите сериен FTDI + bluetooth slave (обикновен HC-05, без да посочвате основните настройки). След това от приложението ZenWheels се свържете с HC-05 вместо с „микрокар“.

За да декодирате командите, ще трябва да задържите волана в някакво положение, след което с помощта на скрипт на python да анализирате серийната комуникация. Предлагам скрипт на python, защото има символи, които не могат да се отпечатват и Arduino IDE не е подходящ за това. Ще забележите, че ако задържите колелото в една позиция, приложението редовно ще предава същите два байта. Ако промените позицията на колелото, първият байт ще остане същият, вторият ще се промени. След много изпитания можете да излезете с алгоритъма за управление, след това задния инженер дросели и т.н.

Алтернатива на дистанционното управление на базата на arduino би било дистанционното RaspberryPi. Raspberry pi има вграден bluetooth модул, който е безболезнен за настройка в режим "master" и библиотеката на bluetooth на python работи като чар. Възможни са и още интересни проекти като управление на колата с помощта на Alexa echo:)

Надявам се проектът да ви хареса и моля, оставете коментари по -долу!

Препоръчано: