LoginSignup
3
1

Arduino UNO R4 Minimaの速度検証

Posted at

今年の6月末ごろにArduino Unoの新型となるR4 Minima/WiFiがリリースされ、先日Minimaを大阪日本橋のシリコンハウスで入手しました(3200円ぐらい)。従来ではATMega328Pを搭載してましたが、今回はルネサスのRA4M1というマイコンに変更され大幅に機能が強化されました。HIDサポートやメモリ増加、DAC搭載などいろいろありますが今回は動作クロックが16MHzから48MHzへとなり、動作が3倍に高速化されました。そこでこの記事ではdigitalWritedigitalReadanalogReadの速度を検証します。

R3での検証

garretlabさんのR3の検証記事を参照ください。そちらではdigitalReadが3.52~4.97us、digitalWriteが3.14~4.59us、analogReadが112usとのことでした。

R4での検証

検証方法

R3と比較するため上記内に記載されている検証コードを基本改変せずに使用。RESETボタンでの再起動で2回検証。開発環境はArduinoIDE 2.1.1です。

const int repeat = 10000;
 
void measure(int pin) {
  long begin, end;
  volatile int val;
   
  Serial.print("Pin No.: ");
  Serial.println(pin);
 
// digitalRead()
  pinMode(pin, INPUT);
  delay(3000);//0ピンの結果を表示するため待機時間を変更
  begin = micros();
  for(int i = 0; i < repeat; i++) {
    val = digitalRead(pin);
  }
  end = micros();
   
  Serial.print("  digitalRead:    ");
  Serial.println((end - begin) / (float)repeat);
 
// digitalWrite()
  pinMode(pin, OUTPUT);
  delay(1000);
  begin = micros();
  for(int i = 0; i < repeat; i++) {
    digitalWrite(pin, HIGH);
  }
  end = micros();
   
  Serial.print("  digitalWrite:   ");
  Serial.println((end - begin) / (float)repeat);
   
// analogRead()
  if ((pin >= A0) && (pin <= A5)) {
    val = analogRead(pin);
    begin = micros();
    for(int i = 0; i < repeat; i++) {
      val = analogRead(pin);
    }
    end = micros();
   
    Serial.print("  analogRead:   ");
    Serial.println((end - begin) / (float)repeat); 
  }
   
  Serial.println();
}
   
void setup () {
  int pin;
   
  Serial.begin(9600);
  for(pin = 0; pin < 20; pin++) {
    measure(pin);
  }
}
 
void loop () {
}

検証結果

私の持っているR4Minima(純正)ではdigitalRead1.13usdigitalWrite0.75usanalogRead26.01usとなりました。
image.png

digitalReadでは約3.1~4.4倍、digitalWriteでは約4.2~6.6倍、analogReadでは約3.5~5.2倍で動作するようになりました。

しかし、A0からA5まで処理時間が増加しているのが気になります。そこでA5からA0への逆向きで再び2回測定。
結果は2回とも共通でした。
image.png

25us前後という結果となりました。(digitalRead/Writeは変わらず)

まとめ

R4 MinimaではIO周りでは速度が3~6倍になりました。またデジタルピンはR3で見られたピンごとの速度のばらつきがなくなり、全ピンで速度はほとんど一定となりました。(どこかの記事で見た全ピンがPWM対応になったのが影響?)またanalogReadは実行方法で変動があるようです。
また結果の項で書きませんでしたが、setup内のSerial.beginの後に2msのdelayを入れたところdigitalReadが1.17us、digitalWriteが0.84usへとやや遅くなりました。analogReadは変わりませんでした。

追加検証したいこと

ピンの順番をランダムにするなどしてanalogReadの処理時間がどう変化するか、前後の処理で各処理時間がどう変動するか。またIDEの更新に伴う影響があったか。

みなさんの追走や疑問などのコメントお待ちしております。

3
1
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
3
1