树莓派视频遥控小车 + iOS / Android / web应用

更新续篇>>会聊天的树莓派视频遥控小车 + iOS / Android / web应用

本文介绍了一种树莓派遥控小车的实现,做这个的初衷是希望能在不同平台和树莓派愉快地玩耍,所以视频直播用了 HLS 技术,缺点是有一定延迟。iOS 和 Android 客户端使用React Native,web端为 React,后台为 NodeJS,通信使用 websocket。主要功能有视频监控,温湿度检测,红外遥控等。出于方便,一部分 GPIO 操作还是用的 Python 和 C。具体代码请见:https://github.com/shaqian/PiBot


手机应用演示


PiBotApp


应用界面


组装演示


元件列表

树莓派: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 -laplay -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。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 196,442评论 5 462
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 82,604评论 2 373
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 143,576评论 0 325
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 52,652评论 1 267
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 61,495评论 5 358
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 46,370评论 1 274
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 36,792评论 3 387
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 35,435评论 0 255
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 39,735评论 1 294
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 34,777评论 2 314
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 36,553评论 1 326
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,399评论 3 315
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 37,806评论 3 300
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,038评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,330评论 1 253
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 41,766评论 2 342
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 40,964评论 2 337

推荐阅读更多精彩内容