このブログへの投稿/アップロードについて(コメントは誰でも、投稿は受講者+スタッフのみ)
コメント/投稿/ラベルについて(基本事項)投稿時間の設定(下書き/予定など)プログラム(ソースコード)を投稿する際の注意点Processingのプログラム(Applet)を表示する方法
ArduinoやProcessingについては「建築発明工作ゼミ2008」の方にまとめてあります。
秋葉原の電子工作マップ、Arduino販売店についてはこちら。 :

2010年6月27日日曜日

Arduino:7セグ+照度センサNJL7502L

今回は照度センサ(光センサ)から得られる明るさの度合いを7セグLED(数字を表示するLED)を用いて表示します。
まずは、7セグLEDの表示実験から始めます。7セグLEDは数字を表現する7個のLED(右下ドットを含めれば8個)が内蔵された部品です。今回用いる7セグLEDはアノードコモン(プラス端子共有)タイプです。表示させるには、数字の形に対応した複数のLEDを点灯させます。詳しくは「Arduino 7セグLEDの点灯」を参照してください。

7セグ点灯実験:
配線は以下の通りになります。Arduinoボードから供給される電圧は5Vなので(高過ぎるので)、内蔵されているそれぞれのLEDに対して220Ωの抵抗を取り付けてあります。Arduinoボードの0番ピンと1番ピンはプログラムのアップロードやシリアル通信に用いるので、2番ピンから8番ピンを使うことにします。


とりあえず、点灯実験として「1」〜「3」の数字を1秒間隔で表示してみます。注意しなければいけないことは、各セグメントのプラス端子はArduinoボードの5V端子と接続されているので、各セグメントのマイナス側端子を制御することになります。それぞれのセグメントを点灯させる場合、
digitalWrite(ピン番号,LOW);
にします。
delay()は、1/1000秒単位の継続時間です。括弧内の値は1000なので1秒ということになります。
初期設定であるvoid setup(){...}内にはpinMode()で使用するArduinoボード上のピンをデジタル出力に設定しておきます。あとは、各数字に応じたセグメントごとのLEDのマイナス端子側をdigitalWrite()を用いて、LOWにすることで点灯、HIGHにすることで消灯します。
Arduinoのプログラムは以下のようになります。

void setup(){
//2~8番ピンをデジタル出力用に設定
pinMode(2,OUTPUT);
pinMode(3,OUTPUT);
pinMode(4,OUTPUT);
pinMode(5,OUTPUT);
pinMode(6,OUTPUT);
pinMode(7,OUTPUT);
pinMode(8,OUTPUT);
}

void loop(){
//one
digitalWrite(2,LOW);
digitalWrite(3,LOW);
digitalWrite(4,LOW);
digitalWrite(5,LOW);
digitalWrite(6,LOW);
digitalWrite(7,LOW);
digitalWrite(8,HIGH);
delay(1000);

//two
digitalWrite(2,LOW);
digitalWrite(3,LOW);
digitalWrite(4,HIGH);
digitalWrite(5,LOW);
digitalWrite(6,LOW);
digitalWrite(7,HIGH);
digitalWrite(8,LOW);
delay(1000);

//three
digitalWrite(2,HIGH);
digitalWrite(3,LOW);
digitalWrite(4,LOW);
digitalWrite(5,LOW);
digitalWrite(6,LOW);
digitalWrite(7,HIGH);
digitalWrite(8,LOW);
delay(1000);
}


7セグ+照度センサ:
次に照度センサ(光センサ:NJL7502L)をこの回路に追加して、その照度にあわせて7セグ表示してみます。光センサ:NJL7502Lには、1MΩの抵抗を接続して分圧させます(分圧についてはこちらを参照)。分圧した端子をArduinoボード右下のANALOG INの端子である0番ピンに接続してanalogRead()のコマンドを用いて、その値を読み込みます。analogRead()は括弧内に接続したANALOG IN端子のピン番号を入れておきます。1MΩの抵抗で分圧させると、室内ではおよそ900程度の値を読み取ることができました。


Arduinoのプログラム上では、光センサ:NJL7502Lから読み取られる値をif()を用いて100ずつの間隔で区切って、それに応じて7セグの数字表示を行います(10段階:例えば値が450であれば7セグ上で4)。
初期設定であるvoid setup(){...}内では、各ピンをデジタル出力に設定しますが、今回はfor()を用いて繰り返し処理で2~8番ピンを一気にOUTPUTに設定しています。
光センサから読み取るためには、アナログ入力としてanalogRead()のコマンドを使いますが、初期設定でピンの入出力の設定をする必要はありません。
それから、void loop(){...}内では、zero()、one()などと任意のファンクション名を使った方法を用いています。それぞれの内訳はvoid loop(){...}以下に書いてあるvoid zero(){...}のように、それぞれの数字に対応したdigitalWrite()コマンドが含まれています。こうすることで、void loop(){...}内では、任意に設定したファンクション名であるzero()やone()などを必要に応じて呼び出して使うことができます。

