シリアル出力をするArduinoのプログラム(スケッチ)
プログラムの基本パターン
Arduinoボードの動作を制御するためのプログラム(スケッチ)には、 プログラムの起動後1度だけ実行する処理(初期化処理)と、繰返し実行する処理とを分けて書きます。初期化処理はsetup()関数内に、繰返す処理はloop()関数内に書きます。setup()関数に記述された命令が一度実行された後、loop()に記述された命令が繰返し実行されます。
//ここにはプログラムを通して使う変数の定義を書く void setup(){ //ここには、ポートの設定など、1度だけ実行する命令を書く } void loop(){ //ここには、値の入出力や計算など、繰り返し実行する処理を書く }
処理の記述にはArduino言語を使います。Arduinoボードを制御するための機能(関数)が用意されているので、それによって入出力などの動作や計算を行います。
プログラミング環境の[新規ファイル]アイコン、あるいはメニュー[ファイル]の[新規ファイル]をクリックすると、空の setup()と loop()が定義されたスケッチが開くので、処理を記述します。ただ、まったくのゼロからスケッチを書くのではなく、サンプルを元に修正することが多いでしょう。
プログラミング環境のメニュー[ファイル]の[スケッチ例] には、動作に応じた 多くのサンプルが用意されています。
適したサンプルを選択してエディタに表示し、修正して、プログラミング環境の[保存]アイコンをクリックすると、 保存する場所と名前を指定するダイアログウィンドウが現れます。ここで入力した名前のフォルダ(スケッチフォルダ)が作られ、その名前で拡張子がinoのファイルにスケッチが保存されます。
デジタル入力に応じたシリアルデータの送信
次のスケッチは、スイッチをGNDからデジタルピン2につないだ回路で、スイッチがオンなら1を、スイッチがオフなら0を、シリアルポートに0.1秒ごとに送るプログラムです。【リスト デジタル入力】 int switchPin = 2; //スイッチをつなげたピン番号 int switchState = 0; //スイッチの状態を保存する変数 void setup() { pinMode(switchPin, INPUT_PULLUP); //ピン2をプルアップ入力として初期化 Serial.begin(9600); } void loop() { switchState = digitalRead(switchPin); //ピン2を読む Serial.println(switchState); //確認用にシリアルモニタに読んだ値を出力 if (switchState == LOW) { //スイッチが入っていれば、switchStateの値はLOW Serial.write(1); } else { Serial.write(0); } delay(100); }
まず、変数の準備(これを変数の定義と言う)をしています。データ型に続いて変数の名前を書きます。
int switchPin = 2; //スイッチをつなげたピン番号 int switchState = 0; //スイッチの状態を保存する変数データ型はデータの種類を表す名前で、「int switchPin」 のintは整数を表すデータ型、switchPinは変数の名前です。変数の宣言は関数の外で、使う前に記述します。
setup()関数の中では、 pinMode()関数を使って、ピン2をプルアップ入力として初期化しています。 続いて、 Serial.begin()関数を使ってシリアル通信の速度を設定しています。
loop()関数の中では、まず digitalRead()関数を使って、スイッチをつなげたピン(ここでは2とした)から値を読み、値を変数switchStateに代入しています。 ピン2はINPUT_PULLUPを指定して初期化した(つまりArduinoボード内蔵のプルアップ抵抗を利用する)ので、スイッチがオフだとHIGH、スイッチがオンだとLOWの値になります。
テスト段階で、読んだ値をシリアルモニタで確認するため、Serial.println()関数で読んだ値を出力しています。この値もシリアル出力され、Processing側で読むので、テストが終われば不要です。
読んだ値に応じて、シリアルポートに1あるいは0を出力するため、 if文を使っています。シリアル出力には、 Serial.write()関数を使います。
アナログ入力に応じたシリアルデータの送信
次のスケッチは、可変抵抗またはセンサーをアナログピン1に接続(可変抵抗の中央ピンをアナログピン1に、両側のピンを5V電源とGNDに接続)し、その値を読んで、それに応じた値をシリアルポートに0.1秒ごとに送るプログラムです。【リスト アナログ入力】 int analogInPin = 1; //可変抵抗(センサ)をつないだピン int sensorValue = 0; //可変抵抗(センサ)から読んだ値を保存する変数 int outputValue = 0; //出力する値を保存する変数 void setup() { Serial.begin(9600); //シリアル通信を9600 bpsに初期化 } void loop() { sensorValue = analogRead(analogInPin); //アナログ入力値を読む //読んだ値を0-255(1バイトの値の範囲)に変換(マッピング) outputValue = map(sensorValue, 0, 1023, 0, 255); Serial.write(outputValue); //シリアル出力する //シリアルモニタでの入出力値の表示、Processingで読む時はコメントアウト Serial.print("sensor = "); Serial.print(sensorValue); Serial.print(", output = "); Serial.println(outputValue); delay(100); }
まず、可変抵抗(センサ)をつないだピン番号(analogInPin)とそこから読んだ値(sensorValue)、出力する値(outputValue)を保存しておく変数を定義します。
setup()関数の中では、 Serial.begin()関数を使ってシリアル通信の速度を設定しています。
loop()関数の中では、まず analogRead()関数を使って、可変抵抗(センサ)と接続したピン(ここでは1とした)から値を読み、変数sensorValueに代入しています。 入力値は0-1023の間で、ピンに電流が流れていない(0V)場合0、5Vの電流が流れていると1023です。
シリアル通信では1バイトのデータ(値の範囲は0-255)を送るので、入力値(0-1023)を0-255の範囲に、 map()関数を使って換算します。
outputValue = map(sensorValue, 0, 1023, 0, 255);そして、換算した値を シリアルポートに Serial.write()関数を使って出力しています。
テスト段階で、Arduinoボードが正しく値を読んでいるか、出力しているか確認したいことがあります。それにはシリアルモニタを使います。次の4行は入出力値をシリアルモニタへ表示する命令で、Serial.print(), println()関数を使い、文字列と値を出力しています。
スケッチをArduinoボードに書き込み、プログラミング環境(IDE)の シリアルモニタを起動すると、次のように表示されます。
? sensor = 1023, output = 255行の先頭には、意味がわからない記号が表示されますが、これはSerial.write()関数が出力したバイトデータで、文字としての表記がないので、意味不明の記号になります。 テスト段階で、確認のためにシリアルモニタを使う場合は、Serial.print(), println()関数を使って、 文字としてデータを送ることで、 シリアルモニタ上で人が読める形で表示されます。
Processing側でデータを読む際、これらの文字列は不要なの、テストが終わったら、この4行は削除(コメントアウト)します。