Tôi đã tự làm robot với Raspberry Pi và Arduino như thế nào ? - Phần 3: Điều khiển Robot Di chuyển từ trang Web

Mô tả dự án: 

Hôm nay chúng ta sẽ kết hợp các bài hướng dẫn trước và làm cho robot mình di chyển nhé yes

CHUẨN BỊ

1. L298n

Chúng ta sẽ dùng mạch cầu H L298n để điều khiển các motor

Các bạn chịu khó đọc lại phần điều khiển motor bằng L298n trong bài viết  của mình nhé!

2. Serial

Ý tưởng là chúng ta sẽ gửi các tín hiệu Serial từ Raspi sang Arduino rồi arduino sẽ điều khiển Motor giúp Robot di chuyển.

Cái này các bạn tham khảo ở bài viết  này mình đã chia sẽ  hôm trướclaugh

3. Giao tiếp trên trang Web

Mình sẽ tạo giao diện Web với các nút tiến, lùi, trái, phải để khi truy cập trang web. Sau này chỉ cần click vào các nút là điều khiển Robot chạy.

Các bạn kéo xuống xem lại phần 2 ở dưới bài viết  nhé. 

Oke thế là chuẩn bị xong lý thuyết rồi wink

LẬP TRÌNH

1. Lập trình Raspberry Pi

File index.html

Trước hết tạo các nút điều khiển:

<center>
	<fieldset style="width:250px;"  > 
		<legend><b>ĐIỀU KHIỂN</b></legend>
		<button type="button" class="move" id="clickF">Tiến</button><br>   // các bạn nhớ kĩ cái "id" nhá
  		<br>  <button type="button" class="move" id="clickL">Trái</button>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
 		<button type="button" class="move" id="clickC">Còi</button>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
 		<button type="button" class="move" id="clickR">Phải</button><br>
  		<br> <button type="button" class="move" id="clickB">&nbsp;Lùi&nbsp;</button><br>
 	</fieldset> 
</center>

Xác nhận khi mouseup hay mousedown: (mousedown) giữ thì robot chạy, còn thả (mousedown) ra thì dừng:

<script src="http://code.jquery.com/jquery-1.11.0.min.js"></script>
  <script type="text/javascript">
   $(document).ready(function(){
    $('#clickF').mousedown(function(){    // "clickF" cái id ở trên. Khi click vào nút tiến thì hàm này sẽ hoạt động.
     var a = new XMLHttpRequest();   
     a.open("GET", "forward.php");        // File php mình muốn gọi ngầm     
     a.onreadystatechange=function(){ 
      if(a.readyState==4){
       if(a.status == 200){
       }
       else{
       alert("Error")
       }
      }
     }
     a.send();
    });
    $('#clickF').mouseup(function(){    // Chỉ cần thả chuột ra là Robot dừng
     var a = new XMLHttpRequest();
     a.open("GET", "stop.php");
     a.onreadystatechange=function(){
      if(a.readyState==4){
       if(a.status == 200){
       }
       else{
       alert("Error")
       }
      }
     }
     a.send();
    });
});  </script> 

oke rồi đó, bây giờ tạo các file thực thi nữa.

cd /var/www/html

Mình sẽ tạo một số file php trong này chung với index.html

sudo nano forward.php       // thư mục chứa file phải trùng khớp với chỗ thư mục của file index.html nha
<?php
        exec('sudo python /var/www/html/myweb/move/tien2.py');
?>

sudo nano stop.php
<?php
        exec('sudo python /var/www/html/myweb/move/dung2.py');
?>

Cứ như vậy tiếp tục làm tương tự cho back.php (lùi), left.php (trái), right.php (phải)

Bây giờ chúng ta sẽ lập trình file python

sudo mkdir move
cd move

Tạo file python gửi serial cho arduino:

sudo nano tien2.py
import serial
import os
f = os.popen('ls /dev/ttyACM*')
now = f.read()
now=now[:-1]
print now
os.system('sudo minicom')
ser = serial.Serial(now,9600)
ser.write("4")  // Muốn biết những kí tự nào thì đọc tiếp phần dưới nhá

Nếu mọi người không hiểu lắm về giao tiếp này  thì  quay lại bài Raspberry vs Arduino hôm trước của mình đọc nhé 

Tương tự tạo các file lui2.py, trai2.py, phai2.py 

2. Code cho arduino

