สารบัญ:

การควบคุมระยะไกลที่แฮ็กได้สำหรับ ZenWheels Microcar: 7 ขั้นตอน
การควบคุมระยะไกลที่แฮ็กได้สำหรับ ZenWheels Microcar: 7 ขั้นตอน

วีดีโอ: การควบคุมระยะไกลที่แฮ็กได้สำหรับ ZenWheels Microcar: 7 ขั้นตอน

วีดีโอ: การควบคุมระยะไกลที่แฮ็กได้สำหรับ ZenWheels Microcar: 7 ขั้นตอน
วีดีโอ: An Arduino RC Car That's Also A Phone - ESP32 WiPhone 2024, พฤศจิกายน
Anonim
Image
Image
การประกอบ
การประกอบ

ในบทช่วยสอนนี้ เราจะสร้างรีโมตคอนโทรลแบบกำหนดเองสำหรับไมโครคาร์ ZenWheels ไมโครคาร์ ZenWheels เป็นรถของเล่นขนาด 5 ซม. ที่ควบคุมผ่านแอปพลิเคชัน Android หรือ Iphone ฉันจะแสดงวิธีวิศวกรรมย้อนกลับแอปพลิเคชัน Android เพื่อค้นหาโปรโตคอลการสื่อสารและวิธีสร้างรีโมทคอนโทรลโดยใช้ Arduino และไจโรสโคป

ขั้นตอนที่ 1: ส่วนประกอบและเครื่องมือ

อะไหล่:

1. ไมโครคาร์ ZenWheels

2. Arduino pro mini 328p

3. เขียงหั่นขนม

4. MPU6050 ไจโรสโคป

5. แหล่งพลังงาน <=5 v (แบตเตอรี่บางก้อนที่เราต่อเข้ากับเขียงหั่นขนมได้)

6. สายจัมเปอร์รูปตัวยู (อุปกรณ์เสริม) ฉันเคยใช้สายจัมเปอร์เหล่านี้เพราะมันดูดีกว่าบนเขียงหั่นขนม ใช้สายจัมเปอร์ธรรมดาแทนได้

7. โมดูลบลูทูธ HC-05 (มีปุ่มสำหรับเข้าสู่โหมด AT)

เครื่องมือ:

1. USB เข้ากับอะแดปเตอร์ FTDI อนุกรม FT232RL เพื่อตั้งโปรแกรม Arduino pro mini

2. Arduino IDE

3. โทรศัพท์ Android

4. Android Studio [ไม่บังคับ]

ขั้นตอนที่ 2: วิศวกรรมย้อนกลับแอปพลิเคชัน ZenWheels Android [ตัวเลือก]

จำเป็นต้องมีความรู้เกี่ยวกับ Java และ Android เพื่อทำความเข้าใจส่วนนี้

เป้าหมายของโครงการคือการควบคุมไมโครคาร์โดยใช้ไจโรสโคป สำหรับสิ่งนี้ เราต้องหาข้อมูลเพิ่มเติมเกี่ยวกับการสื่อสารบลูทูธระหว่างของเล่นนี้กับแอพ Android

ในขั้นตอนนี้ ฉันจะอธิบายวิธีวิศวกรรมย้อนกลับโปรโตคอลการสื่อสารระหว่างไมโครคาร์และแอป Android หากคุณต้องการสร้างรีโมตขั้นตอนนี้ก็ไม่จำเป็น วิธีหนึ่งในการค้นพบโปรโตคอลคือการดูซอร์สโค้ด อืม แต่นี่ไม่ใช่เรื่องตรงไปตรงมา แอปพลิเคชัน Android ได้รับการคอมไพล์แล้ว และสามารถติดตั้ง apk ผ่าน Google Play ได้

ดังนั้นฉันจึงได้จัดทำคู่มือพื้นฐานสำหรับการทำสิ่งนี้:

1. ดาวน์โหลด APK Android Package Kit (APK เรียกสั้นๆ ว่า) เป็นรูปแบบไฟล์แพ็คเกจที่ใช้โดยระบบปฏิบัติการ Android สำหรับการแจกจ่ายและติดตั้งแอพมือถือ

