開發者嚐鮮阿里小程序雲平臺,實操講解如何打造智能小車!

輕鬆使用阿里雲完成智能小車


  • 前言
  • 開發準備
  • 硬件
  • 軟件
  • 硬件連接
  • 環境部署
  • 阿里雲應用
  • MJPG-Streamer
  • frp
  • 申請域名解析
  • 服務器部署 Nginx
  • 配置測試頁面
  • 阿里雲微消息隊列MQTT
  • 海創物聯開發平臺部署

前言

智能小車,自娛自樂,希望通過該分享幫助更多愛好者們化繁為簡,待我完成到第三季,我將會把程序放出來拱大家使用,我準備分三季來實現,APP後臺部署在阿里小程序雲,通過阿里雲MQTT消息隊列服務,來完成指令控制,並實現事件日誌機制。

第一季實現小車的控制目標

1、實現小車4驅控制

2、實現攝像頭實時查看,藉助反向代理來完成內外網的通信

3、實現指令通過阿里雲微消息隊列MQTT來交互

4、設計APP端的控制界面實現

開發者嚐鮮阿里小程序雲平臺,實操講解如何打造智能小車!

第二季實現目標

1、實現攝頭雲端控制

2、人臉檢測

3、打包容器

4、熱體紅外+超聲波測距+溼度溫度

第三季實現目標

思考中。。

第一季開發準備

硬件

開發準備

硬件

  • 樹莓派3b+
  • 小車底座
  • L298N電機驅動模塊
  • 杜邦線
  • 充電寶
  • 6v~50V電源
  • 樹莓派專用攝像頭 Raspberry Pi Camera

軟件

  • 阿里小程序雲應用
  • MJPG-Streamer
  • frp
  • 阿里雲微消息隊列MQTT
  • 支付寶小程序開發者工具

硬件連接

整體效果

開發者嚐鮮阿里小程序雲平臺,實操講解如何打造智能小車!

  1. 樹莓派上電,將充電寶用usb線將樹莓派於其連接,可看到樹莓派紅色指示燈常亮,綠色指示燈閃爍。如果發現紅色指示燈忽然熄滅或者亮點很低,請檢查充電寶輸出電壓以及電流是否太低
  1. 插入樹莓派攝像頭,注意不要插反,排線金屬側正對插排口金屬側,插入後扣緊排口
開發者嚐鮮阿里小程序雲平臺,實操講解如何打造智能小車!

  1. gpio與電機驅動模塊in口連接。這邊我們選擇GPIO5、GPIO6、GPIO12、GPIO13、GPIO19、GPIO16、GPIO26、GPIO20 (GIPIO與針腳值不一致,對應針腳位置請參考下圖,針腳39,40的位置在USB口旁邊) 與驅動模塊的IN1~IN8連接 (連接順序請自行調整,驅動模塊IN1的數字量輸入控制OUT1輸出,OUT1-OUT2如果連接同一個電機的輸入和輸出端,那麼IN1-IN2對應輸入數字信號[1,0]則代表前進,[0,1]代表後退,[0,0]或者[1,1]代表停止,以此類推IN1~IN8,OUT1~OUT8)
開發者嚐鮮阿里小程序雲平臺,實操講解如何打造智能小車!

開發者嚐鮮阿里小程序雲平臺,實操講解如何打造智能小車!

開發者嚐鮮阿里小程序雲平臺,實操講解如何打造智能小車!

環境部署

阿里雲應用

雲應用是面向小程序應用場景,為開發者提供的一鍵構建後端應用運行環境、後端服務部署、運維監控等能力的一站式小程序部署服務。

我們需要申請一個雲應用充當小程序的服務器以及fpc服務器。現在阿里推出繁星計劃,可以免費申請2個月的測試環境以及一個月的生產環境,無需申請,直接在應用界面新建新運用,創建詳情請參考文檔

開發者嚐鮮阿里小程序雲平臺,實操講解如何打造智能小車!

在控制檯獲取服務器ip、用戶名(默認root)、密碼(需要修改默認密碼,然後重啟服務器),通過SSH工具連接,用於部署下面步驟

MJPG-Streamer

