RaspberryPiのGPIOをpythonから使うのは簡単です。Lチカは簡単にできます。だとすると 次に、これをネットワーク越しに実現したいところです。それもできればhttpでコントロールできたら色々便利。 そこで、ネットワーク越しに別のマシンからGPIOを操る方法を探しました。 Pythonでwebサーバを簡単に作れるフレームワークがあるらしいので、それを使ってみました。
インストール方法がこちらに書いてありました。
RaspberryPiにCherryPyをインストールします。Rasbianが動いていれば、以下のapt-getで簡単にインストールできます。
$ sudo apt-get install python-cherrypy3
まずは、文字を返すだけの簡単なプログラムから試して、動作を確認します。 サーバとして稼働するので、curlコマンドやwebブラウザで文字を取得できます。
Wikipediaに書いてあった簡単な例です。
#!/usr/bin/env python class HelloWorld(object): def index(self): return "Hello World!" index.exposed = True cherrypy.quickstart(HelloWorld())
とても簡単。 class名はなんでも良いです。最後にそのクラス名をサーバとして稼働させます。
これを起動するとサーバとして動き出します。アドレスはデフォルトで、ローカルホストの8080。 同じマシンからcurlすると以下のようになります。
$ curl http://127.0.0.1:8080/index Hello World!
indexは特別な名前で、省略することもできます。index.htmlみたいな位置付けです。
$ curl http://127.0.0.1:8080 Hello World!
他のマシンからも見られるようにするには、RaspberryPiに割り当てたアドレスを使って公開すればよいです。デフォルトを変更するには、cherrypy.config.updateを使います。以下はアドレスが192.168.0.80の場合。
#!/usr/bin/env python import cherrypy cherrypy.config.update({'server.socket_host': '192.168.0.80', 'server.socket_port': 8080, }) class HelloWorld(object): def index(self): return "Hello World!" index.exposed = True cherrypy.quickstart(HelloWorld())
他のマシンからwebブラウザで見ると以下のようになります。
コマンドというか、webサーバでしたらhtmlファイル類を増やす方法です。例えばLEDという名前に反応するようにプログラムしてみます。
#!/usr/bin/env python import cherrypy cherrypy.config.update({'server.socket_host': '192.168.0.80', 'server.socket_port': 8080, }) class HelloWorld(object): def LED(self): return "LED!" LED.exposed = True def index(self): return "Hello World!" index.exposed = True cherrypy.quickstart(HelloWorld())
これでいろんなコマンドが使えます。上記の例では、以下のように動きます。
$ curl 192.168.0.80:8080/LED LED!
?で引数を増やすには以下のようにします。例えば、LED?turn=onなどに対応させてみます。def宣言の引数にturnを追加すれば良いです。これに=の右側の文字が入っています。
#!/usr/bin/env python import cherrypy cherrypy.config.update({'server.socket_host': '192.168.0.80', 'server.socket_port': 8080, }) class HelloWorld(object): def LED(self,turn): if turn == "on": return "LED ON" if turn == "off": return "LED OFF" LED.exposed = True def index(self): return "Hello World!" index.exposed = True cherrypy.quickstart(HelloWorld())
結果はこうなります。
$ curl 192.168.0.80:8080/LED?turn=on LED ON $ curl 192.168.0.80:8080/LED?turn=off LED OFF
GPIOの14番にLEDを接続しました。これでLチカをします。
GPIOを制御する関係のコマンドを追加します。エラーメッセージを出さない設定にしました。
#!/usr/bin/env python import cherrypy import RPi.GPIO as GPIO cherrypy.config.update({'server.socket_host': '192.168.0.80', 'server.socket_port': 8080, }) #dont bug me with warnings GPIO.setwarnings(False) # to use Raspberry Pi board pin numbers GPIO.setmode(GPIO.BCM) # set up GPIO output channels GPIO.setup(14, GPIO.OUT) class HelloWorld(object): def LED(self,turn): if turn == "on": GPIO.output(14, GPIO.HIGH) return "LED ON" if turn == "off": GPIO.output(14, GPIO.LOW) return "LED OFF" LED.exposed = True def index(self): return "Hello World!" index.exposed = True cherrypy.quickstart(HelloWorld())
これを動かせば、以下のURLアクセスによりLEDがon/offします。
$ curl 192.168.0.80:8080/LED?turn=on LED ON $ curl 192.168.0.80:8080/LED?turn=off LED OFF