[小中学生向け] マイコン・ルーレットを作ろう

投稿者: | 2020年3月26日

Building an electronic roulette by Arduino.

おうちで遊ぼう、勉強しよう!

今日は少し趣向を変えて、子供向けの「電子ルーレット」の製作です。ちょうど春休みですし、件の外出自粛ということもあるので、トライしてみてはいかがでしょうか。必要な部品やソフトは全てネットで手に入ります。ハンダ付けや工具は使わないので、お子さんと一緒に作業しても安心です!

オジサンオバサンのための昔ばなし(読まなくていいです 🙂 )

私が小学生の頃、エレキットと呼ばれる電子工作キットのシリーズがあって、いろんな種類のキットが売られていました。水色のケースに透明なカバーをかぶせたような形状をしていて、スピーカーやスライドスイッチ用の穴開けなどを子供でも簡単にできるようになっている、非常に秀逸な製品でした。私と同年代(1970年程度生まれ)の東京近郊にお住まいで、秋葉原などに通われた工作好きの少年少女であれば、御記憶の方も多いのではないかと思います。(Google で検索すると「これかな?」と思われるものを見つけられると思います。写真の版権がよく分からないので、また、オークションの出展は消えてしまう可能性が高いので、リンクは張っていません。)

そのエレキットシリーズの中に、電子ルーレットというものがありました。1980年頃の製品で 1,000〜2,000円程度だった思います。その程度の価格ですので、もちろんマイコンが入っていたりはしません。それより、当時の子供向け電子キットでは、マイコンを使ったものは皆無と言って良いでしょう。マイコンは当時、まだまだ非常に高価なものだったからです。(数万円程度?)

いま想像しますと、そのエレキットの電子ルーレットは、7400 系 TTLでバイナリカウンタを構成し、抵抗とコンデンサなどで発振回路を入力として、16個程度の LED がクルクルと回るようになっているものでした。私の記憶の中では、比較的楽しいキットとして思い出されます。

そんな訳で、今回は電子ルーレットを作ってみることにしましょう。ただし、いま風に Arduino(アルデュイーノ)マイコンボードを使って製作してみたいと思います。

必要な部品

必要な部品は以下の通りです。(部品を個別に買う場合は、以下をお店の人に見せれば大丈夫です。お子さんへのお願い: お店の人は忙しいと思うので、ちゃんとお礼を言いましょう!)

  • Arduino Uno(あるいは 5V(ボルト)タイプの同等品) … 1台
  • LED(発光ダイオード。スルーホールといって 2本のピンが出ている普通のタイプのもの。いろんな色で揃えると綺麗ですが、色によって若干価格が違います)… 8個
  • 330オーム(Ω)程度の抵抗器(スルーホール。何ワット(W)のタイプでも良いが、今回は 1/6W のものを使用。許容差は何パーセントのものでも良いが、一番入手しやすいのは 5%のもの)… 8個
  • 押しボタンスイッチ(ブレッドボードに刺さるもの)… 1個
  • 小型のブレッドボード(このページ下のほうにある写真参照) … 1個
  • 各種のジャンパ線(20〜30センチ程度の長さもの。最低でも 20本)

あると便利なもの(無くても大丈夫)

  • マスキングテープ(ホームセンターで売ってますが、セロテープでも良いです)
  • ピンセット(指の太い大人には便利)
  • 虫メガネ、あるいは老眼鏡 🙂

以下は買う必要はないと思います。自宅にあるものを活用してください。なお私は試したことがありませんが、もし Raspberry Pi(ラズパイ)をお持ちであれば、パソコンの代わりに利用できるかも知れません。

  • パソコン(Windows, Mac あるいは Linux) … 1台
  • パソコンと Arduino を繋ぐ USB ケーブル … 1本

なお、電子部品屋さん(共立エレショップや秋月電子通商など)で個別の部品を買っても良いですが、いろんな部品がセットになっているものを購入するのが良いでしょう。

私のお勧めは、米国 SparkFun 社製の SparkFun Inventor’s Kit – v4.1 です。日本にも発送してくれますが、面倒な方は日本のアマゾンで SparkFun Inventor’s Kit と探せば(形式がやや古いものですが)出てきます。1万円程度のものならば良心的です。高価なものしか見つからない場合は、米国から個人輸入したほうが良いでしょう。なお、Inventor’s Kit(発明家キット)を個人輸入する場合には、次のような短いジャンパ線も買っておくと重宝します。

これは、ブレッドボード上の短い配線に便利です。

米国から Inventor’s Kit を個人輸入する場合は、送料が US$26〜38程度かかります(2020年3月現在)。若干高価ですが、荷物のトラッキングができる FedEx, UPS などが安心でしょう。以下、注文画面の引用です。

