クラスとFlask
- flask の例ではポート番号5000 番が使われることが多いのですが、5000番は Mac では別のプログラムに利用される場合がありますので、以下の例では 5001 番を使うようにしています。
Car クラス
前回はシリアル通信を使って,Mac の Python からシリアル通信で Arduino にモーターの命令を送りました.今回はそれをクラスにまとめてみます.
以下の内容のファイルを "car.py" として保存してください.
import serial
import time
class Car:
def __init__(self, port):
self.s = serial.Serial(port, 115200, timeout=0.1)
time.sleep(2) #2秒待つ
def go(self):
self.s.write( bytes('1', 'utf-8') )
def stop(self):
self.s.write( bytes('0', 'utf-8') )
def close(self):
self.s.close()
そして,'0' を受信したら前に進む,'1' を受信したら止まる Arduino のプログラムを作成し,以下のプログラムが動くようにしてください.
from car import Car
car = Car("/dev/tty.usbmodemXXXXX")
car.go()
time.sleep(3)
car.stop()
time.sleep(3)
car.go()
time.sleep(3)
car.close()
print("bye")
課題
- 上記の Car クラスに "後退"の
go_back()
, "右回り"のrotate_R
, "左回り" のrotate_L
のメソッドを追加してください.
Flask
Flask は python の Webアプリケーションフレームワークです. まずは pip でインストールします.
pip install flask
そして,最初のプログラムとして,以下のプログラム hello.py を作成してください.
from flask import Flask
app = Flask(__name__)
@app.route("/")
def hello_world():
return "<p>Hello world!</p>"
if __name__ == "__main__":
app.run(host="127.0.0.1", port=5001, debug=False)
実行は,このプログラムのあるディレクトリで
python hello.py
とします.すると,
$ python hello.py
* Serving Flask app "hello" (lazy loading)
* Environment: production
WARNING: Do not use the development server in a production environment.
Use a production WSGI server instead.
* Debug mode: on
* Running on http://127.0.0.1:5001/ (Press CTRL+C to quit)
* Restarting with stat
* Debugger is active!
* Debugger PIN: 220-515-480
のようにメッセージが出ますので,http://127.0.0.1:5001
にブラウザでアクセスすると,Hello world! と書かれたページが確認できると思います.(Ctl-c でプログラムは終了します)
このように,関数で web ページにアクセスされた時の振る舞いを記述していくのが flask のプログラミングとなります.
課題
上の hello.py を改変して http://127.0.0.1:5001/bye
にアクセスしたら,さようなら
と出るプログラムを書いてください.
Flask でリモコンを作る
次に flask でボタンを作ってみます. 以下のサンプルプログラムをダウンロードしてください.
まず,webapp.py を実行します.
python webapp.py
このプログラムでは,ボタンが押されると Car クラスの go
関数が実行されます.
よくみると,このボタンを押すたびに画面が遷移していることがわかります. 画面遷移がおこると,それだけ時間がかかりますので,画面遷移をしないように ajaxを使います.
ajax とは「JavaScriptとXMLを使って非同期にサーバとの間の通信を行うこと。」です.google map などは画面遷移をせずに,ユーザーからの操作に応じて新しいデータを読み込み,画面を更新していますが,その仕組みに使われています.
- 参考: 初心者目線でAjaxの説明
これを使ったプログラムが webapp2.py に実行されていますので,これを実行してください.
python webapp2.py
スマホからの接続
"127.0.0.1" の IPアドレスは自分自身のコンピュータを指す特別なIPアドレスです. 実は,ここで作成した flask プログラムは同じ LAN 内であれば他のコンピュータからも接続可能です.
まず、TC306 の無線環境である tc-room に接続してください。 次に、自分のコンピュータのアドレスを確認してみてください.
ifconfig
さまざまに表示される情報のうち,en1 に相当するのが,無線LANになります.
ifconfig -l | xargs -n1 ipconfig getifaddr
のコマンドではIPアドレスだけを取り出すことができます.
ここで得られたアドレスを 172.19.193.xxx
とすると,ブラウザで
http://172.19.193.xxx:5001/
のアドレスを開けることで,flask に接続することができます.
課題
- 別のコンピュータ,あるいはスマホからflask プログラムに接続できることを確認してください.
- "car.py", "webapp2.py" を編集して,ブラウザからロボットが前進,後退,左右回転,停止ができるようにしてください.
- スマホからリモコンで操作できるようにしてください.
- 注意:コンピュータは台の上に載せてください.
- ボタンを十字に配置して、リモコンっぽくなるようにインタフェースを工夫してみてください。
- ChatGPT などを使うと簡単にコードを生成してくれます。