SSブログ

Arduinoで「りんごをさっちゃん」スケッチ編 [Arduino]

「IchigoJam」は「こどもパソコン」ということで、サンプルプログラムの「りんごをさっちゃん」をArduino用に書き直すのは容易なことだと考えていました。
しかしサンプルプログラムにはコメントが1行目の「LINGO WO SACCHAN」しかなく、変数もBASIC版だと1文字しかなく、小学生がこのプログラムをみて勉強するのは厳しくないか?と思いました。
ということで、プログラムを読み解きながら、コメントをふんだんに付けてみました。
そのまえに、PanCakeを使うにあたってのとりあえず思いついた注意点をまとめてみます。

・PanCakeが起動するまで少し待つ
  起動前にシリアルデータを送っても処理してもらえない
  とりあえず1000ミリ秒待てば間違いなさそう(たぶん、もう少し短くてもいい)

・Arduinoのほうが高速
  IchigoJamはBASICでインタープリター
  Arduinoはコンパイルしたスケッチ
  サンプルプログラムの移植そのままだと速すぎる

・PanCakeに送る数値は2桁の16進数で
  数値データを2桁の16進数(2文字)にして送る
  sprintfで書式を作り数値を代入した文字列をつくり、それを送信するとか
char buf[96];
sprintf(buf, "PANCAKE SPRITE MOVE 00 %02X %02X", bx, 35);
Serial.println(buf);

  かなり適当なマクロを作るとか
// Convert to 2-digit hexadecimal number
#define F02X(d)  ((String)"0123456789ABCDEF"[(d)>>4 & 0x0f] \
                 +(String)"0123456789ABCDEF"[(d)    & 0x0f] ) 
    あるいは、
#define F02X(d)  (String((d)/16,HEX)+String((d)%16,HEX))

・数値は整数
  javascriptでは割り算の答えは(割り切れなければ)小数で出てくるけど、IchigoLatteではC言語の整数型と同様に小数点以下切り捨ての整数で返ってくる

こんな感じ。
lws.jpg

// LINGO WO SACCHAN for Arduino + PanCake
#define F02X(d)  ((String)"0123456789ABCDEF"[(d)>>4 & 0x0f] \
                 +(String)"0123456789ABCDEF"[(d)    & 0x0f] )   // 2-digit hexadecimal number form
uint8_t sx, f;                      // SACCHAN position, direciton (flip)
uint8_t bx;                         // bascket position
uint8_t rx, ry, rr;                 // apple position(x, y), rotation
uint8_t score, speed;

void setup() {
  pinMode(11, INPUT_PULLUP);        // SW [Left]
  pinMode(12, INPUT_PULLUP);        // SW [Right]
  sx = 36;  f = 0;  bx = sx + 7;    // initialize SACCHAN and bascket position, direciton (flip)
  rx = random(72); ry = 0; rr = 0;  // initialize apple position(x, y), rotation
  score = 0;  speed = 1;            // initialize score and speed
  delay(3000);                      // Wait for Pancake to stabilize
  Serial.begin(115200);             // initialize serial communications at 115200 bps
  Serial.println(F("PANCAKE RESET"));
  Serial.println(F("PANCAKE MUSIC SCORE 00 00 81 $C>C<EG"));
  Serial.println(F("PANCAKE MUSIC SCORE 01 00 80 RRRRR$RRRRRRRRCCDE~~~~EFED~~~~DEDC~~~~"));
  Serial.println(F("PANCAKE MUSIC PLAY 01"));
  Serial.println(F("PANCAKE SPRITE START 01"));
  Serial.println(F("PANCAKE SPRITE CREATE 00 5D"));   // 00:bascket (5D)
  Serial.println(F("PANCAKE SPRITE CREATE 01 1F"));   // 01:apple   (1F)
  Serial.println(F("PANCAKE SPRITE CREATE 02 0B"));   // 02:SACCHAN (0B)
  Serial.println(F("PANCAKE SPRITE CREATE 03 A6"));   // 03:number 0(A6)
  Serial.println(F("PANCAKE SPRITE MOVE 03 00 00"));  //    (tens place)
  Serial.println(F("PANCAKE SPRITE CREATE 04 A6"));   // 04:number 0
  Serial.println(F("PANCAKE SPRITE MOVE 04 08 00"));  //    (ones place)
}

void loop() {
  Serial.println("PANCAKE SPRITE MOVE 00 " + F02X(bx) + " 23" );    // 0x23=35(horizon)
  Serial.println("PANCAKE SPRITE FLIP 00 " + F02X(f)          );
  Serial.println("PANCAKE SPRITE MOVE 02 " + F02X(sx) + " 23" );
  Serial.println("PANCAKE SPRITE FLIP 02 " + F02X(f)          );
  Serial.println("PANCAKE SPRITE MOVE 01 " + F02X(rx) + " " + F02X(ry) );
  Serial.println("PANCAKE SPRITE ROTATE 01 " + F02X(rr)       );
  Serial.println("PANCAKE SPRITE CREATE 03 " + F02X(0xa6 + score / 10) );
  Serial.println("PANCAKE SPRITE CREATE 04 " + F02X(0xa6 + score % 10) );
  rr = (rr + 1) % 4;                // rotate apple
  ry = ry + random(speed + 1);      // falling apple
  if(35 < ry) {                     // When the apple reaches the horizon
    if((bx-4<rx)*(rx<bx+4)) {       // If the apple is in the basket ..
      score++;
      Serial.println(F("PANCAKE MUSIC SCORE 03 01 22 >>CE>C"));
    }
    if((sx-4<rx)*(rx<sx+4)) {       // If the apple hits SACCHAN ..
      Serial.println(F("PANCAKE SPRITE CREATE 02 08"));
      Serial.println(F("PANCAKE MUSIC PLAY 00"));
      Serial.println(F("PANCAKE MUSIC SCORE 03 01 40 <F~ED~<B>C~~~"));
      setup();                      // game over and restart
      return;
    }
    rx = random(72);  ry = 0;       // next apple
    speed = (score + 10) / 10;      // Speed up
  }
  delay(100);
  if( digitalRead(11) == LOW ) {  sx--; f=1;  bx=sx-7;  }   // move left
  if( digitalRead(12) == LOW ) {  sx++; f=0;  bx=sx+7;  }   // move right
}




PanCake
http://pancake.shizentai.jp/

IchigoCake
http://ichigocake.shizentai.jp/
タグ:pancake
nice!(0)  コメント(0)