工作の2S(Seiri/Seiton)

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

NT名古屋にいってきた!

●いきさつ

タケイムセンさんにお買い物に行き、お会計するときにNT名古屋のビラを発見。
日付確認したらなんとリアルタイムで開催中という !なんという !!奇跡 !!!!!
NT系は初めてです

第一アメ横ビル4F会議室でやっていました。10畳くらいのせまめで、10点くらいの出展でした
やはり名古屋、ほかの地区の雰囲気をTwitterでですが見てるのでややしょぼい感じがありました

●印象に残った出展の感想

名前はすべて架空のものであります

・FlashAirを使ったコントローラでWEBブラウザのゲームを遊ぶ

FlashAirというWifi搭載のSD形状のマイコンでコントローラを自作され、さらにそれで遊べるゲームも作成されていました。
どうやら構成ファイルのようなもので起動モードが変更でき、マイコンモードとするとGPIOなどが使えるみたいです
(てっきりSPIバスが出ててそれにぶら下げていくのかと思っていました)

アートワークはKiCADとのことで、言われてみればTwitterでも見かけたことあるなと。

・脈にあわせて電球が光る!?

f:id:kt-marshal:20161009201343j:plain
(おそらくスイッチサイエンスの)心拍センサから脈を読み取り、電球を制御するというものです

・傘で目的地決める、あのやつ

f:id:kt-marshal:20161009201352j:plain
小さいころに一度はやるらしい、「傘を倒して目的地を決める」遊びを、電子的に行えるというものです
工作物より、3Dプリンタの造詣があまりにきれいなのに驚きました。
めねじ、おねじを造形できたり、ギヤヘッドもきれいに造詣で着ていました(写真)
0.2mmまでは造詣できるらしく、職場にあるプリンタでは到底できませんな(1mmできついしポンコツだ、あれ)
3DCADはFusion360とのことでDesignSparkMechから乗り換えてみようかと思います

ネギネギフリフリミクミク

f:id:kt-marshal:20161009201400j:plain
アクリルパネルにフライスか何かで不透明部分を作り、そこが光る。
さらに、それを三層にすることで「動き」を実現しています
また、ネギコン(ネギの無線コントローラ)を早く振るとパネルの動きも早くなるという工夫もありました
無線はBluetoothのモジュールを使用していました

飾りとしてもおしゃれな感じでいいですね

首下げカメラメーン

f:id:kt-marshal:20161009201438j:plain
Nefly(だったかな?)というマイコンボードにカメラやマイクなどがつながれていて、
定期的に写真を残してくれるというものです
なにより、1時間程度で実現できるという点がすごいことですね

君は文明誕生の瞬間を見たか。10年で芽生えた文明

f:id:kt-marshal:20161009201446j:plain
写真はカウントダウンするとモータが駆動し、パパーン、と火星が登場するものです
作成者は10歳小学生。自分が10歳のころはポケモンとかロックマンばかりやってた気がします
(まあ、おかげでプログラムを学びたくなって工業高校行ったわけですが)
この年でシフトレジスタでカウントダウンし、モータドライバをたたくような回路を設計して動くまでやれるなんてすごい
また、お母さんもいいアシスタントぷり
今小学生に戻れたら間違いなく自分もそうするけど、もう遅い。とも感じましたね
ほかにもお掃除ロボットや、クツワムシ(屈伸しながら進むやつ)などありました

製作者様はいろんな工業大学のイベントに行ってるらしく、弊社のイベントにも来るということで、いろんなモノづくりを感じて欲しいと思います

●総評

自由な工作は楽しいなって思いました。
こういう外の展示会のほうが自分にいい刺激を与えられます。断然レベルも高い

次回は出展する側になってみようかなと思います

TWELite 無線マイコン入門 TWEトライ1 書き込みからLチカする

●こんにちわ

無線マイコンモジュールを手に入れたので遊ぶことにします。
別に何かを咽んで制御したいとかは思ったことないので具体的な案件はないです(ツン)

なんとかだましだましLチカまでできたので、トラブルファイティングなど含めてまとめていきます

●導入

Cドライブに一式解凍して「eclipse.cmd」を実行するだけです
(構成ファイルの一部に長いファイル名のものがあり、Cドラ直下でないとうまくいかないようです。なんでそんな長いんじゃ)

