arduinoで透過形フォトセンサが使えない原因と解決方法

このQ&Aのポイント
  • arduinoで透過形フォトセンサを使いたいが反応しない原因として、プログラムのdigitalReadの値が正しく取得できないことが考えられる。
  • 対策としては、analogReadを使って値を取得する方法や、回路を確認して接続が正しく行われているかを確認することが重要。
  • さらに、秋月のCNZ1023を使用している場合は、回路や仕様書をしっかり確認し、正しく接続されているかを確認することも大切。
回答を見る
  • ベストアンサー

arduinoで透過形フォトセンサが使えません

arduinoで透過形フォトセンサを使いたいのですが、何度試しても反応してくれません。お礼はMAXまで出すので誰か教えてください!! プログラミングをいじったりしているもですが、digitalの値で結果を得ることができません。。 analogの値もバラバラで困っています。 なにが間違っているか教えてください。 身近に頼れる人もいなくて本当に困っています。 秋月のCNZ1023を使っています。 http://akizukidenshi.com/download/ds/panasonic/CNZ1023(ON1023).pdf 回路は写真のようなかんじで試しています。 arduino IDEで作っています。 const int d_in_photo = 2; void setup() { pinMode(d_in_photo, INPUT); Serial.begin(9600); } void loop() { int val = digitalRead(d_in_photo); Serial.println(val); delay(10); }

質問者が選んだベストアンサー

  • ベストアンサー
  • koujikuu
  • ベストアンサー率43% (428/992)
回答No.4

参照された、ホームページの方が説明している通り、フォトトランジスタの向きが逆だと思います 説明図では、1,3が上側ですが、データーシートでは反時計回り、1,4が上側です アノード+ 1,4 エミッタ カソードー 2,3 コレクタ 上面より http://atelier-orchard.blogspot.jp/2012/11/cnz1023-arduino.html

thanked_m_d52
質問者

お礼

出来ました!反対になっていました!ありがとうございます!

その他の回答 (3)

  • umamimi
  • ベストアンサー率39% (144/362)
回答No.3

No.2 です。 回路図描いて、pin番号を入力して、実体図と照合...のように段階を踏んで確認していけば どの時点でおかしいのかわかるモノなんですが。 めんどくさいみたいでこっちが追跡できないのでテキトウに答えます。 ・いけないのはハードかプログラムか切り分ける  フォトインタラプタと入力ポートの配線を外し、入力ポートに直接"1""0"を与えて  プログラムに値が予定どおり読み込まれるかチェック  読み込まれてなければプログラムがNG(の可能性大) ・たぶんpin3,4が逆  実体図を省略して、ブロック図を見て配線してるとやりがちだが  ブロック図とピンの並び方が一致してない事に気付かず接続してしまう  これによってフォトインタラプタが壊れた可能性もあり。  (半導体部品への電源の逆接続は、大抵部品を壊す)  こうなると配線を直しても正常に動かない。

thanked_m_d52
質問者

お礼

わかりやすい回答をありがとうございます。 回路図や実体図は書いていません。 >たぶんpin3,4が逆 実体図を省略して、ブロック図を見て配線してるとやりがちだが ブロック図とピンの並び方が一致してない事に気付かず接続してしまう pin3,4は確認したのですがあっていると思います。 >これによってフォトインタラプタが壊れた可能性もあり。  (半導体部品への電源の逆接続は、大抵部品を壊す)  こうなると配線を直しても正常に動かない。 フォトインタラプタに関しては、新しいものに変えて動作確認をしていますが、反応は見られません。

  • umamimi
  • ベストアンサー率39% (144/362)
回答No.2

どういう考えでどういう時にどうなる、という計画で どのような回路なのか、も示してないので何ともいいようがない。 >なにが間違っているか教えてください。 こんな質問で解決すると思ってるのがまちがい。

thanked_m_d52
質問者

補足

質問の仕方が悪かったみたいなので、補足させていただきます。 フォトセンサに紙を入れた時、「1」になる。 紙のようなものを抜いた時、「0」になる。 というようなフォトセンサの基本的な使い方する計画です。 問題点は、カードなどを入れても「0」のままで値が変わりません。 なにが間違っているのかわからないので、手助けしてくだい。

  • koujikuu
  • ベストアンサー率43% (428/992)