MJPG-Streamer是一個命令行應用程序,它將JPEG幀從一個或多個輸入插件複製到多個輸出插件。它可用於通過基於IP的網絡將JPEG文件從網絡攝像頭流式傳輸到各種類型的查看器,如Chrome,Firefox,Cambozola,VLC,mplayer和其他能夠接收MJPG流的軟件。

  1. 開啟樹莓派攝像頭
  2. 樹莓派攝像頭總線是默認沒開啟的,請在命令行中開啟,進入後,選擇camera項,再選擇enable,然後重啟
sudo raspi-config
  1. 安裝必要的庫
sudo apt-get update
sudo apt-get install subversion
sudo apt-get install libjpeg8-dev
sudo apt-get install imagemagick
sudo apt-get install libv4l-dev
sudo apt-get install cmake
sudo apt-get install git
  1. git開源的project到本地,編譯
sudo git clone https://github.com/jacksonliam/mjpg-streamer.git
cd mjpg-streamer/mjpg-streamer-experimental
make all
sudo make install
  1. 解決V4L driver不支持的問題
sudo wget http://www.linux-projects.org/listing/uv4l_repo/lrkey.asc &&
sudo apt-key add ./lrkey.asc

修改sources.list,在末尾添加源,並安裝uv4l uv4l-raspicam,然後重啟

sudo nano /etc/apt/sources.list
#末尾添加,保存
deb http://www.linux-projects.org/listing/uv4l_repo/raspbian/ wheezy main
sudo apt-get update
sudo apt-get install uv4l uv4l-raspicam
sudo reboot

重啟之後:

sudo pkill uv4l
sudo apt-get update
sudo apt-get install uv4l-uvc
sudo apt-get install uv4l-xscreen
sudo apt-get install uv4l-mjpegstream
sudo reboot

再一次重啟之後開啟視頻流服務

sudo modprobe bcm2835-v4l2
./mjpg_streamer -i "./input_uvc.so -d /dev/video0 -n -y -f 25 -r 640x480" -o "./output_http.so -n -w /usr/local/www"

然後打開瀏覽器輸入:http://raspberry-ip-address:8080/?action=stream

應該就可以看到Raspberry Pi Camera採集的動態視頻了,延遲大概不超過0.8秒吧。

frp

frp是一個快速反向代理,可幫助您將NAT或防火牆後面的本地服務器暴露給Internet。截至目前,它支持tcp&udp以及http和https協議,其中請求可以通過域名轉發到內部服務。

  1. 服務端部署 frps
  2. 在購買的服務端(有公網IP)部署frps,用於穿透樹莓派本地的視頻流
wget --no-check-certificate https://raw.githubusercontent.com/clangcn/onekey-install-shell/master/frps/install-frps.sh -O ./install-frps.sh
chmod 700
./install-frps.sh
./install-frps.sh install

然後一直回車(默認配置),知道全部安裝完成。安裝成功截圖

開發者嚐鮮阿里小程序雲平臺,實操講解如何打造智能小車!

  1. 啟動frps
frps start

查看frps版本號

frps -v

我這邊安裝的是version 0.20.0,客戶端也要安裝對應版本的

  1. 樹莓派部署frpc
  2. 由於我們服務器部署frps的版本是version 0.20.0,所以我們本地也要部署相同的版本
wget https://github.com/fatedier/frp/releases/download/v0.20.0/frp_0.20.0_linux_arm.tar.gz
tar zxvf frp_0.20.1_linux_arm.tar.gz
cd frp_0.14.1_linux_arm
vi frpc.ini

修改 frpc.ini 文件

# frpc.ini
[common]
#服務器IP
server_addr = x.x.x.x
#服務器fpcs服務對應端口Bind port
server_port = 5443
#服務端token
oken = 你的服務端token
[ssh]
type = tcp
local_ip = 127.0.0.1
local_port = 22

remote_port = 6000
#[]內名稱不能重複,標籤作用
[web_raspberry_web]
type = http
#端口號 對應本機視頻web服務器的端口
local_port = 8080
#配置穿透外網訪問域名,可設置多個
custom_domains = raspberry.你的域名.com

修改好frpc.ini後,啟動frpc客戶端。如果想在後臺運行,可在命令後加 &

./frpc -c frpc.ini 

申請域名解析

將你的的域名主機記錄 raspberry A 記錄解析到你的服務器IP x.x.x.x

開發者嚐鮮阿里小程序雲平臺,實操講解如何打造智能小車!

服務器部署 Nginx

Nginx (engine x) 是一個高性能的HTTP和反向代理web服務器,同時也提供了IMAP/POP3/SMTP服務。

Ubuntu16.04安裝及配置nginx

  1. 安裝gcc g++的依賴庫
apt-get install build-essential
apt-get install libtool
  1. 安裝pcre依賴庫
sudo apt-get update
sudo apt-get install libpcre3 libpcre3-dev
  1. 安裝zlib依賴庫
apt-get install zlib1g-dev

4.安裝ssl依賴庫

apt-get install openssl

安裝nginx

#下載最新版本:
wget http://nginx.org/download/nginx-1.16.0.tar.gz
#解壓:
tar -zxvf nginx-1.11.3.tar.gz
#進入解壓目錄:

cd nginx-1.11.3
#配置:
./configure --prefix=/usr/local/nginx
#編輯nginx:
make
注意:這裡可能會報錯,提示“pcre.h No such file or directory”,具體詳見:http://stackoverflow.com/questions/22555561/error-building-fatal-error-pcre-h-no-such-file-or-directory
需要安裝 libpcre3-dev,命令為:sudo apt-get install libpcre3-dev
#安裝nginx:
sudo make install
#啟動nginx:
sudo /usr/local/nginx/sbin/nginx -c /usr/local/nginx/conf/nginx.conf
注意:-c 指定配置文件的路徑,不加的話,nginx會自動加載默認路徑的配置文件,可以通過 -h查看幫助命令。
#查看nginx進程:
ps -ef|grep nginx

在瀏覽器輸入 http://raspberry.你的域名.com:8080

出現頁面則nginx部署成功

配置測試頁面

新建一個index.html文件,用於測試頁面,內容如下



content="HTML Tidy for HTML5 (experimental) for Windows https://github.com/w3c/tidy-html5/tree/c63cc39" />

content="width=device-width, initial-scale=1.0, user-scalable=no, minimum-scale=1.0, maximum-scale=1.0" />

<title>樹莓派實時監控站/<title>


<center>

樹莓派

實時監控站

/<font>


frameLabelStart--frameLabelEnd




Design by James
/<font>




a Web Monitoring Based on Raspberry Pi
/<font>


/<center>


將該文件替換在nginx配置的web路徑的index.html文件,例如/var/www/index.html

在瀏覽器輸入 http://raspberry.你的域名.com:8080

嘗試一下能否訪問,如果成功出現樹莓派實時監控頁面,則web頁面部署成功

阿里雲微消息隊列MQTT

微消息隊列 MQTT 是阿里雲推出的一款面向移動互聯網以及物聯網領域的輕量級消息中間件,針對移動互聯網以及物聯網 IoT 場景的消息傳輸特點,支持了包括 MQTT、STOMP、GB-808、新能源國標等主流通信協議

  1. 創建服務
  2. 打開MQTT控制檯,需要登錄阿里雲賬號,若沒賬號請自行申請。登錄後請根據阿里雲mqtt說明書創建mqtt服務。創建完畢後如下圖,主要用到參數有 實例id、公網接入點、消息存儲實例、Topic、Group
開發者嚐鮮阿里小程序雲平臺,實操講解如何打造智能小車!

開發者嚐鮮阿里小程序雲平臺,實操講解如何打造智能小車!

開發者嚐鮮阿里小程序雲平臺,實操講解如何打造智能小車!

海創物聯開發平臺部署

海創開發平臺是海創科技有限公司開發的一款快速編程平臺,該平臺開發的組件能快速與PLC、GPIO、各式設備進行通訊,有豐富的API支持,基本你們想到的事情它都能幹,非常適合做物聯網的網關控制中心

  1. 導入程序
  2. 打開海創物聯開發平臺的控制頁 http://樹莓派ip:1880/#flow/fd2b8cdb.5b63b

複製以下代碼,打開開發平臺,點擊右上角菜單,選擇導入-剪切板,然後粘貼保存,即可看到工作區新增了一個新的流程,該流程用於接受MQTT命令控制小車

