M5Stack + MicroPythonでDCモーターを動かす
M5Stackを利用しモーターをコントロールしてみたい
farmtory Advent Calendar 13日目担当の松崎(まつざき)と申します。今回は、M5Stackを利用して何かやってみたいと思ったので、挑戦してみようと思います💪。
M5Stack
M5Stackとは、Arduino互換のESP32というチップを利用し、WifiとBluetoothによるネットワーク通信や、GPIOを利用したArduino本来の機能であるPWM制御や、I2C規格に対応した機器の制御を行うことができるものです。日本国内では、スイッチサイエンス社さんなどを通じて買うことが可能です。
DCモーターを制御する
DCモーターを制御するため、DCモータードライバを利用します。DCモータードライバとは、DCモーターを制御するためのICです。利用することで、簡単にモーターを制御させることができます。(参考となるサイトへのリンクはこちらです)
DCモータードライバを利用することで、電流の向きや電流の大きさを制御し、DCモーターの制御を行うことができます。
ギヤボックスを利用する
DCモーターを単品利用するだけではなく、将来大きなトルクを利用したいという要望が出てきたときのために、タミヤの楽しい工作シリーズで出ているギヤボックスを買ってみました。モーターとセットとなっているためお得感が高いです。
MicroPythonでM5Stackを制御する
Arduino IDEを使ってC言語を利用するのではなく、MicroPythonを利用してM5Stackを制御しようと考えてみました。MicroPythonとは、組み込み向けのマイコン上で動作するPythonの処理系です。Pythonの処理系としての役割と、マイコンで制御できるGPIOやI2Cなどの低レイヤーへのアクセスを可能にしたものです。M5StackではMicroPythonが組み込まれたファームウェアをインストールし、M5Cloudという、クラウド上でコーディングが行えるサービスを利用することでM5StackにてMicroPythonが利用できるようになります。
M5Cloudへの登録とMicroPythonの実行
M5Cloudへの登録や、MicroPythonを実行するためのM5Stackファームウェアインストールはドキュメントにまとめられています。日本語訳のものも用意されており、スイッチサイエンス社さんが翻訳しているようです。
M5Cloudへの登録方法についてはクラスメソッドさんのブログエントリがわかりやすいです。
MicroPythonでDCモーター制御をしてみる
早速、MicroPythonでDCモーター制御をしてみるコードを書いてみます。M5Stackでは本体に3つのボタンが付いているので以下の役割を与えてみました
1. モーターを回転させる
2. モーターを逆回転させる
3. モーターを停止する
です。このロジックを叶えるためのコードを、M5Cloud上でコーディングします。
早速動かしてみた様子を動画に収めてみました。
M5Stackを利用することで、簡単にDCモーターを動かすことができました。他にもう少し複雑な制御をかけるなど、挑戦をしていきたいと思います。
そして、farmtory Advent Calendar 2018 14回目は、Yabre Kabreさんです。お楽しみに!
farmtory labの活動内容についてnoteにまとまっています。よろしければご参照くださ
付録
今回の回路はこちらのサイトで掲載されている内容を参考にしました。
今回利用したMicroPythonでのコードを掲載します。
from m5stack import *
import utime
utime.sleep(2)
lcd.clear()
lcd.setCursor(0, 0)
lcd.setColor(lcd.WHITE)
lcd.print("OK!\n")
# GPIO初期化
pin17 = machine.Pin(17, machine.Pin.OUT)
pin16 = machine.Pin(16, machine.Pin.OUT)
lcd.print("PIN formatted OK!\n")
pressed_of_button = {
'A': False, 'B': False, 'C': False
}
def pressed_a():
pressed_of_button['A'] = True
pressed_of_button['B'] = False
pressed_of_button['C'] = False
def pressed_b():
pressed_of_button['A'] = False
pressed_of_button['B'] = True
pressed_of_button['C'] = False
def pressed_c():
pressed_of_button['A'] = False
pressed_of_button['B'] = False
pressed_of_button['C'] = True
def is_pressed_button_a():
return pressed_of_button['A']
def is_pressed_button_b():
return pressed_of_button['B']
def is_pressed_button_c():
return pressed_of_button['C']
while True:
if buttonA.wasPressed() and not is_pressed_button_a():
lcd.clear()
lcd.setCursor(0, 0)
lcd.print("button A pressed.\n")
pressed_a()
pin17.value(1)
pin16.value(0)
if buttonB.isPressed() and not is_pressed_button_b():
lcd.clear()
lcd.setCursor(0, 0)
lcd.print("button B pressed.\n")
pressed_b()
pin17.value(0)
pin16.value(1)
if buttonC.isPressed() and not is_pressed_button_c():
lcd.clear()
lcd.setCursor(0, 0)
lcd.print("button C pressed.\n")
pressed_c()
pin17.value(0)
pin16.value(0)