Nano R4ユーザーマニュアル

Arduino® Nano R4ボードのハードウェアとソフトウェアの機能を学びます。


Author:José BagurLast revision:2026/05/13

このユーザーマニュアルは、Nano R4ボード全般の概要で、ハードウェアとソフトウェアに着目しています。これを読めば、Nano R4ボードの設定方法や構成方法、主なすべての機能を使うことができるようになります。

必要なハードウェアとソフトウェア

必要なハードウェア

必要なソフトウェア

i
Arduino R4は、完全なArduinoエコシステムと互換性があり、スタンドアローンデバイスとして直接プログラムすることが可能です。

Nano R4の概要

Nano R4ボードは、Nanoファミリーの自然な進化形で、小型で有名なNanoのフォームファクターに、Renesasの強力なRA4M1マイクロコントローラーを組み合わせたものです。このボードはプロトタイピングから製品へのシームレスな移行を実現できるように設計されており、すでにUNO R4ファミリーで利用されているのと同じ強力なコアを使用しています。

Nano R4は、高性能32ビットマイクロコントローラー(R7FA4M1AB3CFM)や、オンボードQwiicコネクターを用いた拡張された接続性、DACやCAN、オペアンプなどの高度な機能を搭載しています。小型(18mmx45mm)で堅牢な構造なので、Nano R4ボードは、センサー利用や近代のマイクロコントローラーの計算能力を必要とするプロジェクトに対する素晴らしい選択肢となります。

Nano R4のアーキテクチャ概要

Nano R4ボードは、安全で保障された、耐久性の高い設計で、産業の自動化やビルディングオートメーション、ラピッドプロトタイピングなど、様々なアプリケーションに適しています。

Nano R4ボードの上面図を以下に示します。

Nano R4ボードの下面図を以下に示します。

i
Nano R4の底面には、デバッグや開発用途のテストポイントと、ボードの認証マーク、識別情報(ボードモデルとSKU)だけが表示されています。

前述の図に示された、ボードの主な機能の概要を示します。

  • マイクロコントローラー: Nano R4ボードの中心は、Renesas RA4M1ファミリーマイクロコントローラー(R7FA4M1AB3CFM)です。このシンブルチップマイクロコントローラーは、業界では最もエネルギー効率の高いマイクロコントローラーと認識されていて、48 MHz Arm® Cortex®-M4コアをベースにしています。最大256kBのフラッシュメモリーと32kBのSRAMを搭載可能です。
  • USB-Cコネクター: Nano R4ボードは、最新のUSB-Cコネクターを搭載してい、電力供給と外部とのシリアル通信に利用しています。
  • Qwiicコネクター: Nano R4ボードは、オンボードQwiicコネクターも搭載していて、I2C通信経由での通信機能を拡張できます。これにより、ボードやセンサー、アクチュエーター、さまざまな周辺機器との接続が可能です。
  • プログラム可能なRGB LED: Nano R4ボードには、ユーザーがプログラムできるRGB LEDも搭載されています。これにより、異なる動作状態に対してビジュアルなフィードバックを提供することができます。
  • ユーザーLED: オンボードのプログラム可能なRGB LEDのほかに、ボードには、追加のオンボードのユーザーがプログラムできるオレンジ色LEDが搭載されていて、基本的な状態を示しています。
  • スルーホールピン: スルーホールピンにより、モジュールとして表面実装することができ、カスタムハードウェアの設計と統合が容易になります。
  • 高度なマイクロコントローラー機能: R7FA4M1AB3CFMマイクロコントローラーは、12ビットデジタル・アナログ変換機(Digital-to-Analog Converter: DAC)や、産業通信のためのCANバス、内蔵オペアンプ(OpAmp)、HIDエミュレーション機能(キーボード/マウス)などの周辺機器を統合しています。

ボードコアとライブラリ

Arduino UNO R4ボードコアには、ライブラリとスケッチ例が同梱されていて、Arduino Nano R4の周辺機器や、RA4M1マイクロコントローラー、最新の周辺機器(DACやCAN、オペアンプ)、Qwiicコネクター、オンボードRGB LEDなどのオンボードコンポーネントを動作させることができます。Nano R4ボードのコアをインストールするには、ツール > ボード > ボードマネージャと進むか、IDEの左上のボードマネージャアイコンをクリックします。ボードマネージャタブで、UNO R4を検索し、最新のArduino UNO R4ボード用のバージョンをインストールします。

Arduino UNO R4ボードコアは、以下の機能を提供します。

  • ボードの制御と設定(リセット、ピン構成、電源管理)
  • 最新周辺機器機能(12ビットDAC、ADC、CANバス、オペアンプ)
  • 通信インターフェイス(UART、I2C、SPI)
  • オンボードLED制御(RGB LEDとオレンジ色LED)
  • リアルタイムクロック(RTC)機能
  • HIDエミュレーション機能(キーボード/マウス)
  • 標準Arduinoライブラリ
重要: Nano R4はUNO R4 WiFiやUNO R4 Minimaと同じRA4M1マイクロコントローラーを使っているので、コードを完全に共有し、ライブラリに互換性があります。これにより、これらのボード間でのプロジェクトの意向が容易になっています。

ピンアウト

完全なピンアウトはPDFで提供されていて、以下のリンクからダウンロードできます。

データシート

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

回路図

完全な回路図はPDFで提供されていて、以下のリンクからダウンロードできます。

STEPファイル

完全なSTEPファイルはPDFで提供されていて、以下のリンクからダウンロードできます。

初めての利用

箱を開ける

