1.L298N电机驱动模块:
模块的电池盒与12V和地极相连,模块的地极再和树莓派共地
IN1-4接口和GPIO11,12,13,15相连
import RPi.GPIO as GPIO #GPIO引脚定义方式
import time
GPIO.setmode(GPIO.BOARD)
#针脚编号,就是树莓派1-40号引脚,还有一种更底层BCM,但是版本变化也变化
GPIO.setwarnings(False) #忽略针脚占用警告?
INT1 = 11
INT2 = 12
INT3 = 13
INT4 = 15
GPIO.setup(INT1,GPIO.OUT) #将连接IN1的GPIO引脚设置为输出模式
GPIO.setup(INT2,GPIO.OUT)
GPIO.setup(INT3,GPIO.OUT)
GPIO.setup(INT4,GPIO.OUT)
GPIO.output(INT1,GPIO.HIGH)
GPIO.output(INT2,GPIO.LOW)
GPIO.output(INT3,GPIO.HIGH)
GPIO.output(INT4,GPIO.LOW)
time.sleep(2)
GPIO.output(INT1,GPIO.LOW)
GPIO.output(INT2,GPIO.HIGH)
GPIO.output(INT3,GPIO.LOW)
GPIO.output(INT4,GPIO.HIGH)
time.sleep(1)
GPIO.output(INT1,GPIO.LOW)
GPIO.output(INT2,GPIO.LOW)
GPIO.output(INT3,GPIO.LOW)
GPIO.output(INT4,GPIO.LOW)
小车应该会前进2S,倒退1S然后停止,
GPIO.HIGH=1=True
GPIO.LOW=0=False
2.使能通道ENA和使能通道ENB:控制马达输出电压从而实现控速。
拔掉跳线帽后每个EA有两个引脚,外面1根连接树莓派的GPIO针,里面一根输出的是5V电压。一般情况下只要连接外面的就行
ENA:GPIO16;ENB:GPIO18
import RPi.GPIO as GPIO #GPIO引脚定义方式
import time
GPIO.setmode(GPIO.BOARD)
#针脚编号,就是树莓派1-40号引脚,还有一种更底层BCM,但是版本变化也变化
GPIO.setwarnings(False) #忽略针脚占用警告?
INT1 = 11
INT2 = 12
INT3 = 13
INT4 = 15
ENA = 16
ENB = 18
#初始化
GPIO.setup(INT1,GPIO.OUT) #将连接IN1的GPIO引脚设置为输出模式
GPIO.setup(INT2,GPIO.OUT)
GPIO.setup(ENA, GPIO.OUT)
GPIO.setup(INT3,GPIO.OUT)
GPIO.setup(INT4,GPIO.OUT)
GPIO.setup(ENB, GPIO.OUT)
speed = 0
i=0
pwmA=GPIO.PWM(ENA,500) # 设置向ENA输入PWM脉冲信号,频率为500并创建PWM对象
pwmB=GPIO.PWM(ENB,500)
pwmA.start(speed) # 以speed的初始占空比开始向ENA输入PWM脉冲信号
pwmB.start(speed) #括号内speed范围在0到100,0不动,100最大
while True:
GPIO.output(INT1, 1)
GPIO.output(INT2, 0)
GPIO.output(INT3, 1)
GPIO.output(INT4, 0)
for i in range(0,4):
speed=60+i*10
pwmA.ChangeDutyCycle(speed)
pwmB.ChangeDutyCycle(speed)
time.sleep(1)
GPIO.output(INT1, 0)
GPIO.output(INT2, 1)
GPIO.output(INT3, 0)
GPIO.output(INT4, 1)
for i in range(0,4):
speed=60+i*10
pwmA.ChangeDutyCycle(speed)
pwmB.ChangeDutyCycle(speed)
time.sleep(1)
GPIO.output(INT1, 0)
GPIO.output(INT2, 0)
GPIO.output(INT3, 0)
GPIO.output(INT4, 0)
pwmA.stop() # PWM控制结束
pwmB.stop()
GPIO.cleanup() # 清理释放GPIO资源,将GPIO复位
3.超声波测距模块:HC-SR04
有效测距:3cm-4m
持续10微秒的脉冲信号
4个引脚:VCC,Trig,Echp,GND,分别接2,38,40,39
时间间隔=接收时间-发送时间
测得距离=v*t/2
超声波模块对松软介质容易误报
红外线模块对透明反射介质容易误报
简单测试代码:如果有物体(手)在20cm内,会倒退 2S,再前进
经过测试,小于8mm左右感觉准确率不高
import RPi.GPIO as GPIO
import time
GPIO.setmode(GPIO.BOARD)
GPIO.setwarnings(False)
INT1 = 11
INT2 = 12
INT3 = 13
INT4 = 15
Trig= 38
Echo = 40
#初始化
GPIO.setup(INT1,GPIO.OUT) #将连接IN1的GPIO引脚设置为输出模式
GPIO.setup(INT2,GPIO.OUT)
GPIO.setup(INT3,GPIO.OUT)
GPIO.setup(INT4,GPIO.OUT)
GPIO.setup(Trig,GPIO.OUT)
GPIO.setup(Echo,GPIO.IN)
def forward():
GPIO.output(INT1, 1)
GPIO.output(INT2, 0)
GPIO.output(INT3, 1)
GPIO.output(INT4, 0)
def back():
GPIO.output(INT1, 0)
GPIO.output(INT2, 1)
GPIO.output(INT3, 0)
GPIO.output(INT4, 1)
def left():
GPIO.output(INT1, 0)
GPIO.output(INT2, 1)
GPIO.output(INT3, 1)
GPIO.output(INT4, 0)
def right():
GPIO.output(INT1, 1)
GPIO.output(INT2, 0)
GPIO.output(INT3, 0)
GPIO.output(INT4, 1)
def stop():
GPIO.output(INT1, 0)
GPIO.output(INT2, 0)
GPIO.output(INT3, 0)
GPIO.output(INT4, 0)
def distance():
GPIO.output(Trig,1)
time.sleep(0.00001)
GPIO.output(Trig,0)
# 记录发送超声波的时刻1
while GPIO.input(Echo)==0:
starttime=time.time()
# 记录接收到返回超声波的时刻2
while GPIO.input(Echo)==1:
stoptime=time.time()
# 声波的速度为 343m/s, 转化为 34300cm/s
distance=(stoptime-starttime)*34300/2
return distance
if __name__ == '__main__':
try:
while True:
dist = distance()
print("Measured Distance = {:.2f} cm".format(dist))
if dist > 20:
forward()
time.sleep(1)
else:
back()
time.sleep(1)
except KeyboardInterrupt:
print("Measurement stopped by User")
GPIO.cleanup()
如果会python应该看得懂代码,就不做详述了