ขั้นแรกให้ค้นหาแอปพลิเคชันบน google play store ในกรณีของเราค้นหา "zenwheels" และคุณจะได้รับลิงก์แอปพลิเคชัน

จากนั้นค้นหา " online apk downloader " ใน google และใช้อันหนึ่งเพื่อดาวน์โหลด apk โดยปกติพวกเขาจะขอลิงค์แอปพลิเคชัน (อันที่เราได้รับมาก่อนหน้านี้) จากนั้นเราจะกดปุ่มดาวน์โหลดและบันทึกไว้ในคอมพิวเตอร์ของเรา

2. ถอดรหัส APK ตัวถอดรหัสในสถานการณ์ของเราเป็นเครื่องมือที่ใช้ APK และสร้างซอร์สโค้ด Java

ทางออกที่ง่ายที่สุดคือการใช้ตัวถอดรหัสออนไลน์เพื่อทำงาน ฉันค้นหา " ตัวถอดรหัสออนไลน์ " ใน Google แล้ว และฉันได้เลือก https://www.javadecompilers.com/ คุณเพียงแค่ต้องอัปโหลด APK ที่คุณได้รับก่อนหน้านี้และ

กดถอดรหัส จากนั้นคุณเพียงแค่ดาวน์โหลดแหล่งที่มา

3. ลองย้อนวิศวกรดูโค้ด

