更新續(xù)篇>>會(huì)聊天的樹(shù)莓派視頻遙控小車 + iOS / Android / web應(yīng)用
本文介紹了一種樹(shù)莓派遙控小車的實(shí)現(xiàn),做這個(gè)的初衷是希望能在不同平臺(tái)和樹(shù)莓派愉快地玩耍,所以視頻直播用了 HLS 技術(shù),缺點(diǎn)是有一定延遲。iOS 和 Android 客戶端使用React Native,web端為 React,后臺(tái)為 NodeJS,通信使用 websocket。主要功能有視頻監(jiān)控,溫濕度檢測(cè),紅外遙控等。出于方便,一部分 GPIO 操作還是用的 Python 和 C。具體代碼請(qǐng)見(jiàn):https://github.com/shaqian/PiBot
手機(jī)應(yīng)用演示
應(yīng)用界面


組裝演示
元件列表
樹(shù)莓派:Raspberry Pi v3 Model B
樹(shù)莓派攝像頭: 8MP Raspberry Pi Camera v2
Micro SD 內(nèi)存卡:8G 或以上
USB聲卡
麥克風(fēng):3.5mm 接口
迷你音箱:3.5mm 接口
小車底盤:ZK-4WD
馬達(dá)驅(qū)動(dòng):L298n
5v電源:給樹(shù)莓派供電
電池電源:兩節(jié)18650 (3.7v)電池加電池殼,給馬達(dá)驅(qū)動(dòng)供電
DC降壓模塊:LM2596S,7.4v轉(zhuǎn)5v,給舵機(jī)供電
舵機(jī):SG90 9g
舵機(jī)底座:我用的是這個(gè),但只用了單層,因?yàn)闃?shù)莓派只有2組硬件 PWM,需要留一組給紅外輸出。
紅外發(fā)射模塊:可以用 Arduino 的紅外發(fā)射模塊 KY-005,但是可達(dá)距離較短。推薦這個(gè)大功率紅外模塊,距離可達(dá)幾米。
紅外接收模塊:KY-022 (IR Receiver for Arduino)
面包板:SYB-170
杜邦線:20或30厘米,公對(duì)母
電阻:1/4W 1kΩ & 2kΩ
設(shè)置樹(shù)莓派和網(wǎng)絡(luò)
如果不是第一次使用樹(shù)莓派,可跳過(guò)此部分內(nèi)容。
1) 安裝樹(shù)莓派系統(tǒng) (Mac)
從鏡像安裝 Raspbian
1. 下載 .zip 文件?RASPBIAN STRETCH WITH DESKTOP。
2. 解壓并得到 2017-07-05-raspbian-jessie.img。
3. 打開(kāi)終端,運(yùn)行 diskutil list 列出所有磁盤。
4. SD 卡插入讀卡器并連接電腦。
5. 再次運(yùn)行 diskutil list,找到 SD 卡的 disk (并非 partition),比如 disk3 ,而不是 disk3s1。
6. 運(yùn)行 sudo diskutil unmountDisk /dev/disk[n] 解掛SD卡 (將[n]替換為上一步得到的disk編號(hào),比如:/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 編號(hào),比如:/dev/rdisk3)。
2) SSH至Raspberry Pi?
1. 啟用SSH:
2016年11月之后發(fā)布的 Raspbian 默認(rèn)關(guān)閉了 SSH,啟用方式是在 SD 卡的根目錄創(chuàng)建一個(gè)名為 ssh 的文件,不帶任何擴(kuò)展名。
2. 從電腦彈出 SD 卡,并插入樹(shù)莓派。
3. 將樹(shù)莓派用網(wǎng)線連接至家用路由器,并用 5v 電源給樹(shù)莓派供電。
4. 找到樹(shù)莓派的 IP。如果沒(méi)用路由器的權(quán)限,可以運(yùn)行 sudo nmap -sP -PI -PT 192.168.1.0/24 掃描家庭網(wǎng)絡(luò)中的所有設(shè)備。
5. 打開(kāi)終端,運(yùn)行 ssh pi@[IP-of-Raspberry-Pi] (將 [IP-of-Raspberry-Pi] 替換為實(shí)際的IP地址,比如:192.168.1.16),輸入默認(rèn)密碼 raspberry 。
6. (可選) 修改密碼:passwd pi。
3) (可選) 配置圖形遠(yuǎn)程桌面
1. 如未安裝VNC connect,運(yùn)行:
sudo apt-get update
sudo apt-get install realvnc-vnc-server realvnc-vnc-viewer
2. 啟用 VNC Server,運(yùn)行 sudo raspi-config ,選擇 Interfacing Options,選擇 VNC > Yes。
3. 打開(kāi) VNC Viewer,輸入樹(shù)莓派的 IP 地址并連接。
4) 連接Wifi
1. 運(yùn)行 cat /etc/network/interfaces,確認(rèn)已存在以下內(nèi)容:
iface wlan0 inet manual
wpa-conf /etc/wpa_supplicant/wpa_supplicant.conf
2. 運(yùn)行 sudo vi /etc/wpa_supplicant/wpa_supplicant.conf,在最底下添加
network={
ssid="{Name-of-the-Wifi}"
psk="{Password-of-the-Wifi}"
}
3. 運(yùn)行 sudo service networking restart 以生效,設(shè)置完成后可拔出網(wǎng)線。
安裝必要軟件
1) Python 3.x
如果 which python3 返回空,運(yùn)行 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,開(kāi)啟服務(wù)器 sudo /etc/init.d/nginx start 。
4) 音頻視頻相關(guān)
安裝ALSA開(kāi)發(fā)庫(kù):sudo apt-get install libasound2-dev。如果返回404,先運(yùn)行 sudo apt-get upgrade --fix-missing。
avconv 用來(lái)轉(zhuǎn)換錄像為.mp4格式:sudo apt-get install libav-tools
mpg123 用來(lái)播放.mp3:sudo apt-get install mpg123
5) 下載repo
cd ~
git clone https://github.com/shaqian/PiBot.git
測(cè)試硬件
1) 馬達(dá)驅(qū)動(dòng)及馬達(dá)
1. 按電路圖接線。

