2011-06-04

NXT超音波感應器的一次量測(Ultrasonic Sensor Single Shot)

WRO的比賽陸續展開,大家對於比賽的解題方法及技巧也非常有興趣。

看到陳慶明老師對國小迷宮使用超音波的討論,想到超音波之間互相干擾的問題。

原因是超音波感應器的超音波一直連續發射,在狹窄的空間中反射,會影響其他超音波感應器的接收。

如果能關閉(隨意控制)超音波的發射,應該可以專心接收自己發射的超音波。

在各大論壇中也有許多人討論如何應用各種程式語言設定超音波感應器,例如NXC, RobotC, Java等。

那麼用NXT-G寫程式就束手無策嗎?其實不然,只要有高手提供適當的工具。

讓我想起來在很久以前,Guy Ziv曾經教導大家在NXT-G使用I2C Write Block,直接設定超音波感應器,可以切換成一次測量(Single Shot)。

(I2C Write Block的下載請參考探奇舊文章:重要記錄:MindBOARDS的NXT-G命令方塊資料庫

超音波感應器是一顆數位感應器,透過I2C的通訊協定跟NXT主機溝通,

大家可以參考LEGO MINDSTORMS NXT Hardware Developer Kit的Appendix 7-LEGO MINDSTORMS NXT Ultrasonic Sensor I2C communication protocol。

下面的程式說明:

先用一個命令方塊設定超音波感應器,進入迴圈後,用I2C Write命令設定為一次發射,讀取超音波數值,顯示在NXT主機螢幕,每隔一秒發射一次。

迴圈在按下NXT主機向左鍵後結束,將超音波感應器設定為『連續發射』,發出聲音,等待按下橘色按鍵。




那麼該如何確認超音波是連續發射呢?我沒有儀器可以量測。

探奇用的是一個笨方法:用另一個NXT的超音波感應器去接收。

擋住另外一台超音波感應器的發射端,就能夠接收到其他超音波感應器所發射的超音波。

下圖是I2C Write Block的設定,輸入都是使用十進位值。




歡迎大家一起討論,測試這個功能。


延伸閱讀:童年萬歲的『慎用超音波』以及優勝家機器人教室的『2011WRO國小組的好朋友-超音波感應器』,討論超音波的精度及反應時間。


2 則留言:

  1. 童年萬歲10:33 下午

    沒搞錯的話,NXT-G是很容易關掉超音坡的,只要把那個port用touch sensor讀一次就關掉了,去年的WRO高中組,香港semia的解決方案就是以此來控制RCX馬達,把馬達接再輸入端(因輸出端已用完),用US sensor讀一次就動,用touch sensor讀一次就關掉電力了,所以我相信用touch sensor讀一次超音波那個port,超音波電力被關掉,就啞了。
    "探奇用的是一個笨方法:用另一個NXT的超音波感應器去接收"
    NO,這是正辦的,不是笨方法,我也適用這方法。簡單有效!
    [版主回覆06/05/2011 13:40:07]原來是這樣,謝謝教授的傳授!又學到一招。

    我一直侷限在輸出與輸入的界限,反倒限制自己的想法,到今天才有一點醒悟。

    使用Touch 或其他類比感應器時,NXT主機的輸入端會輸出5V。

    當使用I2C等數位感應器,需要做初始設定的動作(Initialization),NXT主機會變成9V輸出。

    所以可以用輸入端來控制9V馬達,真是厲害!

    那麼一台NXT主機不就可以安裝最多七顆馬達?

    (不知道有沒有其他不良影響?)

    另外想到一點,如果使用超音波Block將輸入端設定為9V,這時插上sound 或Light Sensor,不知道會不會『燒壞』這些類比感應器?

    以前常常提醒小朋友不要將感應器接到輸出端,現在恐怕還得小心電源設定問題。

    還請老師指點,謝謝!


    回覆刪除
  2. 挖~看到密技了,謝謝兩位老師的分享。
    [版主回覆06/05/2011 13:42:15]我也看到密技了!

    回覆刪除

探奇歡迎大家留言討論!謝謝分享你的意見。