UNO R4 WiFiチートシート
!
ここに記載されている操作の中には、ボードの復元ができなくなったり、ボードを壊したりする可能性のある操作が含まれています。また、誤訳が含まれている可能性もあるので、実際に試す場合は、https://docs.arduino.cc/tutorials/uno-r4-wifi/cheat-sheetを確認してください。

最も人気があり重要な開発ボードの4番目のリビジョンである、UNO R4 WiFiの設定方法を学習します。


AUTHOR: Jacob Hylén、LAST REVISION: 2024/01/05


Arduino UNOは、最も人気があり世界で認識されている開発ボードです。リリース以来、メーカーコミュニティや教育の場で定番になっています。Arduino UNO R4 WiFiボードは、UNOボードの4番目のリビジョンの一部で、32ビットMCU(ルネサスのRA4M1シリーズ)を初めて搭載しています。

このドキュメントはUNO R4 WiFiの技術概要を提供し、次のプロジェクトを始める際に役立つ情報やガイドへのリンク集です。

ESP32モジュールとルネサスRA4M1チップは、HID機能が利用できる非常に柔軟で適応性のある洗練されたUSBシリアルシステムの一部です。一方で、メインMCUとESP32の双方をプログラムできる機能も維持しています。ただし、これは、高度なオプションで、ハッキングが必要となります。

i
ボード上のESP32モジュールは、デフォルトでは、UNO R4 WiFiの外部接続を制御するファームウェアを実行しています。新しい機能を利用するには、このファームウェアを更新するか、バグや他の課題を解決する必要があります。このファームウェアを更新するには、いくつかの方法があります。ヘルプセンターの記事に詳細があります。

Arduino UNO R4 WiFi用のドキュメントプラットフォームを参照することもできます。

データシート

完全なデータシートは、以下のリンクからダウンロードできるPDFとして提供されています。

Download the Arduino UNO R4 WiFi Sense datasheet

電源

ボードには、VINピンから電源を供給することができます。この場合、6Vから24Vの範囲をサポートしています。VINピンはDCジャック(バレルコネクター)にも接続されています。

VINピンから電源を供給すると、電圧を5Vに下げるためにボード上のレギュレーターを利用します。このとき5Vピンは1.2Aまで供給することができます。この電圧レギュレータ―は、MCUやLEDを含む他の全ての部品に電源を供給することに注意してください。

i
大電流を引き出す外部デバイス(例: サーボモーター)は5Vピンから電源を供給しないでください。5Vピンはセンサーモジュールなどの低電流のデバイスで利用することを意図しています。

USB-C®コネクタを使うときは、5Vを供給する必要があります。

USB経由で電源を供給すると、ボード上の電圧レギュレータ―は完全に迂回します。この場合、5Vピンはボードを壊すことなく2Aまで供給することができます。

ボードパッケージ

UNO R4 WiFiは、Arduino UNO R4 Board Packageを基にしています。

インストール

UNO R4 WiFiは、Arduino IDEやArduino Webエディタ、Arduino CLIを使ってプログラムすることができます。

Arduino IDE

Arduino IDEでボードを使うには、最新のArduino UNO R4ボードパッケージを、ボードマネージャーからインストールする必要があります。

詳細はUNO R4 WiFiを始めるを参照してください。

Arduino Webエディタ

Webエディタは、全ての公式ボードを含んだオンラインIDEです。コアパッケージをインストールする必要はありません。Webエディタを使うには、CreateプラグインをPCにインストールする必要があります。

詳細はhttps://docs.arduino.cc/arduino-cloud/getting-started/getting-started-web-editorを参照してください。

Arduinoクラウド

Arduino UNO WiFiは、Arduinoクラウドと互換性があります。Arduinoクラウドは、IoTアプリケーションを数分で作成できるクラウドサービスです。

i
詳細はGetting Started with Arduino Cloudガイドを参照してください。

ルネサスRA4M1

UNO R4 WiFiは、UNO R4 Minimaにも搭載されている、強力で強固なマイクロコントローラーを搭載しています。ルネサスのマイクロコントローラーは、内蔵周辺機器を含め、高性能で強固なことで有名です。

周辺機器には、アナログデジタル変換器やタイマー、パルス幅変調(PWM)ユニット、通信インターフェイス(UARTとSPI、I2C)などを含みます。

UNO R4 WiFi上のマイクロコントローラー

UNO R4 WiFi上のマイクロコントローラー

メモリー

ボードには以下のメモリーが搭載されています。

  • 32kBのSRAM
  • 256kBのフラッシュ
  • 8kBのデータ(EEPROM)

ピン

UNO R4 WiFiは、多くの異なるピンが利用できます。それらの多くには特別な機能が備わっています。この後のセクションで、それらを説明します。何ができるかを学習するために、この記事を読んでください。

以下は、UNO R4 WiFiピンの機能の概要を示す、全てのI/Oピンの完全な表です。

ピン タイプ 機能
D0 デジタル UART受信
D1 デジタル UART送信
D2 デジタル GPIOピン、割り込み
D3 デジタル GPIOピン、割り込み、PWM
D4 デジタル GPIOピン
D5 デジタル GPIOピン、PWM
D6 デジタル GPIOピン、PWM
D7 デジタル GPIOピン
D8 デジタル GPIOピン
D9 デジタル GPIOピン、PWM
D10 デジタル SPI(CS)、GPIOピン、PWM
D11 デジタル SPI(COPI)、GPIOピン、PWM
D12 デジタル SPI(CIPO)、GPIOピン
D13 デジタル SPI(SCK)、GPIOピン、内蔵LED
A0 アナログ入力 アナログ入力、DAC
A1 アナログ入力 アナログ入力、OPAMP+
A2 アナログ入力 アナログ入力、OPAMP-
A3 アナログ入力 アナログ入力、OPAMP出力
A4 アナログ入力 アナログ入力、SDA*
A5 アナログ入力 アナログ入力、SCL*
i
*A4とA5ピンは両方とも同じI2Cバスに接続されています。

アナログピン

UNO R4 WiFiは、6本のアナログ入力ピン(A0-A5)を装備しています。analogRead()関数で読み取ることができます。

ピン タイプ 機能
A0 アナログ入力 アナログ入力、DAC
A1 アナログ入力 アナログ入力、OPAMP+
A2 アナログ入力 アナログ入力、OPAMP-
A3 アナログ入力 アナログ入力、OPAMP出力
A4 アナログ入力 アナログ入力、SDA*
A5 アナログ入力 アナログ入力、SCL*
i
*A4とA5ピンは両方とも同じI2Cバスに接続されています。
1
value = analogRead(pin);

これらのピンの参照電圧は5Vです。しかし、以下のようにすることで、変更可能です。

  • analogReference(AR_DEFAULT)(5Vのデフォルト参照電圧)
  • analogReference(AR_INTERNAL)(1.5Vの内蔵参照電圧)

デフォルトの分解能は10ビットですが、12ビットや14ビットまで変更することができます。そのためには、以下のメソッドをスケッチのsetup()で使ってください。

  • analogReadResolution(10) (default)
  • analogReadResolution(12)
  • analogReadResolution(14)

UNO R4 WiFiのADC機能についてもっと知りたければ、Arduino UNO R4 WiFiのADC分解能を参照してください。

OPAMPピン

RA4M1は、以下のように外部に接続された内蔵OPAMPを搭載しています。

ピン OPAMP
A1 OPAMP+
A2 OPAMP-
A3 OPAMP OUT

デジタルピン

UNO R4 WiFiには、合計14本のデジタルピtンがあります。何本かは他の目的に利用されるので、他のピンが使える場合は、GPIOとしては利用しないでください。

ピン 機能 説明
0 RX UART通信
1 TX UART通信
2 GPIO デジタルIOピン
3 PWM デジタルIOピン、PWM
4 GPIO デジタルIOピン
5 PWM デジタルIOピン、PWM
6 PWM デジタルIOピン、PWM
7 GPIO デジタルIOピン
8 GPIO デジタルIOピン
9 PWM デジタルIOピン、PWM
10 PWM デジタルIOピン、PWM
11 PWM デジタルIOピン、PWM
12 GPIO デジタルIOピン
13 GPIO デジタルIOピン

