2013年10月8日 星期二

Arduino與PC的通訊 (Serial.begin)

上一篇「在LabVIEW之中連結Arduino (二) by VISA」中用到Arduino的Serial語法。
所以我就找了一下Arduino序列通訊的語法整理在這一篇之中。

最主要的有四個指令:

Serial.begin ( ) - 開啟 Serial Port 並設定通訊速率 (baud rate)

Serial.print ( ) - 傳送資料到外部電腦
Serial.read ( ) - 接收來自外部電腦的資料
Serial.available ( ) - 取得 Serial Port 可讀取的資料位元組數目 (number of bytes),如果 Serial port 有資料進來,Serial.available ( ) 會回傳大於 0 的數值。

而我們主要的目標就是希望可以從Arduino傳資料到PC去,也可以從PC傳資料到Arduino來。
以下有三個範例來試試。

1. 將Arduino的值傳到 PC (Arduino >> PC)
如下圖接一個可變電阻來進行測試,
然後在Serial Moniter (紅色箭頭指的地方)查看在量測到的數值。
更進一步就可以參考「在LabVIEW之中連結Arduino (二) by VISA」
把這個資料傳到LabVIEW去處理。



Code
       void setup ( ) {
         Serial.begin(9600);
       }
       void loop() {
         int val = analogRead( 3 );      // 把Pin 2讀到的值寫入val的參數裡
         Serial.println(val);                  // 把參數 val 的值傳出去
       }


2. 將PC的值傳到Arduino (PC >> Arduino)
除了傳回到PC端,也希望可以由PC端傳到Arduino上。
這個範例就運用LCD來顯示由PC端輸入的字元。
LCD銀幕的用法與接線請參考:Arduino: 使用 16x2 的 LCD 銀幕

Code
       #include <LiquidCrystal.h>
       LiquidCrystal lcd(12, 11, 5, 4, 3, 2);
       void setup() {
         Serial.begin(9600);
         lcd.begin(16, 2);      // 定義LCD大小
       }
       void loop() {
         char Nums[10];
         if(Serial.available () > 0) {
           lcd.clear () ;
           lcd.print("Data = ");   // 顯示字元
           lcd.setCursor(7, 0);
           Serial.readBytes(Nums,10);  
           lcd.print (Nums); 
         }
       }

操作的方式如下圖,打開Serial Monitor,在最上方輸入要顯示的文字,再按Send。
就會在LCD上顯示電腦上輸入的文字。



3. 用PC控制Arduino,以決定動作的Case
當我們可以從PC端輸出之後,更進一步地是輸出代號,Arduino就進入Case之中,
如此就可以在Case之中建立我們要的程式。

Code
       void setup() {
         Serial.begin(9600);
         for (int ledPin = 2; ledPin <= 4; ledPin++) {
           pinMode(ledPin, OUTPUT);
         }      
       }
       void loop() {
         if (Serial.available() > 0) {  // 檢查是否有資料可供讀取
           int data = Serial.read();    // 讀取進來的 byte
           switch (data) {            // 根據收到的字元決定要打開哪顆 LED
           case '1':   
             digitalWrite(2, HIGH);
             break;
           case '2':   
             digitalWrite(3, HIGH);
             break;
           case '3':   
             digitalWrite(4, HIGH);
             break;
           default:
             for (int thisPin = 2; thisPin <= 6; thisPin++) {
               digitalWrite(thisPin, LOW);      // 關掉所有的 LED
             }
           }
         }
       }

結論:
了解了這些通訊方式,可以更方便我們操作卡片,甚至與其它軟體的結合。

7 則留言:

  1. 我想問一下,假如我想把心跳模組的serial數值儲存或拿來利用顯示在arduino的tft螢幕上可以怎麼做?

    回覆刪除
    回覆
    1. 您可以參考這一篇
      http://ming-shian.blogspot.tw/2013/09/arduino-lcd.html
      把您 Serial 的數值定義好之後,再叫 lcd 顯示出來

      刪除
    2. 謝謝,但是我如果是用tft的觸控螢幕,是不是還要看看他的開源代碼有沒有支援

      刪除
    3. tft的觸控螢幕我是沒有使用過,不過你可以參考以下網頁,應該對你有些幫助。
      http://www.practicalarduino.com/projects/touch-control-panel

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

    回覆刪除
  3. 能不能讓電腦PC直接呼叫Arduino的傳訊程式
    可以的話是要怎麼實現

    回覆刪除
  4. ming大哥你好,請問我想用labview寫個程式跟arduino做通訊,去控制步進電機,旦通訊上有overloading的問題,想透過visa去控制。
    請問您這個方式是將程式碼燒製arduino板上,再用labview送一個數值進去,arduino就會跑case裡面的動作嗎?
    我想用步進馬達的函數庫,配合你的方法控制步進馬達,請問你覺得可行嗎?
    best regard.

    回覆刪除