更新续篇>>会聊天的树莓派视频遥控小车 + iOS / Android / web应用
本文介绍了一种树莓派遥控小车的实现,做这个的初衷是希望能在不同平台和树莓派愉快地玩耍,所以视频直播用了 HLS 技术,缺点是有一定延迟。iOS 和 Android 客户端使用React Native,web端为 React,后台为 NodeJS,通信使用 websocket。主要功能有视频监控,温湿度检测,红外遥控等。出于方便,一部分 GPIO 操作还是用的 Python 和 C。具体代码请见:https://github.com/shaqian/PiBot
手机应用演示
应用界面
组装演示
元件列表
树莓派:Raspberry Pi v3 Model B
树莓派摄像头: 8MP Raspberry Pi Camera v2
Micro SD 内存卡:8G 或以上
USB声卡
麦克风:3.5mm 接口
迷你音箱:3.5mm 接口
小车底盘:ZK-4WD
马达驱动:L298n
5v电源:给树莓派供电
电池电源:两节18650 (3.7v)电池加电池壳,给马达驱动供电
DC降压模块:LM2596S,7.4v转5v,给舵机供电
舵机:SG90 9g
舵机底座:我用的是这个,但只用了单层,因为树莓派只有2组硬件 PWM,需要留一组给红外输出。
红外发射模块:可以用 Arduino 的红外发射模块 KY-005,但是可达距离较短。推荐这个大功率红外模块,距离可达几米。
红外接收模块:KY-022 (IR Receiver for Arduino)
面包板:SYB-170
杜邦线:20或30厘米,公对母
电阻:1/4W 1kΩ & 2kΩ
设置树莓派和网络
如果不是第一次使用树莓派,可跳过此部分内容。
1) 安装树莓派系统 (Mac)
从镜像安装 Raspbian
1. 下载 .zip 文件 RASPBIAN STRETCH WITH DESKTOP。
2. 解压并得到 2017-07-05-raspbian-jessie.img。
3. 打开终端,运行 diskutil list 列出所有磁盘。
4. SD 卡插入读卡器并连接电脑。
5. 再次运行 diskutil list,找到 SD 卡的 disk (并非 partition),比如 disk3 ,而不是 disk3s1。
6. 运行 sudo diskutil unmountDisk /dev/disk[n] 解挂SD卡 (将[n]替换为上一步得到的disk编号,比如:/dev/disk3)。
7. 将镜像拷贝至 SD 卡:sudo dd bs=1m if=[path-to-the-image-file] of=/dev/rdisk[n] conv=sync (替换 [path-to-the-image-file] 为镜像文件路径,例如 ~/Downloads/2017-07-05-raspbian-jessie.img, 并将 [n] 替换为正确的 disk 编号,比如:/dev/rdisk3)。
2) SSH至Raspberry Pi
1. 启用SSH:
2016年11月之后发布的 Raspbian 默认关闭了 SSH,启用方式是在 SD 卡的根目录创建一个名为 ssh 的文件,不带任何扩展名。
2. 从电脑弹出 SD 卡,并插入树莓派。
3. 将树莓派用网线连接至家用路由器,并用 5v 电源给树莓派供电。
4. 找到树莓派的 IP。如果没用路由器的权限,可以运行 sudo nmap -sP -PI -PT 192.168.1.0/24 扫描家庭网络中的所有设备。
5. 打开终端,运行 ssh pi@[IP-of-Raspberry-Pi] (将 [IP-of-Raspberry-Pi] 替换为实际的IP地址,比如:192.168.1.16),输入默认密码 raspberry 。
6. (可选) 修改密码:passwd pi。
3) (可选) 配置图形远程桌面
1. 如未安装VNC connect,运行:
sudo apt-get update
sudo apt-get install realvnc-vnc-server realvnc-vnc-viewer
2. 启用 VNC Server,运行 sudo raspi-config ,选择 Interfacing Options,选择 VNC > Yes。
3. 打开 VNC Viewer,输入树莓派的 IP 地址并连接。
4) 连接Wifi
1. 运行 cat /etc/network/interfaces,确认已存在以下内容:
iface wlan0 inet manual
wpa-conf /etc/wpa_supplicant/wpa_supplicant.conf
2. 运行 sudo vi /etc/wpa_supplicant/wpa_supplicant.conf,在最底下添加
network={
ssid="{Name-of-the-Wifi}"
psk="{Password-of-the-Wifi}"
}
3. 运行 sudo service networking restart 以生效,设置完成后可拔出网线。
安装必要软件
1) Python 3.x
如果 which python3 返回空,运行 sudo apt-get install python3。
2) NodeJs 8.x
curl -sL https://deb.nodesource.com/setup_8.x | sudo -E bash -
sudo apt install nodejs
node -v
3) Nginx Server
安装 nginx:sudo apt-get install nginx,开启服务器 sudo /etc/init.d/nginx start 。
4) 音频视频相关
安装ALSA开发库:sudo apt-get install libasound2-dev。如果返回404,先运行 sudo apt-get upgrade --fix-missing。
avconv 用来转换录像为.mp4格式:sudo apt-get install libav-tools
mpg123 用来播放.mp3:sudo apt-get install mpg123
5) 下载repo
cd ~
git clone https://github.com/shaqian/PiBot.git
测试硬件
1) 马达驱动及马达
1. 按电路图接线。
2. 安装 rpio,运行 npm install rpio
3. 运行 node
4. 初始化端口输出:
var rpio = require('rpio');
rpio.open(29, rpio.OUTPUT, rpio.LOW);
rpio.open(31, rpio.OUTPUT, rpio.LOW);
rpio.open(38, rpio.OUTPUT, rpio.LOW);
rpio.open(40, rpio.OUTPUT, rpio.LOW);
5. 前进:
rpio.write(29, rpio.LOW);
rpio.write(31, rpio.HIGH);
rpio.write(38, rpio.LOW);
rpio.write(40, rpio.HIGH);
6. 后退:
rpio.write(29, rpio.HIGH);
rpio.write(31, rpio.LOW);
rpio.write(38, rpio.HIGH);
rpio.write(40, rpio.LOW);
7. 停止:
rpio.write(29, rpio.LOW);
rpio.write(31, rpio.LOW);
rpio.write(38, rpio.LOW);
rpio.write(40, rpio.LOW);
2) 舵机
1. 按电路图接线:
2. 运行:
cd ~/PiBot/PiBotServer/bin
chmod +x direct.py
3. 舵机角度由duty cycle控制,一般范围为2.5至11.5。转至中间:
./direct.py 7
4. 左转到底:
./direct.py 2.5
5. 右转到底:
./direct.py 11.5
3) 温湿度传感器
1. 按电路图接线:
2. 运行:
cd ~/PiBot/PiBotServer/bin/temp_hum
chmod +x getTemp.py
chmod +x getHum.py
3. 获取温度:
./getTemp.py
4. 获取湿度:
./getHum.py
4) 红外接收模块
红外接收模块用来接收和解码遥控器信号,然后树莓派发送相同信号即可模拟遥控器。
代码借用这个 repo,修改了端口,以及ST_BASE的值,树莓派3 (BCM2837) 为0x3F003000 ,而旧版为 0x20003000。
1. 按电路图接线:
2. 运行 gpio -v 检查是否已安装wiringPi。没有的话,安装 Wiring Pi。
3. 运行 cd ~/PiBot/PiBotServer/bin。编译代码生成可执行文件:
gcc ir_decode.c -lwiringPi -o decode.out
chmod +x decode.out
4. 运行 sudo ./decode.out。没有信号时屏幕每秒打印 [0]。
5. 将遥控器对准红外接收模块并按键。解码后的信号为一串十六进制数,如:0xb2,0x4d,0x1f,0xe0,0x98,0x67,[48]。
6. 重复以上步骤,解码空调开机和关机的信号。
5) 红外发射模块
红外解码完成后移除红外接收模块
1. 按电路图接线:
2. 运行以下命令复制编码代码:
cd ~/PiBot/PiBotServer/bin
cp ir_encode.c on.c
cp ir_encode.c off.c
3. 运行 vi on.c,将 166 行的十六进制数改为解码所得的开机信号,如:
char data[6] = {0xb2,0x4d,0x1f,0xe0,0xd8,0x27};
4. 运行 vi off.c,将 166 行的十六进制数改为解码所得的关机信号,如:
char data[6] = {0xb2,0x4d,0x7b,0x84,0xe0,0x1f};
5. 编译代码生成可执行文件:
gcc on.c -lwiringPi -o on.out
chmod +x on.out
gcc off.c -lwiringPi -o off.out
chmod +x off.out
6. 发射开机信号:sudo ./on.out
7. 发射关机信号:sudo ./off.out
6) 声卡、麦克风及扬声器
树莓派有板载的 3.5mm 音频接口输入但没有输出,所以我用 USB 声卡作为音频输入和输出。
1. USB 声卡接入树莓派并连接麦克风及扬声器。
2. 运行 arecord -l 及 aplay -l 确认 USB Audio Device 编号,比如 card 1。
3. 录制 5s 的测试录音:arecord -Dplughw:[n] -fcd -d5 -c1 -twav -r16000 test.wav (将 [n] 替换为 USB 声卡的编号,比如 Dplughw:1)。
4. 播放测试录音:aplay -Dplughw:[n] test.wav (将 [n] 替换为USB声卡的编号,比如 Dplughw:1)。
5. 将USB声卡设为默认音频设备,运行 sudo vi /lib/modprobe.d/aliases.conf,写入以下内容并保存:
options snd_usb_audio index=0
options snd_bcm2835 index=1
options snd slots=snd_usb_audio,snd_bcm2835
6. 重启树莓派: sudo reboot。
7. 运行 cat /proc/asound/modules 确认显示如下:
0 snd_usb_audio
1 snd_bcm2835
8. 此时播放 .wav 无需指定设备编号即是 USB 输出:aplay test.wav。
7) 摄像头
借用 picam 生成 HTTP Live Streaming (HLS) 直播视频流。
1. 将树莓派摄像头接至树莓派。
2. 运行 sudo raspi-config,选择 Interfacing Options,选择 Camera > Yes。
3. 安装 picam 的依赖:
sudo apt-get update
sudo apt-get install libharfbuzz0b libfontconfig1
4. 创建目录和软连接:
cd ~;mkdir picam;cd picam
cat > make_dirs.sh <<'EOF'
#!/bin/bash
DEST_DIR=~/picam
SHM_DIR=/run/shm
mkdir -p $SHM_DIR/rec
mkdir -p $SHM_DIR/hooks
mkdir -p $SHM_DIR/state
mkdir -p $DEST_DIR/archive
ln -sfn $DEST_DIR/archive $SHM_DIR/rec/archive
ln -sfn $SHM_DIR/rec $DEST_DIR/rec
ln -sfn $SHM_DIR/hooks $DEST_DIR/hooks
ln -sfn $SHM_DIR/state $DEST_DIR/state
EOF
chmod +x make_dirs.sh
./make_dirs.sh
5. 安装 picam 库:
wget https://github.com/iizukanao/picam/releases/download/v1.4.6/picam-1.4.6-binary-jessie.tar.xz
tar xvf picam-1.4.6-binary-jessie.tar.xz
cp picam-1.4.6-binary-jessie/picam ~/picam/
6. 创建 HLS 视频直播流:
cd ~/picam
./picam -o /run/shm/hls
7. 配置 Nginx 服务器。运行 sudo vi /etc/nginx/sites-available/default,在 server 的 { ... } 块中添加以下内容:
location /hls/ {
root /run/shm;
}
8. 重启 Nginx:
sudo /etc/init.d/nginx restart
9. 测试播放视频流:
HLS 地址为 http://[IP-of-Raspberry-Pi]/hls/index.m3u8
i. 使用 Mac 自带的 QuickTime 播放:
打开 QuickTime,选择 File > Open Location, 输入 http://[IP-of-Raspberry-Pi]/hls/index.m3u8。
ii. 或使用网页播放:
a. 下载测试用的 html 复制至 Nginx 服务器根目录:
sudo cp ~/PiBot/PiBotServer/public/hls_test.html /var/www/html/hls_test.html
b. 在树莓派或同一网络中的电脑上,打开浏览器,转到 http://[IP-of-Raspberry-Pi]/hls_test.html。
配置 Nginx 服务器
启用 80 端口的 HTTP 以及 443 端口的 HTTPS。如果不启用 HTTPS,当域名非 localhost 时将无法使用录音功能。参考: https://goo.gl/rStTGz
1. 运行 sudo openssl req -x509 -nodes -days 365 -newkey rsa:2048 -keyout /etc/nginx/snippets/nginx-selfsigned.key -out /etc/nginx/snippets/nginx-selfsigned.crt 创建 HTTPS 用的证书。
2. 将 /etc/nginx/sites-enabled/default 内的内容替换为 ~/PiBot/PiBotServer/ngnix/default。
3. 运行 sudo nginx -t 测试配置文件。如果没问题,重启 Nginx 服务器:sudo /etc/init.d/nginx restart
使用网页应用
1. 运行 cd ~/PiBot/PiBotServer;npm install 安装依赖。
2. 开启 HLS 直播视频流:
cd ~/picam
./make_dirs.sh
./picam -o /run/shm/hls --vflip --hflip
3. 开启网页应用:
cd ~/PiBot/PiBotServer
sudo npm start
4. 在浏览器中打开 http[s]://[IP-of-Raspberry-Pi] (将 IP-of-Raspberry-Pi 替换为实际的网址,比如:192.168.1.16)。
使用移动应用
iOS
i. 编译并在模拟器中运行:
cd PiBot/PiBotApp
npm install
npm run ios
ii. 在设备上运行:
参考 React Native 官方文档的 Running your app on iOS devices。
Android
i. 编译并在模拟器中运行应用:
cd PiBot/PiBotApp
npm install
npm run android
ii. 在设备上运行:
参考 React Native 官方文档的 Running your app on Android devices。
或者直接使用repo中的 PiBot.apk。