Arduino勉強会
2014/02/16からのアクセス回数
こちらは、次回2月22日の勉強会の資料と補足情報です。
前回の光センサーの例題では、Arduinoからパソコンに読み込んだ値を送っていましたが、 今回は、パソコンから数字を送ってProtoSnap Pro Miniの圧電スピーカから音階を出す例題を試してみましょう。
Arduino/ProtoSnap Pro Miniを試すで紹介した「ブザーを使って音を出す」を再度使います。
この例題は、ド、レ、ミ、ド、ラの5つの音に対して、パソコンから数字で1、2,3,4,5を入力して、 指定された音をArduinoから鳴らすという簡単なものです。
音階と周波数については、以下のページが見やすいです。
音の出力には、tone関数を使います。
以下のスケッチをコピー&ペーストして、Arduinoに書き込んで下さい(CTRL-U)。
int toneDuration = 40; // 音のでる間隔(40ミリ秒) int speakerPin = 2; //ブザーのピン番号 int index = 0; // 何番目の配列かを示す値(配列の添え字を求める) char ch; // パソコンから読み込んだ文字(コード) int tones[]={262,294,330,392,440}; // ド、レ、ミ、ソ、ラ
void setup() {
}
void loop() {
} }}
次に、パソコンのArduino IDEのシリアルモニターを開きます。 Arduino IDEのツールメニューからシリアルモニターを選択(CTRL-Shift-M)すると以下の様なシリアルモニターが表示されます。 ここで、右下の転送速度が9600 baud(ボーと呼びます)になっていることを確認してください。
シリアルモニターの入力欄に123 123 4321232と入力してみてください。なんか懐かしいメロディーが聞こえてきませんか。
2回目の勉強会でパソコンとArduinoを連携させることはできないかとご質問を頂いたので、 Arduinoの兄弟プロジェクトProcessingを使ってArduinoの光センサーで読み込んだ値でパソコンのProcessingの画面の円の色を変えてみます。
最初にProcessingを以下のサイトからバージョン1.5.1をダウンロードしてください。
Windowsの場合、ダウンロードしたzipファイルを解凍すると、processing-1.5.1のフォルダが作られるので、デスクトップなど適当な場所に置いておきます。
前回の光センサーの例題では、センサーから読み取った値を文字列に変えて、パソコンに送りましたが、
Processingの例題では、読み込んだ値をそのまま送ります。
int lightPin = A0; // 光センサーはA0につながっている
int lightReading; // 光センサーからの値を保持する変数
void setup() {
}
void loop() {
} }}
スケッチのArduinoへの書込が完了したら、シリアルモニターを使って動いているか確認してみましょう。 メニューからツール→シリアルモニターを選択して、なにやら変な記号や文字がでてきます。 これは、光センサーの値をそのままパソコンに送っているため、このように表示されています。
確認が終わったら、必ずシリアルモニターを閉じて下さい。
processingを起動してみましょう。何となくArduino IDEと似ていると思いませんか。
ProcessingでArduinoからの情報を受け取る例題として、File→example→Libraries→Serial→SimpleReadがあります。 今回は、これを少し変更してみます。
以下のスケッチをProcessingにコピー&ペーストしてください。
/**
import processing.serial.*;
Serial myPort; // シリアルポートを保持する変数myPortを宣言します. int val; // 読み込んだ値を保持する変数valを宣言します.
void setup() {
}
void draw() {
} }}
Arduinoの例題ではCOMnをセットしましたが、Processingでは、何番がArduinoのCOMnか分かりません。 スケッチの以下の部分の数字を調節してみてください。
String portName = Serial.list()[0]; }}
ArduinoとProcessingを動かしてみて下さい。画面に以下のようなウィンドウが出てきて、Arduinoの光センサー に反応して色が変わるのが分かります。
今回は、これでお終いです。 次回は、いよいよProtoSnap Pro Miniをバラバラにして、ブレッドボードを使ってみることにしましょう。
2月22日のArduino勉強会で気づいた点、説明が不足していた部分をここで補足します。
変数は、値を保持する入れ物(箱)だと説明しましたが、配列は連続した箱を持つ入れ物で、n番目の値(インデックス)を取り出す時には、
tones[n] }} のようにn番目の数字をカギ括弧[]で括って使います。配列のインデックスは0始まりで配列の長さ-1の値になります。
パソコンから読み込んだ文字chから'1'を引くことでtonesのインデックスを計算しているのは、 ASCIIコードで0から9の数字が連続して定義されていることを利用しています。
}}
「ブザーを使って音を出す」の例題では、パソコンから送られた文字(コード)をchを配列tonesの添え字
パソコンでは、人が使っている文字をパソコンで理解できる数値で表現しています。例えばアルファベットのAは、 ASCIIコードでは65という数値で表されます。光センサーの値をシリアルモニターで見たときにアルファベットの大文字がたくさん表示されたのは、65近辺の値をパソコンに送っていたからです。
ASCIIコードの最初の方は、制御コードと言って目に見えない文字(改行やバックスペース等)が含まれています。 このような文字コードを使ってパソコンが文字を表示していることを覚えておいて下さい。
皆様のご意見、ご希望をお待ちしております。勉強会で分からなかったこと等、お気軽に問い合わせて下さい。
スパム防止に画像の文字列も入力してください。