はりうすブログ (のすけのメモ)

湘南にある小さな会社 代表 ”のすけ”のブログです

中華で始める Arduino入門日記7 LEDをクリスマスツリーっぽく光らせる

のすけです。 中華で始めるシリーズも今回で7回目ですね。

この連載は、爆安の中華製のArduino互換機を入手し、色々と苦しみながらも安い互換機でArduinoを学習してしまおうというものです。 入手の話はこちらから。

hollywis.hatenablog.com

本題

前回はロウソクのようにLEDを付けました。

hollywis.hatenablog.com

今回は、たくさんの色々なLEDをくっ付けてプログラムで制御します。

チュートリアルのチャプター5 Advertising LEDになります。

回路図

f:id:hollywis:20151203174151p:plain *出展:SainSmartチュートリアル

よく見えませんが、ArduinoのDigitalピン0~5にそれぞれLEDを付けろという ものになります。

配線例がこちら f:id:hollywis:20151203174326p:plain *出展:SainSmartチュートリアル

なんか、複雑ですねぇ。。。

ブレッドボードで作ってみる

f:id:hollywis:20151203174559j:plain

配線例が無駄に複雑っぽかったので、簡略化しました。

材料はこちら

  • LED 6個(赤、黄、緑)

  • 抵抗220Ω 6個

  • ジャンパーコード 7本

配線は次のように繋げます。

  • ピン0 - 220Ω - LED(緑) - GND

  • ピン1 - 220Ω - LED(黄) - GND

  • ピン2 - 220Ω - LED(赤) - GND

  • ピン3- 220Ω - LED(赤) - GND

  • ピン4 - 220Ω - LED(黄) - GND

  • ピン5 - 220Ω - LED(緑) - GND

f:id:hollywis:20151203175139j:plain

つなげてみました。

お気づきかもしれませんが、なぜか右2つのピン0,ピン1に接続している LEDが付いてます。

特にHIGHに設定していないのですが。。。よく分かりません。

プログラム

int Led1 = 1;
int Led2 = 2;
int Led3 = 3;
int Led4 = 4;
int Led5 = 5;
int Led6 = 6;

// 光り方1
// LEDが順に光り(HIGH)に、順に消える(LOW)
void style_1(void)
{
  unsigned char j;
  for(j=1;j<=6;j++)
  {
    digitalWrite(j,HIGH);
    delay(200);
  }
  for(j=6;j>=1;j--)
  {
    digitalWrite(j,LOW);
    delay(200);
  } 
}

// フラッシュ
// LEDが全て光り(HIGH)、全て消える(LOW)
void flash(void)
{   
  unsigned char j,k;
  for(k=0;k<=1;k++)
  {
    for(j=1;j<=6;j++)
      digitalWrite(j,HIGH);
    delay(200);
    for(j=1;j<=6;j++)
      digitalWrite(j,LOW);
    delay(200);
  }
}

// 光り方2
void style_2(void)
{
  unsigned char j,k;
  k=1;
  for(j=3;j>=1;j--)
  {   
    digitalWrite(j,HIGH);
    digitalWrite(j+k,HIGH);
    delay(400);
    k +=2;
  }
  k=5;
  for(j=1;j<=3;j++)
  {
    digitalWrite(j,LOW);
    digitalWrite(j+k,LOW);
    delay(400);
    k -=2;
  }
}

// 光り方3 
void style_3(void)
{
  unsigned char j,k;
  k=5;
  for(j=1;j<=3;j++)
  {
    digitalWrite(j,HIGH);
    digitalWrite(j+k,HIGH);
    delay(400);
    digitalWrite(j,LOW);
    digitalWrite(j+k,LOW);
    k -=2;
  }
  k=3;
  for(j=2;j>=1;j--)
  {   
    digitalWrite(j,HIGH);
    digitalWrite(j+k,HIGH);
    delay(400);
    digitalWrite(j,LOW);
    digitalWrite(j+k,LOW);
    k +=2;
  } 
}
void setup()
{ 
  unsigned char i;
  for(i=1;i<=6;i++)
    pinMode(i,OUTPUT);
}
void loop()
{   
  style_1();
  flash();
  style_2();
  flash();
  style_3();
  flash();
}

やってみた(でも何か変)

光りましたね。でも、一番右のLEDおかしくないですか?

ずっと光ってます。

よくよくコードを見ると

int Led1 = 1;
int Led2 = 2;
int Led3 = 3;
int Led4 = 4;
int Led5 = 5;
int Led6 = 6;

となっていますね。

ずれてるじゃん!!SainSmartのサンプルコードは図とずれているようですね。 修正しましょう。

0ピンはなぜかデフォルトでHIGHになっているっぽいので、使わないでサンプルコードの通り 1~6ピンを使うようにずらします。

f:id:hollywis:20151203182220j:plain

そして、実行すると。。

クリスマスツリーのLED照明とかに似ている感じだ。

1.右から順に光って戻る style_1

2.フラッシュ flush

3.黄赤緑の順に光る style_2

4.フラッシュ flush

5.緑赤黄の順に光る style_3

6.フラッシュ flush

このような順で実行されていました。上手く動いているようです。

  • ピン1,6が緑

  • ピン2,5が赤

  • ピン3,4が黄

これを意識しながらfor文で光り方を設定後delayを追加という流れで、それぞれの光り方を設定している訳ですね。

setup部の

for(i=1;i<=6;i++)
    pinMode(i,OUTPUT);

で一括でDigitalピンを出力設定しています。

次回は「Traffic light」信号機をやります。