このサイトはMacを使って Arduino Uno の動作や活用法を学びます。

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関連の命令の簡単な説明とその日本語レファレンスの掲載されているリンクを紹介します。

動作の確認

スケッチを Arduino に書き込みプログラムがスタートした後に、シリアルモニターの送信欄に、0,1,2,3,4,5,6,7,x のどれかを入力し[送信]ボタンをクリックします。
数字キーでは該当するLEDが反転し、x キーでは全LEDが消灯します。 
 

 

次回は、cdsを使用しシリアルモニターの利用を学習します。