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ả

Bài 10: Đếm số lần nhấn một button - ButtonStateChange

Nếu bạn đã đọc qua Bài 3: Xác định trạng thái của một nút nhấn (button) thì chắc hẳn bạn đã biết cách sử dụng một button. Nhưng đôi khi bạn muốn button của bạn đặc biệt hơn một tí, chẳng hạn như là nhấn vài ba lần thì mới thực hiện chức năng của nó. Để làm được điều này, bạn cần biết được lúc nào button được nhấn và lúc nào button được thả ra, và đếm số lần. Hôm nay, tôi sẽ hướng dẫn bạn giải quyết vấn đề này.

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

"Độ hoàn toàn" một cổng Terminal RS-232 mà không sử dụng jack 3.5mm

Ở Việt Nam, việc một bạn học sinh mua một mạch Intel Galileo khá là khó. Trong đó, khó nhất là tiền để mua một mạch Intel Galileo, tuy nhiên, khi mua được mạch về, việc bạn có sử dụng hết chức năng của Intel Galileo hay không là một việc khác. Cái hay nhất, theo tớ nghĩ trên Intel Galileo, mà Arduino không có và bạn khó tiếp cận nhất đó là hệ điều hành Linux. Thực sự thì có nhiều cách để vào Linux của Intel Galileo. Tuy nhiên, nếu bạn muốn cài một hệ điều hành xịn như Debian để biến Intel Galileo trở thành một "máy tính" siêu "xịn" thì bạn buộc phải dùng tới cổng RS - 232. Nếu ở các trung tâm công nghệ lớn thì bạn có thể dễ dàng tìm mua các cổng "RS-232 to DB9" để dễ dàng làm theo các bài hướng dẫn trước. Tuy nhiên, không phải ai cũng may mắn như vậy, trong bài viết này, chúng ta sẽ tiếp cận với một cách khác mà tớ đã sử dụng để giải quyết bài toán không có cáp "RS-232 to DB9".

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