概要
小学生の計算カード(足し算引き算や九九など)を「ハードウェア作品投稿キャンペーン」でマルツさんから頂いたM5StickCで作ってみました。問題を自動生成・表示しボタンを押すと答えを表示、を延々と繰り返します。
使用したモジュール
(※M5StickCはEOLになっておりますので、手に入らないときはM5StickC Plusで代用)
https://www.marutsu.co.jp/pc/i/2190748/
開発環境
開発環境は、Arduino IDEで行いました。
実装したこと
- 起動時にBボタン(横にあるボタン)とAボタン(正面のM5ボタン)で計算カードの選択
- 乱数で問題の自動生成・表示
- Aボタンで答えの表示、1秒待って次の問題表示
- 問題表示中にBボタンで計算カード選択画面に戻る
- 1年生用(足し算・引き算)と3~4年生用(二桁足し算・割り切れる割り算)を作成
スケッチ
足し算・引き算のスケッチ
#include <M5StickC.h>
int s ;
void setup() {
M5.begin();
M5.Axp.ScreenBreath(10); // 画面の輝度を少し下げる
M5.Lcd.setRotation(1); // 0縦正方向, 1左に画面, 2縦逆, 3右に画面
M5.Lcd.setTextSize(2); // 文字サイズを3にする
M5.Lcd.fillScreen(BLACK); // 背景を黒にする
M5.update();
M5.Lcd.setCursor(3, 3, 2);
M5.Lcd.print(" (+)^^, (-)>"); //足し算・引き算の選択表示
//ボタン入力待ち(while文中にM5.update()を入れないと状態が更新されない)
while (M5.BtnA.wasPressed() != true && M5.BtnB.wasPressed() != true) {
M5.update();
}
if (M5.BtnA.isPressed()) {
s = 0;
}
if (M5.BtnB.isPressed()) {
s = 1;
}
}
void loop() {
M5.Axp.ScreenBreath(10);
M5.Lcd.setRotation(1);
M5.Lcd.setTextSize(3);
M5.Lcd.fillScreen(BLACK);
M5.update();
//引き算(20までの数引く一桁)
if (s == 0) {
int i = random (19) + 1;
int j = random (9) + 1;
int k = i - j;
if (k <= 0) {
return;
}
M5.Lcd.setCursor(3, 3, 2);
M5.Lcd.print(i);
M5.Lcd.print("-");
M5.Lcd.print(j);
M5.Lcd.print("=");
while (M5.BtnA.wasPressed() != true && M5.BtnB.wasPressed() != true) {
M5.update();
}
if (M5.BtnA.wasPressed()) {
//M5.Lcd.setCursor(110, 5, 2);
M5.Lcd.print(k);
delay (1 * 1000);
}
if (M5.BtnB.wasPressed()) {
esp_restart() ;
}
}
//足し算(一桁足す一桁)
if (s == 1) {
int i = random (9) + 1;
int j = random (9) + 1;
int k = i + j;
M5.Lcd.setCursor(5, 5, 2);
M5.Lcd.print(i);
M5.Lcd.print("+");
M5.Lcd.print(j);
M5.Lcd.print("=");
while (M5.BtnA.wasPressed() != true && M5.BtnB.wasPressed() != true) {
M5.update();
}
if (M5.BtnA.wasPressed()) {
//M5.Lcd.setCursor(100, 5, 2);
M5.Lcd.print(k);
delay (1 * 1000);
}
if (M5.BtnB.wasPressed()) {
esp_restart() ;
}
}
}
二桁足し算・割り算のスケッチ
#include <M5StickC.h>
int s ;
void setup() {
M5.begin();
M5.Axp.ScreenBreath(10); // 画面の輝度を少し下げる
M5.Lcd.setRotation(1); // 0縦正方向, 1左に画面, 2縦逆, 3右に画面
M5.Lcd.setTextSize(2); // 文字サイズを3にする
M5.Lcd.fillScreen(BLACK); // 背景を黒にする
M5.update();
M5.Lcd.setCursor(3, 3, 2);
M5.Lcd.print(" (+)^^, (/)>"); //足し算・割り算の選択表示
while (M5.BtnA.wasPressed() != true && M5.BtnB.wasPressed() != true) {
M5.update();
}
if (M5.BtnA.isPressed()) {
s = 0;
}
if (M5.BtnB.isPressed()) {
s = 1;
}
}
void loop() {
M5.Axp.ScreenBreath(10);
M5.Lcd.setRotation(1);
M5.Lcd.setTextSize(3);
M5.Lcd.fillScreen(BLACK);
M5.update();
//割り算(割り切れる二桁割る一桁)
if (s == 0) {
int i = random (89) + 11;
int j = random (8) + 2;
int k = i % j;
if (k != 0) {
return;
}
int l = i / j;
M5.Lcd.setCursor(3, 3, 2);
M5.Lcd.print(i);
M5.Lcd.print("/");
M5.Lcd.print(j);
M5.Lcd.print("=");
while (M5.BtnA.wasPressed() != true && M5.BtnB.wasPressed() != true) {
M5.update();
}
if (M5.BtnA.wasPressed()) {
M5.Lcd.setTextSize(2); // 文字サイズを2にする
M5.Lcd.setCursor(100, 42, 2);
M5.Lcd.print(l);
delay (1 * 1000);
}
if (M5.BtnB.wasPressed()) {
esp_restart() ;
}
}
//足し算(二桁足す二桁)
if (s == 1) {
int i = random (88) + 11;
int j = random (88) + 11;
int k = i + j;
M5.Lcd.setCursor(3, 3, 2);
M5.Lcd.print(i);
M5.Lcd.print("+");
M5.Lcd.print(j);
M5.Lcd.print("=");
while (M5.BtnA.wasPressed() != true && M5.BtnB.wasPressed() != true) {
M5.update();
}
if (M5.BtnA.wasPressed()) {
M5.Lcd.setTextSize(2); // 文字サイズを2にする
M5.Lcd.setCursor(100, 42, 2);
M5.Lcd.print(k);
delay (1 * 1000);
}
if (M5.BtnB.wasPressed()) {
esp_restart() ;
}
}
}
実際に使ってみて
子供たちは最初はゲーム感覚で楽しんでやってましたが、すぐ飽きました(笑)。音声認識で答えの正誤判定が実装できたらいいなぁと思ってます。
投稿者の人気記事
-
SJK
さんが
2021/11/16
に
編集
をしました。
(メッセージ: 初版)
ログインしてコメントを投稿する