Hobby Electronics with PIC

P  I  C  で  イ  ン  テ  リ  ア  電  子  工  作

PIC (Programable interface controller)  を使ったやさしい電子回路と簡単な応用集です。
比較的取っつきやすい "C言語" を主に使い、コンパイラはフリーで使える "MikroC" です。

数ヶ月前に趣味としての小規模な太陽光発電に興味を持ち、発電した電気を何に使ったら面白いかと考え、何か作るには電気工学を少しくらいはかじっておかなければな〜、と思うようになりました。
簡単な入門用の電子工作をやりつつ、ネットで色々調べているうちに PIC にハマリました。(よって太陽光発電からはしばら離れます。)
電子工作というと、たいていテクニカルな方向へ行きますが、私の場合はインテリア、雑貨などが好きですので、なるべく視聴覚にダイレクトに訴える作品を作っていこうと思います。
素人ですが、実際にやってみて面白かったものだけを選んで掲載しています。

※このサイトのフォントサイズは固定していません。ブラウザで最適なサイズにしてご覧ください。
※このサイトに掲載の回路、プログラムの安全性は保証しません。使用する場合は、自己責任でお願いします。
INDEX
 温度センサ-LM35Dと7セグLEDを使った温度記録計・・・PIC16F88
 グリーティングカードを使ったインテリア照明・・・PIC16F628A
 MikroCの関数 Sound_Play と Rand の実験・・・PIC16F628A
 A/D変換を使った音の遊び (擬似テルミン?) ・・・PIC16F88

・・・・・
・・・・
・・・
・・

温度センサ-LM35Dと7セグLEDを使った温度記録計・・・PIC16F88

特徴
PIC16F88のAD変換機能と7セグLEDを試すために温度計を作りました。 単に現在温度表示では面白くないので、
時系列に沿って温度を記録し、プッシュボタンにより現在温度以外に4つの表示モードを選択できるようにしました。

通常状態・・・現在の気温を表示

     上のプッシュSWを押す・・・過去24時間の最高、最低気温を表示

     上のプッシュSWを長く押す・・・24時間前から現在までの1時間毎の気温を順に表示
     
     下のプッシュSWを押す・・・24時間前の気温を表示

     下のプッシュSWを長く押す・・・10日前から1日前までの最高、最低気温を順に表示

洗面所に設置して見ると赤色LEDは液晶と違い、とても見やすく実用的な温度計です。

工作の要点
ユニバーサル基板上に作っているとそれなりに複雑な配線になってしまいました。

ケースの外寸(mm)は75 x 125 x 40 ですが、ACアダプター使用ですので、うまくすれば半分のサイズの箱に収められると思います。素人なので、スペースに余裕がないと、工作上何かとミスを犯しがちなので、あえて大きな箱を選んでいます。失敗といえば、7セグLED用の四角い穴が雑になってしまったことです。箱は壁紙にあわせて白に塗装し、パソコンで印刷した透明フィルムを貼っています。
試験運転中に、摂氏32度以上になると誤動作するようになっていたため、三端子レギュレータに放熱板、ケースに放熱用の穴を開けてましたが、誤動作の原因はプログラムのデータ型宣言にあることがわかったので、たぶんどちらも必要なかったと思います。


プログラムの説明
7セグLED点灯のための
・・・ダイナミック点灯制御・・・温度センサーからの電圧のA/D変換データ配列の3つのポイントをクリアする必要があり、素人の私としてはと結構大変でした。

ソースファイル はこちら


・・・・・
・・・・
・・・
・・

グリーティングカードを使ったインテリア照明・・・PIC16F628A



特徴
開くと折込部分が飛び出す二つ折りのグリーティングカードを使ったムーディーライト。
廊下など暗いところに常夜灯として使うと、ボーっとゆっくり点滅する様がとても優しい感じでリラックスさせてくれます。なにかミニチュアを置いてみるとなお面白いと思います。あまり暗くすると常夜灯の意味は薄れますが、より暗く、点滅をゆっくりにするほどいい感じになります!


仕様
単三電池(1.5V)3本で動作します。(1.2V3本でも可)
明るいときは(sleep)省電力モードで動作(点滅せず休憩中)します。
プッシュボタン、又は暗くなることにより通常動作モードに入ります。
さらにプッシュボタンを押すことにより10種の点滅パターンが選べます。
照明用のLEDは階段の上に吊り下げ灯白1個(3mm)、階段の下に白2個(5mm)、赤2個(5mm)、床台の下に青1個(5mm)、緑1個(5mm)。
点滅パターンインジケータ用LEDは黄色(3mm)です。

回路の要点

PIC16F628Aを使います。
LED(白、赤)、バッテリー以外のすべてのパーツはユニバーサル基板にハンダ付けします。
RB7のCdsついて
明暗によって動作モードを切り替えるためにRB7に接続したCdsで明るさをチェックします。明暗の閾値(しきいち)を変えるには抵抗R2の値を調節します。ここでは3.3Mにししましたが、これは閾値をかなり暗い状態に設定しています。R2を小さくすると閾値は明るい方に移動します。
RB7の入力がLowになるとPORTB割り込みにより、省電力モード(sleep)から復帰します。Highになると省電力モードに入ります。
PORTB割り込みはRB4:7に限定されます。

RB3の出力について
RB3からのPWM出力をトランジスタ2SC1815のベース電流とすることによりRB1:2、RB4:6、RA0:1 のすべての照明用LEDの電流を制御します。
PWM出力はRB3に限定されます。

RB0のプッシュスイッチについて
このスイッチにより 「RB0/INT割り込み」(外部入力割り込み) をスリープからの復帰、および点滅パターンの選択を行います。
この割り込みはRB0からの入力に限定されます。

