こんばんは。
先ほどに引き続きです。
ちょっと、考えてみて、いろいろ試してみました。
というか、ハードウェアを使う上で基本的なことを
守れば、問題なかったです。
いいわけですが、聞いてください。
最近の機器って、通信中にケーブル抜いても
エラーが出るだけでOSはこけないですよね。
アプリケーションが動く前に、機器をつないでいても
アプリケーション起動時にOSはこけないですよね。
なんて、最近の思い込みでいろいろやってしまいました。
その結果、OSが止まって、Windowsの再起動がかかりました。
はぁー。そんなことに詰まってしまったとは・・・。
結論としては、次の2点を改良すると問題が起きませんでした。
・「SCRATCHX」のプロジェクトを読み込んだ後にUSBケーブルをつなぐ
・マイコンのプログラムをSCRATCH側からのパケットが届いたら
パケットを送る仕様に変更。
以上です。後は、SCRATCHXから送ったデータで、
マイコンの動きを変えるところとPicoBoardのプロトコルを独自仕様に
変更するところですね。
その辺は、お好きなようにすればいいですね。
とりあえず、マイコン側のプログラムです。
スケッチでアップすればいいかもしれませんが、
いかんせん、ArduinoStudioは、最近使い始めたもので
よくわかっていません。 m ( _ _ ) m
/////////////////////////////////////////////////////////
unsigned char channel;
unsigned char data=0x00;
unsigned char ubyte;
unsigned char lbyte;
void setup() {
Serial.begin(38400);
delay(10);
}
void loop() {
data++;
if (data>=255) data = 0;
int inByte = 0; // incoming serial byte
if (Serial.available()) {
inByte = Serial.read();
channel = 0x0;
ubyte = channel << 3;
lbyte = data;
Serial.write(ubyte);
Serial.write(lbyte);
channel = 0x1;
ubyte = channel << 3;
lbyte = data;
Serial.write(ubyte);
Serial.write(lbyte);
channel = 0x2;
ubyte = channel << 3;
lbyte = data;
Serial.write(ubyte);
Serial.write(lbyte);
channel = 0x3;
ubyte = channel << 3;
lbyte = data;
Serial.write(ubyte);
Serial.write(lbyte);
channel = 0x4;
ubyte = channel << 3;
lbyte = data;
Serial.write(ubyte);
Serial.write(lbyte);
channel = 0x5;
ubyte = channel << 3;
lbyte = data;
Serial.write(ubyte);
Serial.write(lbyte);
channel = 0x6;
ubyte = channel << 3;
lbyte = data;
Serial.write(ubyte);
Serial.write(lbyte);
channel = 0x7;
ubyte = channel << 3;
lbyte = data;
Serial.write(ubyte);
Serial.write(lbyte);
channel = 0xf;
ubyte = channel << 3;
lbyte = 0x04;
Serial.write(ubyte);
Serial.write(lbyte);
}
}
/////////////////////////////////////////////////////////
とりあえず、ざっくりというと、
Serial.writeで、2バイトのデータを
9個送ってます。そのうち、8個がセンサのデータ。
最後の1個は、PicoBoardだと判断するためのデータです。
1個のデータ(2バイト)の構造は、以下の通りです。
すいません。ざっくりとした図で。
上位の1バイト(8ビット)のうち、最上位ビットは
捨てています。次の4ビットがチャンネル番号。
このチャンネル番号がSCRATCH側のセンサ名に対応します。
残りの3ビットはデータの一部。あと、下位バイトのうち最上位ビットを
除いた7ビットがデータになります。
おそらく、マイコン側で使用するデータが10ビット(AD変換)を最大として
決めたんだと思います。
以上のような仕様です。
最初は、起動時に認証というかボード確認用のパケットが
あると思ったのですが、そんなのはなかったですね。
とりあえず、パケットの18バイトの最後2バイトが
picoボードを表す値になっていました。
picoボードと判断するのは、チャンネル番号が15(f)で、
データが(0x04)のときです。
そうでなければ、シリアルデバイスでもpicoboardとして
認識されません。逆に、18バイトのデータを送ってきて
17,18バイト目がpicoボードの値ならそのほかの値が
問題なければpicoboardとして認識されます。
とりあえず、マイコン側のプログラムが分かったので
自分をほめてあげたい・・・。よく頑張った。 ( ; _ ; )
次は、スクラッチ側のjsファイルですね。
jsはいいんですが、descriptorの配列がよくわからん。
scratch独自過ぎてというか、ここがscratchの
block定義のような気がして、scratchを勉強せねば。
ちなみに、scratchもここ最近始めたところです。
なので、ちょっと時間がかかるかも・・・。
また、何かあればアップします。
ま、自分の備忘録ですので・・・。