こんばんは。

先ほどに引き続きです。

ちょっと、考えてみて、いろいろ試してみました。

というか、ハードウェアを使う上で基本的なことを

守れば、問題なかったです。

 

いいわけですが、聞いてください。

最近の機器って、通信中にケーブル抜いても

エラーが出るだけで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もここ最近始めたところです。

なので、ちょっと時間がかかるかも・・・。

 

また、何かあればアップします。

ま、自分の備忘録ですので・・・。