İçindekiler:
- Adım 1: Bileşenler ve Araçlar
- 2. Adım: ZenWheels Android Uygulamasında Tersine Mühendislik [isteğe bağlı]
- Adım 3: Bileşenler
- Adım 4: Montaj
- Adım 5: HC-05 Bluetooth'u Microcar ile eşleştirin
- Adım 6: Kod ve Kullanım
- 7. Adım: Alternatifler
Video: ZenWheels Microcar için Hacklenebilir Uzaktan Kumanda: 7 Adım
2024 Yazar: John Day | [email protected]. Son düzenleme: 2024-01-30 13:18
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
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
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:
Raspberry PI (RPi) için LIRC Kullanan Kolay Kurulum IR Uzaktan Kumanda - Temmuz 2019 [Bölüm 1]: 7 Adım
Raspberry PI (RPi) için LIRC Kullanan Kolay Kurulum IR Uzaktan Kumanda - Temmuz 2019 [Bölüm 1]: Uzun araştırmalardan sonra, RPi projem için IR uzaktan kumandanın nasıl kurulacağına dair çelişkili bilgiler konusunda şaşırdım ve dehşete düştüm. Kolay olacağını düşündüm ama Linux InfraRed Control'ü (LIRC) kurmak uzun zamandır sorunluydu ama
Hayward ColorLogic için Wi-Fi Uzaktan Kumanda: 3 Adım
Hayward ColorLogic için Wi-Fi Uzaktan Kumanda: Hayward ColorLogic, yüzme havuzları, kaplıcalar, göletler ve diğer su özelliklerine popüler bir ektir. Her ışık, bir dizi parlak LED artı bir düzine düz renk ve ışık gösterisi sağlayacak mantığı içerir. Bu üniteler 12 VAC güç kullanır, bu da
Arduino İle Bilgisayarınız İçin IR Uzaktan Kumanda: 6 Adım
Arduino İle Bilgisayarınıza IR Uzaktan Kumanda: Bu alıcı ile IR modülü ve Arduino sayesinde bilgisayarınızı uzaktan kontrol edin. Tembel mod etkinleştirildi ^^
IRduino: Arduino Uzaktan Kumanda - Kayıp Bir Uzaktan Kumandayı Taklit Etme: 6 Adım
IRduino: Arduino Uzaktan Kumanda - Kayıp Bir Uzaktan Kumandayı Taklit Edin: TV veya DVD oynatıcınızın uzaktan kumandasını kaybettiyseniz, cihazın üzerindeki düğmeleri yürümek, bulmak ve kullanmak zorunda olmanın ne kadar sinir bozucu olduğunu bilirsiniz. Bazen bu düğmeler, uzaktan kumandayla aynı işlevi bile sunmaz.
Dört Kanallı RC Oyuncak Uzaktan Kumandaya Dönüştürülen Sıradan Uzaktan Kumanda Kiti: 4 Adım
Dört Kanallı RC Oyuncak Uzaktan Kumandaya Dönüştürülen Sıradan Uzaktan Kumanda Kiti: 如何将通用遥控器套件转换为玩具模型中使用的四通道遥控器。遥控器套件非常便宜。它采用2262和2272芯片和433个模块构建。改造方法非常简单。只需准备一些瓦楞纸板,然后按照视频教程完成这个电子项目并为您服务。玩具车船提供远程无线控制。