「Arduino Mega 2560 LESSON:26 光抵抗素子 PhotoCell」の版間の差分
編集の要約なし |
編集の要約なし |
||
| 233行目: | 233行目: | ||
ADCの最大値は1023なので、測定範囲の約44.6%でLEDが全点灯する設計です。 | ADCの最大値は1023なので、測定範囲の約44.6%でLEDが全点灯する設計です。 | ||
[[ファイル:Mega2560 L26 01 ADCと電圧の関係.svg|380px||none|ADCと電圧の関係]] | |||
2026年11月6日 (金) 18:25時点における版
概要
74HC595 と8個の LEDと光抵抗素子を接続するレッスンです。
完成図は以下のとおりです。
[[|380px||none|完成図]]
PCB図は以下のようなものです。
[[|380px||none|PCB図]]
3Dプレビュー図は以下のようなものです。
[[|380px||none|3Dプレビュー図]]
コードは以下のようなものです。
//www.elegoo.com
//2016.12.9
int lightPin = 0;
int latchPin = 11;
int clockPin = 9;
int dataPin = 12;
int leds = 0;
void setup()
{
pinMode(latchPin, OUTPUT);
pinMode(dataPin, OUTPUT);
pinMode(clockPin, OUTPUT);
}
void updateShiftRegister()
{
digitalWrite(latchPin, LOW);
shiftOut(dataPin, clockPin, LSBFIRST, leds);
digitalWrite(latchPin, HIGH);
}
void loop()
{
int reading = analogRead(lightPin);
int numLEDSLit = reading / 57; //1023 / 9 / 2
if (numLEDSLit > 8) numLEDSLit = 8;
leds = 0; // no LEDs lit to start
for (int i = 0; i < numLEDSLit; i++)
{
leds = leds + (1 << i); // sets the i'th bit
}
updateShiftRegister();
}
フォトセルの抵抗を \(R_{\mathrm{photo}}\) とすると、A0に加わる電圧は、
\[
V_{A0}=5\times\frac{1000}{R_{\mathrm{photo}}+1000}
\]
となります。
フォトセル A0電圧 analogRead() 500Ω 3.33V 約682 1kΩ 2.50V 約512 5kΩ 0.83V 約170 10kΩ 0.45V 約93 50kΩ 0.098V 約20
LEDレベルメーターを残しながら、もっと具体的な電圧計的な表示をシリアルモニタで表示するなら以下のようになります。ただしAnalogピンが5Vちょうどを1024として受け取れていればの表示になりますので、誤差はあります。
int lightPin = A0;
int latchPin = 11;
int clockPin = 9;
int dataPin = 12;
byte leds = 0;
void setup()
{
pinMode(latchPin, OUTPUT);
pinMode(dataPin, OUTPUT);
pinMode(clockPin, OUTPUT);
Serial.begin(9600);
}
void updateShiftRegister()
{
digitalWrite(latchPin, LOW);
shiftOut(dataPin, clockPin, LSBFIRST, leds);
digitalWrite(latchPin, HIGH);
}
void loop()
{
int reading = analogRead(lightPin);
// A0の電圧を計算
float voltage = reading * 5.0 / 1023.0;
// 光抵抗の抵抗値を計算(下側の固定抵抗は1kΩ)
float resistance = 0;
if (reading > 0) {
resistance = 1000.0 * (1023.0 - reading) / reading;
}
// LED表示
int numLEDSLit = reading / 57;
if (numLEDSLit > 8) numLEDSLit = 8;
leds = 0;
for (int i = 0; i < numLEDSLit; i++) {
bitSet(leds, i);
}
updateShiftRegister();
// シリアルモニタに数値を表示
Serial.print("ADC: ");
Serial.print(reading);
Serial.print(" Voltage: ");
Serial.print(voltage, 3);
Serial.print(" V");
Serial.print(" Photoresistor: ");
if (reading == 0) {
Serial.println("Over range");
} else {
Serial.print(resistance, 0);
Serial.println(" ohm");
}
delay(500);
}
ADC値 LED点灯数 0~56 0個 57~113 1個 114~170 2個 171~227 3個 228~284 4個 285~341 5個 342~398 6個 399~455 7個 456~1023 8個
ADCの最大値は1023なので、測定範囲の約44.6%でLEDが全点灯する設計です。
これは比例計算です。
\[
\frac{V}{5}=\frac{\text{reading}}{1023}
\]
両辺に5を掛けると、
\[
\boxed{V=\frac{\text{reading}\times5}{1023}}
\]
となります。
例えば、今回の部屋の照明では reading = 328 でした。
\[
V=\frac{328\times5}{1023}
\]
\[
\boxed{V\approx1.603\ \mathrm{V}}
\]
つまり、ArduinoのA0端子には約1.60Vが加わっていたと推定できます。