Changes between Version 1 and Version 2 of nekoboard1vs2


Ignore:
Timestamp:
Apr 27, 2016 6:18:00 PM (8 years ago)
Author:
soumura
Comment:

--

Legend:

Unmodified
Added
Removed
Modified
  • nekoboard1vs2

    v1 v2  
    1 === nekoboardとnekoboard2の違い ===
     1== nekoboardとnekoboard2の違いについて ==
    22
     3[[Image(nekoboard1.jpg,300)]][[Image(nekoboard2.JPG,300)]][[BR]]
     4
     5[https://www.switch-science.com/catalog/1000/ nekoboard]はScratch 1.4のみ対応で、[https://www.switch-science.com/catalog/2700/ nekoboard2]はScratch 1.4と2.0に対応しています。[[BR]]
     6[[BR]]
     7まずnekoboardはArduino互換ボードなのでArduino IDEでファームウェアの書き込みができるようになっています。Arduino互換機のnekoboardはファームウェアを書き込む直前にFT232RLのDTRの信号をLにすることでリセットをかけています。[[BR]]
     8リセットがかかった直後のnekoboardはブートローダが起動してファームウェア(スケッチ)の書き込みが可能になります。[[BR]]
     9
     10この点を踏まえてScratch 1.4でnekoboardを使う際の挙動を書くと次のようになっています。[[BR]]
     11[[BR]]
     121. Scratch 1.4では接続したnekoboardのポート番号を手動で選びます。[[BR]]
     132. ポートが開くとDTRがONになります。[[BR]]
     143. DTRがONになるとnekoboardのリセットがかかり、ブートローダが起動します。[[BR]]
     154. しばらくするとブートローダが終了し、ファームウェア本体が起動します。[[BR]]
     165. Scratch 1.4からの信号を受信すると、nekoboardがセンサーの値を送り返します。[[BR]]
     176. Scratch 1.4上でセンサーの値が読み取れるようになります。[[BR]]
     18
     19ではScratch 2.0でnekoboardを使うとどうなるかを書くと、次のようになります。[[BR]]
     201. 拡張機能を追加でPicoBoardを選択します。[[BR]]
     212. Scratch 2.0では自動でポート番号を選択します。(一番小さいポート番号が選択されます。)[[BR]]
     223. ポートを開いて通信を開始します。ポートが開くとDTRがONになります。[[BR]]
     234. DTRがONになるとnekoboardのリセットがかかり、ブートローダが起動します。[[BR]]
     245. ブートローダが実行中にScratch 2.0からの信号が送られてきます。[[BR]]
     256. ブートローダ実行中にはセンサーの値を返信できません。[[BR]]
     267. 時間内にセンサーの値が送られてこないとScratch 2.0は一度ポートを閉じて、再び接続を試みます。[[BR]]
     278. 再びnekoboardにリセットがかかり、ブートローダが起動します。[[BR]]
     289. 以下繰り返しでリセットがかかってしまい、ファームウェア本体が起動しません。[[BR]]
     29[[BR]]
     30
     31この問題を解決するために、nekoboard2ではFT231XSのDTRの信号をリセット線から外してしまいました。[[BR]]
     32このことによりArduino互換機ではなくなってしまいました。[[BR]]
     33[[BR]]
     34(nekoboardでもブートローダ無しのファームウェアを書き込めばScratch 2.0対応できると思いますが、この場合もArduinoとしてファームウェアの書換ができない事には変わりありません。)[[BR]]
     35
     36
     37== 書き込まれているファームウェア ==
     38nekoboard2はArduino互換機ではありませんが、書き込まれているファームウェアはnekoboardのものをほぼそのまま使用しています。[[BR]]
     39つまりブートローダは書き込まれたままになっていますので、Arduino IDEでコンパイルが終わった直後にうまくリセットを書けることができればArduino IDEでファームウェアを書き換えることも可能です。[[BR]]
     40(J3と書かれたパッドのRESETとGNDをショートさせればリセットがかかります。)[[BR]]
     41
     42nekoboard2に書き込まれているファームウェアです。
     43{{{
     44// Scratch sensor board sketch for Arduino bootloader on Nekoboard2
     45// Switch-Science
     46// 2016/04/25
     47
     48int analogPin[4] = { A0,A1,A2,A3 };  // select the input pin for the general analog 0-4
     49int lightPin = A4;   // select the input pin for the sensor
     50int micPin = A5;     // select the input pin for the mic
     51int sliderPin = A6;  // select the input pin for the slide volume
     52int buttonPin = 2;   // select the pin for the button
     53
     54int sliderValue = 0; // variable to store the value coming from the slide volume
     55int lightValue = 0;  // variable to store the value coming from the light sensor
     56int micValue = 0;    // variable to store the value coming from the mic
     57int analogValue[4] = { 0,0,0,0};  // variable to store the value coming from the analog 0-4
     58const int firmware = 0x04; // Firmware virsion
     59
     60int senddata[18]={ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 };
     61
     62void setsenddata(int value,int channel) {
     63  int pos;
     64  byte highdata = 0;
     65  byte lowdata = 0;
     66  if (channel==15) {
     67    pos = 0;
     68  } else {
     69    pos = channel*2+2;
     70  }
     71  highdata = 0x80 | (channel<<3) | lowByte(value >>7);
     72  lowdata  = lowByte(0x7f & value);
     73  senddata[pos] = highdata;
     74  senddata[pos+1] = lowdata;
     75}
     76
     77void setup() {
     78  // declare the ledPin as an OUTPUT:
     79  pinMode(buttonPin,INPUT);
     80  digitalWrite(buttonPin,HIGH);  // プルアップのため
     81  Serial.begin(38400);
     82}
     83
     84void loop() {
     85  int i;
     86 // if(1){
     87  if (Serial.available() > 0) {     // 受信したデータが存在したら
     88    int inByte = Serial.read();     // 受信データを読み込む
     89    if (inByte == 0x0001) {         // 送られてきたデータが0x01だったら
     90      for (int i=0; i<18; i++) {
     91        Serial.write(senddata[i]);  // 用意されているセンサーデータを送信する
     92      }
     93    }
     94
     95    // read the value from the sensor:
     96    sliderValue = 1023 - analogRead(sliderPin);
     97    lightValue = analogRead(lightPin) - 15;
     98    if(lightValue < 0){
     99      lightValue = 0;
     100    }
     101    micValue = analogRead(micPin);
     102
     103    for (i=0; i<4; i++) {
     104      analogValue[i] = analogRead(analogPin[i]);
     105    }
     106
     107    // Make sending data
     108    for (i=0; i<16; i++) {
     109      switch(i) {
     110      case 0:
     111        // Ch0 Registance-D
     112        setsenddata(analogValue[3],0);
     113        break;
     114      case 1:
     115        // Ch1 Registance-C
     116        setsenddata(analogValue[2],1);
     117        break;
     118      case 2:
     119        // Ch2 Registance-B
     120        setsenddata(analogValue[1],2);
     121        break;
     122      case 3:
     123        // Ch3 Button
     124        if (digitalRead(buttonPin) == 1) {
     125          setsenddata(1023,3);
     126        }
     127        else {
     128          setsenddata(0,3);
     129        }
     130        break;
     131      case 4:
     132        // Ch4 Registance-A
     133        setsenddata(analogValue[0],4);
     134        break;
     135      case 5:
     136        // Ch5 Light
     137        setsenddata(lightValue,5);
     138        break;
     139      case 6:
     140        // Ch6 Sound
     141        setsenddata(micValue,6);
     142        break;
     143      case 7:
     144        // Ch7 Slider
     145        setsenddata(sliderValue,7);
     146        break;
     147      case 15:
     148        // Ch15 Firmware ID
     149        setsenddata(firmware,15);
     150        break;
     151      default:
     152        // Ch8-14 No operation
     153        break;
     154      }
     155    }
     156  }
     157}
     158
     159}}}
     160
     161
     162
     163
     164
     165
     166