パソコンとは 違う 小さな システムを 自分で 組み上げる 体験を 通して、 ハードウェアに 対する 理解を 深めると ともに、 身の回りの システムに 興味を もって 欲しいと 考えて います。 プログラムを すべて 理解 させるのでは なく、 特に 初心者に 対しては 数値を 変えたら 動きが 変わった、 と いう 体験を させる ことに 重点を 置いて ください。 上級者に 対しては、 自分で どんどん 変えさせて 構いません。 初心者には 成功 体験が、 上級者には トライ & エラーが 大事です。
Arduino(アルデュイーノ)と いう 小さな コンピュータを 使って、 音を 鳴らす・ 音の 高さを 変える・ サーボ モーターを 回す・ 距離センサーを 使う、 と いった ことを 体験 しながら プログラムの 動作を 理解 し、 パソコンとは 違う 小さな コンピュータの 世界に 触れます。
・ 作業 しやすいように バナナジャック化 された Arduinoボードと 周辺 機器を 使います。
・ 使う コンピュータでは Arduino.exeと メモ帳を タスクバーに 登録 して おきます。 Windows+1, Windows+2などで 起動 させると 無駄な 時間を とりません (Windows10の 場合)。
・ Arduinoは Java Accessibility Switchが ONに なって いないと 音声 出力 しないので、 java¥bin ディレクトリ にて 「jabswitch -enable」を 実行 して おきます。 (ただし 違う Javaを 読み込むような PATHの 設定だと うまく いかない ことが あります。) スクリーン リーダーには NVDAを 用います。
・ メモ帳や エディタでの 編集には、 使い慣れた スクリーン リーダーを 使わせる 方が よいかも しれません。 その 際は、 Arduinoの 音声 出力を あきらめて ショートカットだけの 操作を する、 もしくは そこの 操作は 補助者が やって しまう、 と いう 選択肢も あります。 いずれに せよ プログラムを 音声で 確認 する 場合に、 中カッコなどの 記号を きちんと 読むように 調整 して おく ことが 大事です。
・ ツール メニュー 以下の シリアル ポートや ボードの 種類を 設定 して おきます。
・ サンプル プログラムを ドキュメント フォルダ > Arduino フォルダ内に おいて おきます。 Altメニューの ファイル⇒スケッチから 開かせます。 動作 確認も して おきます。 最初に 接続 した 際に 音が 鳴らないよう、 空の スケッチを 最後に 入れて おきます。
概要を 説明 し、 以下の 用語 説明を します。
・ 「Arduino」とは 今日 使う 小さな コンピュータで ある。
・ 「スケッチ」とは Arduinoを 動かす プログラムで ある。
・ スケッチ(プログラム)を 作る ための プログラム=ソフトウェアが ある。
・ その ソフトウェアの 名前も Arduino(.exe)で ある。
・ アナログは 連続 する(=つながって いる) 量、 温度や 角度など 実世界に 存在 する 量。
・ デジタルは バラバラの 量、 コンピュータに 入ると デジタル化 される。
そして、 Arduinoは パソコンが なくても 「コンピュータと して」 単体で 動く ことも 説明 して おきます。
Arduinoボードの 右上の 触覚 手掛かり シールなどを 使い、 同じ 方向を 向かせてから 触らせます。 触らせながら、 以下を 確認 させ、 説明 します。
・ USBコネクターの 位置。
・ USBケーブルを 通して スケッチが Arduinoに 書き込まれる こと。
・ バナナジャックの 位置と 数、 そして 実際には それらが ケーブルを 通して Arduinoの コネクターに 接続 されて いる こと。
・ 静電気 破壊の 恐れが なければ CPUの チップや 水晶 発振器などを 説明 する。
・ アナログ 入力を する 端子や デジタルの 入出力を する 端子が ある こと。
これらの 触察の 際は ケガを しないように、 また ハードウェアを 壊して しまわないように ゆっくり 触るよう 指導 します。 触らせる 方向を 統一 して おかないと 説明に 苦労 するので、 向きを 変えないように 伝えて おきます。
視覚障害者向けに バナナジャックを 装備 した Arduinoボード
アナログ 入力に ついては 「電圧の 高さを 検出 する」と いう 程度の 説明を します。 デジタルの 方は 5Vか 0Vかを 判断 したり 出力 したり すると いう 説明を します。 (高学年の 場合には、 5Vと いっても 「だいたい 5Vくらい」と いう 話を 盛り込むのも 良いかも しれません。)
コンピュータを 起動 し、 Windows+1で Arduino.exeを、 必要で あれば Windows+2で メモ帳や エディタを 起動 します。 メモ帳や エディタを 使う 場合は Alt+Tabでの アプリケーション 切り替えが できる ことを 確認 して ください。プログラムの 編集は Arduino.exeが うまく 読む 場合には、 そのまま 使う ことも 可能ですが、 音声化が うまく いかなかったり、 編集に 困難が あったり するような 場合は メモ帳 などを 使わせて ください。 Ctrl+A、 Ctrl+C、 Alt+Tab、 Ctrl+A、 Ctrl+V、 の 一連の シーケンスで コピー & ペースト する ことなどを 説明 し、 操作に ついて 確認 します。 作業に 慣れて いる 生徒なら 問題 ないのですが、 作業の 速度差が 出て しまう 場合が あります。 適宜 補助 して、 プログラムの 内容を 読ませ 理解 させる ことに 時間を 使うように 流れを コントロール して ください。
Arduino.exeを 起動 した 様子
スケッチを Arduinoへ アップロード する ショートカットキーは Ctrl+Uで ある ことを ここで 説明 します。 適宜 自由に メニューを 読ませて ショートカットキーを 確認 させても 良いです。 アップロードの 際には 確実に Arduinoが ケーブルで 接続 されて いる ことを 確認 するよう 指導 して ください。 画面が 見える 生徒に 対しては、 ボタン アイコンの 説明も して ください。 コンパイルは Ctrl+Rですが、 かえって 混乱 させて しまうようなら、 あえて ワーク ショップでは 説明 しなくても 良いかと 思います。 デバッグ ペインへは、 F6で 移動 できます。 F8での 移動を する バージョンも ありましたが、 現状では F8は 境目の バーへの フォーカスの 移動のようです。
もし プログラムに 詳しい 生徒の 場合には、 setup()と loop()の 2つの セクションが あり、 setup()は 最初の 一回、 loop()は 無限 繰り返しで ある ことなども 説明 すると 良いでしょう。
本家の リファレンスは 以下に なります。
https://www.arduino.cc/en/Guide/HomePage
最初に 圧電 スピーカーを 使って 音楽を 鳴らす サンプルを 試します。 好みの メロディを 構築 させて 興味を もって もらうのが 目的です。 具体的には 以下の 手順で 進めます。
・ まず ファイル ⇒ スケッチ ブックから 最初の サンプル スケッチを 開かせます。 そのまま 読むのが 困難な 場合は メモ帳に プログラムを コピー させます (Ctrl+a、 Ctrl+c、 Alt+Tab、 Ctrl+vなど)。 生徒が 分かって いる 場合には、 直接 INOファイルを 編集 させるのも 良いかも しれません。 最初なので 適宜 手助け して、 生徒間の ペースを 整えます。
・ ファイルを 開いた 後に NVDAでも 読ませつつ プログラムの 内容を 順に 説明 します。
> スラッシュが 2つ 続いた 後は コメントで プログラムには 影響 しない 説明文で ある ことを 伝えます。 この 説明文を コメントと 呼ぶ ことや 「コメント アウト」と いう 言葉などを 教えるのも 良いでしょう。
> 定数名が 数値を 意味 する ことを 理解 して いるか 確認 しつつ 進めます。 プログラムの 基本と しての 「定数」 「変数」の 話が したく なる ところですが、 難しい ことは 言わずに 「文字が 数字の 値を 意味 する」のような 説明に とどめて おきます。 変数は 次の サンプルで 出て きます。
> tone()は 音を 鳴らす 命令で、 その 後に delay()と いう 命令が 必要な ことを 教えます。 適宜 英語の 意味なども 説明に 入れると 良いでしょう。 生徒の 様子を 見て 難しく 感じて しまいそうならば、 これらの 命令で 1つの 音を 鳴らす、 と いった 程度の 説明でも 構いません。 これらの 編集を 後ほど して もらう ことも 伝えます。
・ Arduinoの ボードに 圧電 スピーカーを 接続 させます。 赤を デジタル 10番に、 黒を GNDに 接続 させます。 ここは 「自分で 挿す」 ことに 重点を 置いて ください。 ただし、乱暴に 扱って 壊して しまわないよう、 ゆっくり 触るよう、 分からない ことが あったら 聞くよう 指導 して ください。 「高価な もので ある」と 最初に 伝えて おく ことも 重要です。
・ 接続が 終わったら、 Ctrl+Uを 押させ、 サンプル スケッチを コンパイル & アップロード します。
・ モバイル バッテリーなどが あれば、 コンピュータから 外して 単体で 実行 して みます。 単純な オルゴール的な ものですが、 プログラムが 転送 されて 中で 動いて いる ことを 実感 して もらいます。
・ サンプル プログラムが 動いたら、 音階を 自由に 組み合わせて 自由に メロディを 作って もらいます。 ここで 比較的 多くの 時間を 割いて、 成功 体験を して もらいます。 この 作業は 最後に 持って くる 構成も 良いと 思います。
・ 音楽の 才能の ある 生徒さんには、 何か 課題曲を 与えても 良いでしょう。
・ 進度の 早い 生徒さんや 音楽の 素養の ある 生徒さんには 音の 長さも 変えさせます。 delayの 値を 調整 して 「間」を 作る ことも 試して もらいます。
スピーカーの 接続の 際には、 「USBコネクターを 上に 向けて 置いて、 右側の 一番 上の バナナジャックが デジタルの 10番 ピンです」 「その 下が GNDです」と いった 声掛けで 説明 します。
プログラムの 説明時、 tone() メソッドは 3つの 引数を 持つ ことを 生徒に 合った 言葉で 説明 します。 「カッコの 中に 3種類の 値を カンマで 区切って 書く」 「1番目の 値は ピン番号、 これは すべて 同じなので 2行目で 10(番)に なるように して ある」 「2番目の 値が 周波数、 数字が 大きいほど 高い 音」 「3番目の 値は 音の 長さ、 これも サンプルでは 同じ 値に して ある」など 適宜 かみ砕きながら 説明 します。
// 音の 長さを 300ミリ秒に 設定 します。
#define DURATION 300
// スピーカーの ピンを デジタル 10番と します。
#define SPEAKER_PIN 10
// プログラムには 関数と いう 命令の まとまりが あります。 中カッコで 区切られて います。
// setup()と いう 関数は 最初に 実行 されます。 しかし 今回は 何も 書きません。
void setup() {
// 中身は カラです。
}
// loop()と いう 関数は 無限に 繰り返されます。
void loop() {
// ドの 周波数を 300ミリ秒 鳴らします。 delayと いう 命令で 次の 命令まで 待ちます。
tone(SPEAKER_PIN,262,DURATION); delay(DURATION);
// レ
tone(SPEAKER_PIN,294,DURATION); delay(DURATION);
// ミ
tone(SPEAKER_PIN,330,DURATION); delay(DURATION);
// ファ
tone(SPEAKER_PIN,349,DURATION); delay(DURATION);
// ソ
tone(SPEAKER_PIN,392,DURATION); delay(DURATION);
// ラ
tone(SPEAKER_PIN,440,DURATION); delay(DURATION);
// シ
tone(SPEAKER_PIN,494,DURATION); delay(DURATION);
// ド
tone(SPEAKER_PIN,523,DURATION);
// 3秒 待つ
delay(3000);
}
2番目の スケッチは アナログ 入力を 学びます。 入力に よって 音階が 変化 する ことを 理解 し、 手元の 可変 抵抗器が プログラムに 影響 して いる ことを 感じて もらいます。 「可変 抵抗器」と いう 名称は 親しみが ないかも しれませんので、 「ボリュームの つまみ」など 適宜 言い方を 変えて みて ください。 (つまみ、 も 死語かも しれませんが …)
可変 抵抗器
・ ファイル ⇒ スケッチ ブックから スケッチを 開かせます。
> 3つの 定数の 宣言文を 解説 します。 ここまでは スピーカーの サンプルと 同じです。
> 変数 宣言が 出て きました。 ここで 定数は その 名の 通り 値が 変わらない もの、 変数は プログラム中で 変化 する 入れ物、 と いう ことを 説明 します。 また、 intに ついては 整数 (integer)で ある ことも 説明 して おきます。
> setupは 今回も 何も ないので 飛ばします。 もとより カット して おくのも 一案です。
> analogRead() と いう メソッド(命令)で 指定 された ポートの 電圧を 測る ことを 教えます。
> 圧電 スピーカーの 周波数と して 値が 与えられ、 出力 される ことを 説明 します。
・ Arduinoから スピーカーの 片方の プラグを 抜き、 音が 鳴らないように してから Ctrl+Uで スケッチの コンパイルと アップロードを 実施 します。
・ USBケーブルを 抜いた 後に Arduinoの ボードに 可変 抵抗器を 接続 させます。 赤い ケーブルを 5Vに、 黒い ケーブルを GNDに、 黄色い ケーブルを アナログの 0番に 接続 します。 スピーカーも 再度 接続 します。
・ 可変 抵抗器の 黄色い ケーブルの 電圧は、 つまみを 捻ると 0から 5Vに 変わる こと、 アナログ 入力 端子 では、 0Vから 5Vまでの 間の 電圧値が 0から 1023に なる ことを 説明 して おきます。 可変 抵抗器の 各 端子の 意味と 仕組み、 電圧が 変わる 原理なども 時間に 応じて 説明 すると 良いでしょう。
・ USBケーブルを 電源 もしくは PCに つなぎます。
・ サンプルが 動いたら、 プログラムを 自分で 変えさせます。 例えば sensorValueの 値を sensorValue*2 に したり 1023-sensorValue に したり させて その 変化を 予想 させ、 実験 します。 変数に 代入 する タイミングで 変えても toneを 呼び出す タイミングで 変えても 同じと いう ことを 示す ことで、 「プログラムの 正解は ひとつでは ない」 ことを 理解 して もらうと 良いでしょう。
・ analogRead() の 解説は 以下の ページに あります。
http://www.musashinodenpa.com/arduino/ref/index.php?f=0&pos=2113
//音の 長さを 定義 します。
#define DURATION 50
// スピーカーの ピンを デジタル 10番と します。
#define SPEAKER_PIN 10
// 可変 抵抗から 取得 する ピンを アナログ 0番と します。
#define RESISTOR_PIN A0
// 可変 抵抗器からの 値を 入れる 変数 sensorValueを 宣言 して 初期化 します。
int sensorValue = 0;
void setup() {
// 今回も 何も 書きません。
}
void loop() {
//analogRead 命令で アナログ 0番から 値を 読み込んで、 sensorValueに 代入 します。
sensorValue = analogRead(RESISTOR_PIN);
//sensorValueの 周波数の 音を 50ミリ秒 鳴らします。
tone(SPEAKER_PIN, sensorValue, DURATION); delay(DURATION);
}
3番目の スケッチは サーボ モーターを 使います。 サンプル スケッチの 確認、 スケッチの アップロード、 サーボ モーターの 接続、 実行、 の 順に 進めます。 (サーボ モーターが 接続 されて いると USBの 電流が 吸われて うまく 書き込めない 場合が あります)
サーボ モーター
・ ファイル ⇒ スケッチ ブックから スケッチを 開かせます。
・ ヘッダ ファイルの インクルードに ついては 「おまじない」と いう 言い方は 避け、 「サーボへの 命令を 記述 する ために 必要な コード」と 伝えます。
・ forループに ついての 書式を 学びます。 「for()の 中には セミコロンで 区切られて 3つの 領域が あり、 最初の 領域で 変化 する 変数の 初期値 (最初の 値)を、 2番目の 領域で 終わる 条件を、 3番目の 領域で 変化の 仕方を 指定 する」 「中カッコで 囲まれた 部分が 指定 回数だけ 回る、 そして 変数の 中身も 変化 する」と いう ことを 説明 します。 ここでは posが 0から 180まで 変化 する ことを 理解 して もらいます。 難しい 様子でしたら、 すべて 理解 させなくて 構いません。 どこを 変えたら 角度が 変わるか、 を 教えて 自由 課題では そこを 編集 させて ください。
・ Ctrl+Uで コンパイル、 アップロードを 実施 します。
・ サーボの 電源と PWM端子を 接続 します。
・ 自分たちで 角度の 指定を 変えさせたり、 ステップ (=速度)を 変えさせたり して 動きの 変化を 楽しんで もらいます。
// サーボを 使う ための ヘッダ ファイル (宣言 ファイル)を 読み込みます。
#include <Servo.h>
// サーボ オブジェクトを 作ります。
Servo myservo;
// サーボ モーターの 角度を 記憶 して おく 変数 posを 宣言 して ゼロで 初期化
int pos = 0;
void setup() {
// 0番 ピンを サーボ モーターと 関連づけます。
myservo.attach(0);
}
void loop() {
// 指定 回数 まわす forループです。 posの 中身は 0から 180まで 1ずつ 増えます。
for(pos = 0; pos <= 180; pos += 1){
// サーボを posの 角度に 変更 して 10ミリ秒 待ちます。
myservo.write(pos); delay(10);
}
// 1秒 待ちます。
delay(1000);
// 次に また forループで posの 値を 180から 0まで 減らします。
for(pos = 180; pos >= 0; pos -= 1){
myservo.write(pos); delay(10);
}
// 1秒 待ちます。
delay(1000);
}
可変 抵抗器からの 入力の 仕方と サーボ モーターへの 出力の 仕方が 分かったので、 それらを 組み合わせて 「可変 抵抗器を ねじると サーボが 動く」と いう サンプルを 動かして みます。
・ ファイル ⇒ スケッチ ブックから スケッチを 開かせます。
・ 先ほど 学んだ 2つの プログラムが 組み合わさって いる ことを 理解 させます。 どの コードが どちらの もので あったかなどを 答えさせても 良いでしょう。
・ サンプルが 動いたら、 可変 抵抗器の 向きと 逆向きに 動かすには、 角度を 90度までに するには、 と いった 課題を 出して みます。
・ 時間を 持て余して いる 生徒さん、 すでに プログラミング 経験が 豊富な 生徒さんには、 個別に 条件 分岐 書式などを 教えて 一定値を 超えたら サーボ モーターが 振り切れる ものを 作れ、 などの 課題を 与えても 良いでしょう。
// サーボを 使う ための ヘッダ ファイル (宣言 ファイル)を 読み込みます。
#include <Servo.h>
// 可変 抵抗から 取得 する ピンを アナログ 0番と します。
#define RESISTOR_PIN A0
// サーボ オブジェクトを 作ります。
Servo myservo;
// 可変 抵抗器からの 値を 入れる 変数 sensorValueを 宣言 して 初期化 します。
int sensorValue = 0;
void setup() {
// 0番 ピンを サーボ モーターと 関連づけます。
myservo.attach(0);
}
void loop() {
// analogRead 命令で アナログ 0番から 値を 読み込んで、 sensorValueに 代入 します。
sensorValue = analogRead(RESISTOR_PIN);
// 0-1023を 0-180に 変換 します。
sensorValue = map(sensorValue, 0, 1023, 0, 180);
// サーボを posの 角度まで 動かして 10ミリ秒 待ちます。
myservo.write(sensorValue); delay(10);
}
分岐の 例
void loop() {
sensorValue = analogRead(RESISTOR_PIN);
if(sensorValue > 500){
myservo.write(100);
delay(10);
}else{
myservo.write(0);
delay(10);
}
}
最後に 超音波 距離 センサーを 使って みます。 まず センサー 自体の 説明を してから サンプルを 動かします。
超音波に よる 距離 センサー
・ センサーには 電源の プラスと マイナス (5Vと GND)、 TRIGと ECHOと いう 4つの 端子が あります。 TRIG(トリガー)は、 Arduinoから センサーへの 信号線 です。 この 端子に タイミングの 指示が あったら、 超音波を 発信 します。 ECHO(エコー)は センサーから Arduinoへの 信号線 です。 超音波 発信から 受信まで どれくらいの 時間が 経ったかを、 パルスの 長さで 戻して くれます。
・ プログラムに ある pulseInと いう メソッドは ECHOの 信号を マイクロ秒で 答えて くれます。
・ ファイル ⇒ スケッチ ブックから スケッチを 開かせます。
> 宣言 部分の 定数を 確認 します。 同時に ボードの バナナジャックの 対応 位置なども 説明 すると 良いでしょう。
> doubleと いうのは 整数では なく 小数を 表す、 と いう 程度の 説明を します。
> デジタル ポートの 入力・ 出力の 方向を setupで 定めます。 同時に シリアル ポートの 速度も ここで 指定 して いる ことに 留意 させて ください。
> パルスを 送り、 ECHOから 戻って くる 値で 距離を 計算 します。
> センチメートル 単位に して、 それを もとに 音階を 出す ことを 説明 します。
> 同時に シリアル ポートを 通して パソコンと Arduinoが 通信 する ことを 説明 します。 ただし この コードは 弱視者・ 晴眼者の 確認用なので、 シリアル モニタは うまく 読み上げません。
・ 弱視の 生徒の 場合は 動いて いる 様子を、 「シリアル モニタ」で 確認 する ことも できます。 シリアル モニタは Ctrl+Shift+Mで 起動 します。 ボーレートに 注意 して ください。 9600に 設定 します。
・ 生徒の 興味と 体力が あれば、 0.017と いう 係数に ついて 少し 詳しく 説明 します。(http://marupeke296.com/EL_Ard_No8_SuperSonic.htmlに 詳しく 書いて あります)時間と 速さと 距離の 関係から、 距離時間速さ です。 ここで 時間とは、 pulseInで 得られる マイクロ秒 単位の 時間です。 速さとは、 音速の です。 単位に すると です。 そして マイクロ秒を 秒に 直すには で 割れば よいので、 プログラムの intervalと いう 変数を 用いると、 intervalinterval に なります。 これが 往復の 距離に なるので、 その 半分、 すなわち interval が 片道の 距離と いう ことに なります。
// 音の 長さ、 スピーカーピン、 トリガーピン、 エコーピンの ナンバーを 宣言 します。
#define DURATION 100
#define BEEP_PIN 10
#define TRIG_PIN 2
#define ECHO_PIN 8
// intervalと distanceを 宣言 します。
int interval = 0;
double distance = 0;
void setup() {
// 入出力の 方向を 決めて シリアル ポートを 開きます。
// 2番が 出力、 8番が 入力です。
pinMode( 2, OUTPUT );
pinMode( 8, INPUT );
// Serial.begin( 9600 ); //PCと 通信 する 場合 シリアル ポートを 開きます。
}
void loop() {
// 10マイクロ秒 以上の パルスを 送ります。 HIGH、 LOWを 順番に 指示 します。
digitalWrite( TRIG_PIN, HIGH );
delayMicroseconds( 100 );
digitalWrite( TRIG_PIN, LOW );
// pulseIn()で ECHOピンの HIGHで ある 状態が どれくらい 長いのか 検出 します。
interval = pulseIn( ECHO_PIN, HIGH );
// intervalの 値から センチメートルに 変換 します。
distance = interval * 0.017;
// 音階で 出力 します。
tone(BEEP_PIN, interval/10, DURATION); delay(DURATION);
// PCで 状態を 得る 場合 シリアル 通信を します (Ctrl+Shift+M)
//Serial.print( interval, DEC );
//Serial.print( "¥t" );
//Serial.print( distance, 4 );
//Serial.print( "¥n" );
}
・ 直接 ボードに 触れて 学習 するので、 冬の 場合は 特に 生徒の 静電気を 逃がして おきます。 服装なども 注意 して、 場合に よっては 薄い 手袋 などを 用意 して おくと 良いでしょう。 部屋の 気温が 寒いと 毛糸の 上着などを 脱いで もらうのが 申し訳 ないので、 事前に 部屋を 暖めて おくように します。
・ コンピュータを 使った システムの 基本、 入力 → 演算 → 出力と いう 一連の 流れを 理解 する。
・ アナログ量を 数値化 して プログラムに 利用 して いる ことを 理解 する。
・ 世の中に ある 様々な センサーに ついて 興味を 持つ。
生徒用には、 サンプル プログラムを あらかじめ コンピュータに 入れて おきます。 その ほか 実際に 触る Arduinoは 自分で 組めるように 大型化 した ものを 準備 します。