あ、ちなみにマニュアルは英語(誰でもダウンロード可)ですが、子供向けに書かれており、写真や図版も多く、そんな難しい内容ではないので(たぶん)大丈夫です。

まずは配線

たぶんここが一番面倒ですが、やりがいのある部分だと思います。

工作にはブレッドボードというものを使います。ブレッドボードに LED と押しボタンスイッチだけを搭載した図を以下に示します。なお、これは配置を確認したかったためであり、本当は、LED は最後に載せるのが楽です。いや、一度 LED を全て搭載しておき、LED を抜き差ししながら他の部品やジャンパ線を差していくのが分かりやすいでしょう。

ブレッドボードには実は秘密(?)があり、部品を差すための穴がただ開いている訳ではなく、数字が振られているピンは(この写真で言うと)上下が電気的に繋がるように結線されています。たとえば 1という名前の付いたピンのうち、a – b – c – d – e の 5つの穴の内部はブレットボードの中で互いに配線されており、また、f – g – h – i – j もそれぞれ配線されています。ただし、e と f の間は配線されていません。これは、1だけでなく、2〜30も全て同様です。また、水色のマイナスと描かれたピンは(この写真で言うと)左右に全て結線され、赤色のプラスも左右に結線されています。ただし、写真上側のマイナスと写真下側のマイナスの間は結線されていないので、必要に応じて自分で線を繋ぐ必要があります。これは、マイナスだけでなくプラスも同様です。

加筆(2020/4/10)

透明なブレッドボードを手に入れました。中の配線がよく分かりますね!(写真をクリックすると拡大できます。)

  

なお、LED の色の順番は好きな通りで結構ですが、LED の端子(足、あるいはピンとも呼ぶ)にはプラス・マイナスの極性があるので注意しましょう(正式にはアノード・カソードと呼ぶ)。LED のピンの長いほうがプラスで、短いほうがマイナスです。以下の説明では、ピンの長いプラスのほうを、常に写真上の左側に差しています。(つまりマイナスのピンが右側)

余談: 足が長すぎるなあ、と思ってペンチやニッパで切断してしまうと、どっちがプラスだか分からなくなるので注意しましょう。もっとも、プラス・マイナスを間違えても光らないだけで、壊れてしまうことは「まず」ないので、光らなかったら逆に差し替えれば OK です。

それに対して、抵抗器のほうには極性はありませんので、好きな向きに繋いで大丈夫です。几帳面な方は、色のリング(抵抗器のカラーコードと言います)の向きを合わせたほうが、見た目が良いかも知れません。

最初に、私が配線した実態図を示します。ジャン。(クリックすると拡大できます)

今回はピンの長さを切り詰めてませんが、たとえば夏休みの工作など、展示作品などとする場合には、ピンを必要な長さに切り詰めたほうが接続が安定します。(切断したピンを足で踏んだりするとケガの原因になりますので、作業机を整頓して、切断した屑はきちんと袋に収めるなどして捨てましょう。)

また、ピンが長いままだと他の配線とショート(短絡)する可能性もありますので、ショートがないかどうか、よく目視でチェックしましょう。

抵抗器のリード線(足)が細くて分かりづらいので、参考のため CAD で描いた実態図も示します。

LED を円周状に並べると抵抗器や配線が隠れて分かりづらくなるので、わざと円周でなくしています。また、「ピン 2」などというのは、Arudino ボードの DIGITAL ピンの番号に合わせて繋いでください(ボードの表面に DIGITAL – PWM〜 と印刷されていると思います)。GND も、Arduino の GND というピンに繋ぎます。GND とは ground(接地あるいはアースの意味)の略で、グラウンドと読みますが、実際にアースしたりはしません。

配線の理屈(はいせんのりくつ)

お子さんが読むかも知れないので、ふりがなを振ってみました。 🙂

ここまで読んで「図が見づらい。結局、どういう理屈で配線したら良いの?」という疑問をお持ちの方もあるかと思いますので、ポイント(理屈)をまとめます。

まず LED についてです。LED を Arduino マイコンで光らせるためには、Arduino の DIGITAL というピンに LED を繋ぐ必要があるのですが、ただ繋ぐだけでいけません。以下のルールを守ってください。(なお、専門的には今回は「ソース電流で LED をドライブする方法」を説明します。他の記事などでは「シンク電流」でドライブしているものもありますので、「いろんな方法があるんだ」と御理解いただければ OK です。)

  • LED には向き(極性)があります。プラス側が Arduino の DIGITAL ピンの方を向くように配線します。
  • LED のマイナス側は、Arduino ボードの GND の方を向くように配線します。
  • LED には必ず直列に抵抗器を繋いであげます。
  • 抵抗器は、LED のプラス側にあっても、マイナス側にあっても、どちらでも大丈夫です。つまり、Arduino の DIGITAL ピン → 抵抗器 → LED → Arduino の GND、でも良いですし、DIGITAL ピン → LED → 抵抗器 → GND、でも大丈夫です。

