ksp gửi vào
- 36670 lượt xem
Với mong muốn các bạn có thể sáng tạo ra con xe vòng quanh khắp thế giới 5 châu, mình làm ra cái app này để giúp các bạn thực hiện được điều đó. P.s bạn nào muốn gắn camera thì lấy một con android phát wifi bằng 3G rồi video call từ điện thoại đó qua máy tính. Rồi cầm trên tay con app này và control xe nè :D (ý tưởng từ một bạn trong cộng đồng Arduino Việt Nam)
Bạn sẽ làm được gì trong ngày hôm nay?
Đó là một con xe thực sự điều khiển qua Internet chứ không đơn thuần là một chiếc xe điều khiển qua Bluetooth bạn nhé.
Bạn cần chuẩn bị gì
- Arduino UNO
- Module L298
- Dây breadboard (đực - đực và cái cái)
- Bộ khung xe rùa (hoặc 2 động cơ và một bánh đa hướng gắn vào một tấm phản)
- Và không thể thiếu iNut Cảm biến
Tải một số app
Bạn cần 02 app:
- iNut - để cài đặt iNut Cảm biến
- iNut Robot Controller để điều khiển xe (chỉ support Android)
Lắp mạch cho xe nè ahihi
Bạn có thể thay thế nguồn 9V bằng nguồn pin lipo 2 cell hoặc 3 cell (hoặc li-ion 2 hoặc 3 viên). Bạn cũng có thể sử dụng nguồn từ 7 - 15V để thay thế. Ví dụ như 8 cục pin tiểu mắc nối tiếp cũng có thể chạy được nè!
Nạp code Arduino
#include <Wire.h> #define N_SENSOR 1 float sensors[N_SENSOR]; //l298 - module điều khiển động cơ #define ENA 7 #define IN1 6 #define IN2 5 #define IN3 4 #define IN4 3 #define ENB 2 //Định nghĩa các hướng di chuyển #define UP 1 #define RIGHT 2 #define DOWN 3 #define LEFT 4 //Biến lưu trữ hướng đi của Robot hiện tại int direction; //Cài đặt chương trình void setup() { Serial.begin(9600); Wire.begin(10); //Đăng ký lệnh lắng nghe lệnh từ iNut - Cảm biến. iNut Cảm biến => Arduino Wire.onReceive(receiveEvent); //Đăng ký lệnh khi iNut - Cảm biến yêu cầu gửi dữ liệu lại cho nó. Arduino => iNut Cảm biến Wire.onRequest(i2cRequestEvent); //Cài đặt các chân điều khiển motor là OUTPUT pinMode(ENA, OUTPUT); pinMode(IN1, OUTPUT); pinMode(IN2, OUTPUT); pinMode(IN3, OUTPUT); pinMode(IN4, OUTPUT); pinMode(ENB, OUTPUT); //điều khiển các chân Enable A, Enable B để cho phép module điều khiển động cơ hoạt động digitalWrite(ENA, HIGH); digitalWrite(ENB, HIGH); //Gọi hàm stop để dừng chương trình stop(); } //Các biến lưu trữ lệnh khi nhận được lệnh từ iNut - Cảm biến volatile char buffer[33]; volatile boolean receiveFlag = false; //Khi nhận được lệnh từ iNut cảm biến thì lắng nghe void receiveEvent(int howMany) { Wire.readBytes((byte *)buffer, howMany); buffer[howMany] = 0; receiveFlag = true; } void i2cRequestEvent() { //Buộc phải có nếu bạn muốn gửi dữ liệu char *data = (byte*)&sensors; Wire.write(data, sizeof(sensors)); Serial.println(F("gui den inut - cam bien")); } void loop() { //rain sensor sensors[0] = direction; if (receiveFlag) { //khi có tín hiệu là đã nhận được lệnh String command = buffer; //chép lệnh vào biến String cho dễ xử lý Serial.print(command);// in ra lệnh Serial.print(' '); Serial.println(millis());//in ra thời gian theo millis tính từ lúc arduino chạy để debug if (command == "UP") { up(); } else if (command == "DOWN") { down(); } else if (command == "TURN_LEFT") { left(); } else if (command == "TURN_RIGHT") { right(); } else if (command == "STOP") { stop(); } receiveFlag = false; //đánh dấu đã xử lý xong lệnh, không cần đọc nữa } //Cho xe chạy 500ms thôi để lỡ có chạm mạch thì còn xử lý được :)) static unsigned long timer = 0; if (millis() - timer > 1500UL) { stop(); timer = millis(); } } void up() { digitalWrite(IN1,HIGH); digitalWrite(IN2,LOW); digitalWrite(IN3,HIGH); digitalWrite(IN4,LOW); direction = UP; Serial.println(F("Xe chay toi")); } void down() { digitalWrite(IN1,LOW); digitalWrite(IN2,HIGH); digitalWrite(IN3,LOW); digitalWrite(IN4,HIGH); direction = DOWN; Serial.println(F("Xe chay lui")); } void left() { digitalWrite(IN1,HIGH); digitalWrite(IN2,LOW); digitalWrite(IN3,LOW); digitalWrite(IN4,HIGH); direction = LEFT; Serial.println(F("Xe re trai")); } void right() { digitalWrite(IN1,LOW); digitalWrite(IN2,HIGH); digitalWrite(IN3,HIGH); digitalWrite(IN4,LOW); direction = RIGHT; Serial.println(F("Xe re phai")); } void stop() { digitalWrite(IN1,LOW); digitalWrite(IN2,LOW); digitalWrite(IN3,LOW); digitalWrite(IN4,LOW); direction = 0; Serial.println(F("Xe dung lai!")); }
Các bạn nạp code sau đây vào nhé! Trong đó mình có giải thích các đoạn code và ý nghĩa của nó. Nôm na là như sau:
- Khi app gửi lệnh UP thì gọi hàm up(); => tức là đi tới.
- Khi app gửi lệnh DOWN thì gọi hàm down(); => tức là đi tới.
- Khi app gửi lệnh TURN_LEFT thì gọi hàm left(); => tức là rẻ trái.
- Khi app gửi lệnh TURN_RIGHT thì gọi hàm right(); => tức là rẻ phải.
- Khi app gửi lệnh STOP thì gọi hàm stop(); => tức là đứng lại.
- Và cứ khi nhận lệnh là 500ms giây sau gọi làm đứng lại để lỡ xe chạy nhanh quá nó tự dừng (như video của mình ).
Lấy app điều khiển thôi nào!
Để điều khiển được xe của mình, các bạn phải cài iNut vào mạng wifi nhà mình như hướng dẫn ở trên. Các bạn có thể phát wifi bằng một điện thoại khác rồi cho inut kết nối vào đó, từ đó có thể điều khiển từ xa khắp mọi miền tổ quốc qua 3G đó nhé. Có thể dùng facebook để chat video với người xung quanh nữa nhé. Hoặc dùng facetime luôn cho nó khỏe!
P/s: các bạn nào muốn đổi sang mạng wifi khác thì nhấn nút FLASH trên board iNut Cảm biến trong 10 giây nhé
Trên phần mềm iNut, bạn vào Cài đặt > Chọn tên thiết bị bạn mới cài > Kéo xuống dưới cùng chọn Dành cho lập trình viên, bạn sẽ có một mã QrCode, lấy thiết bị bạn sẽ điều khiển xe quét mã QrCode và thế là chơi thôi. P/s: Nếu bạn quét mã qrcode rồi mà vẫn không được á thì bật tắt app iNut hoặc click vào nút đổi mã thiết bị phía dưới cùng nhé (nhớ kiểm tra kết nối mạng của thiết bị thông minh điều khiển xe nữa nha). Một video nói lên hết bao điều:
App điều khiển có những block gì, tôi có quyền thêm code không?
Được bạn nha, toàn bộ app mình mở hết mà, các bạn có thể tải file aia củ app inventer tại đây nhé.
Chúc các bạn thành công! Hãy đi khám phá cả xóm của mình với độ ngầu của iNut Cảm biến và smartphone kết hợp nhé. Điều mà xe bluetooth KHÔNG THỂ LÀM ĐƯỢC. Chúc các bạn thành công, làm xong thì cho mình xin một ảnh dưới bình luận cho xôm nha hehe.