[{"id":"9e9c968e.24e348","type":"rpi-gpio out","z":"d99269c6.a2d0b8","name":"","pin":"29","set":true,"level":"0","freq":"","out":"out","x":720,"y":140,"wires":[]},{"id":"37f46ac8.666436","type":"rpi-gpio out","z":"d99269c6.a2d0b8","name":"","pin":"31","set":true,"level":"0","freq":"","out":"out","x":720,"y":180,"wires":[]},{"id":"5f130d8f.f55d84","type":"function","z":"d99269c6.a2d0b8","name":"控制","func":"switch(msg.payload)\n{\n case '0':return [{payload:0},{payload:0},{payload:0},{payload:0},{payload:0},{payload:0},{payload:0},{payload:0}];\n case '1':return [{payload:0},{payload:1},{payload:0},{payload:1},{payload:0},{payload:1},{payload:0},{payload:1}];\n case '2':return [{payload:1},{payload:0},{payload:1},{payload:0},{payload:1},{payload:0},{payload:1},{payload:0}];\n case '4':return [{payload:0},{payload:0},{payload:0},{payload:0},{payload:1},{payload:0},{payload:1},{payload:0}];\n case '3':return [{payload:1},{payload:0},{payload:1},{payload:0},{payload:0},{payload:0},{payload:0},{payload:0}];\n}\n","outputs":8,"noerr":0,"x":510,"y":320,"wires":[["9e9c968e.24e348","676a7be6.b97e14"],["37f46ac8.666436","676a7be6.b97e14"],["2e8cc1ec.6369ce","676a7be6.b97e14"],["c7700a0b.47b378","676a7be6.b97e14"],["676a7be6.b97e14","482e8885.76d548"],["676a7be6.b97e14","62b4d0fc.a93f3"],["676a7be6.b97e14","fd3c406.31fc4c"],["676a7be6.b97e14","6ac88490.ba21bc"]]},{"id":"2e8cc1ec.6369ce","type":"rpi-gpio out","z":"d99269c6.a2d0b8","name":"","pin":"32","set":true,"level":"0","freq":"","out":"out","x":720,"y":240,"wires":[]},{"id":"c7700a0b.47b378","type":"rpi-gpio out","z":"d99269c6.a2d0b8","name":"","pin":"33","set":true,"level":"0","freq":"","out":"out","x":720,"y":280,"wires":[]},{"id":"8e757771.a599e8","type":"inject","z":"d99269c6.a2d0b8","name":"","topic":"停止","payload":"0","payloadType":"str","repeat":"","crontab":"","once":false,"onceDelay":0.1,"x":250,"y":260,"wires":[["5f130d8f.f55d84"]]},{"id":"89e33a84.467878","type":"inject","z":"d99269c6.a2d0b8","name":"","topic":"前進","payload":"1","payloadType":"str","repeat":"","crontab":"","once":false,"onceDelay":0.1,"x":250,"y":320,"wires":[["5f130d8f.f55d84"]]},{"id":"e521ba16.452cc8","type":"inject","z":"d99269c6.a2d0b8","name":"","topic":"後退","payload":"2","payloadType":"str","repeat":"","crontab":"","once":false,"onceDelay":0.1,"x":250,"y":380,"wires":[["5f130d8f.f55d84"]]},{"id":"676a7be6.b97e14","type":"debug","z":"d99269c6.a2d0b8","name":"","active":false,"tosidebar":true,"console":false,"tostatus":false,"complete":"false","x":750,"y":580,"wires":[]},{"id":"482e8885.76d548","type":"rpi-gpio out","z":"d99269c6.a2d0b8","name":"","pin":"35","set":true,"level":"0","freq":"","out":"out","x":720,"y":340,"wires":[]},{"id":"62b4d0fc.a93f3","type":"rpi-gpio out","z":"d99269c6.a2d0b8","name":"","pin":"36","set":true,"level":"0","freq":"","out":"out","x":720,"y":380,"wires":[]},{"id":"fd3c406.31fc4c","type":"rpi-gpio out","z":"d99269c6.a2d0b8","name":"","pin":"37","set":true,"level":"0","freq":"","out":"out","x":720,"y":440,"wires":[]},{"id":"6ac88490.ba21bc","type":"rpi-gpio out","z":"d99269c6.a2d0b8","name":"","pin":"38","set":true,"level":"0","freq":"","out":"out","x":720,"y":480,"wires":[]},{"id":"6473261a.673168","type":"inject","z":"d99269c6.a2d0b8","name":"","topic":"左轉","payload":"3","payloadType":"str","repeat":"","crontab":"","once":false,"onceDelay":0.1,"x":250,"y":440,"wires":[["5f130d8f.f55d84"]]},{"id":"73eb851c.b88ddc","type":"inject","z":"d99269c6.a2d0b8","name":"","topic":"右轉","payload":"4","payloadType":"str","repeat":"","crontab":"","once":false,"onceDelay":0.1,"x":250,"y":480,"wires":[["5f130d8f.f55d84"]]},{"id":"bf85c267.64f96","type":"mqtt in","z":"d99269c6.a2d0b8","name":"","topic":"","qos":"2","broker":"bf40108b.620c2","x":235,"y":160,"wires":[["5f130d8f.f55d84","8a1c007d.34912"]]},{"id":"8a1c007d.34912","type":"debug","z":"d99269c6.a2d0b8","name":"","active":false,"tosidebar":true,"console":false,"tostatus":false,"complete":"false","x":435,"y":180,"wires":[]},{"id":"c1f327d8.b01818","type":"inject","z":"d99269c6.a2d0b8","name":"","topic":"","payload":"","payloadType":"date","repeat":"","crontab":"","once":false,"onceDelay":0.1,"x":240,"y":40,"wires":[["c4d9812a.7b54b"]]},{"id":"c4d9812a.7b54b","type":"mqtt out","z":"d99269c6.a2d0b8","name":"","topic":"","qos":"","retain":"","x":415,"y":40,"wires":[]},{"id":"bf40108b.620c2","type":"mqtt-broker","z":"","name":"","broker":"","port":"1883","clientid":"","usetls":false,"compatmode":true,"keepalive":"60","cleansession":true,"birthTopic":"","birthQos":"0","birthPayload":"","closeTopic":"","closeQos":"0","closePayload":"","willTopic":"","willQos":"0","willPayload":""}]