2. 安裝?rpio,運(yùn)行 npm install rpio?
3. 運(yùn)行 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. 前進(jìn):
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) 舵機(jī)
1. 按電路圖接線:

2. 運(yùn)行:
cd ~/PiBot/PiBotServer/bin
chmod +x direct.py
3. 舵機(jī)角度由duty cycle控制,一般范圍為2.5至11.5。轉(zhuǎn)至中間:
./direct.py 7
4. 左轉(zhuǎn)到底:
./direct.py 2.5
5. 右轉(zhuǎn)到底:
./direct.py 11.5
3) 溫濕度傳感器
1. 按電路圖接線:

2. 運(yùn)行:
cd ~/PiBot/PiBotServer/bin/temp_hum
chmod +x getTemp.py
chmod +x getHum.py
3. 獲取溫度:
./getTemp.py
4. 獲取濕度:
./getHum.py
4) 紅外接收模塊
紅外接收模塊用來(lái)接收和解碼遙控器信號(hào),然后樹(shù)莓派發(fā)送相同信號(hào)即可模擬遙控器。
代碼借用這個(gè) repo,修改了端口,以及ST_BASE的值,樹(shù)莓派3 (BCM2837) 為0x3F003000 ,而舊版為 0x20003000。
1. 按電路圖接線:

2. 運(yùn)行 gpio -v 檢查是否已安裝wiringPi。沒(méi)有的話,安裝 Wiring Pi。
3. 運(yùn)行 cd ~/PiBot/PiBotServer/bin。編譯代碼生成可執(zhí)行文件:
gcc ir_decode.c -lwiringPi -o decode.out
chmod +x decode.out
4. 運(yùn)行 sudo ./decode.out。沒(méi)有信號(hào)時(shí)屏幕每秒打印 [0]。
5. 將遙控器對(duì)準(zhǔn)紅外接收模塊并按鍵。解碼后的信號(hào)為一串十六進(jìn)制數(shù),如:0xb2,0x4d,0x1f,0xe0,0x98,0x67,[48]。
6. 重復(fù)以上步驟,解碼空調(diào)開(kāi)機(jī)和關(guān)機(jī)的信號(hào)。
5) 紅外發(fā)射模塊
紅外解碼完成后移除紅外接收模塊
1. 按電路圖接線:

