
人の動きに反応してLEDが点滅するクリスマスツリーのキットです。
「プレゼントもあるよ🎁人に反応するクリスマスツリーが完成しました」の記事でプレゼントしております。
この記事では、クリスマスツリーの仕組みと組み立て方をご紹介します。
クリスマスツリーキットの仕組み
動作している様子
人の手の動きに反応して、LEDが点滅している様子がわかります。点灯の最初は白色で点滅し、その後、赤青緑など色がカラフルに変化します。LEDには電気をつなぐと自動で色が変化するフラッシュLEDを使っています。
回路図

LEDの点灯には、Padauk PFS154というマイコンを使っています。
人の動きの検出には、SR602という人体検知センサを使っています。このセンサは、人体の皮膚の温度と背景温度の温度の違いを、高感度に検出するセンサです。このため人が動いて温度が変化すると、センサが反応してパルスが出力されます。SR602は待機電力がとても少ないという特徴もあります。このため、コイン電池でも長時間待ち受けすることができます。
マイコンはスリープ状態で、パルスがやってくるのを待ち受けしています。
パルスを検出したら、スリープから復帰しLEDを点滅させます。PadaukマイコンはIOのドライブ能力が低く、3Vで光るRGBフラッシュLEDを直接ドライブできません。そのため、MOS-FETを使ってフラッシュLEDをドライブしています。フラッシュLEDは4つあるので、4つ同じ回路があります。
黄色のLEDはマイコンで直接ドライブしても点灯するため、MOS-FETなしでダイレクトに接続しています。
白色点滅の仕組み

フラッシュLEDはRGBに自動で色が変わるLEDなのですが、電源を入れた最初の色が白で発光します。このため一瞬だけONすると白色に光ります。一瞬だけONを繰り返すことで、白色で点滅しているように見えます。
長時間ONすると、RGBの色が自動的に変化する通常の光り方になります。
プログラム
#include <pdk/device.h>
#include <stdint.h>
#include "auto_sysclock.h"
#include "delay.h"
#define LED1_BIT 0
#define LED2_BIT 4
#define LED3_BIT 3
#define LED4_BIT 6
#define LED5_BIT 7
#define LED1_OFF() PA &= ~(1 << LED1_BIT)
#define LED1_ON() PA |= (1 << LED1_BIT)
#define LED2_OFF() PA &= ~(1 << LED2_BIT)
#define LED2_ON() PA |= (1 << LED2_BIT)
#define LED3_OFF() PA &= ~(1 << LED3_BIT)
#define LED3_ON() PA |= (1 << LED3_BIT)
#define LED4_OFF() PA &= ~(1 << LED4_BIT)
#define LED4_ON() PA |= (1 << LED4_BIT)
#define LED5_ON() PA &= ~(1 << LED5_BIT)
#define LED5_OFF() PA |= (1 << LED5_BIT)
#define LED_NUM 5
#define PIR_PIN 5
#define PIR_STATES() ( PA & (1 << PIR_PIN) ) != 0
#define PIR_ON 1
#define PIR_OFF 0
#define DELAY_TIME_MS 3
#define ON_TIME_S 9
#define COUNTUP_MAX 30
unsigned short xs = 17;
char rand(){
xs ^= xs << 7;
xs ^= xs >> 9;
xs ^= xs << 8;
return ( (char)xs )/2;
}
char setCountdown()
{
char temp = rand();
temp = temp/4 + 5;
return temp;
}
void main() {
PDK_USE_FACTORY_IHRCR_16MHZ();
PDK_USE_FACTORY_BGTR();
AUTO_INIT_SYSCLOCK();
CLKMD &= ~CLKMD_ENABLE_WATCHDOG; // Disenable WDT
PAC |= (1 << LED1_BIT); // Set LED pin as output
PAC |= (1 << LED2_BIT); // Set LED pin as output
PAC |= (1 << LED3_BIT); // Set LED pin as output
PAC |= (1 << LED4_BIT); // Set LED pin as output
PAC |= (1 << LED5_BIT); // Set LED pin as output
PAC &= ~(1 << PIR_PIN ); //portA Init for PIR Sensor INPUT
uint8_t pbdierReg = 0;
pbdierReg |= ( 1 << PIR_PIN ); //button INPUT
PADIER = pbdierReg; //PBDIERはリードできないので一括で設定する必要がある PBDIER can't read. Need to set one time.
LED1_OFF();
LED2_OFF();
LED3_OFF();
LED4_OFF();
LED5_OFF();
int LEDCountdown[LED_NUM];
int LEDCountup[LED_NUM];
while(1)
{
for( int i=0 ; i<LED_NUM ; i++)
{
LEDCountdown[i] = setCountdown();
LEDCountup[i] = 0;
}
while(1)
{
for( int i=0 ; i<LED_NUM ; i++)
{
LEDCountdown[i]--;
if( LEDCountdown[i] <= 0)
{
switch(i){
case 0:
LED1_ON();
break;
case 1:
LED2_ON();
break;
case 2:
LED3_ON();
break;
case 3:
LED4_ON();
break;
case 4:
LED5_ON();
break;
default:
break;
}
LEDCountdown[i] = setCountdown();
LEDCountup[i]++;
}
}
_delay_ms(DELAY_TIME_MS);
if( LEDCountup[0] < COUNTUP_MAX)
LED1_OFF();
if( LEDCountup[1] < COUNTUP_MAX)
LED2_OFF();
if( LEDCountup[2] < COUNTUP_MAX)
LED3_OFF();
if( LEDCountup[3] < COUNTUP_MAX)
LED4_OFF();
if( LEDCountup[4] < COUNTUP_MAX)
LED5_OFF();
if( LEDCountup[0] > COUNTUP_MAX && LEDCountup[1] > COUNTUP_MAX && LEDCountup[2] > COUNTUP_MAX && LEDCountup[3] > COUNTUP_MAX && LEDCountup[4] > COUNTUP_MAX )
break;
}
for(int i=0 ; i<ON_TIME_S ; i++)
_delay_ms(1000);
LED1_OFF();
LED2_OFF();
LED3_OFF();
LED4_OFF();
LED5_OFF();
if( PIR_STATES() == PIR_OFF )
{
__stopsys();
}
}
}
PFS154のプログラムです。
LEDのON,OFFがしやすいように12から21行目でdefineしています。こうすることであたかも関数を呼ぶような感じになり、ON,OFFするたびにレジスタを操作する必要がなくなります。
ポートのリードも同様です。ビットのリードを25行目でdefineしています。PIR_STATES関数を呼ぶような感じで利用でき、戻り値がIOのHigh、Lowとなります。
33から39行目はランダムな値を取得する関数となります。

