Arduino Nanoでミニ電光掲示板(8×8マトリクスLED + MAX7219)を作る #4 基本編

[1 ソフトウェア インストール編](https://qiita.com/kan-no/items/34b4e54b58a7caae0441)
[2 電子パーツ購入編](https://qiita.com/kan-no/items/b39644aee91322203f3a)
[3 (共通)準備編](https://qiita.com/kan-no/items/63450faddbec89e279a3)
4 基本編
[5 フルカラーLED編](https://qiita.com/kan-no/items/3e3434dc4b536b5b5c00)
[6 ミニ電光掲示板編(1)](https://qiita.com/kan-no/items/ca3879022235729771e6)
[7 ミニ電光掲示板編(2)](https://qiita.com/kan-no/items/93f2327cc5b865a2591d)

---
基本編です。
外付けLED を光らせたり、光センサーで部屋の明るさを測定してみます。

フルカラーLEDや、ミニ電光掲示板を作りたい方はスキップしても構いませんが、この基本編を行うことで、電子工作に対する理解が深まると思います。

まず、前回の(共通)準備編で、PC と Arduino が USBケーブルで繋がっている場合は、USBケーブルを抜いてください。
以降、ブレッドボードにパーツを抜き差しする時は必ずUSBケーブルを抜いてください。
ケーブルを指したまま(電源が入ったまま)ブレッドボードのパーツを抜き差しすると、電子パーツが破損します。

続いて、下記図を参照して配線してみてください。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/198393/e4b43ac1-9d7e-773a-df18-3ff46fa81e69.png)
D5 ： Arduino Nano の D5 ピン
抵抗 ： ベージュ色の抵抗(向きは任意)
LED ： 長い足を抵抗側、短い足をアース側に
アース ： ブレッドボードの「-」

具体例は下記の通りです。
右半分(写真では上半分)に収めてください。左半分(写真では下半分)は次の工程で使用します。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/198393/58b38140-bddb-412e-90b5-e3f1951ad1af.png)
写真例では、Arduino はブレッドボードの 1行目から 15行目に刺さっています。
つまり 15行目までは Arduino が使っているので、抵抗やLEDを刺す場合は 16行目以降を使ってください。
Arduino の D5 (写真では8行目)から紫色のジャンパーケーブルで、19行目に逃がしています。
19行目から 23行目に 100Ω の抵抗を刺しています。抵抗に向きはありません。
23行目から 24行目に LED を刺していますが、LED には向きがあります。足の長い方を抵抗側に刺して下さい。
LED の足の短い方は 黄色のジャンパーケーブルで 一番外側の青いライン(-)に繋がっています。

配線が出来たら、開発環境で以前のプログラムを消して、下記の新しいプログラムをロードしてみてください。

```c
#define LED_PIN 13
#define LED_PIN_ADD 5

void setup () {
    pinMode (LED_PIN, OUTPUT);          // 13番ピンをデジタル出力に設定
    pinMode (LED_PIN_ADD, OUTPUT);      //  5番ピンをデジタル出力に設定
}
void loop () {
    digitalWrite (LED_PIN, HIGH);       // LEDを点灯する
    delay (1000);                       // 1秒待機する(1000ミリ秒)
    digitalWrite (LED_PIN, LOW);        // LEDを消灯する
    delay (1000);                       // 1秒待機する
    digitalWrite (LED_PIN_ADD, HIGH);   // LEDを点灯する
    delay (1000);                       // 1秒待機する
    digitalWrite (LED_PIN_ADD, LOW);    // LEDを消灯する
    delay (1000);                       // 1秒待機する
}
```

これで、Arduino 本体の LED と、外付けの LED が交互に点滅するはずです。
上手くいかなかったら、配線を確認したり、USBのポートを変えてトライしてみてください。
柔らかいジャンパー線は無理に抜き差しすると、内部で断線することがあるので、ちゃんと動かない場合は、他のジャンパー線に変えてみてください。

---

ここまでの配線を残したまま、反対側に光センサーを付けてみます。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/198393/d76539df-4eee-ad8d-1e6b-e6f66c889bc0.png)
+5V ： ブレッドボードの「+」
CDS ： 光センサー
A0 ： Arduino Nano の A0 ピン
抵抗 ： 水色の抵抗
アース ： ブレッドボードの「-」

具体例は下記の通りです。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/198393/4b81ef4a-39eb-7f3e-6232-68d9643dfed0.png)

一番手前の赤いラインから、19行目に繋いでいます。
19行目から 24行目に 10KΩ の抵抗を刺しています。抵抗に向きはありません。
24行目と A0( 4行名)を、緑色のジャンパー線で繋いでいます。
24行目から2 6行目に CDS を刺しています。CDS にも向きはありません。
CDSのもう一方( 26行目)を青いジャンパー線で青いライン(-)に繋いています。


配線が出来たら、開発環境で以前のプログラムを消して、下記の新しいプログラムをロードしてみてください。

```c
int ledPin = 5;                         // LEDをデジタルピン5に接続
int analogPin = 0;
int val = 0;                            // 読み取った値を格納する変数
int low_nm = 150;                       // 低い値
int high_nm = 450;                      // 高い値

void setup(){
  pinMode( ledPin, OUTPUT );            // ピン5を出力に設定
  Serial.begin( 9600 );                 // シリアル通信の初期化
}
void loop(){
  int threshold;
  threshold = ( low_nm + high_nm ) / 2; // 閾値をlowとhighの間に設定
  val = analogRead( analogPin );        // アナログピンを読み取る
  Serial.println( val );                // デバッグ用に送信
  if( val >= threshold ){
    digitalWrite( ledPin, HIGH );       // LEDをオンに
  } else {
    digitalWrite( ledPin, LOW );        // LEDをオフに
  }
  delay ( 1000 );                       // 1秒待機する
}
```

プログラムのロードが終わったら、ツール → シリアルモニタ を選択してください。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/198393/886fdb1e-8d3d-c468-61e4-6beef810a458.png)
なにもしないで CDS に光が当たっている時と、CDS に指を当てて光をさえぎった時で、値が大きく変わると思います。
この値は部屋の明るさによりますので、光を当てた時の値と、光を遮った時の値をメモしてください。

```c
int low_nm = 150;                       // 低い値
int high_nm = 450;                      // 高い値
```

そして、プログラムの 4行目と 5行目の値を、その値で書き換えてください。
書き換えたら、再度プログラムをロードします。
これで、光を当てた時と、遮った時で、LED を付けたり消したりすることができます。

つまり、CDS から入力された情報で、LED に結果を出力しているわけです。
この原理がわかれば、入力側を、スイッチや各種センサーに、出力側をブザーやモーターに変えることで、色々な装置を作ることができます。

---

光センサーのオマケ。
配線は上記のままで、プログラムを下記のものに差し替えてください。

```c
int ledPin = 5;                         // LEDをデジタルピン13に接続
int analogPin = 0;
int val = 0;                            // 読み取った値を格納する変数
int low_nm = 150;                       // 低い値
int high_nm = 450;                      // 高い値

void setup( ) {
    pinMode( ledPin, OUTPUT );            // ピン13を出力に設定
    Serial.begin( 9600 );                 // シリアル通信の初期化
}
void loop( ) {
  int threshold_1, threshold_2, threshold_3, threshold_4, threshold_5;
  int wait;

  threshold_1 = low_nm - 10;
  threshold_5 = high_nm + 10;
  threshold_3 = ( threshold_1 + threshold_5 ) / 2;
  threshold_2 = ( threshold_1 + threshold_3 ) / 2;
  threshold_4 = ( threshold_3 + threshold_5 ) / 2;
  val = analogRead( analogPin );        // アナログピンを読み取る
  Serial.println( val );                // デバッグ用に送信
  if ( val < threshold_2 ) {            // 閾値2以下
    wait=1000;                          // 遅い点滅
  }
  else if ( val < threshold_3 ) {       // 閾値3以下
    wait=500;                           // やや遅い点滅
  }
  else if ( val < threshold_4 ) {       // 閾値4以下
    wait=200;                           // やや早い点滅
  }
  else {                                // 4より大きい
    wait=100;                           // 早い点滅
  }
  digitalWrite( ledPin, HIGH );         // LEDをオンに
  delay ( wait );
  digitalWrite( ledPin, LOW );          // LEDをオフに
  delay ( wait );
}
```

4～5 行目を書き換えるのを忘れないようにしてください。今回はこの値がとても重要です。
今度は光を当てないと、LED がゆっくり点滅していると思いますが、指で CDS を隠すと、点滅が早くなります。
ゆっくり指を離してみてください。点滅のスピードが 4段階で変わる筈です。

基本編は以上で終了です。

---
[次へ](https://qiita.com/kan-no/items/3e3434dc4b536b5b5c00)