「 脳トレゲーム対応制御学習ボード演習」の資料配布ページです。
2026年3月27日金曜日
脳トレゲームボードを使った制御演習 資料配布
2026年3月16日月曜日
3D造形部品のジョイント(接続)の改良
3D造形部品の接続の不具合
ジョイントの改良
2026年3月7日土曜日
脳トレゲーム対応制御学習ボード5 シリアル通信
プログラミングのデバッグ(プログラム修正)する方法です。一般的にマイコンでは内部で使っている変数の状態を表示する方法はありません。
Arduinoでは「シリアルモニタ」というシリアル通信機能があります。この機能を使うと、内部の変数状態を表示させることができます。
シリアル通信で接続する(準備)
シリアル通信で接続する(プログラミング)
int cnt=0;
void loop() {
Serial.printf("cnt: %4d\n", cnt);
cnt=cnt+1;
delay(500);
}
脳トレゲーム対応制御学習ボード4 ブザー制御
ブザーで音を出力するときには、右図のようなPWM(Pulse Wide Modulation)というONとOFFを繰り返して出力することで音が鳴ります。
繰り返す時間(ONとOFF1つ分の時間)を周期T[s]といいます。音の高さは周波数f [Hz]で表され、周期と逆数の関係になります。
音楽の「ドレミファソラシド」は右のような関係で周波数が決まっています。音を鳴らす関数 tone関数
音を鳴らす関数として「tone」関数が用意されています。
tone( 出力ポート , 周波数 , 時間[ms] );
設定値として、音を出力するポート番号、周波数、音を鳴らす時間[ms]を指定します。
スイッチSW1を押したときに、ド(523Hz)の音を1秒間鳴らす例を示します。
void loop() {
if(digitalRead(SW1)==0){
// ドの音を1秒(1000ms)鳴らす
tone( BUZZER, 523, 1000);
delay(1000);
}
}
tone関数は、命令処理後に、すぐ次の命令を実行します。このため、時間待ちdelayを入れます。
上の鍵盤の図では小数点以下の数字がありますが、tone関数の周波数は整数です(小数があっても無視されます)。
演習
(1)上の例題に追加して、スイッチSW2を押したときに「レ」の音を鳴らすように変更する。
void loop() {
if(digitalRead(SW1)==0){
// ドの音を1秒(1000ms)鳴らす
tone( BUZZER, 523, 1000);
delay(1000);
}
if( ){ // SW2を押したとき
// レの音(587Hz)を1秒(1000ms)鳴らす
}
}
(2)(1)にさらに追加して、SW1~SW6を使い、「ド」~「ラ」まで鳴らす電子オルガンを作成する。
(3)前回の投稿の「スイッチ制御」にtone関数を追加して、SW1を押したら「ド」を鳴らし数字「1」を表示するプログラムを作成する。
void loop() {
if(digitalRead(SW1)==0){
// ドの音を1秒(1000ms)鳴らす
tone( BUZZER, 523, 1000);
// 数字「1」を表示
delay(1000);
}
if( ){ // SW2を押したとき
// レの音(587Hz)を1秒(1000ms)鳴らす
}
}
(4)(3)に追加して、SW1~SW6まで対応させましょう。
脳トレゲーム対応制御学習ボード3 スイッチ制御
プログラム例では、「loop」関数部のみを示します。「loop」関数部以外は変更しないでください。
(1)if文
プログラムの制御を行うときに使う命令の一つが「if」文です。if文の基本は「if文のみ」と「if-else文」です。
「if文」の「条件1」が成り立つときに「処理1」を行う命令。
「if-else文」の「条件1」が成り立つときに「処理1」を行う、成り立たないときに「処理2」を行う命令。
があります。(2)スイッチSW1を押したら数字「1」を表示する。離しているときは数字「0」を表示する。
void loop() {
if(digitalRead(SW1)==0){
// 数字「1」を表示
digitalWrite(SEG_A, 0);
digitalWrite(SEG_B, 1);
digitalWrite(SEG_C, 1);
digitalWrite(SEG_D, 0);
digitalWrite(SEG_E, 0);
digitalWrite(SEG_F, 0);
digitalWrite(SEG_G, 0);
}else{
// 数字「0」を表示
digitalWrite(SEG_A, 1);
digitalWrite(SEG_B, 1);
digitalWrite(SEG_C, 1);
digitalWrite(SEG_D, 1);
digitalWrite(SEG_E, 1);
digitalWrite(SEG_F, 1);
digitalWrite(SEG_G, 0);
}
}
(3)スイッチSW1を押したら数字「1」を表示、スイッチSW2を押したら数字「2」を表示する。離しているときは数字「0」を表示する。
void loop() {
if(digitalRead(SW1)==0){
// 数字「1」を表示
digitalWrite(SEG_A, 0);
digitalWrite(SEG_B, 1);
digitalWrite(SEG_C, 1);
digitalWrite(SEG_D, 0);
digitalWrite(SEG_E, 0);
digitalWrite(SEG_F, 0);
digitalWrite(SEG_G, 0);
}else if(digitalRead(SW2)==0){
// 数字「2」を表示
digitalWrite(SEG_A, 1);
digitalWrite(SEG_B, 1);
digitalWrite(SEG_C, 0);
digitalWrite(SEG_D, 1);
digitalWrite(SEG_E, 1);
digitalWrite(SEG_F, 0);
digitalWrite(SEG_G, 1);
}else{
// 数字「0」を表示
digitalWrite(SEG_A, 1);
digitalWrite(SEG_B, 1);
digitalWrite(SEG_C, 1);
digitalWrite(SEG_D, 1);
digitalWrite(SEG_E, 1);
digitalWrite(SEG_F, 1);
digitalWrite(SEG_G, 0);
}
}(4)演習
a)スイッチSW1を押したら数字「1」を表示、スイッチSW2を押したら数字「2」を表示、スイッチSW3を押したら数字「3」を表示する。離しているときは数字「0」を表示する。
if( ){
// 数字「1」を表示
}else if( ){
// 数字「2」を表示
}else if( ){
// 数字「3」を表示
}else{
// 数字「0」を表示
}
2026年3月6日金曜日
脳トレゲーム対応制御学習ボード2 LED制御
(1)7セグメントLEDの「A」を点滅(Blink)する
LEDの点灯・消灯・点滅は基本となります。
void loop() {
digitalWrite(SEG_A, 1); delay(300);
digitalWrite(SEG_A, 0); delay(300);
}
「SEG_A」は前回のプログラムで、ポート「7」に定義されています。
このため、
digitalWrite(SEG_A, 1); // LED on
digitalWrite( 7 , 1);
(2)7セグメントLEDに「3」という数字を表示する
数字を表示するには、1つだけのLEDでなく、同時にすべてのLEDを点灯・消灯を出力します。数字「3」では、SEG A・B・C・D・Gを点灯、他を消灯します。
void loop() {
// 数字3を表示
digitalWrite(SEG_A, 1);
digitalWrite(SEG_B, 1);
digitalWrite(SEG_C, 1);
digitalWrite(SEG_D, 1);
digitalWrite(SEG_E, 0);
digitalWrite(SEG_F, 0);
digitalWrite(SEG_G, 1);
}
(3)7セグメントLEDに「3」と「7」の数字を交互に表示する
数字「3」を表示した後に、(1)で行ったように「delay」で時間待ちをします。その後、数字「7」を表示した後に時間待ちをします。
void loop() {
// 数字3を表示
digitalWrite(SEG_A, 1);
digitalWrite(SEG_B, 1);
digitalWrite(SEG_C, 1);
digitalWrite(SEG_D, 1);
digitalWrite(SEG_E, 0);
digitalWrite(SEG_F, 0);
digitalWrite(SEG_G, 1);
//数字7の表示
digitalWrite(SEG_A, 1);
digitalWrite(SEG_B, 1);
digitalWrite(SEG_C, 1);
digitalWrite(SEG_D, 0);
digitalWrite(SEG_E, 0);
digitalWrite(SEG_F, 0);
digitalWrite(SEG_G, 0);
delay(300);
}(4)演習
2026年3月5日木曜日
脳トレゲーム対応制御学習ボード1 setup関数部分
何を見るとわかるかというと、回路図です。右図が今回設計した「脳トレゲーム対応制御学習ボード」の回路図です。
例えば、7セグメントLEDの「A」端子は、ポート7に接続され、出力として使われることを意味します。
この表を基にして、初期設定のプログラミング(setup部分)ができます。
// ポート定義
#define SEG_A 7
#define SEG_B 9
#define SEG_C 10
#define SEG_D 8
#define SEG_E 2
#define SEG_F 11
#define SEG_G 5
#define SW1 12
#define SW2 6
#define SW3 0
#define SW4 1
#define SW5 3
#define SW6 4
#define BUZZER 16
#define SERIAL_RX 16
void setup() {
// シームレスモード設定
if (FLASH->STATR & (1 << 14)) NVIC_SystemReset();
SystemReset_StartMode(Start_Mode_BOOT);
pinMode(PD4, OUTPUT);
// PD1をGPIOとして利用する設定
pinV32_DisconnectDebug(PD_1); // Disable SWIO (the argument is not "PD1")
Serial.begin(9600);
pinMode(SERIAL_RX, OUTPUT); // シリアルRXをGPIOで使用
//ポート初期化
pinMode(SEG_A, OUTPUT);
pinMode(SEG_B, OUTPUT);
pinMode(SEG_C, OUTPUT);
pinMode(SEG_D, OUTPUT);
pinMode(SEG_E, OUTPUT);
pinMode(SEG_F, OUTPUT);
pinMode(SEG_G, OUTPUT);
pinMode(BUZZER, OUTPUT);
pinMode(SW1, INPUT_PULLUP);
pinMode(SW2, INPUT_PULLUP);
pinMode(SW3, INPUT_PULLUP);
pinMode(SW4, INPUT_PULLUP);
pinMode(SW5, INPUT_PULLUP);
pinMode(SW6, INPUT_PULLUP);
}
void loop() {
}
あとは、「loop」関数部分に、プログラミングすると、学習が始まります。
CH32V003マイコン7 脳トレゲーム製作
発注した基板が来たので、製作に取り掛かりました。
半田面の製作
UIAPudinoボードの改造
電池ボックスの取り付け
脳トレゲームを書き込み実行
LEDマトリックス表示装置の設計・製作 9(画像表示)
LEDマトリックスに画像を表示させるには、いろいろな画像形式を知る必要があります。現在、よく使われるJPG形式やPNG形式は圧縮処理されて保存されています。これに対して、BMP形式やTIFF形式は非圧縮形式で、画像データがそのまま保存されています。このため、ファイルは大きくな...
-
制御対象の動作確認(LED) 基板が完成したので、それぞれの制御対象が動作するかを確認します。プログラムはスケッチの例の「Blink」を基にしています。ポート番号の定義を変えて動作を確認します。 setup内の4行目から7行目に記述しているところがリセットボタンを「シームレス...
-
CH32V003マイコンの入手 だんだんと半導体の高騰する中で、何か安価で使えるマイコンは無いかと探していたところ、1月中旬頃、某中華サイトでCH32V003マイコンが1個100円程度で販売されていることを見て、注文しました。2月19日に届き、Arduino環境構築と簡単なL...
-
設計コンセプト 制御学習用のボードを設計するにあたり、次の点を考慮しています。 ・基本となるLED、スイッチ制御を組み入れる。 ・「光る」、「音が鳴る」、「動く」の動作を入れる。 ・制御学習が終わったら、ボードが無駄にならないようにする。 2項目の「動く」はモータなどが...















