2010年01月
毎回ブレッドボード上でテストするのも大変だし、
LCDユニットとかブレッドボードじゃめんどくさいし、
クロック内蔵してないPICではセラロックとかうかつに配線できないし。
というわけで評価ボードのようなものを作ることにしました。
各種PICをずらして差し込むと使えるというのが理想でしたが、ピン配置が違いすぎるのと基板面積があんまりない(この前のLEDライトで余ったのを使う)ため、28ピンPIC(PIC16F873A, 876A, 16F886)をターゲットに絞って作りました。

各ピンの出力確認用にLEDと、汎用入力用にチャタリング除去付きのスライドスイッチ付き。512KbitのI2C EEPROMも搭載。もちろんプルアップ抵抗はジャンパで切り離し可能。
液晶ユニットも必要なら右端からはみ出る形で取り付け可能。コントラスト調整VR付き。秋月で売ってるものは電源ピンが2パターンあるので、それもジャンパ差し替えで対応可能。R/W信号線を使わない場合に、そのピンだけLCDから浮かせる事も可能。
ICSP端子はスライドスイッチで切り離し可能。
自分が思いつく限りのものは入れてみました。
チャタリング除去のところの表面実装74HC14に無理矢理線を通したのがちょっとやり過ぎ感…。
とりあえずエッチングしてみました。
まあ大丈夫っぽいけどー…
やはり無理矢理線を7本通したところが気になる。
むむむむ・・・

どうみてもショートしています。本当にありがとうございました。
というか、後で見てみたら、この真ん中通ってる線だけ太かったです。(両脇は0.008inch, 真ん中は 0.01inch)
設計ミスじゃん…。
仕方ないのでプラカッターでしこしこ削る。
んー。
いいんじゃないのこれ。
むむー?

大丈夫っぽい。
テスターで測ってもショートしてません。よし。
っていうかですね。
前回作ったLEDライトが基板パターンのチェックに最適すぎる。
板が透けるのでパターンのショートとか切れがあったら速攻見つかりそうなくらいよーく見えます。これは良い。
というわけで穴開けてフラックス塗って基板は完成。
部品がないので続きはまた今度な!
これと、最近若松通商で安売りしているリチウムイオンバッテリー。
これを組み合わせて充電式ライトとか作ったら使えるかなー。とか思ってみた。
ただしリチウムイオン電池を市販品みたいにスコスコ出し入れできる機構は自作ではむずかしいので完全内蔵にするのが良いかと思います。
(内部ではコネクタにしとけば交換も可能ですが)
となると、その装置自体に充電機能がついてないといけません。
じゃあスイッチで切り替えて、ONにしたらLED点灯、OFFにしたら充電回路につながって、その状態で電源を供給したら充電されればいいか。
あとはLEDをどう光らせるか。
単純に抵抗入れて光らせてもいいですが、そうすると電圧の変化によって明るさが変わってしまいます。
そうなると定電流駆動ですが…うーむ。
あとはPICで調光とかも考えましたが、回路が複雑になりすぎそうなので断念しました。
というわけで
・LTC4054を使って内蔵リチウムイオン電池を充電
・電源ONにすると秋月1WLED×2個を定電流駆動でアホみたいに明るく
・LEDむき出しだとまぶしすぎ&光束が集中しすぎるので透明アクリル板でディフューザーを作って取り付け
(LED自体もレンズに圧力加えちゃいけない事になってるので保護の意味も)
という感じで!
まずはLEDが発熱するんで買ってきたアルミケースに直接接着します。
前から良くやってる方法ですが…。

ケースに穴あけてー

LEDをつっこむ。
1WのLEDには放熱のためにシリコングリス塗っておきます。
その後、エポキシ接着剤でガチガチに塗り固めました。
真ん中のLEDは充電表示用の赤LEDです。
さらに光を拡散させるためのディフューザー。
乳白色のアクリル板をケースと同サイズに切断したものを5枚用意して…

穴開けて広げます。(1枚足りませんが後から作りました)

これを重ねてのっけていけば、アクリルの塊の中にLEDが埋まっている状態になるというわけ。

回路の方もブレッドボードでいろいろとテスト。
まず最初に考えたのはトランジスタを2個使った定電流回路ですが…
電流検出抵抗の電圧降下が0.6Vもあるので、リチウムイオン電池ではマトモにLEDを光らせる事ができません。(LEDのVfは3.0〜4.0V, typ.3.3V。要するに電源電圧が3.9V切るともう光らない計算)
電流検出抵抗を小さくすればいいんですが、そうなるとオペアンプを使った定電流回路にする必要があります。
LMV358で試してみましたが、リチウムイオンの電源電圧ではオペアンプからの十分な出力電圧が得られず、明るさが中途半端に…。
ていうかRail-to-Railじゃなかったの?
それじゃあ仕方ない、電源を5Vに昇圧…と思ったんですが、350mA流すLEDが2個なので700mA流せることが必要です。HT7750Aだと4個必要ってことに。なにそれこわい。
というわけで考え直しましたが、要はオペアンプの電源だけ5Vになればいいんで、オペアンプの電源だけHT7750で昇圧したものを使う事にしました。
あとは電源電圧が3Vくらいを切ったらLEDを消灯させる仕組みが必要。
定電流回路のために定電圧源が必要…
というわけで
・電源OFF時はバッテリーが充電回路につながる。
・電源ONにするとメイン回路に給電。
・電池の電圧からHT7750Aを使って5Vを作りオペアンプに給電する。
・オペアンプとNチャネルMOSFETで構成した定電流回路でLEDを駆動。LEDは直接電池から給電。
・定電流回路の基準電圧は、電池電圧と、5Vを分圧して作った3V(電池の放電終止電圧)を比較した結果からTL431を通して作成。
ようするに電池電圧が一定以下になると定電流回路が止まり、LEDが消える。
という回路にしようかな!!!
というわけでEAGLEと格闘…
回路図でけた!

定数とかに誤りがありますが、まあ大体こんな回路です(ぉ
オペアンプが3回路必要になったのでLMV324を使う事にしました。
電流検知抵抗は0.1Ωですが、0.1Ωの表面実装がなかったので泣く泣くアキシャルリードの酸金2W抵抗に。でかすぎ。
鈴商には1Ω以下もあったんだけど、もう他の定数決めちゃってたから今更変えられなかったんだよー…。
50KΩも買い忘れたので泣く泣くカーボン抵抗100KΩを2個並列に。また基板面積が…。
他は可能な限り表面実装部品を使うようにしました。電解コンデンサと半固定抵抗は初めて使ってみた。
あとは基板パターンをしこしこ作成して…

Topレイヤーに配線引いてますが、これは両面基板にするんじゃなくて片面で無理っぽかったので表にジャンパ飛ばすことにした部分です…。
両面にもチャレンジしてみたいけど…やっぱちょっと無理くさいよなー…。
あとはいつも通りですが。
フィルム印刷。
感光・現像。
エッチング。
穴あけて余計な所切って完成。
実はこの時点で1時50分(ぉ
次の日が会社の停電作業だからどうしても完成させたかったのです。
(停電なので一晩中真っ暗。)
続いて部品の取り付け。
で、見てみたらLMV324がやばい。
足ピッチ0.65mmです。
0.65は今までにFT232RLを付けたのが一度だけかな。
慎重に取り付けます…。手がプルプルする。ジアゼパムが欲しい(ぉ
念のためルーペでハンダブリッジがないか確認…
大丈夫なようです。
あとは他の部品もガシガシ取り付け。
一通りついったー!
なんかあれですね。電解コンデンサが立ってると一気に雰囲気が集積回路って感じに(ぉ
ケースに入れてみましょう。
…。
コネクターが物理的に差し込めねえ!!!!
アホですね自分。
仕方ないので電池以外は直接線を半田付けです…泣ける。
ちなみに電池は2個並列にしました。2200mAh。
3個は物理的に入らなかった…。
中は線がグネングネンです。
が、むりやり押し込んで完成!(ぉ
OFF状態。電源いれると
ビカーッ!!!
直視すると目がイカレるレベル。でも写真だとよくわからんですね(ぉ
というわけで完成しました。おわり。
※ 後日談
リチウムイオン電池の+極にどうしてもハンダが乗らず苦労していたのですが、Wikipedia見たら+極のタブにはアルミ、−極にはニッケルを使うものらしいです。
そりゃアルミじゃ付かないわな…。
というわけで、アルミハンダで付け直しました…ということにしたかったのですが380℃くらいの温度で付けるもののようで、しかもクソ高いため断念。
圧着端子を使って止めました。なかなか具合はよいです。
ニコ動にうpしました。
次は何やろうかな!
まとめておこうかなー。と。
何が混乱するかってキャリーフラグです。
Z80ではJZとかJGとかJLとか命令が覚えやすかったからいいんですが、PICはBTFSC STATUS, Cとかキャリーフラグがどうなるか把握してないと書けないような命令しかないので…。
なので把握しとけって事ですね、分かります。
最大のミソは、減算命令が減算するというよりWレジスタの2の補数を加算する命令だってことですよね。
(他のCPUも同じですが、なんというかPICはモロにそのまんまというイメージ)
というわけでまとめを書いてみますが…書くのが楽なのでSUBLWで。
SUBLW k
Wの2の補数にkを加算してWに格納する
W=(-W)+k=k-W (W-k じゃないよ)
影響フラグ:
C:桁あふれが発生したら立つ
DC:下位4ビットから桁あふれが発生すると立つ(←使った試しがない)
Z:計算結果が0だと立つ
例:
W=1, k=3 の場合 (3-1)
Wの2の補数=255
k+255=258 (0x102)
桁あふれが発生して結果は2になるので
W=2, C=1, Z=0
W=3, f=1 の場合 (1-3)
Wの2の補数=253
f+253=254 (0xfe, -2)
桁あふれは発生していないので
W=254(-2), C=0, Z=0
W=2, f=2 の場合 (2-2)
Wの2の補数=254
f+254=256 (0x100, 0)
桁あふれが発生するので
W=0, C=1, Z=1
というわけで…。
引き算だと考えると一見ボローが発生していない状況でCフラグが立つ。
というのがわかりにくいんだよー。
SUBWF もリテラルがFに置き換わるだけで同じ。
よく使うのは、やっぱりFレジスタの内容を加算していって、それがある一定の値を超えたかどうかの判定でしょうか。
CLRF COUNTER
LOOP1
MOVLW 30
SUBWF COUNTER, W
BTFSC STATUS, C
GOTO EXIT
INCF COUNTER, F
GOTO LOOP1
EXIT
たとえばこんなやつですね。
4行目のSUBWFではカウンタ値から30を引くわけです。
カウンタ値が小さいうちはボローが発生するのでCフラグが立ちません。(ここが感覚的に逆)
カウンタ値が30になるとZフラグとCフラグが立ちます。
ので、ラベルEXITへジャンプします。
引き算の結果がマイナスになるときだけはキャリーフラグがクリアになる
ってことでいいのかな。うん。それが一番覚え易いw
ホームページはこちら。
http://www31.ocn.ne.jp/~yoshio2/
2ちゃん系掲示板に書き込むときのトリップは ◆GBrDo4K0i. を使用しています。
ヨシヲ