# WiFi遙控車
這個作品是使用樹莓派(Raspberry Pi)所做的WiFi遙控車,透過手機熱點分享給樹莓派,並建立網頁遙控器,透過網頁操控遙控車做簡單的前行後退與左右移動。
#
# 遙控車圖片

#
# 影片連結
https://youtube.com/shorts/SIr67oPQ4A8?feature=share
#
# 所需材料
- Raspberry pi
- L298N馬達驅動板
- 減速直流馬達*2
- 測速馬盤*2
- ST-2WD智能小車底盤*1
- 車輪*2
- 4節五號電池盒*1
- 1.5V電池*4
- 方向輪*1
- 船型開關*1
- M3*30x螺絲*4
- M3*6螺絲*8
- M3螺帽*8
- L12銅柱*4
- 塑膠殼、雙面膠、行動電源
#
# 組裝步驟與程式碼
## Step 1 安裝遙控車車體
在實際安裝馬達驅動版與Raspberry前,需先安裝車身架構與馬達、電池盒等外殼,並安裝船型開關,將電池盒正極焊接至船型開關的一端,另外一端焊接一條線備用,以及減速馬達需先焊上接線,如下圖

*注意!!船型開關不可直接接正負極*

## Step 2 串接減速直流馬達
接著開始接L298N,接法說明如下

輸出A分別接右側馬達的兩條線
輸出B分別接左側馬達的兩條線
+12V電源輸入孔接Step1船型開關焊接的備用的線,透過電池組來供應L298N所需的電
GND接地Raspberry Pi與電池盒的接地
+5V電源輸入閒置不用
IN1-->接Raspberry Pi pin7
IN2-->接Raspberry Pi pin11
IN1、IN2控制連接到輸出A的馬達,透過高低電位的組合決定正轉還是逆轉
IN3-->接Raspberry Pi pin13
IN4-->接Raspberry Pi pin15
IN3、IN4控制連接輸出的B馬達,決定正轉還是逆轉
L298N的供電由4顆1.5V的五號電池提供,操控遙控車時須先將船型電源打開
Raspberry Pi則透過行動電源供電,以達到無線遙控的效果
## Step 3 程式碼撰寫
程式部分
--遙控車測試程式碼
編寫測試遙控車是否可以正常運作的cartest.py檔,透過控制四顆輪子正轉逆轉,達到控制遙控車的方向
``` python
#! /usr/bin/python
import RPi.GPIO as gpio
import sys
gpio.setwarnings(False)
gpio.setmode(gpio.BOARD)
gpio.setup(7, gpio.OUT)
gpio.setup(11, gpio.OUT)
gpio.setup(13, gpio.OUT)
gpio.setup(15, gpio.OUT)
if len(sys.argv)<=1:
cmd = 'stop'
else:
cmd = sys.argv[1]
print(cmd)
if cmd == 'go' or cmd =='g':
#兩輪同時順時針轉
gpio.output(7, True)
gpio.output(11, False)
gpio.output(13, True)
gpio.output(15, False)
elif cmd == 'stop' or cmd =='s':
#兩輪同時不過電
gpio.output(7, False)
gpio.output(11, False)
gpio.output(13, False)
gpio.output(15, False)
elif cmd == 'back' or cmd =='b':
#兩輪同時逆時針轉
gpio.output(7, False)
gpio.output(11, True)
gpio.output(13, False)
gpio.output(15, True)
elif cmd == 'right' or cmd =='r':
#右輪逆時針、左輪順時針以達到右轉目的
gpio.output(7, True)
gpio.output(11, False)
gpio.output(13, False)
gpio.output(15, True)
elif cmd == 'left' or cmd =='l':
#左輪逆時針、右輪順時針以達到右轉目的
gpio.output(7, False)
gpio.output(11, True)
gpio.output(13, True)
gpio.output(15, False)
else:
#若輸入其他指令,則同樣停止
gpio.output(7, False)
gpio.output(11, False)
gpio.output(13, False)
gpio.output(15, False)
```
編寫完畢後,在終端機輸入以下指令
```
$ sudo chmod +x cartest.py
$ sudo cp car /usr/bin
```
將檔案設定成可執行檔,並複製到/usr/bin/底下,即可透過Raspberry 的終端機輸入指令控制遙控車
--建立car.py檔,由於最終我們是希望透過網頁的方式,去操控遙控車,因此需透過使用Python的Flask,將遙控車程式碼與網頁介面結合,使我們可以透過開啟網頁的方式進行遙控車的操控
```python
from flask import Flask, render_template
import RPi.GPIO as gpio
gpio.setwarnings(False)
gpio.setmode(gpio.BOARD)
gpio.setup(7, gpio.OUT)
gpio.setup(11, gpio.OUT)
gpio.setup(13, gpio.OUT)
gpio.setup(15, gpio.OUT)
#透過設定setwheel好方便我們操作
def setwheel(p7, p11, p13, p15):
gpio.output(7, p7)
gpio.output(11, p11)
gpio.output(13, p13)
gpio.output(15, p15)
app = Flask(__name__)
@app.route('/')
@app.route('/<cmd>')
def index(cmd=None):
"""Video streaming home page."""
if cmd == 'go':
setwheel(False, True, False, True)
elif cmd == 'stop':
setwheel(False, False, False, False)
elif cmd == 'back':
setwheel(True, False, True, False)
elif cmd == 'right':
setwheel(True, False, False, True)
elif cmd == 'left':
setwheel(False, True, True, False)
#將指令傳到網頁,預設會去執行car.py同一層的templates資料夾內的檔案
return render_template('index.html',cmd=cmd)
if __name__ =="__main__":
app.run(host='192.168.43.150',port='5000',debug=False)
```
--編寫網頁控制介面index.html,由於使用到Python Flask的功能,需在上一步編寫的car.py檔的同一層建立templates資料夾,並在該資料夾內建立index.html檔,檔案內容如下
```html!
<html>
<head>
<title>1111物聯網與大數據作業</title>
</head>
<body>
<center>
<h1>1111物聯網與大數據作業--WiFi遙控車</h1>
<a href='/go'>Go</a> .
<a href='/back'>Back</a> .
<a href='/stop'>Stop</a> .
<a href='/right'>Turn Right</a> .
<a href='/left'>Turn Left</a>
<hr>
{% if cmd %}
<h2> Your Command: {{ cmd }} </h2>
{% endif %}
</center>
</body>
</html>
```
## Step 3 程式碼編寫完畢後,執行car.py檔,結果會如下

點擊網址,即可開啟遙控頁面

# 其他發想
完成WiFi遙控車後,後續應該還有很多的應用與發想,因為家裡有養貓的關係,也許可以再接上伺服馬達與鏡頭,搭配逗貓棒與物體辨識,來自動辨識貓咪,達成讓家裡的貓咪運動的目的,或自動拍攝貓咪抓到逗貓棒的瞬間的照片等等
# Reference
- http://hophd.com/raspberry-pi-remote-car-hardware/
- http://www.ifuun.com/a2018071814824687/
- https://blog.miguelgrinberg.com/post/video-streaming-with-flask
- http://hophd.com/raspberry-pi-remote-car-program/