中学生向けサマーセミナー2018概要| 研究室のページへ戻る

LED cube のプログラムの書き換え

■はじめに

2018年8月22日(水)に「マイコンとLEDで遊ぼう」と題してLEDキューブを作成するセミナーで作成したLED cube のプログラムを書き換えるには以下のようにしてください。

■ハードウェア

マイコンボードとパソコンを接続するためのUSBケーブルが必要です。マイコンボード側のコネクタは USB mini B です(似ていますが最近のスマートフォン等で使われている micro B ではありません。無理に挿すと壊れます。)近くの家電店や通信販売などで購入してください。100円ショップにも売っている場合があります。通信販売だと以下のような商品が安価です。

■ソフトウェア

Arduino IDEの準備

マイコン用のプログラムをコンパイルするのに Arduino IDE が必要です。以下からダウンロードしてください:

Windowsの app 版とインストーラー版(Installer)は指示に従ってインストールしてください。Windows, Mac OS X用の ZIP 版はファイルを展開したら利用できます。フォルダ内にある Arduino アイコンをダブルクリックして起動します。

※サマーセミナーではバージョン 1.8.5 のArduino IDEを使っていました。

Arduino IDEの設定

マイコンボードとUSBケーブルを接続してから、パソコンにUSBコネクタを挿します。Windows 10の場合は自動でデバイスドライバのインストールは不要だと思います。それ以外の場合は CH340G のドライバを探してみてください(Windows の場合, Mac OS Xの場合)。

(デバイスドライバのインストールが必要な場合、インストールを終えてから)Arduino IDEを起動して以下のように設定します:

  1. メニューの「ツール」→「マイコンボード」→「Arduino Duemillanove or Diecimila」をクリック
  2. メニューの「ツール」→「プロセッサ」→「ATmega328P」をクリック
  3. メニューの「ツール」→「シリアルポート/ポート」→(Windows: 番号の大きいものをクリック), (Mac OS X: /dev/cuではじまるもののうち下の方にあるものをクリック)

シリアルポートについては一番番号の大きいもの(下の方にあるもの)ではない場合もあります。うまく書き込めない場合には、順に違うポートを試してください。

1と2は最初の1回だけで大丈夫です。3は Windows の場合には、パソコンの USB ポートを変えると番号が変わるので再設定します。

Arduino IDEへのライブラリの追加

TimerOneライブラリを利用するので追加します。 Arduino IDEのメニューの「スケッチ」→「ライブラリをインクルード」→「ライブラリを管理」をクリックします。ライブラリマネージャのウィンドウが開くので、右上の検索窓に「TimerOne」といれます。表示されたTimerOne by Jesse Tane 〜と表示されているライブラリを選択し、「インストール」ボタンをクリックします。ライブラリのところに「INSTALLED」と表示されたらインストールは完了です。「閉じる」ボタンをクリックしライブラリーマネージャを閉じます。

LEDCube ライブラリを利用するので追加します。まずは下記から LEDCube.zip をダウンロードして保存して下さい。Arduino IDE の メニューの「スケッチ」→「ライブラリをインクルード」→「.ZIP形式のライブラリをインストール…」をクリックします。ダウンロードした LEDCube.zip をクリックして「選択」をクリックするか、LEDCube.zip をダブルクリックします。すぐに追加は終わります。

パターンの作成と書き込み

次のプログラムを書き込んでみましょう。キューブ中央の縦に並んだ3つのLEDが点灯します。

void setup() {
    pinMode(A0, OUTPUT);
    pinMode(A1, OUTPUT);
    pinMode(A2, OUTPUT);
        
    pinMode(D6, OUTPUT);
}

void loop() {
    digitalWrite(A0, LOW);
    digitalWrite(A1, LOW);
    digitalWrite(A2, LOW);
    
    digitalWrite(D6, HIGH);
}

Arduino IDE のメニューの「ファイル」→「スケッチ例」→「LEDCube」の中にサンプルプログラムがあります。サンプルプログラムを変更後は別名で保存するよう指示が出ます。保存すると「ファイル」→「スケッチ」に追加されます。サンプルプログラムは以下の通りです。プログラムの解説は参加された方に配付した資料をみてください。

  1. BareMinimum (ライブラリのインクルードと初期化のみのテンプレート)
  2. DemoCube (LED cube の動作デモ, 動画)
  3. Dice (電子サイコロ, 1〜9の目が出ます)
  4. Floor (下の段、中の段、上の段、中の段の順でLEDが点灯するデモ)
  5. forTest (LED cube の動作確認用, LEDCube ライブラリを使っていません)
  6. Hourglass (LED cube 砂時計, 動画)
  7. Random (ランダムに点滅します)
  8. Roulette (電子ルーレット)
  9. setLED (LEDCube ライブラリの setLED 関数の使い方の例)
  10. Sound (音を出すプログラムの例)
  11. SwitchStart (スイッチを押すと動作を開始するプログラムの例)
  12. toggle (LEDCube ライブラリの toggle 関数の使い方の例)
  13. Tulip (「チューリップ」の曲)
  14. Wall (D2, D3, D4の壁、D5, D6, D7の壁、D8, D9, D10の壁、D5, D6, D7の壁の順でLEDが点灯するデモ)
  15. Wall2 (D2, D5, D8の壁、D3, D6, D9の壁、D4, D7, D10の壁、D3, D6, D9の壁の順でLEDが点灯するデモ)

補足

ハードウェア

セミナーで作成したボードは Arduino で書き込めるようになっています(ハードウェア的には Arduino nano 互換機を使っていますが、ファームウェアが Arduino Duemillanove 互換)になっています。下の回路図のように、LEDは下段、中段、上段のそれぞれの9つのLEDのカソードがまとめてJ1, J2, J3端子につながっています。J1, J2, J3はそれぞれA2, A1, A0ピンにつながっています。アノード側はD2〜D10のそれぞれに3つずつまとめてつながっています。

LEDを上段のD2につながったLEDを点灯するには、A0をLOWにD2をHIGHにします。

digitalWrite(A0, LOW);
digitalWrite(2, HIGH);
カソードが9つのLEDで共通なため、任意のパターンで点灯するにはダイナミック点灯が必要です。ダイナミック点灯はつぎのように、点灯と消灯を高速に繰り返し、残像で人の目には同時に点灯しているように見える方式です。配線が少なくて済むので、LED を使った製品では多く利用されている方式です。
digitalWrite(A0, LOW);  // 上段点灯
digitalWrite(2, HIGH); //  D2点灯
digitalWrite(A0, HIGH); // 上段消灯
digitalWrite(2, LOW);  // D2消灯

digitalWrite(A1, LOW);  // 中段点灯
digitalWrite(6,  HIGH); //  D6点灯
digitalWrite(A1, HIGH); // 中段消灯
digitalWrite(6,  LOW);  // D6消灯

digitalWrite(A0, LOW);  // 下段点灯
digitalWrite(10,  HIGH); //  D10点灯
digitalWrite(A0, HIGH); // 下段消灯
digitalWrite(10, LOW);  // D10消灯
// 最初に戻る

基板上での LED のD2〜D10への接続は下図のように並んでいます。ですから上のプログラムだと、上段(A0)で図の右下(D2)のLED、中段(A1)で図の中央(D6)のLED、下段(A2)で図の左上(D10)のLEDが点灯します。

LEDCube ライブラリ

LEDCube ライブラリは、上段、中段、下段の9個のLEDを1ms毎に順に点灯させ、ダイナミック点灯を実現するライブラリです。1ms毎に点灯するために TimerOne ライブラリを使っています。

使い方は簡単です。サンプルのBareMinimumのように

#include 
#include 

void setup() {
  CubeSetup();
}

void loop() {

}

最初の2行でLEDCube.hとTimerOne.hを読み込み、setup()関数で CubeSetup() を呼び出します。CubeSetup()関数内で、ピンの入出力設定やタイマ割り込みの設定をしています。CubeSetup()を実行後にLEDはすべて点灯した状態になります。

基本的な使い方は、setLED()関数を使ってLEDの点灯状態の設定です。setLED()関数は3つの引数をとります。引数は上段、中段、下段のLEDの点灯状態を表す数値(16bit 符号付き整数)です。

setLED(0b11111111, 0, 0);

と書くと、上段の9つのLEDが点灯、中段と下段は消灯となります。 各段のLEDは9つありD2〜D10につながっていますが、2進数で表したときの最下位ビット(右端)がD2の点灯(1)/消灯(0)を表し、その次のビットがD3, その次がD4と9つ目のビットがD10の点灯/消灯を表します。ですから

setLED(0b111111110, 0, 0);

だと、上段のD2が消灯、D3〜D10が点灯、中段と下段は消灯となります。もちろん、2進数の定数だけでなく、10進数、16進数で表したり、変数や式でも構いません。 全点灯(0b111111111)を表す allON, 前消灯(0)を表す allOFF を定義しているので

setLED(allON, allON, allON);
setLED(allOFF, allOFF, allOFF);

といった書き方もできます。またよく使う点灯パターンについては以下の関数を用意しています。

cubeON();       // 全点灯
cubeOFF();      // 全消灯
lowON();        // 下段のみ点灯
midON();        // 中段のみ点灯
highON();       // 上段のみ点灯
D2D3D4ON();     // D2, D3, D4 につながる各3つ(合計9つ)のLEDが点灯(残りは消灯)
D5D6D7ON();     // D5, D6, D7 につながる各3つ(合計9つ)のLEDが点灯(残りは消灯)
D8D9D10ON();    // D8, D9, D10 につながる各3つ(合計9つ)のLEDが点灯(残りは消灯)
D2D5D8ON();     // D2, D5, D8 につながる各3つ(合計9つ)のLEDが点灯(残りは消灯)
D3D6D9ON();     // D3, D6, D9 につながる各3つ(合計9つ)のLEDが点灯(残りは消灯)
D4D7D10ON();    // D4, D7, D10 につながる各3つ(合計9つ)のLEDが点灯(残りは消灯)

LEDを1つずつ、点灯、消灯、トグル(点灯している場合は消灯、消灯している場合は点灯)させる、関数も用意しています。

setXYZ(x, y, z);        // 点灯
clearXYZ(x, y, z);      // 消灯
toggleXYZ(x, y, z);     // トグル

LEDは下段のD2のLEDを原点として、D3, D4の方向をx軸、D5, D8 の方向をy軸、上方向をz軸として、0, 1, 2の整数で座標を表します。下段のD2のLEDは(0, 0, 0), 上段のD10のLEDは(2, 2, 2) で表します。

うまく動かなくなった

LEDが何個か点灯しなくなった、音が鳴らなくなったなどのときは、はんだ付けを見直してください。 外れている場合は付け直す、基板の裏側できれいな富士山型でないところをはんだごてであたため直す(溶かす)、はんだが不足している場合(極端に少ない場合)ははんだを少し足すということをやってみてください。はんだごてが家にない場合には技術室の20W〜30Wのものを使わせてもらえないか相談してみてください。


中学生向けサマーセミナー2018概要| 研究室のページへ戻る