話說一個月前我在想到底有甚麼方法可以替 Raspberry Pi 增加一個 Analog Read 的功能,看了網上很多的教學和文章,大致上的方法就只有
- 用 ADC 透過 SPI 傳到 Raspberry Pi 的 GPIO
- 用 USB 接一片 Arduino UNO 再透過 Serial 傳送讀取的資料
可是 ADC 需要接到 Raspberry Pi 的 3.3V GPIO,用來量 5V 的 Analog 電壓的話總覺得有點危險,要安全的話要加一片 LLC (Logic Level Converter,5V 轉 3.3V 的),需要的空間又會變更多,而且生產上來也不會特別便宜。
另外第二個方法比較安全(畢竟 USB 的 5V 是直接來自電供的,如果有短路電供會先斷開作保護),但是一片 Arduino (ATmega328)價格一點都不便宜,即使用較便宜的 ATtiny 44 也需要快 10 – 12 港幣一片,如果真的要量產起來一點都不比 ADC + LLC 便宜。
然後剛好我在研究 CH340 的各種版本時,在那間公司的網站不但發現到有一種 CH340 有內置晶振(不用外接,省掉焊接和零件的成本)而且還發現了一種新的 MCU
沒錯,這就是今天的主題:CH552G
於是我便隨便買來了一片開發板,來到之後長這樣,真的好小,跟我前女友的現任男友 ㄐㄐ 差不多大小。
CH552G 的好處在於以下幾點
- 內置 USB HID 控制器,不需要外接 USB to Serial 轉接晶片(如 CH340)
- 5V Logic Level,可測電壓為 0 – 5v (對應 0 – 255,共 8bit 準確度)
- 超級的便宜,大概 5.5 港幣就能買到一片(開發板也只是約 15 港幣一片)
使用 Arduino IDE 對它進行編程
https://github.com/DeqingSun/ch55xduino
上面是這次使用的 Arduino board definition。跟其他的第三方板子一樣,先把它給的 json 檔加入你的 Arduino 設定裡,再在 broad manager 找到 ch5xx 的板子把它加進去。
https://raw.githubusercontent.com/DeqingSun/ch55xduino/ch55xduino/package_ch55xduino_mcs51_index.json
對於全新的開發板,第一件事情就是先安裝 bootloader。詳情教學可以看 Github,但是對於 Windows 用戶在跟著 Github 教學前需要先為 CH552G 安裝 driver,不然在 Windows 內會顯示為不明裝置。其步驟為下:
- 下載 Zadig ,https://zadig.akeo.ie/
- 按著在沒插電的開發板上的 PROG 按鈕(或「下載」按鈕)
- 把開發板透過 USB 線連到電腦(注:不能鬆開按鈕)
- 等待開發板在「裝置管理員」以「不明裝置」顯示之後才可鬆開
- 打開 Zadig,點選 Unknown Device 1,選擇 Install Driver
- 第 3 – 5 分鐘(可能更慢,看電腦規格)
- 完成之後把開發板拔出,再重新插回去電腦
- 裝置管理員會顯示為 COMX (我的話就是 COM7)
燒錄 Bootloader
在開發板寫程式的時候 bootloader 會順便送進去,所以這裡我們先要選好正確的板子(我這片是 CH552)
Pin 的編號就是以開發板上寫的 x10 為準,例如說要控制 P3.0,pin number 則輸入 30,P3.2 則是 32 如此類推。因為我要順便測試 analogRead 跟 USB Serial,所以我把 blink 改成這樣
int val = 0;
// the setup function runs once when you press reset or power the board
void setup() {
// initialize digital pin LED_BUILTIN as an output.
pinMode(30, OUTPUT);
pinMode(32, INPUT);
}
// the loop function runs over and over again forever
void loop() {
digitalWrite(30, HIGH); // turn the LED on (HIGH is the voltage level)
delay(1000); // wait for a second
digitalWrite(30, LOW); // turn the LED off by making the voltage LOW
delay(1000); // wait for a second
val = analogRead(32);
USBSerial_print("Analog Read: ");
USBSerial_println(val);
}
如果是第一次上傳,COM port 的部分可以不用選,直接點 Arduino 的「上傳」即可。
之後上傳之後 CH552G 會自動斷開再連接,之後打開 Serial Monitor 到 115200 baudrate 你就能看到 Serial Output 了
所以之後開發新的發明品,需要透過 USB 讀取 Analog 資料但是又不需要太強大的 MCU 的時候就可以用它啦!