• Skip to main content
  • Skip to primary sidebar
  • Skip to footer
  • HOME
  • Arduino
    • Arduino初心者編
    • Arduino基礎編
    • Arduino応用編
    • Arduino実践編
  • Raspberry Pi
  • microbit
  • XBee
  • Scratch
  • Contact Us
  • Privacy Policy

STEMSHIP

ものづくりを通して、科学を学ぼう!

現在の場所:ホーム / Arduino / Arduino初心者編 / Arduino初心者編:シリアル通信によるArduino間のデータ送受信

Arduino初心者編:シリアル通信によるArduino間のデータ送受信

2020年8月1日 by STEMSHIP 2 コメント

汎用の入力端子・出力端子は扱い易いですが、複雑なデータ(センサの測定値や液晶画面に表示するテキストなど)を送受信することは簡単ではありません。Arduinoには複雑なデータを送受信するための通信インタフェースがいくつか装備されています。今回は、その中でも一番基礎的なシリアル通信の通信方式やプログラミング方法について紹介します。

概要

シリアルインターフェースはコンピュータ同士がデータの送受信を行う最も古い方法の一つで、1960年代に開発されました。

RS-232(RS – 推奨標準、推奨標準)という名前でルールが作られ、2000年代に入ってUSBが広く使われるようになるまでの長い間、PC用の機器の接続などに広く利用されてきました。英語圏では使用されているモジュールの名前にちなんでUART(ユアート)とも呼ばれています。UARTは「Universal Asynchronous Receiver/Transmitter」の略称で、非同期シリアル通信とパラレル通信を相互に変換する回路を指します。

RS-232Cインタフェースの利点は、ほぼすべてのマイクロコントローラやコンピュータと接続できる点です(変換器が必要な場合もあります)。 しかし、クロック信号がないためにノイズによる干渉の影響を受けやすく、特に通信速度が速い場合やケーブルが長い場合には、影響を受けやすくなります。コンピュータ上でのテスト出力に限ってシリアルインタフェースを使用する場合もあります。

通信方式

データ伝送に必要なのは、送信・受信それぞれ1本の通信線(と共通のグランド接続)だけです。データビットは、負論理で順番に(直列に)送信していきます。負論理とは、Hiレベル(+3 Vから+15 V)が0、Loレベル(-3 Vから-15 V)が1を表していることを意味しています。

シリアルデータ信号(RS-232)の通信ルール

データ伝送は、ビットグループ(バイト)をビット単位で順番に伝送します。

通常、1バイト=8ビットとすることが多いですが、8ビットではない場合もあります。これに加えて、ビットグループの先頭にはデータの始まりを指定するスタートビット、末尾には通信エラーが起こっていないかを確認するためのパリティビットと、データの終わりを示すストップビットが付いています。

スタートビットを読み取ることにより、受信側は新しいデータが始まるタイミングを認識します。しかし、一つ一つのビットを間違いなく読み取るためには、スタートビットを受信してから一定の時間間隔で信号を読み取らなければならないため、伝送速度:1ビットの情報の送信に割り当てた時間を知っておく必要があります。受信側が送信側で使用した速度と異なる速度で読み取った場合、信号を正しく受け取れません。

Arduinoのシリアル通信

シリアルインタフェースの通常の通信速度は 300 ~115200 Baudが使われ、一般のアプリケーションでは9600 Baudが最高速度であるとされています。

コンピュータ上のArduino IDEは、コンパイラがマシンコードに変換した後に、スケッチをArduinoに転送するためにシリアルポートを使用します。そのために、Arduinoボード上にUSB-シリアル変換回路を搭載することで、コンピュータとArduinoがシリアル通信できるようになっています。USBケーブルでコンピュータと接続していない場合は、この変換回路は無視できます。

また、デジタル端子D0(Arduinoから出力)、D1(Arduinoへ入力)で、シリアル信号を送受信できます。この時、プログラムでシリアルインタフェースを使用している場合は、デジタル入出力ピンD0、D1は出入力ピンとしては使用できなくなります。

シミュレーション

2つのArduino間で文字列を送受信します。通信速度を合わせておかなければならないので、setup()関数内で両方とも9600 Baudに設定します。

送信側Arduino

送信側Arduinoは文字列「LED ON」をSerial.write()関数でシリアル送信します。Serial.write()関数は1バイトずつ、または複数バイトの送信が可能です。文字列送信後はLED接続ピンをHIGH出力にします。Serial.flush()はデータ送信が完了するのを待ちます。これを5回繰り返します。

#include <SoftwareSerial.h> //library
//library is needed
/*
  send and receive UART data
*/
char TX[8] = "LED ON"; // char data array

