概要
Arduinoは、Massimo Banziらが2005年にイタリアのIvrea Interaction Design Instituteで開発したオープンソースの電子プロトタイピングプラットフォームです。ハードウェア(マイコンボード)とソフトウェア(IDE・ライブラリ)を組み合わせた統合エコシステムとして、初心者から専門家まで幅広い層に利用されています。
代表的なArduino UnoはATmega328P(AVR 8ビットマイコン、16MHz)を搭載し、デジタルI/O 14本・アナログ入力6本・UART/SPI/I2C・PWM出力を持ちます。USB接続でArduino IDE(Wiring言語:C/C++ベース)からスケッチ(プログラム)を書き込んで動かします。
「シールド(Shield)」と呼ばれる拡張ボードを重ねることで、イーサネット・Wi-Fi・モータードライバー・ディスプレイなど様々な機能を追加できます。現在ではESP32・Raspberry Pi Pico・STM32など多くのマイコンがArduino IDEとArduino APIをサポートしており、Arduinoは「ハードウェア製品」だけでなく「開発エコシステム」としての意味合いも大きくなっています。
歴史・背景
2005年、Massimo BanziはCasey ReasらのProcessing言語(アーティスト向けプログラミング)に触発され、エレクトロニクスの素養がない学生でも使えるハードウェアを作ることを目指しました。
初代Arduino(2005年)はAtmelのATmega168を搭載した青いボードで、Wiring言語のコンパイラとシリアル書き込みツールで開発しました。2005年のMake: Magazineで紹介され爆発的に普及。2010年には累計100万台を出荷。
2011年にはArduino UnoがATmega328Pに移行し、ATmega16U2によるUSBシリアル変換を採用。2016年にはArduino Mega 2560・Nano・Micro・Leonardoなどバリエーションが確立しました。
2019年にはArduino MKR Zero(ARM Cortex-M0+)・Arduino Uno WiFi Rev2(ATmega4809 + Wi-Fi)など近代的なモデルへ移行。2022年にはArduino UNO R4(Renesas RA4M1、ARM Cortex-M4)を発売し、処理能力を大幅に向上させました。
技術仕様
代表製品の比較
| 製品 | MCU | クロック | Flash | RAM | GPIO |
|---|---|---|---|---|---|
| Arduino Uno R3 | ATmega328P | 16MHz | 32KB | 2KB | 14本 |
| Arduino Uno R4 Minima | Renesas RA4M1 | 48MHz | 256KB | 32KB | 14本 |
| Arduino Uno R4 WiFi | Renesas RA4M1 + ESP32-S3 | 48MHz + 240MHz | 256KB + 384KB | 32KB + 512KB | 14本 |
| Arduino Nano | ATmega328P | 16MHz | 32KB | 2KB | 22本 |
| Arduino Mega 2560 | ATmega2560 | 16MHz | 256KB | 8KB | 54本 |
| Arduino Due | AT91SAM3X8E | 84MHz | 512KB | 96KB | 54本 |
| Arduino MKR Zero | SAMD21 (Cortex-M0+) | 48MHz | 256KB | 32KB | 22本 |
Arduino Uno R3(ATmega328P)の詳細仕様
| 項目 | 値 |
|---|---|
| CPU | AVR 8ビット RISC(ATmega328P) |
| クロック | 16MHz(外部水晶発振器) |
| Flash | 32KB(ブートローダー0.5KB使用) |
| SRAM | 2KB |
| EEPROM | 1KB |
| デジタルI/O | 14本(うちPWM 6本:3、5、6、9、10、11番ピン) |
| アナログ入力 | 6本(A0〜A5、10bit ADC) |
| UART | 1本(0番・1番ピン) |
| SPI | 1本(10・11・12・13番ピン) |
| I2C | 1本(A4・A5ピン) |
| USB | ATmega16U2によるUSB-シリアル変換 |
| 動作電圧 | 5V(I/O電圧5V) |
| 入力電圧 | 7〜12V(Vinピン経由) |
| GPIO最大電流 | 40mA(各ピン) |
| 3.3V出力 | 50mA(オンボードレギュレータ) |
| 消費電流 | 〜50mA(通常動作) |
| サイズ | 68.6mm × 53.4mm |
動作原理
ArduinoのプログラムはC/C++ベースの「Wiring言語」で記述します:
// 基本スケッチ構造
void setup() {
// 起動時に1回だけ実行される初期化処理
pinMode(LED_BUILTIN, OUTPUT); // LED_BUILTINを出力に設定
Serial.begin(9600); // シリアル通信を9600bpsで初期化
}
void loop() {
// 繰り返し実行されるメインループ
digitalWrite(LED_BUILTIN, HIGH); // LEDをON
delay(1000); // 1秒待機
digitalWrite(LED_BUILTIN, LOW); // LEDをOFF
delay(1000); // 1秒待機
}
// アナログセンサー読み取りとシリアル出力の例
void setup() {
Serial.begin(115200);
}
void loop() {
int sensorValue = analogRead(A0); // 0〜1023の値を読み取り
float voltage = sensorValue * (5.0 / 1023.0); // 電圧換算
Serial.print("Sensor: ");
Serial.print(sensorValue);
Serial.print(" Voltage: ");
Serial.println(voltage);
delay(500);
}
// I2C通信の例(Wire ライブラリ)
#include <Wire.h>
const int MPU_ADDR = 0x68; // MPU-6050 IMUセンサーのI2Cアドレス
void setup() {
Wire.begin(); // I2Cマスターとして初期化
Wire.beginTransmission(MPU_ADDR);
Wire.write(0x6B); // パワーマネジメントレジスタ
Wire.write(0); // スリープモードを解除
Wire.endTransmission(true);
Serial.begin(115200);
}
void loop() {
Wire.beginTransmission(MPU_ADDR);
Wire.write(0x3B); // 加速度Xの高位バイトアドレス
Wire.endTransmission(false);
Wire.requestFrom(MPU_ADDR, 6, true); // 6バイト要求
int16_t AcX = (Wire.read() << 8) | Wire.read();
int16_t AcY = (Wire.read() << 8) | Wire.read();
int16_t AcZ = (Wire.read() << 8) | Wire.read();
Serial.print("AcX="); Serial.print(AcX);
Serial.print(", AcY="); Serial.print(AcY);
Serial.print(", AcZ="); Serial.println(AcZ);
delay(100);
}
ビルドとフラッシュ書き込みの仕組み
1. スケッチ(.ino)をC++にコンパイル(avr-g++ または arm-gcc)
2. avr-objcopy または objcopy でHEXファイルに変換
3. avrdude または bossac でUSB-シリアル経由でフラッシュ書き込み
4. ボードがリセットされて新しいスケッチが起動
用途・ユースケース
Arduinoが選ばれる主な用途:
- 電子工作・ホビー: LED・センサー・モーターを使ったDIYプロジェクト
- STEM教育: 中高校・大学のプログラミング・電子工学教育
- プロトタイピング: 製品アイデアの最速検証
- アート・インスタレーション: Processing・MAX/MSPと連携したインタラクティブアート
- ロボティクス: 小型ロボットのモーター・センサー制御
- 自動化: 温室の温度管理・自動水やりシステム
- 計測・データロギング: センサーデータのSDカード記録
実装・開発のポイント
シールド(Shield)エコシステム
Arduinoの最大の強みがシールドによる拡張性です:
| シールド名 | 機能 |
|---|---|
| Ethernet Shield | 有線LAN(W5500) |
| Wi-Fi Shield / Uno R4 WiFi | 無線LAN |
| Motor Shield | DCモーター・ステッピングモーター制御 |
| SD Shield | microSDカード |
| LCD Shield | キャラクタLCDディスプレイ |
| Relay Shield | リレースイッチ(AC機器制御) |
| GSM Shield | 携帯電話網通信 |
よくある問題と対処法
メモリ不足(ATmega328P: SRAM 2KB):
// 文字列リテラルをFlashに保存してRAMを節約
Serial.println(F("Hello from Flash!")); // F()マクロ
// PROGMEM: 定数配列をFlashに配置
#include <avr/pgmspace.h>
const char msg[] PROGMEM = "Flash string";
遅延関数の問題:
// delay()はCPUを止めるため他の処理が止まる
// millis()を使った非ブロッキング処理
unsigned long previousMillis = 0;
const long interval = 1000;
void loop() {
unsigned long currentMillis = millis();
if (currentMillis - previousMillis >= interval) {
previousMillis = currentMillis;
// 1秒ごとの処理
}
// 他の処理は止まらない
}
他技術との比較
Arduino vs Raspberry Pi
| 項目 | Arduino Uno | Raspberry Pi 5 |
|---|---|---|
| OS | なし(ベアメタル) | Linux |
| CPU | AVR 16MHz | ARM 2.4GHz |
| RAM | 2KB | 4〜8GB |
| リアルタイム性 | 高い(マイクロ秒精度) | 低い(Linuxミリ秒程度) |
| 消費電力 | 〜50mA | 3〜15W |
| 難易度 | 低い(初心者向け) | 中〜高 |
| 価格 | 3,000〜5,000円 | 7,000〜14,000円 |
Arduino vs ESP32
ESP32はArduino IDEで開発でき、Arduino APIも使えますが、Wi-Fi/Bluetooth内蔵・240MHzデュアルコア・豊富なペリフェラルでArduino Unoを大幅に上回ります。IoT用途ではESP32の方が適していますが、Arduinoのシールドとの互換性・豊富なライブラリ・低消費電力の5V動作という点でArduino Unoが選ばれることもあります。