İçindekiler:

ZenWheels Microcar için Hacklenebilir Uzaktan Kumanda: 7 Adım
ZenWheels Microcar için Hacklenebilir Uzaktan Kumanda: 7 Adım

Video: ZenWheels Microcar için Hacklenebilir Uzaktan Kumanda: 7 Adım

Video: ZenWheels Microcar için Hacklenebilir Uzaktan Kumanda: 7 Adım
Video: ZenWheels Micro Car Steering Knuckle Repair and Take Apart 2024, Haziran
Anonim
Image
Image
toplantı
toplantı

Bu eğitimde ZenWheels mikro araba için özel bir uzaktan kumanda oluşturacağız. ZenWheels microcar, bir Android veya Iphone uygulamasıyla kontrol edilebilen 5 cm'lik bir oyuncak arabadır. İletişim protokolü hakkında bilgi edinmek ve arduino ve jiroskop kullanarak nasıl uzaktan kumanda oluşturabileceğinizi öğrenmek için Android uygulamasını nasıl tersine çevireceğinizi göstereceğim.

Adım 1: Bileşenler ve Araçlar

Parçalar:

1. ZenWheels mikro arabası

2. Arduino pro mini 328p

3. Breadboard

4. MPU6050 jiroskop

5. güç kaynağı <=5 v (breadboard'a takabileceğimiz bir miktar pil)

6. U-şekilli atlama kabloları (isteğe bağlı). Breadboard'da daha iyi göründükleri için bu jumper kablolarını kullandım. Bunun yerine normal atlama kabloları kullanılabilir

7. HC-05 bluetooth modülü (AT moduna girmek için bir düğme ile)

Aletler:

1. Arduino pro mini'yi programlamak için USB'den seri FTDI adaptörü FT232RL'ye

2. Arduino IDE'si

3. Android Telefon

4. Android Stüdyosu [İsteğe Bağlı]

2. Adım: ZenWheels Android Uygulamasında Tersine Mühendislik [isteğe bağlı]

Bu kısmı anlamak için biraz Java ve Android bilgisi gereklidir.

Projenin amacı, bir jiroskop kullanarak mikro arabayı kontrol etmektir. Bunun için bu oyuncak ve android uygulaması arasındaki bluetooth iletişimi hakkında daha fazla bilgi edinmemiz gerekiyor.

Bu adımda, microcar ve android uygulaması arasındaki iletişim protokolünün nasıl tersine mühendislik yapılacağını açıklayacağım. Yalnızca uzaktan kumandayı oluşturmak istiyorsanız, bu adım gerekli değildir. Protokolü keşfetmenin bir yolu kaynak koduna bakmaktır. Hmm ama bu basit değil, android uygulamaları derlenmiş ve google play üzerinden apk yüklenebilir.

Bu yüzden bunu yapmak için temel bir rehber hazırladım:

1. APK'yı indirin. Android Paket Kiti (kısaca APK), mobil uygulamaların dağıtımı ve kurulumu için Android işletim sistemi tarafından kullanılan paket dosya biçimidir.

İlk önce uygulamayı google play store'da arayın, bizim durumumuzda "zenwheels" araması yapın ve uygulama bağlantısını alacaksınız

Ardından google'da "çevrimiçi apk indirici" arayın ve apk'yi indirmek için birini kullanın. Genellikle (daha önce edindiğimiz) uygulama bağlantısını isteyeceklerdir, sonra bir indirme düğmesine basacağız ve onu bilgisayarımıza kaydedeceğiz.

2. APK'yi yeniden derleyin. Bizim durumumuzdaki bir kod çözücü, APK'yı alan ve Java kaynak kodunu üreten bir araçtır.

En basit çözüm, işi yapmak için çevrimiçi bir kod çözücü kullanmaktır. Google'da "online decompliler" diye arattım ve https://www.javadecompilers.com/ adresini seçtim. Daha önce elde ettiğiniz APK'yı yüklemeniz yeterlidir ve

geri derlemeye basın. O zaman kaynakları indirmeniz yeterlidir.

3. Kodu inceleyerek tersine mühendislik yapmayı deneyin

Projeyi açmak için bir metin düzenleyiciye veya daha iyisi bir IDE'ye (entegre geliştirme ortamı) ihtiyacınız var. Android Projeleri için varsayılan IDE, Android Studio'dur (https://developer.android.com/studio). Android Studio'yu yükledikten sonra proje klasörünü açın.

Arabamız bluetooth ile kontrol edildiğinden, "bluetooth" anahtar kelimesiyle decompiled kodda aramama başladım, bulduğum olaylardan "BluetoothSerialService" iletişimin başındaydı. Bu sınıf iletişimi yönetiyorsa, bir gönderme komutu yöntemine sahip olmalıdır. Bluetooth kanalı üzerinden veri gönderen bir yazma yöntemi olduğu ortaya çıktı:

public void write(byte out)

Bu iyi bir başlangıç, kullanılan.write(yöntemi aradım ve "BluetoothSerialService"imizi genişleten bir "ZenWheelsMicrocar" sınıfı var. Bu sınıf Bluetooth üzerinden iletişimimizin mantığının çoğunu içerir. mantık denetleyicilerdedir: BaseController ve StandardController.

BaseController'da hizmet başlatma ve ayrıca direksiyon ve gaz kelebeği kanallarının tanımlarına sahibiz, kanallar aslında bir tür komutun izleyeceğini belirtmek için komut önekleridir:

korumalı ZenWheelsMicrocar microcar = yeni ZenWheelsMicrocar(bu, this.btHandler);

korumalı ChannelOutput çıkışları = {yeni TrimChannelOutput(ZenWheelsMicrocar. STEERING_CHANNEL), yeni TrimChannelOutput(ZenWheelsMicrocar. THROTTLE_CHANNEL)};

StandardController'da direksiyon şu şekilde gerçekleştirilir:

public void handleSteering(TouchEvent touchEvent) {

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

Yöntemi analiz ederken, direksiyonOutput.channel, 129 (yönlendirme için kullanılan kanal) değerine sahiptir ve direksiyonOutput.resolveValue(), -90 ile 90 arasında bir değere sahip olabilir. Kanal değeri (129) doğrudan gönderilir ve yönlendirme değeri değiştirilir. bit düzeyinde işlemler uygulayarak:

özel son int value_convert_out(int değeri) {

boolean negatif = yanlış; if (değer < 0) { negatif = f6D; } int değer2 = değer & 63; if (negatif) { dönüş değeri2 | 64; } dönüş değeri2; }

StandardController'da adı verilen benzer bir yöntem var.

public void handleThrottle(TouchEvent touchEvent)

Adım 3: Bileşenler

Parçalar:

1. Arduino pro mini 328p 2 $

2. Ekmek tahtası

3. MPU6050 jiroskop 1.2$

4. HC-05 master-slave 6 pinli modül 3$

5. 4 pil ile 4 x AA pil paketi

6. U-şekilli atlama kabloları (isteğe bağlı). Bu jumper kabloları devre tahtasında daha iyi göründüğü ve ledler bu şekilde daha görünür olduğu için kullandım. Bu kablolara sahip değilseniz, bunları dupont kablolarla değiştirebilirsiniz.

Yukarıdaki fiyatlar eBay'den alınmıştır.

Aletler:

1. arduino pro mini'yi programlamak için USB'den seri FTDI adaptörüne FT232RL

2. Arduino IDE'si

3. Android Studio (tersine mühendislik yapmak istiyorsanız isteğe bağlı)

Adım 4: Montaj

toplantı
toplantı

Montajı çok basit çünkü breadboard üzerinde yapıyoruz:)

- önce bileşenlerimizi devre tahtasına yerleştiriyoruz: mikrodenetleyici, bluetooth modülü ve jiroskop

- HC-05 bluetooth RX ve TX pinlerini arduino 10 ve 11 pinlerine bağlayın. Jiroskop SDA ve SCL, arduino A4 ve A5 pinlerine bağlanmalıdır.

- güç pinlerini bluetooth, gyro ve arduino'ya bağlayın. pinler breadboard'un yan tarafındaki + ve -'ye bağlanmalıdır

- son olarak devre tahtasına bir güç kaynağı (3,3V ila 5V arasında) bağlayın, küçük bir LiPo tek hücreli pil kullandım ancak güç aralığında olduğu sürece herhangi biri yapacaktır

Daha fazla ayrıntı için lütfen yukarıdaki resimleri kontrol edin

Adım 5: HC-05 Bluetooth'u Microcar ile eşleştirin

HC-05 Bluetooth'u Microcar ile eşleştirin
HC-05 Bluetooth'u Microcar ile eşleştirin
HC-05 Bluetooth'u Microcar ile eşleştirin
HC-05 Bluetooth'u Microcar ile eşleştirin
HC-05 Bluetooth'u Microcar ile eşleştirin
HC-05 Bluetooth'u Microcar ile eşleştirin

Bunun için bir Android telefona, bluetooth HC-05 modülüne ve kablolu seri FTDI adaptörüne ihtiyacınız olacak. Ayrıca bluetooth modülü ile iletişim kurmak için Arduino IDE'yi kullanacağız.

Öncelikle microcar bluetooth adresini bulmamız gerekiyor:

- telefonunuzda bluetooth'u etkinleştirin

- arabayı açın ve Android'deki ayarlarınızın bluetooth bölümüne gidin

- yeni cihazlar arayın ve "Microcar" adlı bir cihaz görünmelidir

- bu cihazla eşleştir

- daha sonra bluetooth MAC'i çıkarmak için bu uygulamayı google play Seri Bluetooth Terminalinden kullandım

Bu uygulamayı yükledikten sonra, menü -> cihazlara gidin ve orada tüm bluetooth eşleştirilmiş cihazları içeren bir listeniz olacak. Yalnızca "Microcar" madeni aşağıdaki kodla ilgileniyoruz: 00:06:66:49:A0:4B

Ardından FTDI adaptörünü bluetooth modülüne bağlayın. Önce VCC ve GROUND pinleri ve ardından FTDI RX to bluetooth TX ve FTDI TX to bluetooth RX. Ayrıca bluetooth modülünde VCC'ye bağlanması gereken bir pin bulunmalıdır. Bunu yaparak bluetooth modülü bir "programlanabilir moda" girer. Modülümde VCC'yi bu özel pime bağlayan bir düğme var. FTDI'yi USB'ye taktığınızda, bu özel programlanabilir moda girmek için pin bağlı / düğmesine basılmış olmalıdır. Bluetooth, her 2 saniyede bir yavaşça yanıp sönerek bu çalışma moduna girildiğini onaylar.

Arduino IDE'de seri portu seçin, ardından seri monitörü açın (9600 baud hızı ile hem NL hem de CR). AT yazın ve modül "OK" ile onaylamalıdır.

Modülü ana moda geçirmek için "AT+ROLE=1" yazın. Bluetooh modülünüzle eşleştirmek için şunu yazın: "AT+BIND=0006, 66, 49A04B", "00:06:66:49:A0:4B"nin nasıl "0006, 66, 49A04B"ye dönüştürüldüğüne dikkat edin. Aynı dönüşümü bluetooh MAC'iniz için de yapmalısınız.

Şimdi Zenwheels arabasını açın, ardından FTDI'yi çıkarın ve düğmeye basmadan / özel pim bağlı olmadan tekrar takın. Bir süre sonra araca bağlanmalı ve arabanın belirli bir bağlantı başarılı ses çıkardığını fark edeceksiniz.

Sorun giderme:

- Sahip olduğum tüm Bluetooth modüllerinden yalnızca düğmeli olanın master olarak çalıştığını buldum!

- arabanın tamamen şarj olduğundan emin olun

- arabanın telefona bağlı olmadığından emin olun

- Bluetooth AT moduna girerse (yavaş yanıp sönüyorsa) ancak komuta yanıt vermiyorsa, BOTH NL & CR'ye sahip olduğunuzdan emin olun ve ayrıca diğer BAUD hızlarını deneyin

- RX'in TX'e bağlı olduğunu ve bunun tersini iki kez kontrol edin

- bu öğreticiyi deneyin

Adım 6: Kod ve Kullanım

İlk önce iki kitaplık indirip kurmanız gerekir:

1. Jiroskop için MPU6050 kütüphanesi

2. I2CDev kitaplığı kaynağı

Ardından kitaplığımı buradan indirip yükleyin veya aşağıdan kopyalayın:

/** * Kitaplıklar: * 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 komutuStering = 129; const bayt komutuHız = 130;

bool başlatma = yanlış; // DMP başlatma başarılıysa true olarak ayarla

uint8_t mpuIntStatus; // MPU uint8_t devStatus'tan gelen gerçek kesme durumu baytını tutar; // her cihaz işleminden sonra durumu döndür (0 = başarı, !0 = hata) uint16_t packageSize; // beklenen DMP paket boyutu (varsayılan 42 bayttır) uint16_t fifoCount; // şu anda FIFO'da bulunan tüm baytların sayısı uint8_t fifoBuffer[64]; // FIFO depolama arabelleği Quaternion q; // [w, x, y, z] dörtlü kap VectorFloat yerçekimi; // [x, y, z] yerçekimi vektörü kayan nokta ypr[3]; // [yaw, pitch, roll] yaw/pitch/roll konteyner ve yerçekimi vektörü uçucu bool mpuInterrupt = false; // MPU kesme pininin yükselip yükselmediğini gösterir

imzasız uzun lastPrintTime, lastMoveTime = 0;

SoftwareSerial BTserial(10, 11);

MPU6050 mpu;

geçersiz kurulum()

{ Serial.başlangıç(9600); BTserial.başla(38400); Serial.println("Program başladı"); başlatma = initializeGyroscope(); }

boşluk döngüsü () {

if (!initialization) { return; } mpuInterrupt = yanlış; mpuIntStatus = mpu.getIntStatus(); fifoCount = mpu.getFIFOCount(); if (hasFifoOverflown(mpuIntStatus, fifoCount)) { mpu.resetFIFO(); dönüş; } if (mpuIntStatus & 0x02) { while (fifoCount < packageSize) { fifoCount = mpu.getFIFOCount(); } mpu.getFIFOBytes(fifoBuffer, packageSize); fifoCount -= paketSize; mpu.dmpGetQuaternion(&q, fifoBuffer); mpu.dmpGetGravity(&yerçekimi, &q); mpu.dmpGetYawPitchRoll(ypr, &q, &gravity); yönlendirmek(ypr[0] * 180/M_PI, ypr[1] * 180/M_PI, ypr[2] * 180/M_PI); } }

/*

* Açıyı 0'dan 180'e alır, burada 0 maksimum sol ve 180 maksimum sağdır * Hızı -90'dan 90'a alır, burada -90 maksimum geri ve 90 maksimum ileridir */ void moveZwheelsCar(bayt açısı, int hız) { if (millis() - lastMoveTime = 90) { sonuçAçı = harita(açı, 91, 180, 1, 60); } else if (açı 0) { sonuçHız = harita(hız, 0, 90, 0, 60); } else if (hız < 0) { sonuçHız = map(hız, 0, -90, 120, 60); } Serial.print("actualAngle=");Serial.print(açı);Serial.print("; "); Serial.print("actualSpeed=");Serial.print(resultSpeed);Serial.println("; "); BTserial.write(commandSering); BTserial.write(resultAngle); BTserial.write(komut Hızı); BTserial.write((bayt) sonuçHızı); lastMoveTime = millis(); }

void steer(int x, int y, int z)

{ x = constrain(x, -1 * MAX_ANGLE, MAX_ANGLE); y = kısıtlama(y, -1 * MAX_ANGLE, MAX_ANGLE); z = constrain(z, -MAX_ANGLE, MAX_ANGLE); int açı = map(y, -MAX_ANGLE, MAX_ANGLE, 0, 180); int hız = map(z, -MAX_ANGLE, MAX_ANGLE, 90, -90); printDebug(x, y, z, açı, hız); moveZwheelsCar(açı, hız); }

void printDebug(int x, int y, int z, int açı, int hız)

{ if (millis() - lastPrintTime < 1000) { dönüş; } Seri.print("z=");Serial.print(x);Serial.print("; "); Seri.print("y=");Serial.print(y);Serial.print("; "); Serial.print("z=");Serial.print(z);Serial.print("; "); Seri.print("angle=");Serial.print(açı);Serial.print("; "); Serial.print("speed=");Serial.print(hız);Serial.println("; "); lastPrintTime = millis(); }

bool initializeGyroscope()

{ Wire.begin(); mpu.initialize(); Serial.println(mpu.testConnection() ? F("MPU6050 bağlantısı başarılı"): F("MPU6050 bağlantısı başarısız")); devStatus = mpu.dmpInitialize(); mpu.setXGyroOffset(220); mpu.setYGyroOffset(76); mpu.setZGyroOffset(-85); mpu.setZAccelOffset(1788); if (devStatus != 0) { Serial.print(F("DMP Başlatma başarısız (kod "));Serial.println(devStatus); false döndür; } mpu.setDMPEnabled(true); Serial.println(F("Etkinleştiriliyor) kesme algılama (Arduino harici kesme 0)…")); AttachInterrupt(0, dmpDataReady, RISING); mpuIntStatus = mpu.getIntStatus(); Serial.println(F("DMP hazır! İlk kesme bekleniyor…")); packageSize = mpu.dmpGetFIFOPacketSize(); true döndür; }

geçersiz dmpDataReady()

{ mpuInterrupt = doğru; }

boolean hasFifoOverflown(int mpuIntStatus, int fifoCount)

{ dönüş mpuIntStatus & 0x10 || fifoCount == 1024; }

FTDI adaptörünü kullanarak kodu arduino'ya yükleyin ve ardından pilleri bağlayın.

Uzaktan kumandayı kullanma:

Arduino açıldıktan sonra, arabayı da açın. HC-05 modülü araca bağlanmalıdır, bu olduğunda araç bir ses çıkaracaktır. İşe yaramazsa, lütfen önceki adımı ve sorun giderme bölümünü kontrol edin.

Breadboard'u öne eğerseniz, araba ileri, sağa ve araba sağa hareket etmelidir. Aynı zamanda biraz öne ve biraz sola eğilme gibi daha kademeli hareketler de gerçekleştirir bu durumda araba yavaş yavaş sola giderdi.

Breadboard'u eğerken araba farklı bir yöne gidiyorsa, ilk olarak breadboard'u farklı yönlerde tutun.

Nasıl çalışır:

Çizim her 100 ms'de bir jiroskop koordinatlarını alır, hesaplamalar yapar ve ardından bluetooth üzerinden araba komutlarını iletir. İlk önce ham x, y ve z açılarıyla çağrılan bir "yönlendirme" yöntemi var. Bu yöntem, direksiyonu 0 ile 180 derece arasında ve ivmeyi -90 ile 90 arasında dönüştürür. Bu yöntem çağırır

direksiyonu ve ivmeyi ZenWheels özelliklerine dönüştüren ve ardından bluetooth kullanarak komutları ileten void moveZwheelsCar(bayt açısı, int hız).

Dönüşümü iki adımda yapmamın nedeni yeniden kullanılabilirlik. Bu taslağı başka bir cihazı uzaktan kumandaya uyarlamam gerekirse, hızı ve direksiyonu bazı yararlı değerlere zaten eşleyen "steer" temel yönteminden başlardım.

7. Adım: Alternatifler

"Tersine mühendislik"e bir alternatif. Android uygulamasından başlayarak projeyi nasıl tersine çevireceğimden bahsettim. Ancak bunun bir alternatifi var, bir seri FTDI + bluetooth slave kurabilirsiniz (ana ayarları belirtmeden normal HC-05). Ardından ZenWheels uygulamasından "microcar" yerine HC-05'e bağlanın.

Komutları çözmek için direksiyon simidini bir konumda tutmanız ve ardından bir python betiği kullanarak seri iletişimi analiz etmeniz gerekir. Bir python betiği öneriyorum çünkü yazdırılamayan karakterler var ve Arduino IDE buna uygun değil. Tekerleği bir konumda tutarsanız, uygulamanın aynı iki baytı düzenli olarak ileteceğini gözlemleyeceksiniz. Tekerlek konumunu değiştirirseniz, ilk bayt aynı kalacak, ikincisi değişecektir. Birçok denemeden sonra direksiyon algoritmasını bulabilir, ardından ters mühendislik gaz kelebeği vb.

Arduino tabanlı uzaktan kumandaya bir alternatif, bir RaspberryPi uzaktan kumandası olabilir. Ahududu pi, "ana" modda kurulumu zahmetsiz olan gömülü bir bluetooth modülüne sahiptir ve python bluetooth kütüphanesi bir cazibe gibi çalışır. Ayrıca Alexa echo kullanarak arabayı kontrol etmek gibi daha ilginç projeler de mümkün:)

Umarım projeyi beğenmişsinizdir ve lütfen aşağıya yorum bırakın!

Önerilen: