基于树莓派(python)的平衡小车

目前普遍是STM32或者51来实现平衡小车,基于树莓派的平衡小车少见(因为树莓派适合用于数据处理)但有部分同学的毕设选择了用树莓派来做平衡小车的,接下来分享一下基于树莓派的平衡小车如何完成。 驱动:L298N或者TB6612都可。 陀螺仪:JY901(自带滤波)比6050好一点 python再加滤波就看着烦了 电机:建议用大扭矩的即1秒1转或者1秒2 3转的编码器电机 太大不好控制

TB6612 L298N JY901 编码器电机 接线部分L298N与TB6612并无太大的差异,在上均能够找到。编码器电机在调速度环的时候需要插上并且用于测量脉冲值。而JY901与树莓派进行IIC通信,即只需要插SDA SCL VCC GND 即可 下面附上一张树莓派的引脚 前期准备工作之后,进行硬件的组装,我所组装的样子如图所示 因为所使用的是python,用来控制硬件并不是那么的方便。引脚需要进行导入GPIO库(自行下载)

GPIO.setmode(GPIO.BCM) GPIO.setup(16,GPIO.OUT) GPIO.setup(21,GPIO.OUT) GPIO.setup(20,GPIO.OUT)

GPIO.setup(13,GPIO.OUT) GPIO.setup(19,GPIO.OUT) GPIO.setup(26,GPIO.OUT) 引脚初始化,用于输出pwm与正负极控制移动。

pwm = GPIO.PWM(16,25) pwm2 = GPIO.PWM(13,25)

后续初始化编码器 GPIO.setup(A1, GPIO.IN, pull_up_down=GPIO.PUD_UP) GPIO.setup(B1, GPIO.IN, pull_up_down=GPIO.PUD_UP) GPIO.setup(A2, GPIO.IN, pull_up_down=GPIO.PUD_UP) GPIO.setup(B2, GPIO.IN, pull_up_down=GPIO.PUD_UP) encoder_left = 0 encoder_right = 0 A1 = 24 B1 = 23 A2 = 6 B2 = 5

后续需要编码器计算脉冲 def my_callback1(channel): #huitiao global encoder_left if GPIO.input(A1): #A1 B1 if not GPIO.input(B1): encoder_left += 1 elif GPIO.input(B1): encoder_left -= 1 #print(encoder_left)

def my_callback2(channel): global encoder_right if GPIO.input(A2): #A2 B2 if not GPIO.input(B2): encoder_right += 1 elif GPIO.input(B2): encoder_right -= 1 #print(encoder_right) #encoder shuliang weichuli

GPIO.add_event_detect(A1, GPIO.RISING, callback=my_callback1)#chufatiaojian GPIO.add_event_detect(A2, GPIO.RISING, callback=my_callback2)#chufatiaojian

这里编码器只是进行了脉冲数量的计数,这个值是累加的,需要对这个值进行处理,不然轮子转速会越来越大。即采取定时中断的方法,让树莓派在50ms的时间就进行一次计算并且将编码器的数值清0.目前网上的教程大部分都是只有教到轮询法,并没有进一步对编码器脉冲数处理的教程。 timer_interval = 0.05 encoder_left = 0 encoder_right = 0 def timerDelay(): global encoder_left global encoder_right #print(encoder_left) global t t=Timer(timer_interval,timerDelay) t.start()

encoder_left=0
#print(encoder_left)
encoder_right=0

t=Timer(timer_interval,timerDelay) t.start() #sofe time

因编码器会存在跳值的现象,若不处理会导致数据错误然后轮子跑飞,因此需要在执行函数再加入一个低通滤波器,用于抑制编码器的值跳动。 EK_speed = left-(encoder_left + encoder_right) #suduhuan EK_speed2*=0.3 EK_speed2+=EK_speed*0.1 #lvbo

到这里之后,电机以及编码器都处理完成,即到陀螺仪部分,因自带滤波,可以不再用卡尔曼滤波进行数据处理,可以参考官方的JY901例程。能够直接得到数值。

最后是PID算法。如果只是让车平衡,我所采取的是直立环并速度环的方法。先对直立环进行调试,在能够来回振荡之后对直立环进行关闭处理,单独调试速度环进行极性测试。即只给速度环的i,手向一边拧动之后,另一个轮子向拧动方向旋转则是正确的极性,反之错误。确定极性之后便可以开始调车了。因每个人熟悉的PID算法不同,因此PID就不放出来啦,最后看看实际效果

基于树莓派的自平衡小车(python语言)

基于树莓派的自平衡小车(python语言)

如果有需要源码的进行私聊,看到会进行回复,有其他关于单片机或者树莓派的项目也可进行交流。

经验分享 程序员 微信小程序 职场和发展