美文网首页
树莓派+智能小车+L298N直流驱动模块+S90舵机+1602液

树莓派+智能小车+L298N直流驱动模块+S90舵机+1602液

作者: 我开心0536 | 来源:发表于2020-09-11 15:02 被阅读0次
L298N接线图.png

这个模块,对我可谓是一波多折
1、首先期望它能输出5V电压,给树莓派供电,结果供电电压电流都较小,好像带动不了树莓派!
2、开始无论怎么设置,都不能让电机转动,查阅好多资料也无结果。后来偶然发现,本模块的接地端,必须与树莓派的GND口连接起来,否则电机不转!
3、IO口:INT1为高 INT2为低 INT3为高 INT4为低 时,输出电压的正负极如图所示
4、INT1+INT2控制左边的电机,INT3+INT4控制右边的电机

附简单代码如下(这个代码不可调速):

#===================================
#  2020.09.11  我开心
#===================================
try:
    import RPi.GPIO as GPIO
    import time
except RuntimeError:
    print(" import 引入错误 ... ")


GPIO.setmode(GPIO.BCM)
GPIO.setwarnings(False)  #关闭警告

#===================================
#  电机
#===================================
INT1=1
INT2=7
INT3=8
INT4=11
GPIO.setup(INT1,GPIO.OUT)
GPIO.setup(INT2,GPIO.OUT)
GPIO.setup(INT3,GPIO.OUT)
GPIO.setup(INT4,GPIO.OUT)

def car_forward():                       #定义前进函数
    GPIO.output(INT1,GPIO.HIGH)          #将INT1接口设置为高电压
    GPIO.output(INT2,GPIO.LOW)           #将INT2接口设置为低电压
    GPIO.output(INT3,GPIO.HIGH)          #将INT3接口设置为高电压
    GPIO.output(INT4,GPIO.LOW)           #将INT4接口设置为低电压

def car_back():                          #定义后退函数
    GPIO.output(INT1,GPIO.LOW)
    GPIO.output(INT2,GPIO.HIGH)
    GPIO.output(INT3,GPIO.LOW)
    GPIO.output(INT4,GPIO.HIGH)

def car_left():                          #定义左转函数
    GPIO.output(INT1,GPIO.LOW)
    GPIO.output(INT2,GPIO.HIGH)
    GPIO.output(INT3,GPIO.HIGH)
    GPIO.output(INT4,GPIO.LOW)    

def car_right():                         #定义右转函数
    GPIO.output(INT1,GPIO.HIGH)
    GPIO.output(INT2,GPIO.LOW)
    GPIO.output(INT3,GPIO.LOW)
    GPIO.output(INT4,GPIO.HIGH)


def car_stop():                          #定义停止函数
    GPIO.output(INT1,GPIO.LOW)
    GPIO.output(INT2,GPIO.LOW)
    GPIO.output(INT3,GPIO.LOW)
    GPIO.output(INT4,GPIO.LOW)
    

#===================================
#===================================
# 主程序开始!!!!!
#===================================
#===================================
i=1 #循环次数

try:
    while True:
        print('第'+str(i)+'次开始')
        
        print('开始前进')
        car_forward()
        time.sleep(15)
        
        print('开始左转')        
        car_left()
        time.sleep(15)
        
        print('开始右转')
        car_right()
        time.sleep(15)

        print('开始后退')
        car_back()
        time.sleep(15)

        print('开始停车')
        car_stop()
        time.sleep(15)
        
        #循环的次数+1
        i=i+1
        
except KeyboardInterrupt:
    print('KeyboardInterrupt 程序被人为中止....')
finally:
    GPIO.cleanup()
    print('Exit 程序共运行了'+str(i)+'次,程序结束。')    

================
这个代码可以调速度
================

#!/usr/bin/python3
# -*- coding: utf-8 -*-
try:
    import RPi.GPIO as GPIO
    import time
except RuntimeError:
    print("引入错误")
    
GPIO.setmode(GPIO.BCM)
INT1 = 1
INT2 = 7
INT3 = 8
INT4 = 11
GPIO.setup(INT1, GPIO.OUT)
GPIO.setup(INT2, GPIO.OUT)
GPIO.setup(INT3, GPIO.OUT)
GPIO.setup(INT4, GPIO.OUT)

pwm1 = GPIO.PWM(INT1, 500)    #引脚,频率
pwm2 = GPIO.PWM(INT2, 500)
pwm3 = GPIO.PWM(INT3, 500)
pwm4 = GPIO.PWM(INT4, 500)

pwm1.start(0)                    #启用PWM,初始占空比(范围:0.0 <= dc >= 100.0)
pwm2.start(0)
pwm3.start(0)
pwm4.start(0)

def car_forward(speed):
    pwm1.ChangeDutyCycle(speed)
    pwm2.ChangeDutyCycle(0)
    pwm3.ChangeDutyCycle(speed)
    pwm4.ChangeDutyCycle(0)
 
def car_back(speed):
    pwm1.ChangeDutyCycle(0)
    pwm2.ChangeDutyCycle(speed)
    pwm3.ChangeDutyCycle(0)
    pwm4.ChangeDutyCycle(speed)

def car_stop():
    pwm1.ChangeDutyCycle(0)      #更改占空比,0-100
    pwm2.ChangeDutyCycle(0)
    pwm3.ChangeDutyCycle(0)
    pwm4.ChangeDutyCycle(0)

def car_brake():                 #刹车
    pwm1.ChangeDutyCycle(100)
    pwm2.ChangeDutyCycle(100)
    pwm3.ChangeDutyCycle(100)
    pwm4.ChangeDutyCycle(100)    

#根据电机焊接和接入AB接口不同,调试时需要重新定义一下四个函数
#依次运行f前进/b倒车/c右转/o左转,看小车的实际行为
#根据实际行为,将以下函数重命名
def car_left(speed):
    pwm1.ChangeDutyCycle(speed)
    pwm2.ChangeDutyCycle(0)
    pwm3.ChangeDutyCycle(0)
    pwm4.ChangeDutyCycle(speed)   
    
def car_right(speed):
    pwm1.ChangeDutyCycle(0)    
    pwm2.ChangeDutyCycle(speed)
    pwm3.ChangeDutyCycle(speed)
    pwm4.ChangeDutyCycle(0)

try:
    while True:
        cmd = input("f前进/b倒车/c右转/o左转/s停车/k刹车  0-9, 例如f5:")
        direction = cmd[0]
        if cmd[1:] != '':
            speed = int( cmd[1:] ) * 10
        else:
            print("未定义速度,默认值50%")
            speed = 50
        if speed <=30:
            print("警告:功率过低,可能无法驱动电机!!!")
        if direction == "f":
            print("前进:速度{0}%".format(speed))
            car_forward(speed)
        elif direction == "b":
            print("倒车:速度{0}%".format(speed))
            car_back(speed)
        elif direction == "c":
            print("右转:速度{0}%".format(speed))
            car_right(speed)
        elif direction == "o":
            print("左转:速度{0}%".format(speed))
            car_left(speed)
        elif direction == "s":
            print("停车")
            car_stop()
        elif direction == "k":
            print("刹车")
            car_brake()
        else:
            print("未知命令{0},停车".format(direction))
            car_stop()
                        
except KeyboardInterrupt:
    print("刹车")
    car_brake()
    pass
finally:
    print("停止")
    car_stop()
    GPIO.cleanup()
    print('Exit...' )

============
下面这个版本,3个超声波(前面、左面、右面)+HX1838红外遥控器,不需要用舵机 2020.09.15 21:10
===========


Screenshot_20200915_220326_com.huawei.himovie.jpg
#===================================
# 3个超声波(前面、左面、右面)+HX1838红外遥控器,不需要用舵机+红绿灯2个+LED屏幕 
#  2020.09.15   21:10  我开心
#===================================
try:
    import RPi.GPIO as GPIO
    import time
    import tm1637 #请保证tm1637.py已复制到当前目录下
except RuntimeError:
    print(" import 引入错误 ... ")


GPIO.setmode(GPIO.BCM)
GPIO.setwarnings(False)  #关闭警告

#===================================
#  红绿灯
#===================================
#红绿灯-左
led_list_left =[17,27,22]  #红R 黄Y 绿G
#红绿灯-右
led_list_right=[21,26,20]  #红R 黄Y 绿G

GPIO.setup(led_list_left , GPIO.OUT, initial=GPIO.LOW)
GPIO.setup(led_list_right, GPIO.OUT, initial=GPIO.LOW)

def led_liang():   #定义函数 LED所有灯常亮
    for led in led_list_left:
        GPIO.output(led, GPIO.HIGH)
    for led in led_list_right:
        GPIO.output(led, GPIO.HIGH)

