جدول المحتويات:

جهاز تحكم عن بعد قابل للاختراق لـ ZenWheels Microcar: 7 خطوات
جهاز تحكم عن بعد قابل للاختراق لـ ZenWheels Microcar: 7 خطوات

فيديو: جهاز تحكم عن بعد قابل للاختراق لـ ZenWheels Microcar: 7 خطوات

فيديو: جهاز تحكم عن بعد قابل للاختراق لـ ZenWheels Microcar: 7 خطوات
فيديو: 9# اختبار اختراق نظام الموبايل اندرويد عن بعد (التشفير والدمج) - ميتا سبلويت و كالى - الدرس الثامن 2024, يونيو
Anonim
Image
Image
المجسم
المجسم

سنقوم في هذا البرنامج التعليمي ببناء جهاز تحكم عن بعد مخصص لـ ZenWheels microcar. ZenWheels microcar هي لعبة سيارة بحجم 5 سم يمكن التحكم فيها من خلال تطبيق Android أو Iphone. سأوضح لك كيفية إجراء هندسة عكسية لتطبيق Android للتعرف على بروتوكول الاتصال وكيف يمكنك إنشاء جهاز تحكم عن بعد باستخدام اردوينو وجيروسكوب.

الخطوة 1: المكونات والأدوات

القطع:

1. السيارة الصغيرة ZenWheels

2. Arduino pro mini 328p

3. اللوح

4. جيروسكوب MPU6050

5. مصدر الطاقة <= 5 فولت (بعض البطاريات التي يمكننا توصيلها باللوحة)

6. كبلات توصيل على شكل حرف U (اختياري). لقد استخدمت هذه الكابلات لأنها تبدو أفضل على اللوح. يمكن استخدام كابلات التوصيل العادية بدلاً من ذلك

7. وحدة بلوتوث HC-05 (مع زر للدخول إلى وضع AT)

أدوات:

1. محول USB إلى FTDI التسلسلي FT232RL لبرمجة Arduino pro mini

2. اردوينو IDE

3. هاتف أندرويد

4. Android Studio [اختياري]

الخطوة 2: الهندسة العكسية لتطبيق ZenWheels Android [اختياري]

مطلوب بعض المعرفة بجافا وأندرويد لفهم هذا الجزء.

هدف المشروع هو التحكم في microcar باستخدام جيروسكوب. لهذا نحتاج إلى معرفة المزيد عن اتصال البلوتوث بين هذه اللعبة وتطبيق android.

في هذه الخطوة ، سأشرح كيفية إجراء هندسة عكسية لبروتوكول الاتصال بين تطبيق microcar وتطبيق 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" ، من الحالات التي وجدت أن "BluetoothSerialService" كانت في التعامل مع الاتصال. إذا كان هذا الفصل يتعامل مع الاتصال ، فيجب أن يكون لديه طريقة أمر إرسال. تبين أن هناك طريقة كتابة واحدة ترسل البيانات عبر قناة البلوتوث:

كتابة باطلة عامة (بايت خارج)

هذه بداية جيدة ، لقد بحثت عن.write (الطريقة المستخدمة وهناك فئة "ZenWheelsMicrocar" التي توسع "BluetoothSerialService" لدينا. تحتوي هذه الفئة على معظم منطق اتصالنا عبر البلوتوث. الجزء الآخر من المنطق في وحدات التحكم: BaseController و StandardController.

في BaseController ، لدينا تهيئة الخدمة ، وكذلك تعريفات قنوات التوجيه والخانق ، والقنوات هي في الواقع بادئات أوامر لتحديد أن نوعًا ما من الأوامر سيتبع:

ZenWheelsMicrocar المحمي microcar = جديد ZenWheelsMicrocar (this ، this.btHandler) ؛

المحمية ChannelOutput المخرجات = {new TrimChannelOutput (ZenWheelsMicrocar. STEERING_CHANNEL) ، TrimChannelOutput (ZenWheelsMicrocar. THROTTLE_CHANNEL)} ؛

في StandardController ، يتم التعامل مع التوجيه في:

مقبض الفراغ العام (TouchEvent touchEvent) {

… this.microcar.setChannel (eeringOutput.channel ،eeringOutput.resolveValue ()) ؛ }

بتحليل الطريقة ، يكون لقناة التوجيه الإخراجية القيمة 129 (القناة المستخدمة للتوجيه) وقد يكون لقناة التوجيه الإخراج.resolveValue () قيمة بين -90 و 90. يتم إرسال قيمة القناة (129) مباشرةً ، ويتم تعديل قيمة التوجيه من خلال تطبيق عمليات البت:

قيمة int النهائية الخاصة الخاصة value_convert_out (قيمة int) {

منطقي سلبي = خطأ ؛ إذا (القيمة <0) {سلبي = f6D ؛ } int value2 = value & 63 ؛ إذا (سلبي) {قيمة الإرجاع 2 | 64 ؛ } قيمة الإرجاع 2؛ }

هناك طريقة مماثلة في StandardController تسمى

مقبض الفراغ العام

الخطوة 3: المكونات

القطع:

1. Arduino pro mini 328p 2 $

2. اللوح

3. MPU6050 جيروسكوب 1.2 دولار

4. وحدة 6 دبابيس HC-05 السيد والعبد 3 دولار

5. 4 × حزمة بطارية AA مع 4 بطاريات

6. كبلات توصيل على شكل حرف U (اختياري). لقد استخدمت كبلات التوصيل هذه لأنها تبدو أفضل على اللوح ، وتكون المصابيح أكثر وضوحًا بهذه الطريقة. إذا لم يكن لديك هذه الكابلات يمكنك استبدالها بأسلاك دوبونت.

الأسعار المذكورة أعلاه مأخوذة من eBay.

أدوات:

1. محول USB إلى FTDI التسلسلي FT232RL لبرمجة اردوينو برو ميني

2. اردوينو IDE

3. Android Studio (اختياري إذا كنت تريد إجراء هندسة عكسية بنفسك)

الخطوة 4: التجميع

المجسم
المجسم

التجميع بسيط للغاية لأننا نقوم بذلك على لوح التجارب:)

