シフトレジスタ74HC595と8つのLED ~シリアルモニタで制御~ ①チュートリアル通りに動かす

2022/07/11

74HC598 Arduino

t f B! P L

前回シフトレジスタとArduinoを組み合わせてLED×8個を点滅させました。そこに今回、ArduinoのシリアルモニタからLEDを制御します。

 目次:

今回の目的

ELEGOOのチュートリアル「シリアルモニタ」をチュートリアル通りに動かします。

※チュートリアルの文章(PDF日本語版含む)もスケッチもELEGOOのサイトから無料でダウンロードできました。

Download ⇒「Arduino Kits & ~」⇒「UNO R3 Starter Kits」⇒ 「ELEGOO UNO R3 The Most Complete Starter Kit」 からダウンロードリンクに辿り着けます。


シフトレジスタ74HC595と8つのLED

前回動かした構成そのままです。

↓↓↓前回↓↓↓

シフトレジスタ74HC595と8つのLED①チュートリアル通りに動かす-sozoro-Lab.

ArduinoからシフトレジスタにLED個数分の点灯・消灯を順繰り(シリアル)に送り、そのシフトレジスタからLEDを同時(パラレル)に点灯させる構成をとります(「シリアル-パラレル変換」)。

今回はArduinoのUSBをパソコンにつなぎ、Arduino IDEのシリアルモニタから点灯するLEDを制御します。


器材接続

接続も前回に同じ。ただし前回とは異なり、パソコンから制御入力するため、ArduinoのUSBケーブルはパソコンに繋いで動かします。



図1.機材接続


スケッチ

前回のものと違う箇所を赤で着色しております。

↓↓↓前回↓↓↓

シフトレジスタ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」代入

    }

  }

}


動作

動かしました。

(1)LED全消灯

(2)シリアルモニタ入力待ち

図2.初期状態

初期状態(図2)ではLEDは全消灯、シリアルモニタには入力を促すメッセージが表示されております。

続いて、このシリアルモニタに"0"を入力します。


(1)シリアルモニタに"0"を入力
(赤丸部分に入力)

(2)続いて「送信」を押した

(3)"0"番目のLEDが点灯した

図3.シリアルモニタから"0"入力

"0"番目のLEDが点灯した状態(図3)。ここで続いて"7"を入力します。


(1)シリアルモニタに"7"を入力→「送信」を押した

(2)"0"番目に加えて"7"番目のLEDが点灯

図4.シリアルモニタから"7"入力


"0"番目に加えて"7"番目のLEDが点灯しました。

この状態で"x"を入力→送信します。


図5.シリアルモニタから"x"入力

シリアルモニタには「Cleared」の文字が現れ(図5)、LEDは初期状態と同じく全消灯します(図2-(1))。


所感

これまでもシリアルモニタを出力装置として使用しておりましたが、今回初めて入力装置として使用しました。こういうことができる、という知見が増えたことで今後何かしらのアイディアが浮かぶようになるかもしれません。

このブログを検索

ブログ アーカイブ

自己紹介

にほんブログ村

QooQ