原作于1年半前.

树莓派既有引出串口, IO口, 又有USB, 所以可以有很多种方法连接TFmini(北醒光子的一款Lidar):

  • 树莓派引出串口(RXD0和TXD0)
  • USB转串口(CP2102, CH341…)
  • 其他引出IO口模拟串口(通过pigpio等)

终端输入 ls /dev ,树莓派3串口的识别关系如下(可能有出入?):

外设 树莓派(/dev/)
硬件串口 ttyAMA0
软件串口 ttyS0
Arduino ttyACM0, ttyACM1…
USB转串口(CP2102, CH341…) ttyUSB0, ttyUSB1…

树莓派3自带硬件串口(PL011)和软件串口(mini UART), 硬件串口默认连接蓝牙BT, 引出串口(RXD0和TXD0)默认也是关闭的, 可软件配置硬件串口不和蓝牙相连, 引出串口可配置连接硬件串口还是软件串口.

硬件串口精度高, 配置全, 连接TFmini甚至可能不需要校验. 软件串口连接TFmini校验不能少. 模拟串口精度可能更差, 除了校验, 最好加上阈值判定来保证数值正确性.

编程语言上, 参考 RPi GPIO Code Samples 来看, C, C#, Ruby, Python, Java…各种语言应该都是可以的. 这里我们选择Python作为例子. 有其他需求可以在issues里面提.

安装和配置Raspbian

已经安装和配置好树莓派系统的略过本节.

下载树莓派的系统: Raspbian, 这里选的是 RASPBIAN STRETCH WITH DESKTOP, 下载Torrent, 然后用百度云离线下载, 一般会瞬间完成, 然后在开始下载, 非会员的可以用每天的免费加速, 一般很快就可以下完. 下完后是.zip, 解压出里面的.img文件.

下载 Etcher, 用于把上面下载的系统烧录到SD/TF卡, 这是官方文档 INSTALLING OPERATING SYSTEM IMAGES推荐的烧录方式. 这里选的是Class 10, 32GB的TF卡, 用读卡器连到电脑上, 打开Etcher, 选择上面的 .img文件, 然后选择TF卡, 最后烧录, 几分钟后就完成了, 完成后插到树莓派上即可.

新系统坑的一匹, SSH默认关闭, 硬件串口默认连接BT, 调试串口默认关闭?(默认不会通过引出串口输出Linux调试信息?), 不连显示器还真不知道怎么搞了…

接上显示器, 鼠标, 键盘. 上电, 进入系统.

点击上面任务栏的蓝牙图标, 关闭蓝牙.

连上WiFi, 打开终端, 输入:

sudo raspi-config

选择 5. Interfacing-Options -> P2 SSH -> Yes, 使能SSH.

选择 5. Interfacing-Options -> P3 VNC -> Yes, 使能VNC, 这个可以远程图形界面.

选择 5. Interfacing-Options -> P6 Serial -> Yes, 使能串口.

这样就可以把 借来的读卡器/网线/鼠标/键盘/显示器/HDMI线一大堆东西还回去了. 至于树莓派, 放到小车上, 飞行器上, 办公室/实验室其他地方都是可以的, 只要同一个局域网的WiFi覆盖到就可以.

然后我们就可以在电脑上通过 SSH/VNC/串口 的任意一种连接树莓派3了, 这里我们选择SSH, 所以首先要获取树莓派的IP地址.

登录路由器(默认192.168.1.1), 或者使用 Angry IP Scanner, 查找 raspberrypi 的IP, 默认应该在 192.168.1.1~192.168.1.255 之间. 我这里是192.168.1.231.

打开 PuTTY, 使用SSH连接, 输入IP, 端口22, open, 第一次会弹出PuTTY Security Alert, 根据提示选择Yes. 用户名 pi, 密码 raspberry:

先更新/升级点东西:

sudo apt-get update && sudo apt-get upgrade -y
sudo rpi-update
sudo reboot