ในการเปิดโครงการ คุณต้องมีโปรแกรมแก้ไขข้อความหรือดีกว่า IDE (สภาพแวดล้อมการพัฒนาแบบรวม) IDE เริ่มต้นสำหรับโปรเจ็กต์ Android คือ Android Studio (https://developer.android.com/studio) หลังจากที่คุณติดตั้ง Android Studio แล้ว ให้เปิดโฟลเดอร์โครงการ

เนื่องจากรถของเราควบคุมโดยบลูทูธ ฉันจึงเริ่มค้นหาในโค้ดที่ถอดรหัสแล้วด้วยคีย์เวิร์ด "บลูทูธ" จากเหตุการณ์ที่ฉันพบว่า "BluetoothSerialService" อยู่ในการติดต่อสื่อสาร ถ้าคลาสนี้จัดการการสื่อสาร ก็ต้องมีเมธอดคำสั่ง send ปรากฎว่ามีวิธีเขียนหนึ่งวิธีที่จะส่งข้อมูลผ่านช่องสัญญาณบลูทูธ:

โมฆะสาธารณะเขียน (ไบต์ ออก)

นี่เป็นการเริ่มต้นที่ดี ฉันได้ค้นหา.write (เมธอดที่ใช้อยู่และมีคลาส "ZenWheelsMicrocar" ที่ขยาย "BluetoothSerialService" ของเรา คลาสนี้ประกอบด้วยตรรกะส่วนใหญ่ของการสื่อสารของเราผ่านบลูทูธ ส่วนอื่น ๆ ของ ตรรกะอยู่ในตัวควบคุม: BaseController และ StandardController

ใน BaseController เรามีการเริ่มต้นบริการและคำจำกัดความของช่องบังคับเลี้ยวและเค้น ในความเป็นจริงแล้วช่องสัญญาณเป็นคำนำหน้าคำสั่งเพื่อระบุว่าคำสั่งบางประเภทจะเป็นไปตาม:

ป้องกัน ZenWheelsMicrocar microcar = ZenWheelsMicrocar ใหม่ (นี้ this.btHandler);

ป้องกัน ChannelOutput เอาต์พุต = {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) {

บูลีนลบ = เท็จ; ถ้า (ค่า < 0) { ลบ = f6D; } int value2 = ค่า & 63; ถ้า (ลบ) { return value2 | 64; } คืนค่า value2; }

มีวิธีการที่คล้ายกันใน StandardController ที่เรียกว่า

โมฆะจัดการคันเร่ง (TouchEvent touchEvent)

ขั้นตอนที่ 3: ส่วนประกอบ

อะไหล่:

1. Arduino pro mini 328p 2 $

2. เขียงหั่นขนม

3. MPU6050 ไจโรสโคป 1.2$

4. โมดูล HC-05 master-slave 6 พิน 3$

5. ก้อนแบตเตอรี่ AA x 4 ก้อนพร้อมแบตเตอรี่ 4 ก้อน

6. สายจัมเปอร์รูปตัวยู (อุปกรณ์เสริม) ฉันเคยใช้สายจัมเปอร์เหล่านี้เพราะมันดูดีกว่าบนเขียงหั่นขนม และไฟ LED จะมองเห็นได้ชัดเจนขึ้นด้วยวิธีนี้ หากคุณไม่มีสายเคเบิลเหล่านี้ คุณสามารถแทนที่ด้วยสายดูปองท์

ราคาข้างต้นนำมาจากอีเบย์

เครื่องมือ:

1. USB เข้ากับอะแดปเตอร์ FTDI อนุกรม FT232RL เพื่อตั้งโปรแกรม arduino pro mini

2. Arduino IDE

3. Android Studio (เป็นทางเลือกหากคุณต้องการทำวิศวกรรมย้อนกลับด้วยตัวเอง)

ขั้นตอนที่ 4: การประกอบ

การประกอบ
การประกอบ

การประกอบนั้นง่ายมากเพราะเราทำบนเขียงหั่นขนม:)

- ก่อนอื่นเราวางส่วนประกอบของเราไว้บนเขียงหั่นขนม: ไมโครคอนโทรลเลอร์ โมดูลบลูทูธ และไจโรสโคป

- เชื่อมต่อหมุด Bluetooth RX และ TX ของ HC-05 กับหมุด Arduino 10 และ 11 ไจโรสโคป SDA และ SCL ควรเชื่อมต่อกับหมุด Arduino A4 และ A5

- ต่อปลั๊กไฟเข้ากับบลูทูธ ไจโร และ Arduino หมุดควรเชื่อมต่อกับ + และ - ที่ด้านข้างของเขียงหั่นขนม

- ครั้งสุดท้ายที่เชื่อมต่อแหล่งจ่ายไฟ (ระหว่าง 3.3V ถึง 5V) กับเขียงหั่นขนม ฉันใช้แบตเตอรี่เซลล์ 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:

- เปิดใช้งานบลูทูธบนโทรศัพท์ของคุณ

- เปิดรถและไปที่ส่วนบลูทูธของการตั้งค่าของคุณใน 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 และโมดูลควรยืนยันด้วย "ตกลง"

พิมพ์ "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 ไบต์ commandSpeed = 130;

การเริ่มต้นบูล = เท็จ; // ตั้งค่าจริงหาก DMP init สำเร็จ

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] เวกเตอร์แรงโน้มถ่วง float ypr[3]; // [yaw, pitch, roll] yaw/pitch/roll container และเวกเตอร์แรงโน้มถ่วง bool mpuInterrupt = false; // ระบุว่าพินขัดจังหวะ MPU สูงหรือไม่

LastPrintTime แบบยาวที่ไม่ได้ลงชื่อ, lastMoveTime = 0;

ซอฟต์แวร์Serial BTserial(10, 11);

MPU6050 เอ็มพียู;

การตั้งค่าเป็นโมฆะ ()

{ Serial.begin(9600); BTserial.begin(38400); Serial.println("เริ่มโปรแกรม"); การเริ่มต้น = initializeGyroscope(); }

