メインコンテンツまでスキップ

Lesson 17

シリアルモニタ

lesson16 をベースにシリアルコンソール接続から Arduino を操作する。

必要な部品構成

Lesson 16 の内容をそのまま使います。

構成

Arduino のボード配線は Lesson16 そのままに、サンプルコードをデプロイします。
デプロイするとシリアル画面に表示がされる。

コードを見てみると。

int latchPin = 11;
int clockPin = 9;
int dataPin = 12;

byte leds = 0;
void updateShiftRegister()
{
digitalWrite(latchPin, LOW);
shiftOut(dataPin, clockPin, LSBFIRST, leds);
digitalWrite(latchPin, HIGH);
}
void setup()
{
pinMode(latchPin, OUTPUT);
pinMode(dataPin, OUTPUT);
pinMode(clockPin, OUTPUT);
updateShiftRegister();
Serial.begin(9600);
while (! Serial); // Wait untilSerial is ready - Leonardo
Serial.println("Enter LED Number 0 to 7 or 'x' to clear");
}

void loop()
{
if (Serial.available())
{
char ch = Serial.read();
if (ch >= '0' && ch <= '7')
{
int led = ch - '0';
bitSet(leds, led);
updateShiftRegister();
Serial.print("Turned on LED ");
Serial.println(led);
}
if (ch == 'x')
{
leds = 0;
updateShiftRegister();
Serial.println("Cleared");
}
}
}

Lesson16 と同様の構成のためシフトレジスタ周りのコードは同じとなっており、setup() にシリアル用の設定が追加されている。
事前記述周りはほとんど同じで処理側が大きく変わっている。
loop() ではまず Serial.available に入力データが格納されているかを判定し、入力値が 0 ~ 7 か、 x かでさらに if() を回している。
Serial.read()で入力された値を ch に格納し、
「x」が入力された場合は leds 変数を 0 にして updateShiftRegister() を呼び出して LED を消灯するようにしている。
「0~7」が入力された場合は led = ch - '0' に値を格納し bitSet() で Lesson16 同様に シフトレジスタに連動した LED を点灯させている

C言語における型とデータの扱いについて

Serial.read() を格納している ch について、なぜ led = ch - '0' という処理をしているかというと、
今回入力値に 数字「0~7」と文字列「x」を使っており、Serial.read() はリファレンスにある通り int 型で入力データを扱います。そのため入力された「0~7」の数値は内部的には「48~55」の数値にて解釈されています。これを「x」同様に文字列として扱えるように int型 を char型 に変換、 数値 - 0 という式で行っています。
marycore.jp - int型をchar型に変換する方法【数字化 数値の文字列化】

上記のように対応した数値をシリアルから送信することで任意の LED を点灯したり、消灯したりできる。