重启后重新连接SSH(IP地址可能会变).

如果连接串口的话, 可能就会看到引出串口打印一些类似下面的信息:

Raspbian GNU/Linux 9 raspberrypi ttyS0
raspberrypi login:

表明这个时候的串口用作 console(控制台) 了, 这不是我们想要的(console默认连接的是serial0, 115200), 我们只是想连接外设用, 所以需要disable console:

sudo nano /boot/cmdline.txtdwc_otg.lpm_enable=0 console=tty1 root=/dev/mmcblk0p2 rootfstype=ext4 elevator=deadline fsck.repair=yes rootwaitsudo reboot

对于树莓派3而言, 虽然串口已经解放出来了, 但使用的是不稳定的mini UART, 我们用 PL011 硬件串口更好, 先看一下映射关系:

ls -l /dev
#serial0 -> ttyS0
#serial1 -> ttyAMA0

改变映射关系:

sudo nano /boot/config.txt

增加一行:

dtoverlay=pi3-miniuart-bt

重启:

sudo reboot

看一下映射关系:

ls -l /dev
#serial0 -> ttyAMA0
#serial1 -> ttyS0

简言之, 我们关闭了串口的console, 然后把硬件串口映射到TXD0, RXD0. 使用的时候引出串口是 /dev/ttyAMA0.

