4
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

Arduino UNO : USB2UARTの最大通信速度を探る(1)

Posted at

##Arduino UNOのUSB2UART最高速度は115200bps ??
各場所を調べてもArduinoのUART最高速度は115200で、それ以上は保証しないと書かれています。
しかし、私が試している限りでは921600bpsを設定しても普通に通信ができています。
下記サイトを見ると、500000bpsで通信速度自体は頭打ちとのオシロ上での測定結果もあります。
https://arduino.stackexchange.com/questions/296/how-high-of-a-baud-rate-can-i-go-without-errors
Arduino UNO USB2UARTで実際にはどれくらいのスピードで通信できるか測定してみます。

###Arduino UNO部品レベルの限界値
ここでArduinoは Arduino UNO R3(Revision3)前提となります。
外付けOSCとATmega328P、USB2UART ICの設定を見てみます。
回路図は下記よりダウンロードできます。
https://www.arduino.cc/en/uploads/Main/Arduino_Uno_Rev3-schematic.pdf

ATmega328Pがメインマイコンとなります。
メインクロックは16MHzの水晶が搭載されています。
この関係から、ATmega328Pに接続されるUARTは Max 2Mbpsまで可能だと思われます。
FTDIのUSB2UARTチップを外付けで使えばこのスピードで通信が可能となります。

Arduinoの場合USB通信(Virtual Com Port)用に ATmega16U2が搭載されています。
このマイコンがUART⇔USB変換と、FW書き込みを担っていると思われます。
メインクロックは16MHzの水晶が搭載されています。
こちらのUART通信最高速度は2Mbpsです。ATmega328PとATmega16U2がUART接続されているため、
システム全体では2Mbpsが最高速度となっていると思われます。

###通信時間確認プログラムを作る
この通信速度を計測するプログラムを作成してみます。
1byteを相互に通信しあうプログラム
それぞれに対して100kbyte送信するまでの時間を測定します。

100kbyte * 2(送受信) * 8(bit) / 秒数 = ??? bps

Arduino側送受信

SpeedText.ino
#include <Wire.h>
#define BAUDRATE 500000

char buffer[0x10];

void setup() {
  Wire.begin();
  Serial.begin(BAUDRATE);
}

void loop() {
  if (Serial.available() > 0) {
    buffer[0] = Serial.read();
    Serial.write('!');
  }
}

PC側送受信 (Python)

SpeedText.py
import sys
import serial
import time

from StopWatch import *

datasize = 1024*100

if __name__ == "__main__":

    print("Arduino USB Speed Test")
    sw1 = StopWatch("No1")
    ser = serial.Serial()
    ser.baudrate = 500000
    com_str = 'COM3'
    ser.port = com_str
    ser.open()
    time.sleep(2)
    print("start")

    sw1.start()
    for i in range(datasize):
        ser.write(str.encode("!"))
        data = ser.read(1)
    print(sw1.name + ":" + str(sw1.stop()))
    print("finesh")

測定結果
209.718秒
計算してみると、1024*100 * 2 * 8 / 209.718 = 7812bps
50000bpsを設定しているのになかなかの遅さです。

他のボーレートでも通信速度確認してみる。
115200bpsを設定してみても、計測結果は209.7144秒とほぼ一緒。
57600bpsを設定すると、419.4265秒とほぼ倍。 約3906bps
という事で、Web情報通りにArduinoは115200bpsがUSB-UART接続を使った場合の最大速度だと思われます。

Virtual COM Port Driverは2Mbps設定可能で、実際通信ができます。
ただ、どこかの通信経路がボトルネックとなるか、別途調べてみたいと思います。

4
3
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
4
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?