電子工作でよく使われるマイコンにArduinoやPICがあります。
僕は普段ArduinoやRaspberryPiを好んで使っているのですが、多機能&高価なので単純な動作をさせるだけの工作には勿体ないものです。
マイコンに単純な動作をさせるには小さくて安いPICがオススメです。
ということで、単純な用途でマイコンを使いたい今回、数年ぶりにPICを使って工作をしました。
大分忘れている記述がありましたので備忘録として残しておきます。
今回使ったマイコンはこちら「PIC10F222」というもので、8ピンのDIPパッケージのもの(機能があるのは6ピンだけ)です。
このマイコン、内部発振回路を内蔵しているのでオシレーターを繋がずとも上のような基板でモーターやLEDを制御出来ます。プログラムなのでタイマーIC555等を使うより遥かに単純な回路で小さく組め、より複雑な動作をさせることが出来るスグレモノなのです。
電源電圧も2.0V~5.5Vと広範囲なので乾電池2本(3V)〜3本(4.5V)で動作します。
8ビットのアナログ入力もついているので距離センサーやボリュームを繋げることも当然可能!というこのマイコンのお値段はなんと45円!(秋月電子)
Arduinoなんかと比べるとめちゃめちゃ安いです。
回路が小さくなると書きましたが、同じ機能でさらに小さい表面実装の米粒サイズのものもあります↓
これは流石にハンダ付けがしんどいので僕はDIPサイズで充分です。
<日本語データシート >
https://akizukidenshi.com/download/ds/microchip/PIC10F220_222_JP.pdf
何に使ったかというと、余っているモーターと組み合わせて・・・
パナソニックのインターホン「アイホン」の時間延長マシンを作りました。
このインターホン(数世代前のバージョンですが)、外の様子を見ながら来客を待っていたい時などにモニターから外の様子を見ていると1分で切れてしまう(延長するには1分以内に再度モニタースイッチを押すとそこから1分延長)ので長時間外の様子を見ようと思うと何度もボタンを押さなくてはいけないのです。
面倒くさいことは機械にさせるのが得策ですよね。
ということで、完成したのがこちら↓
電池3本が入る筐体は3Dプリンター製です。
ほぼ現場合わせで作ったので適当ですが^^;
本当はインターホンの基板を開けてボタンの配線だけ弄りたかったのですが、インターホンの性質上改造中に来客があったり元を壊してしまうとしばらく困るので妥協して外付けにしました。
実際の動作の様子
備忘録として回路図とプログラムを残しておきます。
回路
単純な回路です。
モーターはDVDドライブのトレーの開閉に使われていた物で詳細不明、FETを使わずとも汎用トランジスタ1815で動いたのでノイズ対策だけしてOKとしました。
PICのプログラム環境は懐かしいWindowsXPにMPLAB IDE v8.92が入っていたのでそれで作りました。
プログラム
内容は単純にモーターを0.5秒動かしてそこから50秒待つ、以降繰り返す。
待ってる間は動作確認用として1秒周期で点滅させるというだけのものです。
#include <pic.h>#include <pic.h>
/***** コンフィギュレーションの設定 ********///file:///C:/Program%20Files/Microchip/xc8/v1.30/docs/chips/10f222.html#pragma config MCLRE = OFF, WDTE = OFF, IOSCFS = 4MHZ, CP = OFF, MCPU = OFF
//CPU4MHz設定(プログラム内delay関数用)#define _XTAL_FREQ 4000000
/*GPIOの役割設定*/
//動作確認用点滅LED#define Led GP0
//モーター制御
#define Motor GP1
//モーターOFF時(特に意味は無い)
#define Wait GP2
// GP3 = インプット専用(使わない)
/*グローバル変数宣言*/
//汎用変数i
unsigned char i = 0;
//カウンター用変数
unsigned char cnt_100ms =0;
/* initial */
void init_com(void){
/*STATUS設定
bit 7:ピン変化によるウェイクアップ(GP0, GP1, GP3) 0:電源投入時リセット 1:ピン変化リセット
bit 6:Non
bit 5:Non
bit 4:タイムアウト 0 WDT 1電源投入
bit 3:パワーダウン 0sleep命令 1電源投入
bit 2:ゼロビット 0算術演算結果が0以外 1結果が0
bit 1:デジットキャリー・ボロー 0キャリー発生なし、ボロー発生あり 1逆
bit 0:キャリー 0 1*/
STATUS =0b00000000;
/** OPTION設定bit 7 :ピン変化によるウェイクアップGP0 GP1 GP3 0有効 1無効
bit 6 :弱プルアップ 0有効 1無効
bit 5 :タイマ0クロックソース 0内部 1T0CKIピン
bit 4 :タイマ0ソースエッジ 0 L->H 1 H->L
bit 3 :プリスケーラ0 タイマ0 1 WDT
bit 2-0 :プリスケーラレート選択 0 1 **/
OPTION = 0b10000000;
//アナログ入力設定(デジタル出力するにもデジタル入力設定が必要)
ADCON0 = 0b00000111; //0 Analog 1 digital
//入出力ポートの設定
TRIS = 0b11111000;//出力:0 入力:1 (GP3は入力のみ)
//ポートの初期化GPIO = 0b00000000;
}
/* wait (0 - 255) *100m secound */
void delay_100ms(unsigned char cnt){
for(cnt_100ms = 0 ;cnt_100ms < cnt; cnt_100ms++){
__delay_ms(100);
}
}
/* メイン */
void main(void){
init_com();
while( 1 ){
Wait = 0;//モーターON
Motor = 1;
delay_100ms( 5 );
//モーターOFF
Motor = 0;
Wait = 1;
for(i = 0; i < 100 ; i++){ //50s//LEDのHI/LOWを入れ替える
Led = !Led;
delay_100ms( 5 );
}
}
}
PICはArduinoと比べると初期設定やピンの機能は少しややこしいのですが、そこさえクリアすればArduinoより遥かに安く作品を小さく作り上げる事が出来るのが強みです。