はじめに
ArduinoでLEDの明るさを調整したいのですが、デジタル可変抵抗(デジタルポテンショメータ)を使ってアナログに調整する以外に、PWMを使ってデジタルに調整する方法があるので試してみます。
材料
Arduino Uno
Arduino Uno Rev3: 開発ツール・ボード 秋月電子通商-電子部品・ネット通販
電子部品,通販,販売,半導体,IC,LED,マイコン,電子工作Arduino Uno Rev3秋月電子通商 電子部品通信販売
トランジスタアレイはNPN型でよく使われる型番(ULN2003AN)を用意しました。7chです。
トランジスターアレイ ULN2003AN: 半導体 秋月電子通商-電子部品・ネット通販
電子部品,通販,販売,半導体,IC,LED,マイコン,電子工作トランジスターアレイ ULN2003AN秋月電子通商 電子部品通信販売
適当なLED×4個、適当な抵抗(1kΩ)×4個、配線用のジャンパワイヤです。
PWMについてはこちらもご参照ください。
Arduinoチュートリアル 基礎編
シンプルにLEDの調光
まずはシンプルなPWM制御を試してみます。PWM対応のデジタルピンには「~」が付いています。ここでは3番ピン。
Arduinoに書き込みます。
void setup(){
// シリアルポートを9600 bps[ビット/秒]で初期化
Serial.begin(9600);
// PWMピンをoutputに
pinMode(3, OUTPUT);
}
void loop(){
// ゆっくり点灯
for (int i = 0; i <= 255; i++){
analogWrite(3, i);
delay(5);
}
// ゆっくり消灯
for (int i = 255; i >= 0; i--){
analogWrite(3, i);
delay(5);
}
}
トランジスタアレイ経由でLEDの調光
次に、トランジスタアレイ経由で明るさを制御してみます。とりあえず4個繋ぎました。PWM出力ピンは3, 5, 6, 9番です。
Arduinoに書き込みます。
void setup(){
// シリアルポートを9600 bps[ビット/秒]で初期化
Serial.begin(9600);
// PWMピンをoutputに
pinMode(3, OUTPUT);
pinMode(5, OUTPUT);
pinMode(6, OUTPUT);
pinMode(9, OUTPUT);
}
void loop(){
// ゆっくり点灯
for (int i = 0; i < 128; i++){
analogWrite(3, i);
analogWrite(5, 128 + i);
analogWrite(6, 255 - i);
analogWrite(9, 127 - i);
delay(5);
}
for (int i = 0; i < 128; i++){
analogWrite(3, 128 + i);
analogWrite(5, 255 - i);
analogWrite(6, 127 - i);
analogWrite(9, i);
delay(5);
}
for (int i = 0; i < 128; i++){
analogWrite(3, 255 - i);
analogWrite(5, 127 - i);
analogWrite(6, i);
analogWrite(9, 128 + i);
delay(5);
}
for (int i = 0; i < 128; i++){
analogWrite(3, 127 - i);
analogWrite(5, i);
analogWrite(6, 128 + i);
analogWrite(9, 255 - i);
delay(5);
}
}
analogWrite() に与えるデューティ比(0から255の整数)とLEDの明るさは比例しないようです。信号と明るさを比例させるには適当な非線形関数が必要です。
さいごに
結局、非線形関数を設定してPythonからの制御もできました。トランジスタってパキパキON/OFFを切り替えられるものなのでしょうか。対応できるPWMの周波数?デューティ比?の範囲があるのかなとも想像しますが。