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

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

TB6612
在这里插入图片描述
L298N
在这里插入图片描述
JY901
在这里插入图片描述
编码器电机
在这里插入图片描述
接线部分L298N与TB6612并无太大的差异,在CSDN上均能够找到。编码器电机在调速度环的时候需要插上并且用于测量脉冲值。而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语言)

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

  • 4
    点赞
  • 25
    收藏
    觉得还不错? 一键收藏
  • 7
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值