シリアル通信に戻る    印刷する

シリアル出力をする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行は削除(コメントアウト)します。

arigat アットマーク acm.org / copyright © info