Arduinoで乱数(ランダム)を使ったサイコロ振りをシミュレーション!ビジュアルプログラミング(スクラッチベースmBlock)【Lesson19】
こんにちは、せでぃあ(@cediablog)です。
今回のArduinoプログラミングLESSON19では「乱数を使った、ランダム数値の生成」を行います。
規則性がなくランダムに出現する数値のことをいいます。
規則性のない数値を得られる身近なものとして、サイコロが挙げられます。
サイコロを振ると、1~6いずれかの目がランダムに出ます。
Arduinoプログラムでは、特定の命令語を記述することで指定した範囲の数値からランダムで値を抽出できます。
今回はその乱数制御プログラムを使って、液晶ディスプレイLCD1602に「5回サイコロを振って、出た目の合計を表示させる」プログラムの作り方を紹介します。
今回液晶ディスプレイLCD1602の制御はI2Cを使ったシリアル通信を使います。
I2C通信を使ったLECディスプレイ表示方法については、こちらの記事にて詳しく解説しています。
本記事は、プログラミングと電子パーツの知識が習得できるプログラミング初心者にも安心して読んでいただける内容になっています。
小学生、中学生も安心してプログラミングができるように、文字列を使わなビジュアルプログラミング方法についても動画付きで紹介しています。
文字列を使わずにブロックの組み合わせでプログラムが作れるので、ぜひチャレンジしてみてください!
本記事では、スクラッチベースのビジュアルプログラミングツールmBlockとArduinoIDEプログラムどちらのプログラミング方法も紹介しています。
無料のブロックプログラミングツールmBlockのインストール方法については、こちらの記事を参照してください。
- 乱数制御を使ったランダム数値の取り出し方
- Arduino IDEでのプログラミング方法
- mBlockを使ったビジュアルプログラミング方法
せでぃあはこんな人物です
✅プライム企業に勤める電気・機械設計エンジニア
✅親子の絆を深めるため、夏休みに子供と一緒に電子工作を製作
✅Arduinoプログラミングを用いて作ったプログラミング電子工作「信GO機」が市の発明くふう展で「優秀賞」を受賞
✅本ブログにてArduinoスクラッチプログラミングLESSON記事投稿中
✅YouTubeチャンネル「せでぃあブログちゃんねる」運営中
乱数を使ったサイコロ振りシミュレーション動作の説明
今回紹介する「乱数を使った、サイコロ振りシミュレーション動作」について説明します。
動作の説明
- ディスプレイに「roll the dce」と表示され、サイコロ振り操作待ちの状態になる。
- タクトスイッチ(押しボタン)を押すと、1~6の中からランダムな数値が5つ表示される。
- 5つの数値の合計がディスプレイ下段に表示される。
このように、タクトスイッチを押したらサイコロを5回振って、その合計値が表示されるシンプルでわかりやすい動作になっています。
- 乱数について
- LCDへの各サイコロ目と合計値の表示動作
- mBlockを使ったプログラミング方法
まずは動画を見て、今回のLESSONで実行させたい動作内容を確認してください。
また、mBlockを使ったブロックプログラミングや動作確認方法についても解説しています。
桃鉄で「のぞみカード」を使ったときを想像しながら、動作をお楽しみください!
桃鉄(桃太郎電鉄)は、サイコロを振って鉄道網を駆け巡る!家族全員で楽しめるゲームです。
乱数を使ったサイコロ振り動作の作り方
乱数を使ったサイコロ振り動作を実行させるために必要な作業を解説します。
今回は文字列を使ったプログラム形式と、文字列を使わないブロックプログラミング形式の両方について説明します。
あなたの作りたいプロブラム形式に対応した手順に応じて、対応してください。
プログラム形式に応じた開発環境
- 文字列による命令語形式 ⇒ ArduinoIDE
- スクラッチベースのビジュアル形式 ⇒ mBlock
プログラミング初心者の方は、ビジュアル方式がおすすめです!
プログラミングするために、パソコンが必要です。
電子部品等の必要な機器については、このあと説明します。
パソコンに統合開発ソフトウェア「ArduinoIDE」のインストールを行います。
Arduinoのセットアップ方法については、以下の記事にて詳しく説明しています。
Arduino IDEでの言語プログラミングも勉強したい方は、プログラミングの流れを理解しておいてください。
以下の記事にて、プログラミングから動作確認までの流れを詳しく説明しています。
mBlockでプログラミングする場合は、ArduinoIDEのインストールは不要です。
パソコンにスクラッチベースのビジュアルプログラミングツール「mBlock」のインストールを行います。
以下の記事にて詳しく説明しています。
ArduinoIDEでプログラミングする場合は、mBlockのインストールは不要です。
電子部品とジャンパーワイヤの差し込みだけで配線が可能です。
専用開発ソフトウェア「Arduino IDE」を使います。
私が作成したプログラムをコピペして使ってください。
Arduino IDEプログラミングの基本操作については、こちらの記事にて詳しく説明しています。
mBlockでプログラミングする場合は、ArduinoIDEプログラミングは不要です。
スクラッチベースのビジュアルプログラミングツールmBlockを使ってプログラムを作成します
プログラム内容については、後述するプログラミング例を参考にしてください。
ArduinoIDEでプログラミングする場合は、mBlockプログラミングは不要です。
プログラムが完成したら動作確認を行います。
- 液晶ディスプレイ上段に「roll the dice」が表示されるか?
- タクトスイッチを押すと上段に5つの数値が表示されるか?
- 液晶ディスプレイ下段に「合計値」が表示されるか?
乱数を使ったサイコロ振り動作回路で使うもの
今回は、LCDディスプレイをI2C通信で制御する方法を紹介した記事とまったく同じ使用機器と配線になります。
I2C通信を使ったLCDディスプレイ表示が初めての方は、こちらの記事から読んでいただけると理解がしやすいです。
- パソコン
- Arduino本体
- USBケーブル
- ブレッドボード
- タクトスイッチ
- 抵抗(1kΩ)
- LCD1602モジュール
- I2Cモジュール
- ジャンパー線(オスーメス)×4本
- ジャンパー線(オスーオス)×4本
今回はELEGOO社のスーパースターターキットに含まれる部品で作ることができますが、Arduino裏面のショート対策としてクリアケースも併せて準備することをおすすめします。
【おすすめ】コスパ最強のArduinoキットの中間グレードです!
パソコン
プログラムを作成するために必要です。
プログラム制御の演算はArduino側で行うため、パソコンのSPECは一般的なモデルで十分対応可能です。
パソコンのOSはWindows、Macどちらでも対応可能です。
Arduino本体【キット】
基本的なエディション「Arduino Uno」の互換機である、ELEGOO社のUNO R3を使用しています。
Arduino本体裏面のショート対策に、別売りのクリアケースの購入をおすすめしています。
各ソケットの役割など、Arduino本体の機能について以下の記事にて詳しく説明しています。
USBケーブル【キット】
パソコンとArduinoを接続してプログラムデータのやり取りをするために必要です。
ブレッドボード【キット】
たくさんの穴が開いていて、部品の端子を穴に差し込むだけで電気的に接続が可能な板です。
説明図は30列のショート版ですが、スーパースターターキットに含まれる63列タイプでも機能は同じです。
ブレッドボードだけの購入も可能です。
タクトスイッチ【キット】
今回の回路では、タクトスイッチ(押しボタンスイッチ)を使用します。
押しボタンは押されている間のみ、上記写真での2点が内部でつながります。
このようなボタンをモーメンタリボタンといいます。
今回は扱いませんが、ボタンから手を離してもONしたままになるボタンをオルタネイトボタンといいます。
モーメンタリ・オルタネイトボタンについては以下記事にて詳しく説明しています。
抵抗(1kΩ)【キット】
1kΩの抵抗を1本使用し、押しボタンスイッチに接続します。
抵抗を接続するのは、押しボタンがOFFのときにArduino本体がノイズによる誤検出することを避けるためです。
この記事では詳しく説明しませんが、ボタンを押していないのに押されたと誤認識されることを避ける目的であるということだけ覚えておいてください。
抵抗カラーコードの見分け方については、こちらの記事で詳しく説明しています。
LCD1602モジュール【キット】
液晶ディスプレイ「LCD(Liquid Crystal Display)」モジュールになります。
数字や文字などを表示させることが可能です。
I2Cモジュール
I2Cを使ってLCDを制御するために必要なモジュールです。
電源線2本と通信線2本の合計4本の配線だけで、LCDを制御することが可能になります。
I2Cモジュールはキットに含まれないため、別途購入が必要です。
ジャンパー線(オスーメス)【キット】
オス-メスジャンパー線を4本使用します。
I2CシリアルインターフェースボードとArduino本体を接続させるために使用します。
ジャンパー線(オスーオス)【キット】
ジャンパー線を4本使用します。
Arduino本体とブレッドボードの接続や、ブレッドボードの共通電源ライン(GNDまたは5V)からブレッドボード内の配線系統穴に差し込んで接続するのに使います。
スターターキットに含まれる機器に関しては、以下の記事にて詳しく紹介しています。
配線のやり方
上図が配線説明図となりますので、これと同じ配線をすれば完成します。
機器が故障するおそれがあるので、接続するプラスマイナス極性には十分注意して配線してください。
抵抗は極性がありませんので、どちら側のピンを挿入してもOKです。
機器故障させないためにも、USBケーブルを抜いた「通電OFF」状態にて配線を行ってください
プログラミングのやり方
本記事では、以下に示す「Arduino IDEプログラミング」と「mBlockプログラミング」の2通りのプログラミング方法について解説しています。
いずれか1つのプログラミング方法を用いることで、本LESSONの動作を行うことが可能です。
ArduinoIDE:文字列による命令語形式
mBlock:スクラッチベースのビジュアル形式
文字列を使わないmBlockの方が、直感的で分かりやすく小学生におすすめのプログラミング方法になります。
mBlockを使ってプログラミングをする方は、mBlockの説明まで読み飛ばしてください。
LiquidCrystal_I2Cライブラリのインストール
ArduinoIDEを使用した文字列プログラミングを行うためには、LiquidCrystal_I2Cライブラリのダウンロードとインストール作業が必要となります。
LiquidCrystal_I2Cライブラリのダウンロードとインストール方法を解説します。
mBlockでプログラミングをする場合は、本ライブラリインストール作業は不要です。
「Download ZIP」をクリックして、ZIPファイルをダウンロードします。
ArduinoIDEを開き、「スケッチ」⇒「ライブラリをインクルード」⇒「.ZIP形式のライブラリをインストール…」の順に選択して、STEP3でダウンロードしたZIPファイルを選択。
インストールが行われ、ライブラリインストール作業が完了となります。
Arduino IDEプログラミング
Arduino IDEとは統合開発ソフトウェアで、C言語のような文字列を用いたプログラミング方法です。
プログラミングするにあたり、ある程度の命令語を知っておく必要があります。
Arduino IDEのインストール方法については、以下の記事で詳しく説明しています。
日本語版のArduino公式リファレンスが記載されているので、関数を調べるときに重宝します!(私も所有しています)
プログラミング方法
Arduino IDEを使って、文字列プログラミングを行います。
Arduino IDEを使ったプログラミング~動作確認方法については、以下の記事で詳細説明しています。
Arduino IDEプログラム
/* 作品名:LESSON19A */
/* 作成者:せでぃあ https://cediablog.com */
/* 乱数を使ったサイコロ振りプログラム */
#include <LiquidCrystal_I2C.h> // ライブラリのインクルード
// LiquidCrystal_I2C型変数の宣言
LiquidCrystal_I2C lcd(0x27, 16, 2); // 0x27のアドレス,16列2行のLCDを使用
int BTN_SOCKET = 2; //タクトスイッチの入力ソケット番号
// サイコロの出目を格納するための変数
int dice1; //1回目のサイコロ出目
int dice2; //2回目のサイコロ出目
int dice3; //3回目のサイコロ出目
int dice4; //4回目のサイコロ出目
int dice5; //5回目のサイコロ出目
int total; //サイコロの出目の合計値
void setup() {
//プログラム起動時1回だけ処理される回路
//乱数の初期化
randomSeed(analogRead(0));
//入出力の割り当て
pinMode(BTN_SOCKET, INPUT); //2番ピンは入力として使用
//LCDディスプレイ表示
lcd.init(); // LCDの初期化
lcd.backlight(); // LCDバックライトの点灯
lcd.setCursor(0, 0); // カーソルの位置を指定(0文字目、上段)
lcd.print("roll the dice"); // 文字の表示
}
void loop() {
//プログラム起動後ループ処理される回路
if (digitalRead(BTN_SOCKET) == HIGH) { // 押しボタンが押されたらシーケンス開始
//STEP1:サイコロ振り1回目
lcd.clear(); //LCD表示クリア
lcd.setCursor(0, 0); // カーソルの位置を指定(1文字目、上段)
dice1 = random(1, 7); //サイコロの出目を格納
lcd.print(dice1); // 文字の表示
lcd.setCursor(0, 1); // カーソルの位置を指定(1文字目、下段)
lcd.print("TOTAL:"); // 文字の表示
delay(500); //0.5秒ウェイト
//STEP2:サイコロ振り2回目
lcd.setCursor(2, 0); // カーソルの位置を指定(3文字目、上段)
dice2 = random(1, 7); //サイコロの出目を格納
lcd.print(dice2); // 文字の表示
delay(500); //0.5秒ウェイト
//STEP3:サイコロ振り3回目
lcd.setCursor(4, 0); // カーソルの位置を指定(5文字目、上段)
dice3 = random(1, 7); //サイコロの出目を格納
lcd.print(dice3); // 文字の表示
delay(500); //0.5秒ウェイト
//STEP4:サイコロ振り4回目
lcd.setCursor(6, 0); // カーソルの位置を指定(7文字目、上段)
dice4 = random(1, 7); //サイコロの出目を格納
lcd.print(dice4); // 文字の表示
delay(500); //0.5秒ウェイト
//STEP5:サイコロ振り5回目
lcd.setCursor(8, 0); // カーソルの位置を指定(9文字目、上段)
dice5 = random(1, 7); //サイコロの出目を格納
lcd.print(dice5); // 文字の表示
//STEP5:サイコロ出目の合計算出
delay(500); //0.5秒ウェイト
lcd.setCursor(7, 1); // カーソルの位置を指定(8文字目、下段)
total = dice1 + dice2 + dice3 + dice4 + dice5; //5回分のサイコロ出目合計
lcd.print(total); // 文字の表示
while (digitalRead(BTN_SOCKET) == LOW) { // 押しボタンがOFFになるまで待機させる
}
}
}
上記がI2Cを使った、LCD表示制御回路のプログラムになります。
Arduino IDEのプログラム画面にコピーアンドペーストすることで、動作確認まで進めることができます。
各プログラム列の右側にプログラム内容をコメント記入してありますので参考にしてください。
乱数に関する命令語については、このあと詳しく説明していきます
命令語の解説
今回のプログラムで使用した命令文について、解説します。
変数のデータ型指定
変数のデータ型を指定するものです。
今回はピンソケット番号を代入するので整数を扱う「int型」を指定します。
またアナログ出力値は「0~255」の整数を扱いますので、同じく「int型」を指定します。
データ型 | 説明 | 扱える範囲 |
---|---|---|
int | 2バイトの整数を代入可能。 | -32768~32767 |
long | 4バイトの整数を代入可能 | -2,147,483,648~2,147,483,647 |
float | 4バイトの小数を代入可能。 | 3.4028235×1038~-3.4028235×1038 |
char | 1バイトの値を代入可能。文字列の代入に利用されます。 | -128~127 |
boolean | 0または1のみ代入可能。フラグのON-OFFなどに利用されます。 | 0,1 |
pinMode(入出力番号,INPUTまたはOUTPUT)
指定したデジタル入出力ソケット番号の機能を指示します。
入力として使用する場合は「INPUT」、出力の場合は「OUTPUT」を指定します。
if 文
条件が成立しているときのみ、{ }内の文が実行されます。
条件が成立しなければ、{ }内の文は処理されず、次の処理に移ります。
if( 条件 ){
条件成立時に実行する文 ;
}
digitalRead(入出力番号)
指定したデジタル入出力ソケット番号の状態がON、またはOFFであるか確認します。
ONのときは「HIGH」、OFFのときは「LOW」の値が返ってきます。
while 文
( )内の条件が成立している間は、{ }内の文を繰り返し実行します。
while( 条件 ){
繰り返し実行する文 ;
}
乱数に関する命令語の解説
今回のメインテーマである乱数=ランダム値の抽出の命令方法について解説します。
今回は2つの関数を使用していますので、1つずつ詳しく説明していきます。
random(min , max)
minからmax-1の連続した整数から、無作為に1つの数値(long型)を取り出します。
1~6からランダムで1つの整数を取り出す場合
random(1 , 7) ;
このように最大値を6にしたい場合は、+1した値「7」を記述する点に注意が必要です。
randomSeed(seed)
実はプログラム実行直後の乱数生成順序は決まっています。
「おみくじ」や「じゃんけん」プログラムなどでは、乱数生成順が決まっていると面白くなくなってしまいます。
そこで活躍するのがこの「ramdomSeed関数」です。
ランダム数値生成の種となる値を「ランダム値」にすることで、真に無作為な数値を生成させることができます。
乱数の初期値をランダムにする方法
//乱数の初期化
randomSeed(analogRead(0));
Arduinoのアナログ入力ピン「A0」を使った、乱数の種をランダム値にする方法を使います。
A0ピンには何も接続しない状態にしてください。
何も接続されていなくても、A0ピンのアナログ入力値が常に変動しているためこの方法が使えます。
実際にアナログ入力値がどう変化しているのか確認したい場合は、シリアルモニタに出力して確認してみてください。
シリアルモニタにアナログ値を表示させる方法は、こちらの記事で詳しく紹介しています。
LiquidCrystal_I2Cライブラリの説明
今回はLCD1602の制御をするために、「LiquidCrystal_I2Cライブラリ」を使用します。
このライブラリを使うだけで、簡単にLCD表示を制御できます。
LiquidCrystal_I2Cライブラリの読み出し
プログラム冒頭の宣言部にてLiquidCrystalライブラリを読み出します。
#include <LiquidCrystal_I2C.h>
LiquidCrystal型変数の指定
プログラム冒頭の宣言部にてLiquidCrystal_I2C型の変数を定義します。
LiquidCrystal_I2C lcd(I2Cアドレス, 桁数, 行数)
変数「lcd」は例であり、任意の変数文字列を指定してください
init()
LCDの表示内容をクリアし、カーソルを左上に移動させます。
lcd型変数.init
clear()
LCDの表示内容をクリアします。
lcd型変数.clear()
setCursor(桁 , 行)
カーソル位置を指定します。テキスト表示開始位置を指定することができます。
lcd型変数.setCursor(桁、行)
桁は左端が「0」、行は上段が「0=1行目」になります。
print(“表示させたい文字列”)
LCDに文字列を表示させます。
lcd型変数.print(“表示させたい文字列”)
backlight()
LCDバックライトを点灯させます。
lcd型変数.backlignt()
プログラミング初心者の方に、おすすめなArduinoの参考書を紹介しています!
mBlockプログラミング
ここからは、mBlockを使ったプログラムの作り方を解説します。
- デバイスにArduino Uno R3を追加する
- 接続モードを「アップロードモードON」にする
- mBlockプログラムを作成する
- プログラムをArduino本体に転送する
これらの基本操作方法については、こちらの記事を参照してください。
動画を参考にプログラミングしてみよう
randomSeed関数ブロックの追加方法
mBlockでは乱数生成ブロックは標準で準備されていますが、randomSeed関数ブロックは拡張ブロックとして追加する必要があります。
mBlockを開いて、拡張ボタンをクリックします。
検索窓に「random」と入力します。
RandomSeedと書かれた拡張ブロックを追加します。
randomSeedブロックが追加され、プログラムに使用可能となります。
I2Cを使ったLCD制御ブロックの追加方法
LCDを制御(LCD画面クリア、カーソル位置を指定、LCDへの文字列表示など)するために必要な、専用ブロックを追加する必要があります。
mBlockを開いて、拡張ボタンをクリックします。
検索窓に「i2c」と入力します。
I2Cを使ったLCD制御用の拡張ブロックを追加します。
I2Cを使ったLCD制御ブロックが追加されます。
mBlockを使ったプログラム内容
今回は「アップロードモード オン」でのプログラム作成例を紹介しています。
プログラム開始条件が「Arduino Unoが起動したとき」になっている点に注意してください。
mBlockでは、乱数のMAX値が抽出範囲のMAXとなる点に注意が必要です。
Arduinoプログラムに変換されるときにMAX値は自動で+1記述されます。
以下のプログラムが動作プログラムになります。
mBlockのArduino専用ブロックについては、こちらの記事にて詳しく説明しています。
動作確認方法
- 液晶ディスプレイ上段に「roll the dice」が表示されるか?
- タクトスイッチを押すと上段に5つの数値が表示されるか?
- 液晶ディスプレイ下段に「合計値」が表示されるか?
上記項目について確認していきましょう。
液晶ディスプレイ上段に「roll the dice」が表示されるか?
プログラムの演算が開始されたら、LCDディスプレイの上段に「roll the dice(サイコロを振ってください)」が表示されていることを確認してください。
LCDディスプレイのバックライトが点灯状態であることを併せて確認してください。
タクトスイッチを押すと上段に5つの数値が表示されるか?
「roll the dice」が表示された状態で、タクトスイッチを押してください。
LCDディスプレイの上段にて、1~6のうちのどれかの数値が5つ表示されます。
ディスプレイの左から0.5秒おきに1つずつ表示されます。
液晶ディスプレイ下段に「合計値」が表示されるか?
LCDディスプレイの上段に5つの乱数が表示されたら、ディスプレイ下段の「TOTAL:」の右側に合計値が表示されます。
上段に表示されている5つの数字の合計と、表示値があっているか確認してください。
計算値が正しいか?確認してくださいね。
乱数の値は簡単に生成できる!(まとめ)
- 乱数はランダムに抽出した整数値
- random関数を使うときは指定するmax値に注意
- 拡張ブロックを追加することでmBlockでもrandomSeed関数が使用可能
小学生のお子様には断然、ブロックプログラミングがおすすめです!
mBlockはブロックのドラッグアンドドロップで簡単にプログラミングができます!
小学生のプログラミング学習におすすめな、mBlockが使えるプログラミングロボットを紹介しています。
最後まで読んでいただき、ありがとうございました。
子供の成長を育む!小学生のお子様にぴったりなプログラミング教室が見つかるように厳選しました!
Arduinoスクラッチプログラミングのおすすめ参考書について詳しく説明しています。
Arduinoプログラミング(スクラッチも)を使った電子工作を紹介しています。
コメント