先日、とあるアウトレットモールのガチャガチャコーナーで見つけた、学校のチャイムが鳴るキーホルダー。
衝動的につい回してしまいました。
詳しくはこちらに載ってました。
・カプセルトイ 学校のチャイム
**カプセルトイ情報局様HPより画像引用**
だれもが青春時代に聞いていた、あの学校のチャイムを聞くことができるなつかしのカプセルトイです。
今回はこれをいろいろ改造し、以前電子工作マガジンで製作した、自作のLED時計と組み合わせ、家庭で本物のチャイムとして運用できるようにします。
組み合わせる自作LED時計
以前、電子工作マガジン2021年春号に掲載させていただいた、RTC搭載LED時計に組み合わせます。
詳しい作り方は、ぜひ電子工作マガジン春号をお買い求めください。
・amazon 販売ページ
・電波新聞社HP
この時計はArduinoを使用しているため、今回はArduinoのプログラムを少し変えて、時計にプログラムした時間に、チャイムを鳴らす機能を付けます。
学校のチャイムを分解
まずは、学校のチャイムを分解します。さて、どんな仕組みになっているでしょうか。
裏面にネジ穴が4つ開いていたので、まずは精密ドライバーで開封。
中は、こんな感じです。
思ったよりシンプルな構造になっています。
さすがは、300円のカプセルトイ。かなり簡素な設計でコストを抑えています。
中は、回路基板、スピーカー、電池BOX、磁石、だけしかありません。
基板にはほんとに何も載っていません。
写真右側にある黒い部品が、ICチップです。
これはおそらく小メモリのマイコンチップで、学校のチャイムが録音されており、それを再生するだけのシンプルなプログラムが組まれていると思います。
型番は、204HWCZ04と表記されていますがGoogleで検索してもなにもでてこないため、おそらくは中国の半導体メーカーにソフトウェアを特注で作らせているため、客先固有の型番が刻印されているのだと思います。
真ん中の黒い部品がタクトスイッチです。これは、プラスチックケースのボタンの丁度真下に来るように配置されており、ボタンを押すことでチャイムが作動します。
基板を展開したのが左図です。
写真左側の電池ボックスから電源を真ん中の回路基板に流します。左側の緑色の部品がスピーカーです。スピーカーの性能は、8Ω0.25Wの低電力向けの格安スピーカーです。おそらく原価は20円程度でしょう。
電池は、LR44が二つです。
なので、電源電圧は3Vで動作していることがわかります。
次に、基板を調べて、回路図に起こしました。
バッテリーは3Vで供給。電源に付いているコンデンサCは、パスコンと呼ばれ、電源ラインに乗っかってしまうノイズを除去し、マイコンの誤動作を防ぎます。
今回少し驚いたのが、スイッチがNPN型(押すとGNDに接続)ではなく、PNP型である点です。これは、改造に少し手間がかかりそうです。
また、スピーカーの出力が、片チャンネルではなく、スピーカーの両方の端子がICに直結していることです。
これは、おそらくBTL方式と呼ばれるスピーカーの駆動方式を採用していると思います。詳しくは、今度書こうと思いますが、低い電源電圧でもなるべく大きな音を出したいときによく使われます。この回路も、電源電圧が3Vと非常に低いため、苦肉の策でBTLが使われていると考えます。
学校のチャイムの改造
さて、ここからが本題です。
このチャイムを改造します。
やりたいことは、LED時計のArduinoからのデジタル出力で、チャイムを駆動させることです。
今回ややこしいのは、まず学校のチャイムのスイッチがPNP型であること。
そして、LED時計の電源電圧は、USBからの供給で5Vであり、学校のチャイムの電源電圧3Vと違っている点です。
つまり、LED時計のデジタル出力のHIGH電圧が5Vなのに対し、学校のチャイムのHIGH入力は最大3Vであるため、レベルシフトが必要な点です。
まずは、設計した回路図を示します。
今回は、トランジスタを二つ用いて改造します。
まず、チャイムを鳴らすためには、スイッチの両端を電気的にショートさせる必要があります。
そのために、PNPのトランジスタ(2SA1015)を使いました。トランジスタのベース電圧を2V以下にすることで、エミッターコレクタ間がショートし、ボタンを押したのと同様の状態になります。
また、ベース電圧を2V以下(0V)にするため、下側にNPNのトランジスタを入れます。
このNPNトランジスタをArduinoのデジタル出力によってON/OFFします。ArduinoのHIGH出力は5Vです。
そのため、間に1kΩの抵抗を挟みました。
学校のチャイムを加工する
まず、ケーブルを通す穴をあけます。
その後、トランジスタのりードを曲げ、回路図通りに空中配線していきます。
下記が、変更後のプログラムです。
詳細は割愛します。
#include <DS3232RTC.h>//ライブラリーをインクルード
void setup() {
DDRD = DDRD | B11111100; //D7 6 5 4 3 2 1 0 の入出力設定(1で出力 0で入力)
DDRB = DDRB | B00111111; //D * * 13 12 11 10 9 8の入出力設定(1で出力 0で入力)
DDRC = DDRC | B00000000; //A* * 5 4 3 2 1 0の入出力設定(1で出力 0で入力)
pinMode(A0,INPUT_PULLUP);
pinMode(A1,INPUT_PULLUP); //SW1タクトスイッチの入力設定(内部プルアップ)
pinMode(A3,OUTPUT); //Alartピンの出力設定
}
boolean Number_Array[10][7]={ //Number_Array[数字の数][セグ数]
{1,0,0,0,0,0,0},//0 {g,f,a,b,e,d,c}で入力。1がOFF,0がON(アノードコモンのため)
{1,1,1,0,1,1,0},//1
{0,1,0,0,0,0,1},//2
{0,1,0,0,1,0,0},//3
{0,0,1,0,1,1,0},//4
{0,0,0,1,1,0,0},//5
{0,0,0,1,0,0,0},//6
{1,0,0,0,1,1,0},//7
{0,0,0,0,0,0,0},//8
{0,0,0,0,1,0,0} //9
};
//チャイムを慣らす時刻の設定(1日最大10回)
int alart[10]={
600,
610,
700,
9999,
1900,
2130,
2200,
9999,
9999,
825
};
//LED表示関数を定義
void Number(int x){
int z[]={10,11,12,13,9,8,7}; //{g,f,a,b,e,d,c}で入力
for (int seg=0; seg<=6; seg++){
digitalWrite(z[seg],-Number_Array[x][seg]);
}
}
void loop(){
PORTD |= 0b11111100; //D7 6 5 4 3 2をHIGH(一旦非表示にする)
PORTB |= 0b00111111; //D * * 13 12 11 10 9 8をHIGH(一旦非表示にする)
int com[]={6,5,3,2}; //COMポートを設定{comA,comB,comC,comD}
int y[]={0,0,0,0}; //各桁に表示する数字の変数を宣言{時,時,分,分}
int altime = 0; //アラート時間であることを判定する時間の変数
int al;
tmElements_t tm;
RTC.read(tm);
y[0]= tm.Hour/10;
y[1]= tm.Hour%10;
y[2]= tm.Minute/10;
y[3]= tm.Minute%10;
int dots = tm.Second%2;
digitalWrite(4,dots);
for(int i=0;i<=3;i++){ //ダイナミック点灯のループ
digitalWrite(com[i],LOW); //表示する桁を開ける
int x=y[i]; //その桁で表示する数字をxに代入
Number(x); //xの数字を表示する
delay(3);
digitalWrite(com[i],HIGH); //表示した桁を閉じる
}
if(digitalRead(A0)==LOW){
delay(250);
if(digitalRead(A0)==LOW){
setTime(tm.Hour+1, tm.Minute ,0,0,0,0);//時、分、秒、日、月、年の順で入力
RTC.set(now());//初期設定時間の書き込み
}
}
if(digitalRead(A1)==LOW){
delay(250);
if(digitalRead(A1)==LOW){
setTime(tm.Hour, tm.Minute+1 ,0,0,0,0);//初期設定 時、分、秒、日、月、年の順で入力
RTC.set(now());//初期設定時間の書き込み
}
}
//チャイムを鳴らす判定をするPG
altime = 1000*y[0]+100*y[1]+10*y[2]+y[3]; //現在時刻を4桁の数字にしている
for(int j=0; j <= 10; j++){
if(altime==alart[j]){
digitalWrite(A3,HIGH);
delay(60000);
}else{
digitalWrite(A3,LOW);
}
}
}
実際の動作がこちらです。