最近の我が息子は、変形合体する変な踏切のYouTubeにハマり、真新しい鉛筆3本持って
自分で「ウィーン、ガッシャン、ガッシャーン」と言いながら一人遊びをしています。
最近おもちゃを作る機会がなくて買うことばかりで、久々に自己満のためにも何か作ろうと思い立ち、ミニカーを買い始めて少しずつ興味が湧いてきているので、おもちゃの信号機を製作してみました。
1. 製作構想
決めければいけない要件は以下3点
- 信号機のデザイン
- 信号機の青、黄、赤の点灯時間
- 電池の種類
①信号機のデザインですが、一応規格があるようで、それを基にして1/50サイズで設計をしてみました。全長は15cmくらいになります。
②信号の点灯時間は、実際の信号機を参考に決めました。交差点の交通量によって青色の点灯時間は30〜60秒とかなり差があるのですが、黄色は平均3〜4秒程度のようです。
おもちゃの信号機では、30秒も信号が変わらないと飽きそうなので、青と赤は10秒くらい黄色は3秒くらいで設定します。
③電池のサイズによって製作物の大きさに影響があるのですが、電池を小さくすると電池容量も小さくなり遊べる時間も短くなる。ここは実際に回路を組んでから消費電力量を確認しながら設定したいと思います。出来たらCR3032(大体500mAh)が使えればいいけど。
2. 信号機の作図
土台となる信号機は今回も3Dプリンタで製作しますので、Fusion360で作図。
信号機の規定寸法をもとに大体の縮尺で信号機の高さは12cmくらいになりました。
(規定寸法は、こちらを参考にさせていただきました。)
信号機は筒状になっており、ポリウレタン銅線を通して基板とLEDを接続します
3. 信号制御回路
PICを使って制御します。前回12F683を使いましたが、(1)評判よければたくさん作る、(2)すぐ飽きる可能性ありの理由で、比較的安価な10F222を使います。(@170円→@45円)
この10F222はかなり簡素なPICで、GPIOは4つ、PWMなし、タイマー等割り込み処理がないので、初心者に優しめなPICです。
回路図
子どもの目に優しい信号にするためLEDの輝度はだいぶ落としています。
未検証で持論なだけですが、低電流にさせるため輝度高めのLEDを用意し、眩しくないギリギリの電流で点灯させることで低電流を実現してみました。
ブレッドボード上で実測したところ、各LEDの電流は、(緑)0.36mA、(黄/赤)1mAくらいでした。
部品リスト
1個当たりの単価としては、部品だけで300円もかからないくらいでしょうか。
元々コイン電池を使用する想定でしたが、環境配慮型にして充電式の単4電池を使うことにしました。
カテゴリ | 品名 | 個数 | 価格 | メモ |
PIC | 10F222 | 1 | 45 | |
コンデンサ | 積セラ 0.1uF | 1 | 15 | |
LED | 緑)OSPG5161A-RS | 1 | 250 | 10個入 |
黄)OSY5EA5B61A-QR | 1 | 100 | 10個入 | |
赤)OS5RPM5B61A-QR | 1 | 150 | 10個入 | |
抵抗 | 3kΩ | 1 | 1 | |
10kΩ | 2 | 2 | ||
ワイヤー | ポリウレタン銅線0.4mm | 1 | 180 | 10m |
電池ケース | SW付き電池ボックス(単四3本) | 1 | 120 | |
基板 | ユニバーサル基板 | 1 | ? |
4. PICプログラム
10F222では内部クロックが4MHzまたは8MHzしか選択できず、黄色の点灯時間を3秒と基準設定したため、緑と赤のLED点灯は12秒としました。
// PIC10F222 Configuration Bit Settings
// CONFIG
#pragma config IOSCFS = 4MHZ // Internal Oscillator Frequency Select bit (4 MHz)
#pragma config MCPU = OFF // Master Clear Pull-up Enable bit (Pull-up disabled)
#pragma config WDTE = OFF // Watchdog Timer Enable bit (WDT enabled)
#pragma config CP = OFF // Code protection bit (Code protection off)
#pragma config MCLRE = OFF // GP3/MCLR Pin Function Select bit (GP3/MCLR pin function is digital I/O, MCLR internally tied to VDD)
#include <xc.h>
#define _XTAL_FREQ 4000000
void main(void) {
unsigned char Timer3s = 0; // 3秒タイマー
unsigned char Count = 0; // Timer0用カウンター
// Sleep mode timer(スリープ導入時間15min/信号機の1サイクル27sec=33回ループ(スリープ導入実時間14m51s))
unsigned char Sleep_Timer = 33;
OPTION = 0b11000111; //GPWU無効、GPPU無効、プリスケーラー256
OSCCAL = 0;
ADCON0bits.ANS0 = 0; // GP0をデジタル
ADCON0bits.ANS1 = 0; // GP1をデジタル
TRISGPIO = 0; // 0bxxxxx111 GP0-GP2までOutput
// Traffic signal stat
GP0 = 1; // Green
GP1 = 0; // Yellow
GP2 = 0; // Red
TMR0 = 0;
while(1){
if(TMR0 > 118){ // 4us*256*118 = 0.03ms
TMR0 = 0;
Count++;
if(Count >= 100){ // 0.03ms*100 = 3s
Count = 0;
Timer3s++;
}
}
// Green 12s(3s*4) / Yellow 3s(3s*1) / Red 12s(3s*4)
// case 0-3: Green, 4:Yellow, 5-8:Red
switch(Timer3s){
case 0: // Green
GP2 = 0;
GP0 = 1;
break;
case 4: // Yellow
GP0 = 0;
GP1 = 1;
break;
case 5: // Red
GP1 = 0;
GP2 = 1;
break;
case 9: // Timer3s カウンタークリア
Timer3s = 0;
Sleep_Timer--;
break;
}
if(Sleep_Timer < 0){
GP2 = 0;
asm("Sleep");
}
}
return;
}
PICKIT4+Macで書き込みを行ったのですが、なぜかmacでは書き直しが出来ず、Winで書き直ししなければならない状態になりました。
もし原因がわかる方いらっしゃいましたらコメントください。
5. 組み立て
基板を収める土台となるケースとしては、あえて自作せず、単四x3の電池ケースを使いました。
電池の接点金具をバラして、真ん中に基板を配置するように設置し直しています。
また信号機の柱を中央に持ってきたかったのも理由の一つです。
電池ボックスと信号機の軸留めとして、4mmのハトメ(レザクラで使ってたもの)を使い、瞬間接着剤で固定しました。
で、完成形としてこんな感じになり、
結局3本作らされました。
コメント