樹(shù)莓派視頻遙控小車 + iOS / Android / web應(yīng)用

更新續(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)用演示


PiBotApp


應(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 -laplay -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。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容