環境
Raspberry pi zero
iphone8
エディターはラズパイに初めから付いている、Thonnyを使ってます。
今回も
プログラムの解読が進まないので、今回も気分を変えて、プログラムをスマホで操作できるようにして、ラジコンっぽくしようと思います。
部品
- ピンソケット2種類
- 基板
- モータドライバ
- Raspberry Pi Zero
- ジャンプワイヤー
- モバイルバッテリ
配線繋げる
サーボモータ | 配線と機能 | ラズパイGPIO繋ぐ先 |
茶色 | マイナス線 GND | 6番ピン(GND) |
橙(赤?) | プラス線 | 2番ピン(5V) |
黄色 | 制御線 | 12番ピン *1kΩ抵抗を噛ませています。 |
↑こんな感じです。
HTMLを作る
最初に、Webブラウザの操作画面をHTMLで作ります。
↓こんな感じです。”servo-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('left')">left</button><br>
<button onclick="send('neutral')">neutral</button><br>
<button onclick="send('right')">right</button><br>
<p id="msg"></p>
</p></body></html>
ラジコンとなるプログラムを作る
次にラジコンのプログラムを作ります。
↓こんな感じです。”Car_Controller.py”というファイルで保存します。
import wiringpi as wp
class CarController(object):
STEER_PIN = 18
STEER_MIN = 65
STEER_MAX = 89
def __init__(self):
wp.wiringPiSetupGpio()
wp.pinMode(CarController.STEER_PIN,2)
wp.pwmSetMode(0)
wp.pwmSetRange(1024)
wp.pwmSetClock(375)
def steer(self,x):
#"""
#x: -1.0 to 1.0
#"""
a = 0.5 * (CarController.STEER_MAX - CarController.STEER_MIN)
b = 0.5 * (CarController.STEER_MAX + CarController.STEER_MIN)
x = int(max(CarController.STEER_MIN,min(CarController.STEER_MAX, a*x+b)))
wp.pwmWrite(CarController.STEER_PIN,x)
q = CarController()
Webサーバーのプログラムを作る
次にWebサーバのプログラムを作ります。
↓こんな感じです。”servo-server.py”という名前でファイルを保存します。
from http.server import HTTPServer, BaseHTTPRequestHandler
from car_controller import CarController
import RPi.GPIO as GPIO
class ServoServerHandler(BaseHTTPRequestHandler):
def do_GET(self):
path = self.path
print("path=", path)
body = "ok"
if path == "/":
f = open("servo-client.html", encoding='utf-8')
body = f.read()
f.close()
if path == "/left":
q = CarController()
q.steer(x= -0.5)
elif path == "/right":
q = CarController()
q.steer(x=0.5)
elif path == "/neutral":
q = CarController()
q.steer(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, ServoServerHandler)
print("start server")
httpd.serve_forever()
except KeyboardInterrupt:
pass
httpd.socket.close()
GPIO.cleanup()
やってみよう!
プログラムができたので、実際やってみます。
書いたプログラムは同じフォルダに入れておいてください。
次にLXTerminalを開きます。ファイルが実行できるように”cd”で移動します。
cd プログラムが入ってるフォルダのパス
次に”servo-server.py”プログラムを実行します。
sudo python3 servo-server.py
すると、「start server」という文字がLXTerminal上に出ます。
次にスマホでラズパイのIPアドレスにアクセスします。
ブラウザはなんでもいいですが、私は「Google Chome」でアクセスします。
検索バーに
http://(ラズパイのIPアドレス):8081/
と入力します。↓のような画面がスマホ上に出るはずです。
各ボタン「right」「left」「neutral」を押すとサーボモータが周ります。
動画です。
できたー。やったー。
注意点
Car_Controller.pyのプログラムがわからない
度々になりますが、そもそも、Car_Controller.pyのプログラムの中身がネットで拾った情報でよくわかっていません。
なので、とりあえず、xの値をそのまま数字を入れています。
解読できたら、報告します。
よろしくお願いします。