デジタルピンの参照電圧は5Vです。

PWM

PWM(Pulse Width Modulation: パルス幅変調)は、高速にオンとオフを切り替えることで、デジタルピンでアナログ出力をエミュレートすることができる機能です。デジタルピンに接続したLEDの明るさを調整したりすることができます。

UNO R4 WiFiは、ピンヘッダに「~」記号の付いたピンでPWMをサポートしています。公式にサポートされているピンは以下です。

ピン RA4M1 タイマー
D3 P105 GTIOC1A
D5 P107 GTIOC0A
D6 P111 GTIOC3A
D9 P303 GTIOC7B
D10 P103 GTIOC2A
D11 P411 GTIOC6A

以下の関数を使うことでアナログ出力を利用することができます。

1
analogWrite(pin, value);

デフォルトでは、分解能は8ビット(0-255)です。analogWriteResolution()を使えば、12ビット(0-4095)まで利用することができます。

1
analogWriteResolution(resolution);

以下のピンがPWMをサポートしていますが、UNO R4 WiFiボードの他の機能も兼ねています。ライブラリ関数を書く際は、以下のピンは、公式にはPWMをサポートしていないので、使わないでください。

ピン RA4M1 タイマー
D0 P301 GTIOC4B
D1 P302 GTIOC4A
D2 P104 GTIOC1B
D4 P106 GTIOC0B
D7 P112 GTIOC3B
D8 P304 GTIOC7A
D12 P410 GTIOC6B
D13 P102 GTIOC2B
D18/SDA P101 GTIOC5A
D19/SCL P100 GTIOC5B

LEDマトリックス

UNO R4 WiFiに搭載されているLEDマトリックスがプログラムで利用できます。静止画やアニメーションの表示、ゲームなどで使えます。Renesas Coreは、マトリックス上にフレームを表示するための、Arduino_LED_Matrixライブラリを含みます。

LEDマトリックスの詳細を学ぶには、LEDマトリックスガイドを参照してください。

  • Arduino_LED_Matrix matrix - LEDマトリックスを初期化する。
  • Arduino_LED_Matrix.load() - フレームをフレームバッファにロードする。

以下に基本的な例を示します。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
// creates an array of two frames
const uint32_t frames[][4] = {
  {
    0x0,
    0x0,
    0xc00c0000,
    150
  },
  {
    0x0,
    0x1e01,
    0x201201e0,
    150
  }
}

  // loads the frames into the matrix buffer
  matrix.load(frames);

DAC

UNO R4 WiFiは、12ビットまでの分解能があるDACを搭載しています。PWMピンより高性能な、本当のアナログ出力ピンとして動作します。

1
analogWrite(pin, value);
DACピン

DACピン

このDACピンは、デフォルトでは8ビットの分解能を持っています。ピンに書く値は、0-225であることを意味しています。

しかし、必要に応じて12ビットまで分解能を変更することができます。このとき、ピンに書き込む値は、0-4095です。

1
analogWriteResolution(12);

UNO R4 WiFiのDACに関してさらに学びたい場合は、DACガイドを参照してください。

RTC

リアルタイムクロック(RTC)は、時間を計るのに使われます。時刻を監理するアプリケーションに有用です。

i
UNO R4 WiFiには、VRTCピンが備わっています。これは、電源オフのときでも、ボード上のRTCを動作させ続けます。これを利用するには、1.6-3.6Vの範囲の電圧をVRTCピンに供給します。

以下は、RTCから日付と時刻を取得する最低限の例です。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
#include "RTC.h"

void setup() {
  Serial.begin(9600);

  RTC.begin();
  RTCTime mytime(30, Month::JUNE, 2023, 13, 37, 00, DayOfWeek::WEDNESDAY, SaveLight::SAVING_TIME_ACTIVE);

  RTC.setTime(mytime);
}

