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ả

Tôi tự làm Robot với Raspberry Pi và Arduino như thế nào? - Phần 6: Sử dụng NRF24L01 với Raspberry Pi

Hú Hú, Chúng ta cùng tiếp tục với bài 6 trong tutorial của mình laughHôm nay mình sẽ hướng dẫn cách bạn giao tiếp Raspberry và Arduino thông qua module NRF24L01 nhé.

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

NRA - Phần 1: Bật tắt led đơn giản trên Web

Lâu rồi mới có thời gian nghịch với Raspi và Arduino. Hôm nay mình sẽ giới thiệu các bạn những sức mạnh của sự kết hợp giữa Nodejs (N), Raspberry Pi (R), Arduino (A). Ở đây các bạn sẽ điều khiển, thu thập dữ liệu, làm được rất nhiều thứ với arduino và raspberry pi trên website một cách đơn giản và chuyên nghiệp. Đã có nhiều bài viết trên Arduino.vn nói về việc điều khiển bằng Nodejs nhưng hôm nay tôi sẽ giới thiệu các bạn thư viện khác để sử dụng đa dạng hơn.

Bài đầu tiên này, mình sẽ hướng dẫn các bạn một số cơ bản, và một ví dụ bài điều khiển led cổ điển. Tiếp tục xem nhé!!! devil

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