ESP-WROOM-02(Deep-Sleep) + Si7021 + OPiPC2 + 18650

ESP-WROOM-02を測定時間以外はDeep-Sleepさせる。
Wi-Fiとの接続待ちも含めて25秒程度の観測時間、約1分Deep-Sleepする、というセットを繰り返した。
センサーはSi7021を使ってWi-FiでOPiPC2上のサーバにデータを投げる。
電源はダイソー・モバイルバッテリーから取った18650だ。
これでどれくらいの時間駆動できるかテストしてみた。
電源電圧の変化の様子

観測結果全体

肝心の駆動時間
このサイトを使わせていただいた(https://www.calc-site.com/times/calc_elapsed_time)

3日半。
これくらいならバッテリー交換も苦ではないか。
ただ、調べた限りでは、強制吸気ファンつきの観測装置が主流のようなので、その場合はファンの分の消費電源も考慮する必要がある。

ESP-WROOM-02(Deep-Sleep) + Si7021 + OPiPC2 + 18650 + Fan




ESP-WROOM-02 + Si7021(SHT21 HTU21 GY-21) + Orange Pi PC2

BME280モジュールは実践投入して久しい
気圧はどこで測定しても同じだろうから、温度と湿度だけのセンサーでいいやと思って、Si7021の載ったSHT21 HTU21 GY-21 などどシルク印刷のあるセンサー・モジュール(以後SHT21)を買ってあった。
だいぶ放置していたが、やっと使ってみることにしたのでその覚書き。

ESP-WROOM-02+SSD1306+BME280で使っている外注基板がまだ余っているのでこれを流用する。
BME280モジュールSHT21はピン配列が同じなのでそのまま基板に取り付けて使うことができる。

バッテリー駆動で野外で使おうと思うので、とりあえず表示装置は無しにしてある。

ここのスケッチを参考にさせていただいた。
http://www.esp8266learning.com/esp8266-si7021-temperature-sensor-example.php#codesyntax_1
基板を作るときにI2Cの端子が逆になっていて、その設定がうまくいかないせいか、AdafluitのサンプルやSparkFunのサンプルはうまく動かなかった。
上のコードでは、Wire.begin();をWire.begin(5, 4);とするだけで測定値が表示された。
AdafluitやSparkFunのサンプルではこれがどこにあるのか、どこで設定しているのか探せなかった。
このスケッチに、BME280の基板で使っているサーバー用のデータ転送処理を加えて、すぐにOrange Pi PC2上のサーバーにデータを送ることができた。

左から順に、時刻、気温、湿度、電圧のADC値の順だ。
もっとてこずるかと思ったが、以前書いたコードをコピペするだけでほぼそのまま動いた。

関連ソフトウェア一式を売り出してみた。
https://neo-sahara.booth.pm/items/1924398




PIC32MM0064GPL028 + SSD1306(GM009605) で表示させるアニメーションの準備

PIC32MM0064GPL028 + SSD1306(GM009605) でアニメーションを表示させて遊んでいる。
PIC32MM0064GPL028 + SSD1306(GM009605)
Blenderで用意したたとえばこんなアニメーションを表示させたい。

基本はパラパラ漫画の要領なので以下の手順だ。
1.画像はBlenderでレンダリングする。
2.XnViewでリサイズする。
3.ImageConverter (Mono)でCのデータ・ファイルに変換する。
ちなみに上の動画は、AviUtlに読み込んで動画にしたものだ。
LCDではピクセル数が格段に少ないので、もっとギザギザな残念な動画にはなる。
それでも絵が動くと妙に楽しい。
楽しいが、LCD用の画像の準備となると上の3の段階が1枚ずつ手作業なので非常に煩雑だ。
この例では30枚なので30回同じことの繰り返しは結構面倒くさい。
2の手順のときに2値化もして、ついでにBMPファイルに変換してしまったらどうだろう。
そのままバイナリ・データを読みだしてCのデータ・ファイルに変換できるんじゃないの?
と考えた。
この段階で分かっていて(思い込んでて)考慮したことは以下の2点。
1.ヘッダの部分だけ読み飛ばせばそのままHEXとして出力すればいい。
2.画像は上下の順が逆になってファイルに書かれている。
VB6でコマンド・ライン用の実行ファイルを作り、ファイル名に合わせてバッチ・ファイルを書いて実行した。
[crayon-6717455979ca6235176233/]

3に書いたサイトでちまちまやると結構の時間と手間だが、これならものの数秒で30枚の処理が済む。

MPLABX側でのファイル名に合わせてあるので、そのままファイルを上書きしてビルドして実行するとこうなる。

データの配列が何か間違ってるんだな。
で、思いつくところでLCDの設定の以下を変更した。
[crayon-6717455979cad187919802/]
すると今度はこうなる。

明らかに90°回転してしまっている。
なので、XnViewで加工する際に90°回転も加えてみる。
するとこうなる。

これでImageConverter (Mono)で変換した時の結果と全く同じアニメーション用のデータが手軽に短時間で用意できたことになる。
現状の分かる範囲での最速の設定にするために、i2c_master.hで以下
[crayon-6717455979cb1106580666/]
を書き換えるとこんな感じ。

XnViewは処理をスクリプトに書いておける

ので実質以下の手順で済む。
1.Blenderで動画用の画像をレンダリングする。
2.XnViewで画像を2値化、リサイズ、回転する。
3.VB6のプログラムでC用のデータ・ファイル化する。
4.MPLABXのプロジェクト・フォルダにコピーする。

PIC32MM0064GPL028 関連記事一覧




Real Time Clock Module ( DS1307 + AT24C32 ) + PIC18F2550 プリント基板作成

Real Time Clock Module ( DS1307 + AT24C32 ) + PIC18F2550 + SC1602B」や「16×2 Character LCD with I2C Module の分離」でもちょっと触れている時計回路のプリント基板を作成して組み終わった。
20150321160255
相変わらずのなんちゃって表面実装なので基板の部品面には何も無く、大嫌いなドリル作業も電源用のピンヘッダの穴を2つあけただけだ。
20150321160058
表面実装用のパーツは半固定抵抗1個とチップ抵抗2個だけで、あとは普通のアキシャルリードなカーボン抵抗、足を開いて短くしたタクトスイッチなど、ユニバーサル基板だった頃のパーツの消費に努めている。
20150321160138
実は同時に作ったIchigoJam Clone(「255円(税込み、送料別)ぽっきりでIchigoJamを試す。(プリント基板に組んだ)」)では63個もの穴をあけて辟易したので、穴の2個しかないこの基板の作成は本当に楽だなあと実感した。
表面実装パーツでコンパクトにするというよりは、とにかく極力穴をあけたくないという方針だ。
DIP用のICソケットも足を逆方向に折り曲げて表面実装しているし、本来は穴をあけて立てて実装するピンソケットも寝かして取り付けている。
20150320172402
今回はまったのは、まず、中華製の安いピンヘッダのハンダの乗りが異常に悪くて導通に苦労したこと。
もうひとつは表面実装用の半固定抵抗だ。
これ
P-04306
まさかこんなに小さいとは思ってもみなかったので、実際にエッチングが済んで、取り付けるパーツを揃えてみてはじめて小ささを実感した始末。
P-04306size
基板上のランドはこんな。
20150320172412
案の定、うまくハンダ付けできていなくて、一通りの導通チェックでも見つからなくて苦労した。
バックライトは点灯する>表示はされない>コントラストを調整する>ドライバーを半固定抵抗に当ててまわす>時々ちらちら表示される
という状況なので、つまり半固定抵抗に上から圧を掛けると表示するので、ハンダつけの不良と判明した。
幾度か経験しているが、導通テストって、テスト棒で上から押さえたときだけ導通するというケースは導通OKにしてしまうという問題がある。
今回も典型的なこのケースだった。




Real Time Clock Module ( DS1307 + AT24C32 ) + PIC18F2550 + SC1602B

20150302003457Real Time Clock Module は「Real Time Clock Module ( DS1307 + AT24C32 ) + Arduino UNO + Arduino IDE 1.0.5-r2」でArduinoを使って動作確認したっきっり放置してあったもの。

これをPIC18F2550で動かしてみた。
I2CはBit Bangingで実装したいところだが、まずは物真似なので、I2Cを装備しているPICを使う。
それに加えてLCD用にI/Oが6本用意できれば他のPICでも動くとは思う。
参考にしたのはこのサイト
上のサイトで使っているPICはPIC18F2620というものだが、手持ちになかったので同じF18で28ピンの物ってことで、PIC18F2550にしてみた。
あと、LCDへの表示に MPLAB C Compiler Libraries for PIC18 MCUs に含まれている LCD Function を使っているのを「PIC16F84A + SC1602BS + XC8」で使ったものに変更した。
PIC18F2620を使っている元の回路ではRB0~RB3をLCDのデータ用に割り当てているが、PIC18F2550ではRB0とRB1にI2C用のSDAとSCLが割り当てられていて、I2Cを優先するためにLCD用には使えない。
ところが LCD Function でピンの割り当てを変更する方法がよく分からなかったので、使い慣れたコードを流用することにした。
表示部分を該当するものに機械的に置き換えるだけなのでそれほど面倒ではない。

電源関係を除く配線は以下のとおり。
RB4~RB7 D4~D7(SC1602B)
RB2 Enable(SC1602B)
RB3 RS(SC1602B)
SCL SCL(RTC Module)
SDA SDA(RTC Module)


※改良
実際に動かしてみたら、時刻などの設定をする時に現在どの値を設定している最中なのかが分りにくかったので、その部分だけ少し改良した。
改良前と改良後
[crayon-671745597a290192164337/]
RC0に接続してあるタクト・スイッチの押下で設定モードに入るが、その際にLCDの右下隅に文字を表示するようにした。
下の写真は「月」を設定している最中であることをあらわす「M」が表示されているところ。
20150302012140


※修正
時間の設定に不具合があった。
きっちり確認したわけではないが、12時間制を前提にプログラムされていて、うちのモジュールが24時間制に設定されているせいでおかしくなるような気がした。
そのため、起動時に強制的に12時間制に設定するコードを追加した。
アドレス0x02のBIT6をHighにすると12時間制になる。
while( SSPCON2bits.SEN );
の後に次の3行を追加する。
hour = read_ds1307(0x02);//0x02を読み込む
hour = hour | 0b01000000;//BIT6だけを変更して1にする
write_ds1307(2, hour); //0x02に書き戻す


※追加
曜日を表示するコードを追加した。
ddayはもともと宣言もされていて値も読み込まれているのに使われていない。
つまり、下の関数を追加してどこか適当なところで呼び出すだけでいい。
[crayon-671745597a297649846829/]
20150302043236
ちなみに、曜日は時間が午前0時をまたいだ時にだけ変更される。
日付だけを変更してもすぐには反映されない。
午前0時をまたいで変更されても正しい曜日に自動的に変わるわけではなく、前の曜日から次の曜日に変わるだけ。


※追加
曜日を変更できるようにした。
変更モード時の表示用文字列を以下のように変更する。
char disp[] = “hmsDMYd”;
「hms」は「時分秒」、「DMY」は「日月年」で、「d」は「曜日」を表す。

項目が1つ増えたのでswitch文用のカウントを1つ増やす。
if(set_count >= 8)

switch文に以下のcaseを追加する。
[crayon-671745597a29b509501181/]
RTC内部では数値をBCD(Binary-coded decimal)で扱っているので、値の増減には普通のBinaryに直す必要がある。
ところが、曜日はどうせ7種類しかないので1桁で納まるから、BinaryもBCDも同じことになる。
つまり、BinaryとBCDの相互の変換処理が不要で、ちょっと楽した気分だ。

プリント基板を作成した。
Real Time Clock Module ( DS1307 + AT24C32 ) + PIC18F2550 プリント基板作成




PIC16F1823 + LM61BIZ + NJL7502L + I2C EEPROM

LM61BIZで温度、NJL7502Lで照度のデータをPIC16F1823で測定してI2C EEPROMに記録する。
20140723205542
だいぶ前からデータ・ロガーだデータ・ロガーだと騒いでいて、ようやく組み立てた。
20140723220406
とりあえず、1分間隔で測定して動作テストをすることにした。
PIC16F1823_LM61BIZ_NJL7502L_I2C_EEPROM_chema
照度の方はちょっとよく分からないが、温度の方は変化の仕方も測定値自体もまあまあそんなもんだろうという結果を示す。
ただ、このギザギザは何だろう。
電源のせいだろうか。
何となくだが、こういう回路に昇圧回路で作った電源を使うのはまずいような気もする。
それとも、そもそもこんな変化なんだろうか。
移動平均でも取ればよさそうなもんだが、要検討というところだ。
PIC16F1823_LM61BIZ_NJL7502L_I2C_EEPROM_graph
追記 2014/08/01回収分
teraterm20140801
今頃気づいたんだが、照度の方はもう少し感度を上げた方がいいいようだ。
温度は、ギザギザになる点を除けば納得のいく結果。
薄い水色の線は気象庁のデータをもらってきてグラフにし、たて方向にずらして貼ったもの。




PIC16F1823 -> I2C(Bit Banging) -> AQM0802A and AT24C256B

I2Cは1組のラインに複数のI2C機器をぶら下げることが出来る。
知ってはいてもやったことが無かったが、LCDのAQM0802AとEEPROMのAT24C256Bを接続してどうやら問題なく駆動出来ているようだ。
20140707020900
変更点は特に無し。
それぞれのコードをコピーしてきてペーストしただけですぐに動いた。
そういう仕組みなんだからそうなんだろうけど、ちょっと感動した。

そもそも「PIC12F675 + I2C + AT24C256B」あたりからI2CをBit bangingで実装するってのをはじめ、「PIC16F1823 -> I2C(Bit Banging) -> AQM0802A」でAQM0802Aでの実装も試していたので、それらのコードの集合というわけだ。

要は、Slave AddressとかDevice Addressとか書かれているもので区別するわけだが、
EEPROM AT24C256B の場合は

The device address word consists of a mandatory “1”, “0” sequence for the first four most significant bits as shown. This is common to all two-wire EEPROM devices.

と書いてあって
20140707020900-1
先頭の4ビット「1010」がEEPROMをあらわし、その後の3ビットが複数のEEPROMを使う場合にそれを区別するためのもの、
AQM0802Aの場合は

Only one 7-bit slave addresses (0111110) is reserved for the ST7032.

と書いてあって
20140707020900-2
「0111110」が固有の識別符号のようだ。
こちらはAQM0802を複数使用するケースは想定されていないってことかな。

いやあ、データ線2本で表示の出来るI2C接続のLCDってのは、私のような行き当たりばったりのコーディングをするものには救いの神だ。
そういう意味でも、Bit bangingで実現できるのは大きいと思う。




PIC16F1823 -> I2C(Bit Banging) -> AQM0802A

I2Cの機能を持っているPICなのに、そのピンは使わずに2ピンと3ピンを使って、わざわざBit bangingでI2C接続のLCDを駆動させる。
20140705202148-2
Wikipediaによると
Bit banging is a technique for serial communications using software instead of dedicated hardware.
だって。

私の場合はただ単にI2Cの機能の使い方が分からないというだけのことだけど。

やったのは単純なことで、要するに「PIC12F675 — I2C —> AQM0802A とりあえず「Hello」」で作ったI2C機能の無いPIC12F675用のプログラムをPIC16F1823用に移植した。
Bit Bangingの利点はPICの機種に無関係に機能を移植できることだ、と素人考えでは思う。
20140705202148

main.c内のInitCCTは以下のように書き換えてInitPICとした。
[crayon-671745597a457385819571/]
I2C.hで変更のあったのは以下の部分
[crayon-671745597a45b617599377/]




PIC12F675 — I2C —> AQM0802A どうもしっくり来ない

PIC12F675 — I2C —> AQM0802A で「Hello」を表示させたときの信号の様子をデジアナで拾うとこんな感じだ。
st7032-03
st7032-04
st7032-05
最初の2枚は秋月のデータ・シートに書いてあった初期化コードを送ってるだけ。
3枚目は「Hello」とデータを送っている。

何がしっくり来ないのかというと、先頭の0x7C、0x80、0x38を送ったときだけAcknowredgeが返って来ないことだ。




PIC12F675 --- I2C ---> AQM0802A とりあえず「Hello」

PIC12F675を使ってI2C接続のAQM0802Aに文字を表示するテスト。
I2Cの機能の搭載されていないPIC12F675だが、すでにI2C接続のEEPROMに書き込むことはできているので、同じI2C接続のAQM0802Aも扱えるはずだということで試してみた。

結論から書くと、まだ細かな点でしっくり行っていないところもあるが、とりあえず「Hello」と表示できた。
st7032-02

基本は秋月のサイトからもらえるデータシートだが、ポイントだけかいつまんだものを下に貼っておく。
st7032-01
EEPROMのとき同様、参考にさせていただいたのはPIC12F675 i2c (bit banging) code + Proteus simulationというサイトの記事だ。
基本的にこのサイトで紹介されているコードの中の関数を使う。
上の図のSはI2C_Start();を、PはI2C_Stop();を実行することを意味し、AはAcknowredgeが返ってくることをあらわしている。
先頭のslave addressとしては、コントローラであるST7032に割り当てられている「0111110」の最後に書き込みを意味する0(図中のR/W)を付け加えた「01111100」( = 0x7C )を必ず書き込む。
control byteとある部分のCoはコントロールが続くなら1、データなら0のようだが、いまひとつ理解できていない。
RSはインストラクションなら0、データなら1のようだ。
書いてる本人がピンと来ていないので、というかデータ・シートを丹念に読み込んでいないので実にあいまいだが、実際に、インストラクション・コードの前には0x00(0b00000000)、データの前には0x40(0b01000000)を送ったらちゃんと表示はされている。

初期の頃に買い込んだPIC12F675の活用の幅がこれでまた広がったわけだが、何かの拍子にクロックの補正用のデータが消えちゃったのが1つ、デジタル・アナライザーでI2Cのデータの確認に気を取られて電源を逆につないでこんがり焼きあがったのが1つという具合で、いろいろ出来るようになる頃には肝心のチップは1つも残ってなかったりするかも。
でも、汎用のデータ・ピンで出来ることが増えればその分を他の用途に使えるわけで、やってみる価値はあるだろう。