void loop() {
  RTCTime currenttime;

 // Get current time from RTC
  RTC.getTime(currenttime);
  
  // Print out date (DD/MM//YYYY)
  Serial.print(currenttime.getDayOfMonth());
  Serial.print("/");
  Serial.print(Month2int(currenttime.getMonth()));
  Serial.print("/");
  Serial.print(currenttime.getYear());
  Serial.print(" - ");

  // Print time (HH/MM/SS)
  Serial.print(currenttime.getHour());
  Serial.print(":");
  Serial.print(currenttime.getMinutes());
  Serial.print(":");
  Serial.println(currenttime.getSeconds());

  delay(1000);
}

UNO R4 WiFiのDACに関してさらに学びたい場合は、RTCガイドを参照してください。

EEPROM

データメモリとも呼ばれるEEPROMは、ボードの電源を切ってもデータを保持する形式のメモリです。

1
2
EEPROM.write(address, val);
EEPROM.read(address);

EEPROMの書き込みサイクルには上限があります。つまり、読み込み専用のアプリケーションと相性がいいです。void loop()内でwrite()を使わないようにしてください。でないと、チップの書き込みサイクルの上限を超えるかもしれません。

詳細はEEPROMガイドを参照してください。

UNO R4 WiFiのEEPROMについては、EEPROMガイドを参照してください。

SPI

SPIピン

SPIピン

UNO R4 WiFiは、Serial Peripheral Interface(SPI)を搭載しています。SPIでは以下のピンを使います。

  • (COPI) - D11
  • (CIPO) - D12
  • (SCK) - D13
  • (CS) - D10

以下の例は、SPIの使い方を示します。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
#include <SPI.h>

const int CS = 10;


void setup() {
  pinMode(CS, OUTPUT);

  SPI.begin();

  digitalWrite(CS, LOW);

  SPI.transfer(0x00);
  
  digitalWrite(CS, HIGH);
}

void loop() {
}

I2C

I2Cを使うと、2本のピンだけを使い、I2Cデバイスを複数接続できます。コントローラーはI2Cバスを通して、7ビットのアドレス宛に情報を送信します。このため一つの信号線に接続できるI2Cデバイスの技術的な上限は128です。実際には、他の制約があるので、128デバイスに到達することはありません。

UNO R4 WiFiは、SCLとSDAとマークされたI2Cバスを一つ搭載しています。これらは、以前のUNOの所有者はよく知っているA4(SDA)とA5(SCL)と共有しています。プルアップは基盤に搭載されていませんが、実現するためのフットプリントは搭載されています。

UNO R4 WiFiで、I2Cに使われるピンは、以下の通りです。

  • SDA - D14
  • SCL - D15
I2Cピン

I2Cピン

I2Cデバイスを接続するには、スケッチの先頭で、Wireライブラリをインクルードする必要があります。

1
#include <Wire.h>

void setup()で、ライブラリを初期化する必要があり、利用したいI2Cポートを初期化します。

1
2
3
Wire.begin() //SDA & SDL
Wire1.begin(); //SDA1 & SDL1
Wire2.begin(); //SDA2 & SDL2

I2Cに接続されているデバイスに何かを書き込むには、以下のコマンドを使います。

1
2
3
4
Wire.beginTransmission(1); //begin transmit to device 1
Wire.write(byte(0x00)); //send instruction byte 
Wire.write(val); //send a value
Wire.endTransmission(); //stop transmit

QWIICコネクタ

UNO WiFi R4のQwiicコネクタ

UNO WiFi R4のQwiicコネクタ

i
UNO R4 WiFiのQwiicコネクタは、2番目のI2Cバス(IIC0)に接続されていて、Wireオブジェクトではなく、Wire1オブジェクトを使います。Qwiicコネクタは3.3Vだけがサポートされていることに注意してください。

UNO R4 WiFiは、モジュールを接続するのに利用可能なQwiic/STEMMAコネクタを搭載しています。複数のモジュールのデイジーチェーンが可能で、一つのコネクタで全てのデバイスを制御できます。

QwiicもしくはSTEMMAは、それぞれ、SparkFunとAdafruitが開発したコネクタの名前です。開発ボードやブレイクアウトモジュールにI2Cピンを備えています。例えば、Arduino UNO R4 WiFiのような開発ボードとブレイクアウトモジュールの双方がQwiicかSTEMMAコネクタを搭載していれば、それらを接続し、配線を最小にして、多様なプロジェクトを作成できます。