工作の要点

・紙のグリーティングカードでは心もとないのでベニヤ板で構造体を作ってカードを両面テープで留めています。床板可動式にして、持ち上げてスイッチ操作等を行います。
・吊り下げランプは雰囲気を出すためにスチールのワッシャーを使い白熱電灯風に演出しレトロな感じを出しています。
LEDは白2個(5mm)、赤2個(5mm)を床板に固定、基板に青1個(5mm)、緑1個(5mm)、黄色1個(3mm)。

・バッテリー、基板は70mmX100mmの板に固定しました。完成時のサイズは幅160mm、奥行き115mm、高さ133mm


プログラムの説明

割り込みを二種類使っていますので、それなりに試行錯誤の末に完成しました。点灯パターンの変更は簡単です。お好みのものに書き換えてお使いください。
ソースファイル はこちら
PWMについてはPIC16系の持つ10ビット(1024)分解能を活用するために下記のサイトを参考にし、関数を使わせていただきました。
PICとMikroC

点滅パターンNo. 点滅の仕方

No. 1 速い点滅(白X2)Upper Light
No. 2 速い点滅(赤X2)Upper Light
No. 3 ゆっくり点滅(白X2) Upper Light
No. 4 ゆっくり点滅(赤X2) Upper Light
No. 5 ゆっくり点滅(白小X1)天井灯
No. 6 暗くゆっくり点滅(白小X1)天井灯
No. 7 ゆっくり点滅(白X1,緑x1) Upper & Lower Light 
No. 8 ゆっくり点滅(白X1,青x1) Upper & Lower Light 
No. 9 暗くゆっくり点滅(白X1)Upper Light
No. 10 非常に暗くゆっくり点滅(白X1)Upper Light
  



・・・・・
・・・・
・・・
・・

MikroCの関数 Sound_Play と Rand の実験・・・PIC16F628A

MikroCのライブラリにサウンドと乱数の関数を見つけましたので、早速実験してみました。
関数が用意されていると、即、次のステップ(簡単な応用)に進めるので楽です。
今後の作品にすぐに使えそうな音をいくつか作りました。
関数の説明

void
Sound_Init(unsigned short *port, unsigned short pin);
サウンドを出すポートを設定します。
[例] 
Sound_Init(&PORTB, 7);
RB7をサウンド用に設定します。

void Sound_Play(unsigned short period_div_10, unsigned num_of_periods);
[例]
Sound_Play(100, 150);は100X10usの波長の音を波長X150の長さで鳴らす。

int rand(void);
0から32,767までの乱数を発生します。毎回常に同じシーケンスで乱数が作られます。毎回違う乱数を作るにはSrand という別の関数が用意されています。

回路の要点
RB7に圧電スピーカーをつなげるだけです。LEDはメインプログラムの始まりに点灯させてスタートの合図とするためのものです。
プログラムの説明
1オクターブのドレミファソラシドの音階と、効果音のサンプルを作ってみました。
音階は理論値で設定するとどうしてもかなり音痴気味になりますので、実験値で補正してあります。絶対音に基づかない相対的な音階ですので”ラ”の音は440HZにはなっていません。理論値と実際値のデータはこちら。

効果音はサウンド関数の引数をfor文で音程のみを変えて(長さは変えずに)制御することにより色々な効果を得ることができました。また、ランダム関数も音程の変調に使っています。
ソースファイル はこちら




・・・・・
・・・・
・・・
・・

A/D変換を使った音の遊び (擬似テルミン?) ・・・PIC16F88

明るさの変化により音の高さをコントロールする実験です。
Cdsの上に手をかざし影を作ることにより音程をダイナミックに変化させます。レッドツェッペリン等で有名な伝説的楽器 テルミンのように手で装置に触れることなく操れるのが特徴です。
”明るさの変化” というアナログデータを → ”抵抗値の変化” → ”電圧の変化” に変えて入力し
、PICのアナログ→デジタル変換機能を使って数値化(0から1023)します。
従いましてA/D変換機能の付いているPIC16F88を使います。

この方法で、アナログ入力部品(ここではCds) と出力部品(ここではスピーカー)をかえることにより色々な小物おもちゃを作ることができると思います。
関数の説明

unsigned Adc_Read(unsigned short channel);
[例] x = ADC_Read(1); //RA1値をアナログデジタル変換(0~1023)して変数に代入する。
回路の要点
Sound_Playの実験で使った回路にCdsを付け加えたものです。アナログ入力はRA1、基準電圧はRA3です。

※ 回路図のPICのピンダイヤグラムは16F628のものを流用していますので正しくない箇所があります。2ピンは正しくはRA3/AN3/VREF+/C1OUT です。


プログラムの説明
明るさ変化によるCdsの抵抗値変化を電圧変化にしてアナログポートRA1に入力します。一方RA3に基準電圧を入力します(この場合は電源電圧と同じ)
。A/D変換の関数 Adc_Read により明るさに応じた0〜1023(10ビットの数)の値を得ることができますので、これをSound_Play関数のパラメータとすることにより音程の変化を作り出します。この回路とプログラムでは明るさ(入力電圧)と音の波長は比例します。したがって明るいほど低い音になります。

ソースファイル はこちら




メール


 今までに使った参考書
以下、勉強になりましたが MicroC は出てきません。
・・・C言語によるPICプログラミング入門  技術評論社
・・・電子工作の素  技術評論社
・・・やさしいPICマイコン プログラミング&電子工作  秀和システム

今までにお世話になったサイト

 インテリア雑貨を調達しています。変わった面白いものが見つかります。

MikroCについての情報はあまり多くないので、下記のサイトにはお世話になりました。
PicとMikroC
久世に訊け!!2007


無料検索サイト