工作の2S(Seiri/Seiton)

工作やプログラムでやったことをまとめていきます

パソコンからArduino経由でSDにファイルを書いてみる1

ブログ作成時の作業BGMです

 

●製作品イメージ

PC上のファイルをArduinoを介してSDカードに書き込む

f:id:kt-marshal:20160601223408j:plain

この関係あまり詳しくないですが、OSとSDカードが直接つながらないのでAutorun.infにかかわるワーム被害のリスクはだいぶ低いんじゃないでしょうか。(そういう目的ではないですが)

 

●ということで

製作物は3点になります

 ・そういうのができる回路 

 ・VBの送信ソフト

 ・Arduinoソフト

 

●そういうのができる回路

まずはハードウェアが必要になります。

KiCADで作図しています。オリジナル部品の作成もだいぶ慣れてきました。

自動車学校で言うと教習所の外を走り出した感じですね(?)

f:id:kt-marshal:20160601232330p:plain

回路ですが、Arduino NanoにSDカードホルダーをつなぐだけです

SDホルダーDIP化キットを使用しています。DIPスイッチはパーツケースで腐ってたモノを使用しました

マイクロSDカードスロットDIP化キット: 組立キット 秋月電子通商 電子部品 ネット通販

 

拡張機能としてDIPスイッチを4つ取り付けています。

1ピンと2ピンの状態を起動時に読み取りボーレートを4800, 9600, 57600, 115200の4つに切り替えるというものです。早いほうが良いに決まってるので115200で使うことになるでしょう。残り2ピンは未使用です。

 

ブレッドボードで配線するとこんな感じ↓

f:id:kt-marshal:20160601233534j:plain

 

●VBの送信ソフト

Arduino Nanoとダイレクトにシリアル通信できるため、.NETのSerialPortを使用します

(ちなみにワタクシは気分でVBC#を使い分けています)

f:id:kt-marshal:20160601233841j:plain

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が送信されArduinoPING応答する

応答がない場合は切断する

データの送信

ファイル名を送信する(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スイッチが不安定です

movexe.zip - Google ドライブ

 

●データの転送

途中途中ハマッタところが

・ファイル名をAsciiで送ったところファイル作成ができず、unicode(風)にしたらできた

Arduinoのシリアルバッファ64bytesいっぱいにおくったらどうも63Bytesまでっぽい?

 

なんやかんや下記のように転送できました

f:id:kt-marshal:20160601235941j:plain

bschのなぞの回路図をSDに転送し無事開けたところです

作成日時は 2000/01/01/01:00:00 になっています

DEBUG.TXTは経過を記録するファイルです

 

残念なことにbschの回路ファイルはまんまAsciiファイルなのでバイナリファイルを次回試してみることにします