回答No.1

データーシートの測定回路では、100Ωのプルダウンになってますが、 arduino側の内蔵プルアップ機能はOFFにしていますか? arduinoの入力ピンを外した状態で、sig_out側の電圧が変化するかテスターで確認してみて下さい。 http://www.musashinodenpa.com/arduino/ref/index.php?f=2&pos=83

thanked_m_d52
質問者

お礼

回答ありがとうございます。 digitalWrite(pin, HIGH); を追加してみましたが、まったく同じ結果です。 テスターをもっていないので確認することができません。 フォトセンサの赤外線は光っています。

関連するQ&A

  • Arduino プログラミングのエラーについて

    現在、Arduino、4桁7セグメントLED(カソードコモン)、タクトスイッチ3つで、3人クイズ対決で利用する得点加算機を作成しています。 プログラムで、下記のようなエラーが出てしまいます。 invalid types 'int[int]' for array subscript このエラーに対して、何か解決策があればご教授お願い致します。 下記にプログラムを載せます。 const int first_BUTTON = 0; //プレイヤー1の得点ボタン const int second_BUTTON = 1; //プレイヤー2の得点ボタン const int third_BUTTON = 4; //プレイヤー3の得点ボタン const int anode_a = 12; //アノードに接続するArduinoのピン const int anode_b = 8; const int anode_c = 5; const int anode_d = 3; const int anode_e = 2; const int anode_f = 11; const int anode_g = 6; const int cathode_first = 7; // カソードに接続するArduinoのピン const int cathode_second = 9; const int cathode_third = 10; int val_1= 0; int val_2= 0; int val_3= 0; int old_val_1 = 0; int old_val_2 = 0; int old_val_3 = 0; // LEDの状態(0ならオフ、1ならオン) int state_first=0; int state_second=0; int state_third=0; int w; int N; // setup() は、最初に一度だけ実行される void setup () { // ピンを出力モードに設定する pinMode(first_BUTTON, INPUT); pinMode(second_BUTTON, INPUT); pinMode(third_BUTTON, INPUT); pinMode(anode_a, OUTPUT); pinMode(anode_b, OUTPUT); pinMode(anode_c, OUTPUT); pinMode(anode_d, OUTPUT); pinMode(anode_e, OUTPUT); pinMode(anode_f, OUTPUT); pinMode(anode_g, OUTPUT); pinMode(cathode_first, OUTPUT); pinMode(cathode_second, OUTPUT); pinMode(cathode_third, OUTPUT); } //LEDレイアウトを定義 boolean Num_Array[11][7]={ {1,1,1,1,1,1,0},//0 {0,1,1,0,0,0,0},//1 {1,1,0,1,1,0,1},//2 {1,1,1,1,0,0,1},//3 {0,1,1,0,0,1,1},//4 {1,0,1,1,0,1,1},//5 {1,0,1,1,1,1,1},//6 {1,1,1,0,0,1,0},//7 {1,1,1,1,1,1,1},//8 {1,1,1,1,0,1,1},//9 {0,0,0,0,0,0,0} //space }; //LED表示関数を定義 void NumPrint (int Number){ for (int w=0; w<=6; w++){ digitalWrite(w+1,Num_Array[Number][w]); } } boolean Led_Array[3][3]={ {1,0,0,}, //LED1 {0,1,0}, //LED2 {0,0,1} //LED3 }; void Led_Active(int Number){ for(w=0;w<=2;w++){ digitalWrite(w+11,Led_Array[Number][w]); } } // loop() は、setup ()実行後、無限に実行される void loop(){ for(int i=0;i<=2;i++){ NumPrint(N[i]) } Led_Active(i); delay(5); } val_1 = digitalRead(first_BUTTON); NumPrint(state_first); //変化があるかどうかチェック if((val_1 == HIGH) && (old_val_1 == LOW)) { state_first = (state_first+1) % 10; NumPrint(state_first); delay(300); } delay(100); old_val_1 = val_1; val_2 = digitalRead(second_BUTTON); NumPrint(state_second); //変化があるかどうかチェック if((val_2 == HIGH) && (old_val_2 == LOW)) { state_second = (state_second+1) % 10; NumPrint(state_second); delay(300); } delay(100); old_val_2 = val_2; val_3 = digitalRead(third_BUTTON); NumPrint(state_third); //変化があるかどうかチェック if((val_3 == HIGH) && (old_val_3 == LOW)) { state_third = (state_third+1) % 10; NumPrint(state_third); delay(300); } delay(100); old_val_3 = val_3; }

  • Arduino 条件式

    Arduinoでシリアルモニタを使用しています。 それで、入力した数字を条件式で判断し、真ならLEDを光らせるプログラムを作りたいのですが、入力した数字をどのようなコードで描いたらいいでしょうか? ちなみに、if (Serial.readString() <= 40) { と書いたらダメでした。 #include <Wire.h> #include <LiquidCrystal_I2C.h> LiquidCrystal_I2C lcd(0x27, 16, 2); int RST = 3; int RstFlag = 0; int Tr = 4; int TrFlag = 0; int LED = 2; //初期設定 void setup() { pinMode(RST, INPUT); pinMode(Tr, INPUT); pinMode(LED, OUTPUT); lcd.init(); lcd.backlight(); //起動後一回のみ表示 lcd.setCursor(2, 0); lcd.print("Lab"); delay(2000); lcd.clear(); //シリアル通信開始 Serial.begin(9600); } void loop() { RstFlag = digitalRead(RST); TrFlag = digitalRead(Tr); lcd.setCursor(0, 0); lcd.print("Auto Mode"); lcd.setCursor(0, 1); lcd.print("Trigger = "); //シリアルポートにデータがあるか判断 if (Serial.available()) { delay(100); lcd.clear(); //データがある場合の動作 if (Serial.available() > 0) { //print"ln"はモニタに入力後改行するコマンド Serial.println("LCD Received!"); //Serial.readString():データを”文字列”として読み込む lcd.setCursor(10, 1); lcd.print(Serial.readString() + "s"); } } if (RstFlag == 0) { delay(100); lcd.clear(); Serial.println("LCD Clear!"); } /*if ( ○○○ <= 40) { //仮に40とする delay(100); Serial.println("Trigger Out!"); digitalWrite(LED, HIGH); delay(200); digitalWrite(LED, LOW); delay(200); digitalWrite(LED, HIGH); delay(200); digitalWrite(LED, LOW); delay(200); } */ length(readString()); }

  • Arduino のプログラムについて

    下のプログラムはArduinoで、4個のバッテリーの電圧を取得して、あるバッテリー電圧が14.5V以上だったら、充電を停止し、14.5Vよりも低いバッテリーには充電をするようにしたいのです。例えば、4個のバッテリーの取得電圧が下の図の様な状況の時、それぞれのバッテリーに充電、充電停止を行いたいのです。 AnalogPin 0 → 14.8V → digitalPin 10 を充電停止(LOWにする) AnalogPin 1 → 12.8V → digitalPin 11 を充電(HIGHにする) AnalogPin 2 → 13.7V → digitalPin 12 を充電(HIGHにする) AnalogPin 3 → 13.0V → digitalPin 13 を充電(HIGHにする) 質問:下のプログラムでArduinoに書き込んで動作させてみると、バッテリーの電圧は読み取っているのですが、digitalPin10~13のHIGH、LOWがうまくいきません。良い方法を教えてください。 void setup() { Serial.begin(9600); pinMode(10,OUTPUT); pinMode(11,OUTPUT); pinMode(12,OUTPUT); pinMode(13,OUTPUT); } void loop() { float battery_v[4];            for(int i=0;i<4;i++){ float convert_v=analogRead(i)*5./1024; battery_v[i]=convert_v/30*130; delay(100); Serial.print(i); Serial.print(" is "); Serial.println(battery_v[i]); delay(100); for(int r=9;r<14;r++){  // ここから下の命令がうまく動作しません。 if(battery_v[i]>14.5){ // digitalPin は10~13です。 digitalWrite(r,LOW); // すべてのdigitalWriteが }else { // LOWのままか、HIGHのままになってしまいます。 digitalWrite(r,HIGH); // } }   } delay(1000); } 以上、宜しくお願い致します。

  • Arduinoのスケッチでエラーがでてしまいます。

    【電子工作関連】Arduinoでボタンを押すとランダムに3つのモーターのうち一つが回転するというスケッチを書きたいのですが、エラーが出てしまいます。どこが間違っているのでしょう? Arduinoで、ボタンを押すとランダムに3つのモーターのうち一つが回転するというスケッチを書きたいのですが、コンパイル使用とすると、 「error: expected unqualified-id before numeric constant」 というエラーが出てしまいます。 どこが間違っているのでしょう? 下がそのスケッチです。 なお、モータードライバにはTA7291Pを使用。 信号ピンである5番6番ピンをArduino5~10番ピンに振り分けて、それぞれにモーターを接続、 電源やGNDは共有してます。 なお、ボタンを使わず、単純に3つのモーターのうち一つが回転するというというスケッチは出来ていて、実際にその通り動いています。 ------------------------------ //3つのモーターをランダムに動かす int val = 0 //入力ピンの状態がこの変数に記憶される void setup(){ pinMode(2,INPUT); //ボタンを入力に設定 pinMode(5,OUTPUT); //モーター(1)のドライバー5番ピンを出力に設定 pinMode(6,OUTPUT); //モーター(2)のドライバー5番ピンを出力に設定 pinMode(7,OUTPUT); //モーター(3)のドライバー5番ピンを出力に設定 pinMode(8,OUTPUT); //モーター(1)のドライバー6番ピンを出力に設定 pinMode(9,OUTPUT); //モーター(2)のドライバー6番ピンを出力に設定 pinMode(10,OUTPUT); //モーター(3)のドライバー6番ピンを出力に設定 } void loop(){ val = digitalRead(2); //入力を読み取りvalに格納 if (val == HIGH){ digitalWrite(random(5,8),HIGH);//ランダムにモーターを正回転させる } else { digitalWrite(5,LOW); digitalWrite(6,LOW); digitalWrite(7,LOW);//モータを止める } }

  • Arduinoでランダムにモーターを回したい

    【電子工作関連】Arduinoでボタンを押すたびに、ランダムに3つのモーターのうち一つが回転するというスケッチを書きたいのですが、ランダムになりません。どうすればランダムになるでしょう? 下がそのスケッチです。 今のところ、3つ全てのモーターが回ってしまいます。 なお、モータードライバにはTA7291Pを使用。 信号ピンである5番6番ピンをArduino5~10番ピンに振り分けて、それぞれにモーターを接続、 電源やGNDは共有してます。 なお、ボタンを使わず、単純に3つのモーターのうち一つが回転するというというスケッチは出来ていて、実際にその通り動いています。 ------------------------------ //3つのモーターをランダムに動かす int val = 0; //入力ピンの状態がこの変数に記憶される void setup(){ pinMode(2,INPUT); //ボタンを入力に設定 pinMode(5,OUTPUT); //モーター(1)のドライバー5番ピンを出力に設定 pinMode(6,OUTPUT); //モーター(2)のドライバー5番ピンを出力に設定 pinMode(7,OUTPUT); //モーター(3)のドライバー5番ピンを出力に設定 pinMode(8,OUTPUT); //モーター(1)のドライバー6番ピンを出力に設定 pinMode(9,OUTPUT); //モーター(2)のドライバー6番ピンを出力に設定 pinMode(10,OUTPUT); //モーター(3)のドライバー6番ピンを出力に設定 } void loop(){ val = digitalRead(2); //入力を読み取りvalに格納 if (val == HIGH){ digitalWrite(random(5,8),HIGH);//ランダムにモーターを正回転させる } else { digitalWrite(5,LOW); digitalWrite(6,LOW); digitalWrite(7,LOW);//モータを止める } }

  • Arduinoで曲げセンサの値を取得する方法

    Arduinoで曲げセンサを使い、その値を取得してProcessingで音を鳴らす方法はどのような方法があるのでしょうか。 例えば弱く曲げればsample01.mp3が流れ、強く曲げればsample02.mp3が流れるようにしたいです。 自分なりに調べてProcessing側でMinimライブラリを使って下記のプログラムを書けば音を鳴らせるとこまではいけました。 Processing側のプログラムです。 import ddf.minim.*; Minim minim; AudioPlayer player; void setup(){ size(200,200); minim = new Minim(this); player = minim.loadFile("sample01.mp3"); player.play(); } void draw(){ } void stop(){ player.close(); minim.stop(); super.stop(); } Arduinoのプログラムです。 const int led_pin = 9; const int vol_pin = 1; int vol_value = 0; void setup() { Serial.begin( 9600 ); } void loop() { vol_value = analogRead( vol_pin ); analogWrite( led_pin, vol_value/4 ); Serial.write( byte(vol_value/4) ); delay( 50 ); } よろしくお願い申し上げます。

  • Arduinoのスケッチで「変化が有った時」に変更

    お世話になります。 このスケッチを見るとHIGHの時に記録するようになっていると考えていますが、HIGHかLOWの変化の有った時に記録したいのですが、どのように変更すれば良いか教えて下さい。 また、記録上の0000 0000 0000のようにスペースを開けて記録する場合のスケッチも教えていただけますか。 参考にしたHP http://www.mauroalfieri.it/en/elettronica/data-logging-con-arduino.html 元のスケッチのチャンネル数はアナログ4chですがこれにデジタル12chを加え合計16chにしてみました。 実機では、まだ検証していませんがソフト上ではエラーは発生していません。 その他、改善点なども有りましたら、ご教授お願い致します。 皆様、よろしくお願い致します。 // Date and time functions using a DS1307 RTC connected via I2C and Wire lib #include <Wire.h> #include "RTClib.h" #include <SD.h> #define readButton 16 #define CS 10 RTC_DS1307 RTC; char buffer[40]; File myFile; void setup () { Serial.begin(57600); Serial.print("Initializing SD card..."); pinMode(CS, OUTPUT); pinMode(readButton, INPUT); if (!SD.begin(CS)) { Serial.println("initialization failed!"); return; } Serial.println("initialization done."); Wire.begin(); RTC.begin(); RTC.sqw(1); //0 Led off - 1 Freq 1Hz - 2 Freq 4096kHz - 3 Freq 8192kHz - 4 Freq 32768kHz if (! RTC.isrunning()) { Serial.println("RTC is NOT running!"); // following line sets the RTC to the date & time this sketch was compiled RTC.adjust(DateTime(__DATE__, __TIME__)); } } void loop () { DateTime now = RTC.now(); sprintf(buffer, "%02d/d/%d d:%02d:%02d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d", now.day(), now.month(), now.year(), now.hour(), now.minute(), now.second(), digitalRead( A1 ), digitalRead( A2 ), digitalRead( A3 ),digitalRead( A4 ), digitalRead( A5 ), digitalRead( A6 ), digitalRead( A7 ),digitalRead( A8 ), digitalRead( A9 ), digitalRead( A10 ), digitalRead( A11 ),analogRead( A0 ), analogRead( A1 ), analogRead( A2 ), analogRead( A3 )); Serial.println( buffer ); myFile = SD.open("dati.log", FILE_WRITE); if (myFile) { myFile.println(buffer); myFile.close(); } else { Serial.println("error opening dati.log"); } if ( digitalRead( readButton ) == HIGH ) { Serial.println(" "); Serial.println("Log Reading Saved ----------- "); Serial.println(" "); myFile = SD.open("dati.log"); if (myFile) { while (myFile.available()) { Serial.write(myFile.read()); } myFile.close(); } delay( 5000 ); } delay(1000); }

  • ARDUINOで5つのLEDをそれぞれ点滅させたり、フェードインさせた

    ARDUINOで5つのLEDをそれぞれ点滅させたり、フェードインさせたりしたい!! ARDUINO初心者です。5つのLEDをそれぞれ上記の様に制御したいと思っています。点滅は点灯、消灯が一定の点滅ではない効果を持たせたく、5つのLEDのうち、2つはフェードインフェードアウトで蛍のような効果にしたいと思っております。 以下、途中まで3つのLEDで試行錯誤してスケッチを構築したのですが、なかなかこれ以上、前へすすみません。 まず、このスケッチでの第一関門はプログラムの並列処理ができない、ということでした。 int ledPina = 9; int ledPinb = 10; int ledPinc = 11; void setup(){ pinMode(ledPina, OUTPUT); pinMode(ledPinb, OUTPUT); pinMode(ledPinc, OUTPUT); //LedPin a b cを出力に設定。 } void loop() { digitalWrite(ledPina, HIGH); // aのLEDをオン delay(500); //待機 digitalWrite(ledPina, LOW); //aをオフ delay(500); digitalWrite(ledPinb, HIGH); // bのLEDをオン delay(800); // 待機 digitalWrite(ledPinb, LOW); //bをオフ delay(300); digitalWrite(ledPinc, HIGH); // cのLEDをオン delay(100); // 待機 digitalWrite(ledPinc, LOW); //cをオフ delay(50); } おわかりの方、いらっしゃいましたら、お教え願えますでしょうか? よろしくお願い致します!!

  • Arduino elseで止まりifへ進まない

    Nゲージ、Arduino共に初心者です。 図のようにレールは環状で列車の底にマグネット、レール上にリードスイッチを配置。スケッチは下記を試しました。 int PWMpin1 = 6; //環状レール int PWMpin2 = 5; void setup(){ pinMode(9,INPUT); //リードスイッチ } void loop() { if(digitalRead(9)==HIGH){ //スイッチ感知 //停車 analogWrite(PWMpin1, 0); analogWrite(PWMpin2, 0); delay(4000); } else { analogWrite(PWMpin1, 0); //右回り中速 analogWrite(PWMpin2, 100); delay(5000); //ifが効かなくなる? analogWrite(PWMpin1, 0); //右回り低速 analogWrite(PWMpin2, 40); } } これを試すと減速されずリードスイッチでも停車せず走り続けるだけです。 スケッチの delay(5000); を消すと減速した速度で進みリードスイッチで4秒間停車はします。 スタートしてから5秒後に減速してリードスイッチで4秒停車させたいのですがどうしたら宜しいでしょうか? 減速することが目的ではなく図にはありませんがスタート5秒後にポイントAを切替、リードスイッチに着いたらポイントBを切換えたいと思ってますがその前に上記がわからず困っています。 どなたか宜しくお願いします。

  • arduinoについて

    7セグledとボタンを使って、エレベーターの階数表示をさせる回路とプログラムを作っていてプログラムはある程度かけているのですがうまくいきません。何が足りないのでしょうか? プログラムは以下の通りです。 {#define LED_A 6 #define LED_B 7 #define LED_C 8 #define LED_D 9 #define LED_E 10 #define LED_F 11 #define LED_G 12 #define LED_DP 13 #include <Servo.h> Servo servo; int button1 = 5; int button2 = 4; unsigned long buttonGap ; void setup() { pinMode(LED_A, OUTPUT); pinMode(LED_B, OUTPUT); pinMode(LED_C, OUTPUT); pinMode(LED_D, OUTPUT); pinMode(LED_E, OUTPUT); pinMode(LED_F, OUTPUT); pinMode(LED_G, OUTPUT); pinMode(LED_DP, OUTPUT); pinMode(5, OUTPUT); pinMode(4, OUTPUT); servo.attach(11); } void loop() { digitalWrite(LED_A, HIGH); digitalWrite(LED_B, LOW); digitalWrite(LED_C, LOW); digitalWrite(LED_D, HIGH); digitalWrite(LED_E, HIGH); digitalWrite(LED_F, HIGH); digitalWrite(LED_G, HIGH); digitalWrite(LED_DP, HIGH); digitalWrite(LED_A, LOW); digitalWrite(LED_B, LOW); digitalWrite(LED_C, HIGH); digitalWrite(LED_D, LOW); digitalWrite(LED_E, LOW); digitalWrite(LED_F, HIGH); digitalWrite(LED_G, LOW); digitalWrite(LED_DP, HIGH); servo.write(180); delay(2000); servo.write(0); delay(2000); } void switchLights() { digitalWrite(LED_A, HIGH); digitalWrite(LED_B, LOW); digitalWrite(LED_C, LOW); digitalWrite(LED_D, HIGH); digitalWrite(LED_E, HIGH); digitalWrite(LED_F, HIGH); digitalWrite(LED_G, HIGH); digitalWrite(LED_DP, HIGH); delay(4000); digitalWrite(LED_A, LOW); digitalWrite(LED_B, LOW); digitalWrite(LED_C, HIGH); digitalWrite(LED_D, LOW); digitalWrite(LED_E, LOW); digitalWrite(LED_F, HIGH); digitalWrite(LED_G, LOW); digitalWrite(LED_DP, HIGH); delay(5000); }

専門家に質問してみよう