USBでPCと接続+SDカードに記録+LCD表示 多チャンネル温度ロガー
当サイトでかつて、USBでPCと接続する多チャンネル温度ロガーを解説しました.
その他の解説では、LCDを取りつけたり、SDカードを取りつけたりしてきました.
今回は、集大成として、USB+SD+LCD+温度ロガー を全部組み合わせた製作例を解説します.
下図がその写真です.左端がSDカード.右がLCD.下がUSBシリアル.中央がSTM8S-DISCOVERYです.
ただし、STM8S-DISCOVERYはCPU部分だけを残してプリント基板を切断しました.
上に伸びる黒赤黄の線は温度センサへいく配線です.
温度センサは秋月電子で売られている LM61CZ というセンサを使いました.
LM61CZには誤差がありますので、STM8SのEEPROMデータで誤差をキャンセルします.
温度センサは防水のためにシリコン接着剤で覆いました.CPUへの接続はピンヘッダで接続します.
USBシリアルモジュールは、ウェブページでおなじみの、シリアル-USB変換基板(秋月電子)を使います.
着脱可能なように7ピンのピンヘッダに配線しました.
SDカードは、FAT16の最大容量である2GBでしか動きません.4Gとか8GのSDでは動きません.
1GBのSDだったら動くのかどうか、それは試していません.
7ピンのピンヘッダでCPUに接続するようにしました.
LCDは、秋月電子で¥500で売られているやつです.バックライト付きの¥700のやつでも構いません.
CPU部分の拡大写真はこのようになっています.
黄色いSWはresetです.黒いSWはTLIの割り込みSWです.
動作画面・使い方
動かすのはPCとUSBで接続してTerminal softでやります.PCと接続しなくても動かすことはできます.
●最初にSDカードを挿さない状態でresetすると、
Terminal画面にはこのように表示され、SDカードの挿入を待ちます.
start temperature logger
waiting for SD card
LCD画面には、
waiting for SD
と表示されます.
●最初からSDカードを挿した状態でresetすると、以下の動作に自動的に走っていきます.
●SDカードを挿入すると、Terminal画面はこのようになります.
確認もせずに、いきなりSDカードをformatしますので、ご注意ください.
その後、毎秒の温度を表示し続けます.
SD card inserted
Wrote block 0-5 (BPB) ←formatします
Wrote block 6 (FAT) ←formatします
Wrote block 472 (RDE) ←formatします
SD card formatted
SD card cleared ←block 504〜520をゼロクリアします
000 00:00:01 0:35.8 1:45.0 2:12.8 3:35.3 4:44.8 5:49.2 6:12.5 7:35.2 8:44.5 9:11.6 ←毎秒の温度 0ch〜9ch
日 時分秒
0ch 1ch 2ch 3ch
4ch 5ch 6ch 7ch
8ch 9ch
000 00:00:02 0:35.9 1:45.0 2:12.8 3:35.3 4:44.8 5:49.1 6:12.5 7:35.3 8:44.5 9:11.6
000 00:00:03 0:36.0 1:45.2 2:12.8 3:35.2 4:44.6 5:49.1 6:12.5 7:35.2 8:44.5 9:11.7
000 00:00:04 0:35.9 1:45.2 2:12.9 3:35.6 4:45.0 5:49.3 6:12.4 7:35.2 8:44.6 9:11.6
000 00:00:05 0:35.7 1:45.0 2:12.8 3:35.3 4:44.7 5:49.1 6:12.4 7:35.2 8:44.6 9:11.6
000 00:00:06 0:35.7 1:45.1 2:13.0 3:35.3 4:44.8 5:49.3 6:12.6 7:35.2 8:44.6 9:11.6
000 00:00:07 0:35.8 1:45.0 2:12.9 3:35.6 4:45.1 5:49.3 6:12.5 7:35.2 8:44.6 9:11.6
CLUSTER 2 ←バッファが満杯になったのでクラスタ2へ書き込む
BLK[504/0] SizeB[00000200] FAT[6/4] ←書いた場所はblock504で、クラスタの0番目、ここまでのサイズは200Hバイト、FATはblock6の4番目のエントリ
●LCDの表示はつぎのようになります.
000 00:00:01 ←日時
12.6 12.5 11.7 ←ch2,ch6,ch9の温度
●enterキーを押すと、次の表示が出ます.これはメニューの表示です.
COMMAND NG!
-----TEMPERATURE LOGGER MENU-----
time 18 9 30 : set day&time 18th 9:30 ←日時の設定です.18日9時30分にします
int 3 : interval time 3 seconds ←測定インターバル[秒]です
v
: switch verbose <--> silent ←ADCの生データなどを表示するverbose modeです
●verbose modeでは次の行が追加的に表示されます.
ADC(0-9)=0:294 1:322 2:253 3:292 4:322 5:335 6:253 7:292 8:321 9:254 ←生ADC値
mV(0-9)=0:958 1:1050 2:826 3:951 4:1048 5:1090 6:824 7:952 8:1046 9:827 ←mV換算値
●SDカードに常時記録していますので、むやみにSDカードを抜去してしまうとファイルシステムが破壊されてしまいます.
そこで、TLI SWを押します. -----写真の黒いSWです------
すると、loggingを停止させ、SDカードにデータを最後まで書いて閉じます.
Terminal softには次の表示が出ます.
SD flushing
EndCLUSTER 2 EndBLOCK 556 TotalSIZE 00006900[BYTE], FAT updated, RDE updated
temperature logging is terminated
LCDには次の表示が出ます.
temp log stopped
●その後にenterを押すと、次の表示が出ます.メニュー表示です.
loggingを停止したあとは、EEPROMメニューと、SDカードメニューに切り替わります.
-----TEMPERATURE LOGGER EEPROM MENU-----
ofs 4 -0.5 : set AIN4 offset to -0.5 ←温度誤差を補正します.補正値はEEPROMに不揮発で記録されます
dump : dump EEPROM ←温度誤差の補正値を表示します
clr : clear EEPROM ←温度誤差の補正値領域をクリアします
-----SD CARD MENU-----
inc 2 : write incremental to block 2 (adrs=2*512) ←SDカードのblock2をインクリメンタルデータで埋めます
fill 49 129 : write 49 to block 129 (adrs=129*512) ←SDカードのblock129を49で埋めます
fill 49 12 129: write 49 to block 12-129 ←SDカードのblock12-129を49で埋めます
txt hello 996 : write hello to block 996 (adrs=996*512) ←SDカードのblock996の先頭に”hello”を書きます
format : format 2GB FAT16 ←SDカードをformatします
3 : dump block 3 (adrs=3*512) ←SDカードのblock3を表示します
3 18 : dump block from 3 to 18 ←SDカードのblock3-18を表示します
●SDカードを外して、PCに挿すとwindowsから読めます.
●作成した回路は10chの温度を測定できますが、2ch,4ch,9chにしか温度センサを取りつけていません.
温度表示の一例はこのようになっていて、まともな温度が表示されているのは2,6,9chだけなのはそのせいです.
000 00:00:03 0:36.0 1:45.2 2:12.8 3:35.2 4:44.6 5:49.1 6:12.5 7:35.2 8:44.5 9:11.7
それで、これらの温度は同じ数値を表示して欲しいわけですので、補正します.
たとえば、2chの表示を-0.3したければ、
ofs 2 -0.3
とterminal softから打ちます.
EEPROMの温度補正値領域をダンプするには、dumpと打ちますと、次のように表示されます.
dump
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 | ................
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 | ................
2d 30 2e 33 00 00 00 00 00 00 00 00 00 00 00 00 | -0.3............ ←2chの温度補正値-0.3
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 | ................
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 | ................
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 | ................
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 | ................
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 | ................
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 | ................
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 | ................
基板回路図
全体回路図(pdf)はこちらです.
ハードウエアの製作
@SDカード
下記の回路図のように作ります.SDカードのコネクタはヒロセの製品です.秋葉で¥315でした.
1uFは、SDカードを挿入したときにラッシュカレントでSTM8Sにresetがかかってしまう不具合があったので、防止するためにつけました.
マイクロSDカードでも動作確認しました.
マイクロSDコネクタは秋月で売っているDIP変換基板を使いました.
AUSBシリアル変換回路
秋月のUSBシリアル変換基板を使いました.
←USBシリアルのJP設定
B温度センサ
温度センサは秋月電子で売られている LM61CZ というセンサを使いました. (LM61CZのpdf)
下図の3つが今回取りつけた温度センサです.
CN3とはSTM8S-DISCOVERYのCN3のことです.AIN2,AIN6,AIN9に温度センサを接続しています.
温度センサを10ヶ取りつければ10chの同時測定ができます.
←LM61CZ
CCPU周辺回路
SD,LCD,USB,センサを取りつけるためのコネクタを作ります.
Reset SWとTLI SWもつけます.
R3,C3はLCDのコントラストを決定するためのDC電圧をPWMで作るためのLPFです.PWMはTIM3で生成します.
ソースコードの解説
サンプルプログラムをこちらに置きます.
今回は、ソースコードサイズが大きいので、STVDをこの設定でbuildしました.
ADCのライブラリを使うとサイズが大きくなるようです.
Global Variables = in Data
Program model = STM8 Large model
ソースコードの解説は工事中です.近日upします.
main.c
usrlib_lcd.h usrlib_lcd.c
usrlib_sd.h usrlib_sd.c
usrlib_uart.h usrlib_uart.c