さくらのジャンク箱ロゴ

Sakura87がほぼ月刊でお届けするPCや電子工作と写真の備忘録てきなブログ @なんと20周年

Arduino UnoでフルカラーLEDの制御

この記事は9年ほど前に投稿されました。内容が古くなっている可能性がありますので更新日時にご注意ください。

P1010170

前回簡単に解説したArduino UnoでフルカラーLEDを使ってIOポートの制御方法を説明したいと思います。

準備するもの

適当なフルカラーLED(今回はアノードコモンを使用)
適当な抵抗(用意したフルカラーLEDの仕様と欲しい輝度にあったもの)

配線

P1010182

まぁいい感じで。
※今回はArduino側にピン番号と機能が書かれているのでIO表はありません。

コーディング

まず、ArduinoのIDEを立ち上げるとこういう感じのコードが出てくると思います。

void setup() {
  // put your setup code here, to run once:

}

void loop() {
  // put your main code here, to run repeatedly:

}

setup()の方はArduino起動時に1回だけ実行されるプログラムを書き込みます。
例えば使用ハードウェアの初期化などですね。

loop()はメインのループ処理を行う関数です。ココに基本的な処理を書きます。

ということでsetup()の方にピンの初期化命令を、loopの方にIOピンを制御する命令を書きます。

なお、今回はデジタルIOで使用しますが、今後のためにPWM対応の9~11ピンを使用しました。

それではsetupの方に初期化命令を書きます。

// the setup function runs once when you press reset or power the board
void setup() {

  pinMode(11, OUTPUT);
  pinMode(10, OUTPUT);
  pinMode(9, OUTPUT);

}

pinMode(ピン番号,OUTPUT);で出力に切り替えて終わりです。

Arduino言語は非常に簡素にプログラムが出来るように作られているのでこれでおしまいです。
実はIOポートの使い方はWiringPiと同じです。(Arduino言語のベースであるWiring言語と同じ要領でIO制御を行える事を目指したのがWiringPiなので。)

次に制御プログラムを書きます。

// the loop function runs over and over again forever
void loop() {
  unsigned short i;
  while(1){
  i++;
  
  digitalWrite(11,~(i%8)&1);
  digitalWrite(10,~((i%8)>>1)&1);
  digitalWrite(9,~((i%8)>>2)&1);
  
  delay(1000);
  }
}

Arduinoに搭載されているマイコンはメモリが少ないので符号なしショート型で変数を初期化します。
今回はこの変数(i)の値を基にして光るLEDを決めることにします。

次にwhile(1)で無限ループを作りその中に出力変更命令を入れます。
digitalWrite(ピン番号,値);で出力を制御します。値は変数iの数値を8で割って、そのbitをマスクとビットシフトで抜き出しています。今回はアノードコモンなので先頭に~を付けて出力を反転しています。

そして1秒待って最初に戻ります。

動作

作成したプログラムを前回の手順でマイコンに書き込むと動作が始まります。

P1010182 P1010183 P1010184 P1010185
P1010186 P1010187 P1010188 P1010189

この写真では綺麗に色が出ていますが、このLEDは実際のところあまり良く混ざりません。
ですので何らかの方法で光を混ぜる必要があります。

プログラム

全体のプログラムを乗せます。

// the setup function runs once when you press reset or power the board
void setup() {

  pinMode(11, OUTPUT);
  pinMode(10, OUTPUT);
  pinMode(9, OUTPUT);

}

// the loop function runs over and over again forever
void loop() {
  unsigned short i;
  while(1){
  i++;
  
  digitalWrite(11,~(i%8)&1);
  digitalWrite(10,~((i%8)>>1)&1);
  digitalWrite(9,~((i%8)>>2)&1);
  
  delay(1000);
  }
}

ちなみにこれは11→R 10→G 9→B としていますが、
これを11→B 10→R 9→GとすることでN-88BASICの色番号と同じになります。

総閲覧数:84 PV

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください