Arduino Ameba Serial - 1

收錄於 關於 Ameba 的 一百篇



Arduino 的串列埠, 是源自於 RS232

初使用 Ameba 的時候或許會覺得奇怪, 因為他不像一般的串列埠,
有個 DE-9 的 connector, 而是 USB 接線.

這是因為 Ameba 透過 DAP 做了 USB 轉 serial port 的動作.
類似目前 筆記本 並沒有 serial port, 而通常得買條 usb 轉 serial 線.
https://24h.pchome.com.tw/store/DCAC16

而 Arudino 內建的 Serial 也是如此. 通常會透過一顆 FTDI 或 CH340G IC,
來做 usb 和 serial 間的轉換. 也因此, 其實 baud rate 在 usb driver 上是虛擬的,
設定並沒有影響..

----

Arduino Serial write

在 檔案->範例->04. Communication 中, 有一個 ASCII table
這邊介紹了 Serial 輸出 API 如何使用.

Arduino Serial Read

可以參考這個 example

於是我們可以寫一個很簡單的 Echo 程式.

---

int incomingByte = 0;

void setup() {
  //Initialize serial and wait for port to open:
  Serial.begin(9600);
  while (!Serial) {
    ; // wait for serial port to connect. Needed for native USB port only
  }

  // prints title with ending line break
  Serial.println("ECHO program");
}

void loop() {
    if ( Serial.available() > 0 ) {
      incomingByte = Serial.read();

      Serial.write(incomingByte);
    }
}
--
接著在 PC 上, 執行相關 serial terminal 程式.
e.g. MAC

(1) 看 terminal device file 是哪一個


(2) 執行 terminal -> screen 程式


    $ screen /dev/cu.usbmodem1462

   


這樣簡單的一個 echo 程式就有了. 
但會發現沒辦法跳行 ...

---
這其實是因為處理的問題. 我們稍稍修改程式

加入判斷 如果是 '\r' 就多輸出跳行 '\n'



執行看看 : 

可以跳行了. 


----

就有些可以玩了. 

鈴聲: 0x7 

接下來我們先簡單試一下 BBS 常見的 ANSI/V100 code. 
這是很早 1989 年定的 ANSI X3.64 







ESC[Ps;..Psm 設定字元之屬性及顏色(限彩色卡)

                  Ps=0   , 屬性 Normal

                  Ps=1   , 高亮度

                  Ps=2   , 低亮度

                  Ps=5   , 閃爍屬性

                  Ps=7   , 反相顯示

                  字元顏色 (前景)

                  Ps=30  , 黑色字  Ps=31  , 紅色字

                  Ps=32  , 綠色字  Ps=33  , 黃色字

                  Ps=34  , 藍色字  Ps=35  , 紅紫字

                  Ps=36  , 藍青字  Ps=37  , 白色字

                  背景顏色

                  Ps=40  , 黑色字  Ps=41  , 紅色字

                  Ps=42  , 綠色字  Ps=43  , 黃色字

                  Ps=44  , 藍色字  Ps=45  , 紅紫字

                  Ps=46  , 藍青字  Ps=47  , 白色字




VT100是很早以前的, 新的
如果 terminal 程式有支援, 還可以透過 ANSI 指定 RGB 顏色. 

----

const int bell = 7;
const int esc = 0x1B;

// 清除螢幕
void term_clear(void)
{
      Serial.write(esc);
      Serial.print("[2J");  
}

// 綠底紅字
void term_set_color(void)
{
      Serial.write(esc);
      Serial.print("[0;31;42m");
}

// 游標移動
void term_cursor_move(int x, int y)
{
      Serial.write(esc);
      Serial.print("[");
      Serial.print(x);
      Serial.print(";");
      Serial.print(y);
      Serial.print("H");
}

void setup() {
  ...

  term_clear();
  term_cursor_move(10,10);
  term_set_color();
  Serial.print("ECHO program");
}




我們做一個簡單的綠底紅字, 游標移到 10,10 位置, 每次開始前清除



可以發現, 如果游標可以移動, 
就能進一步做一些變化, 像簡單的小遊戲... 

----

這就是一個簡單的 GUI 
感覺這可以應用在很多地方呢. 事實上很早之前, 
在 2009 年時, 的確就有人在 Arduino 上, 
porting 一個 ANSI term library.


並且有操作影片, 下回有機會, 也把它 porting 進來用用看. 

( 這個 qrptracker 本身就是很有趣的一個 Arduino 衛星追蹤器 

  文-便攜式衛星跟蹤器 DIY


  文-這些年我所用的免費開源 tracker

)



PS1: 鈴聲還是 ADC 接個 speaker 來做能有更多變化... 
PS2: 透過 UART 傳輸 binary data, 如 ZMODEM, 也是另一塊可以玩的...



留言

熱門文章