カテゴリ
リンク

当サイトは、玄箱PRO (KURO-BOX/Pro)を中心とした組み込み、Linuxと電子工作を扱っています。
会社案内

情報セキュリティおよび個人情報の取り扱いについて


コメントとトラックバックは、spamを予防するために、編集担当が公開の作業をするまで非公開になっています。コメントはそれぞれ投稿した人のものです。

■Arduino で非同期シリアルを使う
 Arduino の非同期シリアルには、ディジタル入出力の0ピン(RX)と1ピン(TX)を使います。0ピンは、パソコンや玄柴からArduinoへの信号、1ピンがArduinoからパソコンや玄柴への信号となります。Arduino Duemilative の場合、これらのピンはボード上で USB シリアルとつながっているので配線をする必要はありません。Arduino Pro などの場合は、プログラムを書き込むときと同様にシリアル・アダプタが必要です。

■非同期シリアル通信に関係する関数
 非同期シリアルに関する関数は、
  • Serial.begin(int speed)
  • Serial.end()
  • Serial.available()
  • Serial.read()
  • Serial.flush()
  • Serial.print(data, format)
  • Serial.println(data, format)
の七つです*1。Serial.begin()の引数にはボーレートを指定します。ほかのパラメータは、パリティ・チェックなし、フロー制御なし、8ビットに固定されています。Serial.beginを呼び出すと、0番と1番のディジタル・ピンは非同期シリアル専用になります。通信を終わって Serial.end 関数を呼ぶと、ディジタル入出力に使えるようになります。

*1 Serial は C++ のクラスで実装されていて、beginなどはクラス内関数となっています。ライブラリの中でインスタンスが作られているので、とくにクラスを意識する必要はありません。

■データを受け取る関数
 Serial.available 関数は、Arduino が現在受け取っているデータのバイト数を返します。0なら処理をスキップするなどに使えます。Serial.read 関数は受信したデータを1バイト返します。戻り値が-1なら受信していません。Serial.flush 関数は現在受け取っているデータをすべて破棄します。通信を最初からやり直す場合などに使います。

■データを送る関数
 Serial.print 関数と Serial.println 関数で Arduino からデータを送ります。

Serial.print("test");

とすると "test" という文字列が送られます。

Serial.println("test");

とすると "test\r\n" という文字列が送られます。改行したい場合に便利です。

Serial.print(100);          // 100  (10進数)
Serial.print(0x64);         // 100  (10進数)
Serial.print(100, DEC);     // 100  (10進数)
Serial.print(0x64, HEX);    // 100  (10進数)
Serial.print(100, HEX);     // 64   (16進数)
Serial.print(0x64, HEX);    // 64   (16進数)
Serial.print(100, BIN);     // 1100100 (2進数)
Serial.print(0x64, BIN);    // 1100100 (2進数)

とすると、それぞれコメントの部分の数字の文字列が送られます。Serial.println の場合は"\r\n"がつきます。

Serial.print(0x31, BYTE);

とすると、0から255の値がそのまま送られます。16進数で0x31の場合にはASCIIコードで'1'を意味するので受け取った側では'1'となります。各関数についての詳細はリファレンスマニュアル(日本語訳)を読んでください。

■シャットダウン・スイッチ用のスケッチ
 シャットダウンスイッチ用のスケッチを見てみましょう。最初に、ピンに名前をつけるためのグローバル変数の宣言があり、つぎに経過時間などを記憶する変数の宣言があります。

/* ピン番号の定義 */
const int LEDpin = 13;
const int SWpin = 2;

/* グローバル変数の宣言 */
unsigned long previousMillis = 0, SWMillis = 0;
int oSW = 0;
bool LED = false;
bool blinkLED = true;
bool Sent = false;

 setup関数では、pinMode 関数で使用するピンの初期化と、Serial.begin 関数でシリアル通信の初期化をしています。

void setup()
{
  // ピンの入出力を設定する
  pinMode(LEDpin, OUTPUT);
  pinMode(SWpin, INPUT);
  // シリアルポートの初期化 (9600bps)
  Serial.begin(9600);
}

 loop関数では、1文字シリアルから受信すると点滅フラグを立てています:

  if (Serial.available()>0) {
    int c = Serial.read();
    blinkLED = true;
  }

 フラグが立っている間は 0.5秒ごとに点滅させます:

  if (millis() - previousMillis > 500) {
    if (blinkLED) {
      if (LED) {
        LED = false;
        digitalWrite(LEDpin, HIGH);
      } else {
        LED = true;
        digitalWrite(LEDpin, LOW);
        blinkLED = false;
      }
    }
    previousMillis = millis();

 0.5秒経過するとフラグを消します。これで通信が途絶えると LED が消えるようになります。最後にスイッチを確認しています:

  if (digitalRead(SWpin) == 0) {
    if (oSW == 0) {
      SWMillis = millis();
      oSW = 1;
    }
    if (millis() - SWMillis > 5000 && Sent == false) {
      Serial.println("shutdown");
      Sent = true;
    }
    digitalWrite(LEDpin, HIGH);
  } else {
    if (!blinkLED && oSW != 0)
      digitalWrite(LEDpin, LOW);
    oSW = 0;
    Sent = false;
  }
 スイッチが OFF → ON になってから、5秒間押し続けていれば "shutdown\r\n"を送ります。またスイッチを押していても二度送らないようにフラグを立てています。

 次回は、玄柴に Arduino をつなぎ、シャットダウン・スイッチを完成させます。
(光永 法明)

 カテゴリ 

 

トラックバック(0)

このブログ記事を参照しているブログ一覧: Arduinoで玄柴用のシャットダウン・スイッチを作る(4/5)

このブログ記事に対するトラックバックURL: http://www.eleki-jack.com/mt/mt-tb.cgi/4050

おすすめ書籍
Powered by
Movable Type 4.1
/*yahoo remove*/