2011年1月27日 星期四

Arduino 筆記 – Lab17 使用光敏電阻控制 Servo

實驗目的

練習用光敏電阻控制伺服馬達(Servo motor)。以兩顆光敏電阻做一個簡單的光源追蹤系統,當發現左邊比較亮時,就控制伺服馬達旋轉到左邊,當發現右邊比較亮時,就控制伺服馬達旋轉到右邊。

image_thumb1 image_thumb8

讀者必備知識

為了順利進行本項實驗,你必須先知道底下這些基礎知識:

  1. 認識光敏電阻。相關資訊可參考「Lab8 使用光敏電阻控制 LED 的開關」一文。
  2. 知道如何控制伺服馬達。相關資訊可參考「Lab16 使用可變電阻控制伺服馬達」一文。
材料
  • 麵包板 x 1
  • Arduino 主板 x 1
  • 光敏電阻(photocell) x 2
  • 伺服馬達(Servo Motor) x 1
  • 10k ohm 電阻 x 2
  • 單心線 x N
接線

伺服馬達有三條線,電源(紅線)、接地(黑線),以及訊號線。

image_thumb9

  • 伺服馬達紅線接到 +5v,黑線接到 GND,訊號線接到 pin 9
  • 左手邊的光敏電阻一支腳接到 5V,另一支腳串接一顆 10k 電阻接到 analog pin 0
  • 右手邊的光敏電阻一支腳接到 5V,另一支腳串接一顆 10k 電阻接到 analog pin 1

image

下圖是本實驗的接法,為了判斷哪一邊光線比較強,所以稍微折彎了兩顆光敏電阻,讓它一顆往左彎,另一顆往右彎:

image

電路圖

image

程式碼

版本一(PhotocellServo.pde): 底下是這個簡單光源追蹤系統的程式碼,程式的邏輯是,當發現左邊比較亮時,就控制伺服馬達旋轉到左邊(旋轉到 0 度),當發現右邊比較亮時,就控制伺服馬達旋轉到右邊(旋轉到 180 度)。程式同時把左右兩顆光敏電阻的讀值印到了 Serial port,到時就可以用 Serial Monitor 觀察光敏電阻數值的變化。

編譯這支程式,然後上傳到 Arduino,接著打開 Serial Monitor 就可以看到左右兩顆光敏電阻數值的變化:

image 

底下是示範影片:

版本二(PhotocellServoV2.pde): 這個版本增加一個功能,當左右兩邊光敏電阻光線相差不多時,就控制伺服馬達讓它旋轉到 90 度。

動動腦

光敏電阻加上伺服馬達,像這樣的組合可以應用在哪些地方呢?

延伸閱讀

13 則留言:

  1. 你好,想請問關於第一個程式碼以及第二個程式碼的19行:
    int readingLeft, readingRight、 int readingLeft, readingRight, difference 這樣寫是甚麼意思呢?如果沒有這一行,會有甚麼影響呢?

    回覆刪除
  2. int readingLeft, readingRight, difference;

    這行是宣告 3 個 int 的變數,readingLeft 是用來儲存左邊光敏電阻的讀值,readingRight 是用來儲存右邊光敏電阻的讀值,而 difference 則是左邊跟右邊光敏電阻的差值。

    C/C++ 還有 Arduino 程式的變數,在使用前都要事先宣告變數的型別,如果沒有這一行的話,程式就不能通過編譯囉。

    回覆刪除
  3. 這張電路圖是不是畫錯了?
    SensorLeft怎直接拉到GND?

    回覆刪除
  4. 沒有啊,SensorLeft 有接一顆 10k 電阻,沒有直接拉到 GND 啊。哇~ pizgchen 我每一篇文章你都看啊!哈,你太捧場了,謝謝。

    回覆刪除
  5. 請您仔細看一下, 是線條那一張電路圖畫錯了,麵包板那一張圖是對的.
    呵~~是啊...我是您的超級大粉絲...您的每一篇文章我都看了.

    回覆刪除
  6. 真的耶!我電路圖畫錯了,你眼力真好。
    Fritzing 電路圖通常都還需要整理,不然會有點亂,之前為了把電路圖整理得清楚一點,所以我把電路圖位置重新安排,結果沒注意到電阻放錯位置了。謝謝您的提醒。
    太感謝您的捧場了!

    回覆刪除
  7. 我是個初學者,我想寫一個用單一個光敏电阻用來控制Sevro motor,motor可以左右轉動,容易寫出來?請指點?kwtam70@Yahoo.com.hk

    回覆刪除
  8. 你打算怎麼控制?
    比較亮時向某個方向轉,比較暗時向另一個方轉嗎?
    如果是這樣,應該是很簡單的,就:

    if (sensorReading > 512)
    myservo.write(0);
    else
    myservo.write(180);

    當然角度最好要根據光線強度算一下

    回覆刪除
  9. 如果我想用dc relay或者用dc motor來代替servo motor.可以嗎?如果用relay 和dc motor代替servo motor ,程式上要有什麼改變?

    回覆刪除
  10. 要看你想怎麼控制,這篇的控制邏輯是「當發現左邊比較亮時,就控制伺服馬達旋轉到左邊,當發現右邊比較亮時,就控制伺服馬達旋轉到右邊。」也許你可以改成「當發現左邊比較亮時,就打開 relay,當發現右邊比較亮時,就關掉 relay」....

    回覆刪除
  11. 「當發現左邊比較亮時,就控制伺服馬達旋轉到左邊,當發現右邊比較亮時,就控制伺服馬達旋轉到右邊。」也許你可以改成「當發現左邊比較亮時,就打開 relay,當發現右邊比較亮時,就關掉 relay。
    如果我想用以上的功能,程式是否改變(將伺服馬達改為relay)?
    光敏电阻,要用什麼型號和什麼阻值?是否光敏电阻的阻值越小越好?

    回覆刪除
  12. 光敏電阻大部份都可以用啊
    阻值 10k 左右就可以了,阻值愈高讀值會愈大

    回覆刪除

注意:只有此網誌的成員可以留言。