Оглавление:

Взломанный пульт дистанционного управления для микрокара ZenWheels: 7 шагов
Взломанный пульт дистанционного управления для микрокара ZenWheels: 7 шагов

Видео: Взломанный пульт дистанционного управления для микрокара ZenWheels: 7 шагов

Видео: Взломанный пульт дистанционного управления для микрокара ZenWheels: 7 шагов
Видео: Радиоуправляемая машинка на базе Arduino, которая также является телефоном — ESP32 WiPhone 2024, Ноябрь
Anonim
Image
Image
сборка
сборка

В этом уроке мы собираемся создать собственный пульт дистанционного управления для микрокара ZenWheels. Микрокар ZenWheels - это 5-сантиметровый игрушечный автомобиль, которым можно управлять через приложение для Android или Iphone. Я собираюсь показать вам, как перепроектировать приложение Android, чтобы узнать о протоколе связи и о том, как создать пульт дистанционного управления с помощью Arduino и гироскопа.

Шаг 1. Компоненты и инструменты

Части:

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

2. Arduino pro mini 328p

3. Макетная плата

4. Гироскоп MPU6050

5. Источник питания <= 5 В (некоторая батарея, которую мы можем прикрепить к макетной плате)

6. П-образные соединительные кабели (опция). Я использовал эти перемычки, потому что они лучше смотрятся на макетной плате. Вместо них можно использовать обычные кабельные перемычки.

7. Bluetooth-модуль HC-05 (с кнопкой перехода в режим AT)

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

1. Переходник с USB на последовательный FTDI FT232RL для программирования Arduino pro mini.

2. Arduino IDE

3. Телефон Android

4. Android Studio [необязательно]

Шаг 2. Обратный инжиниринг Android-приложения ZenWheels [необязательно]

Для понимания этой части требуются некоторые знания Java и Android.

Цель проекта - управлять микрокаром с помощью гироскопа. Для этого нам нужно узнать больше о связи Bluetooth между этой игрушкой и приложением для Android.

На этом этапе я объясню, как перепроектировать протокол связи между микрокаром и приложением для Android. Если вы просто хотите собрать пульт, в этом шаге нет необходимости. Один из способов узнать о протоколе - посмотреть исходный код. Хм, но это непросто, приложения для Android скомпилированы и можно установить apk через google play.

Итак, я сделал базовое руководство для этого:

1. Загрузите APK. Android Package Kit (сокращенно APK) - это формат файла пакета, используемый операционной системой Android для распространения и установки мобильных приложений.

Сначала найдите приложение в магазине Google Play, в нашем случае выполните поиск «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:

публичная пустая запись (байт выход)