def led_mie():   #定义函数 LED所有灯常灭
    for led in led_list_left:
        GPIO.output(led, GPIO.LOW)
    for led in led_list_right:
        GPIO.output(led, GPIO.LOW)

def led_left():  #定义函数 LED 左转流水灯
    led_mie()
    for led in led_list_left:
        GPIO.output(led, GPIO.LOW)
        time.sleep(0.05)
        GPIO.output(led, GPIO.HIGH)
        time.sleep(0.05)

def led_right():  #定义函数 LED 右转流水灯
    led_mie()
    for led in led_list_right:
        GPIO.output(led, GPIO.LOW)
        time.sleep(0.05)
        GPIO.output(led, GPIO.HIGH)
        time.sleep(0.05)

#===================================
#  超声波 前面
#===================================        
trig=24 #send-pin
echo=25 #receive-pin
GPIO.setup(trig,GPIO.OUT,initial=GPIO.LOW)
GPIO.setup(echo,GPIO.IN)

def chaoshengbo():  #定义函数
    #send
    GPIO.output(trig,True)
    time.sleep(0.00011) #1us
    GPIO.output(trig,False)
    #start recording
    while GPIO.input(echo)==0:
        pass
    start=time.time()
    #end recording
    while GPIO.input(echo)==1:
        pass
    end=time.time()
 
    #compute distance
    distance=round((end-start)*343/2*100,2)
    #print('距离前方:{0}cm'.format(distance))
    return distance

#===================================
#  超声波 右面
#===================================        
trig_r=3 #send-pin
echo_r=4 #receive-pin
GPIO.setup(trig_r,GPIO.OUT,initial=GPIO.LOW)
GPIO.setup(echo_r,GPIO.IN)

def chaoshengbo_r():  #定义函数右
    #send
    GPIO.output(trig_r,True)
    time.sleep(0.00011) #1us
    GPIO.output(trig_r,False)
    #start recording
    while GPIO.input(echo_r)==0:
        pass
    start=time.time()
    #end recording
    while GPIO.input(echo_r)==1:
        pass
    end=time.time()
 
    #compute distance
    distance_r=round((end-start)*343/2*100,2)
    print('距离右方:{0}cm'.format(distance_r))
    return distance_r

#===================================
#  超声波 左面
#===================================        
trig_l=9 #send-pin
echo_l=11 #receive-pin
GPIO.setup(trig_l,GPIO.OUT,initial=GPIO.LOW)
GPIO.setup(echo_l,GPIO.IN)

def chaoshengbo_l():  #定义函数左
    #send
    GPIO.output(trig_l,True)
    time.sleep(0.00011) #1us
    GPIO.output(trig_l,False)
    #start recording
    while GPIO.input(echo_l)==0:
        pass
    start=time.time()
    #end recording
    while GPIO.input(echo_l)==1:
        pass
    end=time.time()
 
    #compute distance
    distance_l=round((end-start)*343/2*100,2)
    print('距离左方:{0}cm'.format(distance_l))
    return distance_l


#===================================
#  喇叭9号口
#===================================
GPIO.setup(9,GPIO.OUT,initial=GPIO.LOW)

def speak():
    GPIO.output(9,GPIO.HIGH)    #喇叭响
    time.sleep(0.05)
    GPIO.output(9,GPIO.LOW)

#===================================
#  五路循迹+碰撞检测
#===================================
'''
S1=15 #左1
S2= 4 #左2
S3=18 #中
S4=17 #右2
S5=27 #右1
CLP=23  #碰撞
NEAR=22 #测距

GPIO.setup(S1, GPIO.IN)
GPIO.setup(S2, GPIO.IN)
GPIO.setup(S3, GPIO.IN)
GPIO.setup(S4, GPIO.IN)
GPIO.setup(S5, GPIO.IN)
GPIO.setup(CLP, GPIO.IN)
GPIO.setup(NEAR, GPIO.IN)

def wulu():   #定义五路及碰撞检测
   SS=SS1=SS2=SS3=SS4=SS5=CLPCLP=0
   if GPIO.input(S1)==1:
       SS1=1
       print('    S1左1 检测到道路!')
   if GPIO.input(S2)==1:
       SS2=10
       print('    S2左2 检测到道路!')
   if GPIO.input(S3)==1:
       SS3=100      
       print('    S3中间 检测到道路!')
   if GPIO.input(S4)==1:
       SS4=1000       
       print('    S4右2 检测到道路!')
   if GPIO.input(S5)==1:
       SS5=10000       
       print('    S5右1 检测到道路!')
   if GPIO.input(CLP)==1:
       CLPCLP=100000       
       print('    CLP碰撞 发生碰撞!!!!!!')
   SS=SS1+SS2+SS3+SS4+SS5+CLPCLP  #返回值,目前本算法不太精确,正在改进中!!!
   #print(str(SS))
   return SS
'''

#===================================
#  电机
#===================================
INT1=5
INT2=6
INT3=13
INT4=19
GPIO.setup(INT1, GPIO.OUT)
GPIO.setup(INT2, GPIO.OUT)
GPIO.setup(INT3, GPIO.OUT)
GPIO.setup(INT4, GPIO.OUT)

pwm1 = GPIO.PWM(INT1, 500)    #引脚,频率
pwm2 = GPIO.PWM(INT2, 500)
pwm3 = GPIO.PWM(INT3, 500)
pwm4 = GPIO.PWM(INT4, 500)

pwm1.start(0)                    #启用PWM,初始占空比(范围:0.0 <= dc >= 100.0)
pwm2.start(0)
pwm3.start(0)
pwm4.start(0)

def car_back(speed):
    pwm1.ChangeDutyCycle(speed)
    pwm2.ChangeDutyCycle(0)
    pwm3.ChangeDutyCycle(speed)
    pwm4.ChangeDutyCycle(0)
 
def car_forward(speed):
    pwm1.ChangeDutyCycle(0)
    pwm2.ChangeDutyCycle(speed)
    pwm3.ChangeDutyCycle(0)
    pwm4.ChangeDutyCycle(speed)

def car_stop():
    pwm1.ChangeDutyCycle(0)      #更改占空比,0-100
    pwm2.ChangeDutyCycle(0)
    pwm3.ChangeDutyCycle(0)
    pwm4.ChangeDutyCycle(0)

def car_brake():                 #刹车
    pwm1.ChangeDutyCycle(100)
    pwm2.ChangeDutyCycle(100)
    pwm3.ChangeDutyCycle(100)
    pwm4.ChangeDutyCycle(100)    

#根据电机焊接和接入AB接口不同,调试时需要重新定义一下四个函数
#依次运行前进 倒车 右转 左转,看小车的实际行为
#根据实际行为,将以下函数重命名
def car_left(speed):
    pwm1.ChangeDutyCycle(speed)
    pwm2.ChangeDutyCycle(0)
    pwm3.ChangeDutyCycle(0)
    pwm4.ChangeDutyCycle(speed)
    
def car_right(speed):
    pwm1.ChangeDutyCycle(0)    
    pwm2.ChangeDutyCycle(speed)
    pwm3.ChangeDutyCycle(speed)
    pwm4.ChangeDutyCycle(0)

#===================================
#  LED屏幕
#===================================
CLK=15
DIO=14
led = tm1637.TM1637(clk=CLK, dio=DIO)  #实例化TM1637

GPIO.setup(CLK,GPIO.OUT)
GPIO.setup(DIO,GPIO.OUT)
GPIO.output(CLK,GPIO.HIGH)
GPIO.output(DIO,GPIO.HIGH)  


def led8888():
    #测试,全点亮
    led.show('8888', True)
    tm.sleep(1)

    #全灭4个空格
    led.show('    ')
    tm.sleep(1)

    #显示数字
    led.number(1234)
    tm.sleep(1)    

#===================================
#  hx1838遥控器
#===================================
hx1838_pin = 2;
GPIO.setup(hx1838_pin,GPIO.IN,GPIO.PUD_UP)
#print("等待中,请按下遥控器按钮...")

def ir_1838():
    ir_key=""
    if GPIO.input(hx1838_pin) == 0:
        count = 0
        while GPIO.input(hx1838_pin) == 0 and count < 200:
            count += 1
            time.sleep(0.00006)
        count = 0

        while GPIO.input(hx1838_pin) == 1 and count < 80:
            count += 1
            time.sleep(0.00006)
        
        idx = 0
        cnt = 0
        data = [0,0,0,0]
        for i in range(0,32):
            count = 0
            while GPIO.input(hx1838_pin) == 0 and count < 15:
                count += 1
                time.sleep(0.00006)

            count = 0
            while GPIO.input(hx1838_pin) == 1 and count < 40:
                count += 1
                time.sleep(0.00006)

            if count > 8:
                data[idx] |= 1<<cnt
            if cnt == 7:
                cnt = 0
                idx += 1
            else:
                cnt += 1

        if data[0]+data[1] == 0xFF and data[2]+data[3] == 0xFF:
            #print("Get the key: 0x%02x" %data[2])
            if  (data[2]==0x45):
                ir_key="1"
            elif(data[2]==0x46):
                ir_key="2"
            elif(data[2]==0x47):
                ir_key="3"
            elif(data[2]==0x44):
                ir_key="4"
            elif(data[2]==0x40):
                ir_key="5"
            elif(data[2]==0x43):
                ir_key="6"
            elif(data[2]==0x07):
                ir_key="7"
            elif(data[2]==0x15):
                ir_key="8"
            elif(data[2]==0x09):
                ir_key="9"
            elif(data[2]==0x16):
                ir_key="*"
            elif(data[2]==0x19):
                ir_key="0"
            elif(data[2]==0x0d):
                ir_key="#"
            elif(data[2]==0x18):
                ir_key="上"
            elif(data[2]==0x52):
                ir_key="下"
            elif(data[2]==0x08):
                ir_key="左"
            elif(data[2]==0x5a):
                ir_key="右"
            elif(data[2]==0x1c):
                ir_key="OK"
            print("检测到按键:  "+ir_key)
    return ir_key



#===================================
#===================================
# 主程序开始!!!!!
#===================================
#===================================
i=1 #循环次数
juli  =0 #超声波距离 前方
juli_l=0 #超声波距离 左方
juli_r=0 #超声波距离 右方
speed=35 #默认电机速度
#daolu=0 #返回的道路值
#led.scroll('Jia Hao 2020') # 4 fps


#==============================
# 遥控器遥控+超声波自动避障 主程序
#==============================
try:
    while True:
        #print('第  '+str(i)+'  次开始....................')

        juli = chaoshengbo()

        ir_key=ir_1838()
        
        if ir_key=="左" :
            led_left()
            car_left(speed)
            time.sleep(15/speed)
            led_mie()
        elif ir_key=="右" :
            led_right()            
            car_right(speed)            
            time.sleep(15/speed)
            led_mie()
        elif ir_key=='1' or ir_key=='2' or ir_key=='3' or ir_key=='4' or ir_key=='5' or ir_key=='6' or ir_key=='7' or ir_key=='8' or ir_key=='9':
            speed=int(ir_key)*10
            led.number(speed)      #在LED屏幕显内容
            
        elif ir_key=="下":
            led_liang()
            car_back(speed)
            time.sleep(speed/30)                        
            led_mie()
        elif juli< speed*1.5:
            led_liang()
            car_back(speed)
            time.sleep(30/speed)
            
            juli_l = chaoshengbo_l()
            #led.number(round(juli_l))      #在LED屏幕显内容            
            juli_r = chaoshengbo_r()
            #led.number(round(juli_r))      #在LED屏幕显内容
            
            if juli_l>=juli_r:
                led_left()
                car_left(speed)
                time.sleep(25/speed)                
            else:
                led_right()
                car_right(speed)
                time.sleep(25/speed)
            led_mie()            

        elif ir_key=="0"  or ir_key=="OK"  :            
            car_stop()
            led.show('STOP', True)
            time.sleep(2)            
            for s in range(10,-1,-1):
                led.numbers(0, s)
                time.sleep(1)
                

        car_forward(speed)                

        led.number(round(juli))      #在LED屏幕显内容    
        #循环的次数+1
        #i=i+1
        #time.sleep(0.01)

#==============================

except KeyboardInterrupt:
    GPIO.cleanup()
    print('KeyboardInterrupt 程序被人为中止....')
finally:
    GPIO.cleanup()
    print('Exit 程序共运行了'+str(i)+'次,程序结束。')

============
下面这个版本,
树莓派+超声波+舵机+转向灯+LED4位数字屏幕 +LCD1602液晶屏+HX1838红外遥控
2020.09.20
===========

IMG_20200915_220103.jpg
#===================================
# 树莓派+超声波+舵机+转向灯+LED4位数字屏幕 +LCD1602液晶屏+HX1838红外遥控
#  2020.09.20  我开心
#===================================
try:
    import RPi.GPIO as GPIO
    import time
    import tm1637              #请保证tm1637.py已复制到当前目录下
    import LCD1602 as LCD #请保证LCD1602.py已复制到当前目录下
    import smbus    
except RuntimeError:
    print(" import 引入错误 ... ")


GPIO.setmode(GPIO.BCM)
GPIO.setwarnings(False)  #关闭警告

#===================================
#  红绿灯
#===================================
#红绿灯-左
led_list_left =[17,27,22]  #红R 黄Y 绿G
#红绿灯-右
led_list_right=[21,26,20]  #红R 黄Y 绿G

GPIO.setup(led_list_left , GPIO.OUT, initial=GPIO.LOW)
GPIO.setup(led_list_right, GPIO.OUT, initial=GPIO.LOW)

def led_liang():   #定义函数 LED所有灯常亮
    for led in led_list_left:
        GPIO.output(led, GPIO.HIGH)
    for led in led_list_right:
        GPIO.output(led, GPIO.HIGH)

def led_mie():   #定义函数 LED所有灯常灭
    for led in led_list_left:
        GPIO.output(led, GPIO.LOW)
    for led in led_list_right:
        GPIO.output(led, GPIO.LOW)

def led_left():  #定义函数 LED 左转流水灯
    led_mie()
    for led in led_list_left:
        GPIO.output(led, GPIO.LOW)
        time.sleep(0.05)
        GPIO.output(led, GPIO.HIGH)
        time.sleep(0.05)

def led_right():  #定义函数 LED 右转流水灯
    led_mie()
    for led in led_list_right:
        GPIO.output(led, GPIO.LOW)
        time.sleep(0.05)
        GPIO.output(led, GPIO.HIGH)
        time.sleep(0.05)

#===================================
#  超声波 前面
#===================================        
pin_trig=24 #send-pin
pin_echo=25 #receive-pin
GPIO.setup(pin_trig,GPIO.OUT,initial=GPIO.LOW)
GPIO.setup(pin_echo,GPIO.IN)

def chaoshengbo():  #定义函数
    #send
    GPIO.output(pin_trig,True)
    time.sleep(0.00011) #1us
    GPIO.output(pin_trig,False)
    #start recording
    while GPIO.input(pin_echo)==0:
        pass
    start=time.time()
    #end recording
    while GPIO.input(pin_echo)==1:
        pass
    end=time.time()
 
    #compute distance
    distance=round((end-start)*343/2*100,2)
    #print('距离前方:{0}cm'.format(distance))
    return distance


#===================================
#  电机
#===================================
pin_INT1=5
pin_INT2=6
pin_INT3=13
pin_INT4=19
GPIO.setup(pin_INT1, GPIO.OUT)
GPIO.setup(pin_INT2, GPIO.OUT)
GPIO.setup(pin_INT3, GPIO.OUT)
GPIO.setup(pin_INT4, GPIO.OUT)

pwm1 = GPIO.PWM(pin_INT1, 500)    #引脚,频率
pwm2 = GPIO.PWM(pin_INT2, 500)
pwm3 = GPIO.PWM(pin_INT3, 500)
pwm4 = GPIO.PWM(pin_INT4, 500)

pwm1.start(0)                    #启用PWM,初始占空比(范围:0.0 <= dc >= 100.0)
pwm2.start(0)
pwm3.start(0)
pwm4.start(0)

def car_back(speed):
    pwm1.ChangeDutyCycle(speed)
    pwm2.ChangeDutyCycle(0)
    pwm3.ChangeDutyCycle(speed)
    pwm4.ChangeDutyCycle(0)
 
def car_forward(speed):
    pwm1.ChangeDutyCycle(0)
    pwm2.ChangeDutyCycle(speed)
    pwm3.ChangeDutyCycle(0)
    pwm4.ChangeDutyCycle(speed)

def car_stop():
    pwm1.ChangeDutyCycle(0)      #更改占空比,0-100
    pwm2.ChangeDutyCycle(0)
    pwm3.ChangeDutyCycle(0)
    pwm4.ChangeDutyCycle(0)

def car_brake():                 #刹车
    pwm1.ChangeDutyCycle(100)
    pwm2.ChangeDutyCycle(100)
    pwm3.ChangeDutyCycle(100)
    pwm4.ChangeDutyCycle(100)    

#根据电机焊接和接入AB接口不同,调试时需要重新定义一下四个函数
#依次运行前进 倒车 右转 左转,看小车的实际行为
#根据实际行为,将以下函数重命名
def car_left(speed):
    pwm1.ChangeDutyCycle(speed)
    pwm2.ChangeDutyCycle(0)
    pwm3.ChangeDutyCycle(0)
    pwm4.ChangeDutyCycle(speed)
    
def car_right(speed):
    pwm1.ChangeDutyCycle(0)    
    pwm2.ChangeDutyCycle(speed)
    pwm3.ChangeDutyCycle(speed)
    pwm4.ChangeDutyCycle(0)

#===================================
#  LED屏幕
#===================================
pin_CLK=15
pin_DIO=14
led = tm1637.TM1637(clk=pin_CLK, dio=pin_DIO)  #实例化TM1637

GPIO.setup(pin_CLK,GPIO.OUT)
GPIO.setup(pin_DIO,GPIO.OUT)
GPIO.output(pin_CLK,GPIO.HIGH)
GPIO.output(pin_DIO,GPIO.HIGH)  


def led8888():
    #测试,全点亮
    led.show('8888', True)
    tm.sleep(1)
    #全灭4个空格
    led.show('    ')
    tm.sleep(1)
    #显示数字
    led.number(1234)
    tm.sleep(1)

#===================================
#  LCD1602 液晶屏
#===================================
def lcd1602_init():
    LCD.init_lcd()
    time.sleep(0.2)
    LCD.print_lcd(1,0,'Li Jiahao 2020')
    LCD.print_lcd(1,1,'  My Car-001')
    LCD.turn_light(1)    
    time.sleep(2)
    LCD.clear_lcd()

#===================================
#  hx1838遥控器
#===================================
pin_hx1838 = 23;
#GPIO.setup(pin_hx1838,GPIO.IN,GPIO.PUD_UP)
GPIO.setup(pin_hx1838, GPIO.IN,  pull_up_down = GPIO.PUD_UP)
GPIO.add_event_detect(pin_hx1838, GPIO.FALLING,  bouncetime = 200)
print("等待中,请按下遥控器按钮...")

def ir_1838(pin_hx1838):
    global ir_key
    ir_key=""
    if GPIO.input(pin_hx1838) == 0:
        count = 0
        while GPIO.input(pin_hx1838) == 0 and count < 200:
            count += 1
            time.sleep(0.00006)
        count = 0

        while GPIO.input(pin_hx1838) == 1 and count < 80:
            count += 1
            time.sleep(0.00006)
        
        idx = 0
        cnt = 0
        data = [0,0,0,0]
        for i in range(0,32):
            count = 0
            while GPIO.input(pin_hx1838) == 0 and count < 15:
                count += 1
                time.sleep(0.00006)

            count = 0
            while GPIO.input(pin_hx1838) == 1 and count < 40:
                count += 1
                time.sleep(0.00006)

            if count > 8:
                data[idx] |= 1<<cnt
            if cnt == 7:
                cnt = 0
                idx += 1
            else:
                cnt += 1

        if data[0]+data[1] == 0xFF and data[2]+data[3] == 0xFF:
            #print("Get the key: 0x%02x" %data[2])
            if  (data[2]==0x45):
                ir_key="1"
            elif(data[2]==0x46):
                ir_key="2"
            elif(data[2]==0x47):
                ir_key="3"
            elif(data[2]==0x44):
                ir_key="4"
            elif(data[2]==0x40):
                ir_key="5"
            elif(data[2]==0x43):
                ir_key="6"
            elif(data[2]==0x07):
                ir_key="7"
            elif(data[2]==0x15):
                ir_key="8"
            elif(data[2]==0x09):
                ir_key="9"
            elif(data[2]==0x16):
                ir_key="*"
            elif(data[2]==0x19):
                ir_key="0"
            elif(data[2]==0x0d):
                ir_key="#"
            elif(data[2]==0x18):
                ir_key="上"
            elif(data[2]==0x52):
                ir_key="下"                
            elif(data[2]==0x08):
                ir_key="左"                
            elif(data[2]==0x5a):
                ir_key="右"                
            elif(data[2]==0x1c):
                ir_key="OK"                
            print("检测到按键:  "+ir_key)
            return ir_key


#===================================
#  s90舵机
#===================================
#暗灰GND、红色VCC 4.8-7.2V 一般用5V、  橙黄线:脉冲输入
pin_s90 = 18
GPIO.setup(pin_s90, GPIO.OUT)
# 初始化PWM
s90_pwm = GPIO.PWM(pin_s90, 50)
s90_pwm.start(0)

def s90(angle):   # 定义函数,输入角度,即可自动转向,0-180度,如0、90、180
    s90_pwm.ChangeDutyCycle(2.5+angle/360*20)

'''
    #开始角度测试:
    s90(90)
    time.sleep(2)

    s90(180)
    time.sleep(2)

    s90(0)
    time.sleep(2)
'''
# 释放资源
#s90_pwm.stop()
#gpio.cleanup()





#===================================
#===================================
# 主程序开始!!!!!
#===================================
#===================================
i=1 #循环次数
juli  =0 #超声波距离 前方
speed=35 #默认电机速度

ir_key=""
GPIO.add_event_callback(pin_hx1838, ir_1838)  #开始运行ir_1838(), 以便随时响应遥控器按键

lcd1602_init()
s90(90)
LCD.print_lcd(7,0,"Speed:35%")


try:
    while True:
        juli = chaoshengbo()
        print('第  '+str(i)+'  次开始...       距离前方:'+str(juli)+str(ir_key))
        
        led.number(round(juli))      #在LED屏幕显内容(前方距离)
        LCD.print_lcd(0,1," "*16)                   #清理LCD屏幕内容
        LCD.print_lcd(5,1,str(round(juli))+"cm")    #在LCD屏幕显内容(前方距离 xxx cm)
        

        #ir_key=ir_1838()    #红外遥控器检测
        if ir_key=="左" :
            led_left()
            car_left(speed)
            time.sleep(15/speed)            
            led_mie()
        elif ir_key=="右" :
            led_right()            
            car_right(speed)            
            time.sleep(15/speed)
            led_mie()
        elif ir_key=='1' or ir_key=='2' or ir_key=='3' or ir_key=='4' or ir_key=='5' or ir_key=='6' or ir_key=='7' or ir_key=='8' or ir_key=='9':
            speed=int(ir_key)*10
            #led.number(speed)                       #在LED屏幕显内容
            LCD.print_lcd(0,0," "*16)                #清理LCD屏幕内容
            LCD.print_lcd(7,0,"Speed:"+str(speed)+"%")   #在LCD屏幕显内容(当前速度 xx%)
        elif ir_key=="下":
            led_liang()
            car_back(speed)
            time.sleep(10/speed)                        
            led_mie()
        elif ir_key=="0"  or ir_key=="OK"  :            
            car_stop()
            led.show('STOP', True)
            LCD.print_lcd(8,0,"--STOP--")
            time.sleep(2)            
            for s in range(10,-1,-1):
                led.numbers(0, s)
                time.sleep(1)
            LCD.print_lcd(8,0,"Speed:"+str(speed))                
            
        if juli< speed*1.5:    #根据前方距离,正常速度下,如果距离小于约50厘米,则开始准备停车和倒退
            led_liang()
            car_back(speed)
            time.sleep(10/speed)
            
            #舵机转向左边,并检测左边距离
            s90(180)
            time.sleep(0.5)
            juli_l = chaoshengbo()
            print('   距离左方:'+str(juli_l))           
            led.number(round(juli_l))
            LCD.print_lcd(0,1," "*16)
            LCD.print_lcd(0,1,str(round(juli_l))+"cm")
            
            #舵机转向右边,并检测右边距离             
            s90(0)
            time.sleep(0.5)
            juli_r = chaoshengbo()
            print('   距离右方:'+str(juli_r))            
            led.number(round(juli_r))
            LCD.print_lcd(8,1,str(round(juli_r))+"cm")

            #舵机恢复面向前方
            s90(90)
            time.sleep(0.5)
            
            #根据左右距离,判断应该向哪边转向(哪边距离大,就向哪边转)
            if juli_l>=juli_r:
                print('   <---向左转弯')
                led_left()
                car_left(speed)
                time.sleep(25/speed)                
            else:
                led_right()
                print('   向右转弯--->')
                car_right(speed)
                time.sleep(25/speed)
            led_mie()

        # 正常情况下(没有按下遥控器,并且前方没有障碍),一直向前行驶
        car_forward(speed)
        
        #循环的次数+1
        i=i+1
        LCD.print_lcd(0,0,str(i))
        time.sleep(0.01)

#==============================
except KeyboardInterrupt:
    s90_pwm.stop()
    GPIO.cleanup()
    print('KeyboardInterrupt 程序被人为中止....')
finally:
    s90_pwm.stop()
    GPIO.cleanup()
    print('Exit 程序共运行了'+str(i)+'次,程序结束。')

相关文章

网友评论

      本文标题:树莓派+智能小车+L298N直流驱动模块+S90舵机+1602液

      本文链接:https://www.haomeiwen.com/subject/ltfbektx.html