- أولاً نضع مكوناتنا على اللوح: المتحكم الدقيق ووحدة البلوتوث والجيروسكوب

- قم بتوصيل دبابيس HC-05 bluetooth RX و TX بدبابيس اردوينو 10 و 11. يجب توصيل الجيروسكوب SDA و SCL بدبابيس اردوينو A4 و A5

- قم بتوصيل دبابيس الطاقة بالبلوتوث والجيروسكوب والاردوينو. يجب توصيل المسامير بـ + و- على جانب اللوح

- آخر توصيل لمصدر طاقة (بين 3.3 فولت إلى 5 فولت) باللوحة ، لقد استخدمت بطارية LiPo صغيرة ذات خلية واحدة ولكن أي منها سيفعل طالما أنه في نطاق الطاقة

يرجى التحقق من الصور أعلاه لمزيد من التفاصيل

الخطوة 5: قم بإقران HC-05 Bluetooth مع Microcar

قم بإقران HC-05 Bluetooth بـ Microcar
قم بإقران HC-05 Bluetooth بـ Microcar
قم بإقران HC-05 Bluetooth بـ Microcar
قم بإقران HC-05 Bluetooth بـ Microcar
قم بإقران HC-05 Bluetooth بـ Microcar
قم بإقران HC-05 Bluetooth بـ Microcar

لهذا ستحتاج إلى هاتف يعمل بنظام Android ووحدة بلوتوث HC-05 ومحول FTDI التسلسلي مع الأسلاك. سنستخدم أيضًا Arduino IDE للتواصل مع وحدة البلوتوث.

نحتاج أولاً إلى معرفة عنوان microcar bluetooth:

- قم بتمكين البلوتوث على هاتفك

- قم بتشغيل السيارة وانتقل إلى قسم البلوتوث في إعداداتك في Android

- ابحث عن أجهزة جديدة ويجب أن يظهر جهاز يسمى "Microcar"

- إقران مع هذا الجهاز

- ثم لاستخراج Bluetooth MAC ، لقد استخدمت هذا التطبيق من google play Serial Bluetooth Terminal

بعد تثبيت هذا التطبيق ، انتقل إلى القائمة -> الأجهزة وستكون لديك قائمة بجميع الأجهزة المقترنة بالبلوتوث. نحن مهتمون فقط بالرمز الموجود أسفل منجم "Microcar" وهو 00: 06: 66: 49: A0: 4B

بعد ذلك ، قم بتوصيل محول FTDI بوحدة البلوتوث. أول دبابيس VCC و GROUND ثم FTDI RX إلى bluetooth TX و FTDI TX إلى bluetooth RX. يجب أيضًا أن يكون هناك دبوس على وحدة البلوتوث يجب توصيله بـ VCC. عند القيام بذلك ، تدخل وحدة البلوتوث في "وضع قابل للبرمجة". تحتوي وحدتي على زر يربط VCC بهذا الدبوس الخاص. عندما تقوم بتوصيل FTDI في USB ، يجب أن يكون مع توصيل الدبوس / الضغط على الزر للدخول في هذا الوضع القابل للبرمجة الخاص. يؤكد البلوتوث الدخول في وضع التشغيل هذا بالوميض ببطء كل ثانيتين.

