Mục lục:
- Bước 1: Thành phần & Công cụ
- Bước 2: Thiết kế ngược ứng dụng ZenWheels Android [tùy chọn]
- Bước 3: Các thành phần
- Bước 4: Lắp ráp
- Bước 5: Ghép nối Bluetooth HC-05 với Microcar
- Bước 6: Mã & Cách sử dụng
- Bước 7: Lựa chọn thay thế
Video: Điều khiển từ xa có thể hack cho ZenWheels Microcar: 7 bước
2024 Tác giả: John Day | [email protected]. Sửa đổi lần cuối: 2024-01-30 13:32
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
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
Đố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:
Menu điều khiển tốc độ bước được điều khiển cho Arduino: 6 bước
Menu điều khiển tốc độ bước điều khiển cho Arduino: Thư viện SpeedStepper này là bản viết lại của thư viện AccelStepper để cho phép điều khiển tốc độ của động cơ bước. Thư viện SpeedStepper cho phép bạn thay đổi tốc độ động cơ đã đặt và sau đó tăng / giảm tốc đến tốc độ cài đặt mới bằng cách sử dụng cùng một thuật ngữ
Ô tô được điều khiển từ xa - Được điều khiển bằng Bộ điều khiển Xbox 360 không dây: 5 bước
Ô tô được điều khiển từ xa - Được điều khiển bằng Bộ điều khiển Xbox 360 không dây: Đây là các hướng dẫn để tạo ô tô được điều khiển từ xa của riêng bạn, được điều khiển bằng bộ điều khiển Xbox 360 không dây
ESP8266 RGB LED STRIP Điều khiển WIFI - NODEMCU làm điều khiển từ xa hồng ngoại cho dải đèn Led được điều khiển qua Wi-Fi - Điều khiển điện thoại thông minh RGB LED STRIP: 4 bước
ESP8266 RGB LED STRIP Điều khiển WIFI | NODEMCU làm điều khiển từ xa hồng ngoại cho dải đèn Led được điều khiển qua Wi-Fi | Điều khiển bằng điện thoại thông minh RGB LED STRIP: Xin chào các bạn trong hướng dẫn này, chúng ta sẽ học cách sử dụng gật đầu hoặc esp8266 làm điều khiển từ xa IR để điều khiển dải LED RGB và Nodemcu sẽ được điều khiển bằng điện thoại thông minh qua wifi. Vì vậy, về cơ bản bạn có thể điều khiển DÂY CHUYỀN LED RGB bằng điện thoại thông minh của mình
Tự làm bộ điều khiển bay điều khiển đa hệ điều khiển Arduino: 7 bước (có hình ảnh)
Tự làm bộ điều khiển máy bay đa năng điều khiển Arduino: Dự án này là tạo ra một bảng logic máy bay không người lái đa năng linh hoạt nhưng tùy chỉnh dựa trên Arduino và Multiwii
Điều khiển các thiết bị điện của bạn bằng Điều khiển từ xa Tv (Điều khiển từ xa) với Màn hình nhiệt độ và độ ẩm: 9 bước
Điều khiển thiết bị điện của bạn bằng Điều khiển từ xa Tv (Điều khiển từ xa) Có Hiển thị nhiệt độ và độ ẩm: xin chào, tôi là Abhay và đây là blog đầu tiên của tôi về Các thiết bị điện và hôm nay tôi sẽ hướng dẫn bạn cách điều khiển các thiết bị điện bằng điều khiển từ xa bằng cách xây dựng cái này dự án đơn giản. cảm ơn atl lab đã hỗ trợ và cung cấp tài liệu