Chuyện kể rằng, có 02 sinh viên Việt Nam, trong lúc làm đồ án đại học kết nối điều khiển từ xa qua Internet. Một người thì chọn phương án truyền thống sử dụng máy tính làm máy chủ và demo các tính năng theo yêu cầu đồ án. Người còn lại biết đến iNut Sensor và tìm cách tối ưu hóa phần mềm và phần cứng nhằm chau chuốt cho đồ án của mình trở nên "xịn" và "nhiều tính năng bá đạo". Đến lúc bảo vệ đồ án, cậu sinh viên 01 cảm thấy choáng ván với muôn vàn vấn đề từ việc nơi trình bày đồ án không có wifi, mạng chập chờn, máy tính mở không lên, đứt cáp biển,... Cuối cùng cũng bảo vệ được với điểm số không ưng ý lắm dù tốn rất nhiều thời gian và công sức. Cậu còn lại nhờ vào việc chau chuốt phần mềm, tối ưu hóa và comment kĩ từng lệnh trong dòng code, viết báo cáo bài bản chuẩn bị slide như ý, dùng điện thoại cài wifi, quét mã QRcode để chia sẻ quyền truy cập đến phần mềm rất chuyên nghiệp, mọi thứ cậu chủ động hoàn toàn mà không bị các vấn đề "học tài thi phận" bủa vây mà kết quả hết sức mĩ mãn, điểm số mĩ miều, kiến thức IoT được chuẩn hóa. Thực vậy, các dự án, đồ án sử dụng nền tảng iNut Platform bên dưới cho phép các bạn sinh viên làm các dự án hết sức hoàn hảo: từ xe điều khiển, bãi giữ xe thông minh, hệ thống máy lạnh, máy bơm, điều hòa thông minh,... do chinh các bạn tự làm nên đã đạt được những điểm số tốt và tuyệt đối. Cũng chính vì thế, iNut JSC (công ty chủ quản của iNut Platform) đã kết hợp với Khu Công nghệ phần mềm - ĐHQGHCM để tổ chức những khóa đào tạo ngắn hạn cho sinh viên Việt Nam sử dụng nền tảng IoT do iNut JSC phát triển. Và để mở con đường tri thức tiếp cận IoT trong nháy mắt, iNut JSC đã tạo ra một phiên bản firmware trị giá 50.000 đồng sử dụng clouding của CloudMQTT và tài trợ 1000 firmware cho tất cả các bạn học sinh, sinh viên Việt Nam có thể tiếp cận IoT một cách dễ dàng và nhanh chóng nhất!
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é!