Без кейворда
・ setup() 関数が終了した後、無限に呼び出され続ける関数。 ・メインループとして、プロセスを常に回し続けるイメージ。
3. Arduino IDEと開発環境
Arduinoの公式開発環境はArduino IDEです。以下のような特徴があります。
- コードのコンパイル、書き込み(アップロード)がワンクリックで可能
- シリアルモニタ機能で簡単にデバッグ
- スケッチ(プログラム)をフォルダ単位で管理
- 豊富なライブラリマネージャ
- Arduino IDEを起動
- ボードの種類とポートを設定
- コードを書く
- コンパイル
- 書き込み(アップロード)
- シリアルモニタやLEDなどを使って動作を確認
4. データ型と変数の使い方
主なデータ型一覧 データ型ビット数値の範囲(符号付き)メモ boolean 8 true (1) / false (0)1バイト消費 char 8-128 ~ 127 char は文字型にも使う unsigned char 80 ~ 255 int 16-32768 ~ 32767AVR系Arduinoの場合 unsigned int 160 ~ 65535 long 32-2,147,483,648 ~ 2,147,483,647 unsigned long 320 ~ 4,294,967,295 float 32IEEE 754準拠精度は高くない double 32IEEE 754準拠Unoなどでは float と同じ精度メモリ消費を抑えたい場合は、 int の代わりに byte や char を使うなど、プロジェクト規模にあわせて工夫が必要です。
変数宣言例 int sensorValue = 0; // アナログセンサの値を格納 boolean ledState = false; // LEDの点灯状態を管理 unsigned long counter = 0; // 大きなカウンタ値を扱いたいとき5. 基本的な関数( setup() と loop() )
void setup() < // 初期設定をここに書く Serial.begin(9600); // シリアル通信を9600bpsで開始 pinMode(LED_BUILTIN, OUTPUT); // ボード内蔵LEDを出力モードに設定 >void loop() < // メインループ digitalWrite(LED_BUILTIN, HIGH); // LED点灯 delay(1000); // 1秒待機 digitalWrite(LED_BUILTIN, LOW); // LED消灯 delay(1000); // 1秒待機 >delay() 関数: 指定したミリ秒だけプログラムを停止(待機)させる。 他の処理はその間止まるため、リアルタイム性が必要な場面では注意が必要。
6. ピン入出力:デジタルとアナログ
Arduinoではデジタルピンとアナログピンを使って様々な入出力を行います。
デジタルピンpinMode(pin, mode); で入出力モードを指定( INPUT , OUTPUT , INPUT_PULLUP )。 digitalWrite(pin, HIGH/LOW); で出力のHIGH/LOWを指定。 digitalRead(pin); で入力を読み取り(HIGHかLOW)。
デジタル出力例 pinMode(13, OUTPUT); // ピン13を出力に設定 digitalWrite(13, HIGH); // ピン13をHIGHに digitalWrite(13, LOW); // ピン13をLOWに アナログ入力(ADC)Arduino Unoの場合、A0~A5までのアナログ入力ピンが用意されている。 analogRead(pin); で0~1023の値を取得(10ビットADC)。 取得値を利用してセンサ値などを読み取る。
アナログ入力例 int sensorVal = analogRead(A0); // A0ピンの値を取得(0~1023) Serial.println(sensorVal); アナログ出力(PWM)Arduino UnoではD3, D5, D6, D9, D10, D11などのピンでPWMが可能。 analogWrite(pin, value); で0~255の範囲を指定して“疑似的な”アナログ出力(PWM)を行う。
PWM出力例 analogWrite(9, 128); // ピン9に対して約50%デューティ比のPWM出力7. 制御構文(if, for, while など)
if文 if (sensorVal > 500) < digitalWrite(LED_BUILTIN, HIGH); >else for文 for (int i = 0; i while文 int count = 0; while (count switch文 switch (mode) < case 0: // 処理 break; case 1: // 処理 break; default: // それ以外 break; >8. 関数の定義と使い方
setup() や loop() 以外にも、自由に関数を定義してコードを整理できます。
int addTwoNumbers(int a, int b) < return a + b; >void setup() < Serial.begin(9600); >void loop()・ 関数はプロトタイプ宣言(ヘッダ宣言)が無くても、Arduino IDEが自動的に対応してくれます。 ・ 大規模になるときは、 .ino ファイルを分割したり、ライブラリ化を検討するのも手です。
9. 配列・文字列・ポインタ
配列 int values[5] = ; void setup() < Serial.begin(9600); >void loop() < for (int i = 0; i < 5; i++) < Serial.println(values[i]); >delay(1000); > 文字列Arduinoでは、Cスタイルの文字列(ヌル終端)と、 String クラスの2種類が使えます。 ・ Cスタイル文字列: メモリ効率が高いが扱いはやや面倒 ・ String クラス: 直感的だが、ヒープ断片化(メモリフラグメンテーション)の原因になることがある
String クラスの例 String message = "Hello Arduino"; Serial.println(message); Cスタイルの例 char msg[] = "Hello Arduino"; Serial.println(msg); ポインタ10. 割り込み(Interrupts)の基本
外部割り込みの例 volatile boolean state = false; void setup() < pinMode(2, INPUT_PULLUP); attachInterrupt(digitalPinToInterrupt(2), toggleState, CHANGE); Serial.begin(9600); >void loop() < if (state) < Serial.println("Interrupt Triggered!"); state = false; >delay(100); > void toggleState()・ volatile 修飾子を使うことで、割り込みハンドラとメインループで変数を共有するときの最適化を防ぐ。 ・ 割り込みルーチン(ISR)内では処理を最小限に抑えるのが鉄則です。
11. ライブラリの利用方法
例:ライブラリのインストール方法- Arduino IDEを開く
- メニューから「スケッチ」→「ライブラリを管理」
- 検索窓で使いたいライブラリを検索し、インストール
- スケッチ上で #include と記述
12. シリアル通信(Serialモニタ)
Arduino IDEには、PCとArduino間のシリアル通信を簡単に確認できるシリアルモニタがあります。
シリアル通信の基本Serial.begin(9600); で通信速度(ボーレート)を設定 Serial.print() や Serial.println() で文字列・数値などを送信 Serial.available() で受信バッファにデータがあるかチェック Serial.read() で受信データを1バイト読み取り
例:PCから入力された文字をエコーバックする void setup() < Serial.begin(9600); >void loop() < if (Serial.available() >0) < char c = Serial.read(); Serial.print("You typed: "); Serial.println(c); >>13. メモリ管理とプログラム最適化の基礎
Arduino Unoの場合、 ・ フラッシュメモリ(プログラム領域):32KB ・ SRAM(変数や配列):2KB ・ EEPROM(不揮発性メモリ):1KB これらのリソースを超えると正常に動作しなくなるため、適切な最適化が必要です。
メモリ節約のヒント- 文字列を F() マクロでフラッシュメモリに置く
設定値などを保持したい場合は EEPROM ライブラリを使って書き込むことができます。ただし書き込み回数に上限があるため注意。
#include void setup() < EEPROM.write(0, 123); // アドレス0に123を書き込む >void loop()14. よく使うサンプルコード集
(1) ブリンク(Blink) void setup() < pinMode(LED_BUILTIN, OUTPUT); >void loop() (2) アナログセンサの読み取りと表示 void setup() < Serial.begin(9600); >void loop() (3) フェード(LEDの明るさ制御) void setup() < pinMode(9, OUTPUT); >void loop() < for (int i = 0; i < 256; i++) < analogWrite(9, i); delay(10); >for (int i = 255; i >= 0; i--) < analogWrite(9, i); delay(10); >> (4) ボタン入力でLEDを点滅 const int buttonPin = 2; const int ledPin = 13; boolean buttonState = false; void setup() < pinMode(buttonPin, INPUT_PULLUP); // プルアップを使用 pinMode(ledPin, OUTPUT); >void loop() < // ボタンが押されたらLOWになる if (digitalRead(buttonPin) == LOW) < digitalWrite(ledPin, HIGH); >else < digitalWrite(ledPin, LOW); >> (5) シリアル通信でLED制御 void setup() < Serial.begin(9600); pinMode(LED_BUILTIN, OUTPUT); >void loop() < if (Serial.available() >0) < char c = Serial.read(); if (c == '1') < digitalWrite(LED_BUILTIN, HIGH); Serial.println("LED ON"); >else if (c == '0') < digitalWrite(LED_BUILTIN, LOW); Serial.println("LED OFF"); >> >15. まとめと次のステップ
- 外部センサやモジュールの利用温度センサ、超音波センサ、RGB LED、フルカラーLCDなどを使ったプロジェクト
- 無線通信やネットワークへの拡張Wi-Fiモジュール(ESP8266/ESP32)、Bluetooth、LoRaなどを用いたIoTプロジェクト
- 複数タスクの同時処理に挑戦割り込み、ミリ秒単位のタイマー、状態マシンによる非ブロッキング動作
- メモリやパフォーマンスを意識したプログラム最適化フラッシュメモリやSRAMの節約、効率の良いデータ構造の設計
- C++のオブジェクト指向を用いたコードの再利用性向上クラスを定義して複雑なプロジェクトを読みやすく拡張しやすいコード構造にする