●プロジェクトの新規作成

サンプルプロジェクト「App_Twelite」をコピーしていじくることにします
今回は App_ABC にしました

プロジェクトをダブルクリックで開きCtrl+C -> Ctrl+Vとおす
f:id:kt-marshal:20161008220824j:plain
コピーのダイアログが出るので新しいプロジェクト名を入力してOK
f:id:kt-marshal:20161008220458j:plain

●受信プログラムの編集

サンプルプログラムは「vReceiveIoData」関数で受信ともに、IOやPWMの設定を行っています
その処理を無効にし、メインループ内で強制的にLチカをするというものです

/** @ingroup MASTER
 * IO状態パケットの受信処理を行います。
 *
 * - 受信したデータに格納されるIO設定要求に従いIO値(DO/PWM)を設定します。
 * - 受信したデータを UART に出力します。
 * - 中継機の場合、中継パケットを送信します。
 * - 低遅延で送信されてきたパケットの TimeStamp の MSB には1が設定される。
 *   このパケットは、タイムスタンプによる重複除去アルゴリズムとは独立して
 *   処理される。
 * - IOの設定は本受信関数でのみ行われる。
 *
 * @param pRx 受信データ
 */
static void vReceiveIoData(tsRxDataApp *pRx) {
 // *** 以下、処理が続く ***

この関数の一部を下記のようにコメントアウトします(3400行あたりかな)

// ボタンの状態をグローバル変数に格納
	u8BtnState = u8ButtonState;
	// ポートの値を設定する(変更フラグのあるものだけ)
//	for (i = 0, j = 1; i < 4; i++, j <<= 1) {
//		if (u8ButtonChanged & j) {
//			vPortSet_TrueAsLo(au8PortTbl_DOut[i], u8ButtonState & j);
//#ifdef USE_I2C_LCD_TEST_CODE
//			if ((u8ButtonState & j) && sAppData.sIOData_now.au8Output[i] == 0) {
//				// 押し下げ時に限って処理する
//				bDraw2LinesLcd_ACM1602(astrLcdMsgs[i][0], astrLcdMsgs[i][1]);
//				bDraw2LinesLcd_AQM0802A(astrLcdMsgs[i][0], astrLcdMsgs[i][1]);
//			}
//#endif
//			sAppData.sIOData_now.au8Output[i] = u8ButtonState & j;
//		}
//	}

これでIO情報を受信しても勝手に制御されなくなります

次にメインループに相当する関数「cbToCoNet_vMain」にLチカのピログラムを記述します

/** @ingroup MASTER
 * 本関数は ToCoNet のメインループ内で必ず1回は呼び出される。
 * ToCoNet のメインループでは、CPU DOZE 命令を発行しているため、割り込みなどが発生した時に
 * 呼び出されるが、処理が無い時には呼び出されない。
 * しかし TICK TIMER の割り込みは定期的に発生しているため、定期処理としても使用可能である。
 *
 * - シリアルの入力チェック
 */
void cbToCoNet_vMain(void) {
	vHandleSerialInput(); // シリアルポートの処理

	static int c = 0;
	// 点滅
	if (c++ < 500){
		vPortSetHi(18);
		vPortSetHi(9);
	}else if(c < 1000){
		vPortSetLo(18);
		vPortSetLo(9);
	}else{
		c = 0;
	}
}

f:id:kt-marshal:20161008224616p:plain
DO1(18)とDO4(9)にLEDをシンク接続しました

●書き込み

Ctrl+Sで保存します。デフォルトだとビルド時に自動保存してくれないみたいですね
f:id:kt-marshal:20161008223444j:plain
f:id:kt-marshal:20161008223452j:plain

問題なく完了あたらしいバイナリファイルができています
f:id:kt-marshal:20161008223608j:plain


TWE-Lite プログラマで書き込みます
f:id:kt-marshal:20161008224120j:plain
f:id:kt-marshal:20161008224126j:plain

●うごき

youtu.be


ちかちかしてますね
周期は4ms * 500 = 2secくらいかと思ったんですがそうでもないですね
ほかのイベントでも入ってしまうからですかね?

ちょっとなれてきたので本でも買っていじってみようと思います

●トラブルファイティング

書き込み時に「TWE-Lite用のファームウェアちゃいます」と
大阪のおっちゃん(らしき人)にいわれる
f:id:kt-marshal:20161008225241j:plain

プロジェクトのプロパティを開き「C/C++ ビルド」「ビルダー設定」タブ
赤枠のJN5148 → JN5164 に変更でうまくいきました
f:id:kt-marshal:20161008225408j:plain

追記:はじめからビルド構成が用意されていました
f:id:kt-marshal:20161009220225j:plain
おそらく上記でTWELiteDIPやMonoStickの書き込みができるはずです。JN5148はTWEPower?というようなほかのものみたいです

Pythonでニュートン法 ニューモン

●あらまし

高校のプログラミングの授業に発展問題としてこの「ニュートン法」が出ました
歯抜けのフローチャートがあり選択式で埋めるという問題でした

今思えば情報技術者試験の引用とすぐ分かるものですが
まったく手も足も出ずという感じだったのを覚えています
Python入門のタイミングでリベンジしたら解けたので
まとめることにしたのです

●概要

今回は情報技術者試験に登場したニュートン法
放物線 f(x) = x^2 - N = 0となる解を1つ求めるというものです
f:id:kt-marshal:20160822000055j:plain

●考え方

十分に大きい数を選びx0とする
そのときのf(x)の接線とx軸との交点のx座標をx1とする
x1をx0とし、同様に接線からx1を求める ・・・くりかえし
f:id:kt-marshal:20160822220406j:plain
f:id:kt-marshal:20160822220413j:plain

ひたすら繰り返すとx0 ≒ x1 となる(収束)
プログラムでは欲しい精度を満たす段階で打ち切る
 |x0 - x1| < ε

Pythonで実装

# coding: utf-8
print("solve \"f(x) = x^2 - N \"")

N = float(input("input N->"))
ep = float(input("input convergence value->"))
x1 = float(input(input start x value->"))
x0 = 0.0
N /= 2

while(abs(x0 - x1) >= ep):
    x0 = x1
    x1 = (x0 / 2) + (N / x0)
    print("x0->{0}, x1->{1}".format(x0, x1))
    print(x1)
    print("")

print(x1)

▼N = 10
f:id:kt-marshal:20160906213556j:plain

●解説

情報技術者試験では接線を求める公式を当てはめるような気がします
今回で行けば与えられた式から「x0を代入するだけで次のx1が求まる式」を導くことになります

f(X)における接線yは
  Y = f'(X)(Xn - X) + f(X)

XをX0, XnをX1と置き換える
  Y = f'(X0) * (X1 - X0) + f(X0)
f'(X) = 2Xより f'(X) = 2X0
したがって
  y = 2X0(X1 - X0) + f(X0)
    = 2*X0*X1 - 2X0 + f(X0)
よって
  x1 = (X0 / 2) / (N / 2X0)

プログラム内の
 x1 = (x0 / 2) + (N / x0)
が求めた式に相当します
(Nを毎回2で割ることが分かっているためあらかじめ割っています)
f:id:kt-marshal:20160906214019j:plain

●さいごに

f(x) = 0となる点がない場合は無限ループします
数学は奥が深い!

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

とりあえず完成したのでまとめようと思います

ハード面でSDカードの耐圧を越えて使用しているため

真似する際はレベルシフト回路を使ってください

●概要

パソコンとSDカードをUSBで接続し、かつ専用ソフトを中継してデータをSDに送信する。書き込み制限のあるパソコンでもSD書き込みができ、Autorun系のワーム被害のリスクも低いはず。

 

●仕様

通信方式:シリアルポート(Serial Port Driver)

対応SD:2GByte ~ 32GByte

書き込み速度:4800, 9600, 57600, 115200bps

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

 

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

●転送

VB.NETで作成しています(パソコンからArduino経由でSDにファイルを書いてみる1 - 工作の2S(Seiri/Seiton)でも説明があります)

 

SDに書き込む機能だけです

VBではSerialPortクラス

ArduinoではSerialクラスを使用しています

 

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

Arduinoは正常に処理できなかった場合、PCに対しNACKを返します。ファイル処理途中であればそのファイルを削除します

PCはNACKを受信すると処理を中断しメッセージ表示します

タイムアウトは5秒設定されています

PCは接続後、データ送信時以外に定期的にPINGコマンドを発行し応答ない場合は切断処理を実行します

●使ってみる

htm形式の某ソフトのヘルプをSDに転送し開けることを確認しています

(途中移るハードはTX, RXと通信のLEDがチカってるよって意味です)

www.youtube.com

16kByteのファイルなので一瞬でした。1MByteくらいになると数10分は待つことになるでしょうね 

 

 

●苦労したところ

Arduinoにデバッガ機能がないので、どこで通信途切れてるのか見えないのが大変だった。ステップ毎つどログ出力する形でなんとか進めることができた。

つながるまでが一番苦労したた

 

SDのホットプラグ機能やPCとのホットプラグを安定して動作させる方式を何度も作り直した。今でも完璧かどうかは怪しいがおおむねOK

 

SDカードのFATが8.3方式*1のファイル命名で8文字以上のファイルが作成できない(?)

 

VBArduinoのメインプログラムと実行ファイルが入っています

データ転送ツール.zip - Google ドライブ

ラズベリーパイ公式タッチパネルを100均の箱でケーシングしてみた

●こんにちは

上司的な何者かにラズベリーパイB+をタダで貰い、公式タッチパネルも夏のボーナスで購入しました。

抱き合わせで専用ケースみたいなのも売ってますが、100均でいい素材があったらそういうの使ってみるのも面白いかなと思い今回の活動に至ったわけです。

Amazonで11,290円もしたぞ

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

▼なぜくれたかは未だわからないが使う

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

そして、ダイソーで見つけたケース

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

 

 

●ディスプレイの固定のための加工

どういう構成で固定するかにセンスが問われます。とくに前面パネルにねじを出すようなのはあまり好きではありません。基本は裏側か中にするようにしています。

 

タッチパネルの裏にM3めねじ穴が4つ空いているので2枚のプレートを取り付けプレートでベース(引き出される方の底)に固定することにしました

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

▼固定用の穴を空ける前(空けた後の画像はねえのかよ)

 会社のゴミ箱から拾ってきたものを仕上げました

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

前面をカッターで切り抜きます

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

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

 

●組み立てる

(高さもそのまんまでいいじゃないすか)

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

 

中はこんな感じ

DCジャックから5Vを供給します

画像処理をやらせると熱がひどいので放熱ファンをつけてみました

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

ワゴのWFRで接続しています。今までのようにスリーブかしめが不要になり、透明で接続状態がひと目でチェックできます。

オススメです

www.wago.co.jp

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

 

コネクタ

左角がダレて、右角が尖ってる。こういうのは試験では減点されます

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

 

●完成したのであそぶ

そんなかんやでオセロをやってみました

タッチパネルなのでタッチで石を置けますね

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

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

 最近ゲーム作りから離れているので何か作ってみようかな

 

●さいごに

タカチとかだと高くついてしまうので、趣味の工作であれば100均でケースを探すのもアリだと思います。「こんなのをケースにしてみよう」的な発想が面白いかも

 

それと、実は公式のケースがあまり好きではないので、(アクリル3枚重ねた感がムリ)同じように思ってるならこういう感じも良いと思います。

 

とりあえずは、来週から始まる夏休みの宿題としてPyGamesでニュートン法をやってみようかなーと思います

KiCADの3DモデルにDesignSpark MechanicalとWings 3Dで挑戦

KiCADでのフットプリント作成と3Dモデル作成と割付までを書いてあります

事後録のため順序が実際の作業と前後しています。

 

 

こんにちは。皆さんも日々、KiCADで基板アートワークしますね。

で、3Dビューしますね。

 

たとえば下のデータ転送回路の場合4ピンのDIPスイッチやらSDのホルダやらArduinoやら、オリジナル部品だらけです。

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

 

たとえばこのDIPスイッチ

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

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

 オリジナル部品の場合3Dビューがないのです。

せっかくの3Dビューもオリジナル部品だらけではランドと基板だけの絵になってしまうのです

 

 

さみしいやないかい!

 

ということで作ります。

 

作業にあたり下記のサイトを参考にさせていただきました

Cubify Design + Wings3DでKiCad用の3Dモデルを作る:そこんとこkuwaしく - ブロマガ

●必要なもの

 ・KiCAD

 ・DesignSpark Mechanical

 ・Wings 3D

 

●KiCADのフットプリントを作る

グリッドを "2.54mm" にしてランドを配置して

外枠はグリッドを "1.27mm" にして、ランドのセンターにアンカーを置いてグリッドで計算しながら書いています

寸法は後述のメーカー情報を使います

この辺は KiCADことはじめ 的なモノを参考にすれば良いと思います

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

 

●3Dモデルを書く

DesignSpark使います。持ってない人は 公式ページでゲットだ!

www.rs-online.com

メーカーの寸法情報を参考に書きます

今回はOMRONのA6Eシリーズです

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

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

DesignSpark Mechanicalは 平面作って 絵を描いて ヒッパル!

 平面作って 絵を描いて ヒッパル!

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

はいおわり!

DSMで電子部品を書く方法もまとめるかも

 

各構成ごとにコンポーネントを分けて、色をつけています

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

グリッドをヤード系にすると、グリッドにあわせながら簡単に作図できます

また、3Dモデルは見た目の話なので(?)ピッチは守りながらも外形などはラフに書きました(手抜き)

 

そして、完成したこいつを STL(Stereo Nantyara Li) で出力します。

STLは3D図形を細かい三角形の張り合わせで表現しようというものです。ファイルの中身は三角の座標とその面が向くベクトル情報の羅列になっています。

 

●Wings3Dで着色してwrlに変換する

DesignSparkMechanicalでは wrl が吐き出せないため Wings3D のお力を借ります

また、STLには色などの属性は含まれないため、着色もWings3Dで行います

(DesignSparkMechanicalがwrlを吐き出せれば一番いいのにね)

 

※説明書などを読まずに適当にやった方法です

 

最初にSTLをImportします

 

部品構成情報を用意する

Outliner ウィンドウをなんらかの方法で表示し、default を右クリック → duplicate(複製)して部品にRenameと色の設定をします

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

色の設定は右クリックし Edit Material... をクリック

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

下図、1、2の手順で変更可能 Ignoreのプルは左クリックを押しっぱなしじゃないと勝手に隠れるので注意

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

 

次は部品のメッシュ(三角)を今作成した構成情報に割り当てていきます

範囲選択などし、赤くします。下記はピン(赤くなっている)を構成するメッシュをすべて選択したった

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

outlinerの対象の pin を右クリックし Assign to Selection をします

するとそのメッシュに設定が適用されます。そう、色が変わるはずです

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

割り付けたらスペースキーを 押して選択を解除します

 

これを繰り返すとすべてに色がつきます

メッシュは1構成にしか割り付けられないらしく、メッシュを別の構成に割り付けると

横取り的な感じになるようですね

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

 

エクスポートします

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

 

●KiCADに取り込む

プロパティで取り込めますが、なんか知りませんがでかいですな。

(図はお試しで取り込んだ段階なので白いのです。ブログ用に作業の順序変えてるんすよ)

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

まあ、ピッチさえあっていればプロパティの調整でなんとかなるでしょう

スケーリングと位置オフセットを都合よくいじります

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

あーだこーだやって、しっかりはまりました

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

そして、細かい修正の中、スイッチの色をオレンジにしたらボディーが真っ白になって戻らなくなりました。スノーホワイト、これはこれでありですね。

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

続いてほかの部品を作ってみました

あまり凝るとメッシュが増えて大変です。特にRや丸系は悲惨なことになるかも知れません

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

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

同じようにフットプリントに割り付けます

 

そしてKiCADでアートワークするとこんな感じです

 

 ばばーん!

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

なんか作った感出てきますね。

もう満足したし実物作らなくてもいいや

 

この機能は、手付けするとしたらコテが入るか?とか、SDカード取り外せるか?とか実用面での確認がしやすくなると思います

ただし、画像での保存しかできないため、メカCADにインポートして筐体設計に引き継ぐなどはできないようです

(世の中的には3Dモデルとしてシミュレーションにかけたりします)

 

最初の1個目は1時間かかりましたが、2個目からは10分程度でできるようになりました

 

3Dモデルを配布しているサイトもありますのでそこから利用させていただくのも手だと思います

 

今回のデータ

SW-DIP4.zip - Google ドライブ

 

 

パソコンから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ファイルなのでバイナリファイルを次回試してみることにします