void setup()
{
  pinMode(2, OUTPUT); // LED pin output
  Serial.begin(9600); // set baudrate
}
int x = 0; // datatype whileloop
void loop()
{
  // do this while x is smaller then 5 for example
  while(x < 5){
	Serial.write(TX,7); // send byte array
	digitalWrite(2, HIGH); // make IO logic HIGH
	delay(500);
	x++; // increament our var x
	Serial.flush(); // clear send buffer
  }
digitalWrite(2, LOW); // make IO logic LOW
  	

}

受信側Arduino

受信側Arduinoはシリアルデータを受け取ると、「GOT IT」をシリアルポートに出力します。受信データがあるかどうかは、Serial.available()関数で確認できます。受信データはSerial.readBytes()関数で読み込めます。

#include <SoftwareSerial.h>
// library is important
/*
  send and receive UART data
*/
char RX[8]; // incoming data array

void setup()
{
  pinMode(12, OUTPUT); // set port output
  Serial.begin(9600); // set baud usb
}

void loop()
{	
  if (Serial.available() > 0) // check if there data in buffer
	{
	Serial.println("GOT IT\n"); // we got something 
  	Serial.readBytes(RX,7); // read the incoming data array[]
	digitalWrite(12, HIGH); // set pin high
    Serial.flush(); // clean out RX data if needed
  	}
  else
	{
  		digitalWrite(12,LOW); // set pin low
	}
  
}

TINKERCADシミュレーション

シミュレーションを開始ボタンを押してください。シリアルモニタは、「コード」を開き、「シリアルモニタ」のタブを展開すると表示できます。もし表示されない場合は、TINKERCADのページに飛んでください。

Filed Under: Arduino初心者編 関連タグ:シリアル通信

Reader Interactions

コメントを残す コメントをキャンセル

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください。

最初のサイドバー

CONTACT US

  • Facebook
  • Twitter
  • Youtube

More to See

Arduinoベースのセンサノード:XBeeデータ収集ノードの製作

2021年9月27日 By STEMSHIP

Arduinoベースのセンサノード:Arduinoを使った温度センサの作製

2021年9月21日 By STEMSHIP

XBeeモジュールとBMP280センサを使用してデータ収集する

2021年5月31日 By STEMSHIP

XBeeモジュールでMicroPythonを使ってセンサを読み取る

2021年5月24日 By STEMSHIP

XBeeモジュールでセンサを読み取る:センサノードの設定と測定

2021年5月17日 By STEMSHIP

カテゴリー

  • Arduino (44)
    • Arduino初心者編 (15)
    • Arduino基礎編 (11)
    • Arduino実践編 (4)
    • Arduino応用編 (11)
    • Arduino番外編 (3)
  • MakeyMakey (1)
  • microbit (11)
  • Raspberry Pi (13)
  • Scratch (6)
  • STEM教育 (5)
  • XBee (15)
  • ものづくり教育 (2)
  • 子供の教育 (2)
  • 科学 (6)
  • 算数 (5)

Tags

BLE DCモータ EEPROM ELEGOO ESP32 ESP8266 IoT LCD LED makeymakey MQTT Node-RED scratch STEM教育 WiFi XBee アニメーション オンラインゲーム カメラ クローン ゲーム コスチュームの変更 サーボモータ ステッピングモータ ステートマシン スピーカ タイマー ピンポン ブロック定義 ペン ライントレース ラジコン リスト 分数 割り込み 実験 工作 幼児 当たり判定 温度センサ 無線通信 物理 角度制御 重力 音楽

Footer

最近の投稿

  • Arduinoベースのセンサノード:スケッチ(プログラム)の作製
  • Arduinoベースのセンサノード:XBeeデータ収集ノードの製作
  • Arduinoベースのセンサノード:Arduinoを使った温度センサの作製
  • XBeeモジュールとBMP280センサを使用してデータ収集する
  • XBeeモジュールでMicroPythonを使ってセンサを読み取る

タグ

BLE DCモータ EEPROM ELEGOO ESP32 ESP8266 IoT LCD LED makeymakey MQTT Node-RED scratch STEM教育 WiFi XBee アニメーション オンラインゲーム カメラ クローン ゲーム コスチュームの変更 サーボモータ ステッピングモータ ステートマシン スピーカ タイマー ピンポン ブロック定義 ペン ライントレース ラジコン リスト 分数 割り込み 実験 工作 幼児 当たり判定 温度センサ 無線通信 物理 角度制御 重力 音楽

Search

2023年3月
月 火 水 木 金 土 日
 12345
6789101112
13141516171819
20212223242526
2728293031  
« 10月    

Copyright © 2023 · STEMSHIP.COM