mainプログラムを実行すると、LEDは上の図のように点灯します。最初は5つのLEDをランダムな周期で一瞬だけ点灯させて、その後しばらくONするというプログラムになっています。
最後に133行目から137行目で全てのLEDをOFFします。その後、141行目のstopsysによってスリープし、人感センサがつながったPA5ピンのピン変化割り込みを待ちます。
人体検知センサが反応すると、ピン変化割り込みが発生しスリープから復帰します。Padaukマイコンは、スリープから復帰した場合にはstopsysの次の行からプログラムの動作が開始されます。スリープから復帰すると75行目のwhileに戻って、再び点滅を開始します。
Padaukマイコンのプログラムの書き込みには「Super Easy PDK Programmer」を使っています。
組み立て方
必要な工具
- はんだごて 温調はんだごてはコンセントを入れるとすぐにあったまって使いやすいです
- はんだ ダイソーでも売っています
- はんだごて台 ダイソーでも売っています
- ニッパー 下のニッパーはとても綺麗に切れます
- 強力ニッパ なくてもいいです
内容物

キットに入っている物は以下の通りです。
- 基板
- コイン電池
- 黄色 5mm LED
- フラッシュLED 4個
- 人感センサ
- 電池ホルダー
組み立て方

D1,D2,D3,D4にフラッシュLEDを取り付けます。リードの長い方が+極です。基板の丸いランドの穴に+極を差し込みます。

LEDをはんだ付けした様子です。丸いランドの方に、長いリードの+極が刺さっていることをよく確認してください。

リードの根本をニッパーでカットします。

これでLEDが1個はんだ付けできました。

同様に+極に気をつけながら、残りの3つのLEDをはんだ付けします。

5mmのLEDをD5にはんだ付けします。このLEDも先ほど同様、長いリードが+極です。+極を丸いランドの穴に差し込みはんだ付けします。

LEDのはんだ付けが完了しました。

人感センサをU1のところにはんだ付けします。

人感センサのリードはとても硬く、普通のニッパーでは切れません。もし強力ニッパがあれば、1ピンずつカットします。強力ニッパがなければ、カットせずにそのままでも構いません。

基板の背面に、バッテリーホルダーをはんだ付けします。基板に対して垂直になるよう、傾きに気をつけてはんだ付けしてください。

バッテリーホルダーをはんだ付けすることで、基板が上の写真のように立てられるようになります。
以上で組み立て完了です。
動作させる

コイン電池をバッテリーホルダーに挿入します。バッテリーホルダーの+と書かれている面が、電池の+極となるように、電池を挿入します。

LEDが点灯します。もし点灯しないLEDがある場合には、極性が間違っている可能性があります。一度取り外して、他のLEDと同じ向きに取り付け直してください。
クリスマスツリーの完成です!!
人感センサを搭載しているので、人の動きを検知してLEDが点灯します。
お好きなところに飾ってください。









コメント