環境
Raspberry pi zero
iphone8
エディターはラズパイに初めから付いている、Thonnyを使ってます。
今回は
プログラムの解読が進まないので、今回は気分を変えて、プログラムをスマホで操作できるようにして、ラジコンっぽくしようと思います。
部品
- ピンソケット2種類
- 基板
- モータドライバ
- Raspberry Pi Zero
- ジャンプワイヤー
- モバイルバッテリ
配線繋げる
モータドライバ | 端子名と機能 | 繋ぐ先 |
1番 | GND | ラズパイGPIO39番 |
2番 | OUT1 出力端子 | モータの端子 |
3番 | NC | 何も繋げません。 |
4番 | Vref 制御電源端子 | モータドライバ8番と10kΩと繋いでます。 |
5番 | IN1 入力端子 | ラズパイGPIOピン13番 |
6番 | IN2 入力端子 | ラズパイGPIOピン15番 |
7番 | VCC ロジック側電源端子 | ラズパイGPIOピン1番(3.3V) |
8番 | VS 出力側電源端子 | ラズパイGPIOピン2番(5V) |
9番 | NC | 何も繋げません。 |
10番 | OUT2 出力端子 | モータの端子 |
*ラズパイGPIOピン番号です。GPIOポート番号ではありませんのでご注意ください。
↑こんな感じです。
HTMLを作る
最初に、Webブラウザの操作画面をHTMLで作ります。
↓こんな感じです。”motor-client.html”というファイルに保存します。
<!DOCTYPE html><html><head><meta chatset="utf-8">
<meta name="viewport" content="width=device-width">
<script src="https://code.jquery.com/jquery-3.1.1.min.js"></script>
<style> button { font-size:30px; border-radius:6px; } </style>
</head><body style="text-align:center; font-size:30px;">
<script>
function send(cmd) { $.get(cmd); $('#msg').html(cmd); }
</script><p>
<button onclick="send('slottle')">slottle</button><br>
<button onclick="send('brake')">brake</button><br>
<p id="msg"></p>
</p></body></html>
ラジコンとなるプログラムを作る
次にラジコンのプログラムを作ります。
↓こんな感じです。”Car_Controller.py”というファイルで保存します。
class CarController(object):
FORWARD_PIN = 27 #ラズパイGPIO
BACKWARD_PIN = 22 #ラズパイGPIO
def __init__(self):
# slottle
wp.wiringPiSetupGpio()
wp.pinMode(CarController.FORWARD_PIN,1)
wp.softPwmCreate(CarController.FORWARD_PIN,0,100)
wp.pinMode(CarController.BACKWARD_PIN,1)
wp.softPwmCreate(CarController.BACKWARD_PIN,0,100)
def slottle(self,x):
#"""
#x: -1.0 to 1.0
#"""
x = int(max(-100,min(100,100*x)))
if 0<=x:
wp.softPwmWrite(CarController.FORWARD_PIN,abs(x))
wp.softPwmWrite(CarController.BACKWARD_PIN,0)
if x<0:
wp.softPwmWrite(CarController.FORWARD_PIN,0)
wp.softPwmWrite(CarController.BACKWARD_PIN,abs(x))
Webサーバーのプログラムを作る
次にWebサーバのプログラムを作ります。
↓こんな感じです。「ブレーキ」とありますが、実際は「スロットル」の信号を「0」にしてるだけです。
from http.server import HTTPServer, BaseHTTPRequestHandler
from car_controller import CarController
class MotorServerHandler(BaseHTTPRequestHandler):
#get to access
def do_GET(self):
path = self.path
print("path=", path)
body = "ok"
if path == "/":
f = open("motor-client.html", encoding='utf-8')
body = f.read()
f.close()
#スロットル
if path == "/slottle":
q = CarController()
q.slottle(x= 0.5)
#ブレーキ
elif path == "/brake":
q = CarController()
q.slottle(x = 0.0)
else:
print("commnad unknown")
self.send_response(200)
self.send_header('Content-Type', 'text/html;charset=utf-8')
self.end_headers()
self.wfile.write(body.encode('utf-8'))
try:
#start server
addr = ('', 8081)
httpd = HTTPServer(addr, MotorServerHandler)
print("start server")
httpd.serve_forever()
except KeyboardInterrupt:
pass
httpd.socket.close()
やってみよう!
プログラムができたので、実際やってみます。
書いたプログラムは同じフォルダに入れておいてください。
次にLXTerminalを開きます。ファイルが実行できるように”cd”で移動します。
cd プログラムが入ってるフォルダのパス
次に”motor-server.py”プログラムを実行します。
sudo python3 motor-server.py
すると、「start server」という文字がLXTerminal上に出ます。
次にスマホでラズパイのIPアドレスにアクセスします。
ブラウザはなんでもいいですが、私は「Google Chome」でアクセスします。
検索バーに
http://(ラズパイのIPアドレス):8081/
と入力します。↓のような画面がスマホ上に出るはずです。
「slottle」を押すとモータが回ります。
「brake」を押すとモータが止まります。
動画です。
できたー。やったー。
注意点
Car_Controller.pyのプログラムがわからない
そもそも、Car_Controller.pyのプログラムの中身がネットで拾った情報でよくわかっていません。
なので、とりあえず、xの値をそのまま数字を入れています。
解読できたら、報告します。
よろしくお願いします。