18 Arduino シリアルモニターからLED制御
この記事では、前回作成したLED 8個を点灯できるハードウエアをそのまま利用し、シリアルモニターから Arduino を経由してLEDを制御するスケッチを作成します。
再度、回路図を掲載しますが詳細は前回の記事をご覧ください。
スケッチ内容
PCからシリアルデートを受信すると、受信データが「0」から「7」なら、受信データを文字から数値に変換し、 LEDの点灯パターンの該当ビットを反転します。受信データが「x」なら、 LEDの点灯パターンの全ビットを「0」にします。
なお、LEDの点灯パターン(leds)はその値を常に保持しておくため static修飾子が必要です。
// シフトレジスタでLED8個を点滅
// 2021-6-13
int latchPin = 11; // 74HC595 [RCK] pin 12
int clockPin = 12; // 74HC595 [SCK] pin 11
int dataPin = 9; // 74HC595 [S1] pin 14
// LEDを点滅する関数
// shiftOut関数で、データをシフト出力する
void updateShiftRegister(byte leds) {
digitalWrite(latchPin, LOW);
shiftOut(dataPin, clockPin, LSBFIRST, leds);
digitalWrite(latchPin, HIGH);
}
void setup() {
Serial.begin(9600); // シリアル通信の設定
pinMode(latchPin, OUTPUT); // シフトレジスタとの
pinMode(dataPin, OUTPUT); // 接続ポートを設定
pinMode(clockPin, OUTPUT); //
}
void loop() {
static byte leds = 0; // LEDの点灯パターン
if(Serial.available()){ // シリアル通信が有効なら
int val = Serial.read(); // 一文字入力する
if (val>='0' && val<='7') { // 0-7 なら
val -= '0'; // 文字から数値に変換し
if(bitRead(leds,val)) // 対象ビットが
bitClear(leds,val); // 「1」ならクリア
else // 「0」ならセット
bitSet(leds,val);
}else if(val == 'x'){ // 「x」なら
leds = 0; // 全ビットをクリア
}
updateShiftRegister(leds); // LEDパターンを送信
}
}
使用した Arduino命令
今回使用したArduino関連の命令の簡単な説明とその日本語レファレンスの掲載されているリンクを紹介します。
- Serial.read()
読み込み可能なデータの最初の1バイトを返します。 - bitRead(x,n)
数 x の右端(LSB)から数えてn ビット目を読み取ります。 - bitSet(x,n)
数 x の右端(LSB)から数えてn ビット目を「1」にセットします。 - bitClear(x,n)
数 x の右端(LSB)から数えてn ビット目を「0」にクリアします。
動作の確認
スケッチを Arduino に書き込みプログラムがスタートした後に、シリアルモニターの送信欄に、0,1,2,3,4,5,6,7,x のどれかを入力し[送信]ボタンをクリックします。
数字キーでは該当するLEDが反転し、x キーでは全LEDが消灯します。
次回は、cdsを使用しシリアルモニターの利用を学習します。