この抵抗器は、LED に流れる電流(つまり電気)の量を制限してあげる働きがあります。抵抗器を繋がなくてもたぶん光りますが、Arduino や LED を壊してしまう可能性があるので、必ず抵抗器を入れるようにしてください。

次に押しボタンスイッチです。押しボタンスイッチには端子が通常 4つありますが、この 2つずつがペアとなっていて、ボタンを押したときに端子の間が繋がるようにできています。SparkFun 社のキットなどでは、ブレッドボードに挿入したときに正しく結線できるようになっているので、上記の図のように配線すれば心配しなくて大丈夫です。端子の一方を Arduino の DIGITAL ピン(今回は 2番ピン)に繋ぎ、もう一方を GND ピンに接続します。(技術的には「押しボタンスイッチを押したときに Arduino の入力ピンを GND に落とす負論理で接続し、Arduino の入力回路の内部プルアップを有効にする」となりますが、これも「いろいろな方法があるらしい」と御理解頂ければ OK です。)

Arduino のプログラム作成

Arduino(アルデュイーノあるいはアルドゥイーノと呼びます)というのはマイコン(マイクロ・コンピュータ)ボードの名前です。電子基板の上に黒いゲジゲジ IC(アイシー)が乗っていて、プログラムを作成して書き込んであげると、いろんな働きをするようになります。ゲジゲジ IC の中には、皆さんがよく御存知の SD カードや USB メモリと同様に「ROM(ロム)」という技術が入っていて、プログラムを内部に保管できるようになっているのです。

コンピュータの性能としては、このようなマイコンよりもスマートフォンやパソコンのほうがずっと高性能なのですが、マイコンボードの特徴は、電子工作のための端子(ピン)が設けられていて、今回のように LED やスイッチ、あるいはいろんなセンサ(温度, 湿度など)やアクチュエータ(モーターなど)を繋ぐことができることです。

Arduino のプログラムを作成するには、パソコンの力を借りる必要があります。そのためのソフト(Arduino IDE)をインストールしましょう。巷に多くの説明サイトがあるので、ここでは省略します。Google などで「arduino インストール」と検索して、指示に従ってください。なお、Arduino の本家ウェブサイトはこちらです。Arduino IDE をダウンロードするときに募金の画面が出ますので、余裕のある方は協力してあげると良いでしょう。

最後に、Arduino の電子ルーレットのプログラムを以下に挙げておきます。

/*
 * Arduinoルーレット
 *
 * Atsushi Yokoyama
 * ファームロジックス(https://flogics.com)
 */

int button = 2;     // 押しボタンのピン番号
int n_leds = 8;     // LEDの数
int leds[] = {3, 4, 5, 6, 7, 8, 9, 10};     // LEDのピン番号

void setup() {
  pinMode(button, INPUT_PULLUP);

  for (int i = 0; i < n_leds; i ++) 
    pinMode(leds[i], OUTPUT);
}

int pos = 0;        // いま光っているLEDの番号
int speed = 0;      // 回るスピード(最初は止まっている)

void loop() {
  /*  
   * posのところのLEDを点ける(それ以外は消す)
   */
  for (int i = 0; i < n_leds; i ++) {
    if (i == pos)
      digitalWrite(leds[i], HIGH);
    else
      digitalWrite(leds[i], LOW);
  }

  if (digitalRead(button) == LOW)   // ボタンを押していたら
    speed = 20;                     // スピードを一番早くする

  if (speed > 0) {                  // speedが0でないとき
    delay(1000 / speed);            // スピードに応じて待つ

    speed -= 1;                     // スピードを少し下げる

    if (++ pos >= n_leds)           // posを隣のLEDに動かす
      pos = 0;                      // n_ledsになったら0に戻す
  }
}

いかがでしょうか。これを動かすと、最初は LED が止まっていますが(最初の LED だけ点灯)、ボタンを押すとルーレットのように回り始めます。ボタンから手を離すと、少しずつスピードが落ちて止まります。

ちょっとした修正版(2020/12/4)

この投稿を御覧頂いた方からお問い合わせを頂きました。御興味持って頂いて、とても嬉しいです。

お問い合わせの内容は、「一度ボタンを押したら回転を始めて、もう一度押したら止まるようにしたい」というものでした。ちょっとプログラムが複雑になりますが、修正版を作ってみましたので御参考ください。

変更のポイントは、ボタンが押された瞬間に、ルーレットの動作モードを「停止→回転」、「回転→停止」と切り替えるようにすることです。これを技術用語で「状態遷移」と呼びます。

