こんにちは。

さて今回は。
特にメカニカル運用のときに力を発揮するであろう。
「オームメーター」を。
作っていきたいと思います。

・・・まあ大変で、まだ途中もいいとこなのですが。
とりあえず今は、こんな感じです。
 DSC_0855

ご注意!:
 オイラは、「C言語」も、「組み込みプログラム」も、初チャレンジです!。
 Webの情報を適当に漁りながら、行き当たりばったりで作ってます!。
 ので、多分邪道なやりくちをしまくってます!。



さて。

キッカケは、「電池の内部抵抗測りたい」からでした。

こんなステキなブツを見つけて。
module1

お?これ使えば、割りと楽しいことできるんでない?と。

勢いでこんなんとか。
module2

こんなのをご購入。
module3
 
・・・ディスプレイはまあ、電子タバコ的には、「Evic-VTCのアレ」です。
2色に分かれてますが、青い方は「DNA40とかのスモールスクリーンのあの色」です。

まあまず、大まかにブロック図を書き下してみて。
DSC_0827

部材発注、まあ、昨今の流通事情は大変宜しいので。
さくっと到着。
DSC03081

全部でこんなもんです、部品代だけで1万を軽くオーバー!。
DSC03082

今回のキモ、バッテリー内部抵抗計です。
DSC03083
I2C ( 12KHz以下 )制御、交流4線方式の絶縁式の抵抗計です。
誤差はありますが、解像度は実に10μΩ!。
そして直流電荷が掛かっていても測れる、交流絶縁仕様です。 
ステキ!、そしてお値段もステキ!、送料入れると9000円弱!。

制御部分、今回は何となく、Arduino(の互換基板) を使うことにしてみまあした。
DSC03085

ディスプレイ、まあ小さいけど、制御線の少なさとグラフィック液晶使ってみたかったので・・・。
DSC03084

PC用I/Fとかを用意して、ハンダづけ、と。
DSC03086

ブレッドボードにマウントして、準備完了。
DSC03087

ソフトは、ArduinoのIDEを使います、フリーだし!。
arduino1

まあそのまま、C言語を書いていく感じで。
arduino2

まずはディスプレイ制御。

今回使用するディスプレイは、I2C接続です。
I2Cとは、線2本だけで、また「トランジスタを使ったプルダウン」のみで複数のデバイスを繋ぐことが出来る、組み込み用の通信規格です。
制御用の小さなコントローラーが必要ですが、配線を圧縮できるので、あちこちに多用されてます。
身近なとこだと、、、PCのディスプレイ繋ぐと型番とか解像度とか出る、アノ機能用、とかね。

ネットに転がってたやり口を持ってきて、サクッとコンパイル、無事動きました。
DSC03088

次に、抵抗計を繋いでみます。
抵抗計もI2Cなのですが、こいつは絶縁の関係上、低速でしか動作しません。
普通のI2Cは100KHzなのですが、「12KHz以下」という制約があります。
なので、今回は、Arduinoの外部ライブラリを使い、I2Cを2系統生やしてみました。
ライブラリ弄って、Lowspeed作って、ね。
標準の「Wire.h」は、ディスプレイに、外部ライブラリの「SoftI2CMaster.h」は、抵抗計に、ね。
また、アドレスが標準では0番地なので、ジャンパ弄って8番地にしてあります。 
DSC03089

まあ、アドレス問題とかあって苦労したけど。
なんとかデータ返ってくるようになりました。

I2C波形!。
DSC03091

手持ちの抵抗が2Kohmしかなかったので、2Kなプルアップつけてるのですが。
角立ちすぎですね、、、もっと鈍らせないと、本来はあうとー!。
デバイス側、電荷を引っ張りきれてないしね。

I2Cの応答は、シリアルモニタで確認な感じで。
DSC_0844

ここも地味に苦労しました。
デバイスからの戻り値はfloat、浮動小数点表現の4バイトが、1バイトづつ送られてくる仕様。
しかもエンディアンが逆。
普通のC言語と違い、組み込み用C言語は使える関数や表現にクセがあるので、「一般的なやりくち」、つまりsprintfで加工とかがデキなくて。
結局読み込み方向を弄った上、unionという無理やり別の型表現に同じ変数をどうのこうのする機能で乗り切りました。

さて次は、ディスプレイに表示させてみよう的な!。

ディスプレイは、単純に各ピクセルに応じたビット文字列をバイト単位で送るだけ、なのですが。
原点が右下、下から上に8ピクセル分描画したあと、X軸方向に一つ送る、Y軸方向は8分割なページ表現という、なかなか頭が痛い仕様です。

まずお絵かきソフトでビットマップ作って。
suji

ぽちぽちと。
pochi

ビットマップ、bmp形式は非圧縮なので、データがベタで入ってます。
なのでperlで・・・。
perl1

テキストデータに変換。
moji1

それをperlで並び替えて、表示用のデータを作りました。
moji2

まあ、データは。
・ベタな一枚絵。
・32x16ドットな、でっかい数字
・16x8ドットな、ちっこい文字と数字
の3種類を。

最初並び替えの法則が掴みきれなくて・・・。

なんか崩れたイカ文字みたいなの作ったり。
DSC03092

惜しい感じだけど、なんか反転したり。
DSC_0846

 明らかにヘンなメモリを呼び出したりしましたが。
DSC03094

なんとか無事に表示な感じで。
DSC03093

文字は、floatからcharで切り出した後、byteに変換して1もじづつレンダリングする仕様にしてみました。

ちっこい文字も、作ったりして。
moji4

文字の定義はこんな感じ、BYTE直読みでケース分けしてるのですが、判定は10進みたい。
なので、ASCII10進コードで表現してます。
perl2

デカい文字は32x16なので8x8の塊が8つ、に対して、ちっこい文字は16x8なので、8x8の塊が2つ、て感じです。
moji3

あとはお絵かきソフトで当たりを付けた位置に、はめ込んでいくだけ!。
gamendesign
 
無事にはめ込めました。
DSC03095
 
ちっこい文字も、レンダリング出来てるみたいです!。
DSC_0853

ディスプレイ反転時代ではありますが、一応動画だと、こんな感じ。


まあとりあえず。

出来ている部分は、これだけです。

ここから機能的な部分を盛り込んでいきたいとは、思ってるのですが。
出来るかなあ・・・。

以上です!。