ブレイクアウトボードがこれらのコネクタを一つ以上搭載していれば(このような構成はたくさんあります)、2番目のものを別のQwiicモジュールにデイジーチェーンし、別のインタラクティブノードをプロジェクトに追加することができます。

UNO R4 WiFiは2つのI2Cバスを搭載していて、Qwiicコネクタは、2番目のバスに接続されています。このため、Wireライブラリを使う際は、Wireオブジェクトではなく、Wire1オブジェクトを使う必要があります。以下に例を示します。

1
2
3
4
5
6
7
8
9
#include <Wire.h>

void setup(){
  Wire1.begin();
  Wire1.beginTransmission(1);   //begin transmit to device 1
  Wire1.write(byte(0x00));      //send instruction byte 
  Wire1.write(val);             //send a value
  Wire1.endTransmission();      //stop transmit
}

USBシリアルとUART

UNO R4 WiFiボードは、2つの独立したハードウェアシリアルポートを搭載しています。

  • 一つのポートはUSB-C®に接続されていて、
  • もう一つはRX/TXピンに接続されています。

これは、UNO R3とUNO R4とで明確に違う、数少ないことの一つです。UNO R3では、一つのハードウェアシリアルポートが、USBポートとRX/TXピンの両方に接続されています。

UNO R4 WiFiのUARTに使われているピンは以下の通りです。

ピン 機能
D0 RX(受信)
D1 TX(送信)

ネイティブUSB

シリアルデータをPCに送るには、標準的のSerialオブジェクトを使います。

1
2
Serial.begin(9600);
Serial.print("hello world");

UARTを通してデータを送受信するには、最初にsetup()の中で、転送速度を設定する必要があります。

UART

UNO R4 WiFiのUARTに使われているピンは以下の通りです。

ピン 機能
D0 RX0
D1 TX0

UARTを通してデータを送受信するには、最初にsetup()の中で、転送速度を設定する必要があります。UART(RX/TXピン)を使うときは、Serial1オブジェクトを使います。

1
Serial1.begin(9600);

受信したデータを読むには、whileループの中で、個々の文字を受信し、文字列に追加していくことができます。

1
2
3
4
5
while(Serial1.available()){
    delay(2);
    char c = Serial1.read();
    incoming += c;
  }

何かを送信する場合は、以下のコマンドを使います。

1
Serial1.write("Hello world!");

シリアルイベント

serialEvent()メソッドは古いリビジョンのUNOボードでサポートされています。しかし、UNO R4ボード(と他の新しいArduinoボード)では、サポートされていません。

しかし、このメソッドはシリアルデータを検出して関数を実行するのだけに使われる機能なので、新しいデータの到着をSerial.available()をデータの検出に使うことができます。

1
2
3
if(Serial.available() > 0) {
  //code goes here
}

タイマー

Arduino APIには、FspTimerクラスが存在します。このクラスは、スケッチでタイマーを使うときに必要な機能を全て提供しています。

UNO R4 WiFiは2つのタイマー周辺機器があります。一つは、非同期汎用目的タイマー(Asynchronous General Purpose Timer: AGT)で、もう一つは、汎用PWMタイマー(General PWM Timer: GPT)です。ボードには2つのAGTがあり、一つは、millis()microseconds()のような時刻測定メソッドで利用されています。

ボードには7つのGPTがあり、どのくらいの期間シグナルが有効だったのかを測定しデューティサイクルを計算するなどの、PWMタスクの実行を補助しています。前述したFspTimerライブラリを使うことで、これらのPWMタイマーを使うことができます。この関数は明示的にPWMタイマーを要求します。

1
FspTimer::force_use_of_pwm_reserved_timer();

ライブラリーのタイマー関数を使うときは、タイマー種別(AGTかGPT)を指定する必要があります。スケッチでは、以下のように宣言します。

1
2
uint8_t gpt_timer_type = GPT_TIMER;
uint8_t agt_timer_type = AGT_TIMER;

