先日、マイコンボードArduinoシリーズの新型であるArduino UNO R4が発売されました。
Arduinoシリーズはシンプルさが特徴のマイコンボードで、ボードと開発環境の使いやすさ、 基板自体の拡張性の高さから、電子工作などのホビー用途からIoTや産業利用まで幅広い人々に利用されています。
一番最初に触るマイコンボードがArduinoシリーズという方も多いかと思います。
今回はそのArduino Uno R4のうち、基本的なモデルであるMinimaについて、従来モデルであるArduino UNO R3(以下R3)との違いを比較しながらレビューしていきます。
R4 WiFiというESP32を搭載してWiFiやBluetoothにも対応したモデルもありますが、本記事作成時点(2023年7月)では日本国内の技適を取得していないようでした。R4 WiFiついては今回は扱いませんが、機会があれば触ってみようと思います。
価格
Arduino UNO R4 Minima(以下R4)はDigi-Keyでの価格が3000円前後と、マイコン入門機として手が出しやすい価格になっています。先代のR3が4000円前後ですので、現行モデルのほうが安くなっています。
ちなみにDigi-Keyでは6000円以上の購入で送料が無料になります。
なので、例えばR4を2台と一緒に細々とした部品を購入して6000円にすることで、送料を無料にできます。在庫は潤沢にあるようなのでぜひ試してみてください。
Digi-Key以外ではスイッチサイエンスや秋月電子通商、Amazonなどで購入できます。
ハードウェア構成
AVRマイコンからルネサスマイコンに変更
Arduino UNO R3 | Arduino Uno R4 Minima | |
---|---|---|
CPUメーカー | AVR® ATmega | Renesas Electronics America Inc |
動作クロック | 16MHz | 48MHz |
プログラムメモリ | 32KB | 256KB |
データRAM | 2KB | 32KB |
データROM | 1KB | 8KB |
R4最大の変更点はCPUです。R3まではAVRマイコンを搭載しているのに対して、R4にはルネサス製のマイコンが搭載されています。動作クロックもR3は16MHz、R4は48MHzとなっています。
それに加えてプログラムメモリは従来の8倍の256KB、データRAMは16倍の32KB、データROMは8倍の8KBにそれぞれ増加しています。
これらの変更により、性能が大幅に向上しています。
このようにCPUは別物となっていますが、従来と同じ開発環境を使うことができます(記事後半参照)。
外観を詳しく
基板の形状は変わっていません。
Arduino の特徴の一つとして、シールドと呼ばれるドータボードのような基板を重ねることで機能を拡張することができます。R4にもシールド接続用のピンソケットがあります。
ピン配置も同一なので、既存のシールドがそのまま使用できる可能性が高いです。
おそらくJTAGデバッグ用と思われるSWDと書かれたピッチの異なるピンヘッダがあります。これはCPUのレジスタを直接読み書きするような低レイヤなデバッグを行うためのものです。
ただ、JTAGのデバッグデバイスは高価なため、個人の電子工作レベルでは必要ない装備かもしれません。
USBコネクタがTypeCになったことも嬉しい点です。TypeBケーブルを探す煩わしさから解放されます。
コネクタの全高が低くなり、また、コネクタのすぐ近くにあったAnalog Referenceピンヘッダも無くなっているので、自作のシールドを設計しようとしたときに、ついうっかり基板裏面と干渉してしまうというリスクが低くなりました。
なお、電源のDCジャックの形状は変更されておらず、従来どおりピンソケットよりも高さがある点には注意が必要です。
回路図
次はR4の回路図を見ていきます。
電源ICにはスイッチングレギュレータが使用されています。
また、DCジャックから電源ICまでの間に直列にショットキーバリアダイオードが入っていて、もし電源を逆接続しても壊れないようになっています。
こちらのスイッチングレギュレータのICもルネサス製でした。R4の電源入力は公称24Vまで対応しており、このレギュレータでマイコンの動作電圧である5Vまで降圧します。レギュレータのデータシートを参照すると、入力電圧は最大40Vまで対応しています。また、R4の回路図でもVinに接続されたコンデンサは耐圧25Vのものが二つ直列になっているため、実際のところ40Vまで入力可能かと思われます。ただし、推奨はしません。
一方でR3はリニアレギュレータを使用しており、レギュレータ自体の入力電圧は最大で20Vでした。R3公称では12Vです。
入力電圧の許容値の違いを見てみると、24Vという電圧はPLCの動作電圧などと同じため、R4の方は産業用途を意識しているのではないかと思われます。
R4のUSB入力部分には「ESD Protection」と表記があり、静電気保護用のダイオードが付いていることがわかります。一方で、R3ではバリスタが2つ付いていただけでした。電源の安定性にも気を遣っていることがわかります。
現物を見てみます。R3は基板上にレギュレータと入出力部の電解コンデンサが実装されています。
一方で、R4はスイッチングレギュレータICとインダクタ、そして電圧平滑用の積層セラミックキャパシタがあります。
R3の電解コンデンサは寿命が短いという欠点がありますが、それに比べて、R4は寿命の長い部品で構成されています。ただし、スイッチングレギュレータを使用しているため、インダクタや積層セラミックキャパシタなどの部品点数が増えています。
R3に搭載されているリニアレギュレータは低ノイズであるという長所がありますが、効率が非常に悪いという短所もあります。例えばR3の場合、12Vを入力して5Vで出力するので、効率はおよそ40%程度になります。降下された電圧*電流の電力が熱として消費されるためです。
一方でR4に搭載されているスイッチングレギュレータは、データシートによると全域で70~90%程度あります。
ノイズと効率はトレードオフの関係にありますが、R4の設計にあたってはこの仕様変更がなされたようです。
動作実験
実際にこのArduino UNO R4 Minimaを動かしてみます。
従来のArduino UNO シリーズと同じように使えるのかを検証していきます。なので、コード類はArduino言語での書き方になります。
AD変換とPWM制御の実験
まず、AD変換を行うプログラムを作成しました。
可変抵抗から出力されるアナログ出力の電圧を読んで、それに応じてPWM制御を行い、LEDの明るさを変化させます。
(参考にしたコード : Arduino.cc/built-in-examples)
//AD_TEST
int ledPin = 9; //LEDのピンを指定
void setup() {
//Serial.begin(9600); //UART開始
}
void loop() {
int sensorValue = analogRead(A0); //A0の数値を取得する
float voltage = sensorValue * (5.0 / 1023.0); //sensorValueに0-1023の読み取った数値を代入
analogWrite(ledPin, sensorValue>>2); //2ビットシフト。1024→256
//Serial.println(voltage); //デバッグ用数値の送信
}
I2Cを使ったセンサとの通信
6軸のジャイロ・加速度センサモジュールMPU-6050の出力をI2Cで読み取り、その値に応じたパルスをサーボモータに出力します。
センサの載ったブレッドボードを傾けると、それに応じてサーボホーンが動いていることがわかります。
(参考にしたコード : メカトロDIYチャレンジ(Mechatro DIY Challenge))
//SERVO_TEST
#include <Wire.h>
#include <Servo.h>
Servo myServo; //Servoオブジェクトを生成
volatile uint8_t data[14]; //データ読み込み
volatile int16_t ax = 0; //出力するデータ
void setup() {
myServo.attach(9); //サーボのPWM信号
Serial.begin(9600); //UART開始
Wire.begin(); //I2C開始
Wire.beginTransmission(0x68); //送信処理を開始する(0x68がセンサーのアドレス)
Wire.write(0x6b); //レジスタ「0x6b」(動作状変数)を指定
Wire.write(0x00); //0x00を指定(ON)
Wire.endTransmission(); //送信を終了する
}
void loop() {
MPU_DATAGET();
Serial.print("ax: ");
Serial.println(ax);
myServo.write(ax + 20);
}
void MPU_DATAGET() {
Wire.beginTransmission(0x68);
Wire.write(0x3b);
Wire.endTransmission();
Wire.requestFrom(0x68, 14); //0x3bから14バイト分の数値を要求
uint8_t i = 0;
while (Wire.available()) {
data[i++] = Wire.read(); //データを読み込む
}
ax = (data[0] << 8) | data[1]; //LowとHighを連結して、値を取得する
ax = abs(ax);
ax = ax >> 7;
}
動作クロック比較
次に動作クロックと命令実行時間を比較するため、loop関数内でデジタル出力の1/0を交互に切り替えるプログラムを作成しました。(参考にしたコード : Arduino.cc/built-in-examples)
int ledPin = 11;
// the setup function runs once when you press reset or power the board
void setup() {
// initialize digital pin LED_BUILTIN as an output.
pinMode(ledPin, OUTPUT);
}
// the loop function runs over and over again forever
void loop() {
digitalWrite(ledPin, HIGH); // turn the LED on (HIGH is the voltage level)
digitalWrite(ledPin, LOW); // turn the LED off by making the voltage LOW
}
タイマ割り込みなどは使用せず、ループ周期は純粋にCPUの命令実行時間のみに依存しています。
オシロスコープでそのデジタル出力の波形を取得し、周期を計測します。
その結果、R4、R3はそれぞれ509KHz、111KHzとなりました。
動作クロックが上がったことで、その分R4の方が高速に動作していることが分かる結果となりました。
計算能力の比較
最後に、計算能力を比較するためのベンチマークを行いました。
それぞれで同一のプログラムを実行し、その実行時間を計測します。計算内容は整数計算と浮動小数点計算それぞれについて行いました。条件と結果については以下のとおりです。
1.フィボナッチ数列(整数計算)
値が100,000を超えるまでのフィボナッチ数列を生成する作業を500,000回繰り返すのに要した時間を計測する。5回連続で計測し、その平均を取る。
2.素数探索
0~5000までの整数値を素数判定するのに要した時間を計測する。5回連続で実行し、その平均を取る。
3.三角関数
度数で与えられた角度を弧度法に変換し、それをsin, arcsin, cos, arccos, tan, arctanの順で三角関数の計算を行い、それを0~359°まで反復する。それをさらに50回繰り返す。
結果グラフ
いずれの条件においても、R3よりR4の方が5~50倍程度速く実行できています。
クロック周波数だけでなく、メモリ容量なども高速化の要因の一つであると考えられます。
まとめ
以上、Arduino UNO R4 Minimaを実際に使ってみた感想とレビューでした。
R3が世に出てから10年近くが経過していますが、多くの点で進歩していることがわかりました。
その一方で、マイコンボードとしてのシンプルさや使い勝手の良さはそのままであるという点が好印象でした。
価格の面でも手を出しやすく、これからマイコンを使った電子工作を始めようという方にもおすすめできる1台です。
コメント