また、電気接点を使ったスイッチでは、スイッチを入れたり切ったりしたとき(ボタンスイッチを押したり離したりしたとき)に、接点のオン・オフが高速に切り替わってしまう「チャタリング」という現象があります。今回のプログラムではシリアルモニタへの文字出力により自然にウェイトが入るので、チャタリングの可能性は低いのですが、念のため防止策(delay(10))を入れてあります。

/*
 * Arduinoルーレット(修正版)
 *
 * Atsushi Yokoyama
 * ファームロジックス(https://flogics.com)
 */

enum mode {         // ルーレットの動作モード
  MODE_STOP,        //   止まっている
  MODE_RUN          //   回っている
};

int button = 2;     // 押しボタンのピン番号
int n_leds = 8;     // LEDの数
int leds[] = {3, 4, 5, 6, 7, 8, 9, 10};     // LEDのピン番号

void setup() {
  Serial.begin(9600);
  pinMode(button, INPUT_PULLUP);

  for (int i = 0; i < n_leds; i ++)
    pinMode(leds[i], OUTPUT);
}

int pos = 0;                      // いま光っているLEDの番号
int speed = 0;                    // 回るスピード(最初は止まっている)
int last_button = HIGH;           // 前回のボタンの状態
enum mode cur_mode = MODE_STOP;   // 現在のルーレット動作モード

void loop() {
  /*
   * posのところのLEDを点ける(それ以外は消す)
   */
  Serial.print("LED pos: ");
  Serial.println(pos);

  for (int i = 0; i < n_leds; i ++) {
    if (i == pos)
      digitalWrite(leds[i], HIGH);
    else
      digitalWrite(leds[i], LOW);
  }

  int new_button = digitalRead(button);   // ボタンの状態を読み取る

  /*
   * 押されていなかった後に、ボタンが押されたら、
   * ルーレットの動作モードを切り替える。
   */
  if (last_button == HIGH && new_button == LOW) {
    Serial.println("Button pressed");
    if (cur_mode == MODE_STOP)      // 止まっていたときは、
      cur_mode = MODE_RUN;          //   回っている状態に
    else                            // 回っていたときは、
      cur_mode = MODE_STOP;         //   止まっている状態に

    delay(10);                      // チャタリング防止の待ち時間
  }
  last_button = new_button;         // 今回のボタンの状態を覚えておく

  if (cur_mode == MODE_RUN)         // 動作モードが RUN だったら
    speed = 20;                     //   スピードを一番早くする

  if (speed > 0) {                  // speedが0でないとき
    delay(1000 / speed);            //   スピードに応じて待つ

    speed -= 1;                     // スピードを少し下げる

    if (++ pos >= n_leds)           // posを隣のLEDに動かす
      pos = 0;                      // n_ledsになったら0に戻す
  }
}

皆様への宿題(はるやすみのしゅくだい)

既に、プログラムやブレッドボードの配線を変更していろいろ試されている方もあるかと思いますが、アイデアが思いつかない方のために、いくつか改良テーマを上げておきましょう。(大抵の場合、お子さんのほうが躊躇せずにいろいろジッケンするのが好きなものです。大人のほうが不安になってあまり実験したがらないものですが、まず大抵はすぐに壊れることはありませんし、(パソコンに LED を突き刺したりしない限り)壊れても大した金額ではないので、いろいろやってみることをお勧めします。)

  • [初級編] 紙箱や 100円ショップのプラケースに収めて、配線も綺麗にまとめてみよう
  • [初級編] もし手元に 330オームよりも大きな値の抵抗器があったら、330オームの抵抗をそれで交換してみよう。何が起きるかな?(330オームよりずっと小さな値の抵抗器に変えると、Arduino や LED が壊れる恐れがあるので避けてください。)
  • [中級編] ルーレットの回る向きを逆にしてみよう
  • [中級編] 抵抗器のカラーコードの読み方を勉強しよう(参考: https://www.akaneohm.com/column/marking/
  • [中級編] LED の数をもっと増やしてみよう(押しボタンスイッチを無くせば、最大で 20個までは繋げられます。この場合、抵抗器は必ず 330オームかそれより大きな値のものにしてください)
  • [上級編] LED の止まるまでの時間が一定にならないようにしてみよう(どこで止まるか分かりにくくしてみよう)

今日はここまで。おつかれさまでした。

お問い合わせはお気軽に!

お問い合わせを頂いた後、継続して営業活動をしたり、ニュースレター等をお送りしたりすることはございません。
御返答は 24時間以内(営業時間中)とさせて頂いております。もし返答が届かない場合、何らかの事情でメールが不達となっている可能性がございます。大変お手数ですが、別のメールアドレス等で督促頂けますと幸いです。