シリアルUSB

UNO R4 WiFiは、HID.hライブラリをスケッチにインクルードすることで有効になる、拡張セットを搭載しています。

  • Serial.baud() - 今使われているボーレート(int)を返す
  • Serial.stopbits() - 通信のストップビット数(int)を返す
  • Serial.paritytype() - 通信のパリティ(int)を返す
  • Serial.numbits() - 通信のデータビット数(int)を返す
  • Serial.dtr() - データ端末レディ(DTR)信号(bool)の状態を返し、DTR信号が使われていれば、ignore_dtrフラグをtrueに設定する
  • Serial.rts() - 送信要求(STR)信号(bool)の状態を返す。

<HID.h>ライブラリは、SerialオブジェクトをSerialUSBにリマップし、これらの機能を有効にします。

サポートされているリンク

USB HID

i
UNO R4 WiFiでのUSBポートの実装方式により、HIDを使うとボードはことあるUSBポートとして表示されることがあります。これが起きたときは、リセットボタンをダブルクリックし、ボードを再選択してください。

このボードはHID(キーボード/マウス)として動作でき、キーストロークや座標をネイティブUSB経由でPCに送信することができます。

1
2
keyboard.press('W');
mouse.move(x,y);

これは、keyboardmouseライブラリで有効にでき、IDEのライブラリマネージャでインストールすることができます。

UNO R4 WiFiのHID機能についての詳細は、HIDガイドを参照してください。

Serialリマップ

スケッチで、<HID.h>がインクルードされると、シリアルオブジェクトは、SerialからSerialUSBに変更され、HID機能がサポートされるようになります。これにより、多くの機能が有効になります。有効になる機能一覧はこちら

サポートされているリンク

CANモジュール

UNO R4 WiFiのRA4M1は、CAN 2.0A/CAN 2.0B標準に適合したCANモジュールを内蔵しています。

CANRXピンとCANTXピンを、MCP2551やTJA1050などのCANトランシーバーに接続します。

ピン 機能
D10 CANRX
D13 CANTX

Arduino_CANライブラリを使い、他のCANデバイスと通信します。

1
2
3
//set CAN bit rate and init library at
//choose from BR_125k,BR_250k,BR_500k,BR_1000k 
CAN.begin(CanBitRate::BR_250k);

CANメッセージを作成し、送信します。

1
2
3
4
uint8_t const msg_data[] = {0xCA,0xFE,0,0,0,0,0,0};
memcpy((void *)(msg_data + 4), &msg_cnt, sizeof(msg_cnt));
CanMsg msg(CAN_ID, sizeof(msg_data), msg_data);
CAN.write(msg);

到着したCANメッセージを読みます。

1
CanMsg const msg = CAN.read(); //read

i
CANトランシーバーがなければ、他のCANデバイスと通信することはできません。

UNO R4 WiFiのCAN機能については、CANガイドを参照してください。

ESP32-S3-MINI-1-N8

UNO R4 WiFiに搭載されているESP32-S3モジュールは、デフォルトでは、シリアルブリッジとして動作し、PCとの接続を処理します。また、例えば、新しいスケッチを受信しリセットするなど、必要に応じて、メインMCUのRenesas RA4M1のリブートも扱います。

UNO R3では、ATMEGA16U2が同様の目的で搭載されていました。ボード上のESP32モジュールは、より先進的なSoCで、WiFi®とBluetooth®接続もボードに提供しています。

ESP32は、ESP32のデータ線も露出しているので、ESP32を直接プログラムすることもできます。これらのデータ線は、ボード表面の3x2ヘッダと、背面のパッドに接続されています。

i
ESP32にはデフォルトのファームウェアがインストールされていて、RA4M1チップと通信するように設定されています。ESP32の直接プログラミングすると、このファームウェアを上書きします。このため、デフォルトのファームウェアを復元するまでは、チップとの接続は切断されます。
UNO R4とUNO R3

UNO R4とUNO R3

USBブリッジ

デフォルトでは、ESP32はPCとRA4M1 MCUとの間のシリアルブリッジとして動作します。USBデータ線は素一途を通してルーティングされ、デフォルトでは、これらのスイッチはESP32モジュールを経由して通信するよう設定されています。

