Thêm chức năng phát hiện vật cản và tự dùng cho xe điều khiển từ xa qua Internet

Với sự hoàn thành dự án của các bạn trẻ khắp mọi miền tổ quốc về dự án xe điều khiển từ xa qua iNut Cảm biến và sự yêu cầu thêm chức năng thấy có vật cản là nó dừng, hôm nay, mình sẽ thêm một chút code để các bạn trẻ làm thêm chức năng này,

Ngoài những linh kiện trong bài 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, bạn cần chuẩn bị thêm một mạch siêu âm SRF04 hoặc SRF05.

Các bạn nối cảm biến siêu âm như hình dưới đây nhé:

Và đây là đoạn chương trình

#include <Wire.h>
#define N_SENSOR  1
float sensors[N_SENSOR];


const int trig = 9;     // chân trig của HC-SR04
const int echo = 8;     // chân echo của HC-SR04

#define HOW_FAR_SHOULD_WE_STOP 10 //Khoảng cách từ cảm biến đến vật cản bao nhiêu thì xe tự dừng? - 10cm
 
//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();

  pinMode(trig,OUTPUT);   // chân trig sẽ phát tín hiệu
  pinMode(echo,INPUT);    // chân echo sẽ nhận tín hiệu
 
}
 
 
//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 || distanceToPoint() < HOW_FAR_SHOULD_WE_STOP) {
    stop();
    timer = millis();
  }
}

int distanceToPoint() {
  unsigned long duration; // biến đo thời gian
  int distance;           // biến lưu khoảng cách
  
  /* Phát xung từ chân trig */
  digitalWrite(trig,0);   // tắt chân trig
  delayMicroseconds(2);
  digitalWrite(trig,1);   // phát xung từ chân trig
  delayMicroseconds(5);   // xung có độ dài 5 microSeconds
  digitalWrite(trig,0);   // tắt chân trig
  
  /* Tính toán thời gian */
  // Đo độ rộng xung HIGH ở chân echo. 
  duration = pulseIn(echo,HIGH);  
  // Tính khoảng cách đến vật.
  distance = int(duration/2/29.412);
  
  /* In kết quả ra Serial Monitor */
  Serial.print(distance);
  Serial.println("cm");

  return distance;
}
 
void up() {
  digitalWrite(IN1,LOW);
  digitalWrite(IN2,HIGH);
  digitalWrite(IN3,LOW);
  digitalWrite(IN4,HIGH);
  direction = DOWN;
 
  Serial.println(F("Xe chay toi"));
}
 
void down() {
  digitalWrite(IN1,HIGH);
  digitalWrite(IN2,LOW);
  digitalWrite(IN3,HIGH);
  digitalWrite(IN4,LOW);
  direction = UP;
 
  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!"));
}

Chúc các bạn thành công nhé!

Youtube: 
Thành quả của một bạn trên cộng đồng
Những hình ảnh về dự án: 
Bài viết truyền cảm hứng: 
lên
9 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ả

Xử lý nhiều tiến trình cùng một lúc trên Arduino - Xử lý bát đồng bộ - Có thể hay không?

Một khi viết một chương trình lớn, bạn sẽ phải viết chương trình để thực hiện nhiều chức năng. Và khi viết chương trình với nhiều chức năng bạn sẽ gặp các vấn đề phức tạp như: làm thế nào để chức này hoạt động ổn định với chức năng kia, và khi thêm chức năng mới vào sản phẩm của mình nó sẽ đụng độ như thế nào với các chương trình khác? Qua bài viết này, mình muốn chia sẻ với các bạn một thư viện khá hay của anh Đại Huỳnh (trong đó mình có mod lại một tí laugh) để giải quyết các vấn đề nêu trên - xử lý nhiều tiến trình cùng một lúc trên Arduino.

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

Tài liệu kỹ thuật bỏ túi để lập trình Internet of Things - Vận hành, điều khiển và quản lý thiết bị qua Internet trong 1 nốt nhạc

Kính chào quý vị và các bạn!

Lập trình Internet of Things được biết đến là một thứ vô cùng khó khăn và phức tạp. Nơi này, trước đây không phải dành cho tất cả mọi người. Nhưng, để đưa Việt Nam trở thành một cường quốc về công nghệ cao và đi tắt đón đầu nhờ cuộc cách mạng công nghệ 4.0 thì bài toán Internet of Things phải được giải quyết bằng chính trí tuệ của tất cả mọi người. Cuối cùng, để giải quyết được đồ thị Đa dụng và Dễ sử dụng, iNut Node-red IDE đã ra đời, giải pháp cung cấp một phương pháp sáng tạo, cho phép người dùng lập trình ứng dụng IoT bằng những khối lệnh kéo thả với những ví dụ ngay trong app. Ngay cả một học sinh tiểu học học STEM cũng có thể làm được. Hãy cùng khám phá nhé!

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