「Arduino Mega 2560 LESSON:26 光抵抗素子 PhotoCell」の版間の差分

提供:yonewiki
編集の要約なし
編集の要約なし
 
(同じ利用者による、間の5版が非表示)
72行目: 72行目:




[[|380px||none|完成図]]
[[ファイル:Mega2560 L26 02 完成図.jpg|380px||none|完成図]]




78行目: 78行目:




[[|380px||none|PCB図]]
[[ファイル:Mega2560 L26 03 PCB図.png|380px||none|PCB図]]




84行目: 84行目:




[[|380px||none|3Dプレビュー図]]
[[ファイル:Mega2560 L26 04 3DPreview図.png|380px||none|3Dプレビュー図]]




218行目: 218行目:
}
}
</code></pre></div><script></freescript>
</code></pre></div><script></freescript>
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が全点灯する設計です。
[[ファイル:Mega2560 L26 01 ADCと電圧の関係.svg|380px||none|ADCと電圧の関係]]
これは比例計算です。
\[
\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が加わっていたと推定できます。
この回路では、光抵抗と1kΩの抵抗が直列に接続されています。
直列回路では、両方の抵抗に同じ電流が流れます。
そして、ArduinoのA0は、下側の1kΩ抵抗にかかる電圧を測定しています。
① オームの法則を使う
オームの法則は、
\[
V=IR
\]
でしたね。
電流を求める形にすると、
\[
I=\frac{V}{R}
\]
今回、1kΩの抵抗にかかっている電圧は約1.603Vなので、
\[
I=\frac{1.603}{1000}
\]
\[
\boxed{I\approx0.001603\ \mathrm{A}=1.603\ \mathrm{mA}}
\]
となります。
② 光抵抗にかかる電圧を求める
電源は5Vで、1kΩの抵抗には1.603Vがかかっています。
残りの電圧が光抵抗にかかります。
\[
V_{\mathrm{photo}}=5-1.603
\]
\[
\boxed{V_{\mathrm{photo}}=3.397\ \mathrm{V}}
\]
③ 光抵抗の抵抗値を求める
直列回路なので、光抵抗にも同じ1.603mAが流れます。
もう一度オームの法則を使います。
\[
R=\frac{V}{I}
\]
\[
R_{\mathrm{photo}}=\frac{3.397}{0.001603}
\]
\[
\boxed{R_{\mathrm{photo}}\approx2119\ \Omega}
\]
つまり、今回の部屋の照明では、光抵抗は約2.12kΩになっていたと推定できます。
3. なぜ1行の計算式にまとめられるのか?
ここまでの計算を、一般的な数式にまとめてみましょう。
光抵抗にかかる電圧は、
\[
5-V_{A0}
\]
1kΩに流れる電流は、
\[
I=\frac{V_{A0}}{1000}
\]
したがって光抵抗の抵抗値は、
\[
R_{\mathrm{photo}}=\frac{5-V_{A0}}{V_{A0}/1000}
\]
分母の分数を整理すると、
\[
R_{\mathrm{photo}}=1000\times\frac{5-V_{A0}}{V_{A0}}
\]
ここで、最初に求めたADCの電圧換算式、
\[
V_{A0}=\frac{5\times\text{reading}}{1023}
\]
を代入します。
\[
R_{\mathrm{photo}}=
1000\times
\frac{5-\frac{5\times\text{reading}}{1023}}
{\frac{5\times\text{reading}}{1023}}
\]
分子と分母に1023を掛けると、
\[
=1000\times
\frac{5\times1023-5\times\text{reading}}
{5\times\text{reading}}
\]
分子と分母の5を約分すると、
\[
\boxed{
R_{\mathrm{photo}}=
1000\times\frac{1023-\text{reading}}{\text{reading}}
}
\]
これで、プログラムの式が完成。


 
 


[[Arduino Mega 2560]]に戻る。
[[Arduino Mega 2560]]に戻る。

2026年11月6日 (金) 21:16時点における最新版

Arduino Mega 2560に戻る。

概要

 74HC595 と8個の LEDと光抵抗素子を接続するレッスンです。


 完成図は以下のとおりです。


完成図


 PCB図は以下のようなものです。


PCB図


 3Dプレビュー図は以下のようなものです。


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が全点灯する設計です。


ADCと電圧の関係


これは比例計算です。


\[ \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が加わっていたと推定できます。


この回路では、光抵抗と1kΩの抵抗が直列に接続されています。


直列回路では、両方の抵抗に同じ電流が流れます。


そして、ArduinoのA0は、下側の1kΩ抵抗にかかる電圧を測定しています。


① オームの法則を使う


オームの法則は、


\[ V=IR \]


でしたね。


電流を求める形にすると、


\[ I=\frac{V}{R} \]


今回、1kΩの抵抗にかかっている電圧は約1.603Vなので、


\[ I=\frac{1.603}{1000} \]


\[ \boxed{I\approx0.001603\ \mathrm{A}=1.603\ \mathrm{mA}} \]


となります。


② 光抵抗にかかる電圧を求める


電源は5Vで、1kΩの抵抗には1.603Vがかかっています。


残りの電圧が光抵抗にかかります。


\[ V_{\mathrm{photo}}=5-1.603 \]


\[ \boxed{V_{\mathrm{photo}}=3.397\ \mathrm{V}} \]


③ 光抵抗の抵抗値を求める 直列回路なので、光抵抗にも同じ1.603mAが流れます。


もう一度オームの法則を使います。


\[ R=\frac{V}{I} \]


\[ R_{\mathrm{photo}}=\frac{3.397}{0.001603} \]


\[ \boxed{R_{\mathrm{photo}}\approx2119\ \Omega} \]


つまり、今回の部屋の照明では、光抵抗は約2.12kΩになっていたと推定できます。


3. なぜ1行の計算式にまとめられるのか?


ここまでの計算を、一般的な数式にまとめてみましょう。


光抵抗にかかる電圧は、


\[ 5-V_{A0} \]


1kΩに流れる電流は、


\[ I=\frac{V_{A0}}{1000} \]


したがって光抵抗の抵抗値は、


\[ R_{\mathrm{photo}}=\frac{5-V_{A0}}{V_{A0}/1000} \]


分母の分数を整理すると、


\[ R_{\mathrm{photo}}=1000\times\frac{5-V_{A0}}{V_{A0}} \]


ここで、最初に求めたADCの電圧換算式、


\[ V_{A0}=\frac{5\times\text{reading}}{1023} \]


を代入します。


\[ R_{\mathrm{photo}}= 1000\times \frac{5-\frac{5\times\text{reading}}{1023}} {\frac{5\times\text{reading}}{1023}} \]


分子と分母に1023を掛けると、


\[ =1000\times \frac{5\times1023-5\times\text{reading}} {5\times\text{reading}} \]


分子と分母の5を約分すると、


\[ \boxed{ R_{\mathrm{photo}}= 1000\times\frac{1023-\text{reading}}{\text{reading}} } \]

これで、プログラムの式が完成。

 

Arduino Mega 2560に戻る。