2009-12-08

Scratch and LEGO NXT

前面的文章曾經提到,探奇會接觸WeDo是因為Scratch這個有趣的程式。

當較為深入瞭解Scratch後,發現控制WeDo的方法也非常有趣。

(請參考探奇舊文章:Scratch與WeDo的深入瞭解

也有一些人提問是否可以使用Scratch控制NXT,答案當然是可以的,問題在於如何連接NXT與Scratch。

雖然Scratch開放了原始碼,但是想完全瞭解其中的控制還是一件需要漫長學習的事。

Scratch開發人員也提到目前並沒有支援 LEGO NXT的計畫(探奇想應該是要樂高點頭吧!)

但是可以使用Scratch Connections (這只是一個通稱)。

在Scratch 1.3版就已經提供Scratch對外聯絡的方式,特別是網路時代如此便利,Scratch的專案製作也提供在網路上連結的方法。如此一來Scratch就可以在不同電腦間互相聯絡,進行更多的互動。

詳細情況可以先參考Scratch connections網頁的通訊協定說明。

簡單的說就是利用電腦TCP Socket的功能傳遞訊息,總共有三種方式:

Remote Sensors (遠端感應器)
Broadcast (廣播)
Variables (全域變數)

探奇所採用的方法就是Remote Sensors,原理如下:

NXT -- (Bluetooth) -- python中繼程式 -- (Socket port 42001) -- Scratch

透過python中繼程式,一邊透過Socket與scratch聯繫,一邊以藍牙接收NXT訊號。

Scratch Connections提供的是python及Java範例。

探奇原本選擇使用VB程式開發,後來發現已經有人寫出python的NXT模組,當然就直接採用python(咬牙重新學習中)

實驗結果如下:

在嘉義市一家咖啡簡餐店進行拍攝。



使用Scratch小貓咪做為主角。



測試完畢再來一張合照,哇!貓咪忘了恢復大小。



實際測試使用四個感應器,反應不算快(原因當然是藍牙的問題),不過還可以接受。

觸碰感應器:貓咪旋轉,發出喀喀聲

超音波感應器:貓咪遠近變化(大小不同)

光源感應器:貓咪顏色特效變化

聲音感應器:貓咪造型變化

請參考示範影片,(等待加上影片說明註解)




2 則留言:

  1. jimmynxtlab2:26 上午

    我最近測nxt-python+BYOB(Scratch)+Bluetooth時
    發覺當發送馬達指令時似乎不能同時接收Sensor數值
    改寫成平行緒也無法同時收送

    [版主回覆08/22/2010 11:56:12]您好:

    您與孩子的互動真是不錯!

    我並不是很瞭解Python,所以只有做到傳送感應器讀值, 原本打算控制馬達,還在思考如何讓Scratch發送命令,後來就偷懶沒有繼續研究。

    不知道您的BYOB是自己開發的嗎?還是Scratch Forum那位clintonb的研究?

    我不太清楚他們做的Block內容。

    我的作法純粹只是使用Remote sensors接收NXT感應器讀值,還沒有時間研究使用Broadcast發出命令控制NXT馬達。

    就Python端的NXT direct command程式而言,應該是可以同時接收感應器數值及控制馬達。

    你改寫平行緒是指Scratch程式嗎?如果答案是肯定的話,那麼就得先瞭解BYOB的內容為何。

    (NXT馬達指令,例如都是使用time或Angel控制,在這段時間,藍牙訊號有所延遲。)

    歡迎分享您的成果,也歡迎討論,謝謝!

    回覆刪除
  2. jimmynxtlab2:37 上午

    謝謝您的回覆

    BYOB可以打造自己的Block指令,可以用來隱藏一些複雜的邏輯,否則我家小朋友會沒有耐心
    平行緒是指Python端的Thread,不過我後來改由BYOB/Scratch端統一發號施令(廣播)後就沒問題了

    [版主回覆09/05/2010 13:54:24]你好:

    我以為你使用的是clintonb所開發控制NXT的Block,原來是你自行開發的Block,真是厲害!

    還請不吝分享你的作品,謝謝!

    回覆刪除

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