【M5Stack】M5StickCでシリアル通信に出力、そしてボタン操作におけるdelayの重要性

  • URLをコピーしました!
目次

M5StickC

前回、M5StickCのSPIFFS領域を削除するためのスケッチ例を見てみました。

今回はM5StickCでのシリアル通信への出力を試していきたいと思います。

シリアル通信って何?と思うのですが、単純に機器(今回の場合、M5StickC)とPCを繋いで情報交換する方法だと理解しています。

詳しいことは色々あるのでしょうが、そこら辺はWikipediaを始め、他の方の解説を調べてみてください。

とにかく今やりたいこととしては、前回SPIFFSに保存したデータをPCに移したいわけです。

そこでシリアル通信によりM5StickCからPCに情報を送ろうというわけです。

とは言ってもいきなり全ての機能を盛り込んだプログラムを書いていくのはしんどいので、今回は簡単なプログラムを組んで、シリアル通信ってどんな感じか感触をつかんでいきましょう。

ボタン操作におけるdelayの重要性

ということで、まずはボタンを押したら「Hello World!」をM5StickCの画面上に出力するプログラムを作ってみましょう。

そしてその出力部分をシリアル通信の出力へ変えることで、シリアル通信を試そうと言うわけです。

そこで私が最初に作ってみたプログラムがこちら。

#include <M5StickC.h>

void setup() {
  M5.begin();
}

void loop() {
  M5.update();
  if(M5.BtnA.isPressed()){
    M5.Lcd.println("Hello World!");
  }
}

setup関数内でまずはM5StickCのイニシャライズをして、loop関数内で「M5.update()」でボタン状態の監視、「if(M5.BtnA.isPressed())」でボタンが押された時の条件分岐をして、「M5.Lcd.println(“Hello World!”)」でHello World!を出力する。

これでいいだろうと思ってM5StickCで実行してみた結果がこちら。

何故こんなことが起こったのか?

それはループの周り方に秘密があったのです。

loop関数では、その中身のプログラムは人間の動きからすると「超高速」で繰り返されています。

つまり、人間がボタンを一瞬押したと思っていても、プログラムの繰り返しはその間に何十回も繰り返されています。

そしてその間は「M5.update()」でボタンが押されているという情報が取得され、「if(M5.BtnA.isPressed())」がtrue、つまりボタンが押されている場合の条件分岐がなされます。

つまり「M5.Lcd.println(“Hello World!”)」が実行され、「Hello World!」が大量に画面に表示されるというわけです。

そのためloop関数の最後に「delay関数」をおきます。

つまりこんな感じ。

#include <M5StickC.h>

void setup() {
  M5.begin();
}

void loop() {
  M5.update();
  if(M5.BtnA.isPressed()){
    M5.Lcd.println("Hello World!");
  }
  delay(200);
}

このプログラムをM5StickCで実行した結果がこちら。

確かにボタンを押した際に1回、Hello World!が表示されています。

ただよく見ると1度はHello World!が2回連続で表示されている時があります。

このときは1回目の200ミリ秒の最後の方にボタンを押して、次の200ミリ秒以上にボタンを押してしまったのだと考えられます。

例えば1回目の190ミリ秒の時にボタンを押し、250ミリ秒間ボタンを押していたら、3回目のループの40ミリ秒までボタンを押していることになるので、2回Hello World!が表示されるというわけです。

ただし200ミリ秒の最初の方にボタンを押し、1回のループが終わる前にボタンから指を話してしまった場合、つまり1回目の10ミリ秒の時にボタンを押し、150ミリ秒後に指を離してしまった場合は、「M5.update()」でのボタン情報の取得、「if(M5.BtnA.isPressed())」での条件分岐がされていませんので、Hello World!は表示されません。

なのでどれくらいの長さのdelayにするかはなかなか難しいところがあります。

とりあえずは200ミリ秒くらいにしておけばいいのかなと思います。

シリアル通信での出力:Serial.println

ではシリアル通信での出力に移ります。

シリアル通信での出力をするコマンドは「Serial.println(“出力する文字列”)」です。

ということでプログラムはこんな感じ。

#include <M5StickC.h>

void setup() {
  M5.begin();
}

void loop() {
  M5.update();
  if(M5.BtnA.isPressed()){
    Serial.println("Hello World!");
  }
  delay(200);
}

Arduinoのシリアルモニタ

それではArduinoのソフトウェア内になるシリアルモニタを開きましょう。

M5StickCをPCに繋ぎ、メニューバーの「ツール > シリアルモニタ」をクリックします。

するとこんな感じのウインドウが開きます。

ちなみにM5StickCをPCに繋がないと、エラーメッセージがでてシリアルモニタは開かないので注意してください。

そして右下にある「XXXXX bps」というプルダウンメニューを開き、「115200 bps」を選択します。

これで準備は完了です。

先ほどのプログラムをM5StickCにアップロードして、ボタンを押してみましょう。

このようにボタンを押すたびに「Hello World!」が出力されれば成功です。

ちなみに先ほど設定した「115200 bps」はM5StickCとパソコン間の通信の速度でこれが違っていると文字化けしますので注意です。

例えば数値を大きくして「250000 bps」に変えてみるとこんな感じ。

逆に小さい方の「57600 bps」にしてみるとこんな感じです。

全て試したわけではないので、もしかしたら「115200 bps」以外にもちゃんと「Hello World!」が出てくるものもあるかもしれませんが、とりあえず「115200 bps」でちゃんと出るのでこれを使っていけばいいかなと思います。

これでシリアル通信でデータをパソコンに送る方法がわかりました。

それではそろそろ総仕上げで、次回からはやりたいことをプログラミングしていきましょう。

ではでは今回はこんな感じで。

¥2,816 (2021/07/05 10:12時点 | Amazon調べ)
よかったらシェアしてね!
  • URLをコピーしました!

コメント

コメントする

目次