目次
前
次
夜間点滅器スケッチ
暗くなるとLEDが点滅する、防犯グッズを
実現するスケッチを考えます。
外界の状況を知るためには、センサーが必要です。
センサーとしてはCdSを利用します。
CdSは周囲の光量により、抵抗値が変化するので
A/Dコンバータを利用して抵抗値を電圧値に変換
して入力します。
ブロック図で示すと、次の構成にすればよいはず。
CdSセンサーの代用で、可変抵抗でArduinoに
電圧を入れる回路を利用して動作確認します。
回路は非常に簡単で、可変抵抗にOPアンプを
接続しているだけです。
可変抵抗のトリマーを回転することで、電圧変化を
端末表示するスケッチを作成しました。
#define INTERV 500
/* pin assignment */
int cds = 0 ;
int val ;
/* variables */
word xinterval ;
void setup()
{
/* initialize serial port */
Serial.begin(9600);
/* set interval */
xinterval = INTERV ;
/* clear variable */
val = 0 ;
}
void loop()
{
/* get analog value */
val = analogRead(cds) ;
/* show */
Serial.println(val);
/* delay */
delay(xinterval);
}
アナログ入力ピンを指定後、500msごとに
電圧変換値を表示するだけ。
変換値と電圧の相関表を作成する
ために、このスケッチを利用します。
CdSを利用して発生する電圧を
いくつにするかを決定するため
相関表を使います。
CdSをセンサーにする回路は、単純で
以下です。
夜間点滅器を実現するためのシーケンスは
次のようにしました。
- CdSで発生する電圧を入力
- 閾値と比較してフラグを設定
- フラグによりLEDの点滅か消灯を実行
- ディレイ
- 1に戻る
点滅か消灯かの判断をひとつのフラグに
担当させます。
フラグがたっている LED点滅
フラグがおちている LED消灯
シーケンス処理とフラグを組み合わせ
次のスケッチとしました。
#define INTERV 500
#define OFF 0
#define ON OFF+1
#define MYTH 400
/* pin assignment */
int ledPin = 13; /* LED connected to digital pin 13 */
int cds = 0 ;
/* variables */
word xinterval ;
byte state ;
byte night_flag ;
/* function prototype */
void put_led(UBYTE x);
void setup()
{
/* initialize the digital pin as an output */
pinMode(ledPin, OUTPUT);
/* set interval */
xinterval = INTERV ;
/* clear flag */
night_flag = OFF ;
/* set state */
state = 0 ;
}
void loop()
{
/* judge */
night_flag = OFF ;
if ( analogRead(cds) > MYTH ) {
night_flag = ON ;
}
/* night flashing */
if ( night_flag == ON ) {
if ( state & 1 ) { put_led(ON) ; }
else { put_led(OFF); }
}
else
/* turn off LED */
{
put_led(OFF);
}
/* increment */
state++ ;
/* delay */
delay(xinterval);
}
void put_led(UBYTE x)
{
if ( x ) { digitalWrite(ledPin, LOW) ; }
else { digitalWrite(ledPin, HIGH) ; }
}
センサーが昼夜の状態を論理値で出力する場合
次のようにスケッチを記述できます。
#define INTERV 500
#define OFF 0
#define ON OFF+1
/* pin assignment */
int ledPin = 13; /* LED connected to digital pin 13 */
int sensorPin = 12; /* sensor connected to digital pin 12 */
/* variables */
word xinterval ;
byte state ;
byte night_flag ;
/* function prototype */
void put_led(UBYTE x);
void setup()
{
/* initialize the digital pin */
pinMode(ledPin, OUTPUT);
pinMode(sensorPin, INPUT);
/* set interval */
xinterval = INTERV ;
/* clear flag */
night_flag = OFF ;
/* set state */
state = 0 ;
}
void loop()
{
/* judge */
night_flag = OFF ;
if ( digitalRead(sensorPin) == LOW ) {
night_flag = ON ;
}
/* night flashing */
if ( night_flag == ON ) {
if ( state & 1 ) { put_led(ON) ; }
else { put_led(OFF); }
}
else
/* turn off LED */
{
put_led(OFF);
}
/* increment */
state++ ;
/* delay */
delay(xinterval);
}
void put_led(UBYTE x)
{
if ( x ) { digitalWrite(ledPin, LOW) ; }
else { digitalWrite(ledPin, HIGH) ; }
}
センサー部分の特徴にあわせてスケッチを
変えられるよう、ハードウエア知識を持つ
ことが大切です。
配線は、以下のようになります。
目次
前
次