Nano R4の箱を開けると、ボードとドキュメントが入っています。Nano R4にはケーブルは含まれていません。ボードとPCを接続するには、USB-Cケーブル([ここから個別に購入できます(https://store.arduino.cc/products/usb-cable2in1-type-c)])が必要です。

Nano R4は、スタンドアローンのデバイスで、直接プログラム可能です。追加のボードは必要ありません。しかし、より複雑なプロジェクトでは、Nanoファミリーと互換のあるArduinoシールドを簡単に利用できます。また、オンボードのQwiicコネクターを通じて、他のArduinoのデバイスと接続することもできます。

ボードの接続

Nano R4ボードは、オンボードのUSB-Cコネクターを使ってPCに接続します。以下を使って、より大きなプロジェクトに統合することもできます。

  • USB-Cでの直接接続: プログラミングや電源供給、PCとのシリアル通信
  • ピン接続: ブレッドボードやカスタムPCBとの統合
  • Qwiic接続: 互換性のあるセンサーやモジュールとの迅速な拡張
  • モジュールマウント: プリント基板に直接はんだ付けする際に、ボードのスルーホールピンを利用
i
重要な注意: Nano R4は、直流5Vで動作します。直流3.3Vで動作するセンサーやモジュールを接続する際は、コンポーネントが破壊されないように、電圧の互換性を確認してください。

ボードに電源を供給する

Nano R4に電源を供給する方法はいくつかあります。

  • USB-Cコネクター経由: 開発・プログラミング時に最も一般的な方法です。
  • VINピン経由: 外部の6-21VDCの電源を使います。内部で5VDCに変換されます。
  • 5Vピン経由: 5VDCの安定化電源を、(注意して)直接接続します。
i
重要な注意: Nano R4のVINピンは、直流6V-21Vを受け付けます。この範囲以外の電圧をかけると、ボードに致命的なダメージを与えることがあります。電源を接続するときは、常に確認してください。

内部の直流3Vの電源供給

Nano R4は、オンボードの3VDCのレギュレーター(AP2112K)も搭載していて、以下のものに電源を供給しています。

  • Qwiicコネクター: 接続したI2Cデバイスに3VDCの電源を供給します。
  • I2Cレベル変換: 5VDCのマイクロコントローラーとDV3VのQwiicデバイス間の通信を可能とします。
  • 内蔵DV3.3Vの周辺機器: DV3Vでの操作を必要とする内部回路に電源を供給します。

VBATTピン

VBATTピンに、バックアップ電源(DV1.6V-3.6V)を接続すると、ボードから主電源が切り離されていても、マイクロコントローラーのリアルタイムクロック(RTC)と、いくつかの低電源機能を維持します。これは、電源が切れている場合にも時刻を保持したり、マイクロコントローラーのいくつかの設定を維持するアプリケーションにとって、非常に有用です。

このための一般的なバッテリーのオプションには以下があります。

  • ボタン電池(CR2032: 3VDC)
  • 充電式LiPoバッテリー(公称3.7VDC)
  • 単三電池(AA)・単四電池(AAA)(電池の種類により1.5-3VDC)

Hello Worldの例

Arduinoエコシステムで利用される、定番のHello Worldの例である、Blinkのスケッチを、Nano R4でプログラムしてみましょう。この例を、Nano R4とPCが正しく接続されていることと、Arduino IDEが適切に設定されていること、ボードと開発環境が双方とも想定通りに機能していること、を確認するのにこの例を使います。

まず、Nano R4を、USB-Cケーブルを使いPCに接続します。その後、Arduino IDEを起動し、ボードが正しく接続されていることを確認します。Arduino IDEの初心者なら、初期設定の詳細に関しては、公式のArduinoドキュメントを参照してください。以下のスケッチ例を、Arduino IDEの新しいファイルにコピー・ペーストしてください。

 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
/**
Blink Example for the Arduino Nano R4 Board
Name: nano_r4_blink.ino
Purpose: This sketch demonstrates how to blink the built-in
user LED of the Arduino Nano R4 board.

@author Arduino Product Experience Team
@version 1.0 01/06/25
*/

// Built-in LED pin
#define LED_PIN LED_BUILTIN

void setup() {
  // Initialize serial communication and wait up to 2.5 seconds for a connection
  Serial.begin(115200);
  for (auto startNow = millis() + 2500; !Serial && millis() < startNow; delay(500));
  
  // Configure LED pin as output
  pinMode(LED_PIN, OUTPUT);
  
  // Startup message
  Serial.println("- Arduino Nano R4 - Blink Example started...");
}

void loop() {
  // Turn on the LED, wait 1 second
  digitalWrite(LED_PIN, HIGH);
  Serial.println("- LED on!");
  delay(1000);
  
  // Turn off the LED, wait 1 second
  digitalWrite(LED_PIN, LOW);
  Serial.println("- LED off!");
  delay(1000);  
}

スケッチをボードにアップロードするには、検証ボタンをクリックし、スケッチをコンパイルして、エラーを確認します。その後、アップロードボタンをクリックし、デバイスにスケッチを転送します。

以下の動画で示されるように、Nano R4ボード内蔵のオレンジ色LEDが、1秒点灯し、1秒消灯することを繰り返しているのがわかります。

さらに、Arduino IDEのシリアルモニタ(ツール > シリアルモニタ)を開くと、スケッチ例がLEDの状態が変わるたびに送信する状態メッセージを見ることができます。

この例では以下を確認します。

  • Nano R4ボードが正しく接続されていること
  • Arduino IDEが適切に設定されていること
  • ボードが正しく機能していること
  • USB通信が動作していること
  • デジタルピンがコマンドに反応していること

おめでとうございます。Nano R4ボードで最初のプログラムを動作させることに成功しました。この小さいけれども強力なボードの高度な機能を探検する準備が整いました。

LED

このユーザーマニュアルのセクションでは、Nano R4の内蔵LEDについて、主なハードウェアとソフトウェアの機能を紹介します。

RGB LED

Nano R4には、RGB LEDが内蔵されていて、ユーザーに対する視覚的なフィードバックを示すのに使うことができます。

内蔵RGB LEDは、以下のマクロ定義を通じてアクセスすることができます。

内蔵LED マクロ定義 マイクロコントローラーピン
赤色LED LEDR P409
緑色LED LEDG P411
青色LED LEDB P410
Nano R4の内蔵RGB LEDを点灯させるには、GNDにプルダウンする必要があります。つまり、ピンをLOWレベルの電圧にすればLEDの特定の色が点灯し、HIGHにすれば消灯するということです。

以下のスケッチ例では、各RGB LEDを500ms間隔で点滅させます。

 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
/**
RGB LED Example for the Arduino Nano R4 Board
Name: nano_r4_rgb_led.ino
Purpose: This sketch demonstrates how to control the built-in
RGB LED of the Arduino Nano R4 board.

@author Arduino Product Experience Team
@version 1.0 01/06/25
*/

void setup() {
  // Initialize serial communication and wait up to 2.5 seconds for a connection
  Serial.begin(115200);
  for (auto startNow = millis() + 2500; !Serial && millis() < startNow; delay(500));
  
  // Initialize LEDR, LEDG and LEDB as outputs
  pinMode(LEDR, OUTPUT);
  pinMode(LEDG, OUTPUT);
  pinMode(LEDB, OUTPUT);
  
  // Turn off all LEDs initially
  digitalWrite(LEDR, HIGH);
  digitalWrite(LEDG, HIGH);
  digitalWrite(LEDB, HIGH);
  
  Serial.println("- Arduino Nano R4 - RGB LED Example started...");
}

void loop() {
  // Turn on the built-in red LED and turn off the rest
  digitalWrite(LEDR, LOW);
  digitalWrite(LEDG, HIGH);
  digitalWrite(LEDB, HIGH);
  Serial.println("- Red LED on!");
  delay(500);
  
  // Turn on the built-in green LED and turn off the rest
  digitalWrite(LEDR, HIGH);
  digitalWrite(LEDG, LOW);
  digitalWrite(LEDB, HIGH);
  Serial.println("- Green LED on!");
  delay(500);
  
  // Turn on the built-in blue LED and turn off the rest
  digitalWrite(LEDR, HIGH);
  digitalWrite(LEDG, HIGH);
  digitalWrite(LEDB, LOW);
  Serial.println("- Blue LED on!");
  delay(500);
  
  // Turn off all LEDs
  digitalWrite(LEDR, HIGH);
  digitalWrite(LEDG, HIGH);
  digitalWrite(LEDB, HIGH);
  Serial.println("- All LEDs off!");
  delay(500);
}

内蔵RGB LEDの赤・緑・青が順に点灯し、少しだけ消灯するサイクルを繰り返すのがわかります。

さらに、Arduino IDEのシリアルモニタ(ツール > シリアルモニタ)を開くと、スケッチ例がRGB LEDの状態が変わるたびに送信する状態メッセージを見ることができます。

オレンジ色LED

Nano R4には、オレンジ色LEDも内蔵されていて、基本的な状態の表示やデバッグ目的で利用することができます。

内蔵RGB LEDは、以下のマクロ定義を通じてアクセスすることができます。

内蔵LED マクロ定義 マイクロコントローラーピン
オレンジ色LED LED_BUILTIN P204
i
RGB LEDとは異なり、Nano R4の内蔵ユーザーLEDは、標準のロジックレベルで動作します。つまり、HIGHにするとLEDは店頭し、LOWにするとLEDは消灯します。

以下のスケッチ例は、内蔵ユーザーLEDの制御方法を示します。

 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
/**
User LED Example for the Arduino Nano R4 Board
Name: nano_r4_user_led.ino
Purpose: This sketch demonstrates how to control the built-in
user LED of the Arduino Nano R4 board.

@author Arduino Product Experience Team
@version 1.0 01/06/25
*/

void setup() {
  // Initialize serial communication and wait up to 2.5 seconds for a connection
  Serial.begin(115200);
  for (auto startNow = millis() + 2500; !Serial && millis() < startNow; delay(500));
  
  // Configure LED_BUILTIN pin as output
  pinMode(LED_BUILTIN, OUTPUT);
  
  // Turn off LED initially
  digitalWrite(LED_BUILTIN, LOW);
  
  Serial.println("- Arduino Nano R4 - User LED Example started...");
}

void loop() {
  // Turn on the built-in user LED
  digitalWrite(LED_BUILTIN, HIGH);
  Serial.println("- User LED on!");
  delay(1000);
  
  // Turn off the built-in user LED
  digitalWrite(LED_BUILTIN, LOW);
  Serial.println("- User LED off!");
  delay(1000);
}

内蔵のオレンジ色LEDが、1秒間隔で点灯・消灯を繰り返すのがわかります。

さらに、Arduino IDEのシリアルモニタ(ツール > シリアルモニタ)を開くと、スケッチ例がユーザーLEDの状態が変わるたびに送信する状態メッセージを見ることができます。

ピン

ユーザーマニュアルのこのセクションでは、Nano R4のピンの能力と機能に関する包括的な情報を提供します。ボードのピンの能力と設定を理解することは、Nano R4ボードで多くのプロジェクトを作成するのに重要です。

ピンの概要

Nano R4は、定番のNanoのフォームファクターに、合計20本の利用可能なピンを配置していて、既存のNanoシールドやブレッドボードのレイアウトとの互換性を維持しています。これらのピンは、デジタルI/Oやアナログ入力、PWM出力、様々な通信プロトコルなど、様々な機能を提供します。

ピンの仕様と特徴

Nano R4のピンは、以下のカテゴリーに分類されています。

ピンタイプ ピン数 ピン番号 主要機能
デジタルピン 14 D0 - D13 デジタルI・O、PWM(6ピン)、SPI、UART
アナログピン 8 A0 - A7 アナログ入力、デジタルI/O、I2C、DAC(A0)
電源ピン 4 VIN、5V、3V3、GND 電力供給、アース
特別なピン 2 RESET、VBATT システム制御、バックアップ

Nano R4には、いくつかの先進的なピンが備わっています。例えば、プロジェクトの必要性に応じて複数の目的を達成できる多機能ピンや、既存のArduinoシールドとの互換性を保つためのネイティブ5VDCでの動作、近年のセンサーやQwiic経由での電子機器用のDV3.3Vのレベル変換、ボードの特定のピンに割り当てられているDACやCANバス、オペアンプ内蔵の先進的な周辺機器、などです。

Nano R4ボードのすべてのピンの、電気的な仕様と動作制約を以下の表に示します。

仕様 注意
動作電圧 5VDC すべてのピンのロジックレベル
入力電圧の範囲 0 - 5.5VDC 5VDC許容入力
ピンごとの最大電流 8mA 入出力電流制限
合計最大電流 200mA すべてのピンの合計電流
アナログ参照値 5VDC AREFのデフォルト電圧
i
Nano R4のピンを使用する際の安全に関する重要事項: 破損を避けるために、どのピンも、5.5VDCを超えてはいけません。また、各ピンあたり8mA、合計200mAの電流制限を守り、適切な静電気対策を行ってボードを扱い、ピンをアースや電源ピンに直接接続しないようにし、DV3.3Vのデバイスに接続するときは、常に電圧レベルを確認してください。

デジタルピン

Nano R4には14本のデジタルピン(D0からD13)があり、それぞれ、デジタル入力あるいはデジタル出力に設定することができます。これらのピンは5VDCのロジックレベルで動作し、8mAまでの電流のソースあるいはシンクとなることができます。デジタルピンは、多くのArduinoプロジェクトの基本で、LEDを制御したり、ボタンの状態を読み取ったり、センサーとやり取りを行ったり、他のデバイスと通信したりできます。

Nano R4のデジタルピンは、以下の機能を提供します。

Arduinoピン マイクロコントローラーピン 追加機能 備考
D0 P104 UART RX、PWM シリアル通信
D1 P105 UART TX、PWM シリアル通信
D2 P213 PWM 外部割り込み
D3 P212 PWM 外部割り込み
D4 P109 CAN TX、PWM CAN通信
D5 P110 CAN RX、PWM CAN通信
D6 P107 PWM デジタルI/O
D7 P106 PWM デジタルI/O
D8 P300 PWM デジタルI/O
D9 P108 PWM デジタルI/O
D10 P103 SPI CS、PWM SPI通信
D11 P101 SPI MOSI、PWM SPI通信
D12 P100 SPI MISO SPI通信
D13 P102 SPI SCK SPI通信
i
重要な注意: D0ピンとD1ピンは、シリアル通信(UART)に利用されているので、シリアル通信を利用しているときは、汎用デジタルI/Oとしての利用は避けてください。D4ピンとD5ピンはCANバス通信に利用できます。D10ピンとD11ピン、D12ピン、D13ピンはSPI通信に利用できます。

Nano R4のデジタルピンの仕様を以下に示します。

仕様 備考
ロジックレベル 5VDC HIGHとLOWのロジックレベル
入力電圧 0-5VDC 5VDC入力を許容
最大電流(ソース) 8mA ピンごとのソース電流
最大電流(シンク) 8mA ピンごとのシンク電流
合計最大電流 200mA すべてのピンの合計電流
入力抵抗 20-50kΩ 内蔵プルアップ抵抗
デジタルHIGH 3.5-5VDC HIGHの最低電圧
デジタルLOW 0-1.5VDC LOWの最大電圧

デジタルピンの設定と制御は、以下のArduino関数を使います。

ピンのモードを設定するには、pinMode()関数を使います。

1
pinMode(pin, mode);

出力ピンにデジタル値を書き込むには、digitalWrite()関数を使います。

1
digitalWrite(pin, value);

デジタル入力ピンの状態を読むには、digitalRead()関数を使います。

1
digitalRead(pin);

利用可能なピンモードは、デジタル出力のOUTPUTとハイインピーダンスとなるデジタル入力のINPUT、内蔵プルアップ抵抗を有効にしたデジタル入力のINPUT_PULLUPです。デジタル出力の値は、HIGH(5VDC)か、LOW(0VDC)で、デジタル入力を読んだときは、ピンで検出した電圧レベルに応じてHIGHLOWを返します。

i
以下の例では、Nano R4ボードを使って簡単に試験できる単純な配線を使い、基本的なデジタルピンの機能を示します。

以下の例は、デジタル入力と出力とを同時に使い、ボタンを読み取りボード内蔵のLEDを制御します。

 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
/**
Combined Digital I/O Example for the Arduino Nano R4 Board
Name: nano_r4_digital_io_combined.ino
Purpose: This sketch demonstrates reading a button input and toggling
the built-in LED state each time the button is pressed.

@author Arduino Product Experience Team
@version 1.0 01/06/25
*/

// Pin definitions
const int buttonPin = 2;            // Button input on D2
const int ledPin = LED_BUILTIN;     // Built-in LED

// Variables to store button and LED state
int buttonState = 0;
int lastButtonState = HIGH;
bool ledState = false;

void setup() {
  // Initialize serial communication and wait up to 2.5 seconds for a connection
  Serial.begin(115200);
  for (auto startNow = millis() + 2500; !Serial && millis() < startNow; delay(500));
  
  // Configure pins
  pinMode(buttonPin, INPUT_PULLUP);
  pinMode(ledPin, OUTPUT);
  
  // Turn off LED initially
  digitalWrite(ledPin, LOW);
  
  Serial.println("- Arduino Nano R4 - Combined Digital I/O Example started...");
  Serial.println("- Press button to toggle the built-in LED");
}

void loop() {
  // Read current button state
  buttonState = digitalRead(buttonPin);
  
  // Check if button was just pressed (state change from HIGH to LOW)
  if (buttonState == LOW && lastButtonState == HIGH) {
    // Button press detected - toggle LED state
    ledState = !ledState;
    digitalWrite(ledPin, ledState);
    
    Serial.print("- Button pressed! LED is now ");
    if (ledState) {
      Serial.println("ON");
    } else {
      Serial.println("OFF");
    }
    
    // Simple debounce delay
    delay(50);  
  }
  
  // Save current button state for next iteration
  lastButtonState = buttonState;
  
  // Small delay for stability
  delay(10);
}

この例を試験するには、Nano R4ボードに押しボタンを以下のように接続します。

  • 押しボタンの足の一方をD2ピンに接続します。
  • 押しボタンの足のもう一方をGNDに接続します。
  • 追加の部品は不要です(内蔵LEDと内蔵プルアップを使います)

ボタンを押すたびに、内蔵LEDが点灯・消灯するのがわかります。次にボタンを押すまで、LEDの状態は維持されます。さらに、Arduino IDEのシリアルモニタ(ツール > シリアルモニタ)を開くと、ボタンがいつ押されたのかと、そのときのLEDの状態を示すメッセージを見ることができます。

アナログピン

Nano R4には8本のアナログ入力ピン(A0からA7)があり、analogRead()関数を使い値を読み取ることができます。これらのピンは連続して変化する電圧を測定することができ、ポテンショメーターや、光センサー、温度センサー、他のアナログ部品やデバイスを読み取るのに最適です。Nano R4ボードのRA4M1マイクロコントローラーに内蔵されているアナログ・デジタル変換器(ADC)が、アナログ電圧をスケッチが取り扱えるデジタル値に変換します。

Nano R4のアナログピンは、以下の機能を提供します。

Arduinoピン マイクロコントローラーピン 追加機能 備考
A0 P000 DAC 12ビットDAC出力
A1 P001 OPAMP+ オペアンプ
A2 P002 OPAMP- オペアンプ
A3 P003 OPAMP出力 オペアンプ
A4 P004 SDA(I2C) I2C通信
A5 P010 SCL(I2C) I2C通信
A6 P014 アナログ入力 アナログ入力専用
A7 P015 アナログ入力 アナログ入力専用
i
重要な注意: A0ピンは、アナログ出力用に、内蔵12ビットデジタル・アナログ変換器(DAC)を持っています。A1ピンとA2ピン、A3ピンは、オペアンプに接続されています。A4ピンとA5ピンは、主にI2C通信に利用されます(それぞれSDAとSCL)。

Nano R4のアナログピンの仕様を以下に示します。

仕様 備考
入力電圧 0VDC-5V 最大安全入力電圧
デフォルト分解能 10ビット 0-1023
最大分解能 14ビット 0-16384
デフォルト参照電圧 5VDC AREF電圧
内蔵参照電圧 1.5VDC 内蔵高精度参照電圧
サンプリングレート 最大1MSPS 最大サンプリングレート
精度 ±2LSB 標準変換精度

analogRead()関数を使い、アナログ値を読むことができます。

1
value = analogRead(pin);

これらのピンのデフォルト参照電圧は5VDCです。しかし、analogReference()関数を使い変更することもできます。デフォルト参照電圧の5VDCにするには、analogReference(AR_DEFAULT)を使います。内蔵参照電圧の1.5VDCにするには、analogReference(AR_INTERNAL)を使います。

デフォルトの分解能は10ビットです。12ビットや14ビットに変更することもできます。変更するには、スケッチのsetup()内で、analogReadResolution()関数を使います。利用可能なオプションは、デフォルトの10ビットにするにはanalogReadResolution(10)、12ビットにするには、analogReadResolution(12)、14ビットにするには、analogReadResolution(14)です。

i
以下の例では、Nano R4ボードを使って簡単に試験できる単純な配線を使い、基本的なアナログピンの機能を示します。

以下の例では、アナログ値を読み、読んだ値をシリアルモニタに表示する方法を示します。

 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
/**
Analog Input Example for the Arduino Nano R4 Board
Name: nano_r4_analog_input.ino
Purpose: This sketch demonstrates how to read an analog input
and display the value on the Serial Monitor.

@author Arduino Product Experience Team
@version 1.0 01/06/25
*/

// Analog input pin
const int analogPin = A0;

void setup() {
  // Initialize serial communication and wait up to 2.5 seconds for a connection
  Serial.begin(115200);
  for (auto startNow = millis() + 2500; !Serial && millis() < startNow; delay(500));
  
  Serial.println("- Arduino Nano R4 - Analog Input Example started...");
  Serial.println("- Reading analog values from pin A0");
}

void loop() {
  // Read the analog value (0 - 1023 with 10-bit resolution)
  int analogValue = analogRead(analogPin);
  
  // Convert to voltage (0 to +5 VDC)
  float voltage = analogValue * (5.0 / 1023.0);
  
  // Display the results
  Serial.print("- Analog Value: ");
  Serial.print(analogValue);
  Serial.print(" | Voltage: ");
  Serial.print(voltage, 2);
  Serial.println(" VDC");
  
  // Wait half a second before next reading
  delay(500);  
}

この例を試験するには、Nano R4ボードにポテンショメーターを以下のように接続します。

  • ポテンショメーターの中央のピンをA0に接続します。
  • ポテンショメーターの外側のピンの一つを5VDCに接続します。
  • ポテンショメーターの外側のピンのもう一つをGNDに接続します。

Arduino IDEのシリアルモニタ(ツール > シリアルモニタ)を開くと、ポテンショメーターを調整したときの、アナログ値と測定電圧をリアルタイムで表示します。ポテンショメーターを回すと、0から1023の範囲で変化し、対応する電圧は0VDCから5Vです。

以下の例では、より精度の高いアナログ入力を行うために、14ビットの分解能の使い方を示しています。最初の例と同じようにポテンショメーターを接続してください。

 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
/**
High-Resolution Analog Input Example for the Arduino Nano R4 Board
Name: nano_r4_analog_high_res.ino
Purpose: This sketch demonstrates how to use 14-bit resolution
for precise analog input measurements.

@author Arduino Product Experience Team
@version 1.0 01/06/25
*/

// Analog input pin
const int analogPin = A0;

void setup() {
  // Initialize serial communication and wait up to 2.5 seconds for a connection
  Serial.begin(115200);
  for (auto startNow = millis() + 2500; !Serial && millis() < startNow; delay(500));
  
  // Set analog read resolution to 14-bit (0 - 16383)
  analogReadResolution(14);
  
  Serial.println("- Arduino Nano R4 - High-Resolution Analog Input Example started...");
  Serial.println("- Using 14-bit resolution (0 - 16383)");
}

void loop() {
  // Read the analog value (0 - 16383 with 14-bit resolution)
  int analogValue = analogRead(analogPin);
  
  // Convert to voltage (0 - +5 VDC)
  float voltage = analogValue * (5.0 / 16383.0);
  
  // Calculate percentage (0 - 100%)
  float percentage = (analogValue / 16383.0) * 100.0;
  
  // Display the results
  Serial.print("- Analog Value: ");
  Serial.print(analogValue);
  Serial.print(" | Voltage: ");
  Serial.print(voltage, 3);
  Serial.print(" VDC | Percentage: ");
  Serial.print(percentage, 1);
  Serial.println(" %");
  
  // Wait half a second before next reading
  delay(500);
}

Arduino IDEのシリアルモニタ(ツール > シリアルモニタ)を開くと、ポテンショメーターを調整したときの、高分解能アナログ値と測定電圧、パーセント計算結果を表示します。14ビットの分解能では、値は0から1023ではなく0から16383まで変化し、高感度測定用に、精度が高まります。

PWM(Pulse Width Modulation)

Nano R4には複数のPWM対応したピンがあり、アナログ出力のような信号を出力することができます。PWMは、デジタル出力のHIGH状態とLOW状態を高速に切り替えることで動作し、全体の時間に対するHIGHの割合がアナログ電圧出力を決定します。

Nano R4ボードでは、以下のピンでPWM機能を提供します。

Arduinoピン マイクロコントローラーピン PWMチャネル 基本機能
D3 P212 チャネル0B デジタルI/O
D5 P110 チャネル1B デジタルI/O
D6 P107 チャネル0A デジタルI/O
D9 P108 チャネル0B デジタルI/O
D10 P103 チャネル2A デジタルI/O、SPI CS
D11 P101 チャネル5A デジタルI/O、SPI MOSI
i
重要な注意: A4ピンとA5ピンもPWM機能を持っていますが、主にはI2C通信(それぞれSDAとSCL)に利用されます。オンボードLED(LEDR、LEDG、LEDB、LED_BUILTIN)も輝度制御にPWMをサポートしています。

analogWrite()関数で、PWMピンをアナログ出力ピンのように利用できます。

1
analogWrite(pin, value);

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

1
analogWriteResolution(resolution);
i
以下のPWMの例は、Nano R4の内蔵オレンジ色LED(LED_BUILTIN)を使います。これは、輝度を制御にPWMをサポートしています。これにより外部機器を削減するとともに、PWM機能をすぐにテストすることが可能です。

以下の例は、内蔵オレンジ色LEDの輝度をPWMを使って制御する方法を示します。

 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
/**
PWM Example for the Arduino Nano R4 Board
Name: nano_r4_pwm_led.ino
Purpose: This sketch demonstrates how to use PWM to control
the brightness of the built-in user LED of the Nano R4 board.

@author Arduino Product Experience Team
@version 1.0 01/06/25
*/

// Built-in LED pin (supports PWM)
const int ledPin = LED_BUILTIN;

void setup() {
  // Initialize serial communication and wait up to 2.5 seconds for a connection
  Serial.begin(115200);
  for (auto startNow = millis() + 2500; !Serial && millis() < startNow; delay(500));
  
  // No need to set pinMode for PWM pins - analogWrite() handles this
  
  Serial.println("- Arduino Nano R4 - PWM LED Example started...");
  Serial.println("- Built-in LED will fade in and out continuously");
}

void loop() {
  // Fade in (0 to 255)
  for (int brightness = 0; brightness <= 255; brightness++) {
    analogWrite(ledPin, brightness);
    delay(5);
  }
  
  Serial.println("- LED at maximum brightness");
  delay(500);
  
  // Fade out (255 to 0)
  for (int brightness = 255; brightness >= 0; brightness--) {
    analogWrite(ledPin, brightness);
    delay(5);
  }
  
  Serial.println("- LED turned off");
  delay(500);
}

Nano R4ボードの内蔵オレンジ色LEDが、ゆっくりとフェードイン・フェードアウト、スムーズな呼吸効果を生み出しているのがわかります。

さらに、Arduino IDEのシリアルモニタ(ツール > シリアルモニタ)を開くと、このスケッチ例が、主な輝度で送信する状態メッセージを見ることができます。

以下の例は、内蔵オレンジ色LEDの輝度をより精細に制御するために、12ビットPWMを利用する例です。

 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
/**
High-Resolution PWM Example for the Arduino Nano R4 Board
Name: nano_r4_pwm_high_res.ino
Purpose: This sketch demonstrates how to use 12-bit PWM resolution
for precise control of the built-in orange user LED brightness.

@author Arduino Product Experience Team
@version 1.0 01/06/25
*/

// Built-in LED pin (supports PWM)
const int pwmPin = LED_BUILTIN;

void setup() {
  // Initialize serial communication and wait up to 2.5 seconds for a connection
  Serial.begin(115200);
  for (auto startNow = millis() + 2500; !Serial && millis() < startNow; delay(500));
  
  // Set PWM resolution to 12-bit (0-4095)
  analogWriteResolution(12);
  
  Serial.println("- Arduino Nano R4 - High-Resolution PWM Example started...");
  Serial.println("- Using 12-bit resolution (0-4095) with built-in LED");
}

void loop() {
  // Generate a smooth sine wave using 12-bit PWM
  for (int i = 0; i < 360; i++) {
    // Calculate sine wave value and map to 12-bit range
    float sineValue = sin(i * PI / 180.0);
    int pwmValue = (int)((sineValue + 1.0) * 2047.5);  // Map -1 to 1 → 0 to 4095
    
    analogWrite(pwmPin, pwmValue);
    
    // Print current values every 30 degrees
    if (i % 30 == 0) {
      Serial.print("- Angle: ");
      Serial.print(i);
      Serial.print("°, PWM Value: ");
      Serial.println(pwmValue);
    }
    
    delay(10);
  }
  
  Serial.println("- Sine wave cycle completed");
  delay(1000);
}

この高精細の例は、内蔵LEDの輝度をスムーズなサイン波で生成することで、12ビットの分解能のPWMで利用できる精度を示します。サイン波に従った非常にスムーズなLEDの輝度の変化を見ることができます。さらに、Arduino IDEのシリアルモニタ(ツール > シリアルモニタ)を開くと、角度と精細な12ビットの精度での制御により利用されるPWM値の出力を見ることができます。

オペアンプ

Nano R4は、オペアンプを内蔵していて、シグナルコンディショニングや増幅をボード上で直接行うことができます。オペアンプはアナログピンのA1とA2、A3に接続されていて、外部の増幅回路なしでアナログ信号処理を行うことができます。この機能は、センサー信号の増幅やバッファリング、アナログフィルタリングアプリケーションに特に有用です。

Nano R4ボードのオペアンプは、以下の機能を提供します。

Arduinoピン マイクロコントローラーピン オペアンプ機能 説明
A1 P001 OPAMP+ 非反転入力(+)
A2 P002 OPQMP- 反転入力(-)
A3 P003 OPAMP OUT 増幅出力
i
重要な注意: オペアンプ機能を利用するときは、A1ピンとA2ピン、A3ピンは通常のアナログ入力として利用することはできません。正電源(Vs+)は約5VDCに固定されていて、負電源(Vs-)はGNDに固定されています。

Nano R4のオペアンプの電気特性を以下に示します。

パラメーター 低速モード 高速モード 単位 説明
入力電圧範囲 +1.8~+5.5 +0.3~+4.4 VDC 標準5V
出力電圧範囲 +0.1~+4.9 +0.1~+4.9 VDC 標準5V
入力オフセット電圧 -10~+10 -10~+10V mV -
開ループ利得 60(標準) 125(標準) dB -
ゲイン・バンド幅積 - 1.7 MHz 高速モード
スルーレート 0.12 - V/μs CL = 20pF
セトリングタイム 650 13 μs 精度1%
負荷電流 -100~+100 -100~+100 μA 最大
容量負荷 20 20 pF 最大

専用のOPAMP.hライブラリを使うことで、オペアンプの設定および利用が可能です。このライブラリは、Arduno Uno R4ボードのコアに含まれます。OPAMPを開始するには、ライブラリをインクルードし、OPAMP.begin(speed)を呼び出します。ここで、sppedは、低消費電力の場合は、OPAMP_SPEED_LOWSPEED、高性能向けには、OPAMP_SPEED_HIGHSPEEDです。

以下の例は、オペアンプを初期化し利用する方法を示します。同じコードで、ボルテージフォロワーと増幅に利用できます。違いは外部接続だけです。

 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
/**
OPAMP Example for the Arduino Nano R4 Board
Name: nano_r4_opamp_example.ino
Purpose: This sketch demonstrates how to initialize the built-in OPAMP.
Works for both voltage follower and amplifier configurations.

@author Arduino Product Experience Team
@version 1.0 01/06/25
*/

#include <OPAMP.h>

void setup() {
  // Initialize serial communication and wait up to 2.5 seconds for a connection
  Serial.begin(115200);
  for (auto startNow = millis() + 2500; !Serial && millis() < startNow; delay(500));
  
  Serial.println("- Arduino Nano R4 - OPAMP Example started...");
  Serial.println("- Initializing OPAMP in high-speed mode...");
  
  // Initialize OPAMP in high-speed mode
  OPAMP.begin(OPAMP_SPEED_HIGHSPEED);
  
  Serial.println("- OPAMP initialized successfully!");
  Serial.println("- OPAMP is now ready for use with external connections");
  Serial.println("- The behavior depends on how you connect the external components");
}

void loop() {
  // The OPAMP operates automatically based on external connections
  // No additional code needed in the loop
  
  Serial.println("- OPAMP running...");
  delay(2000);
}

オペアンプをボルテージフォロワーとして利用するには、Nano R4ボードを以下のように接続します。

  • A2(-)ピンとA3(出力)ピンをジャンプワイヤーで接続
  • 入力信号をA1(+)ピンに接続

試験するには、A1ピンをGNDに接続して、DV0Vが出力されるのを見るか、A1ピンをDV+3.3Vに接続し、電圧を確認します。

i
ボルテージフォロワー設定では、A1にかけられた電圧がA3にそのまま出力されます。入力信号に負荷を与えない、高インピーダンスバッファを実現します。

Nano R4のオペアンプは、弱い信号を増幅する非反転増幅器としても設定できます。例えば、2倍に増幅する回路は以下のように2つの10kΩ抵抗を使い実現できます。

  • 10kΩの抵抗をA2(-)とGNDに接続
  • 10kΩの抵抗をA3(出力)とA2(-)に接続

試験するには、A1ピンに信号を与えます。

i
非反転増幅器設定では、入力信号とNano R4は同一のGNDを共有する必要があり、クリッピングを避けるため、出力信号は約4.7VDCを超えてはいけません。

デジタル・アナログ変換器(Digital-to-Analog Converter: DAC)

Nano R4は、内蔵12ビットデジタル・アナログ変換器(Digital-to-Analog Converter: DAC)を装備していて、A0ピンに接続されています。高速に切り替えてアナログ出力をシミュレートするPWMピンとは違い、DACは本物のアナログ電圧を出力します。オーディオ生成やセンサーの補正、制御システム、波形生成といった、正確なアナログ信号を必要とするアプリケーションに理想的です。

Nano R4ボードのオペアンプは、以下の機能を提供します。

仕様 説明
分解能 12ビット 4096の離散出力レベル
出力ピン A0 専用DAC出力ピン
出力電圧範囲 DV+0.35~+4.5V +5VDCを給電した場合の標準範囲
デフォルト分解能 8ビット 0~255
最大分解能 12ビット 0~4095
出力インピーダンス 5Ω(標準) 低インピーダンス出力
変換時間 最大30μs 出力電圧の更新時間
負荷抵抗 最小30kΩ 最小推奨負荷
負荷静電容量 最大50pF 最大負荷静電容量
i
重要な注意: A0ピンのDACを使うときは、このピンは通常のアナログ入力として利用することはできません。DACは本物のアナログ電圧を出力するので、スムーズな連続電圧レベルを必要とするアプリけしょんでは、PWMよりも優れています。

Nano R4のDACの技術仕様を以下に示します。

パラメーター 最小 標準 最大 単位 説明
微分非直線性(DNL) - ±0.5 ±2.0 LSB DNL誤差
積分非直線性(INL) - ±2.0 ±16.0 LSB INL誤差
オフセット誤差 - - ±30 mV 出力オフセット
フルスケール誤差 - - ±30 mV フルスケール精度

DACに与えるアナログ値を~analogWrite()`関数に与えることができます。

1
analogWrite(DAC, value);

デフォルトの分解能は、8ビット(0-255)です。analogWriteResolution()を使えば、これを変更することができます。8ビットの解像度の場合はanalogWriteResolution()を、10ビットの解像度の場合はanalogWriteResolution(10)を、最大の12ビットの解像度の場合はanalogWriteResolution(12)を使います。

DACの選択した参照モードに依存し、出力電圧は次のように計算されます。Output Voltage = (DAC_Value / 4095) × Reference_Voltage。参照電圧が供給電圧のとき、出力電圧は通常+0.35VDCから+4.5VDCまでです。

i
以下の例では、Nano R4ボードを使って簡単に試験できる基本的なDAC機能を示します。

以下の例では、DACを使い簡単に電圧出力する方法を示します。この例では外部機器は不要です。

 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
/**
DAC Basic Output Example for the Arduino Nano R4 Board
Name: nano_r4_dac_basic.ino
Purpose: This sketch demonstrates how to use the DAC to generate
precise analog voltages on pin A0.

@author Arduino Product Experience Team
@version 1.0 01/06/25
*/

void setup() {
  // Initialize serial communication and wait up to 2.5 seconds for a connection
  Serial.begin(115200);
  for (auto startNow = millis() + 2500; !Serial && millis() < startNow; delay(500));
  
  // Set DAC resolution to 12-bit for maximum precision
  analogWriteResolution(12);
  
  Serial.println("- Arduino Nano R4 - DAC Basic Output Example started...");
  Serial.println("- Generating precise voltages on pin A0");
  Serial.println("- Connect a multimeter to A0 to measure output");
}

void loop() {
  // Generate different voltage levels
  // 0, +1.25, +2.5, +3.75 and +5 VDC
  int dacValues[] = {0, 1024, 2048, 3072, 4095}; 
  float voltages[] = {0.0, 1.25, 2.5, 3.75, 5.0};
  
  for (int i = 0; i < 5; i++) {
    analogWrite(DAC, dacValues[i]);
    
    Serial.print("- DAC Value: ");
    Serial.print(dacValues[i]);
    Serial.print(" | Target Voltage: ");
    Serial.print(voltages[i], 2);
    Serial.println(" VDC");
    
    // Hold each voltage for 2 seconds
    delay(2000);  
  }
  
  Serial.println("- Cycle completed, repeating...");
  delay(1000);
}

この例を試験するには、出力電圧を測定するために、A0とGNDの間にデジタルマルチメーターを接続します。2秒ごとに正確なステップで電圧が変化しているのがわかり、DACの正確なアナログ電圧を生成する能力を示しています。最良の結果を得るには、A0ピンにオシロスコープを接続し、ステップ出力を可視化します。

Arduino IDEのシリアルモニタ(ツール > シリアルモニタ)を開くと、DACの値と関連する設定電圧を表示します。出力は計算した電圧に非常に近いはずです。

以下の例では、DACを使い滑らかなサイン波を生成する方法を示します。この例では外部機器は不要です。

 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
/**
DAC Sine Wave Generator for the Arduino Nano R4 Board
Name: nano_r4_dac_sine_wave.ino
Purpose: This sketch generates a smooth sine wave using the 12-bit DAC
for testing and signal generation applications.

@author Arduino Product Experience Team
@version 1.0 01/06/25
*/

void setup() {
  // Initialize serial communication and wait up to 2.5 seconds for a connection
  Serial.begin(115200);
  for (auto startNow = millis() + 2500; !Serial && millis() < startNow; delay(500));
  
  // Set DAC resolution to 12-bit for smooth waveform
  analogWriteResolution(12);
  
  Serial.println("- Arduino Nano R4 - DAC Sine Wave Generator started...");
  Serial.println("- Generating sine wave on pin A0");
  Serial.println("- Connect an oscilloscope to A0 to view waveform");
}

void loop() {
  // Generate one complete sine wave cycle (360 degrees)
  for (int angle = 0; angle < 360; angle++) {
    // Calculate sine value (-1 to +1) and convert to DAC range (0 to 4095)
    float sineValue = sin(angle * PI / 180.0);
    int dacValue = (int)((sineValue + 1.0) * 2047.5);  // Center at +2.5 VDC
    
    // Output the calculated value to DAC
    analogWrite(DAC, dacValue);
    
    // Print debug info every 30 degrees
    if (angle % 30 == 0) {
      float voltage = (dacValue / 4095.0) * 5.0;
      Serial.print("- Angle: ");
      Serial.print(angle);
      Serial.print("° | DAC: ");
      Serial.print(dacValue);
      Serial.print(" | Voltage: ");
      Serial.print(voltage, 2);
      Serial.println(" VDC");
    }
    
    // Control wave frequency (~28 Hz)
    delayMicroseconds(100);  
  }
}

Arduino IDEのシリアルモニタ(ツール > シリアルモニタ)を開くと、角度とDACの値、対応する電圧が表示され、サイン波を生成している状況が示されます。

最良の結果を得るには、A0ピンにオシロスコープを接続し、サイン波を可視化します。

リアルタイムクロック(Real-Time Clock: RTC)

Nano R4は、リアルタイムクロック(Real-Time Clock: RTC)を内蔵していて、日付と時刻を管理することができます。RTCはRA4M1マイクロコントローラーに統合されていて、スケジューリングやデータロギング、時刻ベースのイベントを扱うアプリケーション向けに、正確な時刻を管理できます。ボードのVBATTピンから供給するオプションのバックアップ電源で、RTCは、主電源が落ちた状態でも継続して実行し続けることができ、自動的にうるう年を補正できる2000年から2099年までの100年カレンダーを使うことができます。

RTCは、単に時間間隔を測定するときよりも、プロジェクトが正確な日付と時刻を知る必要があるときに特に有用です。millis()やdelay()のようなArduino関数はタイミングをとる操作(例えば毎秒LEDを点滅させるなど)を行うときは完璧ですが、RTCは、電源を切った後再度入れたときにでも、タイムスタンプが必要なデータロガーやアラーム時計、スケジューリングシステム、今何時化を知る必要のあるすべてのプロジェクトに不可欠なものです。

Nano R4のRTCの、技術仕様を以下に示します。

パラメーター 説明
時刻範囲 2000~2099 100年カレンダー
バックアップ電圧 1.6V~3.6V VBATTピン経由
消費電流 ~1μA バックアップモード時
温度範囲 -40℃~+85℃ 動作範囲

専用のRTC.hライブラリを使うことで、RTCの設定および利用が可能です。このライブラリは、Arduno Uno R4ボードのコアに含まれます。このライブラリは、時刻設定や時刻取得、RTCの状態確認、アラーム設定を行う関数を提供します。

以下の例は、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
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
/**
RTC Basic Example for the Arduino Nano R4 Board
Name: nano_r4_rtc_basic.ino
Purpose: This sketch demonstrates how to use the built-in RTC
to keep track of date and time.

@author Arduino Product Experience Team
@version 1.0 01/06/25
*/

#include "RTC.h"

void setup() {
  // Initialize serial communication and wait up to 2.5 seconds for a connection
  Serial.begin(115200);
  for (auto startNow = millis() + 2500; !Serial && millis() < startNow; delay(500));
  
  Serial.println("- Arduino Nano R4 - RTC Basic Example started...");
  Serial.println("- Initializing RTC...");
  
  // Initialize RTC
  RTC.begin();
  
  // Set initial time: January 15, 2025, 12:00:00 PM, Monday
  RTCTime startTime(15, Month::JANUARY, 2025, 12, 0, 0, DayOfWeek::MONDAY, SaveLight::SAVING_TIME_INACTIVE);
  RTC.setTime(startTime);
  
  Serial.println("- RTC time has been set to January 15, 2025, 12:00:00 PM");
  Serial.println("- Current date and time will be displayed every second");
}

void loop() {
  // Get current time from RTC
  RTCTime currentTime;
  RTC.getTime(currentTime);
  
  // Get individual values
  int year = currentTime.getYear();
  int month = Month2int(currentTime.getMonth());
  int day = currentTime.getDayOfMonth();
  
  int hour = currentTime.getHour();
  int minute = currentTime.getMinutes();
  int second = currentTime.getSeconds();
  
  // Display date (YYYY/MM/DD)
  Serial.print("Date: ");
  Serial.print(year);
  Serial.print("/");
  if (month < 10) Serial.print("0");
  Serial.print(month);
  Serial.print("/");
  if (day < 10) Serial.print("0");
  Serial.print(day);
  
  // Display time (HH:MM:SS)
  Serial.print(" | Time: ");
  if (hour < 10) Serial.print("0");
  Serial.print(hour);
  Serial.print(":");
  if (minute < 10) Serial.print("0");
  Serial.print(minute);
  Serial.print(":");
  if (second < 10) Serial.print("0");
  Serial.print(second);
  
  // Display day of week
  Serial.print(" | Day: ");
  DayOfWeek dayOfWeek = currentTime.getDayOfWeek();
  
  if (dayOfWeek == DayOfWeek::MONDAY) {
    Serial.print("Monday");
  } else if (dayOfWeek == DayOfWeek::TUESDAY) {
    Serial.print("Tuesday");
  } else if (dayOfWeek == DayOfWeek::WEDNESDAY) {
    Serial.print("Wednesday");
  } else if (dayOfWeek == DayOfWeek::THURSDAY) {
    Serial.print("Thursday");
  } else if (dayOfWeek == DayOfWeek::FRIDAY) {
    Serial.print("Friday");
  } else if (dayOfWeek == DayOfWeek::SATURDAY) {
    Serial.print("Saturday");
  } else if (dayOfWeek == DayOfWeek::SUNDAY) {
    Serial.print("Sunday");
  }
  
  Serial.println();
  
  // Wait one second before next reading
  delay(1000);
}
i
この例を試験するには、外部機器は不要です。RTCはマイクロコントローラー内で動作します。

Arduino IDEのシリアルモニタ(ツール > シリアルモニタ)を開くと、現在の日付と時間が更新されるのが表示されます。ディスプレイには、現在の日付と時刻、曜日が毎秒表示されます。

主電源が切断された後にも、RTCが時刻に時刻を維持し続けるには、バックアップ電源をVBATTピンに接続します。

  • 3Vのボタン電池(CR2032)のプラス極をボードのVBATTピンに接続
  • 電池のマイナス極をGNDに接続

この設定では、主電源を切ってもバックアップ電源でボードのRTCは動作し続けます。ボードのRTCの時刻を、以下のフォーマットでプログラムから設定することもできます。スケッチをアップロードしたときに、日付と時刻を現在の時刻に合わせてください。

1
2
3
4
5
6
// Create RTCTime object with current date and time
// Format: day, month, year, hour, minute, second, dayOfWeek, daylightSaving
RTCTime newTime(30, Month::JUNE, 2025, 15, 30, 45, DayOfWeek::MONDAY, SaveLight::SAVING_TIME_INACTIVE);

// Set the RTC time
RTC.setTime(newTime);

Nano R4のRTCを操作する際、正しく実装するためのキーポイントがいくつかあります。

  • RTCが正しい時刻を提供するには、RTCの内部時計を初期化する必要があります。このため、プロジェクトを最初に開始したときに日付と時刻を設定してください。主電源が切断された後にも時刻を維持し続ける必要のあるアプリケーションでは、バックアップ電源をVBATTピンに接続することが強く推奨されます。
  • RTCは設定した時刻を格納するのを忘れないでください。このため、必要に応じてタイムゾーンや夏時間の調整をアプリケーションのコードで実行する必要があります。

EEPROM(不揮発性メモリー)

Nano R4は、EEPROM(Electrically Erasable Programmable Read-Only Memory)を内蔵していて、ボードの電源を切った後でも、プロジェクトがデータを永続化することができます。EEPROMは、RA4M1マイクロコントローラー内でのフラッシュメモリーエミュレーションを利用して実装されていて、電源サイクル間での設定やセンサーの校正、ユーザー設定を記録しておく必要のあるアプリケーションに対して、8kBの不揮発性メモリーを提供します。

プログラムの実行時だけではなく、プロジェクトが永続的に情報を記憶しておく必要があるときに、EEPROMは特に有用です。SRAMに格納された変数は電源が落ちた時に失われるのに対して、EEPROMはでデータをいつまでも保持し続けます。ユーザー設定を保持すしたり、センサーの校正値を格納したり、設定を記録したり、電源が抜かれて再接続したときにデータを記憶しておく必要のあるすべてのプロジェクトに対して、重要なことです。

Nano R4のRTCの、技術仕様を以下に示します。

パラメーター 説明
容量 8kB データ領域
メモリー形式 データフラッシュメモリー SuperFlash®技術
書き込みサイクル 100,000 最大プログラム/消去サイクル
プログラミング単位 64ビット 最低書込単位
消去単位 1kB 最低消去単位
読取速度 6クロックサイクル データ読取時間
保持期間 10年以上 データ保持期間
動作電圧 +5VDC ボードと同じ

専用のEEPROM.hライブラリを使うことで、EEPROMに読み書きできます。このライブラリは、Arduno Uno R4ボードのコアに含まれます。このライブラリは、1バイトや大きいデータ構造の格納・取得する基本関数を提供します。

以下の例は、EEPROMにデータを格納したり読み出したりする方法を示します。

 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
/**
EEPROM Basic Example for the Arduino Nano R4 Board
Name: nano_r4_eeprom_basic.ino
Purpose: This sketch demonstrates how to store and retrieve data
from the built-in EEPROM memory.

@author Arduino Product Experience Team
@version 1.0 01/06/25
*/

#include <EEPROM.h>

void setup() {
  // Initialize serial communication and wait up to 2.5 seconds for a connection
  Serial.begin(115200);
  for (auto startNow = millis() + 2500; !Serial && millis() < startNow; delay(500));
  
  Serial.println("- Arduino Nano R4 - EEPROM Basic Example started...");
  
  // Read a counter from EEPROM address 0
  int bootCounter = EEPROM.read(0);
  
  // If this is the first time (EEPROM starts with 255), set counter to 0
  if (bootCounter == 255) {
    bootCounter = 0;
    Serial.println("- First boot detected!");
  }
  
  // Add 1 to the counter
  bootCounter = bootCounter + 1;
  
  // Save the new counter value to EEPROM
  EEPROM.write(0, bootCounter);
  
  // Show the results
  Serial.print("- This board has been reset ");
  Serial.print(bootCounter);
  Serial.println(" times");
  
  // Store a user preference (LED brightness)
  int brightness = 128;  // Value from 0 to 255
  EEPROM.write(1, brightness);
  Serial.print("- LED brightness setting saved: ");
  Serial.println(brightness);
  
  // Read the brightness setting back
  int savedBrightness = EEPROM.read(1);
  Serial.print("- LED brightness setting loaded: ");
  Serial.println(savedBrightness);
  
  Serial.println("- Reset the board to see the counter increase!");
}

void loop() {
  // Nothing to do in the loop
  // The counter only increases when you reset the board
  delay(1000);
}
i
この例を試験するには、外部機器は不要です。EEPROMはマイクロコントローラー内で動作します。

Arduino IDEのシリアルモニタ(ツール > シリアルモニタ)を開くと、EEPROMの動作が表示されます。ボードをリセットするたびに、ブートカウンターがインクリメントされ、EEPROMメモリー内に値が保持されていることを示します。

EEPROM.put()とEEPROM.get()関数を使えば、複雑なデータ構造も格納できます。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
// Define a structure for complex data
struct Settings {
  int threshold;
  float calibration;
  bool enabled;
  char deviceName[16];
};

// Store structure to EEPROM
Settings mySettings = {512, 3.14, true, "NanoR4Device"};
EEPROM.put(0, mySettings);

// Read structure from EEPROM
Settings loadedSettings;
EEPROM.get(0, loadedSettings);

Nano R4のEEPROMを操作する際、正しく実装するためのキーポイントがいくつかあります。

  • フラッシュメモリーには書き込み回数制限(100000回)があるので、EEPROMへの書き込み操作には注意深い管理が必要です。メモリーを消耗させるので、タイトループ内で同一アドレスに繰り返し書き込むことを避けてください。代わりに、値が実際に変化したときにだけ書き込んでください。また、消耗を均等に分散させるために、異なるアドレスに分散させることを考えてください。
  • EEPROMはデータをバイト単位(0~255)で格納することに注意してください。このため、大きいデータは分割するか、put()とget()関数を使い自動分割させるかしてください。
  • EEPROMは、通常の状態で10年以上データを保持できるので、設定データやユーザ設定を長期間保存するのに適しています。

UART通信

Nano R4ボードでは、UART(Universal Asynchronous Receiver-Transmitter)通信を実行でき、シリアルデータ転送を通じ、プロジェクトは他のデバイスと通信することができます。UARTは、RA4M1マイクロコントローラー内に実装されていて、2つの異なるハードウェアシリアルポートを提供しています。一つはPCとの通信用にUSB-Cコネクターに接続されていて、もう一つは、外部デバイスとの通信用にD0ピンとD1ピンで利用可能です。デバッグ目的にUSB接続を維持したまま、センサーやモジュール、他のマイクロコントローラーと通信する必要のあるプロジェクトに最適です。

SPIやI2Cのような複雑なプロトコルではなく、シンプルで信頼性のある通信が必要なデバイスとの通信が必要なプロジェクトに有用です。SPIは高速通信に優れていて、I2Cは複数デバイスのネットワークに最適ですが、UARTは、GPSモジュールやBluetooth®モジュール、Wi-Fi®モジュール、他のシリアルデバイスとの明確な1対1での通信を提供します。UART通信は非同期です。すなわち、共有クロック信号は不要で、長距離通信に向いています。

Nano R4のUARTインターフェイスの、技術仕様を以下に示します。

パラメーター 説明
ボーレート 300~2000000 一般的には9600、115200
データビット 8ビット 標準データ幅
通信 全二重 TX/RX同時
ハードウェアポート 2 USBシリアル、Serial1
UARTピン D0、D1 それぞれRX、TX
動作電圧 +5VDC TTLロジックレベル
フロー制御 ソフトウェア XON/XOFFサポート

Nano R4ボードは、以下のピンをUART通信に利用します。

Arduinoピン マイクロコントローラーピン UART機能 説明
D0 P104 RX データ受信
D1 P105 TX ~ データ送信

内蔵SerialとSerial1オブジェクトを使うことで、UART経由で通信が可能です。Serialオブジェクトは、PCとの通信用にUSB-Cポートに接続されています。Serial1は、外部デバイスとの通信用にD0ピンとD1ピンに接続されています。

以下の例は、基本的なUART通信のパターンを示します。

 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
/**
UART Basic Example for the Arduino Nano R4 Board
Name: nano_r4_uart_basic.ino
Purpose: This sketch demonstrates basic UART communication
using both USB Serial and hardware Serial1.

@author Arduino Product Experience Team
@version 1.0 01/06/25
*/

void setup() {
  // Initialize USB serial communication at 115200 baud
  Serial.begin(115200);
  for (auto startNow = millis() + 2500; !Serial && millis() < startNow; delay(500));
  
  // Initialize hardware serial on pins D0/D1 at 9600 baud
  Serial1.begin(9600);
  
  Serial.println("- Arduino Nano R4 - UART Basic Example started...");
  Serial.println("- USB Serial (Serial): 115200 baud");
  Serial.println("- Hardware Serial (Serial1): 9600 baud on D0/D1");
  Serial.println("- Connect logic analyzer to D0 (RX) and D1 (TX)");
  Serial.println("- Type messages in Serial Monitor to send via Serial1");
  Serial.println();
}

void loop() {
  // Check for data from USB Serial (computer)
  if (Serial.available()) {
    String message = Serial.readString();

    // Remove newline characters
    message.trim(); 
    
    if (message.length() > 0) {
      Serial.print("- USB received: \"");
      Serial.print(message);
      Serial.println("\"");
      
      // Send the message via Serial1 (D0/D1)
      Serial1.print("- Message from USB: ");
      Serial1.println(message);
      
      Serial.println("- Message sent via Serial1 (D0/D1)!");
    }
  }
  
  // Check for data from Serial1 (external device on D0/D1)
  if (Serial1.available()) {
    String response = Serial1.readString();

    // Remove newline characters
    response.trim(); 
    
    if (response.length() > 0) {
      Serial.print("- Serial1 received: \"");
      Serial.print(response);
      Serial.println("\"");
    }
  }
  
  // Send periodic test data via Serial1
  static unsigned long lastSend = 0;
  if (millis() - lastSend > 3000) {
    lastSend = millis();
    
    // Send test data with timestamp
    Serial1.print("Test data: ");
    Serial1.print(millis());
    Serial1.println(" ms");
    
    Serial.println("- Periodic test data sent via Serial1!");
  }
  
  delay(10);
}
i
この例を試験するには、外部のUARTデバイスは不要です。コードは、ロジックアナライザーで観測できる、UART通信パターンを実行します。Arduino IDEのシリアルモニタにメッセージを打ち込み、D0ピンとD1ピンに接続されているSerial1経由で通信する様子を見ることができます。

Arduino IDEのシリアルモニタ(ツール > シリアルモニタ)を開くと、USBシリアルポートを使い通信でき、通信パターンを観測することができます。ロジックアナライザーをD0ピン(RX)とD1ピン(TX)に接続すれば、実際のUARTプロトコル信号を観測することができます。

以下の図は、上記の例でのUARTがDigilent Waveformsのロジックアナライザーソフトでどのように表示されるかが示されていて、プロトコルがデコードされ、送信データのバイトとタイミングがわかります。

Nano R4ボードは2つの異なるUART通信チャネルを備えていて、複数の通信タスクを同時に取り扱う柔軟性を提供しています。

一つ目のチャネルはUSBシリアル(Serial)で、プログラミングやデバッグの主要なインターフェイスです。このチャネルでの主な機能を示します。

  • ボード上のUSB-Cコネクタに接続されています
  • プログラミングとデバッグに使われています
  • 典型的には115200ボーで通信します
  • ボーレートを自動検出します
  • 外部接続は不要です

二つ目のチャネルはハードウェアシリアル(Serial1)で、外部デバイスとの通信に使われます。このチャネルは、プロジェクトの外部機器との堅牢な接続性を提供します。

  • D0ピン(RX)とD1ピン(TX)に接続されています
  • 外部デバイスとの通信に使われます
  • ボーレートを設定できます(300~2000000)
  • TTLロジックレベル(0VDC/+5VDC)
  • 外部デバイスとの接続が必要です

以下は、GPSモジュールを接続しているときなど、両方のUARTチャネルを利用する実践的な例です。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
// Example: Connecting a GPS module via Serial1
void setup() {
  Serial.begin(115200);   // USB debugging
  Serial1.begin(9600);    // GPS module communication
  
  Serial.println("GPS module communication started");
}

void loop() {
  // Forward GPS data to USB Serial for monitoring
  if (Serial1.available()) {
    String gpsData = Serial1.readString();
    Serial.print("GPS: ");
    Serial.print(gpsData);
  }
  
  // Send commands to GPS module from USB Serial
  if (Serial.available()) {
    String command = Serial.readString();
    Serial1.print(command);
    Serial.println("Command sent to GPS");
  }
}

Nano R4のUARTを操作する際、正しく実装するためのキーポイントがいくつかあります。

  • 二つのUARTを利用する設計は、USBとD0ピン/D1ピンが一つのUARTを共有するUNO R3ボードと異なります。この分離により、USBデバッグと外部デバイスとの通信を両立させることができます。
  • 正しく通信するために、双方のデバイスが、同じボーレートとデータビット(通常は8)、ストップビット(通常は1)を使っていることを確認してください。
  • UART通信は、TTL電圧レベル(LOWは0VDC、HIGHは+5VDC)を使うことに注意してください。
  • 外部デバイスを接続するときは、TXとRX、RXとTXを接続(クロス接続)してください。
  • Nano R4のUARTデバイスは全二重です。データの送受信を同時に行うことができるので、GPSモジュールやBluetooth®、Wi-Fi®や他のマイクロコントローラーとの通信に最適です。

SPI通信

Nano R4ボードでは、SPI(Serial Peripheral Interface)通信を実行でき、プロジェクトが、センサーやディスプレイ、メモリーカード、他のマイクロコントローラーなどの外部デバイスと通信することができます。SPIは、RA4M1マイクロコントローラー内で実装され、専用の4ピンを使い、高速同期シリアル通信を行います。

SPIは、低速通信ではなく、高速通信を必要とする外部機器と通信する際に特に有用です。I2Cは簡単なセンサー通信に、UARTは基本的なシリアルデータ交換にそれぞれ有用ですが、SPIはSDカードやTFTディスプレイ、ワイヤレスモジュール、外部メモリーチップなど、高速通信に優れます。SPIはI2Cよりも非常に高速なデータレートを達成でき、個々のチップセレクト線を通じて、複数のデバイスを制御可能です。

Nano R4のSPIインターフェイスの、技術仕様を以下に示します。

パラメーター 説明
クロックスピード 最大24Mhz 最大SPI周波数
データ転送 8ビット 標準データ幅
通信 全二重 送受信同時
SPIピン D10~D13 CS、MOSI、MISO、SCK
複数デバイス 対応 異なるCSピンで制御
動作電圧 +5VDC ボードと同じ
サポートプロトコル モード0、1、2、3 全SPIモード利用可能

Nano R4ボードは、以下のピンをSPI通信に利用します。

Arduinoピン マイクロコントローラーピン SPI機能 説明
D10 P103 CS チップセレクト
D11 P101 MOSI Master Out、Slave In
D12 P100 MISO Master In、Slave Out
D13 P102 SCK シリアルクロック

専用のSPI.hライブラリを使うことで、SPI通信ができます。このライブラリは、Arduno Uno R4ボードのコアに含まれます。このライブラリは、バスの初期化やデータの送受信、複数デバイスの管理などの基本関数を提供します。

以下の例は、SPI通信でデータを送受信する方法を示します。

 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
/**
SPI Basic Example for the Arduino Nano R4 Board
Name: nano_r4_spi_basic.ino
Purpose: This sketch demonstrates how to use SPI communication
to send and receive data.

@author Arduino Product Experience Team
@version 1.0 01/06/25
*/

#include <SPI.h>

// Chip Select pin for SPI device
const int CS_PIN = 10;

void setup() {
  // Initialize serial communication and wait up to 2.5 seconds for a connection
  Serial.begin(115200);
  for (auto startNow = millis() + 2500; !Serial && millis() < startNow; delay(500));
  
  Serial.println("- Arduino Nano R4 - SPI Basic Example started...");
  
  // Set CS pin as output and set it HIGH (inactive)
  pinMode(CS_PIN, OUTPUT);
  digitalWrite(CS_PIN, HIGH);
  
  // Initialize SPI communication
  SPI.begin();
  
  // Configure SPI settings
  // - Clock speed: 1 MHz (1000000 Hz)
  // - Data order: Most Significant Bit first
  // - Data mode: Mode 0 (Clock polarity = 0, Clock phase = 0)
  SPI.beginTransaction(SPISettings(1000000, MSBFIRST, SPI_MODE0));
  
  Serial.println("- SPI initialized successfully");
  Serial.println("- Ready to communicate with SPI devices");
  
  // Example: Send some test data
  sendSPIData();
}

void loop() {
  // Send a counter value every 2 seconds
  static int counter = 0;
  
  // Select the device (CS LOW)
  digitalWrite(CS_PIN, LOW);
  
  // Send counter value
  byte response = SPI.transfer(counter);
  
  // Deselect the device (CS HIGH)
  digitalWrite(CS_PIN, HIGH);
  
  // Display results
  Serial.print("- Sent: ");
  Serial.print(counter);
  Serial.print(" | Received: ");
  Serial.println(response);
  
  // Increment counter and wrap around at 255
  counter++;
  if (counter > 255) {
    counter = 0;
  }
  
  delay(2000);
}

void sendSPIData() {
  Serial.println("- Sending test data...");
  
  // Select the device
  digitalWrite(CS_PIN, LOW);
  
  // Send a sequence of test bytes
  for (int i = 0; i < 5; i++) {
    byte testData = 0x10 + i;  // Send 0x10, 0x11, 0x12, 0x13, 0x14
    byte response = SPI.transfer(testData);
    
    Serial.print("  Sent: 0x");
    if (testData < 16) Serial.print("0");
    Serial.print(testData, HEX);
    Serial.print(" | Received: 0x");
    if (response < 16) Serial.print("0");
    Serial.println(response, HEX);
    
    delay(100);
  }
  
  // Deselect the device
  digitalWrite(CS_PIN, HIGH);
  
  Serial.println("- Test data transmission complete");
}
i
この例を試験するには、外部機器が必要です。コードはSPI通信のパターンを示します。しかし、デバイスを接続していない状態では、受信したデータは通常0xFFです。

Arduino IDEのシリアルモニタ(ツール > シリアルモニタ)を開くと、SPI通信を実行している様子を見ることができます。スケッチ例は、デバイスを選択し、データを送信し、結果を処理する方法を示します。

以下の図は、上記の例でのSPI通信がDigilent Waveformsのロジックアナライザーソフトでどのように表示されるかが示されていて、プロトコルがデコードされ、チップセレクトとクロック、データ信号がどのように送信されているかがわかります。

複数のSPIデバイスを接続するには、異なるデジタルピンを追加のチップセレクト(CS)線として利用します。MOSIとMISO、SCKピンは共有します。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
// Multiple device example
const int DEVICE1_CS = 10;  // First SPI device
const int DEVICE2_CS = 9;   // Second SPI device
const int DEVICE3_CS = 8;   // Third SPI device

void setup() {
  SPI.begin();
  
  // Configure all CS pins
  pinMode(DEVICE1_CS, OUTPUT);
  pinMode(DEVICE2_CS, OUTPUT);
  pinMode(DEVICE3_CS, OUTPUT);
  
  // Set all CS pins HIGH (inactive)
  digitalWrite(DEVICE1_CS, HIGH);
  digitalWrite(DEVICE2_CS, HIGH);
  digitalWrite(DEVICE3_CS, HIGH);
}

Nano R4のSPIを操作する際、正しく実装するためのキーポイントがいくつかあります。

  • SPIプロトコルは、タイミングとデバイスの選択に細心の注意を払う必要があります。同時には一つのデバイスだけを選択(CSをLOW)するようにしてください。通信後は、競合を避けるため、デバイスを開放(CSをHIGH)してください。
  • 異なるSPIデバイスは、異なるクロックスピードやモードを設定する必要があるかもしれません。このため、正しいSPISettings()のパラメータを設定するために、デバイスのデータシートを確認してください。
  • SPIプロトコルは同期プロトコルであることを意識してください。データは双方向に同時にそれぞれのクロックパルスで送信されます。データを送信するだけでも、データを受信します。その逆もあります。
  • Nano R4ボードは、異なるチップセレクト(CS)ピンを使うことで、複数のSPIデバイスと通信できます。様々なセンサーやディスプレイ、ストレージデバイスなどと通信する必要がある複雑なプロジェクトに最適です。

I2C通信

Nano R4ボードでは、I2C(Inter-Integrated Circuit)通信を実行でき、2線を使うだけで、プロジェクトが複数のデバイスと通信することができます。I2Cは、RA4M1マイクロコントローラー内で実装され、専用の2ピンを使い、センサーやディスプレイ、メモリーモジュール、他のマイクロコントローラーとの信頼性のあるシリアル通信を提供します。ピンを消費せずに複数のデバイスと接続する必要のあるプロジェクトに最適です。

I2Cは、複雑な配線を用いず、簡単な方法で複数のセンサーやデバイスと通信する必要があるプロジェクトで有用です。SPIは高速通信に、UARTは基本的なシリアルデータ交換に優れていますが、複数のI2Cデバイスは、それぞれに固有のアドレスを与えることで同じ二線バスを共有するので、センサーネットワークやディスプレイモジュール、拡張可能なシステムに有用です。

Nano R4のI2Cインターフェイスの、技術仕様を以下に示します。

パラメーター 説明
クロックスピード 最大400kHz 標準/高速モード
データ転送 8ビット 標準データ幅
通信 半二重 同時には片方向
I2Cピン A4、A5 それぞれSDA、SCL
デバイスアドレス 7ビット/10ビット 最大127の個別アドレス
動作電圧 +5VDC ボードと同じ
プルアップ抵抗 外部抵抗が必要 内蔵プルアップなし

Nano R4ボードは、以下のピンをI2C通信に利用します。

Arduinoピン マイクロコントローラーピン I2C機能 説明
A4 P004 SDA シリアルデータ線
A5 P010 SCL シリアルクロック線

専用のWire.hライブラリを使うことで、SPI通信ができます。このライブラリは、Arduno Uno R4ボードのコアに含まれます。このライブラリは、バスの初期化やデータの送受信、複数デバイスの管理などの基本関数を提供します。

以下の例は、I2C通信の基本的なパターンを示します。

 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
/**
I2C Basic Example for the Arduino Nano R4 Board
Name: nano_r4_i2c_basic.ino
Purpose: This sketch demonstrates basic I2C communication
patterns for protocol analysis.

@author Arduino Product Experience Team
@version 1.0 01/06/25
*/

#include <Wire.h>

// Example device address
const int DEVICE_ADDRESS = 0x48;

void setup() {
  // Initialize serial communication and wait up to 2.5 seconds for a connection
  Serial.begin(115200);
  for (auto startNow = millis() + 2500; !Serial && millis() < startNow; delay(500));
  
  Serial.println("- Arduino Nano R4 - I2C Basic Example started...");
  
  // Initialize I2C communication as master
  Wire.begin();
  
  Serial.println("- I2C initialized successfully");
  Serial.println("- Connect protocol analyzer to A4 (SDA) and A5 (SCL)");
  Serial.println("- Starting I2C communication patterns...");
  
  delay(2000);
}

void loop() {
  // Write a single byte
  Serial.println("- Writing single byte (0xAA) to device 0x48...");
  Wire.beginTransmission(DEVICE_ADDRESS);
  Wire.write(0xAA);
  Wire.endTransmission();
  
  delay(1000);
  
  // Write multiple bytes
  Serial.println("- Writing multiple bytes (0x10, 0x20, 0x30) to device 0x48...");
  Wire.beginTransmission(DEVICE_ADDRESS);
  Wire.write(0x10);
  Wire.write(0x20);
  Wire.write(0x30);
  Wire.endTransmission();
  
  delay(1000);
  
  // Request data from device
  Serial.println("- Requesting 2 bytes from device 0x48...");
  Wire.requestFrom(DEVICE_ADDRESS, 2);
  
  // Read any available data
  while (Wire.available()) {
    int data = Wire.read();
    Serial.print("Received: 0x");
    if (data < 16) Serial.print("0");
    Serial.println(data, HEX);
  }
  
  delay(2000);
  Serial.println("---");
}
i
この例を試験するには、外部機器が必要です。コードはI2C通信のパターンを示します。プロトコルアナライザーで解析可能です。しかし、デバイスを接続していない状態では、受信したデータは通常0xFFです。

Arduino IDEのシリアルモニタ(ツール > シリアルモニタ)を開くと、I2C通信を実行している様子を見ることができます。実際のI2Cプロトコル信号を観測するには、プロトコルアナライザーにA4(SDA)ピンとA5(SCL)キーを接続します。

以下の図は、上記の例でのI2C通信がDigilent Waveformsのロジックアナライザーソフトでどのように表示されるかが示されていて、プロトコルがデコードされ、デバイスのアドレスとデータがどのように送信されているかがわかります。

i
I2CプロトコルはSDAとSCLの両線にプルアップ抵抗が必要です。Nano R4ボードは、アナログ入力機能との干渉を避けるために、A4にもA5にも内蔵プルアップ抵抗を備えていません。このため、正しくI2C操作を行うには、外部の4.7kΩのプルアップ抵抗を+5VDCに接続する必要があります。

I2Cの主な利点の一つは、同一のバスに複数のデバイスを接続できることです。複数のI2Cデバイスを接続する方法を示します。

 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
// Example: Communicating with multiple I2C devices
void communicateWithMultipleDevices() {
  // Device addresses (examples)
  const int SENSOR_ADDRESS = 0x48;    // Temperature sensor
  const int DISPLAY_ADDRESS = 0x3C;   // OLED display
  const int EEPROM_ADDRESS = 0x50;    // External EEPROM
  
  // Read from temperature sensor
  Wire.beginTransmission(SENSOR_ADDRESS);
  Wire.write(0x00);  // Register to read
  Wire.endTransmission();
  
  Wire.requestFrom(SENSOR_ADDRESS, 2);
  if (Wire.available() >= 2) {
    int tempHigh = Wire.read();
    int tempLow = Wire.read();
    Serial.print("Temperature: ");
    Serial.println((tempHigh << 8) | tempLow);
  }
  
  // Send data to display
  Wire.beginTransmission(DISPLAY_ADDRESS);
  Wire.write(0x40);  // Data mode
  Wire.write(0xFF);  // Sample data
  Wire.endTransmission();
  
  // Write to EEPROM
  Wire.beginTransmission(EEPROM_ADDRESS);
  Wire.write(0x00);  // Memory address
  Wire.write(0x55);  // Data to write
  Wire.endTransmission();
}

Nano R4のI2Cを操作する際、正しく実装するためのキーポイントがいくつかあります。

  • 各I2Cデバイスは、バス上で固有のアドレスを持つ必要があります。このため、アドレスの衝突を避けるため、デバイスのデータシートを確認してください。
  • I2Cは半二重プロトコルであることを意識してください。データは同時には片方向にしか流れません。マスターデバイス(Nano R4ボード)がクロック線を制御し、すべての通信を開始します。
  • 複数のデバイスを接続するときは、すべてのSDAピンをそれぞれ接続し、すべてのSCLピンをそれぞれ接続してください。電源とGNDも接続します。
  • Nano R4ボードは最大127個の異なるI2Cデバイスを同じバスに接続できます。複雑なセンサーネットワークや拡張可能なシステムに最適です。

CAN通信

Nano R4ボードでは、CAN(Controller Area Network)通信を実行でき、自動車ネットワークや産業デバイス、他のCAN設備と通信することができます。CANは、RA4M1マイクロコントローラー内で実装され、専用の2ピンを使い、複数のデバイスとの長距離の堅牢なリアルタイム通信を行うことができます。ノイズの多い環境で信頼性の高い通信が必要となる自動車アプリケーションや産業オートメーション分散制御システムに最適です。

CANは、単純な2点間通信ではなく、信頼性とノイズ耐性が重要な産業や自動車環境で通信する必要のあるプロジェクトに最適です。UARTは基本的なシリアル通信に優れ、SPIは高速データ通信を提供し、CANは内蔵エラー検出や衝突処理、メッセージ優先度を提供します。CAN通信は差動信号方式なので、電磁干渉に強く過酷な環境での利用に適しています。

Nano R4のCANインターフェイスの、技術仕様を以下に示します。

パラメーター 説明
ボーレート 最大1Mbps 設定可能な速度
データフレーム 0-8バイト 標準CANフレーム
通信 マルチマスター 複数ノードサポート
CANピン D4、D5 それぞれTX、RX
メッセージID 11ビット/29ビット 標準/拡張フォーマット
動作電圧 +5VDC CANトランシーバーが必要
外部ハードウェア 必要 CANトランシーバーが必要

Nano R4ボードは、以下のピンをCAN通信に利用します。

Arduinoピン マイクロコントローラーピン I2C機能 説明
D4 P109 CAN_TX CAN送信
D5 P110 CAN_RX CAN受信
i
重要な注意: Nano R4のCANインターフェイスはロジックレベルの信号だけが利用可能です。この信号を、実際のCAN通信が必要とする異なるCANバスレベル(CANH/CANL)に変換するには、外部のCANトランシーバー(Texas Instruments®のSN65HVD230やMicrochip®のMCP2561など)が必要です。

専用のArduino_CAN.hライブラリを使うことで、SPI通信ができます。このライブラリは、Arduno Uno R4ボードのコアに含まれます。このライブラリは、バスの初期化やCANフレームの送受信、メッセージフィルタリングなどの基本関数を提供します。

以下の例は、CAN通信の基本的なパターンを示します。

 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
/**
CAN Basic Example for the Arduino Nano R4 Board
Name: nano_r4_can_basic.ino
Purpose: This sketch demonstrates basic CAN communication
for automotive and industrial applications.

@author Arduino Product Experience Team
@version 1.0 01/06/25
*/

#include <Arduino_CAN.h>

void setup() {
  // Initialize serial communication and wait up to 2.5 seconds for a connection
  Serial.begin(115200);
  for (auto startNow = millis() + 2500; !Serial && millis() < startNow; delay(500));
  
  Serial.println("- Arduino Nano R4 - CAN Basic Example started...");
  
  // Initialize CAN communication at 500k baud
  if (!CAN.begin(CanBitRate::BR_500k)) {
    Serial.println("- Error: Failed to initialize CAN bus!");
    while (1) delay(10);
  }
  
  Serial.println("- CAN bus initialized at 500k baud");
  Serial.println("- Connect CAN transceiver to D4 (TX) and D5 (RX)");
  Serial.println("- Sending periodic CAN messages...");
  
  delay(1000);
}

void loop() {
  // Send periodic CAN messages
  static unsigned long lastSend = 0;
  if (millis() - lastSend > 1000) {
    lastSend = millis();
    
    // Create a CAN message
    uint8_t data[8] = {0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08};
    CanMsg msg(CAN_ID(0x123), sizeof(data), data);
    
    // Send the message
    int result = CAN.write(msg);
    if (result == 1) {
      Serial.print("- CAN message sent - ID: 0x");
      Serial.print(0x123, HEX);
      Serial.print(", Data: ");
      for (int i = 0; i < 8; i++) {
        Serial.print("0x");
        if (data[i] < 16) Serial.print("0");
        Serial.print(data[i], HEX);
        if (i < 7) Serial.print(" ");
      }
      Serial.println();
    } else {
      Serial.println("- Error: Failed to send CAN message!");
    }
  }
  
  // Check for incoming CAN messages
  if (CAN.available()) {
    CanMsg receivedMsg = CAN.read();
    
    Serial.print("- CAN message received - ID: 0x");
    Serial.print(receivedMsg.id, HEX);
    Serial.print(", Length: ");
    Serial.print(receivedMsg.data_length);
    Serial.print(", Data: ");
    
    for (int i = 0; i < receivedMsg.data_length; i++) {
      Serial.print("0x");
      if (receivedMsg.data[i] < 16) Serial.print("0");
      Serial.print(receivedMsg.data[i], HEX);
      if (i < receivedMsg.data_length - 1) Serial.print(" ");
    }
    Serial.println();
  }
  
  delay(10);
}
i
この例を試験するには、外部CANトランシーバーをD4ピンとD5ピンに接続する必要があります。コードはCAN通信のパターンを示します。CANアナライザーで解析可能です。CANトランシーバーもCANネットワークもない状態で社、メッセージは実際のCANバスには送信されません。

Nano R4のCANインターフェイスはロジックレベルの信号だけが利用可能です。これらの信号をCANネットワークが要求する異なる電圧レベルに変換するには、CANトランシーバーが必要です。トランシーバーは、Nano R4と実際のCANバスを接続するブリッジの役目を果たし、電気要件を処理し分離を提供します。

Nano R4ボードを利用したプロトタイピングでは、Microchip®のMCP2561などの+5VDC互換トランシーバーが必要で、ボードの+5VDCのロジックレベルに適合します。Texas Instruments®のSN65HVD230は、人気があり広く利用されていますが、+3.3VDCで動作するので、Nano R4の+5VDCで使うにはレベルシフタが必要です。

Nano R4のCANを操作する際、正しく実装するためのキーポイントがいくつかあります。

  • 信号の反射を防ぐために、CANバスの両端を120Ωの抵抗で正しく終端してください。
  • CANは、デバイスアドレスではなく、一意の識別子を用いたメッセージベースの通信だということに注意してください。小さいID番号は優先度が高いので、重要なメッセージは小さいIDを利用するべきです。
  • CANプロトコルは自動エラー検出と再送信、衝突解決ができるので、安全性が重視されるアプリケーション向けに非常に高い信頼性を提供できます。
  • Nano R4は、標準(11ビット)と拡張(29ビット)のCAN識別子をサポートしているので、ほとんどの自動車や産業のCANネットワークと互換性があります。

HID(Human Interface Device)通信

Nano R4ボードでは、HID(Human Interface Device)通信を実行でき、プロジェクトはキーボードやマウスのような入力デバイスをエミュレートできます。HIDは、RA4M1マイクロコントローラー内で実装され、USB-C接続を利用して標準の入力デバイスとして、PCと直接通信します。PCを制御したりキーストロークやマウス移動を送信する必要のある、自動化プロジェクトや支援技術、ゲームコントローラー、対話型インストールに最適です。

HIDは、シリアル通信でデータを送るのではなく、PCソフトウェアと直接対話する必要のあるプロジェクトに特に有用です。シリアル通信では、データを解釈するのに必要な特別なソフトウェアがPCに必要ですが、HIDデバイスはすべてのOSで標準のキーボードやマウスとして自動的に認識されます。これにより、Nano R4はキーボードショートカットを起動したり、文字を打ち込んだり、マウスカーソルを移動したり、ボタンをクリックすることができるので、プレゼンテーション制御やアクセシビリティデバイス、自動化システムに最適です。

Nano R4のHDIインターフェイスの、技術仕様を以下に示します。

パラメーター 説明
デバイスタイプ キーボード、マウス 標準HIDクラス
接続 USB-C ネイティブUSB接続
互換性 クロスプラットフォーム Windows、macOS、Linux
キー修飾 全標準 Ctrl、Alt、Shift、GUI/CMD
マウスボタン 3ボタン Left、Right、Middle
マウス移動 相対/デルタ スムーズカーソル移動
スクロールホイール 対応 垂直スクロールのみ
複数デバイス 対応 キーボード・マウス同時

Nano R4は、USB-CコネクターをHID通信に利用します。

接続 機能 説明
USB-C HID キーボード・マウスエミュレーション
i
重要な注意: HID機能が有効になっているとき、PCは、Nano R4ボードを入力デバイスと認識します。通常のPC操作を妨害する可能性のあるような、意図しないキーストロークやマウスの動きを送信しないように注意してください。

専用のKeybloard.hライブラリとMouse.hライブラリを使うことで、HID通信ができます。これらのライブラリは、Arduno Uno R4ボードのコアに含まれます。これらのライブラリは、キーストロークやキーの組み合わせ、マウスの移動、クリックを送信する基本関数を提供します。

以下の例は、基本的なキーボードエミュレーション機能を示します。

 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
/**
HID Keyboard Example for the Arduino Nano R4 Board
Name: nano_r4_hid_keyboard.ino
Purpose: This sketch demonstrates how to use the Nano R4 as a 
USB keyboard to send keystrokes and key combinations.

@author Arduino Product Experience Team
@version 1.0 01/06/25
*/

#include "Keyboard.h"

void setup() {
  // Initialize serial communication and wait up to 2.5 seconds for a connection
  Serial.begin(115200);
  for (auto startNow = millis() + 2500; !Serial && millis() < startNow; delay(500));
  
  Serial.println("- Arduino Nano R4 - HID Keyboard Example started...");
  Serial.println("- WARNING: This will send actual keystrokes to your computer!");
  
  // Wait 5 seconds before starting HID to give user time to read warning
  Serial.println("- Starting in 5 seconds...");
  for (int i = 5; i > 0; i--) {
    Serial.print(i);
    Serial.println(" seconds remaining");
    delay(1000);
  }
  
  // Initialize keyboard functionality
  Keyboard.begin();
  Serial.println("- Keyboard HID initialized. Starting demonstration...");
  
  delay(1000);
  
  // Demonstrate basic text typing
  Serial.println("- Typing basic text...");
  Keyboard.print("Hello from Nano R4! ");
  delay(1000);
  
  // Demonstrate special keys
  Serial.println("- Pressing Enter key...");
  Keyboard.press(KEY_RETURN);
  delay(100);
  Keyboard.releaseAll();
  delay(1000);
  
  // Demonstrate keyboard shortcuts
  Serial.println("- Sending Ctrl+A (Select All)...");
  Keyboard.press(KEY_LEFT_CTRL);
  Keyboard.press('a');
  delay(100);
  Keyboard.releaseAll();
  delay(1000);
  
  Serial.println("- Keyboard demonstration completed!");
}

void loop() {
  // Send a timestamp every 10 seconds
  static unsigned long lastMessage = 0;
  if (millis() - lastMessage > 10000) {
    lastMessage = millis();
    
    Serial.println("- Sending periodic message...");
    
    // Send message with only letters, numbers and spaces
    Keyboard.print("Nano R4 ");
    Keyboard.print(millis() / 1000);
    Keyboard.print(" seconds");
    Keyboard.press(KEY_RETURN);
    delay(50);
    Keyboard.releaseAll();
  }
  
  delay(100);
}
i
この例を試験するには、外部機器は不要です。HID機能を有効化する前に5秒待ちます。その後、各種キーボード機能を自動実行します。

Arduino IDEのシリアルモニタ(ツール > シリアルモニタ)を開くと、状態を示すメッセージが表示されます。

5秒後、Nano R4ボードは、PCでフォーカスされているアプリケーションにテキストを直接打ち込みます。

以下の例は、基本的なマウスエミュレーション機能を示します。

 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
/**
HID Mouse Example for the Arduino Nano R4 Board
Name: nano_r4_hid_mouse.ino
Purpose: This sketch demonstrates how to use the Nano R4 as a 
USB mouse to control cursor movement and clicking.

@author Arduino Product Experience Team
@version 1.0 01/06/25
*/

#include "Mouse.h"

void setup() {
  // Initialize serial communication and wait up to 2.5 seconds for a connection
  Serial.begin(115200);
  for (auto startNow = millis() + 2500; !Serial && millis() < startNow; delay(500));
  
  Serial.println("- Arduino Nano R4 - HID Mouse Example started...");
  Serial.println("- WARNING: This will control your actual mouse cursor!");
  
  // Wait 5 seconds before starting HID
  Serial.println("- Starting in 5 seconds...");
  for (int i = 5; i > 0; i--) {
    Serial.print(i);
    Serial.println(" seconds remaining");
    delay(1000);
  }
  
  // Initialize mouse functionality
  Mouse.begin();
  Serial.println("- Mouse HID initialized. Starting demonstration...");
  
  delay(1000);
  
  // Demonstrate basic mouse movement
  Serial.println("- Moving mouse in a square pattern...");
  Mouse.move(100, 0);    // Move right
  delay(500);
  Mouse.move(0, 100);    // Move down
  delay(500);
  Mouse.move(-100, 0);   // Move left
  delay(500);
  Mouse.move(0, -100);   // Move up
  delay(500);
  
  // Demonstrate mouse clicks
  Serial.println("- Performing mouse clicks...");
  Mouse.click(MOUSE_LEFT);
  delay(500);
  Mouse.click(MOUSE_RIGHT);
  delay(500);
  
  // Demonstrate scrolling
  Serial.println("- Demonstrating scroll wheel...");
  Mouse.move(0, 0, 3);   // Scroll up
  delay(500);
  Mouse.move(0, 0, -3);  // Scroll down
  delay(500);
  
  Serial.println("- Mouse demonstration completed!");
}

void loop() {
  // Create a gentle circular mouse movement every 15 seconds
  static unsigned long lastMovement = 0;
  if (millis() - lastMovement > 15000) {
    lastMovement = millis();
    
    Serial.println("- Creating circular mouse movement...");
    for (int angle = 0; angle < 360; angle += 30) {
      int x = (int)(10 * cos(angle * PI / 180));
      int y = (int)(10 * sin(angle * PI / 180));
      Mouse.move(x, y);
      delay(100);
    }
  }
  
  delay(100);
}
i
この例を試験するには、外部機器は不要です。マウスの移動とクリック機能を自動実行します。

Arduino IDEのシリアルモニタ(ツール > シリアルモニタ)を開くと、状態を示すメッセージが表示されます。

マウスカーソルが移動し、クリックします。

Nano R4のHIDを操作する際、正しく実装するためのキーポイントがいくつかあります。

  • Nano R4ボードのHID機能は、PCから見ると本物のキーボードやマウスに見えます。常にコードには安全策と遅延を含め、通常のPC操作を妨害する可能性のあるような操作を防いでください。
  • HID機能を有効化する前に、常に遅延や警告の時間を含め、時間の猶予を与えたり、必要に応じてプログラムを停止する時間を入れてください。
  • HIDデバイスは特別なドライバー不要で近年のOSにより自動認識され、プロジェクトが即座にWindows、macOS、Linuxと互換性を持つことになることを覚えておいてください。
  • HIDプロジェクトのデバッグには、コードが何をしているかを見るために、Serial.println()文を使ってください。HID機能がPCを操作し始めると、Arduino IDEのシリアルモニタに依存することができなくなります。
  • Nano R4は、キーボードとマウスを同時に実行することができるので、タイピングやショートカット、マウス制御を組み合わせた複雑な自動化手順を実行できます。
  • OSが異なると、キーボードレイアウトやショートカットが少し異なることに注意してください。互換性を保証するには、ターゲットとなるプラットフォームでHIDプロジェクトを試験してください。

外部割り込み

Nano R4は、RA4M1マイクロコントローラーのICU(割り込み制御ユニット)を通じて、外部割り込みを扱う機能を備えています。割り込みにより、Nano R4ボードは、メインプログラムを一時的に停止して、割り込みサービスルーチン(ISR)を実行し、元の場所に戻ることで、ピンの状態にすぐに反応することができます。割り込みは、ボタン検出やエンコーダ読み取り、センサー監視など、時間制約のあるアプリケーションにとって不可欠です。

割り込み仕様

Nano R4ボードの外部割り込み機能は、以下の技術仕様を提供します。

パラメータ 説明
ハードウェアチャネル 9 チャネル0-7、9が利用可能
割り込み可能なピン 13ピン 7本のデジタルピンと6本のアナログピン
トリガーモデル 4 RISINGFALLINGCHANGELOW
反応時間 < 1μ秒 典型的な割り込み遅延

割り込み可能なピン

Nano R4ボードの以下のピンが外部割り込みをサポートしています。

Arduinoピン 割り込みチャネル 主機能 説明
D0 チャネル6 デジタルI/O A1とチャネルを共有
D1 チャネル5 デジタルI/O 専用チャネル
D2 チャネル0 デジタルI/O 割り込みに推奨
D3 チャネル1 デジタルI/O、PWM A4とチャネルを共有
D8 チャネル9 デジタルI/O 専用チャネル
D12 チャネル3 デジタルI/O、MISO A6とチャネルを共有
D13 チャネル4 デジタルI/O、SCK 専用チャネル
A1 チャネル6 アナログ、OPAMP+ D0とチャネルを共有
A2 チャネル7 アナログ、OPAMP- 専用チャネル
A3 チャネル2 アナログ、OPAMP OUT A5とチャネルを共有
A4 チャネル1 アナログ、I2C SDA D3とチャネルを共有
A5 チャネル2 アナログ、I2C SCL A3とチャネルを共有
A6 チャネル3 アナログ入力 D12とチャネルを共有
i
重要: 割り込みチャネルを共有しているピンは、同時には割り込みに利用できません。例えば、D3A4は双方チャネル1を使うので、同時にはどちらか一方だけが割り込み機能の設定ができます。

割り込みトリガーモード

Nanoボードは、4つの割り込みトリガーモードをサポートします。

モード トリガー条件 典型的なユースケース
RISING ピンがLOWからHIGHに遷移する ボタン押下検知(プルダウン)
FALLING ピンがHIGHからLOWに遷移する ボタン押下検知(プルアップ)
CHANGE ピンの状態変化(双方向) エンコーダのパルスカウント読み込み
LOW ピンがLOWレベルを継続 レベルトリガーイベント
i
重要: HIGHトリガーモードはハードウェアによてサポートされていません。指定した場合は、RISINGモード(LOWからHIGHへの遷移で、継続するHIGH状態ではありません)として振る舞います。継続したHIGHレベルを検出するには、digitalRead()でポーリングしてください。

専用のArduino関数で、割り込みを設定することができます。

1
2
attachInterrupt(digitalPinToInterrupt(pin), ISR_function, mode);
detachInterrupt(digitalPinToInterrupt(pin));

以下の例は基本的な割り込みの使用方法を示します。

 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
/**
External Interrupt Example for the Arduino Nano R4 Board
Name: nano_r4_interrupt_example.ino
Purpose: This sketch demonstrates how to use external interrupts
to detect button presses.

@author Arduino Product Experience Team
@version 1.0 01/06/25
*/

const int buttonPin = 2;
const int ledPin = LED_BUILTIN;

// Variables shared with ISR must be volatile
volatile bool buttonPressed = false;
volatile unsigned long pressCount = 0;

// Interrupt Service Routine - keep it short!
void buttonISR() {
  buttonPressed = true;
  pressCount++;
}

void setup() {
  // Initialize serial communication and wait up to 2.5 seconds for a connection
  Serial.begin(115200);
  for (auto startNow = millis() + 2500; !Serial && millis() < startNow; delay(500));
  
  pinMode(buttonPin, INPUT_PULLUP);
  pinMode(ledPin, OUTPUT);
  
  // Attach interrupt to button pin
  attachInterrupt(digitalPinToInterrupt(buttonPin), buttonISR, FALLING);
  
  Serial.println("- Arduino Nano R4 - External Interrupt Example started...");
  Serial.println("- Press the button to trigger interrupts");
}

void loop() {
  if (buttonPressed) {
    buttonPressed = false;
    digitalWrite(ledPin, !digitalRead(ledPin));
    
    Serial.print("- Button pressed! Count: ");
    Serial.println(pressCount);
  }
  
  delay(10);
}

この例を試すには、Nano R4ボードに押しボタンを以下のように接続します。

Arduino IDEのシリアルモニタ(ツール > シリアルモニタ)を開くと、ボタンを押すたびに割り込み数が増加します。

Nano R4ボードで割り込みを扱うときに、実装を成功させるためのいくつかのキーポイントがあります。

  • ISR関数は短く速く: ISR関数内ではdelay()Serial.print()、複雑な計算は避けてください。これらは、他の割り込みをブロックします。
  • volatile変数を使う: コンパイラによる最適化問題を避けるために、ISRとメインコードで共有する変数は、volatileと宣言してください。
  • チャネルの競合を管理する: 複数の割り込みを使うときは、ピンが同じ割込みチャネルを共有していないか確認してください。
  • チャタリングを考慮する: 機械式のスイッチは複数のトリガーを引き起こすことがあります(100nFのコンデンサを追加するか、ソフトウェアでチャタリング処理を実装してください)。
  • 複数バイトの共有変数の整合性を保つ: これらにアクセスするときは、一時的に割り込みを禁止してください。

Qwiicコネクター

Nano R4ボードは、オンボードのQwiicコネクターを備えています。これは、I2Cデバイスを接続するための、簡単でツール非依存のソリューションです。SparkFun Electronicsにより開発されたQwiicエコシステムは、I2Cデバイスによる陣俗なプロトタイピング向けの業界標準になっています。これにより、はんだ付けや複雑な配線を行わずに、センサーやディスプレイ、他の周辺機器を接続することができます。そのため、センサーネットワークの構築やディスプレイの追加、最小限の手間でのプロジェクト機能の拡張などに適しています。

Qwiicコネクターは、3.3VDCのI2Cモジュールの大規模なエコシステム用の専用インターフェイスを提供することで、Nano R4の多用途性を拡張します。Nano R4は標準で+5VDC動作に対応しているので、従来のArduinoシールドやコンポーネントとの互換性を確保しています。Qwiicインターフェースにより、最新のセンサーやモジュールをシームレスに統合できます。このボードには、+5VDCで動作するマイクロコントローラと+3.3VDCのQwiicバス間のレベル変換回路が内蔵されています。これにより、メインピンでは従来のArduinoハードウェアとの完全な互換性を維持しながら、最新のQwiic対応デバイスにもすぐにアクセスできるという、両方のメリットを得られます。

Qwiic仕様

Nano R4ボードのQwiicコネクターの仕様を以下に示します。

パラメータ 説明
コネクタータイプ JST SH 4ピン 1mm 業界標準Qwiic
動作電圧 +3.3VDC オンボードレギュレータから給電
I2Cインターフェイス Wire1 セカンダリI2Cバス(Wireではない)
レベルシフト 内蔵 +5VDCと+3.3VDC間の自動レベル変換
ピン順序 GNDVCCSDASCL 標準Qwiicピンアウト

Qwiicコネクターは、1.00mmピッチの小さい4ピンのコネクタです。コネクターの機械的な詳細は、コネクターのデータシートを参照してください。

Qwiicコネクターのピンレイアウトは以下の通りです。

  • GND: 接地
  • VCC: +3.3VDC電源
  • SDA: I2Cデータ線
  • SCL: I2Cクロック線

VCCピンは、ボードの電源が供給されているときに、オンボードレギュレータから安定した+3.3VDCを供給します。Qwiicコネクタのメーカー品番はSM04B-SRSS-TBで、これに対応するケーブルアセンブリにはSHR-04V-S-Bレセプタクルが使用されています。

デュアルI2Cアーキテクチャを理解する

Nano R4は、デュアルI2Cバスアーキテクチャを実装していて、+5VDCと+3.3VDCデバイスを分離しています。

I2Cバス Arduinoオブジェクト 物理接続 電圧 レベルシフター ユースケース
プライマリ Wire A4/A5ピン +5VDC なし +5Vセンサー、Arduinoシールド
セカンダリ Wire1 Qwiicコネクター +3.3VDC 内蔵 最新のセンサー、Qwiicデバイス
i
重要: Qwiicコネクターは、Wire1オブジェクトを使います。Wireオブジェクトではありません。これはシングルI2Cバスのボードとは異なります。Qwiicデバイスと通信するときは、常に、Wire1.begin()と関連するWire1関数を使ってください。

Qwiicデバイスを接続する

QwiicデバイスとNano R4ボードの接続は簡単です。標準的なQwiicケーブル(様々な長さのものがあります)を入手し、片方の端をNano R4のQwiicコネクターに、もう一方の端をQwiicデバイスに差し込んでください。多くのQwiicデバイスには2つのコネクターがあります。これにより、はんだ付けやブレッドボードの配線を行わずに、複数のデバイスをデイジーチェーンすることができます。極性付きコネクターなので、誤接続を防止でき、設定を簡単に間違いなく行うことができます。

Qwiicシステムの主な利点は以下の通りです。

  • プラグアンドプレイ接続: ブレッドボードやジャンプワイヤー、はんだ付け不要
  • 極性付き接続: 誤りによる誤接続を防止
  • デイジーチェーン可能: 複数デバイスの直列接続
  • 内蔵プルアップ抵抗: 外部抵抗不要
  • 標準ピンアウト: すべてのQwiicエコシステムのデバイスの互換性

Qwiicデバイスの利用

以下の例はArduino Modulino MovementセンサーのQwiic経由での使用方法を示します。

 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
/**
Modulino Movement Example for the Arduino Nano R4 Board
Name: nano_r4_modulino_movement.ino
Purpose: This sketch demonstrates reading motion data from the 
Modulino Movement sensor via the Qwiic connector.

@author Arduino Product Experience Team
@version 1.0 01/06/25
*/

#include <Modulino.h>
#include <Wire.h>

// Create Modulino Movement object
ModulinoMovement movement;

// Variables for sensor data
float x, y, z;
float roll, pitch, yaw;

void setup() {
  // Initialize serial communication and wait up to 2.5 seconds for a connection
  Serial.begin(115200);
  for (auto startNow = millis() + 2500; !Serial && millis() < startNow; delay(500));
  
  Serial.println("- Arduino Nano R4 - Modulino Movement Example started...");
  
  // Initialize Wire1 for Qwiic connector
  Wire1.begin();
  
  // Initialize Modulino system
  Modulino.begin();
  
  // Initialize Movement sensor
  movement.begin();
  
  Serial.println("- Modulino Movement connected successfully!");
  Serial.println("- Reading motion data...\n");
}

void loop() {
  // Read new movement data from the sensor
  movement.update();
  
  // Get acceleration values
  x = movement.getX();
  y = movement.getY();
  z = movement.getZ();
  
  // Get gyroscope values
  roll = movement.getRoll();
  pitch = movement.getPitch();
  yaw = movement.getYaw();
  
  // Display acceleration
  Serial.print("- Accel (g): X=");
  Serial.print(x, 2);
  Serial.print(" Y=");
  Serial.print(y, 2);
  Serial.print(" Z=");
  Serial.print(z, 2);
  
  // Display gyroscope
  Serial.print(" | Gyro (dps): Roll=");
  Serial.print(roll, 1);
  Serial.print(" Pitch=");
  Serial.print(pitch, 1);
  Serial.print(" Yaw=");
  Serial.print(yaw, 1);
  
  Serial.println();
  
  // Update at 10Hz
  delay(100);
}
i
この例を試すには、Arduino Modulino MovementをQwiicケーブルでNano R4のQwiicコネクターに接続する必要があります。Arduino IDEのライブラリマネージャ(ツール > ライブラリを管理 > 検索 “Modulino”)から、Modulinoライブラリをインストールしてください。

Arduino IDEのシリアルモニタ(ツール > シリアルモニタ)を開き、リアルタイムで、加速度とジャイロスコープのデータを見ることができます。センサーを動かしたり回転させたりして、値が変わるのを確認してください。

この例では、Nano R4とQwiicデバイスの使い方についての要点を示します。

  • Qwiicコネクター用に、Wire.begin()ではなく、Wire1.begin()を使います。
  • 追加の配線なしで、直接プラグランドプレイで接続します。
  • +3.3VDCの自動給電とレベル変換
  • ModulinoセンサーのArduinoエコシステムの利用

ブートローダー

Nano R4ボードには、外部のプログラミング用ハードウェアを必要とせず、Arduino IDEから直接スケッチを書き込める内蔵ブートローダが搭載されています。ブートローダーは、RA4M1マイクロコントローラのフラッシュメモリ内にある保護領域に保存された小さなプログラムで、ボードの電源投入時またはリセット時に毎回実行されます。スケッチの書き込み時には、PCとボード間の重要な通信を制御し、開発作業を簡単で手軽に行えるようにします。

通常動作時、Nano R4をPCに接続してスケッチをアップロードすると、ブートローダーがUSB経由で新しいプログラムデータを受信し、適切なメモリ領域へ書き込みます。この処理は自動的かつ透過的に行われるので、低レベルのプログラミングの詳細を意識することなく、プロジェクトの開発そのものに集中できます。

ブートローダー操作を理解する

Nano R4ボードをリセットや電源投入時に、ブートローダーは以下の処理を行います。

  1. 初期化: ブートローダーはUSB通信を初期化し、入力プログラミングコマンドを確認します。
  2. 待機期間: Arduino IDEからの新しいスケッチをしばらく待ちます。
  3. プログラム実行: 新しいスケッチを受信しなければ、以前アップロードしたプログラムを実行します。

この自動処理により、ボードを常に新しいスケッチを受信できる状態に保ちながら、アプリケーションの高速な起動時間も維持されます。

ブートローダーの復旧

特定の状況では、ブートローダーが壊れたり、正常に動作しなくなったりする場合があります。ブートローダーに問題が発生した場合の一般的な症状には、以下のようなものがあります。

  • ボードがArduino IDEに認識されません。
  • アップロードがタイムアウトエラーにより失敗します。
  • PCのデバイスマネージャーで、ボードが不明のデバイスとして現れます。
  • 接続試行時にオンボードのLEDが異常を示します。

Nano R4には、BOOTピンという、ブートローダーを復旧するための特別なハードウェア機能があります。電源投入時にこのピンが接地(GND)に接続されると、ボードを特別なプログラミングモードになり、Renesas Flash Programmerツールを使い、ブートローダーを復旧します。

i
重要: BOOTピンはボードの底面横にあり、明確に示されています。このピンはブートローダーの復旧や高度なプログラミング操作にだけ利用してください。通常使用時は、このピンには何も接続しないでください。

技術仕様

Nano R4のブートローダーの技術仕様を以下に示します。

パラメーター 説明
復旧方法 BOOTピン + GND ハードウェアリカバリモードを有効化
ブートローダーファイル dfu_nano.hex Arduino UNO R4ボードコアに含まれる
プログラミングツール Renesas Flash Programmer ブートローダー復旧用の公式ツール

ブートローダーファイルの格納場所

ブートローダーファイル(`dfu_nano.hex)は以下の2か所から入手できます。

オプション1: 直接ダウンロード(推奨)

Arduino GitHubリポジトリから直接ダウンロードします。

オプション2: Arduino IDEインストールから

ブートローダーファイル(`dfu_nano.hex)は、Arduino UNO R4ボードコア内に自動インストールされています。以下の場所にあります。

Windows:

1
C:\Users\[YourUsername]\AppData\Local\Arduino15\packages\arduino\hardware\renesas_uno\[version]\bootloaders\NANOR4\

macOS:

1
~/Library/Arduino15/packages/arduino/hardware/renesas_uno/[version]/bootloaders/NANOR4/

Linux:

1
~/.arduino15/packages/arduino/hardware/renesas_uno/[version]/bootloaders/NANOR4/

i
[YourUsername]を実際のユーザー名に、[version]をインストールしたコアのバージョン番号に、それぞれ置き換えてください。

いつブートローダーの復旧を検討するか

ブートローダーの復旧を検討するのは、

  • 標準トラブルシューティングステップ(ケーブル交換、USBポート変更、ドライバーインストール)に失敗
  • 以前はボードが正常動作していたが、アップロード失敗後認識に失敗
  • スケッチアップロード時に電源断
  • 工場出荷時のプログラミング状態に復旧する必要がある
  • リセットボタンにボードが正常に反応しない

ブートローダー復旧のチュートリアル

Nano R4ボードのブートローダーの復旧および再書き込みの詳細な手順については、 を参照してください。このチュートリアルでは、以下の項目について説明しています。

  • ブートローダー書き込みための準備
  • Renesas Flash Programmerツールのインストールと設定
  • 書き込みプロセスの手順
  • ブートローダー復旧の確認
  • 一般的な問題のトラブルシューティング
i
重要: ブートローダの復旧は、必要な時にだけ行います。安定した電源供給を確認し、チュートリアルの指示に注意して従ってください。このプロセスには、Renesas Flash Programmerツールとブートローダーファイルだけが必要です。

ブートローダーの健全性を維持する

ブートローダーの破損リスクを最小限にし、信頼性のある操作を保証するには、以下を推奨します。

  • 常にアップロードの完了させる: スケッチアップロード中は、USBケーブルを抜いたり、電源を落とさないでください
  • 高品質のUSBケーブルを使う: 低品質や破損したケーブルは通信エラーを起こすことがあります
  • 安定した電源を供給する: スケッチアップロード時は、信頼性のある電源を使ってください
  • Arduino IDEを最新に保つ: 新しいバージョンではアップロードプロセスが改善していることがあります
  • ボードは注意して扱う: ボードへの静電気放電や物理的な破損を避ける

ブートローダーは、Nano R4ボードを使いやすく、利用しやすいものにするための重要な要素です。堅牢性と信頼性を考慮して設計されていますが、その動作や復旧方法を理解しておくことで、問題が発生した場合でも、常にボードを正常な動作状態へ復旧できるようになります。

サポート

Nano R4ボードを操作していて、問題が発生したり、質問がある場合は、回答や解決策を見つけるための様々なサポート手段を用意しています。

ヘルプセンター

Nanoファミリーボード用の記事やガイドを総合的に集めたヘルプセンターを見てください。ヘルプセンターは詳細な技術サポートを提供し、デバイスを最大限に活用できる手伝いができるようになっています。

フォーラム

他のNanoファミリーボードユーザーとつながったり、経験を共有したり、質問するために、コミュニティフォーラムに参加してください。フォーラムは、他者から学んだり、議論したり、Nano R4に関する新しいアイデアやプロジェクトを見つけたりすることができる、すばらしい場所です。

問い合わせ

個人的な支援や、前述のヘルプセンターやフォーラムで取り上げられていない質問がある場合は、サポートチームに連絡してください。Nanoファミリーボードに関するどんな問題や質問にも対応します。

オリジナルのページ

https://docs.arduino.cc/tutorials/nano-r4/user-manual/

最終更新日

July 26, 2026

inserted by FC2 system