みなさんの小学校の運動会ではスプーン競争はありましたか?
今回は micro:bit でスプーン競争のゲームを作ります。
指定した位置に点を表示する
前回の演習(LEDアレイ)と同じ機能ですが、使いやすい関数にしておきましょう。座標指定は中央のLEDを(0,0)として、(-2,-2)~(2,2)の座標を指定するものとします。ボールが落ちたことを知らせるために画面全体を点滅させる関数も作ります。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 |
#include <Adafruit_Microbit.h> Adafruit_Microbit_Matrix microbit; void setup() { microbit.begin(); } void showDot(int x, int y) { microbit.fillScreen(LED_OFF); //表示をクリア microbit.drawPixel(x+2, y+2, LED_ON); //中央が(0,0)なので座標を変換して表示する } void showCrash() { for(int i=0;i<5;i++){ microbit.fillScreen(LED_OFF); //表示をクリアする delay(200); microbit.fillScreen(LED_ON); //全体を塗りつぶす delay(200); } } void loop(){ for(int y=-2;y<=2;y++){ for(int x=-2;x<=2;x++){ showDot(x, y); delay(100); } } delay(500); showCrash(); delay(500); } |
センサーの感度を決める
次のプログラムは加速度センサーの演習で使ったプログラムから必要な部分だけを抜き出したものです。このプログラムを動作させて、センサー出力の値を観察して、スプーンからボールが落ちてしまう限界値を決めましょう。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 |
#include <LSM303AGR_ACC_Sensor.h> #include <LSM303AGR_MAG_Sensor.h> #define DEV_I2C Wire //Or Wire #define SerialPort Serial // Components. LSM303AGR_ACC_Sensor *Acc; void setup() { // Led. pinMode(13, OUTPUT); // Initialize serial for output. SerialPort.begin(9600); // Initialize I2C bus. DEV_I2C.begin(); // Initlialize components. Acc = new LSM303AGR_ACC_Sensor(&DEV_I2C); Acc->Enable(); } void loop() { // Led blinking. digitalWrite(13, HIGH); delay(50); digitalWrite(13, LOW); delay(50); // Read accelerometer LSM303AGR. int32_t accelerometer[3]; Acc->GetAxes(accelerometer); // Output data. SerialPort.print("| Acc[mg]: "); SerialPort.print(accelerometer[0]); SerialPort.print(" "); SerialPort.print(accelerometer[1]); SerialPort.print(" "); SerialPort.print(accelerometer[2]); SerialPort.println(" |"); } |
micro:bit を水平に(LEDの面が上を向くように)置いた状態でシリアルモニタで観察すると、accelerometer[2] がだいたい -950 くらいの値になっているので下向きの重力方向だと分かります。ということは、accelerometer[0] と accelerometer[1] が左右及び前後の傾きを示す値です。micro:bit を少し傾けて様子を見て、「-150~150 の範囲ならボールは落ちない」とすることに決めました。
ゲームの製作
上記の2つのプログラムを合体してスプーン競争ゲームを作ります。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 |
#include <LSM303AGR_ACC_Sensor.h> #include <LSM303AGR_MAG_Sensor.h> #include <Adafruit_Microbit.h> #define DEV_I2C Wire //Or Wire #define SerialPort Serial // Components. LSM303AGR_ACC_Sensor *Acc; // センサーの限界値 #define LIMIT 50 Adafruit_Microbit_Matrix microbit; void setup() { // Led. pinMode(13, OUTPUT); // Initialize serial for output. SerialPort.begin(9600); // Initialize I2C bus. DEV_I2C.begin(); // Initlialize components. Acc = new LSM303AGR_ACC_Sensor(&DEV_I2C); Acc->Enable(); // 表示ライブラリを初期化 microbit.begin(); } void showDot(int x, int y) { microbit.fillScreen(LED_OFF); //表示をクリア microbit.drawPixel(x+2, y+2, LED_ON); //中央が(0,0)なので座標を変換して表示する } void showCrash() { for(int i=0;i<5;i++){ microbit.fillScreen(LED_OFF); //表示をクリアする delay(200); microbit.fillScreen(LED_ON); //全体を塗りつぶす delay(200); } } void loop() { // Led blinking. digitalWrite(13, HIGH); delay(50); digitalWrite(13, LOW); delay(50); // Read accelerometer LSM303AGR. int32_t accelerometer[3]; Acc->GetAxes(accelerometer); // Output data. SerialPort.print("| Acc[mg]: "); SerialPort.print(accelerometer[0]); SerialPort.print(" "); SerialPort.print(accelerometer[1]); SerialPort.print(" "); SerialPort.print(accelerometer[2]); SerialPort.println(" |"); //センサーの値からx,yそれぞれの表示位置を決める。 int x = accelerometer[0]/LIMIT; int y = -accelerometer[1]/LIMIT; //実際に動かすとY方向が逆だと分かった if( x<-2 || 2<x || y<-2 || 2<y ){ // ボールが落ちた showCrash(); delay(3000); }else{ //ボールの位置のLEDを光らせる showDot(x,y); } } |
課題1
これまでに学んだ内容のまとめとして、micro:bitに搭載されたデバイスを使ってオリジナルのゲームまたは機能を作ってください。演習7で作ったシューティングゲームを拡張したり、ストップウォッチ、コンパス、万歩計などを作ってみるのも良いでしょう。
コメント