ArduinoでほこりセンサGP2Y1010AU0Fを使ってみた

スポンサーリンク

・はじめに

aitendoに行った時にほこりセンサが目に入り

衝動買いして、そのままだったで使ってみた。

 

結論から言うと検出能力は非常に低いんで

ちょっとしたほこりや、室内の空気の状態

を知ることはできなかった

 

タバコとかの煙が充満していれば検出できる

かもしれない。逆に検出できたらかなり汚染

されてると思う

 

・使ったもの

arduino uno

GP2Y10AU0F

ユニバーサル基板

150Ω抵抗

220uF電解コンデン

トランジスタ2120

JST ZHR-6 PH:1.5M

Hコネクタハウジング用コンタクト SXH-001

 microSDカードソケット

 

 

・回路図

 

 GP2Y10のコネクタの配置は以下の図

f:id:shangtian:20180301224025p:plain

出典:GP2Y1010AU0Fデータシート

 

f:id:shangtian:20180301225639p:plain

出典:GP2Y1010AU0Fデータシート

 

 上の回路図をもとに回路を組んだ

 ほぼそのままですね

抵抗は150Ω コンデンサは220uF

3pinのLEDのとこはnpn型のトランジスタ2120

を接続しコレクタをLED、エミッタをGND

ベースをArduinoのデジタルピン2に接続

またVoutはアナログピン2に接続した。

 

f:id:shangtian:20180301230854p:plain

 

f:id:shangtian:20180301225043j:plain

 

 

・プログラム

LED端子へ以下の図のパルスを送って

計測する。

 

f:id:shangtian:20180301225923p:plain

出典:GP2Y1010AU0Fデータシート

 

 

f:id:shangtian:20180301225915p:plain

出典:GP2Y1010AU0Fデータシート

 

 つまりArduinoのD2を

digitalWrite(2,HIGH);

delayMicroseconds(280);

val = analogRead(2);//ここで測定

delayMicroseconds(40);

digitalWrite(2,LOW);

delayMicroseconds(9680);

 と言う感じでパルスを送れば

計測できる

 

おそらくトランジスタを接続しなくても

同じ機能を果たすことが可能だ

 

トランジスタのエミッタは

LED端子に、コレクタはGNDに接続され

ている。つまりベース(D2pin)がHIGHになれば

LED端子はLOWになり、ベース(D2pin)がLOW

であればLED端子はHIGHとなる。

 

したがってD2pinの出力を反転させれば

トランジスタがなくても問題がないかもしれない

 

digitalWrite(2,LOW);//ここ

delayMicroseconds(280);

val = analogRead(2);

delayMicroseconds(40);

digitalWrite(2,HIGH);//ここ

delayMicroseconds(9680);

 

 

 以下のスケッチはただ

Voutの値を出力しているだけ

const int LED = 1;
const int rea = 2;

void setup() {
  pinMode(LED,OUTPUT);
  Serial.begin(9600);
}

void loop() {
  Serial.println(dustRead());
  delay(100);
  
}

float dustRead() {
  float val;
  digitalWrite(LED,HIGH);
  delayMicroseconds(280);
  val = analogRead(rea);
  delayMicroseconds(40);
  digitalWrite(LED,LOW);
  delayMicroseconds(9680);
  return val;
}

 

 次は粉塵濃度を出力してsdカード

に保存するスケッチを書く

f:id:shangtian:20180301225842p:plain

図7:粉塵濃度 出力電圧

出典:GP2Y1010AU0Fデータシート

 

図7のグラフより以下の式が導ける

かなり大雑把だけど

y = 2.8/0.5*x +0.7

 が読み取れ変形すると

x = 0.178*y - 0.125

となる。

 

以下のスケッチは 

dustRead()でVoutの値を読み取り

calculate()でdustRead()読み取った

値を電圧Vに変換し、そのVを

(2)に代入し粉塵濃度を算出する。

 

logging(float) では求まった

粉塵濃度をSDカードに保存している。

 

#include <SPI.h>
#include <SD.h>
const int cs = 3; const int LED = 2; const int readPin = 2; const float SamplingTime = 280;//micro seconds const float DelayTime = 40; const float SleepTime = 9680; File logFile; float dustRead(); float calculate(); void logging(float); void setup() { pinMode(cs,OUTPUT); pinMode(LED,OUTPUT); digitalWrite(cs,HIGH); Serial.begin(9600); if(!SD.begin(cs)){ //Serial.println("intitializes failed"); return; } } void loop() { logging(calculate()); delay(500); } float dustRead() { float val; digitalWrite(LED, HIGH); delayMicroseconds(SamplingTime); val = analogRead(readPin); delayMicroseconds(DelayTime); digitalWrite(LED, LOW); delayMicroseconds(SleepTime); Serial.print(val); Serial.print(":"); return val; } float calculate() { float concentration, V; V = 5*dustRead()/1024; Serial.println(V); concentration = 0.178*V - 0.125; return concentration; } void logging(float val) { logFile = SD.open("log3.txt", FILE_WRITE); if(logFile) logFile.println(val); logFile.close(); }