M5Stackでobnizラジコンを操作する

こちらは[「M5Stack Advent Calendar 2018」](https://qiita.com/advent-calendar/2018/m5stack) の12月4日の記事になります。

[前記事](https://qiita.com/hayakumi/items/8af9dda67c07f9b92dec)でobnizラジコンのnode化を行ないました。
このエントリーではM5Stackのボタンでobnizラジコンを操作してみます。

##準備
- obnizラジコンとnodeサーバーのセットアップ([前記事](https://qiita.com/hayakumi/items/8af9dda67c07f9b92dec)参照)
- M5Cloud用のファームウェア書き込み
- M5StackのWi-Fiセットアップ

##参考にしたサイト
M5Stack API Reference
https://m5stack.readthedocs.io/en/master/api-reference/button/button.html

M5Stack Web IDE
https://github.com/m5stack/M5Cloud/blob/master/README_JP.md
https://github.com/m5stack/M5Cloud/blob/master/examples/HTTP_request/main.py

API Referenceを読むと、ボタンを押したときにコールバック関数を受け付けるAPIと、ボタンを離したときにコールバック関数を受け付けるAPIが、それぞれ提供されているようです。
・ _button＊.wasPressed(ボタン＊を押したときの処理)_
・ _button＊.wasReleased(ボタン＊を離したときの処理)_
M5Stackにはボタンが3つあるので、ボタンを使って前進・後退・右回転の3種類の動きをさせたいと思います。

##M5Cloudで作成するプログラム
各ボタンのbutton＊.wasPressed()とbutton＊.wasReleased()メソッドを使い、obnizのMessageエンドポイントをパラメータ付きで指定します。
このような感じになります。

```python:main.py

from m5stack import *
import urequests

def on_A_wasPressed():
  lcd.print('Button A was Pressed\n')
  r = urequests.get("https://obniz.io/obniz/{obniz_id}/message?data=forward")
  print(r.text)

def on_A_wasReleased():
  lcd.print('Button A was Released\n')
  r = urequests.get("https://obniz.io/obniz/{obniz_id}/message?data=stop")
  print(r.text)

buttonA.wasPressed(on_A_wasPressed)
buttonA.wasReleased(on_A_wasReleased)

def on_B_wasPressed():
  lcd.print('Button B was Pressed\n')
  r = urequests.get("https://obniz.io/obniz/{obniz_id}/message?data=back")
  print(r.text)

def on_B_wasReleased():
  lcd.print('Button B was Released\n')
  r = urequests.get("https://obniz.io/obniz/{obniz_id}/message?data=stop")
  print(r.text)

buttonB.wasPressed(on_B_wasPressed)
buttonB.wasReleased(on_B_wasReleased)

def on_C_wasPressed():
  lcd.print('Button C was Pressed\n')
  r = urequests.get("https://obniz.io/obniz/{obniz_id}/message?data=right")
  print(r.text)

def on_C_wasReleased():
  lcd.print('Button C was Released\n')
  r = urequests.get("https://obniz.io/obniz/{obniz_id}/message?data=stop")
  print(r.text)

buttonC.wasPressed(on_C_wasPressed)
buttonC.wasReleased(on_C_wasReleased)
```

##動作確認
M5StackにUploadして、ボタンA → ボタンB → ボタンCの順番で押してみます。
若干タイムラグは感じますが思った通り動きました！

<blockquote class="twitter-tweet" data-lang="ja"><p lang="ja" dir="ltr">M5Stackからobnizラジコンを動かしてみました。これもM5Stackのボタン操作しつつスマホで撮影してたら、画面からはみ出しまくりです。<a href="https://twitter.com/hashtag/obniz?src=hash&amp;ref_src=twsrc%5Etfw">#obniz</a> <a href="https://twitter.com/hashtag/M5Stack?src=hash&amp;ref_src=twsrc%5Etfw">#M5Stack</a> <a href="https://t.co/PX8bIzjEZg">pic.twitter.com/PX8bIzjEZg</a></p>&mdash; hayakumi (@hayakumi8893) <a href="https://twitter.com/hayakumi8893/status/1069634277879373824?ref_src=twsrc%5Etfw">2018年12月3日</a></blockquote>
<script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>


##終わりに

M5Stackのサンプルコードを動かした程度の私でも何とか作れました。使ったのはボタンだけでセンサーとか使ってないですしね。
ちなみに、このプログラムはタイミングが悪いところでWi-Fiが切れるとモーター停止のリクエストが届かず、ずーっと動き続けます。ちょうど動画撮影中に発生して撮り直しました。。

ここまで読んでいただきましてありがとうございました！

実はもう1話続きがありますのでよろしければそちらも読んでもらえると嬉しいです。
[Pepperでobnizラジコンを操作する](https://qiita.com/hayakumi/items/56a3b1ac1a5e06211307)