void setup(){
//for()を使って繰り返し処理:2~8番ピンをデジタル出力用に設定
for(int i=2;i<=8;i++){
pinMode(i,OUTPUT);
}
}

void loop(){
int val=analogRead(0); //ANALOG INの0番ピンに接続した光センサの値を読み込む
if(val<100){ //読み込み値が100未満なら
zero();
}else if(val<200){ //読み込み値が200未満なら
one();
}else if(val<300){ //読み込み値が300未満なら
two();
}else if(val<400){ //読み込み値が400未満なら
three();
}else if(val<500){ //読み込み値が500未満なら
four();
}else if(val<600){ //読み込み値が600未満なら
five();
}else if(val<700){ //読み込み値が700未満なら
six();
}else if(val<800){ //読み込み値が800未満なら
seven();
}else if(val<900){ //読み込み値が900未満なら
eight();
}else{ //読み込み値が上記以外なら
nine();
}
delay(100);
}

//任意のファンクション名をつけて数字ごとに分けてプログラムをしておく
void zero(){
digitalWrite(2,LOW);
digitalWrite(3,LOW);
digitalWrite(4,LOW);
digitalWrite(5,LOW);
digitalWrite(6,LOW);
digitalWrite(7,LOW);
digitalWrite(8,HIGH);
}
void one(){
digitalWrite(2,HIGH);
digitalWrite(3,HIGH);
digitalWrite(4,LOW);
digitalWrite(5,LOW);
digitalWrite(6,HIGH);
digitalWrite(7,HIGH);
digitalWrite(8,HIGH);
}

void two(){
digitalWrite(2,LOW);
digitalWrite(3,LOW);
digitalWrite(4,HIGH);
digitalWrite(5,LOW);
digitalWrite(6,LOW);
digitalWrite(7,HIGH);
digitalWrite(8,LOW);
}

void three(){
digitalWrite(2,HIGH);
digitalWrite(3,LOW);
digitalWrite(4,LOW);
digitalWrite(5,LOW);
digitalWrite(6,LOW);
digitalWrite(7,HIGH);
digitalWrite(8,LOW);
}

void four(){
digitalWrite(2,HIGH);
digitalWrite(3,HIGH);
digitalWrite(4,LOW);
digitalWrite(5,LOW);
digitalWrite(6,HIGH);
digitalWrite(7,LOW);
digitalWrite(8,LOW);
}

void five(){
digitalWrite(2,HIGH);
digitalWrite(3,LOW);
digitalWrite(4,LOW);
digitalWrite(5,HIGH);
digitalWrite(6,LOW);
digitalWrite(7,LOW);
digitalWrite(8,LOW);
}

void six(){
digitalWrite(2,LOW);
digitalWrite(3,LOW);
digitalWrite(4,LOW);
digitalWrite(5,HIGH);
digitalWrite(6,LOW);
digitalWrite(7,LOW);
digitalWrite(8,LOW);
}

void seven(){
digitalWrite(2,HIGH);
digitalWrite(3,HIGH);
digitalWrite(4,LOW);
digitalWrite(5,LOW);
digitalWrite(6,LOW);
digitalWrite(7,LOW);
digitalWrite(8,HIGH);
}

void eight(){
digitalWrite(2,LOW);
digitalWrite(3,LOW);
digitalWrite(4,LOW);
digitalWrite(5,LOW);
digitalWrite(6,LOW);
digitalWrite(7,LOW);
digitalWrite(8,LOW);
}

void nine(){
digitalWrite(2,HIGH);
digitalWrite(3,LOW);
digitalWrite(4,LOW);
digitalWrite(5,LOW);
digitalWrite(6,LOW);
digitalWrite(7,LOW);
digitalWrite(8,LOW);
}


センサのモニタリング(シリアルモニター):

尚、光センサの照度をモニタリングするには、以下のようなプログラムを一旦Arduinoボードにアップロードし(配線は上画像のまま)、画面内の右側のボタン(Serial Monitor)を押してください。

void setup(){
Serial.begin(9600);
}

void loop(){
int val=analogRead(0);
Serial.printLn(val);
delay(500);
}




Serial Monitorボタンを押すと以下のような別ウィンドウが現れて、センサから読み込んだ値を次々と出力していきます。
analogRead()の場合、0~1023(1024段階)の値を返します。

0 件のコメント:

コメントを投稿

*