導入後效果如下

開發者嚐鮮阿里小程序雲平臺,實操講解如何打造智能小車!

  1. 修改節點屬性
  2. 導入的流程不能直接使用,需要修改一些節點屬性配置。

雙擊mqtt out節點,在屬性窗點擊服務器右側的那個小標籤按鈕進入mqtt服務配置。填好服務器(阿里mqtt實例的外網http接入點)、端口號(默認1883)、客戶端id("Group ID@@@任意id" 客戶端ID在每個實例每個主題中只能唯一,重複情況下後面連接的自動被阿里斷開)、用戶名(這邊我們使用的是簽名鑑權模式,Token鑑權模式參考文檔"Signature|Access Key|實例 ID")、密碼(參考阿里的簽名機制,快捷生成簽名請點擊簽名校驗),點擊保存返回mqtt屬性配置頁,填寫主題(阿里的Topic ID),QOS選擇1(至少上傳一次)。mqtt in節點類似,由於接受消息是用於控制小車,所以QOS選擇2(僅分發一次),以下是配置詳情

開發者嚐鮮阿里小程序雲平臺,實操講解如何打造智能小車!

開發者嚐鮮阿里小程序雲平臺,實操講解如何打造智能小車!

開發者嚐鮮阿里小程序雲平臺,實操講解如何打造智能小車!

開發者嚐鮮阿里小程序雲平臺,實操講解如何打造智能小車!

PIN控制著電機驅動模塊從而控制小車的動作,前進(四個輪子前進)、後退(四個輪子後退)、左轉(右側輪子轉)、右轉(左側輪子轉)。假設相鄰的兩個OUT口連接一個電機,那麼驅動模塊的控制邏輯為

IN1IN2~數字信號10電機前進數字信號01電機後退數字信號00電機停止數字信號11電機停止

根據該邏輯配置function節點(示例已包含,請根據自己的接法設置GPIO口的信號輸出)

開發者嚐鮮阿里小程序雲平臺,實操講解如何打造智能小車!

  1. 部署調試
  2. 點擊菜單欄的部署按鈕對程序部署,程序正式運行

單擊定時器後mqtt out節點會將測試使用的時間戳上傳到阿里的mqtt服務器,然後mqtt in會訂閱接受到該消息,並在右側調試窗口輸出。正式使用數據請輸入0、1、2、3

使用mqtt發送正式消息,操作結果


分享到:


相關文章: