【自動運転#31】ラジコンっぽくしてみる ステアリング編【ソフトウェアPart19】

目次

環境

Raspberry pi zero

iphone8

エディターはラズパイに初めから付いている、Thonnyを使ってます。

今回も

プログラムの解読が進まないので、今回も気分を変えて、プログラムをスマホで操作できるようにして、ラジコンっぽくしようと思います。

部品

  • ピンソケット2種類
  • 基板
  • モータドライバ
  • Raspberry Pi Zero
  • ジャンプワイヤー
  • モバイルバッテリ

配線繋げる

サーボモータ配線と機能ラズパイGPIO繋ぐ先
茶色マイナス線 GND6番ピン(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の値をそのまま数字を入れています。

解読できたら、報告します。

よろしくお願いします。

使った部品

よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!

この記事を書いた人

私が勉強したこと、実践したこと、してることを書いているブログです。
主に資産運用について書いていたのですが、
最近はプログラミングに興味があるので、今はそればっかりです。

目次