更新續(xù)篇>>會聊天的樹莓派視頻遙控小車 + iOS / Android / web應(yīng)用
本文介紹了一種樹莓派遙控小車的實現(xiàn)鞠抑,做這個的初衷是希望能在不同平臺和樹莓派愉快地玩耍包蓝,所以視頻直播用了 HLS 技術(shù)硝烂,缺點是有一定延遲别威。iOS 和 Android 客戶端使用React Native查排,web端為 React凳枝,后臺為 NodeJS,通信使用 websocket。主要功能有視頻監(jiān)控岖瑰,溫濕度檢測叛买,紅外遙控等。出于方便蹋订,一部分 GPIO 操作還是用的 Python 和 C率挣。具體代碼請見:https://github.com/shaqian/PiBot
手機應(yīng)用演示
應(yīng)用界面
組裝演示
元件列表
樹莓派:Raspberry Pi v3 Model B
樹莓派攝像頭: 8MP Raspberry Pi Camera v2
Micro SD 內(nèi)存卡:8G 或以上
USB聲卡
麥克風:3.5mm 接口
迷你音箱:3.5mm 接口
小車底盤:ZK-4WD
馬達驅(qū)動:L298n
5v電源:給樹莓派供電
電池電源:兩節(jié)18650 (3.7v)電池加電池殼,給馬達驅(qū)動供電
DC降壓模塊:LM2596S露戒,7.4v轉(zhuǎn)5v椒功,給舵機供電
舵機:SG90 9g
舵機底座:我用的是這個,但只用了單層智什,因為樹莓派只有2組硬件 PWM动漾,需要留一組給紅外輸出。
紅外發(fā)射模塊:可以用 Arduino 的紅外發(fā)射模塊 KY-005荠锭,但是可達距離較短旱眯。推薦這個大功率紅外模塊,距離可達幾米证九。
紅外接收模塊:KY-022 (IR Receiver for Arduino)
面包板:SYB-170
杜邦線:20或30厘米删豺,公對母
電阻:1/4W 1kΩ & 2kΩ
設(shè)置樹莓派和網(wǎng)絡(luò)
如果不是第一次使用樹莓派,可跳過此部分內(nèi)容愧怜。
1) 安裝樹莓派系統(tǒng) (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月之后發(fā)布的 Raspbian 默認關(guān)閉了 SSH卧波,啟用方式是在 SD 卡的根目錄創(chuàng)建一個名為 ssh 的文件时肿,不帶任何擴展名。
2. 從電腦彈出 SD 卡港粱,并插入樹莓派螃成。
3. 將樹莓派用網(wǎng)線連接至家用路由器旦签,并用 5v 電源給樹莓派供電。
4. 找到樹莓派的 IP寸宏。如果沒用路由器的權(quán)限宁炫,可以運行 sudo nmap -sP -PI -PT 192.168.1.0/24 掃描家庭網(wǎng)絡(luò)中的所有設(shè)備。
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落午,確認已存在以下內(nèi)容:
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 以生效,設(shè)置完成后可拔出網(wǎng)線溃斋。
安裝必要軟件
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梗劫,開啟服務(wù)器 sudo /etc/init.d/nginx start 享甸。
4) 音頻視頻相關(guān)
安裝ALSA開發(fā)庫:sudo apt-get install libasound2-dev。如果返回404梳侨,先運行 sudo apt-get upgrade --fix-missing蛉威。
avconv 用來轉(zhuǎn)換錄像為.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) 馬達驅(qū)動及馬達
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。轉(zhuǎn)至中間:
./direct.py 7
4. 左轉(zhuǎn)到底:
./direct.py 2.5
5. 右轉(zhuǎn)到底:
./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) 紅外接收模塊
紅外接收模塊用來接收和解碼遙控器信號丙躏,然后樹莓派發(fā)送相同信號即可模擬遙控器择示。
代碼借用這個 repo,修改了端口晒旅,以及ST_BASE的值栅盲,樹莓派3 (BCM2837) 為0x3F003000 ,而舊版為 0x20003000敢朱。
1. 按電路圖接線:
2. 運行 gpio -v 檢查是否已安裝wiringPi剪菱。沒有的話摩瞎,安裝 Wiring Pi拴签。
3. 運行 cd ~/PiBot/PiBotServer/bin孝常。編譯代碼生成可執(zhí)行文件:
gcc ir_decode.c -lwiringPi -o decode.out
chmod +x decode.out
4. 運行 sudo ./decode.out。沒有信號時屏幕每秒打印 [0]蚓哩。
5. 將遙控器對準紅外接收模塊并按鍵构灸。解碼后的信號為一串十六進制數(shù),如:0xb2,0x4d,0x1f,0xe0,0x98,0x67,[48]岸梨。
6. 重復(fù)以上步驟喜颁,解碼空調(diào)開機和關(guān)機的信號。
5) 紅外發(fā)射模塊
紅外解碼完成后移除紅外接收模塊
1. 按電路圖接線:
2. 運行以下命令復(fù)制編碼代碼:
cd ~/PiBot/PiBotServer/bin
cp ir_encode.c on.c
cp ir_encode.c off.c
3. 運行 vi on.c曹阔,將 166 行的十六進制數(shù)改為解碼所得的開機信號半开,如:
char data[6] = {0xb2,0x4d,0x1f,0xe0,0xd8,0x27};
4. 運行 vi off.c,將 166 行的十六進制數(shù)改為解碼所得的關(guān)機信號赃份,如:
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ā)射開機信號:sudo ./on.out
7. 發(fā)射關(guān)機信號: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聲卡設(shè)為默認音頻設(shè)備,運行 sudo vi /lib/modprobe.d/aliases.conf苍日,寫入以下內(nèi)容并保存:
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 無需指定設(shè)備編號即是 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. 創(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 庫:
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ù)器。運行 sudo vi /etc/nginx/sites-available/default揩魂,在 server 的 { ... } 塊中添加以下內(nèi)容:
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. 或使用網(wǎng)頁播放:
a. 下載測試用的 html 復(fù)制至 Nginx 服務(wù)器根目錄:
sudo cp ~/PiBot/PiBotServer/public/hls_test.html /var/www/html/hls_test.html
b. 在樹莓派或同一網(wǎng)絡(luò)中的電腦上火脉,打開瀏覽器牵舵,轉(zhuǎn)到 http://[IP-of-Raspberry-Pi]/hls_test.html柒啤。
配置 Nginx 服務(wù)器
啟用 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 創(chuàng)建 HTTPS 用的證書。
2. 將 /etc/nginx/sites-enabled/default?內(nèi)的內(nèi)容替換為 ~/PiBot/PiBotServer/ngnix/default没炒。
3. 運行 sudo nginx -t?測試配置文件涛癌。如果沒問題,重啟 Nginx 服務(wù)器:sudo /etc/init.d/nginx restart
使用網(wǎng)頁應(yīng)用
1. 運行 cd ~/PiBot/PiBotServer;npm install?安裝依賴送火。
2. 開啟 HLS 直播視頻流:
cd ~/picam
./make_dirs.sh
./picam -o /run/shm/hls --vflip --hflip
3. 開啟網(wǎng)頁應(yīng)用:
cd ~/PiBot/PiBotServer
sudo npm start
4. 在瀏覽器中打開 http[s]://[IP-of-Raspberry-Pi]?(將 IP-of-Raspberry-Pi 替換為實際的網(wǎng)址拳话,比如:192.168.1.16)。
使用移動應(yīng)用
iOS
i. 編譯并在模擬器中運行:
cd PiBot/PiBotApp
npm install
npm run ios
ii. 在設(shè)備上運行:
參考 React Native 官方文檔的 Running your app on iOS devices种吸。
Android
i. 編譯并在模擬器中運行應(yīng)用:
cd PiBot/PiBotApp
npm install
npm run android
ii. 在設(shè)備上運行:
參考 React Native 官方文檔的 Running your app on Android devices弃衍。
或者直接使用repo中的 PiBot.apk。