في Arduino IDE ، حدد المنفذ التسلسلي ، ثم افتح الشاشة التسلسلية (كل من NL و CR بمعدل باود 9600). اكتب AT والوحدة يجب أن تؤكد بـ "موافق".

اكتب "AT + ROLE = 1" لوضع الوحدة في الوضع الرئيسي. للاقتران مع وحدة bluetooh الخاصة بك ، اكتب: "AT + BIND = 0006، 66، 49A04B" ، لاحظ كيف يتم تحويل "00: 06: 66: 49: A0: 4B" إلى "0006، 66، 49A04B". حسنًا ، يجب عليك إجراء نفس التحويل لـ bluetooh MAC الخاص بك.

الآن قم بتشغيل سيارة Zenwheels ثم افصل FTDI وقم بتوصيله مرة أخرى دون الضغط على الزر / توصيل دبوس خاص. بعد فترة من المفترض أن تتصل بالسيارة وستلاحظ أن السيارة تقوم بإجراء اتصال معين بصوت ناجح.

استكشاف الأخطاء وإصلاحها:

- لقد وجدت أنه من بين جميع وحدات البلوتوث التي أمتلكها ، فقط الوحدة التي تحتوي على زر تعمل كمتخصص!

- تأكد من شحن السيارة بالكامل

- تأكد من أن السيارة غير متصلة بالهاتف

- إذا دخل 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"

كثافة العمليات MAX_ANGLE = 45 ؛

الأمر const بايت commandStering = 129 ؛ أمر سرعة بايت const = 130 ؛

تهيئة منطقية = خطأ ؛ // تعيين صحيح في حالة نجاح بدء 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؛ // [x، y، z] عوامة ناقلات الجاذبية ypr [3]؛ // [الانعراج ، الملعب ، التدحرج] حاوية الانعراج / الملعب / لفة وناقل الجاذبية المنطقي المتطاير mpuInterrupt = false ؛ // يشير إلى ما إذا كان دبوس مقاطعة MPU قد ارتفع

lastPrintTime طويل بدون توقيع ، lastMoveTime = 0 ؛

SoftwareSerial BTserial (10 ، 11) ؛

MPU6050 وحدة معالجة مركزية ؛

الإعداد باطل()

{Serial.begin (9600) ، BTserial.begin (38400) ، Serial.println ("بدأ البرنامج") ؛ التهيئة = initializeGyroscope () ، }

حلقة فارغة() {

إذا (! التهيئة) {عودة؛ } 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 - = packetSize ؛ 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 بحد أقصى للأمام * / حركة باطلة ZwheelsCar (زاوية بايت ، سرعة int) {إذا (ميليس () - lastMoveTime = 90) {resultAngle = خريطة (زاوية ، 91 ، 180 ، 1 ، 60) ؛ } else if (الزاوية 0) {resultSpeed = map (speed، 0، 90، 0، 60)؛ } else if (speed <0) {resultSpeed = map (speed، 0، -90، 120، 60)؛ } Serial.print ("realAngle =") ؛ Serial.print (زاوية) ؛ Serial.print ("؛") ؛ Serial.print ("activeSpeed =") ؛ Serial.print (resultSpeed) ؛ Serial.println ("؛") ؛ BTserial.write (commandStering) ؛ BTserial.write (resultAngle) ؛ BTserial.write (commandSpeed) ؛ BTserial.write ((بايت) resultSpeed) ؛ lastMoveTime = مللي () ، }

توجيه باطل (int x، int y، int z)

{س = تقييد (س ، -1 * MAX_ANGLE ، MAX_ANGLE) ؛ 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 (زاوية ، سرعة) ؛ }

تصحيح باطل printDebug (int x، int y، int z، int angle، int speed)

{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 ("زاوية =") ؛ Serial.print (زاوية) ؛ Serial.print ("؛") ؛ Serial.print ("speed =") ؛ Serial.print (السرعة) ؛ Serial.println ("؛") ؛ lastPrintTime = مللي () ، }

تهيئة منطقية

{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) ؛ إذا (devStatus! = 0) {Serial.print (F ("فشل تهيئة DMP (رمز")) ؛ Serial.println (devStatus) ؛ إرجاع خطأ ؛} mpu.setDMPEnabled (صحيح) ؛ Serial.println (F ("تمكين كشف المقاطعة (Arduino External interrupt 0) … ")) ؛ attachInterrupt (0، dmpDataReady، RISING)؛ mpuIntStatus = mpu.getIntStatus ()؛ Serial.println (F (" DMP جاهز! في انتظار أول مقاطعة… ")) ؛ حجم الحزمة = mpu.dmpGetFIFOPacketSize () ؛ إرجاع صحيح ؛}

