Mục lục:

Điều khiển từ xa có thể hack cho ZenWheels Microcar: 7 bước
Điều khiển từ xa có thể hack cho ZenWheels Microcar: 7 bước

Video: Điều khiển từ xa có thể hack cho ZenWheels Microcar: 7 bước

Video: Điều khiển từ xa có thể hack cho ZenWheels Microcar: 7 bước
Video: Youtube Premium và câu chuyện trả phí - dùng lậu | VVPodcast #17 2024, Tháng sáu
Anonim
Image
Image
cuộc họp
cuộc họp

Trong hướng dẫn này, chúng tôi sẽ xây dựng một điều khiển từ xa tùy chỉnh cho vi mô ZenWheels. Xe điện vi mô ZenWheels là một chiếc ô tô đồ chơi dài 5 cm có thể điều khiển được thông qua ứng dụng Android hoặc Iphone. Tôi sẽ chỉ cho bạn cách thiết kế ngược ứng dụng Android để tìm hiểu về giao thức truyền thông và cách bạn có thể tạo điều khiển từ xa bằng arduino và con quay hồi chuyển.

Bước 1: Thành phần & Công cụ

Các bộ phận:

1. Xe điện vi mô ZenWheels

2. Arduino pro mini 328p

3. Breadboard

4. Con quay hồi chuyển MPU6050

5. nguồn điện <= 5 v (một số pin mà chúng tôi có thể gắn vào breadboard)

6. Cáp jumper hình chữ U (tùy chọn). Tôi đã sử dụng các loại cáp jumper này vì chúng trông đẹp hơn trên breadboard. Có thể sử dụng cáp jumper thông thường để thay thế

7. Mô-đun bluetooth HC-05 (có nút để vào chế độ AT)

Công cụ:

1. Bộ chuyển đổi USB sang FTDI nối tiếp FT232RL để lập trình Arduino pro mini

2. Arduino IDE

3. Điện thoại Android

4. Android Studio [Tùy chọn]

Bước 2: Thiết kế ngược ứng dụng ZenWheels Android [tùy chọn]

Cần có một số kiến thức về Java và Android để hiểu phần này.

Mục tiêu của dự án là điều khiển xe vi mô bằng con quay hồi chuyển. Đối với điều này, chúng tôi cần tìm hiểu thêm về giao tiếp bluetooth giữa đồ chơi này và ứng dụng Android.

Trong bước này, tôi sẽ giải thích cách thiết kế ngược giao thức giao tiếp giữa microcar và ứng dụng android. Nếu bạn chỉ muốn xây dựng điều khiển từ xa, bước này là không cần thiết. Một cách để khám phá giao thức là xem mã nguồn. Hmm nhưng đây không phải là thẳng tiến, các ứng dụng Android được biên dịch và người ta có thể cài đặt apk thông qua google play.

Vì vậy, tôi đã thực hiện một hướng dẫn cơ bản để làm điều này:

1. Tải xuống APK. Android Package Kit (viết tắt là APK) là định dạng tệp gói được hệ điều hành Android sử dụng để phân phối và cài đặt các ứng dụng dành cho thiết bị di động

Đầu tiên hãy tìm kiếm ứng dụng trên cửa hàng google play, trong trường hợp của chúng tôi là tìm kiếm "zenwheels" và bạn sẽ nhận được liên kết ứng dụng

Sau đó, tìm kiếm trên google cho "trình tải xuống apk trực tuyến" và sử dụng một để tải xuống apk. Thông thường họ sẽ yêu cầu liên kết ứng dụng (liên kết mà chúng tôi đã lấy trước đó), sau đó chúng tôi sẽ nhấn nút tải xuống và lưu nó vào máy tính của mình.

2. Giải mã APK. Trong tình huống của chúng ta, một trình dịch ngược là một công cụ lấy APK và tạo ra mã nguồn Java.

Giải pháp đơn giản nhất là sử dụng trình dịch ngược trực tuyến để thực hiện công việc. Tôi đã tìm kiếm "trình dịch ngược trực tuyến" trên google và tôi đã chọn https://www.javadecompilers.com/. Bạn chỉ cần tải lên APK mà bạn đã nhận được trước đó và

nhấn dịch ngược. Sau đó, bạn chỉ cần tải xuống các nguồn.

3. Cố gắng đảo ngược kỹ thuật xem qua mã

Để mở dự án, bạn cần một trình soạn thảo văn bản hoặc tốt hơn là IDE (môi trường phát triển tích hợp). IDE mặc định cho Android Projects là Android Studio (https://developer.android.com/studio). Sau khi bạn đã cài đặt Android Studio, hãy mở thư mục dự án.

Vì ô tô của chúng tôi được điều khiển bằng bluetooth nên tôi đã bắt đầu tìm kiếm bằng mã dịch ngược với từ khóa "bluetooth", từ những lần xuất hiện, tôi đã tìm thấy "BluetoothSerialService" đang xử lý giao tiếp. Nếu lớp này xử lý giao tiếp thì nó phải có một phương thức lệnh gửi. Hóa ra có một phương pháp ghi gửi dữ liệu qua kênh bluetooth:

public void ghi (byte out)

Đây là một khởi đầu tốt, tôi đã tìm kiếm.write (phương pháp đang được sử dụng và có một lớp "ZenWheelsMicrocar" mở rộng "BluetoothSerialService" của chúng tôi. Lớp này chứa hầu hết logic giao tiếp của chúng tôi qua Bluetooth. Phần khác của logic nằm trong bộ điều khiển: BaseController và StandardController.

Trong BaseController, chúng ta có phần khởi tạo dịch vụ và cũng như định nghĩa về kênh lái và kênh tiết lưu, các kênh trên thực tế là tiền tố lệnh để chỉ định rằng một số loại lệnh sẽ tuân theo:

bảo vệ ZenWheelsMicrocar microcar = new ZenWheelsMicrocar (this, this.btHandler);

được bảo vệ ChannelOutput outputs = {new TrimChannelOutput (ZenWheelsMicrocar. STEERING_CHANNEL), TrimChannelOutput mới (ZenWheelsMicrocar. THROTTLE_CHANNEL)};

Trong StandardController, chỉ đạo được xử lý trong:

public void handleSteering (TouchEvent touchEvent) {

… This.microcar.setChannel (DrivingOutput.channel, DrivingOutput.resolveValue ()); }

Điều chỉnh phương pháp này, DrivingOutput.channel có giá trị 129 (kênh được sử dụng để điều khiển) và DrivingOutput.resolveValue () có thể có giá trị từ -90 đến 90. Giá trị kênh (129) được gửi trực tiếp và giá trị điều khiển được sửa đổi bằng cách áp dụng các phép toán bitwise:

private cuối cùng int value_convert_out (int value) {

boolean negative = false; if (value <0) {negative = f6D; } int value2 = value & 63; if (âm) {return value2 | 64; } trả về giá trị2; }

Có một phương thức tương tự trong StandardController được gọi là

public void handleThrottle (TouchEvent touchEvent)

Bước 3: Các thành phần

Các bộ phận:

1. Arduino pro mini 328p 2 $

2. Breadboard

3. Con quay hồi chuyển MPU6050 1,2 $

4. Mô-đun 6 chân chính HC-05 master-slave 3 $

5. Bộ pin 4 x AA với 4 pin

6. Cáp jumper hình chữ U (tùy chọn). Tôi đã sử dụng các loại cáp jumper này vì chúng trông đẹp hơn trên breadboard và các đèn led có thể nhìn thấy rõ hơn theo cách này. Nếu bạn không có những loại cáp này, bạn có thể thay thế chúng bằng dây dupont.

Giá trên được lấy từ eBay.

Công cụ:

1. Bộ chuyển đổi USB sang FTDI nối tiếp FT232RL để lập trình arduino pro mini

2. Arduino IDE

3. Android Studio (tùy chọn nếu bạn muốn tự thiết kế ngược)

Bước 4: Lắp ráp

cuộc họp
cuộc họp

Việc lắp ráp rất đơn giản vì chúng tôi đang thực hiện trên breadboard:)

- trước tiên, chúng tôi đặt các thành phần của mình trên bảng mạch: bộ vi điều khiển, mô-đun bluetooth và con quay hồi chuyển

- kết nối các chân HC-05 bluetooth RX và TX với các chân 10 và 11 của arduino. Con quay hồi chuyển SDA và SCL phải được kết nối với các chân arduino A4 và A5

- kết nối chân nguồn với bluetooth, con quay hồi chuyển và arduino. các chân phải được kết nối với dấu + và - ở mặt bên của breadboard

- kết nối cuối cùng nguồn điện (giữa 3,3V đến 5V) với breadboard, tôi đã sử dụng pin LiPo một cell nhỏ nhưng bất kỳ loại nào cũng được miễn là nó nằm trong phạm vi nguồn

Vui lòng kiểm tra các hình ảnh ở trên để biết thêm chi tiết

Bước 5: Ghép nối Bluetooth HC-05 với Microcar

Ghép nối Bluetooth HC-05 với Microcar
Ghép nối Bluetooth HC-05 với Microcar
Ghép nối Bluetooth HC-05 với Microcar
Ghép nối Bluetooth HC-05 với Microcar
Ghép nối Bluetooth HC-05 với Microcar
Ghép nối Bluetooth HC-05 với Microcar

Đối với điều này, bạn sẽ cần một điện thoại Android, mô-đun bluetooth HC-05 và bộ điều hợp FTDI nối tiếp có dây. Ngoài ra, chúng tôi sẽ sử dụng Arduino IDE để giao tiếp với mô-đun bluetooth.

Đầu tiên chúng ta cần tìm hiểu địa chỉ microcar bluetooth:

- bật bluetooth trên điện thoại của bạn

- bật nguồn ô tô và đi tới phần bluetooth trong cài đặt của bạn trong Android

- tìm kiếm các thiết bị mới và một số thiết bị có tên "Microcar" sẽ xuất hiện

- ghép nối với thiết bị này

- sau đó để trích xuất bluetooth MAC, tôi đã sử dụng ứng dụng này từ google play Thiết bị đầu cuối Bluetooth nối tiếp

Sau khi cài đặt ứng dụng này, hãy truy cập menu -> thiết bị và ở đó bạn sẽ có một danh sách với tất cả các thông số được ghép nối bluetooth. Chúng tôi chỉ quan tâm đến mã bên dưới mỏ "Microcar" là 00: 06: 66: 49: A0: 4B

Tiếp theo, kết nối bộ điều hợp FTDI với mô-đun bluetooth. Đầu tiên các chân VCC và GROUND, sau đó là FTDI RX tới bluetooth TX và FTDI TX tới bluetooth RX. Ngoài ra, phải có một chân trên mô-đun bluetooth sẽ được kết nối với VCC. Làm điều này, mô-đun bluetooth sẽ chuyển sang "chế độ có thể lập trình". Mô-đun của tôi có một nút kết nối VCC với chân đặc biệt đó. Khi bạn cắm FTDI vào USB, nó phải được nhấn nút / ghim được kết nối để truy cập vào chế độ lập trình đặc biệt này. Bluetooth xác nhận việc vào chế độ hoạt động này bằng cách nhấp nháy chậm sau mỗi 2 giây.

Trong Arduino IDE, chọn cổng nối tiếp, sau đó mở màn hình nối tiếp (Cả NL và CR với tốc độ truyền 9600). Gõ AT và mô-đun sẽ xác nhận bằng "OK".

Nhập "AT + ROLE = 1" để đặt mô-đun ở chế độ chính. Để ghép nối với mô-đun bluetooh của bạn, hãy viết: "AT + BIND = 0006, 66, 49A04B", Lưu ý cách "00: 06: 66: 49: A0: 4B" của chúng tôi được chuyển thành "0006, 66, 49A04B". Bạn cũng nên thực hiện chuyển đổi tương tự cho MAC bluetooh của mình.

Bây giờ, hãy bật nguồn xe Zenwheels, sau đó rút FTDI và cắm lại nó mà không cần nhấn nút / kết nối pin đặc biệt. Sau một lúc, nó sẽ kết nối với ô tô và bạn sẽ nhận thấy ô tô phát ra âm thanh thành công kết nối cụ thể.

Xử lý sự cố:

- Tôi thấy rằng từ tất cả các mô-đun Bluetooth mà tôi có, chỉ có một mô-đun có nút hoạt động như một thiết bị chính!

- đảm bảo xe được sạc đầy

- đảm bảo xe không kết nối với điện thoại

- nếu Bluetooth chuyển sang chế độ AT (nhấp nháy chậm) nhưng nó không phản hồi lệnh, hãy đảm bảo rằng bạn có CẢ HAI NL & CR, đồng thời thử nghiệm với các tỷ lệ BAUD khác

- kiểm tra kỹ RX được kết nối với TX và ngược lại

- hãy thử hướng dẫn này

Bước 6: Mã & Cách sử dụng

Trước tiên, bạn cần tải xuống và cài đặt hai thư viện:

1. Thư viện MPU6050 cho con quay hồi chuyển

2. Nguồn thư viện I2CDev

Sau đó tải xuống và cài đặt thư viện của tôi từ đây hoặc sao chép nó từ bên dưới:

/ ** * Các thư viện: * 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 byte commandStering = 129; lệnh const byteSpeed = 130;

khởi tạo bool = false; // đặt true nếu DMP init thành công

uint8_t mpuIntStatus; // giữ byte trạng thái ngắt thực tế từ MPU uint8_t devStatus; // trả về trạng thái sau mỗi hoạt động của thiết bị (0 = thành công,! 0 = lỗi) uint16_t packetSize; // kích thước gói tin DMP dự kiến (mặc định là 42 byte) uint16_t FifoCount; // đếm tất cả các byte hiện có trong FIFO uint8_t FifoBuffer [64]; // Bộ đệm lưu trữ FIFO Quaternion q; // [w, x, y, z] thùng chứa quaternion Trọng lực VectorFloat; // [x, y, z] vector trọng lực float ypr [3]; // [yaw, pitch, roll] thùng chứa yaw / pitch / roll và véc tơ trọng lực dễ bay hơi bool mpuInterrupt = false; // cho biết chân ngắt MPU có tăng cao hay không

unsigned long lastPrintTime, lastMoveTime = 0;

Phần mềm trên không BTserial (10, 11);

MPU6050 mpu;

void setup ()

{Serial.begin (9600); BTserial.begin (38400); Serial.println ("Chương trình đã bắt đầu"); khởi tạo = khởi tạoGyroscope (); }

void loop () {

if (! khởi tạo) {return; } mpuInterrupt = false; mpuIntStatus = mpu.getIntStatus (); FifoCount = mpu.getFIFOCount (); if (hasFifoOverflown (mpuIntStatus, FifoCount)) {mpu.resetFIFO (); trở lại; } if (mpuIntStatus & 0x02) {while (FifoCount <packetSize) {FifoCount = mpu.getFIFOCount (); } mpu.getFIFOBytes (FifoBuffer, packetSize); FifoCount - = packetSize; mpu.dmpGetQuaternion (& q, FifoBuffer); mpu.dmpGetGravity (& trọng lực, & q); mpu.dmpGetYawPitchRoll (năm, & q, & trọng lực); steer (ypr [0] * 180 / M_PI, ypr [1] * 180 / M_PI, ypr [2] * 180 / M_PI); }}

/*

* Nhận góc từ 0 đến 180 trong đó 0 là tối đa bên trái và 180 là tối đa bên phải * Tốc độ nhận từ -90 đến 90 trong đó -90 là tối đa lùi về phía sau và 90 là chuyển tiếp tối đa * / void moveZwheelsCar (byte angle, int speed) {if (millis () - lastMoveTime = 90) {resultAngle = map (angle, 91, 180, 1, 60); } else if (angle 0) {resultSpeed = map (speed, 0, 90, 0, 60); } else if (speed <0) {resultSpeed = map (speed, 0, -90, 120, 60); } Serial.print ("realAngle ="); Serial.print (angle); Serial.print (";"); Serial.print ("realSpeed ="); 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 = ràng buộc (x, -1 * MAX_ANGLE, MAX_ANGLE); y = ràng buộc (y, -1 * MAX_ANGLE, MAX_ANGLE); z = ràng buộc (z, -MAX_ANGLE, MAX_ANGLE); int angle = map (y, -MAX_ANGLE, MAX_ANGLE, 0, 180); int speed = map (z, -MAX_ANGLE, MAX_ANGLE, 90, -90); printDebug (x, y, z, góc, tốc độ); moveZwheelsCar (góc, tốc độ); }

void 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 ("angle ="); Serial.print (angle); Serial.print (";"); Serial.print ("speed ="); Serial.print (speed); Serial.println (";"); lastPrintTime = millis (); }

bool khởi tạoGyroscope ()

{Wire.begin (); mpu.initialize (); Serial.println (mpu.testConnection ()? F ("Kết nối MPU6050 thành công"): F ("Kết nối MPU6050 không thành công")); devStatus = mpu.dmpInitialize (); mpu.setXGyroOffset (220); mpu.setYGyroOffset (76); mpu.setZGyroOffset (-85); mpu.setZAccelOffset (1788); if (devStatus! = 0) {Serial.print (F ("Khởi tạo DMP không thành công (mã")); Serial.println (devStatus); return false;} mpu.setDMPEnabled (true); Serial.println (F ("Đang bật phát hiện ngắt (ngắt ngoài Arduino 0)… ")); attachmentInterrupt (0, dmpDataReady, RISING); mpuIntStatus = mpu.getIntStatus (); Serial.println (F (" DMP đã sẵn sàng! Đang đợi ngắt đầu tiên… ")); packSize = mpu.dmpGetFIFOPacketSize (); trả về true;}

void dmpDataReady ()

{mpuInterrupt = true; }

boolean hasFifoOverflown (int mpuIntStatus, int FifoCount)

{return mpuIntStatus & 0x10 || số lượng năm mươi == 1024; }

Tải mã lên bằng bộ chuyển đổi FTDI vào arduino, sau đó kết nối pin.

Sử dụng điều khiển từ xa:

Sau khi arduino được bật nguồn, đồng thời bật nguồn cho xe. Mô-đun HC-05 nên kết nối với ô tô, khi điều đó xảy ra, ô tô sẽ phát ra âm thanh. Nếu nó không hoạt động, vui lòng kiểm tra bước trước đó và phần khắc phục sự cố.

Nếu bạn nghiêng bảng bánh xe về phía trước, chiếc xe sẽ di chuyển về phía trước, sang phải và xe phải di chuyển sang phải. Nó cũng thực hiện các chuyển động từ từ hơn như nghiêng một chút về phía trước và sang trái một chút trong trường hợp này xe sẽ đi chậm về bên trái.

Nếu xe đi theo một hướng khác khi nghiêng bảng bánh trước tiên hãy giữ bảng bánh theo các hướng khác nhau.

Làm thế nào nó hoạt động:

Bản phác thảo lấy tọa độ con quay hồi chuyển sau mỗi 100 ms, thực hiện các phép tính và sau đó truyền qua bluetooth các lệnh xe hơi. Đầu tiên, có một phương thức "steer" được gọi với các góc x, y và z nguyên. Phương pháp này chuyển hướng lái từ 0 đến 180 độ và gia tốc từ -90 đến 90. Phương thức này gọi

void moveZwheelsCar (byte angle, int speed) chuyển đổi tính năng lái và gia tốc sang các thông số kỹ thuật của ZenWheels và sau đó truyền các lệnh bằng bluetooth.

Lý do tôi đã thực hiện chuyển đổi trong hai bước, là khả năng tái sử dụng. nếu tôi cần điều chỉnh bản phác thảo này để điều khiển từ xa một số thiết bị khác, tôi sẽ bắt đầu từ phương pháp cơ sở "chỉ đạo" đã lập bản đồ tốc độ và lái đến một số giá trị hữu ích.

Bước 7: Lựa chọn thay thế

Một giải pháp thay thế cho "kỹ thuật đảo ngược". Tôi đã nói về cách thiết kế ngược lại dự án bằng cách bắt đầu với ứng dụng Android. Nhưng có một giải pháp thay thế cho điều này, bạn có thể thiết lập một nô lệ bluetooth FTDI + nối tiếp (HC-05 thông thường mà không cần chỉ định cài đặt chính). Sau đó, từ ứng dụng ZenWheels kết nối với HC-05 thay vì "microcar".

Để giải mã các lệnh, bạn sẽ cần giữ vô lăng ở một số vị trí, sau đó sử dụng tập lệnh python phân tích giao tiếp nối tiếp. Tôi đang đề xuất một tập lệnh python vì có các ký tự không thể in được và Arduino IDE không phù hợp với điều đó. Bạn sẽ quan sát thấy rằng nếu bạn giữ bánh xe ở một vị trí, ứng dụng sẽ truyền đều đặn hai byte giống nhau. Nếu bạn thay đổi vị trí bánh xe, byte nắm tay sẽ giữ nguyên, byte thứ hai sẽ thay đổi. Sau nhiều lần thử nghiệm, bạn có thể đưa ra thuật toán lái, sau đó thiết kế ngược bướm ga, v.v.

Một sự thay thế cho điều khiển từ xa dựa trên arduino sẽ là điều khiển từ xa RaspberryPi. Raspberry pi có một mô-đun bluetooth nhúng mà không cần phải thiết lập ở chế độ "chính" và thư viện bluetooth python hoạt động giống như một sự quyến rũ. Ngoài ra một số dự án thú vị khác có thể thực hiện được như điều khiển ô tô bằng Alexa echo:)

Tôi hy vọng bạn thích dự án và vui lòng để lại ý kiến bên dưới!

Đề xuất: