فهرست مطالب:

کنترل از راه دور قابل هک برای ZenWheels Microcar: 7 مرحله
کنترل از راه دور قابل هک برای ZenWheels Microcar: 7 مرحله

تصویری: کنترل از راه دور قابل هک برای ZenWheels Microcar: 7 مرحله

تصویری: کنترل از راه دور قابل هک برای ZenWheels Microcar: 7 مرحله
تصویری: کنترل کامل گوشی هر کسی 2024, ژوئن
Anonim
Image
Image
مونتاژ
مونتاژ

در این آموزش ما قصد داریم یک کنترل از راه دور سفارشی برای میکروکار ZenWheels بسازیم. میکروکار ZenWheels یک ماشین اسباب بازی 5 سانتی متری است که از طریق برنامه Android یا Iphone قابل کنترل است. من قصد دارم به شما نحوه مهندسی معکوس برنامه اندروید برای اطلاع از پروتکل ارتباطی و نحوه ساخت یک کنترل از راه دور با استفاده از آردوینو و ژیروسکوپ را نشان دهم.

مرحله 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. Arduino IDE

3. تلفن اندروید

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

مرحله 2: مهندسی معکوس برنامه Android ZenWheels [اختیاری]

برای درک این قسمت نیاز به برخی از دانش جاوا و اندروید است.

هدف پروژه کنترل میکرو خودرو با استفاده از ژیروسکوپ است. برای این منظور باید در مورد ارتباط بلوتوث بین این اسباب بازی و برنامه اندروید اطلاعات بیشتری کسب کنیم.

در این مرحله نحوه مهندسی معکوس پروتکل ارتباطی بین microcar و برنامه اندروید را توضیح خواهم داد. اگر فقط می خواهید ریموت را بسازید این مرحله لازم نیست. یکی از راه های کشف پروتکل ، مشاهده کد منبع است. هوم ، اما این مستقیماً پیش نمی رود ، برنامه های اندروید کامپایل می شوند و می توان apk را از طریق google play نصب کرد.

بنابراین من یک راهنمای اساسی برای انجام این کار تهیه کرده ام:

1. APK را بارگیری کنید. بسته بسته Android (به اختصار APK) فرمت فایل بسته ای است که توسط سیستم عامل Android برای توزیع و نصب برنامه های تلفن همراه استفاده می شود.

ابتدا برنامه را در فروشگاه Google play جستجو کنید ، در مورد ما "zenwheels" را جستجو کنید و پیوند برنامه را دریافت خواهید کرد

سپس در Google عبارت "apk downloader online" را جستجو کرده و از یکی برای بارگیری apk استفاده کنید. معمولاً آنها پیوند برنامه را درخواست می کنند (پیوندی که قبلاً به دست آوردیم) ، سپس دکمه بارگیری را فشار داده و آن را در رایانه ذخیره می کنیم.

2. APK را کامپایل کنید. یک کامپایلر در وضعیت ما ابزاری است که APK را می گیرد و کد منبع جاوا را تولید می کند.

ساده ترین راه حل این است که از یک کامپایلر آنلاین برای انجام کار استفاده کنید. من در گوگل "decompliler آنلاین" را جستجو کرده ام و https://www.javadecompilers.com/ را انتخاب کرده ام. فقط باید APK را که قبلاً به دست آورده اید بارگذاری کنید و

دکامپایل را فشار دهید سپس فقط منابع را بارگیری کنید.

3. سعی کنید مهندس معکوس را از طریق کد جستجو کنید

برای باز کردن پروژه به ویرایشگر متن یا بهتر IDE (محیط توسعه یکپارچه) نیاز دارید. IDE پیش فرض برای پروژه های Android ، Android Studio (https://developer.android.com/studio) است. پس از نصب Android Studio پوشه پروژه را باز کنید.

از آنجا که ماشین ما توسط بلوتوث کنترل می شود ، من جستجوی خود را در رمزگشایی شده با کلمه کلیدی "bluetooth" آغاز کردم ، از مواردی که من دریافتم "BluetoothSerialService" ارتباط را مدیریت می کرد. اگر این کلاس ارتباط را مدیریت می کند ، باید متد دستور ارسال داشته باشد. به نظر می رسد یک روش نوشتن وجود دارد که داده ها را از طریق کانال بلوتوث ارسال می کند:

نوشتن خلاء عمومی (بایت خارج)

این شروع خوبی است ، من عبارت. منطق در کنترلرها است: BaseController و StandardController.

در BaseController ما راه اندازی اولیه سرویس را داریم ، و همچنین تعاریف کانال های فرمان و دریچه گاز ، کانال ها در واقع پیشوندهای فرمان هستند تا مشخص شود که برخی از دستورات دنبال می شوند:

microcar ZenWheelsMicrocar = ZenWheelsMicrocar جدید (این ، this.btHandler) ؛

ChannelOutput محافظت شده خروجی = {new TrimChannelOutput (ZenWheelsMicrocar. STEERING_CHANNEL) ، TrimChannelOutput جدید (ZenWheelsMicrocar. THROTTLE_CHANNEL)} ؛

در StandardController فرمان به شرح زیر است:

دسته عمومی خالی فرمان (TouchEvent touchEvent) {

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

با تجزیه و تحلیل روش ، steeringOutput.channel دارای مقدار 129 (کانال مورد استفاده برای فرمان) و steeringOutput.resolveValue () ممکن است دارای مقداری بین -90 تا 90 باشد. مقدار کانال (129) به طور مستقیم ارسال می شود و مقدار فرمان تغییر می کند با اعمال عملیات بیتی:

خصوصی نهایی int value_convert_out (مقدار int) {

منفی بولی = غلط ؛ if (مقدار <0) {negative = f6D؛ } int value2 = value & 63؛ if (منفی) {مقدار بازگشتی 2 | 64؛ } مقدار بازگشت 2؛ }

روش مشابهی در StandardController وجود دارد به نام

دسته عمومی خالی دریچه گاز (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. کابل های بلوز شکل U (اختیاری). من از این کابل های جامپر استفاده کرده ام زیرا روی تخته نان بهتر به نظر می رسند و led ها به این ترتیب بیشتر قابل مشاهده هستند. اگر این کابل ها را ندارید ، می توانید آنها را با سیم های dupont جایگزین کنید.

قیمت های فوق از eBay گرفته شده است.

ابزارها:

1. USB به سریال FTDI آداپتور FT232RL برای برنامه نویسی arduino pro mini

2. Arduino IDE

3. Android Studio (اختیاری اگر می خواهید خود مهندس معکوس شوید)

مرحله 4: مونتاژ

مونتاژ
مونتاژ

مونتاژ بسیار ساده است زیرا ما آن را روی تخته نان انجام می دهیم:)

- ابتدا اجزای خود را روی تخته نان قرار می دهیم: میکروکنترلر ، ماژول بلوتوث و ژیروسکوپ

- پین های bluetooth RX و TX HC-05 را به پین های 10 و 11 آردوینو وصل کنید. ژیروسکوپ SDA و SCL باید به پین های آردوینو A4 و A5 متصل شوند

- پین های برق را به بلوتوث ، ژیروسکوپ و آردوینو وصل کنید. پین ها باید به + و - در کنار تخته نان متصل شوند

- آخرین منبع تغذیه (بین 3.3 ولت تا 5 ولت) را به نان برد وصل کنید ، من از یک باتری کوچک LiPo تک سلولی استفاده کرده ام ، اما تا زمانی که در محدوده قدرت باشد ، این کار را انجام می دهد.

برای مشاهده جزئیات بیشتر لطفاً تصاویر بالا را بررسی کنید

مرحله 5: بلوتوث HC-05 را با Microcar جفت کنید

بلوتوث HC-05 را با Microcar جفت کنید
بلوتوث HC-05 را با Microcar جفت کنید
بلوتوث HC-05 را با Microcar جفت کنید
بلوتوث HC-05 را با Microcar جفت کنید
بلوتوث HC-05 را با Microcar جفت کنید
بلوتوث HC-05 را با Microcar جفت کنید

برای این کار به یک تلفن Android ، ماژول بلوتوث HC-05 و آداپتور سری FTDI با سیم نیاز دارید. همچنین از Arduino IDE برای ارتباط با ماژول بلوتوث استفاده خواهیم کرد.

ابتدا باید آدرس بلوتوث microcar را پیدا کنیم:

- بلوتوث را در تلفن خود فعال کنید

- ماشین را روشن کنید و به بخش بلوتوث تنظیمات خود در Android بروید

- دستگاههای جدید را جستجو کنید و برخی از دستگاهها به نام "Microcar" ظاهر شوند

- با این دستگاه جفت شوید

- سپس برای استخراج 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 وصل می کنید ، باید با دکمه وصل شده / دکمه را فشار دهید تا در این حالت برنامه ریزی ویژه وارد شوید. بلوتوث ورود به این حالت عملکرد را با پلک زدن آرام هر 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 را از برق بکشید و دوباره آن را بدون فشار دادن دکمه / اتصال پین مخصوص به برق وصل کنید. پس از مدتی باید به خودرو متصل شود و متوجه خواهید شد که خودرو یک اتصال خاص را با موفقیت صدا می دهد.

عیب یابی:

- من دریافتم که از تمام ماژول های بلوتوثی که داشتم ، تنها یکی با دکمه به عنوان استاد کار می کرد!

- اطمینان حاصل کنید که خودرو به طور کامل شارژ شده است

- مطمئن شوید ماشین به تلفن وصل نیست

- اگر بلوتوث در حالت AT وارد می شود (به آرامی چشمک می زند) اما به فرمان پاسخ نمی دهد مطمئن شوید که هر دو NL & CR را دارید و همچنین با سایر نرخ های BAUD آزمایش کنید

- دوبار بررسی کنید که RX به TX متصل است و بالعکس

- این آموزش را امتحان کنید

مرحله 6: کد و نحوه استفاده

ابتدا باید دو کتابخانه را بارگیری و نصب کنید:

1. کتابخانه MPU6050 برای ژیروسکوپ

2. منبع کتابخانه I2CDev

سپس کتابخانه من را از اینجا بارگیری و نصب کنید یا از زیر کپی کنید:

/** * کتابخانه ها: * https://github.com/jrowberg/i2cdevlib * https://github.com/jrowberg/i2cdevlib */ #شامل "I2Cdev.h" # #شامل "MPU6050_6Axis_MotionApps20.h" #شامل "سیم".h "#include" SoftwareSerial.h"

const int MAX_ANGLE = 45 ؛

const byte commandStering = 129؛ const byte commandSpeed = 130؛

bool initialization = false؛ // اگر DMP init موفق بود ، true را تنظیم کنید

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] quaternion container VectorFlo gravity؛ // [x، y، z] بردار گرانش شناور ypr [3]؛ // [yaw، pitch، roll] yaw/pitch/roll ظرف و بردار گرانش bool volatile bool mpuInterrupt = false؛ // نشان می دهد که آیا پین وقفه MPU بالا رفته است یا خیر

unsigned long lastPrintTime ، lastMoveTime = 0 ؛

SoftwareSerial BT سریال (10 ، 11) ؛

MPU6050 mpu ؛

void setup ()

{Serial.begin (9600) ؛ BTserial.begin (38400) ؛ Serial.println ("برنامه شروع شد") ؛ مقداردهی = initializeGyroscope ()؛ }

حلقه خالی () {

if (! مقداردهی اولیه) {return؛ } 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 ، & جاذبه) ؛ هدایت (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 (زاویه بایت ، سرعت int) {if (millis () - lastMoveTime = 90) {resultAngle = map (زاویه ، 91 ، 180 ، 1 ، 60) ؛ } else if (زاویه 0) {resultSpeed = map (سرعت ، 0 ، 90 ، 0 ، 60) ؛ } else if (سرعت <0) {resultSpeed = map (سرعت ، 0 ، -90 ، 120 ، 60) ؛ } Serial.print ("actualAngle =")؛ Serial.print (angle)؛ Serial.print ("؛")؛ Serial.print ("actualSpeed =")؛ Serial.print (resultSpeed)؛ Serial.println ("؛")؛ BTserial.write (commandStering) ؛ BTserial.write (resultAngle) ؛ BTserial.write (commandSpeed) ؛ BTserial.write ((byte) resultSpeed)؛ lastMoveTime = millis ()؛ }

void steer (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 = نقشه (z ، -MAX_ANGLE ، MAX_ANGLE ، 90 ، -90) ؛ printDebug (x ، y ، z ، زاویه ، سرعت) ؛ moveZwheelsCar (زاویه ، سرعت) ؛ }

void printDebug (int x ، int y ، int z ، int زاویه ، 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 ("angle =")؛ Serial.print (angle)؛ Serial.print ("؛")؛ Serial.print ("speed =")؛ Serial.print (speed)؛ Serial.println ("؛")؛ lastPrintTime = millis ()؛ }

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 Initialization failed (code"))؛ Serial.println (devStatus)؛ return false؛} mpu.setDMPEnabled (true)؛ Serial.println (F ("Enableing تشخیص وقفه (Arduino وقفه خارجی 0) … "))؛ attachInterrupt (0 ، dmpDataReady ، RISING) ؛ mpuIntStatus = mpu.getIntStatus () ؛ Serial.println (F (" DMP آماده! در انتظار اولین وقفه … ")) ؛ بسته بندی = mpu.dmpGetFIFOPacketSize () ؛ true true؛}

void dmpDataReady ()

{mpuInterrupt = true؛ }

بولی hasFifoOverflown (int mpuIntStatus، int fifoCount)

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

کد را با استفاده از آداپتور FTDI به آردوینو بارگذاری کرده و باتری ها را وصل کنید.

استفاده از ریموت کنترل:

پس از روشن شدن آردوینو ، خودرو را نیز روشن کنید. ماژول HC-05 باید به خودرو متصل شود ، در این صورت خودرو صدایی را منتشر می کند. اگر کار نمی کند لطفا مرحله قبلی و بخش عیب یابی را بررسی کنید.

اگر تخته نان را به جلو متمایل کنید ، ماشین باید به جلو ، راست و ماشین باید به سمت راست حرکت کند. همچنین حرکات تدریجی تری انجام می دهد مانند کمی به جلو و کمی سمت چپ در این حالت خودرو به آرامی به سمت چپ می رود.

اگر اتومبیل هنگام متمایل شدن به تخته نان راه متفاوتی را طی می کند ، ابتدا تخته نان را در جهات مختلف نگه دارید.

چگونه کار می کند:

این طرح مختصات ژیروسکوپ را در هر 100 میلی ثانیه دریافت می کند ، محاسبه می کند و سپس فرمان های ماشین را از طریق بلوتوث ارسال می کند. ابتدا یک روش "هدایت" وجود دارد که با زاویه های خام x ، y و z فراخوانی می شود. این روش فرمان را بین 0 تا 180 درجه و شتاب را بین 90- تا 90 تغییر می دهد. این روش فراخوانی می کند

void moveZwheelsCar (زاویه بایت ، سرعت int) که فرمان و شتاب را به مشخصات ZenWheels تبدیل کرده و سپس دستورات را با استفاده از بلوتوث منتقل می کند.

دلیل اینکه من تغییر را در دو مرحله انجام دادم ، قابلیت استفاده مجدد است. اگر بخواهم این طرح را برای کنترل از راه دور برخی دستگاه های دیگر تطبیق دهم ، از روش اصلی "هدایت" استفاده می کنم که از قبل سرعت و فرمان را به مقادیر مفید ترسیم می کند.

مرحله 7: جایگزین ها

جایگزینی برای "مهندسی معکوس". من در مورد نحوه مهندسی معکوس پروژه با شروع با برنامه Android صحبت کردم. اما جایگزینی برای این وجود دارد که می توانید یک برده بلوتوث FTDI + (معمولی HC-05 بدون تعیین تنظیمات اصلی) تنظیم کنید. سپس از برنامه ZenWheels به جای "microcar" به HC-05 متصل شوید.

برای رمزگشایی دستورات باید فرمان را در موقعیتی نگه دارید ، سپس با استفاده از اسکریپت پایتون ارتباط سریال را تجزیه و تحلیل کنید. من یک اسکریپت پایتون را پیشنهاد می کنم زیرا کاراکترهای غیرقابل چاپ وجود دارد و Arduino IDE برای آن مناسب نیست. مشاهده خواهید کرد که اگر چرخ را در یک موقعیت نگه دارید ، برنامه به طور منظم همان دو بایت را منتقل می کند. اگر موقعیت چرخ را تغییر دهید ، بایت مشت یکسان باقی می ماند ، دوم تغییر می کند. پس از آزمایش های فراوان ، می توانید الگوریتم فرمان را ارائه دهید ، سپس دریچه گاز مهندسی معکوس و غیره.

یک جایگزین برای کنترل از راه دور مبتنی بر آردوینو ، یک ریموت RaspberryPi خواهد بود. تمشک pi دارای یک ماژول بلوتوث تعبیه شده است که راه اندازی آن در حالت "اصلی" بدون درد است و کتابخانه بلوتوث پایتون مانند یک جذابیت عمل می کند. همچنین برخی پروژه های جالب تر مانند کنترل ماشین با استفاده از الکسا اکو امکان پذیر است:)

امیدوارم از پروژه لذت برده باشید و لطفا نظرات خود را در زیر بنویسید!

توصیه شده: