パソコンからArduino経由でSDにファイルを書いてみる1
ブログ作成時の作業BGMです
●製作品イメージ
PC上のファイルをArduinoを介してSDカードに書き込む
この関係あまり詳しくないですが、OSとSDカードが直接つながらないのでAutorun.infにかかわるワーム被害のリスクはだいぶ低いんじゃないでしょうか。(そういう目的ではないですが)
●ということで
製作物は3点になります
・そういうのができる回路
・VBの送信ソフト
・Arduinoソフト
●そういうのができる回路
まずはハードウェアが必要になります。
KiCADで作図しています。オリジナル部品の作成もだいぶ慣れてきました。
自動車学校で言うと教習所の外を走り出した感じですね(?)
回路ですが、Arduino NanoにSDカードホルダーをつなぐだけです
SDホルダーDIP化キットを使用しています。DIPスイッチはパーツケースで腐ってたモノを使用しました
マイクロSDカードスロットDIP化キット: 組立キット 秋月電子通商 電子部品 ネット通販
1ピンと2ピンの状態を起動時に読み取りボーレートを4800, 9600, 57600, 115200の4つに切り替えるというものです。早いほうが良いに決まってるので115200で使うことになるでしょう。残り2ピンは未使用です。
ブレッドボードで配線するとこんな感じ↓
●VBの送信ソフト
Arduino Nanoとダイレクトにシリアル通信できるため、.NETのSerialPortを使用します
SDの機能とファイル送信の機能があればいいかなということでこんな感じ
暫定でほとんどの機能を作ります
-----コマンド一覧---------------------------
CMD_ACCEPT As Byte = Asc("0") ' 通信受信正常
CMD_END As Byte = Asc("1") ' 通信終了指令
CMD_PING As Byte = Asc("2") ' PINGコマンド
CMD_SD_CONFIG As Byte = Asc("3") ' SD構成情報要求
CMD_SD_DISCONNECT As Byte = Asc("4") ' SD取り外し検出
CMD_FILE_SEND As Byte = Asc("5") ' ファイル送信
CMD_FILE_NACK As Byte = Asc("6") ' ファイル受信失敗
CMD_FILE_ACK As Byte = Asc("7") ' ファイル受信応答
CMD_NOP As Byte = &HFF
接続までの流れ
接続 ボタン押下でSD構成情報要求をArduinoに送信します
ArduinoからSD形式、全体容量、使用済み領域が帰ってくる
接続が確立する
確立中はVBから1秒ごとにPINGが送信されArduinoがPING応答する
応答がない場合は切断する
データの送信
ファイル名を送信する(unicode風?) ArduinoはACKを返す
SD上にすでに存在すれば削除する(上書き)
ファイルサイズを送信する ArduinoはACKを返す
63byteブロックで送信し、ブロック受信でArduinoはACKを返す
エラー時はNACKを返し作業中のファイルを削除して終了する
書き込み時はLEDが点滅する
そういえば、「シーケンス制御検定」は、このように箇条書きレベルの仕様書で
プログラムを作らなければならないので大変でした
●Arduinoソフト
VBソフトの仕様にあわせて作って行きます
SDの抜き差しに対応するために下記の工夫をしています
SPI.end();で終わることで、再度のSD.beginが正常実行でき、SDのホットプラグに対応できます
// ----------------------------------------------------------------------------------------------
// SDを終了する
// ----------------------------------------------------------------------------------------------
void SD_dispose() {
SPI.end();
volumesize = 0;
usedsize = 0;
sd_flag = false;
sd_standby = false;
sd_disconnect = true;
// Serial.print("exit...\n\n");
}
現段階のソースは下記です
・通信が不安定です
・SDスイッチが不安定です
●データの転送
途中途中ハマッタところが
・ファイル名をAsciiで送ったところファイル作成ができず、unicode(風)にしたらできた
・Arduinoのシリアルバッファ64bytesいっぱいにおくったらどうも63Bytesまでっぽい?
なんやかんや下記のように転送できました
bschのなぞの回路図をSDに転送し無事開けたところです
作成日時は 2000/01/01/01:00:00 になっています
DEBUG.TXTは経過を記録するファイルです