自作電子小物/シリアルデータロガー
自作電子小物/シリアルデータロガー
Serial SD logger V0.1
2011年5月24日火曜日
RS-232C等のシリアル通信データを、SDカードに日時と共に記録する小物です。小型で、バッテリ駆動ですので、取扱が楽です。製作費は約4000円、制御部にアトメル社のATmega328Pを使用し、ソフトウエアはC言語にてコーディングしています。
<機能/特徴>
■データが表示されるので、すぐ確認出来る
■接続は2本の線だけ、外部電源も不要
■単四乾電池3本で1年間稼働
<仕様>
名称:シリアル通信データSDカードレコーダ/ロガー
分類:非同期シリアル通信データ記録装置
通信ポート:RS-232C仕様
電気的接続条件:
最大入力電圧範囲:±25V
最小入力電圧範囲:±3V
入力抵抗:3kΩ+
絶縁あり
信号フォーマット:
同期方式:非同期
スピード:1200, 2400, 4800, 9600, 19200bps
データビット:7, 8bit
パリティビット:なし、奇数、偶数
ストップビット:1, 2bit
設定はパネル操作もしくは、SDカード上の設定ファイルで変更が可能
画面表示:
デバイス:キャラクタLCD
表示項目:1行目=日時 2行目=件数と最後の受信データ
アイコン表示:SDカードの挿入状態、バッテリの電圧を4段階で表示(最低以下になるとビープ音が出続ける)
節電機能:5分間、受信も操作も無い場合、LCDの表示を停止
データ出力:
メディア:SDカードにCSV形式で直接記録
Standard SDcard、2GB以下でFAT16形式でフォーマットされている事、認識しないとビープ音が出る
出力ファイル名:”SERIAL.CSV”
1行目に項目名を表すヘッダ行を付加
外形:幅84mm、奥行35mm、高さ52mm
重量: 約120g、本体のみ93g
電源:単四乾電池3本、アルカリの場合約1年
(10秒間隔で1日8時間計測を続けた場合、使用するSDカードの消費電流で大きく変わって来ます)
使用方法:
SDカードを挿入すると、データ記録を開始します
3秒以上データが受信していない時に、SDカードを抜いて下さい
キー操作:
上ボタン:LCDコントラスト濃く
下ボタン:LCDコントラスト薄く
左ボタン+上ボタン:日時設定
左ボタン+下ボタン:セットアップメニュー(通信条件設定など)
左ボタン+右ボタン:件数リセット
設定ファイル:SDカードに下記のファイルを入れておけば、挿入時に読込まれ設定されます。
ファイル名:”SERIAL.TXT”
形式:プレーンテキスト
speed=「転送速度」
data_b=「データビット数」
parity_b=「0:パリティなし 1:奇数パリティ付 2:偶数パリティ付」
stop_b=「ストップビット数」
rcvsize=「1行のデータバイト長」
item=「項目のバイト長」 複数指定可能
<技術的なポイント>
■ハードウエア
・Atmel社のATmega 328Pマイクロコントローラ
・汎用的に使える「ベースボード」を設計
・SPI接続のSDカードの使用
・I2C接続のLCDモジュールの使用(CPU内蔵プルアップ抵抗)
・圧電スピーカの単純直接駆動
・32,768Hz時計用水晶の低電力動作
・RS-232C受信での絶縁
・電圧の計測
分圧抵抗による直流電圧の計測
ATmega328P内蔵の10ビットA/Dコンバータの使用
■ソフトウエア
・プログラミング言語はC、開発環境はAVR studio、コンパイラはWinAVR(GCC)
・タイマ割込でカレンダ時計の実装
・独自SDカードライブラリを利用しCSVデータを追加書込み
・独自LCDモジュール表示ライブラリの利用(パラレル、I2C両サポート版)
・printf()の出力先をLCDモジュールへリダイレクト
・ビープ音をソフトウエアで出力
・ADCの非割込での入力
・バッテリ残量(アイコン)を静的電圧値を元に表示
■開発法
・プログラム開発は、無料で利用出来るAtmel社の標準的なIDEを使用
・プログラム書込みは、SDカードブートローダを使用
・回路とプリント基板設計は、無料で利用出来るCadSoft Computer社のEAGLEを使用
<目標とする物>
単純に、シリアル通信上に流れるデータを、独立して長時間記録できるようにしたい。単に機能を実現するのなら、PCにクロスケーブルをつなげれば良いだけなのですが、もっと小型で安く電気も食わない手軽な物が欲しいのです。
主な用途は、RS-232Cデータ出力機能を持った機器のデータを、PCを使わずに記録を残すものです。また、マイコン開発時のデバッグ出力の記録や、PCサーバの物理コンソールのログを残したい時にも使用できるようにする。
データ量は10万件×20バイト=2MBを想定します。できればコードレスで稼働時間は3ヶ月以上。
<大まかな設計>
■全体構成
2MB程度のデータを蓄積して、後でPCに転送する機能が必要です。
単純なので市販品が流用できそうです。
・プロトタイピングツールSTM32 Primer2
データ蓄積はマイクロSDカードへ、データ出力はUSBもしくはマイクロSDカード経由で。
バッテリも内蔵し独立稼働可能。
充電している間使えないので不便かも。稼働時間がどの程度か不明。
・ロガーモジュール μLog超小型ロガー
データ蓄積は内蔵のFLASHデバイスへ、データ出力はシリアルでPCに転送。
本体2100円に電源周りを加えるだけで実現可能。
データ転送はPCとの接続、取り外し操作が必要。
・携帯電話/スマートフォン
データ蓄積は内蔵メモリへ、データ出力はUSBもしくはメモリカード、機種によってはWi-Fi/Bluetooth。
データ入力は、赤外線経由で行う。シリアル線に赤外線LEDを付け、携帯側のソフトで何とかする。
方法としては面白いが、余った携帯でもないかぎり予算的に厳しい。
・自作電子小物PC20SDlogger(市販品ではないが)
データ蓄積とデータ出力はSDカード。カード交換も容易。
データ入力が赤外線なので、改造してRS-232C信号を受けられる様にする。
バッテリ稼働で数ヶ月動作する。
手前味噌ではありますが、やはりPC20SDloggerと同じ構成が良さそうです。結局は、PCへのデータ転送を如何に簡単に出来るかが選定のポイントとなります。メモリカード渡しの方法は、原始的に見えるかもしれませんが、運用を止めずにデータを抜け、データのハンドリングが単純で柔軟な運用が可能です。
もしかしたら、本体の改造はせず赤外線光結合で行えば、ソフト改修だけで事は済むかもしれませんが、今回は若干の使いにくさを改善させたいと考えました。
■データ表示機能
やはり、データがリアルタイムで表示されていると使用感が違うのと、日時合わせもSDカードで行うのは使い易いとは言い難いため、何らかの表示器を付けたいと思います。英数字10〜20桁ぐらいの物です。
表示デバイス:LCDモジュール
バッテリ稼働の前提では、LCDの選択しかありません。通常はセグメント型のLCDが良いのですが、英字を表示するのでドットマトリックス、そうなるとLCDモジュール型の選択となります。
<詳しい設計>
■シリアルデータ受信部
RS-232Cを扱うには、専用ICを使うのが一番簡単で確実です。でも、受信だけなら回路をかなり単純化できます。単に電圧を合わせるだけですから、抵抗器とダイオードで済ませられると思います。
嫌なのは、規定外信号時の保護と流入ノイズです。保護の事を考え始めると切りがない部分も有りますが、相手の機器の素性がハッキリしない条件では、多少は予防措置をするべきではないかと考えました。
今回は、フォトカプラを使い、電気的に分離し直接的なノイズが入ってこない様にし、壊れるならばこの部分だけに局所化できます。
■ベースボード適用
今回の目的にピッタリの「ATmega328Pベースボード」がありましたので、これを使う事にしました。これは、開発期間を短縮する目的で昨年設計しておいた物で、ATmega328P+LCDモジュール+プッシュボタン+SDカード+ブートローダの構成を持つタバコ大の基板です。自動車バッテリモニタでも使っています。
■電池寿命
見積方法は、平均消費電流を求め、電池容量をその平均値で割って時間を計算するものです。平均消費電流も計算しますが、これは消費電流が変化する動作状態を幾つかのフェーズに分け、それぞれの電流を調べ、占有率を掛け合わせたものが平均という感じです。
動作フェーズと消費電流の算出根拠は
・SDカードの書込み時の電流:実測が面倒なので仮定で10mA
・SDカードのスタンバイ時:静止電流が実測180μA、SDカードを抜いた状態では160μAなので差が20μA
・本体アクティブ時:受信・書込み処理しているアクティブな時はCPUのデータシートを参考に仮定で1mA
・本体アイドル時:SDカードを抜いた状態の実測が160μA
・本体スタンバイ時:SDカードを抜いた状態かつLCD表示も消えた状態の実測が10μA
それぞれの、占有率の前提として
「1日8時間使用し、10秒に1回のデータを受信する」とした場合、
・SDカードの書込み:10秒に1回・なのでバッファリング効果はなく毎回書込みされます。よって
1秒当たりの回数は1/10回、稼働率が8時間/24時間、合わせて1/30回。
1回100msと仮定し、1/30×0.1=1/300
・SDカードのスタンバイ:書込み以外の時間、1-(1/300)=299/300
・本体アクティブ:SDカード書込みと同じ、1/300
・本体アイドル時:アクティブとスタンバイ分を除いた時間、1-((1+200)/300)=99/300
・本体スタンバイ時:5分以上何も無い時にスタンバイに移行するので、16時間/24時間=2/3
計算結果は以下の通り
約1年。十分でございます。
内訳を見ると、本体アイドルが一番多いので、スタンバイ移行時間を短縮すればもう延命効果が大きいと思われます。また、SDカード書込みも割合として大きいので、SDカードの消費電流が電池寿命へ影響する事を示します。
<回路図>
<部品表>
配線材・ケース材料、送料/交通費を除きます。
専用のプリント基板を作れば安くとも1500円、初めてであればフィルムや現像剤・エッチング液等で3500円、それと精度の良いインクジェットプリンタが必要になります。
ケースはアクリル板から作る場合、材料費だけでも1000〜2000円位かかると思います。
安めの総計で1500円+1500円+1000円=4000円といった感じです。
<ソフトウエア>
■開発に必要な物
Windows PC(パソコン)
AVR Studio 4 (*1)
WinAVR (*2)
AVRISP mkII等のプログラム書込み器
*1: Atmel社のサイトからダウンロード可能 (Link)
*2: sourceforge.netからダウンロード可能 (Link)
■全体処理フロー
メインプログラムの処理概要フローです。
■ソースコード
Serial_SDlogger01.c:メインプログラムです。ローカルなサブルーチンや割込ルーチン等、全てのアプリケーションコードが記述されています。
lcd.c:LCDモジュールへの表示機能をまとめたサブルーチンです。パラレル接続とI2C接続の2種類をサポートしています。コントラスト調整、アイコン表示もサポート。
lcd.h:上記サブルーチンのヘッダ定義です。
TWI_I2CMaster.c:I2Cのマスター側のプロトコルを処理するサブルーチンで、AVRのTWI(TowWireInterface)ペリフェラルモジュール用に書かれています。lcd.cから呼び出されます。
TWI_I2CMaster.h:上記サブルーチンのヘッダ定義です。
sd_*.c:SDカードへのファイル入出力機能をまとめたサブルーチンです。
sd_*.h: 上記サブルーチンのヘッダ定義です。
delay.c:相対時間待ちサブルーチンです。 lcd.cとsd_*.cから呼び出されます。
delay.h: 上記サブルーチンのヘッダ定義です。
プログラム書込みは、SDカードブートローダ機能を使いました。リンカが出力した.HEXファイルを所定の名前でSDカードにコピーしておき、本体をリセットするだけでLEDが’点滅し30秒程で書込みが完了します。多少、手順が面倒ですが、AVRISP等のプログラム書込み器がいりません。
とは言う物の、ブートローダ機能を付加するには書込み器が必要です。私はデバイスを購入したらまとめてブートローダを書込んでおく様にしています。
<ダウンロード>
ライセンス: フリーソフトウエア(GPL v3)
作成者:富樫豊彦 tog001@nifty.com
開発環境:
Windows2000 SP6 / VMware Fusion 3.0.2 / Mac OS X 10.5
CadSoft Computer EAGLE 5.6 Light Edition for Mac
AVR Studio 4.18.700
WinAVR 20100110(GCC 4.3.3)
AVRISP mkII
<基板>
ベースボード部分は、専用プリント基板を作ってあります。二層で設計していますが、赤の5本をジャンパ配線すれば、片面でもいけます。ベースボード以外は、蛇の目基板と空中配線で実装しました。
穴開け後の基板の裏と表です。
SDカードソケットのはめ合いもばっちり。 取付の基本は、背の低い部品から取り付け。
全部品半田付けが終わった所。ATmega328Pは事前にブートローダを書込んでおいたので、ソケットなしの直づけです。基板裏を見て判る通り、ジャンパ線は5カ所。
ソフトウエア試験中の様子。
<ケース>
いつもの調子で、アクリル板で専用のケースを作りました。
クリックすると細かい寸法を見る事が出来ます。
正面パネルが透明で、LCDの窓以外の部分をつや消し塗装し、中の部品が丸見えにならない様にしました。プッシュボタンは、アクリル丸棒で延長しています。
背面パネルは、ヒンジで開く様にし、パネル側に電池ボックスを取付け、工作を簡単にしつつ、メンテナンスも楽になる様にしました。シリアル信号線は、中の端子台で接続されます。
用意した材料は3枚。普通の定規でPCカッターで切り出し、側板は棒ヒータで曲げ合わせます。
側板の切断面を、平らな台に置いた紙ヤスリ上でこすって平に仕上げます。その後、透明の正面パネルの切断面を紙ヤスリで削っていき、きっちり入るようにします。食器用洗剤で水洗いしてヤスリかすや手の油等を落とし、アクリル接着剤で正面パネルを固定します。
試しにプリント基板を入れてみた所です。少しきつかったので、紙ヤスリで基板側を調整しました。
基板取付け用のエラ(ネジタップ加工済み)を接着。SDカードの挿入口とプッシュボタン用の穴5mmを開けました。アクリル丸棒は10mmにカットし、切断面をきれいにヤスリがけしておきます。好みで、ボタンの頭をアクリル研磨剤を使ってテカテカにしても良いでしょう。抜け落ちない様に細く切った粘着テープを巻き付けておきます。これでケースは完成。
組み上がりの状態です。
電池ボックスとサブ基板は、強力両面テープで裏蓋に貼付けてあります。
<性能検証>
特に実施せず。
<関連>
<製作背景>
ある方からの依頼で製作しました。ベースボードを用意していたので直ぐできると思ったのと、実アプリケーションでの適用性を見てみたかったので作ってみました。最近設計した、PIC18F26J50ベースボードの方にしようかとも考えましたが、USBにする必要性が薄いので、ATmega328Pベースボードにした次第です。出来上がりの実物をみると「もうちょっと小さくしたいなあ」というのが率直な感想でした。
富樫 豊彦 tog001@nifty.com
Data recorder for serial communication data.
storage device is “SDcard” memory card.