dmpDataReady باطل ()

{mpuInterrupt = صحيح ، }

منطقية hasFifoOverflown (int mpuIntStatus، int fifoCount)

{إرجاع mpuIntStatus & 0x10 || fifoCount == 1024 ؛ }

قم بتحميل الكود باستخدام محول FTDI إلى Arduino ثم قم بتوصيل البطاريات.

باستخدام جهاز التحكم عن بعد:

بعد تشغيل اردوينو ، قم أيضًا بتشغيل السيارة. يجب أن تتصل وحدة HC-05 بالسيارة ، وعندما يحدث ذلك ، ستصدر السيارة صوتًا. إذا لم ينجح الأمر ، فيرجى التحقق من الخطوة السابقة وقسم استكشاف الأخطاء وإصلاحها.

إذا قمت بإمالة اللوح للأمام ، يجب أن تتحرك السيارة للأمام ، يمينًا ويجب أن تتحرك السيارة لليمين. كما أنه يؤدي أيضًا إلى حركات أكثر تدريجيًا مثل الميل للأمام قليلاً واليسار قليلاً في هذه الحالة ستتحرك السيارة ببطء إلى اليسار.

إذا سارت السيارة بطريقة مختلفة عند إمالة اللوح ، فامسك اللوح أولاً في اتجاهات مختلفة.

كيف تعمل:

يحصل الرسم التخطيطي على إحداثيات الجيروسكوب كل 100 مللي ثانية ، ويقوم بالحسابات ثم ينقل أوامر السيارة عبر البلوتوث. أولاً ، هناك طريقة "توجيه" يتم استدعاؤها بزوايا x و y و z الخام. تقوم هذه الطريقة بتحويل التوجيه بين 0 و 180 درجة والتسارع بين -90 و 90. تستدعي هذه الطريقة

void moveZwheelsCar (زاوية بايت ، سرعة int) التي تحول التوجيه والتسارع إلى مواصفات ZenWheels ثم تنقل الأوامر باستخدام البلوتوث.

السبب في إجراء التحويل على خطوتين ، هو قابلية إعادة الاستخدام. إذا كنت بحاجة إلى تكييف هذا المخطط للتحكم عن بعد في بعض الأجهزة الأخرى ، فسأبدأ من الطريقة الأساسية "التوجيه" التي تحدد بالفعل السرعة والتوجيه لبعض القيم المفيدة.

الخطوة 7: البدائل

بديل عن "الهندسة العكسية". لقد تحدثت عن كيفية إجراء هندسة عكسية للمشروع من خلال البدء بتطبيق Android. ولكن هناك بديل لهذا يمكنك إعداد FTDI + تسلسلي تابع للبلوتوث (HC-05 عادي دون تحديد الإعدادات الرئيسية). ثم من تطبيق ZenWheels قم بالاتصال بـ HC-05 بدلاً من "microcar".

لفك تشفير الأوامر ، ستحتاج إلى تثبيت عجلة القيادة في بعض المواضع ، ثم باستخدام برنامج نصي من Python لتحليل الاتصال التسلسلي. أقترح برنامج نصي بيثون لأن هناك أحرف غير قابلة للطباعة و Arduino IDE ليس مناسبًا لذلك. ستلاحظ أنه إذا قمت بالضغط على العجلة في موضع واحد ، فإن التطبيق سيرسل بانتظام نفس وحدتي بايت. إذا قمت بتغيير موضع العجلة ، فإن قبضة اليد ستبقى كما هي ، ستتغير الثانية. بعد العديد من التجارب ، يمكنك التوصل إلى خوارزمية التوجيه ، ثم إجراء هندسة عكسية للخانق وما إلى ذلك.

قد يكون جهاز التحكم عن بعد RaspberryPi بديلاً لجهاز التحكم عن بعد المستند إلى اردوينو. يحتوي raspberry pi على وحدة بلوتوث مضمنة غير مؤلمة ليتم إعدادها في الوضع "الرئيسي" وتعمل مكتبة python bluetooth مثل السحر. من الممكن أيضًا بعض المشاريع الأكثر إثارة للاهتمام مثل التحكم في السيارة باستخدام Alexa echo:)

أتمنى أن تكون قد استمتعت بالمشروع ويرجى ترك التعليقات أدناه!

موصى به: