Skip to content

Week 3: タイマー、PWM、ADC

1. タイマー/カウンタの仕組み

1.1 タイマー/カウンタの基本概念

タイマー/カウンタは、マイクロコントローラ内部のハードウェアモジュールで、時間測定や周期的なイベント生成に使用されます。

1.2 Arduino UNO R4 WiFiのタイマー/カウンタ

Arduino UNO R4 WiFiには、複数のタイマー/カウンタが搭載されています。これらを利用して、高精度な時間計測や周期的なイベント生成が可能です。

1.3 タイマー/カウンタの設定と使用方法

#include <TimerRTOS.h>

TimerRTOS timer;

void timerCallback() {
  // タイマーイベントの処理
}

void setup() {
  timer.initialize(1000000); // 1秒間隔でタイマーを設定
  timer.attachInterrupt(timerCallback);
}

void loop() {
  // メインループの処理
}

2. PWM信号の生成と制御

2.1 PWM(Pulse Width Modulation)の原理

PWMは、デジタル信号を使って平均電圧を制御する技術です。デューティ比を変更することで、出力の平均値を制御します。

graph TD
    A[PWM信号] --> B{デューティ比}
    B -->|25%| C[低出力]
    B -->|50%| D[中出力]
    B -->|75%| E[高出力]

2.2 Arduino UNO R4 WiFiでのPWM出力

Arduino UNO R4 WiFiでは、特定のピンでPWM出力が可能です。analogWrite()関数を使用してPWM信号を生成できます。

2.3 PWMを使用したLED輝度制御

const int ledPin = 9;  // PWM対応ピン

void setup() {
  pinMode(ledPin, OUTPUT);
}

void loop() {
  for (int brightness = 0; brightness <= 255; brightness++) {
    analogWrite(ledPin, brightness);
    delay(10);
  }
  for (int brightness = 255; brightness >= 0; brightness--) {
    analogWrite(ledPin, brightness);
    delay(10);
  }
}

3. アナログ信号のデジタル変換(ADC)

3.1 ADC(Analog-to-Digital Converter)の仕組み

ADCは、連続的なアナログ信号を離散的なデジタル値に変換するプロセスです。

3.2 Arduino UNO R4 WiFiのADC機能

Arduino UNO R4 WiFiには10ビットのADCが搭載されており、0-5Vの入力電圧を0-1023のデジタル値に変換します。

3.3 アナログセンサーの読み取り

const int sensorPin = A0;  // アナログ入力ピン

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

void loop() {
  int sensorValue = analogRead(sensorPin);
  float voltage = sensorValue * (5.0 / 1023.0);

  Serial.print("Sensor Value: ");
  Serial.print(sensorValue);
  Serial.print(", Voltage: ");
  Serial.println(voltage);

  delay(1000);
}

4. DAC(デジタル-アナログ変換)の利用

4.1 DACの基本概念

DACは、デジタル値をアナログ信号に変換するプロセスです。

4.2 Arduino UNO R4 WiFiのDAC機能

Arduino UNO R4 WiFiには、10ビットのDACが搭載されています。これを使用して、デジタルデータからアナログ電圧を生成できます。

4.3 DACを使用した簡単な波形生成

#include <TFT_eSPI.h>

const int dacPin = DAC;  // DACピン

void setup() {
  analogWriteResolution(10);  // 10ビット解像度を設定
}

void loop() {
  // サイン波の生成
  for (int i = 0; i < 360; i++) {
    float radian = i * PI / 180.0;
    int dacValue = 512 + 511 * sin(radian);  // 0-1023の範囲で変動
    analogWrite(dacPin, dacValue);
    delayMicroseconds(100);  // 周波数調整
  }
}

実践演習

  1. PWMを使用したLED輝度制御
  2. 複数のLEDを使用した光のグラデーション効果の作成
  3. ポテンショメータを使用したLED輝度の手動制御

  4. アナログセンサーデータの読み取りと処理

  5. 光センサーを使用した周囲の明るさの測定と表示
  6. 温度センサーのデータを使用した簡単な温度制御システムの実装

  7. DACを使用した簡単な波形生成

  8. サイン波、三角波、矩形波の生成と可視化
  9. 音声信号の簡単な合成と出力
graph TD
    A[アナログセンサー] -->|ADC| B[Arduino UNO R4 WiFi]
    B -->|処理| C{出力選択}
    C -->|PWM| D[LED制御]
    C -->|DAC| E[波形生成]
    C -->|デジタル出力| F[ディスプレイ表示]

まとめ

この週では、タイマー/カウンタ、PWM、ADC、DACなど、アナログとデジタルの橋渡しとなる重要な概念と技術を学びました。これらの技術は、センサーデータの取得、モーター制御、信号処理など、多くの組み込みシステムアプリケーションで不可欠です。実践演習を通じて、これらの技術を実際のプロジェクトに適用する方法を習得しました。

参考資料

  1. Arduino公式ドキュメント: analogRead()
  2. Arduino公式ドキュメント: analogWrite()
  3. 「Arduino UNO R4 WiFi ではじめる電子工作」第7章, 第8章
  4. 「C++による Arduino プログラミング入門」第9章, 第10章

UNO R4 WiFiチートシート(NEW TAB)