シリアル通信用スイッチ

シリアル通信用スイッチ

この振る舞いを変更することもでき、ソフトウェアもしくはハードウェアにより、RA4M1 MCUのシリアルバスに直接アクセスすることも可能です。以下の指示を見てください。

  1. ソフトウェア - D21をHIGHにすると、どのMCUがUSBに接続する野かを制御する回路を閉じることができます。D21がHIGHの間、RA4M1はUSBシリアルポートに接続します。D21がLOWの間、デフォルト設定のように、ESP32が接続します。以下のコードをvoid setup()に含めることで、制御できます。
1
2
pinMode(21, OUTPUT);
digitalWrite(21, HIGH);
  1. UNO R4 WiFiの裏面に、「RA4M1 USB」というラベルがついた、はんだパッドがあります。これらのパッドを、例えばはんだブリッジでショートさせると、RA4M1は、ESP32ではなく、USBシリアルポートに接続します。
RA4M1 USBのはんだパッド

RA4M1 USBのはんだパッド

Wi-Fi®

UNO R4 WiFiに搭載されているESP32は、ボードにWiFi®機能を提供します。Wi-Fi®モジュールは、最大150MBpsのビットレートです。ESP32モジュールはトレースアンテナを内蔵しているので、ボード上の接続機能を利用するのに外部アンテナは必要ありません。しかし、このトレースアンテナは、Bluetooth®モジュールと共有しているので、Bluetooth®とWi-Fi®を同時に利用することはできません。

UNO R4 WiFiのWi-Fi®機能を使うには、UNO R4 Coreに付属のWiFiS3ライブラリを使います。

UNO R4 WiFIのWi-Fi®機能については、ネットワーク利用例を参照してください。

Bluetooth®

ESP32モジュールにより、UNO R4 WiFiは、2Mbpsの速度で、Bluetooth® LEとBluetooth® 5が利用可能です。ESP32モジュールはトレースアンテナを内蔵しているので、ボード上の接続機能を利用するのに外部アンテナは必要ありません。しかし、このトレースアンテナは、Wi-Fi®モジュールと共有しているので、Bluetooth®とWi-Fi®を同時に利用することはできません。

以下に、Bluetoothデバイスをスキャンするスケッチ例を示します。

  1
  2
  3
  4
  5
  6
  7
  8
  9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
 36
 37
 38
 39
 40
 41
 42
 43
 44
 45
 46
 47
 48
 49
 50
 51
 52
 53
 54
 55
 56
 57
 58
 59
 60
 61
 62
 63
 64
 65
 66
 67
 68
 69
 70
 71
 72
 73
 74
 75
 76
 77
 78
 79
 80
 81
 82
 83
 84
 85
 86
 87
 88
 89
 90
 91
 92
 93
 94
 95
 96
 97
 98
 99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
#include <ArduinoBLE.h>

void setup() {
  Serial.begin(9600);
  while (!Serial);

  // begin initialization
  if (!BLE.begin()) {
    Serial.println("starting Bluetooth® Low Energy module failed!");

    while (1);
  }

  Serial.println("Bluetooth® Low Energy Central - Peripheral Explorer");

  // start scanning for peripherals
  BLE.scan();
}

void loop() {
  // check if a peripheral has been discovered
  BLEDevice peripheral = BLE.available();

  if (peripheral) {
    // discovered a peripheral, print out address, local name, and advertised service
    Serial.print("Found ");
    Serial.print(peripheral.address());
    Serial.print(" '");
    Serial.print(peripheral.localName());
    Serial.print("' ");
    Serial.print(peripheral.advertisedServiceUuid());
    Serial.println();

    // check for peripheral's name
    if (peripheral.localName() == "<PERIPHERAL_NAME>") {
      // stop scanning
      BLE.stopScan();

      explorerPeripheral(peripheral);

      // peripheral disconnected, we are done
      while (1) {
        // do nothing
      }
    }
  }
}

