タイマー2号機(多機能タイマー)

タイマーの設定というのはとにかく面倒です。設定時刻にON/OFFさせるだけではなくセンサーの状態、例えば「PM6:00にONさせるが部屋の明かりが付いてたときはONしない」などの複合条件でタイマーを動作させたいため、本体に付いているスイッチだけで設定するのには無理があるのです。そこでPCとUSBで接続してパソコン側で設定が出来るものを作ります。USBで接続できれば現在時刻の設定はパソコンの時計と同期するだけで良くなり、わざわざ時刻を入力する必要が無くなります。パソコンの大画面を使用すれば複雑な設定にも対応できます、毎日「AM10:00にONさせたいが、土日はAM11:00にしたい」などの変則的な設定も容易です。


2008-10-01

I/Oはとにかく盛りだくさん。リレー3個。AC100V3回路。SSR3回路。入力は温度、照度、予備に2ポート。そしてもちろんリアルタイムクロックも装備している。停電してもいいようにリアルタイムクロックにはスーパーキャパシタで電源のバックアップもある。複雑なON/OFF条件は1MビットのEEPROMに書き込む。ON,OFFのタイミングは1秒単位で設定可能にする。「1日1回、10秒だけONしたい」という物もあるはずだ。1分では長すぎる。

PICT7997.jpg

OLIMEXに発注する基板のレイアウトが大体決まった

複雑なON条件をどうやって、設定できるようにするか? ちょっと悩んだのでシーケンサーにヒントがないか本を買ってみた。複雑なことをさせるにはANDやOR条件が必要になり、ラダー図エディターのような物が必要になってしまいそう。でも、それは避けたい。

PICT7994.jpg

シーケンサーの本を参考にしてみた

2008-10-27

回路のチェックをしていると大分間違いが見つかる。実験回路なので多少の間違いはかまわないが、何だか次から次へと出てくるのでなかなか基板の発注に至っていない。この回路の主要な外付けICはリアルタイムクロックとMCP23017というI/Oエキスパンダ。Z80の頃からマイコンに慣れ親しんでいる人には当たり前なのかもしれないが割り込みピンはオープンドレインになっている。オープンドレインなのでそのまま繋いでもダメでプルアップ抵抗が必要。複数の周辺ICをワイヤードOR接続するためにオープンドレインになっているのだろう。考えてみると当たり前なのだが、それになかなか気づかないのだ。 .....違うな。単にデータシート見ていないだけだ。

PICT8190.jpg

リアルタイムクロックのINT端子はオープンドレイン

PICT8189.jpg

I/Oエキスパンダ MCP23017 のINT端子(2つある)もオープンドレイン

最初は電気2重層コンデンサーを使用するつもりでいたが、リアルタイムクロックはものすごく消費電力少ないので、1000μFのコンデンサーでもいけるのでは?と思って実験してみた。5V電源を切ってリアルタイムクロックが記憶喪失に陥る1.0Vまで50分近くかかった。都心ではあまり停電しないが、ここ埼玉県ド田舎市では時々停電する。激しい落雷があるとかなり高い確率で停電するのだ。だがそれも1分程度で回復する。50分は十分すぎる数値だ。これを過ぎた場合は再度時刻を教えてあげる必要がある。もちろんパソコンのUSBポートに接続してソフト(自作するんだよ)を起動するだけでよい。

PICT8188.jpg

リアルタイムクロックをコンデンサーで駆動する

2008-11-10

OLIMEXにオーダーするためのレイアウト確定

PICT8246.jpg

レイアウト確定

2008-11-18

OLIMEXに発注をかけた試作基板
ファイル ファイルタイプ 添付ファイルの解説
timer3_proto.zip EAGLE 試作基板の回路図&基板パターン EAGLE Ver4.15用

2008-12-22

使ったことのない素子から動作確認していきます。先ず初めにPIC18F455から。USBとI2Cを同時に使用したいときは秋月電子で売っている物はダメです。USBとI2Cのピンが重なっているのです。このゲテモノPICはMicrochipDirectで購入。

PICT8411.jpg

書き込みテスト

2008-12-27

このPIC18F4455のコンフィグレーションワードは7ワード、つまり14バイトもあります。データシートを見ないとわからないものばかりです。

PICT8463.jpg

mikroBasicのコンフィグレーションワード設定画面。

PICT8459.jpg

LEDを点灯させることすら出来なかったのでブレッドボードで実験。原因はPORTBレジスタではなくTRISレジスタに値を書き込んでいた。こんなミス初心者でもやらない。

2008-12-30

次に使ったことのない素子MCP23017の動作確認。これについては別ページに結果をまとめておいた。

PICT8483.jpg

MCP23017に繋がっているLEDとスイッチ

ちょっとミスがあって入らない部品が... 容量を1000μFから470μに変更した。

PICT8484.jpg

入らない

PICT8486.jpg

裏に飛び出したリードを切るか否かの判断は折れ曲がったときにショートするか否か

半田付け終了

PICT8488.jpg

表面

PICT8489.jpg

裏面 LCDと干渉する部品は裏面に配置

PICT8490.jpg

LCDを取り付けた姿

PICT8492.jpg

横から見た姿 LCDと基板はもう少し接近するが、LCDと基板を結合しているソケットを抜きやすいように少し浮かしてある

2009-01-07

このLCDは文字フォントを内蔵していないのでフォントはPICから送り込む必要があります。フォントはあまり達筆でないSC1602のデータシートからいただきました。

PICT8494.jpg

7×5のFONTを作る

2009-01-08

データを送ってもLCDに何も表示されない。コントラスト調整すら出来ない。データシートにはコントラスト調整に関する怪しげな回路図がある。18番ピンはデータシート上ではVOUTとなっているのだがVOUT=VEEだそうだ。VOUTピンにはマイナス9Vという変な電圧が出ていて、コントラスト調整用のVO(3番ピン)にはGND~VEEまでの電圧を与えてコントラストを調整する。VEEは+5Vだと思って基板を作ってしまったのでパターンをカットして回路を修正。

PICT8496.jpg

ブレッドボードで液晶のコントラストの調整実験

PICT8501.jpg

VEEというのは18番ピンのこと

PICT8499.jpg

パターン修正 いつものことだ

フォントの定義などがあるのでプログラムはかなり巨大になりそう。最終的にはROMを7~8kワード程度食ってしまうだろう。この液晶ディスプレイ用の関数は別ページにまとめておこう。

PICT8504.jpg

表示された

2009-01-14

このLCDの作品例はインターネット上にいくつもあるのだが、LCDの内部バッファを読み出す例が皆無と言っていい。1つだけ読み出しの例を見つけたのだがコードが間違っている。結局データシートだけが頼りだ。書き込みはE信号の立ち下がりで実行される。LCDは無限に速く動作するわけではないのでE信号の立ち下がりから一定時間データ信号(D0~D7)を保持しなければならない、当然、データ信号の最短保持時間がデータシートに記載されている。読み出しも同様にLCDに処理時間が必要になる。「このアドレスのデータを教えてね」という信号を送ってから、「どんなに長くともxxns(ナノセカンド)以内にデータピンにデータを出力するよ」というルールがあるはずだ。この理屈からデータシートのMAX欄に値が入っている項目が読み出し時のLCD処理時間に違いない。実際にMAX欄に値が入っているのはtDDRという項目でE信号の立ち上がり時間が起点となっている。こんなふうに考えていって書き込みはE信号の立ち下がり、読み出しはE信号の立ち上がりで実行されるという結論を得る。

PICT8507.jpg

ロジックアナライザーで読み込みタイミングの検証を行う。確かにE信号の立ち上がりでLCDの内部バッファの読み出しが出来る。

2009-12-11

書き込んだデータの読み出しをすると何故か指定したアドレスの1つ前の物が取れる。0~63までの値を書き込みそれを読み出して下段に書き込んでみた。ずれている....何故こんな変な仕様になっているのだろう。秋月のデータシートの「(7)Read Display Data」はこのLCDの物ではないと思う。別のLCDのデータシートを切り貼りしたように見える。Read Modify Write モードをON/OFFするコマンドは無い。中国や台湾製のデータシートは当てにならないのでもとネタが間違っていたのかも知れない。

PICT1172.jpg

何故か1ピクセルずれる

PICT1175.jpg

この液晶はOEM版があるようだ。BOLYMIN社?のBG12864と同じ。こちらのデータシートはちょっと綺麗。誤植もあるが...