Robofun 機器人論壇

標題: 紅外線感測器 偵測的問題 [打印本頁]

作者: 40123223    時間: 2014-12-18 15:34
標題: 紅外線感測器 偵測的問題
本帖最後由 40123223 於 2014-12-18 16:00 編輯

使用arduino uno
現在不知道是紅外線感測那顆有問題
還是程式有問題
現在的狀況是有時候會正常執行柵欄升起放下的程序
大部分都是燈號紅綠亂閃,伺服馬達就一下一下動而已

我們這個東西的目的是一個人流控制的柵欄
當紅燈亮起,柵欄放下擋住行人;綠燈亮起,柵欄升起讓行人通行
考慮到沒有人,它還是自己一直在那邊升起放下
所以加了一顆紅外線感測器,當偵測到人進入升起放下的程序
然後沒有偵測到人時,紅燈亮著,柵欄維持在放下的位置

電路圖


程式碼
  1. #include <Servo.h>

  2. Servo myservo;
  3. int pos = 0;
  4. int redpin = 12;
  5. int bluepin =13;
  6. int val;
  7. const int PIRSensor = 2;  // 紅外線動作感測器連接的腳位
  8. int sensorValue = 0;  //紅外線動作感測器訊號變數

  9. void setup()
  10. {
  11.   myservo.attach(9);
  12.   pinMode(PIRSensor, INPUT);
  13.   pinMode(redpin, OUTPUT);
  14.   pinMode(bluepin, OUTPUT);
  15. }

  16. void loop()
  17. {
  18.    sensorValue = digitalRead(PIRSensor);

  19.    if(sensorValue == HIGH) //當偵測到行人時進入程序
  20.   {

  21. digitalWrite(12, HIGH);
  22. delay(15);

  23.    for(pos=0;pos<90;pos+=1)

  24.   {
  25.       myservo.write(pos);
  26.       delay(15);
  27.      }
  28. delay(5000);


  29.   digitalWrite(12, LOW);
  30.   delay(15);

  31.   digitalWrite(13, HIGH);
  32.   delay(15);

  33.       for(pos=90;pos>=0;pos-=1)
  34.        {                              
  35.        myservo.write(pos);
  36.        delay(15);
  37.        }
  38.   delay(5000);
  39.   digitalWrite(13, LOW);  
  40. }
  41. else {digitalWrite(12, HIGH);  digitalWrite(13, LOW); digitalWrite(9, LOW);}
  42. }
複製代碼

作者: vegewell    時間: 2014-12-19 02:35
回復 1# 40123223


也許arduino 供給 伺服馬達的電力很小所致,
作者: ates1687    時間: 2014-12-19 13:14
回復 1# 40123223


    我問一個很"笨"的問題

紅外線感測器請問是類比的還是數位的輸出

就像麥克風感測器類比數位都有,數位就加個"比較器",當高於某個數值=1當低於某個數值=0
類比就直接抓數值,你的紅外線使否有這樣的功能?
作者: 40123223    時間: 2014-12-19 18:35
回復 2# vegewell


   我把紅外線感測器拿掉,就是if else拿掉,馬達可以正常作動
不過講到這個,如果我們實際要掛上柵欄,
伺服馬達應該就轉不動了,
這個問題不知道怎麼解決,
我們伺服馬達用模型用的那種而已
作者: 40123223    時間: 2014-12-19 18:38
回復 3# ates1687


我不太知道耶東西都實驗室拿的所以跟腳位有關係嗎!?
作者: ates1687    時間: 2014-12-19 23:10
回復 5# 40123223


    = =怎麼會沒有關係,假設你寫的是數位判斷方法是0101,紅外線給你的是類比0~1028,
變成他會亂動!還有你說你從實驗室拿的八成是距離判斷的紅外線,而非人體感測的紅外線,
你要宣告監控式窗看看紅外線丟給你什麼數值!!你才能去做判斷!
作者: 40123223    時間: 2014-12-22 15:47
本帖最後由 40123223 於 2014-12-22 15:54 編輯

回復 6# ates1687


我剛剛看一下,那顆是PIR,
我找了網路上的範例來測試
然後我監控數值,它都一直跑1
我把訊號端線拔掉,數值還是一直跑1
這樣我是不是可以合理懷疑那顆壞了呀
PIR訊號端我是接數位腳位2,應該沒錯吧!?
其實軟硬體都不是很瞭解...
感謝指點了!!

這是我找到的程式

  1. /*
  2.   PIR("Passive Infrared Sensor") Motion Sensor,
  3.   紅外線動作感測器, 或稱人體紅外線感測器
  4. */

  5. const int PIRSensor = 2;     // 紅外線動作感測器連接的腳位
  6. const int ledPin =  13;      // LED 腳位

  7. int sensorValue = 0;         // 紅外線動作感測器訊號變數

  8. void setup() {
  9.   pinMode(PIRSensor, INPUT);     
  10.   pinMode(ledPin, OUTPUT);   
  11.    Serial.begin(9600);   
  12. }

  13. void loop(){
  14.   // 讀取 PIR Sensor 的狀態
  15.   sensorValue = digitalRead(PIRSensor);
  16.    Serial.println(sensorValue);
  17.   // 判斷 PIR Sensor 的狀態
  18.   if (sensorValue == HIGH) {     
  19.     digitalWrite(ledPin, HIGH);  // 有人開燈
  20.   }
  21.   else {
  22.     digitalWrite(ledPin, LOW);   // 沒人關燈
  23.   }
  24. }
複製代碼

作者: ates1687    時間: 2014-12-22 21:23
回復 7# 40123223

我這邊提一個問題,請問測試的時候 你是否曾經"蓋上箱子"測試= =?

就是用一個黑色的箱子把整個紅外線感測器罩住?

如果整個罩住=0就是正常,如果=1,那就是不正常!先試試看~
作者: 40123223    時間: 2014-12-27 17:30
回復 8# ates1687


有的,它還是一直跑1
另外想請問如果要讓馬達足以舉起柵欄,約1公斤
有要哪種馬達比較適合,是不是馬達就要外接電源了
感謝解答!!
作者: ates1687    時間: 2014-12-27 19:20
回復 9# 40123223

那八成那顆應該是壞掉了,致於要舉起1kg的話,你要找扭力大一點的伺服馬達,
上沒屋頂拍賣,打"伺服馬達",第一個48元,扭力1.8KG差不多就可以

還有如果你柵欄的材質有點重的話,要算一下物理力學的"力矩",因為柵欄越長
軸心轉動的力量就要越大,不是說柵欄一公斤就需要一公斤這樣,
打個比方你握住一根木桿時舉起來的時候,中間一定是最輕的,
但是如果是握兩邊末端的話一定是最重,所以你的手腕相當於你的馬達的扭力
要舉起來要花更多的力氣!
作者: 40123223    時間: 2014-12-27 20:27
回復 10# ates1687

ok! 那我大概瞭解了
力矩計算這方面應該還ok,算是本科系的哈哈
那假設我買那顆1.8kg扭力的伺服馬達
這樣是不是電源要另外接6V,就訊號端接到arduino而已
非常感謝你的熱心解答!!
作者: ates1687    時間: 2014-12-27 22:00
回復 11# 40123223


    接5V就好(用arduino的5V),超過6V的話,你會聞到一股鐵鏽味
工作電壓代表允許範圍,但未必是電壓剛好6V,扭力就一定會比5V強!
作者: cc1357    時間: 2022-3-13 18:28


谢谢楼主分享




歡迎光臨 Robofun 機器人論壇 (https://robofun.net/forum/) Powered by Discuz! X3.2