//L298n
#define ENA 5  //enable A on pin 5 (needs to be a pwm pin)
#define ENB 3  //enable B on pin 3 (needs to be a pwm pin)
#define IN1 2  //IN1 on pin 2 conrtols one side of bridge A
#define IN2 4  //IN2 on pin 4 controls other side of A
#define IN3 6  //IN3 on pin 6 conrtols one side of bridge B
#define IN4 7  //IN4 on pin 7 controls other side of B
// Serial
int rpi;
void setup() {
	Serial.begin(9600);
	// L298n
	pinMode(ENA, OUTPUT);
	pinMode(ENB, OUTPUT);
	pinMode(IN1, OUTPUT);
	pinMode(IN2, OUTPUT);
	pinMode(IN3, OUTPUT);
	pinMode(IN4, OUTPUT);
}
void loop() {
	// Move
	if (Serial.available()>0) {  // Nếu có tín hiệu Serial
		rpi = Serial.read();  // đọc nó :D
		rpi = rpi - 48;   // Mình giải thích rõ hơn ở dưới
		Serial.println(rpi);
		
	}
	if (rpi==2) { //Tiến
		motorA(2, 100);  
		motorB(2, 100);
	} else {
		if (rpi==4) { //trái
			motorA(1, 100);
			motorB(2, 100);
		} else {
			if (rpi==6) { //Phải
				motorA(2, 100);
				motorB(1, 100);
			} else {
				if (rpi==8) { //Lùi
					motorA(1, 100);
					motorB(1, 100);
				} else {
					if (rpi==0) { //Dừng
						motorA(3, 100);
						motorB(3, 100);	
					}
				}
			}
		}
	}
}

3. Serial

Vì sao chúng ta phải giao tiếp thông qua serial. Bởi nó sẽ là phương thức giao tiếp rất nhanh và an toàn cho 2 board mạch đắt tiền của mình. Và đặt biệt nó rất dễ để sử dụng: chúng ta chỉ cần gắm cáp usb vào với nhau là được, phần còn lại chỉ là việc lập trình. wink

Mình sẽ giải thích hơn cho các bạn hiểu vì sao có dòng:

rpi = rpi - 48; 

và từ đâu ra những con số 2, 4, 6, 8 đọc được.

Nó xuất phát từ bảng mã ASCII 

 

và 

 

Các bạn để ý cột thứ 4: nó chính là các kí tự chúng ta sẽ write trong file python từ raspberry pi ở trên:

ser.write("4") 

Khi arduino nhận được sẽ là những con số ở hệ thập phân, nếu ở trên write("4") thì arduino sẽ nhận được giá trị là 52. Vì thế để thuận tiện hơn mình đã cho cái dữ liệu đọc được trừ đi cho 48 thì lúc này thành 4 để khỏi lộn xộn, nhầm lẫn :v. Khá đơn giản phải không. 

Như vậy là xong hết để có thể điều khiển chú robot của mình trên một trang web điều khiển cực kì trực quan òi á cheeky

KẾT LUẬN

YEAH!, Các bạn đã có thể tạo một robot điều khiển trên trang web theo phong cách của riêng mình rồilaugh

Các bạn nhớ theo dõi bài sau nhésmileyyesdevilcool

ps: tiết lộ bài sau sẽ là stream video từ camera lên trang web và các nút hệ thống nữa hihi.

Youtube: 
Đẹp chưa :D
lên
10 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ả

Raspberry Pi Kết Hợp Arduino

Như các bạn đã biết Raspberry pi là một máy tính mini nên nó rất mạnh về có thể kết nối internet, lậpj trình nhúng trang web một cách dễ dàng, nhưng nó lại không an toàn cho các dự án phần cứng. Còn Arduino thì rất bền kết hợp tốt nhiều phần cứng nhưng về mảng IoT thì cũng hạn chế hơn raspberry pi. Mỗi cái riêng lẻ là một hạn chế, nhưng tại sao chúng ta không kết hợp chúng lại để dự án của mình tối ưu hóa hơn. Vâng, hôm nay mình xin hướng dẫn các bạn một cách để giao tiếp PI với Arduino.coolangelenlightenedheartyes

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

Thiết Bị Bật Tắt Máy Phun Sương Tự Động

Heoheo, đây là dự an mình vừa làm cho cậu mình làm trong trang trại nuôi nấm. Vì điều kiện nấm phải có khí hậu mát mẻ nên chúng ta phải lắp cho nó một hệ thống phun sương để duy trì một nhiệt độ thích hợp để nấm sinh trưởng. Chúng ta có thể dùng cảm biến nhiệt độ, độ ẩm để điều chỉnh việc tự động phun sương nhưng việc này thì khá là tốn kém cho chủ nhà, vì nhiệt độ ở nước ta hơi khắc nghiệt :D sẽ thay đổi liên tục và có thể bị nhiễu dẫn đến ko chính xác. Nên chúng ta có giải pháp là khoảng bao nhiêu phút một lần tùy theo thời tiết.

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