Hướng dẫn cách điều khiển Xe mô hình cơ bản với Raspberry Pi
11:43 - 23/04/2020
Hướng dẫn cách điều khiển Xe mô hình cơ bản với Raspberry Pi
NVIDIA Jetson AGX Orin Hardware Layout and GPIO Expansion Header Pinout
NVIDIA Jetson là nền tảng hàng đầu thế giới dành cho Trí tuệ nhân tạo (AI) và Deep Learning
Jetson Stats dùng cho Giám sát và Điều khiển trên NVIDIA Jetson Ecosystem [Xavier NX, Nano, AGX Xavier, TX1, TX2]
Xilinx Kria Edge AI SOM ra mắt với Developer Kit
Chào các bạn, chào các bạn. Hôm nay mình đã trở lại rồi đây.
Hôm nay mình sẽ giới thiệu đến các bạn để tạo ra một chiếc xe điều khiển với Raspberry Pi và Module L298N.( Mình sẽ demo kết quả trên Mô hình xe Alphabot luôn vì nguyên lý hoạt động cũng tương tự nhau ). Các bạn có thể tự xây dựng cho mình một chiếc xe mô hình như vậy hoặc các bạn tham khảo bé này nhé AlphaBot (LINK HERE)
Trước tiên chúng ta cần một số nguyên liệu như sau :
Phần cứng.
+ 1 Raspberry Pi ( Nên dùng Raspberry Pi 3 Model B vì sau này chúng ta sẽ làm một số thứ hay ho khác )
+ 1 Module L298N
+ Động cơ DC
+ Dây cắm
+ 1 Khung xe mô hình ( Nếu được thì bạn có thể tậu một bé Alphabot – Đa chức năng mà giá lại hợp lý )
Phần mềm
Trong quá trình điều khiển chú Robot của chúng ta chúng ta sẽ cần công cụ sau
+ Phần mềm Putty
+ Phần mềm WinSCP
Các bạn có thể tham khảo hướng dẫn sử dụng các phần mềm này tại đây : (LINK HERE)
Sơ đồ nối mạch :
1. Nếu bạn điều khiển 2 Động cơ của robot, bạn cần chú ý bài đấu nối Cực +,- của động cơ.
2. Tiếp bạn cấp nguồn cho Module L298N.
3. Bạn nên cấp nguồn riêng cho Raspberry Pi.
4. Các chân số 13, 12, 21 và 20 của Raspberry Pi sẽ nối tương ứng với IN1, IN2, IN3 và IN4 của L298N.
5. Chiều quay của động cơ được điều khiển bằng cách xuất các đầu ra HIGH hoặc LOW tại các chân INx.
+ Ví dụ : Với Động Cơ A: Logic HIGH ở IN1 và IN2 Logic LOW sẽ làm động cơ quay 1 hướng nếu đặt Logic ngược lại sẽ làm động cơ quay theo hướng khác.
+ Bạn cần phải nhớ, đây là làm động cơ chỉ quay hết công suất mà thôi. Nếu muốn thay đổi tốc độ của nó, bạn cần phải băm xung PWM bằng việc dùng các chân 6, 26 trên Raspbery Pi.
Để hiểu rõ, bây giờ mình sẽ giúp các bạn tưởng tượng nhé:
- Tưởng tượng, chân IN1 là chân Pin13, chân IN2 là chân Pin12.
- Bạn cấp cực dương vào IN1, cực âm vào IN2 => motor quay một chiều (chiều 1).
- Bạn cấp cực âm vào IN1, cực dương vào IN2 => motor quay chiều còn lại (chiều 2)!
- Cực dương ở đây là điện thế 5V, cực âm ở đây là điện thế 0V. Hiện điện thế được tính là điện thế ở IN1 trừ hiệu điện thế IN2.
- Giả sử, hiệu điện thế 5V sẽ là mạnh nhất trong việc điều khiển động cơ. Như vậy, chỉ cần hạ hiệu điện thế xuống là động cơ sẽ bị yếu đi.
- Và nếu hiệu điện thế < 0 => động cơ sẽ đảo chiều!
Code điều khiển động cơ Basic
Các bạn đặt tên thư mục là AlphaBot. Sau đó tạo một file với tên AlphaBot.py
Dưới đây là nội dung thư viện chúng ta viết để điều khiển động cơ.
import RPi.GPIO as GPIO import time class AlphaBot(object): def __init__(self,in1=13,in2=12,ena=6,in3=21,in4=20,enb=26): self.IN1 = in1 self.IN2 = in2 self.IN3 = in3 self.IN4 = in4 self.ENA = ena self.ENB = enb GPIO.setmode(GPIO.BCM) GPIO.setwarnings(False) GPIO.setup(self.IN1,GPIO.OUT) GPIO.setup(self.IN2,GPIO.OUT) GPIO.setup(self.IN3,GPIO.OUT) GPIO.setup(self.IN4,GPIO.OUT) GPIO.setup(self.ENA,GPIO.OUT) GPIO.setup(self.ENB,GPIO.OUT) self.stop() self.PWMA = GPIO.PWM(self.ENA,500) self.PWMB = GPIO.PWM(self.ENB,500) self.PWMA.start(50) self.PWMB.start(50) def backward(self): GPIO.output(self.IN1,GPIO.HIGH) GPIO.output(self.IN2,GPIO.LOW) GPIO.output(self.IN3,GPIO.LOW) GPIO.output(self.IN4,GPIO.HIGH) def stop(self): GPIO.output(self.IN1,GPIO.LOW) GPIO.output(self.IN2,GPIO.LOW) GPIO.output(self.IN3,GPIO.LOW) GPIO.output(self.IN4,GPIO.LOW) def forward(self): GPIO.output(self.IN1,GPIO.LOW) GPIO.output(self.IN2,GPIO.HIGH) GPIO.output(self.IN3,GPIO.HIGH) GPIO.output(self.IN4,GPIO.LOW) def right(self): GPIO.output(self.IN1,GPIO.LOW) GPIO.output(self.IN2,GPIO.LOW) GPIO.output(self.IN3,GPIO.LOW) GPIO.output(self.IN4,GPIO.HIGH) def left(self): GPIO.output(self.IN1,GPIO.HIGH) GPIO.output(self.IN2,GPIO.LOW) GPIO.output(self.IN3,GPIO.LOW) GPIO.output(self.IN4,GPIO.LOW) def setPWMA(self,value): self.PWMA.ChangeDutyCycle(value) def setPWMB(self,value): self.PWMB.ChangeDutyCycle(value) def setMotor(self, left, right): if((right >= 0) and (right <= 100)): GPIO.output(self.IN1,GPIO.HIGH) GPIO.output(self.IN2,GPIO.LOW) self.PWMA.ChangeDutyCycle(right) elif((right < 0) and (right >= -100)): GPIO.output(self.IN1,GPIO.LOW) GPIO.output(self.IN2,GPIO.HIGH) self.PWMA.ChangeDutyCycle(0 - right) if((left >= 0) and (left <= 100)): GPIO.output(self.IN3,GPIO.HIGH) GPIO.output(self.IN4,GPIO.LOW) self.PWMB.ChangeDutyCycle(left) elif((left < 0) and (left >= -100)): GPIO.output(self.IN3,GPIO.LOW) GPIO.output(self.IN4,GPIO.HIGH) self.PWMB.ChangeDutyCycle(0 - left)
Giờ thì chúng ta vào phần điều khiển động cơ bằng cách gọi hàm trong thư viện chúng ta vừa viết.
Trong thư mục AlphaBot chúng ta tạo file test.py
Đầu tiên chúng ta sẽ test điều khiển động cơ bằng một số phím trên bàn phím.
import RPi.GPIO as GPIO import time from AlphaBot import AlphaBot import curses Ab = AlphaBot() screen = curses.initscr() curses.noecho() curses.cbreak() curses.halfdelay(3) screen.keypad(True) #PWM = 10 try: while True: char = screen.getch() if char == ord('q'): break elif char == curses.KEY_UP: Ab.forward() elif char == curses.KEY_DOWN: Ab.backward() elif char == curses.KEY_RIGHT: Ab.right() elif char == curses.KEY_LEFT: Ab.left() elif char == 10: Ab.stop() finally: #Close down curses properly, inc turn echo back on! curses.nocbreak(); screen.keypad(0); curses.echo() curses.endwin() GPIO.cleanup()
Các bạn có thể tham khảo module phần code phía dưới để có thể điều khiển Robot của các bạn qua trình duyệt Web.
AlphaBot_Control_via_Web (LINK HERE)
Phần code chương trình chính.
Nội dung chương trình chính của chúng ta nằm trong file main.py
#!/usr/bin/python # -*- coding:utf-8 -*- from bottle import get,post,run,route,request,template,static_file from AlphaBot import AlphaBot import threading import socket #ip import os,sys import RPi.GPIO as GPIO import time car = AlphaBot() @get("/") def index(): return template("index1") @route('/<filename>') def server_static(filename): return static_file(filename, root='./') @route('/fonts/<filename>') def server_fonts(filename): return static_file(filename, root='./fonts/') @post("/cmd") def cmd(): code = request.body.read().decode() speed = request.POST.get('speed') if(speed != None): car.setPWMA(float(speed)) car.setPWMB(float(speed)) print(speed) if code == "stop": car.stop() print("stop") elif code == "forward": car.forward() print("forward") elif code == "backward": car.backward() print("backward") elif code == "turnleft": car.left() print("turnleft") elif code == "turnright": car.right() print("turnright") else: value = 0 try: value = int(speed) if(value >= 0 and value <= 100): print(value) car.setPWMA(value) car.setPWMB(value) except: print("Command error") return "OK" s = socket.socket(socket.AF_INET,socket.SOCK_DGRAM) s.connect(('8.8.8.8',80)) localhost=s.getsockname()[0] run(host = localhost, port = 8000)
Sau khi chạy code các bạn truy cập địa chỉ <Rasip>:8000 và đây là kết quả của chúng ta :
Các bạn tham khảo cách chạy MJPEG Streamer tại đây (LINK HERE)
Nếu các bạn có bất kỳ ý tưởng mới nào đừng ngần ngại mà hãy inbox trực tiếp cho fanpage . Xin chào và hẹn gặp lại các bạn trong các bài viết tiếp theo !!!
PIVIETNAM.COM.VN CHÚC CÁC BẠN THÀNH CÔNG !!!
Thực hiện bài viết : Đào Văn Hậu
Để cập nhật các tin tức công nghệ mới các bạn làm theo hướng dẫn sau đây :
Các bạn vào Trang chủ >> Tin tức. ở mục này có các bài viết kỹ thuật thuộc các lĩnh vực khác nhau các bạn có thể lựa chọn lĩnh vực mà mình quan tâm để đọc nhé !!!
Các bạn cũng có thế kéo xuống cuối trang để xem những tin tức công nghệ mới nhất.