2017年5月11日 星期四

在r-pi上用pd接受arduino訊號


嗨我是北藝大的vanlan,今天的課堂教學是pi+pd+arduino

如果你的pi還沒有裝arduino,請在終端機輸入 $ sudo apt-get install arduino
然後可以先隨便燒一個程式進去測試

我們要幫pd安裝一個可以
在/home/pi底下建立一個資料夾“pd-externals”,再建一個資料夾“deke-plugin”,放入外掛檔案deke-plugin.tcl
( /home/pi/pd-externals(自己建)/deken-plugin(自己建)/deken-plugin.tcl )

裝好後,pd的Help底下就會多了Find externals的選項
並且在pd視窗會出現如下圖第一行的字樣

打開receive.pd檔會多跳出兩個錯誤訊息,代表缺少程式中的這兩個library:comport,moocow

進到Find externals,安裝pdstring(選第二個)和comport(選第一個) 


成功安裝的話,重新打開pd時comport的錯誤就會消失了
並且在Help-Browser裡面可以看到pdstring/跟comport/
這些東西的安裝檔案路徑會在pi的usr/lib/pd/extra

由於這次不使用moocow的library而是改用pdstring,所以我們要改一下pd的程式
打開receive.pd,快點兩下pd arduino2pd

會出現另一個視窗,程式如下

如果在電腦中,直接使用上方程式就可以了
(尚未安裝moocow的library要記得補安裝!)
而在pi中,這裡有兩個地方要修改:
1. 把"moocow/" 刪除只留下bytes2any
2. 在旁邊新增一個物件[pdstring]

這樣pd就可以接收來自arduino的訊號了

receive.pd 下載 
deken-plugin.tcl 下載 


arduino寫法如下:


















void setup()
{
Serial.begin(9600);
}
void loop()
{

Serial.print("\t");
Serial.print("melody");
Serial.print(" ");
Serial.println(100);
Serial.print("\t");

Serial.print("\n");
delay(500);
}


其中兩個Serial.print("\t")所包住的內容就是會傳到pd的訊號
上述pd內容中,pd arduino2pd的程式就是在判斷這樣形成一個封包

pd的主程式中加入[route +訊號名稱]
例如[route melody]。則在arduino中Serial.print("\t")下行寫Serial.print("melody")
後面的Serial.println(100)指定了傳送的數值,當然100也可以用變數代換

上圖中Serial.println("L 11 22")意思是:訊號名稱L,帶有11,22兩個數字訊號
所以pd的[route L]下方接了[unpack f f],將訊號解封包成兩個float(浮點數)