遅ればせながらArduinoでSDカード
2020年3月20日:256kBシリアルデータ記録回路とりあえず完成
↑は基板に乗せたEEPROMへのデータ保存でしたんで、容量が限られています。
(フロッピディスクにも満たない)
やっぱSDカードへの記録だろうと、ネットをあれこれ探し回っておりました。
で、まずこんなのがあるのを発見。
OpenLog - スイッチサイエンス
シリアルデータのログ、「これでエエやん」なんですが、あれこれ手を加えるとなると(例えばスイッチ付加)チップから配線を直出ししなければなりません。
それにソフトも。
可能ならArduinoの標準的環境で手作りしたい。
※OpenLogのスケッチ、読んでみましたが
SDカードのエラー処理、リセット・電源再投入でしか
回復できない。
※参考
オープンソースロガーOpenLog V4互換モジュールの製作 - アキバ通いと旅
こんなあんなで、
ラジオペンチさん: Arduinoで作るSDカードを使ったデーターロガー
などを読みながら、どうしたものか思案中です。
●悩みどころ
・SDカードを抜き差ししたい。 SW操作でログのon/off。
抜く時はログ書き込みを停止。 挿してSW onで再開。
この時、別のSDカードを入れても処理できるように。
SDカードのエラーが起きた時に止めたらダメ。
・文字受信のたびにファイルのオープン・クローズを
繰り返してたらその回数が気になる。
FAT上、連続したデータを書き込む位置は変化するけど、
ファイル名といっしょにファイルサイズを記憶している
場所、頻繁にクローズ処理していると、この特定部分の
書き込み回数が多くなってしまう。
だもんで、ログ中はオープンしっぱなしで書き込み実行。
クローズするんじゃなく、たまにフラッシュさせるような
処理かしらと。
書き込み回数を見て、ファイル名を変えるか。
※昔々、RXマイコンで作った装置(仕事)はこんな具合に処理。
運転には人が関わるんだけど、保存データの
確認なんて、システム替えやトラブルが有っ
た時くらい・・・という装置。
・SDカードの他にEEPROM、それにバックアップRAM
エリア付のRTC ICを搭載。
(日時データが必要だったんでRTCは必須)
・計測データ数など常に変化する値は、RTCの中の
バックアップRAMを使って保持。
(何度でも書き込み出来る)
・計測データそのものはEEPROMに一次保存。
(特定場所だけ書き込み回数が多くなるという
ことは無く、全域同じように書き込み回数が
増える)
・EEPROMが一杯になる、あるいは定時起動や手動操作
でEEPROMの保存データをSDカードに転送。
この書き込みは一瞬だし、何度も行わない。
普通の運転中はSDカードを抜いていてもOK。
・EEPROMへの一次保存データはバイナリ。
SDカードへ書き込む時に文字に変えCSVファイルで。
こんなのでした。
SDカードに作ったファイルの頻繁なオープン・クローズ、
書き込み回数の面でちょいと気になります。
仮に書き込み可能回数10万回としたら・・・
1分に1回の書き込みで、1日あたり1440回。
すると、70日ほどで10万回を突破。
とりあえず作ってみたのが・・・
・ディレクトリ名「LOG」を作る。
・その下に「RX0000.TXT」というファイル名でログファイルを
作り記録開始。
・スイッチ長押しで、次番号のファイル「RX0001.TXT」を作成。
・スイッチ短押しでファイル名の数字のいちばん大きいファイル
にログデータを追加書き込み。
・いったんファイルをオープンしたらスイッチ操作で記録を止める
までクローズしない。
※これだとあんまりなんで、タイマーでフラッシュ操作を
入れるつもり。
※実験中 ブレッドボードじゃない
Arduino-UNOとSDカード間(5V~3.3V)は、レベル変換IC
TXS0104(仕事試作の残り)でつなぎ。
SDカードの基板はサンハヤト。 これも試作での残り物。
OpenLogのATmega328P、3.3V電源を使って16MHzで動かしてるのが面白い。
データシートだと、2.7Vで10MHz。 4.5V以上で20MHz。
この間、直線的に電源電圧と最高周波数が関連するとのこと。
4.5V - 2.7V = 1.8V。 この間が10MHzだから、
ということは、1.0Vあたり5.55MHz。
3.3Vだと、(3.3V-2.7V)*5.55 + 10MHzで13.33MHz。
※バックアップがわりにスケッチをアップロード
・ダウンロード - rxbff_sd1.zip
| 固定リンク
「電子工作」カテゴリの記事
- TRWの16pin DIP IC「8543」 これは何?(2023.10.06)
- 予告:「マイコン型導通チェッカー」「電池電圧チェッカー」値上げします(2022.11.16)
- 三和の針式テスター「GP-5」不調(2022.10.18)
- 「ダイソー ミニケース 5個組」が見つからない #2(2022.10.12)
- 「ダイソー ミニケース 5個組」が見つからない(2022.09.29)
「Arduino」カテゴリの記事
- 1/nカウント方式とDDS方式の2相パルス発生回路(2024.10.13)
- おっと。map関数の計算桁に注意(2024.10.06)
- DDS方式の2相パルス発生回路、周波数スキャン機能を付ける(2024.10.05)
- 1クロックでも速くしたい 割込を「ISR_NAKED」で(2024.09.30)
- 1クロックでも速くしたい DDS方式の2相パルス発生器(2024.09.27)
コメント
オープン・クローズの回数なんて気にしなくていいのかな?
例えば・・・
・パナソニック
https://panasonic.net/cns/sdcard/industrial_sd_j/function.html
「ウェアレベリング制御」なんて言葉が。
・認識しないMicroSDカードのデータ復旧 | 東京・秋葉原のデータ復旧専門店【データSOS】
https://www.data-sos.com/service/microsd
「フラッシュメモリは劣化を避けるため同じ場所だけに書き込まれないようにコントローラーで分割、ビット反転、排他的論理和等々複数回の演算を行った上で記録します。」
なんて解説が。
投稿: 居酒屋ガレージ店主(JH3DBO) | 2020年4月23日 (木) 08時47分
クローズせずに記録していてうっかりリセットがかかると、ファイルが消滅。なんてことがあったので頭にきて、1レコード書く度にクローズするようにしてます。
ただこうするとSDの健康に悪そうだなーとは思っていたのですが、SDのファームで対策してあるかも、なんですね、なるほど。
投稿: ラジオペンチ | 2020年4月24日 (金) 10時10分
現状、「オープン・書き込み・クローズ」の繰り返しではなく、
「オープン・書き込み・フラッシュ・書き込み・フラッシュ・・・・クローズ」という処理になっています。
書き込みは、
・受信バッファ512バイトがいっぱいになった時。
・バッファにデータが入っていて一定時間(3分)
あらたな受信が無いとき。
フラッシュは、
・書き込みバイト数が65536バイトを越えた時。
・書き込みバイト数がゼロでなく、最後の
書き込みから一定時間(30分に設定)を越
えた時。
クローズは、
・スイッチを短押し操作して受信書き込み
処理を中止した時。
こういうふうにしています。
3分、30分はSDカードの「健康」のためにと考えたわけですが、もっとせっかちなタイミングに変えることにします。
投稿: 居酒屋ガレージ店主(JH3DBO) | 2020年4月24日 (金) 13時29分
こんなふうに完成形に
http://igarage.cocolog-nifty.com/blog/2020/04/post-fc2209.html
投稿: 居酒屋ガレージ店主(JH3DBO) | 2020年4月24日 (金) 17時22分