第7回 シリアル通信

1.やってみよう

(1) 図1に示す実験回路を作りなさい。



図1.実験回路

(2) Arduinoのプログラミング環境に、つぎのプログラムを入力しなさい。
int x, y, s, r;

void setup()
{
  pinMode(13, OUTPUT);
  pinMode(2, INPUT_PULLUP);
  
  Serial.begin(9600);
  
  x = 1;
  y = 1;
  s = 1;
  r = 1;
}

void loop()
{
  if (Serial.available() >= 1)
  {
    r = Serial.read();

    if (r == 0)
    {
      digitalWrite(13, 1);
    }
    else
    {
      digitalWrite(13, 0);
    }
  }
  
  x = digitalRead(2);
  
  if (y == 1 && x == 0)
  {
    s = 1 - s;
    Serial.write(s);
  }
  y = x;
  
  delay(20);
}
(3) 書き込みボタンを押して、Aruduinoのプログラムを実行しなさい。
(4) Processingのプログラミング環境に、つぎのプログラムを入力しなさい。
import processing.serial.*;

Serial serial;
int s, r;

void setup()
{
  size(200, 150);
  frameRate(30);
  
  serial = new Serial(this, "COM1", 9600);
  
  s = 1;
  r = 1;
}

void draw()
{
  background(255, 255, 255);
  
  if (serial.available() >= 1)
  {
    r = serial.read();
  }
  
  if (r == 0)
  {
    stroke(0, 0, 0);
    fill(255, 255, 255);
    rect(90, 90, 20, 20);
    fill(0, 0, 0);
    ellipse(100, 100, 18, 18);
  }
  else
  { 
    stroke(0, 0, 0);
    fill(255, 255, 255);
    rect(90, 90, 20, 20);
    fill(255, 255, 255);
    ellipse(100, 100, 18, 18);
  }
  
  if (s == 0)
  {
    stroke(0, 0, 0);
    fill(255, 255, 255);
    rect(90, 40, 20, 20);
    fill(0, 0, 0);
    ellipse(100, 50, 18, 18);
  }
  else
  {
    stroke(0, 0, 0);
    fill(255, 255, 255);
    rect(90, 40, 20, 20);
    fill(255, 255, 255);
    ellipse(100, 50, 18, 18);
  }
}

void mousePressed()
{
  s = 1 - s;
  serial.write(s);
}
(5) Runボタンを押して、Processingのプログラムを実行しなさい。マウスをクリックするたびに、ひとつ目のトグルボタンの表示が切り替わり、それと同時にLEDの発光と消灯が切り替わることを確認しなさい。また、スイッチを押すたびに、ふたつ目のトグルボタンの表示が切り替わることを確認しなさい。

2.解説

 マイコンボードとPCを連携して動作させると、それぞれが得意とする機能を組み合わせて利用できるようになるため、モノづくりの可能性が大きく広がることになる。
 図2に示すように、こうしたしくみを実現するため、マイコンボードとPCの間でデータをやり取りするためのプロトコルとして広く利用されているのがシリアル通信である。



図2.シリアル通信によるマイコンボードとPCの連携

 シリアル通信の機能は、ArduinoとProcessingにも用意されている。図3に示すように、write関数を使ってデータを送信し、available関数とread関数を使ってデータを受信するのが、ArduinoとProcessingの間でデータをやり取りするための一連の手順になっている。
 ここで紹介したプログラムは、シリアルポートのIDとして「COM1」を指定したものになっているが、正しくはArduinoが接続されているシリアルポートのIDを指定する必要があり、実際の環境に合わせて書き換える必要がある。Arduinoが接続されているシリアルポートのIDは、Arduinoのプログラミング環境の「ツール」メニューから「シリアルポート」を選択することで確認することができる。
 シリアル通信の速度にはさまざまな選択肢があるが、ここで紹介したプログラムは、デフォルトの設定として9600 bpsを指定している。



図3.ArduinoとProcessingの間でデータをやり取りするための一連の手順

3.課題

(1) ArduinoにフルカラーLEDを接続しなさい。PCのキーボードを使って、「R」を押すと赤、「G」を押すと緑、「B」を押すと青が発光するプログラムを作りなさい。

(2) Arduinoに3個のスイッチを接続しなさい。それぞれのスイッチを押すと、Processingウィンドウの背景の色が、赤、緑、青に変化するプログラムを作りなさい。

4.ヒント

 Processingには、キーボードが押されるたびに、keyPressed関数を自動的に呼び出すしくみが用意されている。押されたキーは、keyというシステム変数を使ってチェックすることができる。たとえば、R、G、Bのそれぞれのキーを押すと、Processingウィンドウの背景の色が、赤、緑、青に変化するプログラムはつぎのようになる。
int x;

void setup()
{
  size(200, 150);
  frameRate(30);
  
  x = 0;
}

void draw()
{
  if (x == 0)
  {
    background(255, 0, 0);
  }
  else if (x == 1)
  {
    background(0, 255, 0);
  }
  else if (x == 2)
  {
    background(0, 0, 255);
  }
}

void keyPressed()
{
  if (key == 'R' || key == 'r')
  {
    x = 0;
  }
  else if (key == 'G' || key == 'g')
  {
    x = 1;
  }
  else if (key == 'B' || key == 'b')
  {
    x = 2;
  }
}

Last Modified: June 20 12:00 JST 2017 by Naofumi Aoki
E-mail: aoki@ime.ist.hokudai.ac.jp