วงเป็นโมฆะ () {

if (!initialization) { return; } mpuInterrupt = เท็จ; mpuIntStatus = mpu.getIntStatus (); fifoCount = mpu.getFIFOCount(); ถ้า (hasFifoOverflown (mpuIntStatus, fifoCount)) { mpu.resetFIFO (); กลับ; } if (mpuIntStatus & 0x02) { ในขณะที่ (fifoCount < packetSize) { fifoCount = mpu.getFIFOCount (); } mpu.getFIFOBytes (fifoBuffer, packetSize); fifoCount -= ขนาดแพ็คเก็ต; 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 คือเดินหน้าสูงสุด */ โมฆะ moveZwheelsCar (มุมไบต์ ความเร็ว int) { if (มิลลิวินาที () - lastMoveTime = 90) { resultAngle = แผนที่ (มุม 91, 180, 1, 60); } อื่น ๆ ถ้า (มุม 0) { ผลความเร็ว = แผนที่ (ความเร็ว 0, 90, 0, 60); } อื่น ๆ ถ้า (ความเร็ว < 0) { ผลความเร็ว = แผนที่ (ความเร็ว 0, -90, 120, 60); } Serial.print("actualAngle=");Serial.print(angle);Serial.print("; "); Serial.print("actualSpeed=");Serial.print(resultSpeed);Serial.println("; "); Serial.print("actualSpeed=");Serial.print(resultSpeed);Serial.println("; "); อนุกรม. BTserial.write (commandStering); BTserial.write(มุมผลลัพธ์); BTserial.write (ความเร็วคำสั่ง); BTserial.write((ไบต์) resultSpeed); lastMoveTime = มิลลิวินาที (); }

โมฆะคัดท้าย (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 = แผนที่ (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)

{ ถ้า (มิลลิวินาที () - lastPrintTime < 1000) { กลับ; } Serial.print("z=");Serial.print(x);Serial.print("; "); Serial.print("y=");Serial.print(y);Serial.print("; "); อนุกรม.print("y=");Serial.print(y);Serial.print("; "); Serial.print("z=");Serial.print(z);Serial.print("; "); อนุกรม.print("z=");Serial.print(z);Serial.print("; "); Serial.print("angle=");Serial.print(angle);Serial.print("; "); Serial.print("angle=");Serial.print(มุม);อนุกรม.print("; "); Serial.print("speed=");Serial.print(ความเร็ว);Serial.println("; "); lastPrintTime = มิลลิวินาที (); }

บูล initializeGyroscope()

{ Wire.begin(); mpu.initialize(); Serial.println(mpu.testConnection() ? F("การเชื่อมต่อ MPU6050 สำเร็จ"): F("การเชื่อมต่อ MPU6050 ล้มเหลว")); devStatus = mpu.dmp เริ่มต้น (); mpu.setXGyroOffset(220); mpu.setYGyroOffset(76); mpu.setZGyroOffset(-85); mpu.setZAccelOffset(1788); ถ้า (devStatus != 0) { Serial.print (F ("DMP Initialization ล้มเหลว (รหัส ")); Serial.println (devStatus); return false; } mpu.setDMPEnabled (จริง); Serial.println (F ("เปิดใช้งาน การตรวจจับการขัดจังหวะ (Arduino อินเตอร์รัปต์ภายนอก 0)…")); attachInterrupt(0, dmpDataReady, RISING); mpuIntStatus = mpu.getIntStatus(); Serial.println(F("DMP ready! Waiting for first interrupt…")); packetSize = mpu.dmpGetFIFOPacketSize(); คืนค่าจริง; }

เป็นโมฆะ dmpDataReady()

{ mpuInterrupt = จริง; }

hasFifoOverflown บูลีน (int mpuIntStatus, int fifoCount)

{ ส่งคืน mpuIntStatus & 0x10 || fifoCount == 1024; }

อัปโหลดรหัสโดยใช้อะแดปเตอร์ FTDI ไปยัง Arduino จากนั้นเชื่อมต่อแบตเตอรี่

การใช้รีโมท:

หลังจากที่เปิดเครื่อง Arduino แล้ว ให้เปิดเครื่องด้วย โมดูล HC-05 ควรเชื่อมต่อกับรถ เมื่อถึงตอนนั้น รถจะส่งเสียง หากไม่ได้ผล โปรดตรวจสอบขั้นตอนก่อนหน้าและส่วนการแก้ไขปัญหา

หากคุณเอียงเขียงหั่นขนมไปข้างหน้า รถควรเคลื่อนไปข้างหน้า ทางขวา และรถควรไปทางขวา นอกจากนี้ยังทำการเคลื่อนไหวที่ค่อยเป็นค่อยไปมากขึ้น เช่น การเอียงไปข้างหน้าเล็กน้อยและเหลือเพียงเล็กน้อย ในกรณีนี้ รถจะเคลื่อนไปทางซ้ายอย่างช้าๆ

หากรถไปในทางที่ต่างออกไปเมื่อเอียงเขียงหั่นขนมก่อนอื่นให้ถือเขียงหั่นขนมไปในทิศทางที่ต่างกัน

มันทำงานอย่างไร:

ภาพสเก็ตช์ได้รับพิกัดไจโรสโคปทุกๆ 100 มิลลิวินาที ทำการคำนวณแล้วส่งคำสั่งของรถผ่านบลูทูธ ขั้นแรกมีวิธี "คัดท้าย" ที่ได้รับการเรียกด้วยมุม x, y และ z แบบดิบ วิธีนี้จะแปลงการบังคับเลี้ยวระหว่าง 0 ถึง 180 องศาและความเร่งระหว่าง -90 ถึง 90 วิธีการนี้เรียกว่า

โมฆะ moveZwheelsCar (มุมไบต์ ความเร็ว int) ที่แปลงการบังคับเลี้ยวและการเร่งความเร็วเป็นข้อกำหนดของ ZenWheels แล้วส่งคำสั่งโดยใช้บลูทูธ

เหตุผลที่ฉันทำการเปลี่ยนแปลงในสองขั้นตอนคือ การนำกลับมาใช้ใหม่ได้ ถ้าฉันต้องปรับร่างนี้เพื่อควบคุมอุปกรณ์อื่นจากระยะไกล ฉันจะเริ่มจากวิธีการพื้นฐาน "คัดท้าย" ซึ่งจับคู่ความเร็วและการบังคับเลี้ยวกับค่าที่มีประโยชน์บางอย่างอยู่แล้ว

ขั้นตอนที่ 7: ทางเลือก

ทางเลือกแทน "วิศวกรรมย้อนกลับ" ฉันได้พูดถึงวิธีการย้อนกลับของโปรเจ็กต์โดยเริ่มจากแอปพลิเคชัน Android แต่มีทางเลือกอื่นที่คุณสามารถตั้งค่าซีเรียล FTDI + bluetooth slave (ปกติ HC-05 โดยไม่ต้องระบุการตั้งค่าหลัก) จากนั้นจากแอป ZenWheels ให้เชื่อมต่อกับ HC-05 แทน "microcar"

ในการถอดรหัสคำสั่ง คุณจะต้องถือพวงมาลัยในบางตำแหน่ง จากนั้นใช้สคริปต์หลามวิเคราะห์การสื่อสารแบบอนุกรม ฉันกำลังแนะนำสคริปต์หลามเนื่องจากมีอักขระที่ไม่สามารถพิมพ์ได้และ Arduino IDE ไม่เหมาะสำหรับสิ่งนั้น คุณจะสังเกตเห็นว่าหากคุณถือล้อในตำแหน่งเดียว แอปจะส่งสองไบต์เดียวกันเป็นประจำ หากคุณเปลี่ยนตำแหน่งล้อ ไบต์แรกจะยังคงเหมือนเดิม ไบต์ที่สองจะเปลี่ยน หลังจากการทดลองหลายครั้ง คุณสามารถสร้างอัลกอริธึมการบังคับเลี้ยว จากนั้นทำเค้นวิศวกรรมย้อนกลับ เป็นต้น

อีกทางเลือกหนึ่งสำหรับรีโมตที่ใช้ Arduino จะเป็นรีโมต RaspberryPi raspberry pi มีโมดูลบลูทู ธ แบบฝังที่ไม่เจ็บปวดในการตั้งค่าในโหมด "มาสเตอร์" และไลบรารีบลูทู ธ python ทำงานได้อย่างมีเสน่ห์ นอกจากนี้ยังมีโครงการที่น่าสนใจอื่น ๆ เช่นการควบคุมรถโดยใช้ Alexa echo:)

ฉันหวังว่าคุณจะสนุกกับโครงการและโปรดแสดงความคิดเห็นด้านล่าง!

แนะนำ: