Dự án xe điều khiển từ xa qua Internet với iNut Cảm biến kết nối với wifi trong nhà hoặc USB Wifi 3G

Mô tả dự án: 

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ì

 

Tải một số app

Bạn cần 02 app:

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è! 

Cài đặt mạng iNut Cảm biến

Các bạn có thể lắp mạch rồi cài đặt cũng được hoặc dùng dây micro usb nối vào máy tính hoặc cục sạc 5V usb nhé.

Cài đặt cho mạng (iNut_<con số>) (Password: inut12345)

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 devil).

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.

lên
11 thành viên đã đánh giá bài viết này hữu ích.
Các dự án được truyền cảm hứng

Select any filter and click on Apply to see results

Các bài viết cùng tác giả

Arduino Leonardo là gì ?

Chúng ta đã quá quen thuộc với các board mạch Arduino "truyền thống" như Arduino Uno R3, Nano hay phiên bản tối giản là Arduino Pro Mini. Nếu là một người tinh ý, các bạn sẽ dễ dàng nhận thấy board Arduino Leonardo có kích thước giốn với Arduino, pinout cũng tương tự luôn. Thật vậy, với một người yêu thích Arduino, bạn sẽ có một thắc mắc: Tại sao người ta lại làm ra mạch Arduino Leonardo, trong khi nó "khá giống" với Arduino Uno R3, chứ không muốn nói là giống "hệt", liệu nhà phát triển Arduino quá "rãnh"? Vâng, qua bài viết này, bạn sẽ hiểu được vì sao Arduino Leonardo lại ra đời, khi nào nên dùng nó, khi nào không và các thông số kĩ thuật cơ bản.

lên
10 thành viên đã đánh giá bài viết này hữu ích.