こんにちは。
さて今回は。
特にメカニカル運用のときに力を発揮するであろう。
「オームメーター」を。
作っていきたいと思います。
・・・まあ大変で、まだ途中もいいとこなのですが。
とりあえず今は、こんな感じです。

ご注意!:
オイラは、「C言語」も、「組み込みプログラム」も、初チャレンジです!。
Webの情報を適当に漁りながら、行き当たりばったりで作ってます!。
ので、多分邪道なやりくちをしまくってます!。
さて。
キッカケは、「電池の内部抵抗測りたい」からでした。
こんなステキなブツを見つけて。

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

こんなのをご購入。

・・・ディスプレイはまあ、電子タバコ的には、「Evic-VTCのアレ」です。
2色に分かれてますが、青い方は「DNA40とかのスモールスクリーンのあの色」です。
まあまず、大まかにブロック図を書き下してみて。

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

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

今回のキモ、バッテリー内部抵抗計です。

I2C ( 12KHz以下 )制御、交流4線方式の絶縁式の抵抗計です。
誤差はありますが、解像度は実に10μΩ!。
そして直流電荷が掛かっていても測れる、交流絶縁仕様です。
ステキ!、そしてお値段もステキ!、送料入れると9000円弱!。
制御部分、今回は何となく、Arduino(の互換基板) を使うことにしてみまあした。

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

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

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

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

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

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

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

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

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

ここも地味に苦労しました。
デバイスからの戻り値はfloat、浮動小数点表現の4バイトが、1バイトづつ送られてくる仕様。
しかもエンディアンが逆。
普通のC言語と違い、組み込み用C言語は使える関数や表現にクセがあるので、「一般的なやりくち」、つまりsprintfで加工とかがデキなくて。
結局読み込み方向を弄った上、unionという無理やり別の型表現に同じ変数をどうのこうのする機能で乗り切りました。
さて次は、ディスプレイに表示させてみよう的な!。
ディスプレイは、単純に各ピクセルに応じたビット文字列をバイト単位で送るだけ、なのですが。
原点が右下、下から上に8ピクセル分描画したあと、X軸方向に一つ送る、Y軸方向は8分割なページ表現という、なかなか頭が痛い仕様です。
まずお絵かきソフトでビットマップ作って。

ぽちぽちと。

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

テキストデータに変換。

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

まあ、データは。
・ベタな一枚絵。
・32x16ドットな、でっかい数字
・16x8ドットな、ちっこい文字と数字
の3種類を。
最初並び替えの法則が掴みきれなくて・・・。
なんか崩れたイカ文字みたいなの作ったり。

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

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

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

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

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

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

あとはお絵かきソフトで当たりを付けた位置に、はめ込んでいくだけ!。

無事にはめ込めました。

ちっこい文字も、レンダリング出来てるみたいです!。

ディスプレイ反転時代ではありますが、一応動画だと、こんな感じ。
まあとりあえず。
出来ている部分は、これだけです。
ここから機能的な部分を盛り込んでいきたいとは、思ってるのですが。
出来るかなあ・・・。
以上です!。
さて今回は。
特にメカニカル運用のときに力を発揮するであろう。
「オームメーター」を。
作っていきたいと思います。
・・・まあ大変で、まだ途中もいいとこなのですが。
とりあえず今は、こんな感じです。

ご注意!:
オイラは、「C言語」も、「組み込みプログラム」も、初チャレンジです!。
Webの情報を適当に漁りながら、行き当たりばったりで作ってます!。
ので、多分邪道なやりくちをしまくってます!。
さて。
キッカケは、「電池の内部抵抗測りたい」からでした。
こんなステキなブツを見つけて。

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

こんなのをご購入。

・・・ディスプレイはまあ、電子タバコ的には、「Evic-VTCのアレ」です。
2色に分かれてますが、青い方は「DNA40とかのスモールスクリーンのあの色」です。
まあまず、大まかにブロック図を書き下してみて。

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

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

今回のキモ、バッテリー内部抵抗計です。

I2C ( 12KHz以下 )制御、交流4線方式の絶縁式の抵抗計です。
誤差はありますが、解像度は実に10μΩ!。
そして直流電荷が掛かっていても測れる、交流絶縁仕様です。
ステキ!、そしてお値段もステキ!、送料入れると9000円弱!。
制御部分、今回は何となく、Arduino(の互換基板) を使うことにしてみまあした。

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

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

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

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

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

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

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

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

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

ここも地味に苦労しました。
デバイスからの戻り値はfloat、浮動小数点表現の4バイトが、1バイトづつ送られてくる仕様。
しかもエンディアンが逆。
普通のC言語と違い、組み込み用C言語は使える関数や表現にクセがあるので、「一般的なやりくち」、つまりsprintfで加工とかがデキなくて。
結局読み込み方向を弄った上、unionという無理やり別の型表現に同じ変数をどうのこうのする機能で乗り切りました。
さて次は、ディスプレイに表示させてみよう的な!。
ディスプレイは、単純に各ピクセルに応じたビット文字列をバイト単位で送るだけ、なのですが。
原点が右下、下から上に8ピクセル分描画したあと、X軸方向に一つ送る、Y軸方向は8分割なページ表現という、なかなか頭が痛い仕様です。
まずお絵かきソフトでビットマップ作って。

ぽちぽちと。

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

テキストデータに変換。

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

まあ、データは。
・ベタな一枚絵。
・32x16ドットな、でっかい数字
・16x8ドットな、ちっこい文字と数字
の3種類を。
最初並び替えの法則が掴みきれなくて・・・。
なんか崩れたイカ文字みたいなの作ったり。

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

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

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

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

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

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

あとはお絵かきソフトで当たりを付けた位置に、はめ込んでいくだけ!。

無事にはめ込めました。

ちっこい文字も、レンダリング出来てるみたいです!。

ディスプレイ反転時代ではありますが、一応動画だと、こんな感じ。
まあとりあえず。
出来ている部分は、これだけです。
ここから機能的な部分を盛り込んでいきたいとは、思ってるのですが。
出来るかなあ・・・。
以上です!。