前回シフトレジスタとArduinoを組み合わせてLED×8個を点滅させました。そこに今回、ArduinoのシリアルモニタからLEDを制御します。
目次:
今回の目的
ELEGOOのチュートリアル「シリアルモニタ」をチュートリアル通りに動かします。
※チュートリアルの文章(PDF日本語版含む)もスケッチもELEGOOのサイトから無料でダウンロードできました。
シフトレジスタ74HC595と8つのLED
前回動かした構成そのままです。
↓↓↓前回↓↓↓
シフトレジスタ74HC595と8つのLED①チュートリアル通りに動かす-sozoro-Lab.ArduinoからシフトレジスタにLED個数分の点灯・消灯を順繰り(シリアル)に送り、そのシフトレジスタからLEDを同時(パラレル)に点灯させる構成をとります(「シリアル-パラレル変換」)。
今回はArduinoのUSBをパソコンにつなぎ、Arduino IDEのシリアルモニタから点灯するLEDを制御します。
器材接続
接続も前回に同じ。ただし前回とは異なり、パソコンから制御入力するため、ArduinoのUSBケーブルはパソコンに繋いで動かします。
スケッチ
前回のものと違う箇所を赤で着色しております。
↓↓↓前回↓↓↓
シフトレジスタ74HC595と8つのLED①チュートリアル通りに動かす-sozoro-Lab.
byte leds = 0; // 1バイト(8ビット)変数「leds」に「00000000」代入
void updateSR() {
digitalWrite(11,LOW); // ST_CPにLOWを入力
shiftOut(12,9,LSBFIRST,leds); // DS,SH_CP指定。LSB側から変数「leds」をシフトアウト
delay(100); // 0.1秒間待つ
}
void setup() {
pinMode(11,OUTPUT); // D11(ST_CPに接続)を出力設定
pinMode(12,OUTPUT); // D12(DSに接続)を出力設定
pinMode(9,OUTPUT); // D9(SH_CPに接続)を出力設定
updateSR(); // 変数「leds」をLED点灯状態に反映(ここでは全消灯)
Serial.begin(9600); // 9,600bpsでポートを開く
while(! Serial); // シリアル接続完了までぐるぐる
Serial.println("Enter LED Number 0 to 7 or 'x' to clear"); // シリアルモニタにメッセージ表示
}
void loop() {
if(Serial.available()) { // シリアルポートに受信データあれば以下実行
char ch = Serial.read(); // 変数「ch」に受信データ(文字)代入
if(ch >= '0' && ch <= '7') { // 変数「ch」が0~7であれば以下実行
int led = ch - '0'; // 変数「ch」を数値データに変換して「led」に代入
bitSet(leds, led); // 変数「leds」の「led」番目を"1"にする
updateSR(); // 変数「leds」をLED点灯状態に反映
Serial.print("Turned on LED"); // シリアルモニタにメッセージ表示
Serial.println(led); // 上に続けて変数「led」表示
}
if(ch == 'x'){
leds = 0; // 変数「leds」に「00000000」代入
updateSR(); // 変数「leds」をLED点灯状態に反映(ここでは全消灯)
Serial.println("Cleared"); // 変数「leds」に「00000000」代入
}
}
}
動作
動かしました。
初期状態(図2)ではLEDは全消灯、シリアルモニタには入力を促すメッセージが表示されております。
続いて、このシリアルモニタに"0"を入力します。
"0"番目のLEDが点灯した状態(図3)。ここで続いて"7"を入力します。
"0"番目に加えて"7"番目のLEDが点灯しました。
この状態で"x"を入力→送信します。
シリアルモニタには「Cleared」の文字が現れ(図5)、LEDは初期状態と同じく全消灯します(図2-(1))。
所感
これまでもシリアルモニタを出力装置として使用しておりましたが、今回初めて入力装置として使用しました。こういうことができる、という知見が増えたことで今後何かしらのアイディアが浮かぶようになるかもしれません。
0 件のコメント:
コメントを投稿