舞鶴工業高等専門学校 学芸誌「まひつる」2003年度号より |
PICによるクリスマス・イルミネーション
舞鶴工業高等専門学校 電子制御工学科
町田秀和(machida@maizuru-ct.ac.jp)
1.はじめに
この平成15年度もJABEEや独法化の作業が修羅場を迎えて大変しんどい状況下にありますが、
一方で学生諸君が素晴らしい成果をあげ、爽やかな風を吹き込んでくれました。たとえば
サッカー部の舞鶴選手権優勝や、陸上部の駅伝優勝や、3Eの奥井君の国体優勝、さらに自動車部
のエコラン3位、プロコン奨励賞などなどです。
そして筆者がチーフ顧問をしている電子制御研究会(通称S研)も、NHKロボコンの近畿地区大会
を見事優勝し、全国大会でもベスト8に入りました。このロボット「拍手鶴采」は非常に面白い
凝りに凝った機構があり、またそれを設計製作した確かな技術が息づいていて、我々の原点が
どこにあったのかを思い出させてくれます。国技館での全国大会はやはり独特な雰囲気があり
楽しかったし、支度部屋で各地区の素晴らしいロボットを間近に見られて大変興味深かいものが
ありました。つくづく感じたのは舞鶴高専学生の潜在能力の高さです。地道に取り組んでいる
姿勢には感服しました。きっと独法化以降も立派にやっていけると確かな手応えを得られました。
さて堅い話は置いておいて、本稿では1チップマイコンPICとソリッドステート・リレー
(以下、SSRと略します)を用いて、百円均一ショップで売られている常時点灯式のクリスマス
ツリー用のイルミネーション・ランプを写真1のように好みのパターンで発光させる回路を紹介
します。予算は数千円で、あとはパソコンさえあれば全て自作できてしまいますので、そこの
ところを詳しく紹介しますので、ぜひ1チップマイコンPICを用いた電子工作に挑戦してください。
写真1 クリスマス・イルミネーション・ランプを用いた電光文字板
2.1チップマイコンPIC
マイクロ・コンピュータは電子制御機器の中核として、例えば炊飯器、ミシン、洗濯機、
自動車、などなどに使われています。もはや必要不可欠な存在と言ってよいでしょう。しかし
ながら電子制御工学科でも最近は3年生の「計算機工学1」で初めて触れられるだけで、それも
「基本情報処理技術者試験」で出題されるCASL2/COMET2という仮想のアセンブラ/マイコンを
取り扱っているだけです(今後カリキュラムは改善されていきます)。また、以前は実際にシス
テムを実現するにはCPU(Z80)のほかにメモリ(S-RAM)や並列入出力LSI8255を搭載したワンボード
マイコンを使用していて、とても気軽に使える物ではなく、それなりの値段がしました。
しかし最近になってごく小規模な組み込み用途向けのコントローラ として、8〜40ピンの
1チップ・マイコンが流行しています。例えば、米国Microchip Technology社のPICや、
米国Atmel社のAVRなどです。これらの1チップマイコンは高速(20MHz)、低消費電力(最小30μA)、
十分なメモリ(数キロバイト)、強力な入出力ピン(RS232C,I2Cも可能)、最小の周辺回路、
低価格(320円程度)で、そして開発ツール(ソフトウェア:ほとんどフリー)が豊富でパソコン
で簡単に開発できるところが最大の魅力です。
ということで現実的なマイコン応用の実現手段として、大変人気があります。実際、ロボコン
ではほとんどのチームがPICを用いています。また、ベンチャー企業でも盛んに用いられています。
その理由の一つとしては、PICが大変タフなことが上げられるでしょう。つまり、何度でも手軽に
プログラムが可能なことや、すくそばでトランジスタが破裂してもPIC自体は無事なことなどです。
S研では年度初めに学生どおしで新入部員対象に部内講習会を行い、また例年秋頃には筆者らが
一般市民相手に公開講座を開いています。本校学生の参加も問題ありませんのでお問い合わせて
ください。
PICの開発手順は詳しくは参考文献1)
や2)にありますが、簡単な流れは次の通りです。
- ハードウェア回路を設計制作する。ここでは写真2、図1,2の回路を用いました。
- 開発ツールMPLAB上で、アセンブラもしくはC言語でプログラムを制作する。
- 書込み器をパソコンのシリアルポートに接続し、
参考文献3)のic-progを用いて書込む。
写真2 PICのハードウェア例(実物大)
図1 実体配線図(プリント基板CAD「PCBE」で作成)
図2 全回路図(
参考文献4)Bschによる)←クリックしてください。
写真2の右側がライタ部分(右端のコネクタでPCのシリアルポートに接続)、左側が汎用評価
ボード部分(入力スイッチx3,リセットスイッチx1,出力LEDx2,液晶LCDユニット用コネクタ,
I2Cリアリタムクロック用ソケット付)です。
以上のうち、Cコンパイラのみは有料(25,000円程度)ですが、その他はいっさいフリー
(無料)です。筆者の感想としては、アセンブリ言語はとっつきにくくはありますが、すでに
参考文献2)
などに膨大なプログラム資産があるので、それを参照すれば目的はすぐに達成
できるというところです。一方、C言語プログラムはライブラリ(RS232C,I2C通信やタイマ
など)がそろっているので、高級言語らしく大変楽にプログラミングができますが、なんと
いっても有料であること、そしてやはりアセンブリ言語に対しては非効率なことと、
わずかに予期しない動作をすることがあります。この理由から、ロボコンでは全て
アセンブリ言語で記述しているそうです。
3.ハードウェア(回路)の製作
さて100円ショップには、ときどき面白い出物があります。クリスマス前には、
常時点灯式ですがクリスマス・ツリー用のイルミネーション・ランプが売っていました。
そこでPICマイコンを用いて、好みのパターンで点灯させることを考えましたが問題
はどのように駆動させるかです。このようなAC100Vのスイッチングには、写真3の
ソリッドステート・リレー(SSR)が便利です。
SSRの動作原理は参考文献3)
に詳しい
ですが、要はLEDでトライアック(図2の回路図ではサイリスタになっている)を絶縁駆動
する半導体式のリレーです。筆者は大阪日本橋の有名なジャンク屋さんの「デジット」
で一個350円で買いました。入力はDC28V、出力はAC100Vとなっていますが、
実際は入力は5Vで十分に駆動できます。写真4にハードウェア全景を示します。
写真3 ソリッドステート・リレー
写真4 ハードウェア全景
PICの入力スイッチのうちトグルスイッチ2つ(基板上ではジャンパ)を用いて、
パターン速度を変更できるようにします。SSR回路部分はAC100Vを扱うので、
安全のためにアルミシャーシに組込みました。写真5,6に前面、背面パネルを示します。
PIC部分との接続は液晶(LCD)モジュールのコネクタを使いました。
写真5 SSR部分の前面パネル
写真5のSSR部分の前面パネルの電源スイッチとパイロットランプ、そして、ヒューズホルダと、
ゴム・ブッシュでAC100V入力と、PICからの入力を引き込んでいます。
写真6 SSR部分の背面パネル
4.ソフトウェアの制作
ソフトウェアは簡単にC言語で作成しました。全リストを付録にしめします。
Cコンパイラは参考文献6)
のCCS社のPCMです。注目していただきたいのは、
待ち時間は delay_ms(int)というライブラリ関数で簡単に指定できるところです。
また入出力は、input(ピン名)、port名=出力値で行えます。なおset_tris_b(0);
という文はポートBの入出力方向を指定しています(0が出力、1が入力)。
main()関数は永久ループでパターンを繰り返しているだけですが、
もちろんここは変数を用いてうまい変更式文を用いて記述すれば、
もっと美しくなります。実行結果は写真1のとおりです。
5.おわりに
このクリスマス・イルミネータも工夫すればいろいろと応用ができます。
たとえば、ロボコンのように赤外線リモコンを組み込んで、リモコンスイッチ
にすればかなり実用的でしょう(SSRは
参考文献7)の秋月電子通商の通販にもあります)。
「電子制御」という言葉は狭い意味ではこのようなマイコン組み込みの機器制御
のことを指します。1チップマイコンPICは安価に取り組めて、なにより情報が
充実していますので学生にもピッタリです。身近なテーマから取り組まれる
ことをお勧めします。
参考文献(リンク集)
- 町田、S研:「ものづくりプロジェクト:PIC&AVRによる1チップマイコンの応用技術」
の勉強会(2002/6/20)
- 後閑: 電子工作の実験室
- IC-Prog Prototype Programmer
- 株式会社ジェルシステム、SSRの動作原理
- 岡田:水魚堂オンライン、回路図エディタBsch
- CCS社: PIC用C言語コンパイラ
- SSR通販: 秋月電子通商 (SSRで検索するとよい。1個250円)
付録:PICとSSRによるクリスマス・イルミネータのCプログラム
/////////////////////////////////////
// SSR 4bit illuminatar
// This is an example of SSR control. LED controlled by parallel output.
// The interval is about 0.3sec x coeff. RB4-RB7 to SSR , RA3,RA2:coeff
/////////////////////////////////////
#include <16f84a.h>
#fuses HS,NOWDT,NOPROTECT,PUT
#use delay(clock=20000000)
#byte port_b=6
void wait(int msec)
{
int i=0,j;
if(input(PIN_A2)) bit_set(i,0); if(input(PIN_A3)) bit_set(i,1);
for(j=0;j<=i;j++) delay_ms(msec);
}
main() {
set_tris_b(0); //set all output
while(1){ //endless loop
set_tris_b(0); port_b=0x0f; wait(1000); // oooo
set_tris_b(0); port_b=0xff; wait(1000); // xxxx
set_tris_b(0); port_b=0xef; wait( 700); // xxxo
set_tris_b(0); port_b=0xdf; wait( 700); // xxox
set_tris_b(0); port_b=0xbf; wait( 700); // xoxx
set_tris_b(0); port_b=0x7f; wait( 700); // oxxx
set_tris_b(0); port_b=0xbf; wait( 700); // xoxx
set_tris_b(0); port_b=0xdf; wait( 700); // xxox
set_tris_b(0); port_b=0xef; wait( 700); // xxxo
set_tris_b(0); port_b=0xff; wait(1000); // xxxx
set_tris_b(0); port_b=0x0f; wait(1000); // oooo
set_tris_b(0); port_b=0xff; wait(1000); // xxxx
set_tris_b(0); port_b=0xef; wait( 700); // xxxo
set_tris_b(0); port_b=0xcf; wait( 700); // xxoo
set_tris_b(0); port_b=0x8f; wait( 700); // xooo
set_tris_b(0); port_b=0x0f; wait(1000); // oooo
set_tris_b(0); port_b=0xff; wait(1000); // xxxx
set_tris_b(0); port_b=0x0f; wait(1000); // oooo
set_tris_b(0); port_b=0x0f; wait(1000); // xxxx
}
}
ご意見ご感想はこちらまで!!