树莓派与arduino串口通信

上次内容树莓派与arduino之间是通过USB进行通信的,这次内容是如何通过串口进行通信。
参考文章:http://ukonline2000.com/?p=880

一、背景介绍

根据官方的反馈和回复,我们了解到树莓派3上用户目前无法正常是使用GPIO中的UART串口(GPIO14&GPIO15),也就是说用户无论是想用串口来调试树莓派,还是想用GPIO中的串口来连接GPS,蓝牙,XBEE等等串口外设目前都是有问题的。

原因是树莓派CPU内部有两个串口,一个是硬件串口(官方称为PL011 UART),一个是迷你串口(官方成为mini-uart)。在树莓派2B/B+这些老版树莓派上,官方设计时都是将“硬件串口”分配给GPIO中的UART(GPIO14&GPIO15),因此可以独立调整串口的速率和模式。而树莓派3的设计上,官方在设计时将硬件串口分配给了新增的蓝牙模块上,而将一个没有时钟源,必须由内核提供时钟参考源的“迷你串口”分配给了GPIO的串口,这样以来由于内核的频率本身是变化的,就会导致“迷你串口”的速率不稳定,这样就出现了无法正常使用的情况。

目前解决方法就是,关闭蓝牙对硬件串口的使用,将硬件串口重新恢复给GPIO的串口使用,也就意味着树莓派3的板载蓝牙和串口,现在成了鱼和熊掌,两者无法兼得。

二、串口功能恢复

1.下载pi3-miniuart-bt-overlay文件,解压出pi3-miniuart-bt-overlay.dtb文件,并将dtb文件拷贝到/boot/overlays/目录下
在这里插入图片描述
如果直接复制,可能会显示以上错误提示,原因是因为我们没有管理员权限,导致权限不够。
首先开通root权限,首次登录输入su root,再次登录的话输入sudo passwd root

su root
sudo passwd root

然后会让设置并确认密码
在这里插入图片描述
确认正确后登录root权限,我们会看到命令行变成root@raspberrypi:/home/pi#
在这里插入图片描述
然后通过文件转移命令将解压的文件放入到要求的文件夹中

mv /home/pi/Downloads/pi3-miniuart-bt-overlay.dtb /boot/overlays

我们通过ls命令查看,会看到在overlays文件夹里有mv /home/pi/Downloads/pi3-miniuart-bt-overlay.dtb /boot/overlays
在这里插入图片描述
2.编辑/boot目录下的config.txt文件

sudo nano /boot/config.txt

添加下面两行,保存退出

dtoverlay=pi3-miniuart-bt-overlay
force_turbo=1

在这里插入图片描述
3.编辑/boot目录下的cmdline.txt文件

sudo nano /boot/cmdline.txt

参考下面内容修改:

dwc_otg.lpm_enable=0 console=serial1,115200  console=tty1 root=/dev/mmcblk0p2  kgdboc=serial1,115200 rootfstype=ext4 elevator=deadline fsck.repair=yes  rootwait

保存退出

三、关闭板载蓝牙

1.SSH登录树莓派3后,输入下面命令关闭hciuart使用uart0.

sudo systemctl disable hciuart

2.编辑/lib/systemd/system/hciuart.server 将 “ttyAMA0”修改为“ttyS0”

sudo nano /lib/systemd/system/hciuart.service

将 “ttyAMA0”修改为“ttyS0”
在这里插入图片描述
保存退出(注:这里的我修改完之后,有自动的被修改回来成了dev-serial1.device,应该是系统自己修改的,我们修改完不需要动他就行了)

3.更新并重启

sudo apt-get update
sudo apt-get upgrade
sudo reboot

四、程序测试

1、创建一个测试程序

sudo nano text.py
# -*- coding: UTF-8 -*-
import serial

ser = serial.Serial('/dev/ttyAMA0',9600,timeout=1)

while 1:
        res = raw_input()
        if res == "q" or res == "Q":
                ser.write('1')
        elif res == "w" or res == "W":
                ser.write('f')
        elif res == "e" or res == "E":
                ser.write('3')
        elif res == "a" or res == "A":
                ser.write('l')
        elif res == "s" or res == "S":
                ser.write('5')
        elif res == "d" or res == "D":
                ser.write('r')
        elif res == "z" or res == "Z":
                ser.write('7')
        elif res == "x" or res == "X":
                ser.write('b')
        elif res == "c" or res == "C":
                ser.write('9')

对应的arduino小车接收相应字符串做出相应动作即可

  • 5
    点赞
  • 28
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值