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 程式
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 程式.
---
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
)
( 這個 qrptracker 本身就是很有趣的一個 Arduino 衛星追蹤器
文-便攜式衛星跟蹤器 DIY
文-這些年我所用的免費開源 tracker
)
PS1: 鈴聲還是 ADC 接個 speaker 來做能有更多變化...
PS2: 透過 UART 傳輸 binary data, 如 ZMODEM, 也是另一塊可以玩的...
留言
張貼留言