po 主是苦逼码农一枚,软件工程师,做服务端方向,主要写 nodejs & golang 偶尔写点 python,所以这是一篇刚刚拥有第一个开发板的小白写的小白文,以上是背景
前段时间为了改善生活买了一块树莓派3,装了 debian 8 jessie。
1. 换清华的源:
sudo vi /etc/apt/sources.list
注释掉其他的源插入这两个:
deb http://mirrors.tuna.tsinghua.edu.cn/raspbian/raspbian/ jessie main non-free contrib
deb-src http://mirrors.tuna.tsinghua.edu.cn/raspbian/raspbian/ jessie main non-free contrib
同时注释掉下面这个文件里面的源,不然还是会优先读这个
sudo vi /etc/apt/sources.list.d/raspi.list
2. 使用 ssh-tunnel 做内网穿透 (远程控制自己家里的树莓派):
主要参照的是 这篇文章 ,大致思路如下
利用 ssh 反向隧道的方式,通过一台外网 vps 做跳板,远程直接通过 ssh 连接到放在 NAT 之后的树莓派
有两个奇妙的点
- 使用 autossh 保持 ssh 隧道,因为 ssh 会超时断开,所以用 autossh 来保持连接
- 实测发现 autossh 的 -f 后台模式有点问题,暂时通过 tmux 保证这个 autossh 持续运行,接下来准备做成系统服务开机启动
具体步骤
准备:
1. 将树莓派中的 id_rsa.pub 公钥放进 vps,让树莓派 ssh 访问 vps 的时候可以不用输入密码
2. 安装 autossh (sudo apt-get install autossh || sudo yum install autossh)
3. 安装 tmux (sudo apt-get install tmux || sudo yum install tmux)
运行:
# --------------- 树莓派上运行
tmux
autossh -p 22 -M 6777 -NR 6766:localhost:22 -i /home/pi/.ssh/id_rsa [vps user]@[vps ip]
# 6777 监控服务状态
# vps 6766 端口映射到树莓派的 22 端口
# -i 是指定 id_rsa 文件路径,避免不同用户运行造成的 ssh 密钥错误
# --------------- 需要远程连接树莓派的终端上运行
ssh [vps user]@[vps ip]
# 先连上 vps
ssh -p 6766 [pi user]@localhost
# 在 vps 上连接本地的 6766 端口,作用等效于连上映射的树莓派 22 端口
3. 连接 SIM 900
淘宝链接就不放了,不过就算做硬广应该也没人看见吧 (手动滑稽
大致思路如下
Raspberry pi 3 GPIO Pins 里面的 8/10 口连 SIM 900 的 TTL 接口,使用 minicom 监控 SIM 900 的输出,调试的时候可以直接向串口里面写 AT 指令
这是最坑的一个步骤,因为网上大部分的资料都是说的 pi 3 早期系统,或者直接就是 pi 2。
根!本!就!没!用!(来自小白浪费两天时间的咆哮
碰到的问题如下:
-
pi 3 集成了蓝牙,占据了主要的 uart 口,所以没法儿像 pi 2 一样直接使用 TTL 需要的 TXD & RXD。
-
网上大部分现有的文档,都是在教大家怎么禁用蓝牙模块,然后将 ttyAMA0 重新映射到 TXD & RXD 口上。
但是!我想用蓝牙啊!为啥我要放弃蓝牙!(其实是尝试了好几种方法都不成功万般无奈
-
有一种方法是将内核频率降低 core_freq=250,用来避免频率波动,从而顺利使用 uart1 接口,不过也是牺牲了一定的性能。
禁用蓝牙模块是有效的,推荐看 这篇文章 反正我是尝试失败了才推荐给大家的。
重头戏来了
看了这几篇之后 帖一 帖二 帖三 才有点明白 pi 3 里面 uart 接口的关系,主要是二、三,引用一段:
The Broadcom SOC's in all Pi's come with 2 serial ports, a full port and a mini port. Before the model 3, neither of theses were used internally, so the full port was routed out to the GPIO connector, and called ttyAMA0.
The Pi 3 requires a serial port to talk to it's Bluetooth device, and the Pi's engineers decided to use the full serial port to talk to the Bluetooth chip as it was more capable then the mini serial port, and so the mini serial port was brought out to the GPIO connector, and called ttyS0. This has caused a few problems.
The mini serial port's baud rate is hard wired to the GPU's clock, and so when the GPU's clock speed changed, the baud rate of ttyS0 changed as well. The Pi 3 adjusts it's clock frequencies as demand goes up and down, and with it, ttyS0's baud rate. This is probably what caused the scrambled data in your first post.
The first fix for this problem was to lock down the GPU's clock to a fixed frequency. This was done by adding the line: "core_freq=250" to 'config.txt'. This locks the baud rate of ttyS0, at the cost of a small decrease in the Pi's performance.
The second fix the Pi engineers came up with, was the problem of software backward compatibility with previous model Pi's. Any software written using ttyAMA0 would not work on a Pi 3B, as it calls it's port ttyS0. The second fix was to rename the serial ports on all models to 'serial0', and 'serial1'. On a Pi 3, ttyS0 is mapped to serial0, and on previous models ttyAMA0 is mapped to serial0. This means that software which refers to serial0 will work on all models.
Finally, the line "enable_uart=1" automatically locks the core frequency in a Pi 3, so "core_freq=250" is no longer required. Enabling the serial port in "Preferences" (raspi-config) will automatically add this line if required.
So, to summarize, to use the serial port on all model Pi's running an updated OS, add the line: "enable_uart=1" to '/boot/config.txt, and refer to the port as '/dev/serial0' in code. SystemD normally starts a terminal on this serial port which you are using but, if you don't want a terminal remove the section "console=serial0,115200" from '/boot/cmdline.txt'.
Using this procedure, Bluetooth works normally on the Pi 3.
简而言之就是:
pi 3 现在是有两个 uart 口的,主要的 uart 给了蓝牙模块,所以正常来说 ttyAMA0 也就是 serial1 是不推荐使用的。
推荐使用 pi 3 的 mini-uart,而且是可以不用手动降频使用的,因为新版本里面如果打开了 uart 口,其实是会锁定内核频率的。我们要连的还是 RXD TXD,只不过 pi 3 里面这两个口被映射到了 mini-uart (ttyS0 | serial0)。
在系统设置里面 enable serial port,或者把 enable_uart=1 加到 /boot/config.txt 里面,mini-uart 就可以正常访问了。
po 主直接把 minicom 的串口设为 '/dev/serial0' 也就是 mini-uart,波特率不变还是 115200 8N1,可以达到 pi 2 里面使用 ttyAMA0 类似的效果。
po 主的流程
接线:# 不确定后续拨打电话之类的够不够,现在是为了省一个外接电源,所以直接用树莓派给 SIM900 供电
TTL
pi TXD(8) 连 SIM900 RXD
pi RXD(10) 连 SIM900 TXD
POWER
pi 5V(2) 连 SIM900 VCC
pi GND(6) 连 SIM900 GND
树莓派:
# 安装 minicom 用来监控 uart 口
sudo apt-get install minicom
# 调整响应的端口,并且关闭硬件监控,以便于之后可能需要用 minicom 输入
sudo minicom -s
Serial port setup
Serial Device 改为 /dev/serial0
Hardware Flow Control 改为 No
Save setup as dfl
Exit from Minicom
# 调整完毕,可以直接看到输出了
minicom
2017/06/22 更新
连上 minicom 一直不停的有乱码出现。检查了波特率,而且SIM900本身也是自适应的,心酸。
2017/07/03 更新
买了一根 USB 转 TTL,接上树莓派马上就可以用了。。。minicom 也能自动识别了,我是傻逼吗!
PS 还买了逻辑分析仪,果然也没派上用场。因为用 virtualbox 装windows 好像逻辑分析仪的采样率出了点问题,暂时就不用了。
未完待续
- 接下来要完善 autossh 稳定内网穿透。
- 在 vps 上再搞一个隧道(开个口,文章的说法)做到可以远程直接连 vps 固定端口就转到了 pi 3 上,不用现在的这种先 ssh 到 vps 上,再 ssh 到 pi 3。
- 在 SIM 900 上搞点事情
网友评论