树莓派通过WiFi和PC在同一个局域网中, 连接方式上, 命令行用SSH, 图形界面用VNC, 文件传输可以使用Filezilla(sftp://树莓派IP, 用户名pi, 密码raspberry). 如果我们配置Samba, 在电脑上就可以像编辑本地文件一样编辑树莓派的代码, 用VS Code之类的编辑器就非常方便了, 感兴趣的可以自己搜索, 这里限于篇幅就略了.

连接TFmini 到树莓派引出串口

先看下树莓派的IO:

连接关系如下:

Raspberry Pi 3 TFmini
+5V 5V(红)
GND GND(黑)
TXD0 RX(白)
RXD0 TX(绿)

实际上, 我们这里没有给TFmini发命令, 只用接收TFmini发来的数据即可, 所以, TXD0可以不接或者连接其他外设.

tfmini.py 文件如下:

# -*- coding: utf-8 -*
import serialser = serial.Serial("/dev/ttyAMA0", 115200)def getTFminiData():while True:count = ser.in_waitingif count > 8:recv = ser.read(9)ser.reset_input_buffer()if recv[0] == 'Y' and recv[1] == 'Y': # 0x59 is 'Y'low = int(recv[2].encode('hex'), 16)high = int(recv[3].encode('hex'), 16)distance = low + high * 256print(distance)if __name__ == '__main__':try:if ser.is_open == False:ser.open()getTFminiData()except KeyboardInterrupt:   # Ctrl+Cif ser != None:ser.close()

python tfmini.py 运行, 即可看到结果, 注意这里用python3不会工作.

tfmini_23.py文件如下:

# -*- coding: utf-8 -*
import serial
import timeser = serial.Serial("COM12", 115200)def getTFminiData():while True:#time.sleep(0.1)count = ser.in_waitingif count > 8:recv = ser.read(9)   ser.reset_input_buffer() # type(recv), 'str' in python2(recv[0] = 'Y'), 'bytes' in python3(recv[0] = 89)# type(recv[0]), 'str' in python2, 'int' in python3 if recv[0] == 0x59 and recv[1] == 0x59:     #python3distance = recv[2] + recv[3] * 256strength = recv[4] + recv[5] * 256print('(', distance, ',', strength, ')')ser.reset_input_buffer()if recv[0] == 'Y' and recv[1] == 'Y':     #python2lowD = int(recv[2].encode('hex'), 16)      highD = int(recv[3].encode('hex'), 16)lowS = int(recv[4].encode('hex'), 16)      highS = int(recv[5].encode('hex'), 16)distance = lowD + highD * 256strength = lowS + highS * 256print(distance, strength)# you can also distinguish python2 and python3: #import sys#sys.version[0] == '2'    #True, python2#sys.version[0] == '3'    #True, python3if __name__ == '__main__':try:if ser.is_open == False:ser.open()getTFminiData()except KeyboardInterrupt:   # Ctrl+Cif ser != None:ser.close()

这个对于python2和python3都是可以用的.

连接TFmini 到树莓派其他IO口

参考上节中树莓派的IO口图, 我们把 TX(绿) 连到GPIO23上, RX(白)这里没有用上, 可以悬空. 模拟串口数据接收不太稳定, 所以我们代码中加上了校验checksum和阈值筛选, 尽量避免数据错误.

tfmini_ss.py 代码如下:

# -*- coding: utf-8 -*
import pigpio
import timeRX = 23pi = pigpio.pi()
pi.set_mode(RX, pigpio.INPUT)
pi.bb_serial_read_open(RX, 115200) def getTFminiData():while True:#print("#############")time.sleep(0.05) #change the value if needed(count, recv) = pi.bb_serial_read(RX)if count > 8:for i in range(0, count-9):if recv[i] == 89 and recv[i+1] == 89: # 0x59 is 89checksum = 0for j in range(0, 8):checksum = checksum + recv[i+j]checksum = checksum % 256if checksum == recv[i+8]:distance = recv[i+2] + recv[i+3] * 256strength = recv[i+4] + recv[i+5] * 256if distance <= 1200 and strength < 2000:print(distance, strength) #else:# raise ValueError('distance error: %d' % distance)   #i = i + 9if __name__ == '__main__':try:getTFminiData()except:  pi.bb_serial_read_close(RX)pi.stop()

运行:

# pigpio scripts require that the pigpio daemon be running.
sudo pigpiod
python tfmini_ss.py

模拟串口尽管精度较差, 但好处太多, 比如树莓派只有一个引出串口, 可能轮不到连接TFmini, 用模拟串口就可以随意找一个IO连接TFmini的TX, 这样就留出了宝贵的IO口, 而且, 有了模拟串口, 每个IO口都可以连接一个TFmini, 同时连接多个TFmini, 再也不用担心串口不够用的问题.

当然树莓派的USB毕竟也不是摆设, 连接多个TFmini也可以用通过USB转串口(CP2102, CH341等)插到USB上去, 再多还有USB Hub可以用.

Github工程

https://github.com/TFmini/TFmini-RaspberryPi

树莓派3 串口 / 模拟串口相关推荐

  1. c语言如何创建虚拟串口,模拟串口的C语言源程序代码

    本程序是模拟串口硬件机制写的,使用时可设一定时中断,时间间隔为1/4波特率,每中断一次调用一次接收函数, 每中断4次调用一次发送函数,不过.对单片机来说时钟并须要快.要知道9600的波特率的每个BIT ...

  2. 树莓派外设开发基础—串口通信

    文章目录 一.串口通信的一些概念 二.树莓派串口通信设置 三.树莓派串口通信API 四.树莓派与PC通信 1.接线 2.程序与测试 拓展 一.串口通信的一些概念 串口通信通常用在多机通信中. 串口通信 ...

  3. 6_树莓派机载计算机通过串口指令控制无人机自主飞行教程

    typora-root-url: img 6_树莓派机载计算机通过串口指令控制无人机自主飞行教程 电赛飞行器赛题的前世今生 飞行器赛题至出现以来.从大体趋势上来看参赛学生的主流飞控路线主要经历了以下四 ...

  4. android usb设备节点_(五)树莓派3开发环境搭建——6.树莓派USB与tty串口号绑定...

    通过前面一系列的铺垫,相信大家对整个miiboo机器人的DIY有了一个清晰整体的认识.接下来就正式进入机器人大脑(嵌入式主板:树莓派3)的开发.本章将从树莓派3的开发环境搭建入手,为后续ros开发.s ...

  5. Modebus Slave 与 Modbus Poll主从设备模拟软件与Configure Virtual Serial串口模拟软件使用

    场景 Configure Virtual Serial Port Driver 1.多个虚拟串口映射: 2.收/发多线程架构发多线程架构: 3.支持虚拟串口参数同步指令支持虚拟串口参数同步指令: 4. ...

  6. 树莓派slam_SLAM+语音机器人DIY系列:(五)树莓派3开发环境搭建——6.树莓派USB与tty串口号绑定...

    摘要 通过前面一系列的铺垫,相信大家对整个miiboo机器人的DIY有了一个清晰整体的认识.接下来就正式进入机器人大脑(嵌入式主板:树莓派3)的开发.本章将从树莓派3的开发环境搭建入手,为后续ros开 ...

  7. putty串口打开没反应_如何使用树莓派快速搭建一个串口数据记录器?

    在最近发现同事的某些项目临时增加了一些需求,把测出的能见度数据保存在存储介质中,并且可以随时远程查阅.如果在项目时间与成本允许的情况下,我们会选择在PCB中增加SD卡槽以及以太网接口,用于存储数据和联 ...

  8. 单片机IO口模拟串口程序(发送+接收

    单片机IO口模拟串口程序(发送+接收)[转] qcmc 发表于 - 2011-6-23 0:42:00 前一阵一直在做单片机的程序,由于串口不够,需要用IO口来模拟出一个串口.经过若干曲折并参考了一些 ...

  9. 树莓派使用STEP8:使能串口调试

    1.打开SD卡根目录"config.txt"文件,文末增加dtoverlay=pi3-miniuart-bt并且保存 : 2.修改根目录"cmdline.txt" ...

  10. STM8学习笔记----普通IO口模拟串口功能

    串口在产品应用中很常见,但是单片机的默认带的串口往往比较少,有时候就会出现串口不够用,所以就想着能不能用普通IO口模拟串口来实现串口的功能. 要模拟串口首先要清楚串口数据传输过程中的原理. 常用的串口 ...

最新文章

  1. CVPR2018上关于目标检测(object detection)
  2. mysql备份slave_MySQL主(Master)从(Slave)备份;
  3. 全球IPv6网络6月6日正式启动
  4. linux 修改用户名 终端,如何修改Ubuntu终端用户名颜色修改为红色
  5. android中的常用方法,android开发中常用方法总结
  6. 在Tomcat上跑东西时遇到的对我这样新手来说很难找到的问题
  7. 使用ASP.Net WebAPI构建REST服务(一)——简单的示例
  8. 不知所措:您是否真的需要为您的API提供客户端库?
  9. 关于uint32_t uint8_t uint64_t 的问题
  10. Java基本数据类型的自动转换_彻底理解Java中的基本数据类型转换(自动、强制、提升)...
  11. python3 写九九乘法表(python 小白进阶之旅)
  12. C# .Net中的类型转换(5)
  13. php number_format 通过千位分组来格式化数字
  14. ORA-12638处理
  15. Atitit.远程接口 监控与木马   常用的api 标准化v2 q216
  16. JavaScript混淆器
  17. 华为安全 HCIP722笔记
  18. Ubuntu 22.04 桌面美化之Mac Big Sur风格
  19. 电脑绘画的必备工具——绘图板
  20. Secure CRT 乱码 问题

热门文章

  1. 服务器端车牌识别SDK
  2. 计算机视觉教程(第2版)1-8章期末复习
  3. Umi-—前端应用框架(Umi基础)
  4. Web前端常用IDE快捷键记忆(WebSorm、VSCode)
  5. PS视频降噪去噪点插件;DeNoise英文可选 支持CS6- cc2019
  6. 网友刷屏:秃了秃了!黑马Java项目教程上新
  7. 3DMAX卸载与安装教程和常见问题 适用于3DMAX2013-2020
  8. Qt 信号与槽机制及实战案例
  9. matlab方差 anov,MATLAB单因素方差分析
  10. Misra-Gries 算法