2. 運(yùn)行以下命令復(fù)制編碼代碼:
cd ~/PiBot/PiBotServer/bin
cp ir_encode.c on.c
cp ir_encode.c off.c
3. 運(yùn)行 vi on.c,將 166 行的十六進(jìn)制數(shù)改為解碼所得的開(kāi)機(jī)信號(hào),如:
char data[6] = {0xb2,0x4d,0x1f,0xe0,0xd8,0x27};
4. 運(yùn)行 vi off.c,將 166 行的十六進(jìn)制數(shù)改為解碼所得的關(guān)機(jī)信號(hào),如:
char data[6] = {0xb2,0x4d,0x7b,0x84,0xe0,0x1f};
5. 編譯代碼生成可執(zhí)行文件:
gcc on.c -lwiringPi -o on.out
chmod +x on.out
gcc off.c -lwiringPi -o off.out
chmod +x off.out
6. 發(fā)射開(kāi)機(jī)信號(hào):sudo ./on.out
7. 發(fā)射關(guān)機(jī)信號(hào):sudo ./off.out
6) 聲卡、麥克風(fēng)及揚(yáng)聲器
樹(shù)莓派有板載的 3.5mm 音頻接口輸入但沒(méi)有輸出,所以我用 USB 聲卡作為音頻輸入和輸出。
1. USB 聲卡接入樹(shù)莓派并連接麥克風(fēng)及揚(yáng)聲器。
2. 運(yùn)行 arecord -l 及 aplay -l 確認(rèn) USB Audio Device 編號(hào),比如 card 1。
3. 錄制 5s 的測(cè)試錄音:arecord -Dplughw:[n] -fcd -d5 -c1 -twav -r16000 test.wav?(將 [n] 替換為 USB 聲卡的編號(hào),比如 Dplughw:1)。
4. 播放測(cè)試錄音:aplay -Dplughw:[n] test.wav?(將 [n] 替換為USB聲卡的編號(hào),比如 Dplughw:1)。
5. 將USB聲卡設(shè)為默認(rèn)音頻設(shè)備,運(yùn)行 sudo vi /lib/modprobe.d/aliases.conf,寫(xiě)入以下內(nèi)容并保存:
options snd_usb_audio index=0
options snd_bcm2835 index=1
options snd slots=snd_usb_audio,snd_bcm2835
6. 重啟樹(shù)莓派: sudo reboot。
7. 運(yùn)行 cat /proc/asound/modules 確認(rèn)顯示如下:
0 snd_usb_audio
1 snd_bcm2835
8. 此時(shí)播放 .wav 無(wú)需指定設(shè)備編號(hào)即是 USB 輸出:aplay test.wav。
7) 攝像頭
借用?picam 生成 HTTP Live Streaming (HLS) 直播視頻流。
1. 將樹(shù)莓派攝像頭接至樹(shù)莓派。
2. 運(yùn)行 sudo raspi-config,選擇 Interfacing Options,選擇 Camera?> Yes。
3. 安裝 picam 的依賴:
sudo apt-get update
sudo apt-get install libharfbuzz0b libfontconfig1
4. 創(chuàng)建目錄和軟連接:
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 庫(kù):
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. 創(chuàng)建 HLS 視頻直播流:
cd ~/picam
./picam -o /run/shm/hls
7. 配置 Nginx 服務(wù)器。運(yùn)行 sudo vi /etc/nginx/sites-available/default,在 server 的 { ... } 塊中添加以下內(nèi)容:
location /hls/ {
root /run/shm;
}
8. 重啟 Nginx:
sudo /etc/init.d/nginx restart
9. 測(cè)試播放視頻流:
HLS 地址為 http://[IP-of-Raspberry-Pi]/hls/index.m3u8
i. 使用 Mac 自帶的 QuickTime 播放:
打開(kāi) QuickTime,選擇 File > Open Location, 輸入 http://[IP-of-Raspberry-Pi]/hls/index.m3u8。
ii. 或使用網(wǎng)頁(yè)播放:
a. 下載測(cè)試用的 html 復(fù)制至 Nginx 服務(wù)器根目錄:
sudo cp ~/PiBot/PiBotServer/public/hls_test.html /var/www/html/hls_test.html
b. 在樹(shù)莓派或同一網(wǎng)絡(luò)中的電腦上,打開(kāi)瀏覽器,轉(zhuǎn)到 http://[IP-of-Raspberry-Pi]/hls_test.html。
配置 Nginx 服務(wù)器
啟用 80 端口的 HTTP 以及 443 端口的 HTTPS。如果不啟用 HTTPS,當(dāng)域名非 localhost 時(shí)將無(wú)法使用錄音功能。參考: https://goo.gl/rStTGz
1. 運(yùn)行 sudo openssl req -x509 -nodes -days 365 -newkey rsa:2048 -keyout /etc/nginx/snippets/nginx-selfsigned.key -out /etc/nginx/snippets/nginx-selfsigned.crt 創(chuàng)建 HTTPS 用的證書(shū)。
2. 將 /etc/nginx/sites-enabled/default?內(nèi)的內(nèi)容替換為 ~/PiBot/PiBotServer/ngnix/default。
3. 運(yùn)行 sudo nginx -t?測(cè)試配置文件。如果沒(méi)問(wèn)題,重啟 Nginx 服務(wù)器:sudo /etc/init.d/nginx restart
使用網(wǎng)頁(yè)應(yīng)用
1. 運(yùn)行 cd ~/PiBot/PiBotServer;npm install?安裝依賴。
2. 開(kāi)啟 HLS 直播視頻流:
cd ~/picam
./make_dirs.sh
./picam -o /run/shm/hls --vflip --hflip
3. 開(kāi)啟網(wǎng)頁(yè)應(yīng)用:
cd ~/PiBot/PiBotServer
sudo npm start
4. 在瀏覽器中打開(kāi) http[s]://[IP-of-Raspberry-Pi]?(將 IP-of-Raspberry-Pi 替換為實(shí)際的網(wǎng)址,比如:192.168.1.16)。
使用移動(dòng)應(yīng)用
iOS
i. 編譯并在模擬器中運(yùn)行:
cd PiBot/PiBotApp
npm install
npm run ios
ii. 在設(shè)備上運(yùn)行:
參考 React Native 官方文檔的 Running your app on iOS devices。
Android
i. 編譯并在模擬器中運(yùn)行應(yīng)用:
cd PiBot/PiBotApp
npm install
npm run android
ii. 在設(shè)備上運(yùn)行:
參考 React Native 官方文檔的 Running your app on Android devices。
或者直接使用repo中的 PiBot.apk。