日記とか、工作記録とか

自分に書けることを何でも書いてゆきます。作った物、買ったもの、コンピュータ系の話題が多くなるかもしれません。

M5Stack + 光センサー(型番不明の硫化カドミウムセル)

なんだかちょっと調子に乗ってきたので、部屋に転がっていた、壊れた保安灯から取った硫化カドミウムセルの光センサー(たぶん)を使って明るさ検知をしてみました。身の回りのもので何ができるのか、ここしばらくそんなことばかり考えています。

光センサー

こんなやつです。見たことがある人も多いのではないでしょうか。表面のうねうねした回路に光が当たると、電気抵抗が変わるので電流を測れば明るさが間接的にわかるというものです。明るくなると抵抗が下がり、暗くなると上がります。安いのを買ったのですがすぐ壊れてしまい保安灯としては使えなくなりました。センサー部分を根元からニッパーで切って再利用する、というよくあるパターンですね。限りある資源を大切に。ちなみに購入しても100円未満のようです。

f:id:WindVoice:20190915202025j:plain

型番不明なのですが、調べてみたところ、硫化カドミウムを使ったものではないかと思われます。可視光線によく反応するので、人間が感じる明暗の感覚と近いデータがとれます。

回路

こんな感じで接続しました。5VとGNDの間を際限なく電流が流れないよう、抵抗を追加します。1kΩのものを使っています。その間に分岐を作って、アナログポート(ADC:Analog Digital Converter)につないで、入力モードで使います。M BUSの表をみると、ADCは35と36ですね。今回は35につないでいます。

f:id:WindVoice:20190915214138j:plain

できあがると、こんな感じになります。

f:id:WindVoice:20190915215009j:plain

コーディング

今回もArduino IDEで書いています。MicroPythonはまだ仕様が落ち着いていないのか、どうもドキュメント通りに動かないのが気になります。Cで書いたほうが仕様が調べやすいですね。アナログポートを読むときはanalogRead()を使います。整数値が取れるのであとは良いように使います。明るいほど大きい値が取れますが、実験したところ4095が上限のようです。

#include <M5Stack.h>

// 光センサーのポート番号。アナログ入力ポートは35が使えるそうだ
int CdS_Port = 35;

void setup() {
  Serial.begin(115200);
  m5.begin();

  // 雑音は決しておく。なんとなく。
  m5.Speaker.write(0);

  // 明るさ入力ポートの準備
  pinMode(CdS_Port, INPUT);
}

void loop() {

  int d;

  // 採取される値は 0 - 4095 のようだ
  d = analogRead(CdS_Port);

  // シリアルポートに報告
  Serial.printf("Read data -> %4d\n", d);

  // LCDに表示
  m5.Lcd.fillScreen(BLACK);
  m5.Lcd.setTextColor(WHITE);
  m5.Lcd.setTextSize(5);
  m5.Lcd.setCursor(0,0);
  m5.Lcd.printf("Read data -> %4d\n", d);
  
  delay(300);
}

結果

動作は簡単。結果も簡単。いくつかセンサーやモーターを使ってきたけれど、組み合わせで何をするかが問題ですね。基礎力は大事だけれど応用はどうしたらいいのやら……

youtu.be