2016年11月27日 星期日

Ardulink - Arduino的Java控制方案

Ardulink是一個開源Arduino的Java解決方案,提供了使用Java來控制Arduino的方法,讓Java操作Arduino版子變的更簡單,其源裡是先再Arduino上寫入程式,用來監聽從序列阜(Serial Port)上傳來的指令並做相應的操作、也用序列阜傳回相應的回應,序列阜的連接方式用到了之前文章"用Java與Arduino的序列阜溝通(使用RXTX)"講到的RXTX,而Java就用包好的API來對Arduino送指令。

要使用Ardulink,可以先到Ardulink的下載頁下載,會得到一個壓縮檔,找個位置解壓縮後就可以開始進行Ardulink的Java範例,LED閃光(BlinkLED),下面講解詳細步驟:
  1. 下載Ardulink並解壓縮以後,可以看到如下的檔案結構。
    我們會需要用到的有"winDLLs"及"lib"資料夾。
    打開winDLLs,可以看到32bit和64bit兩個資料夾,依自已需求選擇打開資料夾後可以再看到三個檔案:LibusbJava.dll、RXTXcomm.jar、rxtxSerial.dll
    LibusbJava.dll及rxtxSerial.dll是Java使用JNI要用的檔案。
    RXTXcomm.jar是Java要引入lib的其中一個檔案。
    lib資料夾裡的檔案是要給Java要引入的lib。
    而在bin資料夾裡面,放了兩個bat檔,其內容就只是幫忙把LibusbJava.dll、RXTXcomm.jar、rxtxSerial.dll放到lib資料夾而已。
    為了之後方便且起,在這裡我也把LibusbJava.dll、RXTXcomm.jar、rxtxSerial.dll通通放到lib資料夾。
  2. 接著是Arduino這端,我們必需要先再Arduino版子上寫入Serial Port溝通相關的程式,打開sketches資料夾,可以看到許多角本,這邊選擇ArdulinkProtocol裡的ArdulinkProtocol.ino執行就好,當然如果有相應的版子也可以選擇相應的角本,例如Digispark可以選擇ArdulinkProtocol4Digispark。
    需要注意的是,也為不同型號的版子有些許不同,例如Arduino Due目前沒支援tone()和noTone()這兩個函式,所以要稍微修改角本,因為我使用的是Arduino Due,為了簡單測試方便,就先把用到tone()和noTone()的指令先注解掉。
  3. 再來是Java這端,這裡以Eclipse Neon IDE及jdk1.8.0_05為例,檔案結構如下,
    BlinkLED是我們的主程式,用來控制Arduino的LED燈開闗(第13號PIN),先把剛剛lib資料夾裡的jar檔及RXTXcomm.jar引入library中。
    接著設定專案的Native library location,路徑為LibusbJava.dll、rxtxSerial.dll所在的路徑。
    BlinkLED.java的內容如下(參考https://github.com/Ardulink/Ardulink-2),作用為一秒亮、一秒暗Arduino板子的LED燈(Pin 13)。
    import java.io.IOException;
    import java.util.concurrent.TimeUnit;
    
    import org.ardulink.core.Link;
    import org.ardulink.core.Pin;
    import org.ardulink.core.Pin.DigitalPin;
    import org.ardulink.core.convenience.Links;
    
    public class BlinkLED {
    
     public static void main(String[] args) {
          Link link = Links.getDefault();
             DigitalPin pin = Pin.digitalPin(13);  //這裡13 pin是板子的LED燈
             boolean power = true;
             while (true) {
                 System.out.println("Send power:" + power);
                 try {
                  //swicthDigitalPin()為數位輸出,對應了Arduino的digitalWrite()
         link.switchDigitalPin(pin, power);  
         power = !power;
                  TimeUnit.SECONDS.sleep(1);  //1秒亮、1秒暗
        } catch (IOException | InterruptedException e) {
         // TODO Auto-generated catch block
         e.printStackTrace();
        }             
             }
     }
    }
    
  4. 執行BlinkLED.java後,應該就可以看到Arduino板子上的LED燈一亮一暗了。
    執行時可能會有下警告訊息,主要是RXTX版本及SLF4J Class衝突等警告,不過並不會影響程式運行,所以可暫且忽略。
    Stable Library
    =========================================
    Native lib Version = RXTX-2.2-20081207 Cloudhopper Build rxtx.cloudhopper.net
    Java lib Version   = RXTX-2.1-7
    WARNING:  RXTX Version mismatch
     Jar version = RXTX-2.1-7
     native lib Version = RXTX-2.2-20081207 Cloudhopper Build rxtx.cloudhopper.net
    SLF4J: Class path contains multiple SLF4J bindings.
    SLF4J: Found binding in [jar:file:/C:/Users/Administrator/Downloads/ardulink/lib/slf4j-jdk14-1.7.12.jar!/org/slf4j/impl/StaticLoggerBinder.class]
    SLF4J: Found binding in [jar:file:/C:/Users/Administrator/Downloads/ardulink/lib/slf4j-log4j12-1.7.5.jar!/org/slf4j/impl/StaticLoggerBinder.class]
    SLF4J: See http://www.slf4j.org/codes.html#multiple_bindings for an explanation.
    SLF4J: Actual binding is of type [org.slf4j.impl.JDK14LoggerFactory]



附注:
Ardulink有做一個UI介面可以跟Arduino板子作連接並控制(ardulink-console-2.0.1.jar),放在下載下來的 lib/ardulink-console-2.0.1.jar,在執行set32bitWindowsRXTX.bat或set64bitWindowsRXTX.bat(或自己手動把LibusbJava.dll、RXTXcomm.jar、rxtxSerial.dll丟到lib資料下)後,可以直接開啟ardulink-console-2.0.1.jar,看到如下視窗介面,按下Connect與Arduino連接後,在許多功能可以使用,對於想要測一下Arduino,還不想花太多時間寫程式時是個不錯的工具。

3 則留言 :

  1. 您好:

    我依照您的指示得到下面的結果...
    有用Arduino的程式確認接線正確...


    WARNING: RXTX Version mismatch
    Jar version = RXTX-2.2pre1
    native lib Version = RXTX-2.2pre2
    SLF4J: Class path contains multiple SLF4J bindings.
    SLF4J: Found binding in [jar:file:/C:/Users/User/Desktop/ardulink-V2.1.1-20190517-0752/ardulink/lib/slf4j-jdk14-1.7.12.jar!/org/slf4j/impl/StaticLoggerBinder.class]
    SLF4J: Found binding in [jar:file:/C:/Users/User/Desktop/ardulink-V2.1.1-20190517-0752/ardulink/lib/slf4j-log4j12-1.7.5.jar!/org/slf4j/impl/StaticLoggerBinder.class]
    SLF4J: See http://www.slf4j.org/codes.html#multiple_bindings for an explanation.
    SLF4J: Actual binding is of type [org.slf4j.impl.JDK14LoggerFactory]
    Exception in thread "main" java.lang.IllegalStateException: Waited for arduino to boot but no response received
    at org.ardulink.util.Preconditions.checkState(Preconditions.java:48)
    at org.ardulink.core.serial.rxtx.SerialLinkFactory.waitForArdulink(SerialLinkFactory.java:87)
    at org.ardulink.core.serial.rxtx.SerialLinkFactory.newLink(SerialLinkFactory.java:74)
    at org.ardulink.core.serial.rxtx.SerialLinkFactory.newLink(SerialLinkFactory.java:47)
    at org.ardulink.core.linkmanager.LinkManager$DefaultConfigurer.newLink(LinkManager.java:534)
    at org.ardulink.core.convenience.Links.getLink(Links.java:118)
    at org.ardulink.core.convenience.Links.getDefault(Links.java:56)
    at BlinkLED.main(BlinkLED.java:12)

    回覆刪除
  2. 作者已經移除這則留言。

    回覆刪除
  3. 作者已經移除這則留言。

    回覆刪除