从小对机器人非常感兴趣,正好身边有一个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网络用电脑远程控制机器人了。
转载于:https://blog.51cto.com/raspjason/1687502