Это хорошее начало, я искал используемый метод.write (и есть класс «ZenWheelsMicrocar», который расширяет наш «BluetoothSerialService». Этот класс содержит большую часть логики нашего взаимодействия через Bluetooth. Другая часть логика находится в контроллерах: BaseController и StandardController.

В BaseController у нас есть инициализация службы, а также определения каналов управления и дросселирования, каналы на самом деле являются префиксами команд, чтобы указать, что за ними последует какой-то тип команды:

защищенный микрокар ZenWheelsMicrocar = новый ZenWheelsMicrocar (this, this.btHandler);

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

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

public void handleSteering (TouchEvent touchEvent) {

… This.microcar.setChannel (SteeringOutput.channel, рулевое управлениеOutput.resolveValue ()); }

Анализируя метод, можно сделать вывод, что у функции SteeringOutput.channel значение 129 (канал, используемый для управления), а у элемента SteeringOutput.resolveValue () может быть значение от -90 до 90. Значение канала (129) отправляется напрямую, а значение управления изменяется. применяя побитовые операции:

private final int value_convert_out (int value) {

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

В 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 батарейных блока AA с 4 батареями

6. П-образные соединительные кабели (опция). Я использовал эти соединительные кабели, потому что они лучше смотрятся на макетной плате, и светодиоды в этом случае лучше видны. Если у вас нет этих кабелей, вы можете заменить их проводами Dupont.

Вышеуказанные цены взяты с eBay.

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

1. Переходник с USB на последовательный FTDI FT232RL для программирования arduino pro mini

2. Arduino IDE

3. Android Studio (необязательно, если вы хотите самостоятельно перепроектировать)

Шаг 4: Сборка

сборка
сборка

Сборка очень простая, потому что мы делаем это на макетной плате:)

- сначала размещаем на макете наши компоненты: микроконтроллер, модуль bluetooth и гироскоп

- подключите контакты HC-05 bluetooth RX и TX к контактам 10 и 11 Arduino. Гироскоп SDA и SCL должны быть подключены к контактам Arduino A4 и A5.

- подключите контакты питания к bluetooth, гироскопу и ардуино. контакты должны быть подключены к + и - на стороне макета

- в последнюю очередь подключите источник питания (от 3,3 В до 5 В) к макетной плате, я использовал небольшую одноячеечную батарею LiPo, но подойдет любой, если он находится в диапазоне мощности

Пожалуйста, проверьте изображения выше, чтобы получить более подробную информацию.

Шаг 5. Сопряжение HC-05 Bluetooth с микрокаром

Сопряжение HC-05 Bluetooth с микрокаром
Сопряжение HC-05 Bluetooth с микрокаром
Сопряжение HC-05 Bluetooth с микрокаром
Сопряжение HC-05 Bluetooth с микрокаром
Сопряжение HC-05 Bluetooth с микрокаром
Сопряжение HC-05 Bluetooth с микрокаром

Для этого вам понадобится телефон Android, модуль Bluetooth HC-05 и последовательный адаптер FTDI с проводами. Также мы будем использовать Arduino IDE для связи с модулем Bluetooth.

Для начала нам нужно узнать bluetooth-адрес микрокара:

- включить bluetooth на телефоне

- включите машину и перейдите в раздел bluetooth ваших настроек в Android

- ищите новые устройства и должно появиться какое-то устройство под названием «Микрокар»

- сопряжение с этим устройством

- затем, чтобы извлечь MAC-адрес Bluetooth, я использовал это приложение из последовательного терминала 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 секунды.

В 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». Что ж, вы должны сделать то же преобразование для вашего bluetooh MAC.

Теперь включите автомобиль Zenwheels, затем отключите FTDI и снова подключите его, не нажимая кнопку / не подключая специальный контакт. Через некоторое время он должен подключиться к автомобилю, и вы заметите, что автомобиль издает определенный звук успешного подключения.

Исправление проблем:

- Я обнаружил, что из всех модулей Bluetooth, которые у меня были, только один с кнопкой работал мастером!

- убедитесь, что автомобиль полностью заряжен

- убедитесь, что машина не подключена к телефону

- если Bluetooth переходит в режим AT (медленно мигает), но не отвечает на команду, убедитесь, что у вас есть ОБА NL и CR, а также поэкспериментируйте с другими скоростями передачи данных.

- дважды проверьте, что 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 byte commandStering = 129; const byte commandSpeed = 130;

bool initialization = false; // устанавливаем истину, если инициализация 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 gravity; // [x, y, z] вектор гравитации float ypr [3]; // [рыскание, тангаж, крен] yaw / pitch / roll контейнер и вектор силы тяжести volatile bool mpuInterrupt = false; // указывает, перешел ли вывод прерывания MPU в высокий уровень

беззнаковый длинный lastPrintTime, lastMoveTime = 0;

SoftwareSerial BTserial (10, 11);

MPU6050 mpu;

установка void ()

{Serial.begin (9600); BTserial.begin (38400); Serial.println («Программа запущена»); инициализация = initializeGyroscope (); }

void loop () {

если (! инициализация) {возврат; } mpuInterrupt = false; mpuIntStatus = mpu.getIntStatus (); fifoCount = mpu.getFIFOCount (); если (hasFifoOverflown (mpuIntStatus, fifoCount)) {mpu.resetFIFO (); возвращение; } если (mpuIntStatus & 0x02) {в то время как (fifoCount <размер пакета) {fifoCount = mpu.getFIFOCount (); } mpu.getFIFOBytes (fifoBuffer, packetSize); fifoCount - = размер пакета; mpu.dmpGetQuaternion (& q, fifoBuffer); mpu.dmpGetGravity (& gravity, & 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 (byte angle, int speed) {if (millis () - lastMoveTime = 90) {resultAngle = map (угол, 91, 180, 1, 60); } иначе, если (угол 0) {resultSpeed = map (скорость, 0, 90, 0, 60); } иначе, если (скорость <0) {resultSpeed = map (speed, 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 (); }

пустое рулевое управление (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 angle = map (y, -MAX_ANGLE, MAX_ANGLE, 0, 180); int speed = map (z, -MAX_ANGLE, MAX_ANGLE, 90, -90); printDebug (x, y, z, угол, скорость); moveZwheelsCar (угол, скорость); }

void printDebug (int x, int y, int z, int angle, int скорость)

{если (миллис () - 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 = миллис (); }

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 (код")); 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 (); вернуть истину;}

void dmpDataReady ()

{mpuInterrupt = истина; }

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

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

Загрузите код с помощью адаптера FTDI в Arduino, затем подключите батареи.

Используя пульт:

После того, как Arduino включен, также включите автомобиль. Модуль HC-05 должен подключиться к автомобилю, когда это произойдет, машина издаст звук. Если это не сработает, проверьте предыдущий шаг и раздел устранения неполадок.

Если вы наклоните макетную плату вперед, машина должна двигаться вперед, вправо, а машина должна двигаться вправо. Он также выполняет более плавные движения, такие как наклон немного вперед и немного влево, в этом случае машина будет медленно двигаться влево.

Если автомобиль идет другим путем, при наклоне макета сначала держите макет в разных направлениях.

Как это работает:

Скетч получает координаты гироскопа каждые 100 мс, производит вычисления и затем передает по Bluetooth команды автомобиля. Во-первых, есть метод "рулевого управления", который вызывается с исходными значениями углов x, y и z. Этот метод преобразует поворот от 0 до 180 градусов и ускорение от -90 до 90. Этот метод вызывает

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

Причина, по которой я сделал преобразование в два этапа, - возможность повторного использования. Если бы мне нужно было адаптировать этот скетч для дистанционного управления каким-либо другим устройством, я бы начал с базового метода «рулевого управления», который уже сопоставляет скорость и рулевое управление с некоторыми полезными значениями.

Шаг 7: альтернативы

Альтернатива «обратному инжинирингу». Я говорил о том, как реконструировать проект, начав с приложения для Android. Но есть альтернатива этому, вы можете настроить последовательное ведомое устройство FTDI + bluetooth (обычный HC-05 без указания основных настроек). Затем из приложения ZenWheels подключайтесь к HC-05 вместо «микрокара».

Чтобы расшифровать команды, вам нужно удерживать руль в каком-либо положении, а затем с помощью скрипта Python проанализировать последовательную связь. Я предлагаю сценарий python, потому что есть непечатаемые символы, а IDE Arduino для этого не подходит. Вы заметите, что если вы удерживаете колесо в одном положении, приложение будет регулярно передавать одни и те же два байта. Если вы измените положение колеса, первый байт останется прежним, второй - изменится. После многих испытаний вы можете придумать алгоритм рулевого управления, затем перепроектировать дроссель и т. Д.

Альтернативой пульту на базе Arduino может быть пульт RaspberryPi. Raspberry Pi имеет встроенный модуль bluetooth, который безболезненно настраивается в режиме «master», а библиотека bluetooth python работает как шарм. Также возможны еще несколько интересных проектов, например, управление автомобилем с помощью Alexa echo:)

Надеюсь, вам понравился проект, оставляйте комментарии ниже!

Рекомендуемые: