• 发文
  • 评论
  • 微博
  • 空间
  • 微信

自制Raspberry Pi 两轮自平衡车

易心STEAM编程 2018-12-17 15:16 发文

本文将介绍如何利用Raspberry Pi自行制作一台两轮自平衡车(segway)。

硬件需求

•Raspberry Pi + 外壳 + WiFi网卡。请自行先刻录并安装 Raspbian 操作系统来开机。WiFi网卡是edimax的, 安装方法不另赘述

•DC motors + 轮胎 + 车架 + 压克力板 + 铜柱

•L293D IC 马达驱动IC

•MPU6050六轴传感器

机构组装

安装车体, 包括L架, 马达, 轮胎, 最后把压克力板还有铜柱都装上去。装完以后的样子如下图.

安装线路

开始插面包板

这里简单说明一下电路,MPU6050模块是使用I2C接口,有四根线需要接上Raspberry Pi 的 GPIO脚位,分别是:

Vcc –> RPi GPIO header pin#1 (3.3V),

 SDA–> RPi GPIO header pin#3 (SDA)

 SCL–> RPI GPIO header pin#5 (SCL)

 GND–> RPi GPIO header pin#6 (GND)

关于马达的部分,我使用常见的L293D 驱动IC。

GPIO header pin#11, pin#13, pin#15 控制左轮, 接到L293D的pin#2,pin#7, pin#1

 GPIOheader pin#16, pin#18, pin#22 控制右轮, 接到L293D的pin#15, pin#10, pin#9

 L293D的pin#3, pin#6接左轮马达

L293D的pin#14, pin#11 接右轮马达

Vs 接 12V DC

 Vss 接 5V DC

 (Vs& Vss 这两只脚不要搞混)

还有就是 L293D 需要有够高的电压来源才能驱动马达,我的做法是买一个 12V DC 1A 变压器,再配一个转接头再接上面包板,这样才能供应 L293D 的 Vs (pin#8)。

还要注意一点就是,请把车体前后的接线整理固定好,因为后面做平衡调校测试的时候一定会摔车好多次,前后的线路就是首当其冲, 最好都用束线带绑好。全部都固定完毕的样子

软件部份

这里我们要搞定I2C, 并且使用wiringPi函式库。它有基本GPIO功能又支持I2C 读取MPU6050数据,还有SoftPWM 功能可以控制DC motors转速,真是一举数得。

安装步骤如下

先安装i2c driver.

$ sudo apt-get install libi2c-dev

设定下次开机要启动 i2c driver,

$ sudo vi /etc/modules

增加以下两行到里面, 储存.

i2c-bcm2708

 i2c-dev

有一个blacklist档案要检查

$ sudo vi /etc/modprobe.d/raspi-blacklist.conf

确认里面没有以下两行, 如果有出现, 请在前面都加上#符号 (也就是把他comment掉), 储存.

#blacklist spi-bcm2708

 #blacklist i2c-bcm2708

然后Pi要重新启动

$ sudo bash; sync;sync;reboot

开机回来后, 要确认i2c driver kernel module 有正常启动

$ lsmod |grep i2c

 i2c_dev                 6027  0

 i2c_bcm2708             4990  0

安装 git

 $sudo apt-get install git-core

下载并安装 wiringPi

$ cd

 $git clone git://git.drogon.net/wiringPi

 $ cdwiringPi

 $sudo ./build

测试MPU6050

先安装测试工具

$ sudo apt-get install i2c-tools

执行这个工具测试 i2c bus上是否有看到MPU6050.

$ sudo i2cdetect -y 0 (for a Revision 1board)

 or

 $sudo i2cdetect -y 1 (for a Revision 2 board)

如果看到以下输出…注意那个”68″, 就表示已经正常抓到MPU6050了.

 0 1  2  3 4  5  6 7  8  9 a  b  c d  e  f

00:         — — — — — — — — — — — — —

10: — — — — — — — — — — — — — — — —

20: — — — — — — — — — — — — — — — —

30: — — — — — — — — — — — — — — — —

40: — — — — — — — — — — — — — — — —

50: — — — — — — — — — — — — — — — —

60: — — — — — — — — 68 — — — — — — —

70: — — — — — — — —

再来我们要下载测试程序尝试抓取加速度计(accelerometer) & 陀螺仪(gyroscope meter)数据.

下载测试程序, 并编译

$ cd

 $git clone https://github.com/wennycooper/mpu6050_in_c.git

 $ cdmpu6050_in_c

 $cat README.md

$ gcc -o mpu6050_accl ./mpu6050_accl.c  -lwiringPi -lpthread -lm

 $gcc -o mpu6050_gyro ./mpu6050_gyro.c -lwiringPi -lpthread -lm

现在来看看加速度的数据, 请执行以下程序:

$ sudo ./mpu6050_accl

应该要看到X, Y, Z 加速度数据, 如下:

My acclX_scaled: 0.140625

 MyacclY_scaled: -0.031006

 MyacclZ_scaled: 0.994141

 My Xrotation: -1.768799

 My Yrotation: -8.047429

其中 acclX, acclY, acclZ 是三轴加速度数据

(单位是g, 没错! 就是物理课本上面的重力加速度 g=9.8m/s^2)

 MyX/Y rotation 是换算出来的角度 (单位是 degree).

请试着将车体前倾或后仰, 看看数据的变化.

如果您安装MPU6050 的方向正确的话, 车体前倾或后仰应该会看到 Y rotation 介于 -90度 ~ 90度.

再来看看陀螺仪的数据, 请执行以下程序:

$ sudo ./mpu6050_gyro

应该要看到X, Y, Z轴的角速度, 单位是 degree/s

 MygyroZ_scaled: -1.954198

 MygyroX_scaled: -4.312977

 MygyroY_scaled: 0.458015

 MygyroZ_scaled: 0.366412

 MygyroX_scaled: -4.053435

 MygyroY_scaled: 0.427481

 MygyroZ_scaled: -0.160305

请尝试着观察转动瞬间与数据的变化, 就会理解陀螺仪数据了。这里说明一下,单纯用上面那个加速度计不就可以推算出倾斜角度不是吗? 为何需要用到陀螺仪数据呢?主要是因为加速度数据很容易浮动, 后来有人发明了使用陀螺仪数据再补上加速度数据的方法, 这样就能算出比较稳定可靠的倾斜角度这套方法叫做“complementary filter”.

测试DC motors

现在我们用 wiringPi 写一个程序测试 DC motors.

$ cd

 $git cl,one https://github.com/wennycooper/dcMotor.git

 $ cddcMotor

 $cat README.md

$ gcc -o dcMotor0 dcMotor0.c -lwiringPi-lpthread

准备要让马达转啰!! 请确认12V电源有正常插上, 并把车体用手拿起来, 执行程序!!

$ sudo ./dcMotor0

如何?? 正常的话两个马达应该正转5秒钟, 再反转5秒钟, 最后停止.

马达如果没有转, 表示前面步骤执行有错, 请回头去检查.

如果有转, 请确认两个马达都有转同样方向, 如果反向, 请把一个马达接脚两根交换, 应该可以改善.

还要注意一点, 您的两个马达都有转得很“够快”吗??

如果转得很慢, 比方说每秒钟大约才2转, 很有可能是L293D 的部分接线有问题, 请回头再确认!!

转速太慢可能会造成车体倾斜时马达来不及将车体导正, 这样就无法平衡了.

最后整合

将上面所有的程序代码全部整合到一起!!

Github上的参考代码在这里

https://github.com/wennycooper/mpu6050_in_c

下载并编译最后这套两轮自平衡车控制程序.

$ cd

 $git clone https://github.com/wennycooper/mySegway.git

 $ cdmySegway

 $gcc -o mySegway ./mySegway.c ./motors.c -lwiringPi -lpthread -lm

这程序会根据测到的数据, 努力保持车体平衡.

如果倾斜角度过大(>60度), 会自动让马达停止.

执行

由于每一台车体平衡角度不一样, 本程序开始执行的时候是假设车体已平衡, 并取出当下角度作为基准点, 再努力透过马达运作努力保持角度。这意思是说: “程序启动瞬间请保持车体平衡”

有一点点难度,我的做法是左手放车子到地面,扶着它尽量保持车体平衡,然后平衡瞬间右手敲键盘执行程序。以下是结果录像

作者:马岗阿文

更多精彩文章请关注微信公众号‍易心Microbit编程

声明:本文为OFweek维科号作者发布,不代表OFweek维科号立场。如有侵权或其他问题,请及时联系我们举报。
2
评论

评论

    相关阅读

    暂无数据

    易心STEAM编程

    分享STEAM教育课程内容,生态...

    举报文章问题

    ×
    • 营销广告
    • 重复、旧闻
    • 格式问题
    • 低俗
    • 标题夸张
    • 与事实不符
    • 疑似抄袭
    • 我有话要说
    确定 取消

    举报评论问题

    ×
    • 淫秽色情
    • 营销广告
    • 恶意攻击谩骂
    • 我要吐槽
    确定 取消

    用户登录×

    请输入用户名/手机/邮箱

    请输入密码