Spisu treści:
- Krok 1: Komponenty i narzędzia
- Krok 2: Inżynieria wsteczna aplikacji ZenWheels na Androida [opcjonalnie]
- Krok 3: Komponenty
- Krok 4: Montaż
- Krok 5: Sparuj HC-05 Bluetooth z Microcar
- Krok 6: Kod i użycie
- Krok 7: Alternatywy
Wideo: Hakowalny pilot do mikrosamochodu ZenWheels: 7 kroków
2024 Autor: John Day | [email protected]. Ostatnio zmodyfikowany: 2024-01-30 11:29
W tym samouczku zbudujemy niestandardowy pilot do mikrosamochodu ZenWheels. Mikrosamochód ZenWheels to 5-centymetrowy samochodzik, którym można sterować za pomocą aplikacji na Androida lub iPhone'a. Pokażę Ci, jak wykonać inżynierię wsteczną aplikacji na Androida, aby dowiedzieć się o protokole komunikacyjnym i jak zbudować pilota za pomocą arduino i żyroskopu.
Krok 1: Komponenty i narzędzia
Części:
1. Mikrosamochód ZenWheels
2. Arduino pro mini 328p
3. Deska do krojenia chleba
4. Żyroskop MPU6050
5. źródło zasilania <=5 v (jakaś bateria, którą możemy podłączyć do płytki stykowej)
6. Kable rozruchowe w kształcie litery U (opcjonalne). Użyłem tych zworek, ponieważ lepiej wyglądają na płytce stykowej. Zamiast tego można użyć zwykłych kabli rozruchowych
7. Moduł bluetooth HC-05 (z przyciskiem do wejścia w tryb AT)
Narzędzia:
1. Adapter USB na szeregowy FTDI FT232RL do programowania Arduino pro mini
2. IDE Arduino
3. Telefon z Androidem
4. Studio Androida [Opcjonalnie]
Krok 2: Inżynieria wsteczna aplikacji ZenWheels na Androida [opcjonalnie]
Do zrozumienia tej części potrzebna jest pewna znajomość Javy i Androida.
Celem projektu jest sterowanie mikrosamochodem za pomocą żyroskopu. W tym celu musimy dowiedzieć się więcej o komunikacji bluetooth między tą zabawką a aplikacją na Androida.
W tym kroku wyjaśnię, jak odtworzyć protokół komunikacyjny między mikrosamochodem a aplikacją na Androida. Jeśli chcesz tylko zbudować pilota, ten krok nie jest konieczny. Jednym ze sposobów na odkrycie protokołu jest spojrzenie na kod źródłowy. Hmm, ale to nie jest proste, aplikacje na Androida są kompilowane i można zainstalować apk przez Google Play.
Stworzyłem więc podstawowy przewodnik, jak to zrobić:
1. Pobierz APK. Android Package Kit (w skrócie APK) to format pliku pakietu używany przez system operacyjny Android do dystrybucji i instalacji aplikacji mobilnych
Najpierw wyszukaj aplikację w sklepie Google Play, w naszym przypadku wyszukaj „zenwheels”, a otrzymasz link do aplikacji
Następnie wyszukaj w google „online apk downloader” i użyj go, aby pobrać apk. Zwykle poproszą o link do aplikacji (ten, który otrzymaliśmy wcześniej), a następnie wciśniemy przycisk pobierania i zapiszemy go na naszym komputerze.
2. Zdekompiluj APK. Dekompilator w naszej sytuacji to narzędzie, które pobiera APK i generuje kod źródłowy Java.
Najprostszym rozwiązaniem jest użycie do tego dekompilatora online. Przeszukałem google dla "dekompilatora online" i wybrałem https://www.javadecompilers.com/. Wystarczy wgrać otrzymany wcześniej pakiet APK i
naciśnij dekompilację. Następnie po prostu pobierasz źródła.
3. Spróbuj przejrzeć kod inżynierii wstecznej
Aby otworzyć projekt potrzebujesz edytora tekstu lub lepiej IDE (zintegrowane środowisko programistyczne). Domyślnym środowiskiem IDE dla projektów Android jest Android Studio (https://developer.android.com/studio). Po zainstalowaniu Android Studio otwórz folder projektu.
Ponieważ nasz samochód jest sterowany przez bluetooth rozpocząłem poszukiwania w zdekompilowanym kodzie od słowa kluczowego "bluetooth", ze znalezionych przeze mnie wystąpień "BluetoothSerialService" był w obsłudze komunikacji. Jeśli ta klasa obsługuje komunikację, to musi mieć metodę komendy send. Okazuje się, że istnieje jedna metoda zapisu, która przesyła dane przez kanał bluetooth:
public void write(byte out)
To dobry początek, szukałem.write (używana metoda i istnieje klasa „ZenWheelsMicrocar”, która rozszerza naszą „BluetoothSerialService”. Ta klasa zawiera większość logiki naszej komunikacji przez Bluetooth. Druga część logika jest w kontrolerach: BaseController i StandardController.
W BaseControllerze mamy inicjalizację usługi, a także definicje kanałów sterowania i przepustnicy, kanały są w rzeczywistości prefiksami poleceń, które określają, że nastąpi jakiś rodzaj polecenia:
protected microcar ZenWheelsMicrocar = new ZenWheelsMicrocar(this, this.btHandler);
chronione wyjścia ChannelOutput = {nowe TrimChannelOutput(ZenWheelsMicrocar. STEERING_CHANNEL), nowe TrimChannelOutput(ZenWheelsMicrocar. THROTTLE_CHANNEL)};
W StandardController sterowanie odbywa się w:
public void handleSteering(TouchEvent touchEvent) {
… this.microcar.setChannel(steringOutput.channel, SteeringOutput.resolveValue()); }
Analizując metodę, SteeringOutput.channel ma wartość 129 (kanał używany do sterowania) a SteeringOutput.resolveValue() może mieć wartość od -90 do 90. Wartość kanału (129) jest wysyłana bezpośrednio, a wartość sterowania jest modyfikowana stosując operacje bitowe:
prywatne końcowe int value_convert_out(int value) {
wartość logiczna ujemna = fałsz; if (wartość < 0) { ujemna = f6D; } int wartość2 = wartość & 63; if (ujemne) { zwraca wartość2 | 64; } zwraca wartość2; }
W kontrolerze StandardController istnieje podobna metoda o nazwie
public void handleThrottle(TouchEvent touchEvent)
Krok 3: Komponenty
Części:
1. Arduino pro mini 328p 2 $
2. Deska do krojenia chleba
3. Żyroskop MPU6050 1.2 $
4. HC-05 master-slave 6-pinowy moduł 3 $
5. 4 x zestaw baterii AA z 4 bateriami
6. Kable rozruchowe w kształcie litery U (opcjonalne). Użyłem tych zworek, ponieważ lepiej wyglądają na płytce stykowej, a diody są w ten sposób bardziej widoczne. Jeśli nie masz tych kabli, możesz je zastąpić przewodami dupontowymi.
Powyższe ceny pochodzą z serwisu eBay.
Narzędzia:
1. Adapter USB na szeregowy FTDI FT232RL do programowania arduino pro mini
2. IDE Arduino
3. Android Studio (opcjonalnie, jeśli chcesz samodzielnie przeprowadzić inżynierię wsteczną)
Krok 4: Montaż
Montaż jest bardzo prosty, bo robimy to na płytce stykowej:)
- najpierw umieszczamy nasze komponenty na płytce stykowej: mikrokontroler, moduł bluetooth i żyroskop
- podłącz piny HC-05 bluetooth RX i TX do pinów arduino 10 i 11. Żyroskop SDA i SCL należy podłączyć do pinów arduino A4 i A5
- podłączamy piny zasilania do bluetooth, gyro i arduino. piny należy podłączyć do + i - z boku płytki stykowej
- ostatnio podłączam do płytki stykowej zasilacz (pomiędzy 3,3V a 5V), ja używałem małej jednoogniwowej baterii LiPo ale każdy będzie działał tak długo jak jest w zakresie mocy
Proszę sprawdzić powyższe zdjęcia, aby uzyskać więcej informacji
Krok 5: Sparuj HC-05 Bluetooth z Microcar
Do tego potrzebny jest telefon z systemem Android, moduł bluetooth HC-05 oraz szeregowy adapter FTDI z przewodami. Będziemy również używać Arduino IDE do komunikacji z modułem bluetooth.
Najpierw musimy znaleźć adres microcar bluetooth:
- włącz bluetooth w telefonie
- włącz samochód i przejdź do sekcji Bluetooth w ustawieniach w systemie Android
- wyszukaj nowe urządzenia i powinno pojawić się jakieś urządzenie o nazwie "Mikrosamochód"
- sparuj z tym urządzeniem
- następnie, aby wyodrębnić MAC Bluetooth, użyłem tej aplikacji z google play Serial Terminal Bluetooth
Po zainstalowaniu tej aplikacji przejdź do menu -> urządzenia i tam będziesz mieć listę wszystkich sparowanych urządzeń Bluetooth. Interesuje nas tylko kod poniżej kopalni „Mikrosamochód” to 00:06:66:49:A0:4B
Następnie podłącz adapter FTDI do modułu bluetooth. Najpierw piny VCC i GROUND, a następnie FTDI RX do bluetooth TX i FTDI TX do bluetooth RX. Powinien również znajdować się pin na module bluetooth, który powinien być podłączony do VCC. W ten sposób moduł bluetooth przechodzi w „programowalny tryb”. Mój moduł ma przycisk, który łączy VCC z tym specjalnym pinem. Po podłączeniu FTDI do USB powinno być z podłączonym pinem / wciśniętym przyciskiem, aby wejść w ten specjalny programowalny tryb. Bluetooth potwierdza wejście w ten tryb pracy poprzez powolne miganie co 2 sekundy.
W Arduino IDE wybierz port szeregowy, a następnie otwórz monitor szeregowy (zarówno NL, jak i CR z prędkością 9600 bodów). Wpisz AT i moduł powinien potwierdzić przyciskiem „OK”.
Wpisz „AT+ROLE=1”, aby przełączyć moduł w tryb master. Aby sparować z modułem bluetooh, napisz: „AT+BIND=0006, 66, 49A04B”, Zwróć uwagę, jak nasze „00:06:66:49:A0:4B” jest przekształcane w „0006, 66, 49A04B”. Cóż, powinieneś wykonać tę samą transformację dla swojego MAC bluetooh.
Teraz włącz samochód Zenwheels, a następnie odłącz FTDI i podłącz go ponownie bez wciśniętego przycisku / podłączonego specjalnego pinu. Po chwili powinien połączyć się z samochodem i zauważysz, że samochód wydaje dźwięk pomyślnego połączenia.
Rozwiązywanie problemów:
- Odkryłem, że ze wszystkich modułów Bluetooth, które miałem, tylko ten z przyciskiem działał jako master!
- upewnij się, że samochód jest w pełni naładowany
- upewnij się, że samochód nie jest podłączony do telefonu
- jeśli Bluetooth wchodzi w tryb AT (mruga powoli), ale nie reaguje na polecenia, upewnij się, że masz OBA NL i CR, a także poeksperymentuj z innymi szybkościami BAUD
- dokładnie sprawdź, czy RX jest podłączony do TX i na odwrót
- wypróbuj ten samouczek
Krok 6: Kod i użycie
Najpierw musisz pobrać i zainstalować dwie biblioteki:
1. Biblioteka MPU6050 dla żyroskopu
2. Źródło biblioteki I2CDev
Następnie pobierz i zainstaluj moją bibliotekę stąd lub skopiuj ją poniżej:
/** * Biblioteki: * 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;
inicjalizacja bool = fałsz; // ustaw true jeśli inicjowanie DMP powiodło się
uint8_t mpuIntStatus; // przechowuje aktualny bajt stanu przerwania z MPU uint8_t devStatus; // zwróć status po każdej operacji urządzenia (0 = sukces, !0 = błąd) uint16_t packetSize; // oczekiwany rozmiar pakietu DMP (domyślnie 42 bajty) uint16_t fifoCount; // liczba wszystkich bajtów znajdujących się aktualnie w FIFO uint8_t fifoBuffer[64]; // bufor pamięci FIFO Quaternion q; // [w, x, y, z] kontener kwaternionowy VectorFloat grawitacja; // [x, y, z] wektor grawitacji float ypr[3]; // [odchylenie, skok, przechylenie] kontener zbaczania/pochylenia/przechylenia i wektor grawitacji volatile bool mpuInterrupt = false; // wskazuje, czy pin przerwania MPU osiągnął stan wysoki
unsigned long lastPrintTime, lastMoveTime = 0;
OprogramowanieSerial BTserial(10, 11);
MPU6050 mpu;
pusta konfiguracja()
{ Szeregowy.początek(9600); BTserial.początek(38400); Serial.println("Program uruchomiony"); inicjalizacja = InitializeGyroscope(); }
pusta pętla () {
if (!inicjalizacja) { return; } mpuInterrupt = fałsz; mpuIntStatus = mpu.getIntStatus(); fifoCount = mpu.getFIFOCount(); if (hasFifoOverflown(mpuIntStatus, fifoCount)) { mpu.resetFIFO(); powrót; } if (mpuIntStatus & 0x02) { while (fifoCount < rozmiar_pakietu) { fifoCount = mpu.getFIFOCount(); } mpu.getFIFOBytes(fifoBuffer, rozmiar_pakietu); fifoCount -= rozmiarpakietu; mpu.dmpGetQuaternion(&q, fifoBuffer); mpu.dmpGetGravity(&grawitacja, &q); mpu.dmpGetYawPitchRoll(ypr, &q, &gravity); sterować(ypr[0] * 180/M_PI, ypr[1] * 180/M_PI, ypr[2] * 180/M_PI); } }
/*
* Otrzymuje kąt od 0 do 180, gdzie 0 to maks. w lewo, a 180 to maks. w prawo * Otrzymuje prędkość od -90 do 90, gdzie -90 to maks. do tyłu, a 90 to maks. do przodu */ void moveZwheelsCar(byte angle, int speed) { if (millis() - lastMoveTime = 90) { wynikAngle = map(angle, 91, 180, 1, 60); } else if (angle 0) { resultSpeed = map(speed, 0, 90, 0, 60); } else if (prędkość < 0) { wynikPrędkość = mapa(prędkość, 0, -90, 120, 60); } Serial.print("rzeczywistyAngle=");Serial.print(kąt);Serial.print("; "); Serial.print("rzeczywistaPrędkość=");Serial.print(ReultSpeed);Serial.println("; "); BTserial.write(sterowanie poleceniem); BTserial.write(resultAngle); BTserial.write(commandSpeed); BTserial.write((bajt) wynikPrędkość); lastMoveTime = millis(); }
void steer(int x, int y, int z)
{ x = ograniczenie(x, -1 * MAX_ANGLE, MAX_ANGLE); y = ograniczenie(y, -1 * MAX_ANGLE, MAX_ANGLE); z = ograniczenie(z, -MAX_ANGLE, MAX_ANGLE); kąt int = map(y, -MAX_ANGLE, MAX_ANGLE, 0, 180); int speed = map(z, -MAX_ANGLE, MAX_ANGLE, 90, -90); printDebug(x, y, z, kąt, prędkość); moveZwheelsCar(kąt, prędkość); }
void printDebug(int x, int y, int z, kąt int, prędkość int)
{ if (millis() - lastPrintTime < 1000) { return; } 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("kąt=");Serial.print(kąt);Serial.print("; "); Serial.print("speed=");Serial.print(speed);Serial.println("; "); lastPrintTime = millis(); }
bool zainicjowaćŻyroskop()
{ Drut.rozpocznij(); mpu.initialize(); Serial.println(mpu.testConnection() ? F("Połączenie MPU6050 powiodło się"): F("Połączenie MPU6050 nie powiodło się")); devStatus = mpu.dmpInitialize(); mpu.setXGyroOffset(220); mpu.setYGyroOffset(76); mpu.setZGyroOffset(-85); mpu.setZAccelOffset(1788); if (devStatus != 0) { Serial.print(F("Inicjalizacja DMP nie powiodła się (kod "));Serial.println(devStatus); return false; } mpu.setDMPEnabled(true); Serial.println(F("Włączanie wykrywanie przerwań (zewnętrzne przerwanie Arduino 0)…")); attachInterrupt(0, dmpDataReady, RISING); mpuIntStatus = mpu.getIntStatus(); Serial.println(F("DMP gotowy! Oczekiwanie na pierwsze przerwanie…")); = mpu.dmpGetFIFOPacketSize(); zwróć true; }
void dmpDataReady()
{ mpuPrzerwanie = prawda; }
wartość logiczna hasFifoOverflown(int mpuIntStatus, int fifoCount)
{ zwróć mpuIntStatus & 0x10 || fifoCount == 1024; }
Wgraj kod za pomocą przejściówki FTDI do arduino, a następnie podłącz baterie.
Za pomocą pilota:
Po włączeniu arduino włącz również samochód. Moduł HC-05 powinien połączyć się z autem, gdy tak się stanie samochód wyda dźwięk. Jeśli to nie zadziała, sprawdź poprzedni krok i sekcję rozwiązywania problemów.
Jeśli przechylisz płytkę stykową do przodu, samochód powinien jechać do przodu, w prawo i samochód powinien jechać w prawo. Wykonuje również bardziej stopniowe ruchy, takie jak pochylanie się nieco do przodu i nieco w lewo, w tym przypadku samochód jechałby powoli w lewo.
Jeśli samochód jedzie w inną stronę podczas pochylania płytki stykowej, najpierw trzymaj płytkę stykową w różnych kierunkach.
Jak to działa:
Szkic pobiera współrzędne żyroskopu co 100 ms, wykonuje obliczenia, a następnie przesyła przez bluetooth polecenia samochodu. Po pierwsze istnieje metoda „sterowania”, która jest wywoływana z surowymi kątami x, y i z. Ta metoda przekształca sterowanie w zakresie od 0 do 180 stopni oraz przyspieszenie w zakresie od -90 do 90. Ta metoda wywołuje
void moveZwheelsCar(kąt bajta, prędkość int), który konwertuje sterowanie i przyspieszenie do specyfikacji ZenWheels, a następnie przesyła polecenia za pomocą bluetooth.
Powodem, dla którego dokonałem transformacji w dwóch krokach, jest możliwość ponownego użycia. gdybym musiał dostosować ten szkic do zdalnego sterowania jakimś innym urządzeniem, zacząłbym od podstawowej metody „sterowania”, która już mapuje prędkość i sterowanie na kilka przydatnych wartości.
Krok 7: Alternatywy
Alternatywa dla „inżynierii odwrotnej”. Mówiłem o tym, jak przeprowadzić inżynierię wsteczną projektu, zaczynając od aplikacji na Androida. Istnieje jednak alternatywa dla tego, że możesz skonfigurować szeregowe urządzenie podrzędne FTDI + bluetooth (zwykły HC-05 bez określania ustawień głównych). Następnie z aplikacji ZenWheels połącz się z HC-05 zamiast „mikrosamochodem”.
Aby odszyfrować polecenia, musisz przytrzymać kierownicę w jakiejś pozycji, a następnie za pomocą skryptu Pythona przeanalizować komunikację szeregową. Sugeruję skrypt Pythona, ponieważ istnieją znaki niedrukowalne, a Arduino IDE nie nadaje się do tego. Zauważysz, że jeśli przytrzymasz koło w jednej pozycji, aplikacja będzie regularnie przesyłać te same dwa bajty. Jeśli zmienisz pozycję koła, pierwszy bajt pozostanie taki sam, drugi się zmieni. Po wielu próbach można wymyślić algorytm sterowania, a następnie odwrócić przepustnicę itp.
Alternatywą dla pilota opartego na arduino byłby pilot RaspberryPi. Raspberry Pi ma wbudowany moduł bluetooth, który bezproblemowo ustawia się w trybie „master”, a biblioteka bluetooth Pythona działa jak czar. Możliwe są również ciekawsze projekty, takie jak sterowanie autem za pomocą Alexa echo:)
Mam nadzieję, że podobał się Wam projekt i proszę zostawcie komentarze poniżej!
Zalecana:
Klonuj dowolny pilot za pomocą Arduino Nano: 5 kroków
Klonuj dowolny pilot za pomocą Arduino Nano: sklonuj dowolny pilot za pomocą Arduino Nano
10W RGB zewnętrzna lampa nocna pilot zdalnego: 5 kroków
Zewnętrzna lampka nocna o mocy 10 W RGB: Ten projekt to lampa ledowa o mocy 10 W RGB na noc, można ją umieścić obok ciebie i zapewnić godziny nastrojowego oświetlenia. Zainspirowała mnie lampa Balad obecna we Francji, ale nieco mocniejsza (wersja komercyjna ma około 3W, moja 10W) i więcej ch
Rainbo Skyz, hakowalny parasol LED: 9 kroków (ze zdjęciami)
Rainbo Skyz, hakowalny parasol LED: stwórz swój własny podświetlany parasol LED
Pilot zdalnego sterowania oparty na LoRa - Sterowanie urządzeniami z dużych odległości: 8 kroków
Pilot zdalnego sterowania oparty na LoRa | Kontroluj urządzenia z dużych odległości: Hej, co słychać, chłopaki! Akarsh tutaj z CETech. W tym projekcie stworzymy pilota, który może być używany do sterowania różnymi instrumentami, takimi jak diody LED, silniki lub jeśli mówimy o naszym codziennym życiu, możemy sterować naszym urządzeniem domowym
Arduino UNO CO-pilot (Auto-pilot): 6 kroków
Arduino UNO a CO-pilot (Autopilot): Witam wszystkich, zamieszczam mały system autopilota dla samolotu RC ze stałymi skrzydłami (Sky surfer V3), ponieważ sky surfer v3 jest szybowcem z napędem, możemy używać tego systemu autopilota podczas ślizga się, a nawet gdy jest zasilany. Przed rozpoczęciem mojego pomysłu na auto