シリアル(UART)出力で内部データの表示(Arduinoプログラミング)

Arduinoコマンド:シリアル出力表示

「電気は見えないからキライ」なんて言われることが時々あります。
私は見えないから「なんでだろう」ってなって逆に興味がわくんですけどね。
でも、実際は見えてた方がわかりやすいのは確かです。

見えない電気ですが、テスターやオシロスコープを使えば値や電圧、電流の波形等を見ることはできます。
マイコンのプログラミングでも内部の状態がどうなってるか確認しながらプログラミングできた方が当然効率は上がります。

プログラミングの開発環境には、このための方法として「シリアル出力モニタ」という機能があります。

「シリアル出力モニタ」とは、プログラム内の値やデータを表示させたい時に、シリアル出力用のコマンドを記入することでデータを送信しパソコンへ上に表示させることができる機能です。(シリアル出力用のコマンドが実行された時点で出力されます。)
表示だけでなく、出力したデータを記録して保存したり、機器間でデータをやり取りする時にも「シリアル出力」が使用されます。

「ATOM LITE」の開発環境として紹介した「PlatformIO」にも「シリアル出力」された内容を表示できる機能(ターミナル)があり、プログラミング作成時には頻繁に使用することになるため、ここで紹介しておきます。

「ATOM LITE」については以下のリンクで詳しく紹介しています。

ATOM LITE プログラミング初心者におすすめ超小型で高機能!
マイコンボードはRaspberry Pi、Arduino、M5Stack等がありますが、一通りやってみてそれぞれの良さはあるものの「最初に何を?」と聞かれたらATOM LITEが一番お手軽♪プログラミング初心者におすすめ

パソコンがなくてもシリアル出力データが確認できる便利な自作シリアルモニタの作り方も以下のリンクで詳しく紹介しています。

M5Stackをシリアルモニターに使用。パソコン不要でデータ確認Atom、Arduinoに便利
マイコンボードのシリアル出力を液晶やパソコンではなく、外付けして単体で確認できるシリアルモニタが欲しかったのでM5Stackで作りました。 ATOMやArduino等のマイコンボードのデータが手軽に確認できて便利と思うので紹介します。
「開発環境の準備」がまだの方は → こちら

スポンサーリンク

1.シリアル出力するための初期設定

シリアル出力を使用するには、まず初期設定にシリアル通信を行うための設定を記入します。
以下に初期設定の部分だけを記載します。

// 初期設定 -----------------------------------------------
void setup() {
  // 本体初期化(UART有効, I2C無効, LED有効)
  M5.begin(true, false, true);

  Serial.begin(9600);           //標準のシリアル通信を準備
}

シリアル通信を行うための初期設定は 6行目の一文だけです。「本体初期化」の後に記入してください。
標準の設定では本体のUSBを使った通信になるため、パソコンとの通信は既につながっているUSBケーブルで行います。

・シリアル通信の初期設定
 Serial.begin ( 通信速度 );

Serial.begin:シリアル通信の初期設定を行うコマンドです。
通信速度:シリアル通信を行う速度(タイミング)の設定です。
 この速度を通信相手と合わせることでデータのやり取りができるようになります。

シリアル通信にもいろいろ種類があります。
今回紹介するシリアル通信は「UART」通信というもので、この他に「SPI」通信、「I2C」通信というものがあります。
「SPI」と「I2C」にはクロック(通信タイミング)信号用の配線があり、この信号のタイミングに合わせて通信を行うため「同期通信」と呼ばれます。
一方「UART」にはクロック信号用の配線が無く、それぞれの通信速度(タイミング)で通信を行うため「非同期通信」と呼ばれます。
このため最初にお互いの通信速度を合わせておく必要があります。
通信速度にはいくつかありますが、表示程度であれば9600bpsが一般的なので、とりあえず「9600」としましょう。
※「bps」という単位は「bit/second」=「ビット/秒」の略です。1秒間に通信するビット数(1か0のデータ)を表します。

スポンサーリンク

2.シリアル出力するためのプログラム

シリアル出力を行うためのプログラムは以下のようになります。
これらのプログラムが実行された時点で「( )」内に記入した情報がシリアル出力されます。