void explorerPeripheral(BLEDevice peripheral) {
  // connect to the peripheral
  Serial.println("Connecting ...");

  if (peripheral.connect()) {
    Serial.println("Connected");
  } else {
    Serial.println("Failed to connect!");
    return;
  }

  // discover peripheral attributes
  Serial.println("Discovering attributes ...");
  if (peripheral.discoverAttributes()) {
    Serial.println("Attributes discovered");
  } else {
    Serial.println("Attribute discovery failed!");
    peripheral.disconnect();
    return;
  }

  // read and print device name of peripheral
  Serial.println();
  Serial.print("Device name: ");
  Serial.println(peripheral.deviceName());
  Serial.print("Appearance: 0x");
  Serial.println(peripheral.appearance(), HEX);
  Serial.println();

  // loop the services of the peripheral and explore each
  for (int i = 0; i < peripheral.serviceCount(); i++) {
    BLEService service = peripheral.service(i);

    exploreService(service);
  }

  Serial.println();

  // we are done exploring, disconnect
  Serial.println("Disconnecting ...");
  peripheral.disconnect();
  Serial.println("Disconnected");
}

void exploreService(BLEService service) {
  // print the UUID of the service
  Serial.print("Service ");
  Serial.println(service.uuid());

  // loop the characteristics of the service and explore each
  for (int i = 0; i < service.characteristicCount(); i++) {
    BLECharacteristic characteristic = service.characteristic(i);

    exploreCharacteristic(characteristic);
  }
}

void exploreCharacteristic(BLECharacteristic characteristic) {
  // print the UUID and properties of the characteristic
  Serial.print("\tCharacteristic ");
  Serial.print(characteristic.uuid());
  Serial.print(", properties 0x");
  Serial.print(characteristic.properties(), HEX);

  // check if the characteristic is readable
  if (characteristic.canRead()) {
    // read the characteristic value
    characteristic.read();

    if (characteristic.valueLength() > 0) {
      // print out the value of the characteristic
      Serial.print(", value 0x");
      printData(characteristic.value(), characteristic.valueLength());
    }
  }
  Serial.println();

  // loop the descriptors of the characteristic and explore each
  for (int i = 0; i < characteristic.descriptorCount(); i++) {
    BLEDescriptor descriptor = characteristic.descriptor(i);

    exploreDescriptor(descriptor);
  }
}

void exploreDescriptor(BLEDescriptor descriptor) {
  // print the UUID of the descriptor
  Serial.print("\t\tDescriptor ");
  Serial.print(descriptor.uuid());

  // read the descriptor value
  descriptor.read();

  // print out the value of the descriptor
  Serial.print(", value 0x");
  printData(descriptor.value(), descriptor.valueLength());

  Serial.println();
}

void printData(const unsigned char data[], int length) {
  for (int i = 0; i < length; i++) {
    unsigned char b = data[i];

    if (b < 16) {
      Serial.print("0");
    }

    Serial.print(b, HEX);
  }
}

Bluetooth LEについては、こちらを参照してください。

ESP32の高度なプログラミング

ESP32モジュールとルネサスRA4M1チップは、HID機能が利用できる非常に柔軟で適応性のある洗練されたUSBシリアルシステムの一部です。一方で、メインMCUとESP32の双方をプログラムできる機能も維持しています。

ESP32のファームウェアを上書きすると、2つのMCU間の通信が切断されますが、独立して動作させることができます。ボードを初期状態に復元するには、ヘルプセンターの記事のespflash向けの指示に従ってください。

i
注意: ESP32モジュールをプログラムするときは、ボードをリセットするときにESP_DownloadピンをGNDにショートする必要があります。これで、ESP32モジュールがブートローダー状態になり、ESP32モジュールへの接続を確立して、モジュールを再プログラムできます。

ESP32ボードを再プログラムするには、以下の図に示すESP32の隣のUART-パッドか、

ESP32データパッド

ESP32データパッド

以下に示す、ESP32ヘッダに直接露出しているピンを使います。

ESP32データピン

ESP32データピン

オリジナルのページ

https://docs.arduino.cc/tutorials/uno-r4-wifi/cheat-sheet

最終更新日

July 14, 2024

inserted by FC2 system