デバイス・ボード

Arduino

初心者向けの定番マイコンボード。開発環境も含む。

概要

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・モータードライバー・ディスプレイなど様々な機能を追加できます。現在ではESP32Raspberry 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クロックFlashRAMGPIO
Arduino Uno R3ATmega328P16MHz32KB2KB14本
Arduino Uno R4 MinimaRenesas RA4M148MHz256KB32KB14本
Arduino Uno R4 WiFiRenesas RA4M1 + ESP32-S348MHz + 240MHz256KB + 384KB32KB + 512KB14本
Arduino NanoATmega328P16MHz32KB2KB22本
Arduino Mega 2560ATmega256016MHz256KB8KB54本
Arduino DueAT91SAM3X8E84MHz512KB96KB54本
Arduino MKR ZeroSAMD21 (Cortex-M0+)48MHz256KB32KB22本

Arduino Uno R3(ATmega328P)の詳細仕様

項目
CPUAVR 8ビット RISC(ATmega328P)
クロック16MHz(外部水晶発振器)
Flash32KB(ブートローダー0.5KB使用)
SRAM2KB
EEPROM1KB
デジタルI/O14本(うちPWM 6本:3、5、6、9、10、11番ピン)
アナログ入力6本(A0〜A5、10bit ADC)
UART1本(0番・1番ピン)
SPI1本(10・11・12・13番ピン)
I2C1本(A4・A5ピン)
USBATmega16U2による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 ShieldDCモーター・ステッピングモーター制御
SD ShieldmicroSDカード
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 UnoRaspberry Pi 5
OSなし(ベアメタル)Linux
CPUAVR 16MHzARM 2.4GHz
RAM2KB4〜8GB
リアルタイム性高い(マイクロ秒精度)低い(Linuxミリ秒程度)
消費電力〜50mA3〜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が選ばれることもあります。

関連用語

参考リンク