・シリアル出力を行うためのプログラム
  Serial.print ( ” 文字 “ );             //改行なし
  Serial.println ( 変数、関数等);   //改行あり
Serial.print:シリアル出力を実行するコマンド(改行なし)。
 連続で記入すると横並び1行で表示されていきます。
Serial.println:シリアル出力を実行するコマンド(改行あり)。
 連続で記入すると1行づつ改行して表示されていきます。
” 文字 “:文字は「” “」(ダブルクォーテーション)で挟んで記入。
変数、関数等
:変数はそのまま変数を記入とその値が表示されます。
 関数はその関数の実行結果が出力されます。(例:入出力の状態を確認する場合 digitalRead(端子番号)を記入)

スポンサーリンク

3.「Lチカ」プログラムで動作確認してみよう

「C言語 演算子(条件式)について」で使用した「Lチカ」プログラムを使用して、マイコンボード「ATOM LITE」で実際にシリアル出力で値を確認してみましょう。

「ATOM LITE」って何?って方は → こちら
「開発環境の準備」がまだの方は → こちら
「Lチカ」プログラムについての詳細(C言語 演算子)は → こちら

本体のボタンを押した回数を変数「i」でカウントしており、ボタンを押すたびに変数「i」は「1,2,3・・・」と増えていきます。
シリアル出力ではボタンを押すたびに変数「i」のカウント数が表示されます。

「VS Code」を開いてください。シリアル出力の表示を確認するには下画像のように、画面左下の「コンセントプラグのマーク」をクリックします。
これで画面下の「ターミナル」ウインドウで表示を確認できるようになります。

シリアル出力表示
実際にどのように表示されるか確認してみましょう。
以下のコードを「コピペ」して書き込みを行い、動作確認をしてみてください。
※コピーは下コード(黒枠)内の右上角にある小さなアイコンのクリックでもできます。
#include <M5Atom.h>    //Atomのヘッダファイルを準備

// FastLEDライブラリの設定(CRGB構造体)
CRGB dispColor(uint8_t r, uint8_t g, uint8_t b) {
  return (CRGB)((r << 8) | (g << 16) | b);
}
// 変数宣言
int i = 0;    //ifの条件確認用

// 初期設定 -----------------------------------------------
void setup() {
  // 本体初期化(UART有効, I2C無効, LED有効)
  M5.begin(true, false, true);
  Serial.begin(9600);           //標準のシリアル通信を準備
  // LED全消灯(赤, 緑, 青)
  M5.dis.drawpix(0, dispColor(0, 0, 0));
}
// メイン -------------------------------------------------
void loop() {
  M5.update();  //本体のボタン状態更新

  if (M5.Btn.wasPressed()) {      //ボタンが押された時
    i++;                          //iを+1する
    //シリアル出力
    Serial.print("i = ");         //文字出力(改行なし)
    Serial.println(i);            //値出力(改行あり)
  }

  if ((1 <= i) && (i <= 3)) {  //ボタンを押した回数が1~3回なら
    M5.dis.drawpix(0, dispColor(0, 0, 255));  //LED(青)
  } else {                     //1~3回でなければ
    M5.dis.drawpix(0, dispColor(20, 20, 20)); //LED(白)
  }
  delay(100);   //100ms待機
}

「ATOM LITE」の本体ボタンを押すたびに、下画像のように「i」のカウント値が表示されると思います。

シリアル出力表示

以上のようにシリアル出力を使うことでマイコン内部の状態を確認することができます。
プログラムの動作確認やうまく動作しない時のエラー探し(デバック作業)等、今後頻繁に使用しますので覚えておきましょう。

シリアル出力を行うコマンドとして、「C言語」の標準関数である「printf」も「Serial.printf」として使用することができます。
これを使用すると複数の異なった値をフォーマットを指定して表示させることができるので便利です。
これについては「C言語」記事でまた紹介できればと思います。

「C言語」については以下のリンクで詳しく紹介しています。

C言語プログラミングの記事一覧
C言語のプログラミング記事一覧です。安価なマイコンボードを使用して動かしながら学んでみましょう♪ プログラム例を使って、コピペで書き込み、動作確認しながら少しづつ理解を深めましょう。

コメント

タイトルとURLをコピーしました