标签:raspberry pi 机器人 树莓派
从小对机器人非常感兴趣,正好身边有一个raspberry pi,平时就当Linux的服务器练练命令行,写写脚本。这次打算把raspberry pi的强大的GPIO都利用起来,做个小机器人。
首先从网上买了机器人相关的配件,主要是驱动机器人移动的电机、L298N电机驱动板、HC-SR04超声波距离探测传感器、机器人车身等配件。用来制作机器人的是raspberry pi B+。此型号一共有40个GPIO口,足以满足入门型机器人的制作要求。
以下是我连接L298N电机驱动板和HC-SR04距离传感器的GPIO针脚示意图。
3V3 | 5V | uVcc | |
SDA1 | 5V | ||
SCL1 | GND | ||
GP4 | TXD0 | ||
GND | RXD0 | ||
N3 | GP17 | GP18 | uEcho |
N2 | GP27 | GND | uGND |
N1 | GP22 | GP23 | N4 |
3V3 | GP24 | uTrig | |
MOSI | GND | ||
MISO | GP25 | ||
SCLK | CE0 | ||
GND | CE1 | ||
EED | EEC | ||
GP5 | GND | ||
GP6 | GP12 | ||
GP13 | GND | ||
GP19 | GP16 | ||
GP26 | GP20 | ENB | |
GND | GP21 | ENA |
raspberry pi驱动电机的主要原理是,通过在电机两极上施加电压使之转动,利用两个针脚之间的高低电平差决定转动方向。
首先为了驱动电机,写了一个关于motor的类文件。
pi@raspberrypi ~/robot/class $ cat motor.py #!/usr/bin/python import RPi.GPIO as GPIO from time import sleep import sys import os,tty,termios,time time_sleep = 1 class motor: RIGHT = 15 LEFT = 16 RIGHTB = 13 LEFTB = 11 RIGHTPWM = 40 LEFTPWM = 38 def __init__(self): GPIO.setmode(GPIO.BOARD) GPIO.setwarnings(False) GPIO.setup(self.RIGHTPWM, GPIO.OUT) self.rightpwm = GPIO.PWM(self.RIGHTPWM, 500) self.rightpwm.start(0) GPIO.setup(self.RIGHT, GPIO.OUT) GPIO.setup(self.RIGHTB, GPIO.OUT) GPIO.setup(self.LEFTPWM, GPIO.OUT) self.leftpwm = GPIO.PWM(self.LEFTPWM,500) self.leftpwm.start(0) GPIO.setup(self.LEFT, GPIO.OUT) GPIO.setup(self.LEFTB, GPIO.OUT) def motor(self,leftspeed,left,rightspeed,right): # initiate speed self.rightpwm.ChangeDutyCycle(leftspeed*100) # leftspeed 0 to 1 GPIO.output(self.RIGHTPWM, right) # right True or False self.leftpwm.ChangeDutyCycle(rightspeed*100) # rightspeed 0 to 1 GPIO.output(self.LEFTPWM, left) # left True or False def forward(self,lspeed,rspeed, second): GPIO.output(self.LEFTB, False) GPIO.output(self.LEFT, True) GPIO.output(self.RIGHT, True) GPIO.output(self.RIGHTB, False) self.motor(lspeed,0,rspeed,0) if second > 0: time.sleep(second) self.stop() def stop(self): self.motor(0,0,0,0) def reverse(self, lspeed,rspeed, second): GPIO.output(self.LEFTB, True) GPIO.output(self.LEFT, False) GPIO.output(self.RIGHT, False) GPIO.output(self.RIGHTB, True) self.motor(lspeed,0,rspeed,0) if second > 0: time.sleep(second) self.stop() def right(self, lspeed, rspeed, second): GPIO.output(self.LEFTB, True) GPIO.output(self.LEFT, True) GPIO.output(self.RIGHT,True) GPIO.output(self.RIGHTB, False) self.motor(lspeed,0,rspeed,0) if second > 0: time.sleep(second) self.stop() def left(self, lspeed, rspeed, second): GPIO.output(self.LEFTB, False) GPIO.output(self.LEFT, True) GPIO.output(self.RIGHT,True) GPIO.output(self.RIGHTB, True) self.motor(lspeed,0,rspeed,0) if second > 0: time.sleep(second) self.stop() def pivot_right(self, lspeed, rspeed, second): GPIO.output(self.LEFTB, True) GPIO.output(self.LEFT, False) GPIO.output(self.RIGHT,True) GPIO.output(self.RIGHTB, False) self.motor(lspeed,0,rspeed,0) if second > 0: time.sleep(second) self.stop() def pivot_left(self, lspeed, rspeed, second): GPIO.output(self.LEFTB, False) GPIO.output(self.LEFT, True) GPIO.output(self.RIGHT,False) GPIO.output(self.RIGHTB, True) self.motor(lspeed,0,rspeed,0) if second > 0: time.sleep(second) self.stop()
然后编写通过控制端电脑键盘控制机器人的程序,此程序调用motor.py这个驱动脚本
#!/usr/bin/python import motor import time import sys import os,tty,termios,time time_sleep = 0.070 lspeed = 1 rspeed = 1 m = motor.motor() def getch(): fd = sys.stdin.fileno() old_settings = termios.tcgetattr(fd) try: tty.setraw(sys.stdin.fileno()) ch = sys.stdin.read(1) finally: termios.tcsetattr(fd, termios.TCSADRAIN, old_settings) return ch while True: char = getch() if(char == ‘w‘): m.forward(lspeed,rspeed,time_sleep) if(char == ‘s‘): m.reverse(lspeed,rspeed,time_sleep) if(char == ‘a‘): m.left(lspeed,rspeed,time_sleep) if(char == ‘d‘): m.right(lspeed,rspeed,time_sleep) if(char == ‘q‘): m.pivot_left(lspeed,rspeed,time_sleep) if(char == ‘e‘): m.pivot_right(lspeed,rspeed,time_sleep) if(char == ‘c‘): os.system(‘/home/pi/camera/startstream.sh‘) if(char == ‘x‘): os.system(‘/home/pi/camera/stopstream.sh‘) if(char == ‘n‘): os.system(‘/home/pi/robot/class/autodrive.sh‘) if(char == ‘f‘): print("Program Ended") break
此后我可以通过wifi网络用电脑远程控制机器人了。
本文出自 “菜鸟极客” 博客,请务必保留此出处http://raspjason.blog.51cto.com/8565009/1687502
标签:raspberry pi 机器人 树莓派
原文地址:http://raspjason.blog.51cto.com/8565009/1687502