Arduino 用在產品上太貴?有聽過 CH552G 嗎?
Toby
Toby

話說一個月前我在想到底有甚麼方法可以替 Raspberry Pi 增加一個 Analog Read 的功能,看了網上很多的教學和文章,大致上的方法就只有

  1. 用 ADC 透過 SPI 傳到 Raspberry Pi 的 GPIO
  2. 用 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 的好處在於以下幾點

  1. 內置 USB HID 控制器,不需要外接 USB to Serial 轉接晶片(如 CH340)
  2. 5V Logic Level,可測電壓為 0 – 5v (對應 0 – 255,共 8bit 準確度)
  3. 超級的便宜,大概 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 內會顯示為不明裝置。其步驟為下:

  1. 下載 Zadig ,https://zadig.akeo.ie/
  2. 按著在沒插電的開發板上的 PROG 按鈕(或「下載」按鈕)
  3. 把開發板透過 USB 線連到電腦(注:不能鬆開按鈕)
  4. 等待開發板在「裝置管理員」以「不明裝置」顯示之後才可鬆開
  5. 打開 Zadig,點選 Unknown Device 1,選擇 Install Driver
  6. 第 3 – 5 分鐘(可能更慢,看電腦規格)
  7. 完成之後把開發板拔出,再重新插回去電腦
  8. 裝置管理員會顯示為 COMX (我的話就是 COM7)
完成後的 Zadig 界面
安裝完 driver 的開發板,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 了

我把 P3.2 接到 5V 輸出數值為 255
當然 LED 也正常的亮了(注:這是測試電路,如果要長期接 LED 必須先接 330 Ohm 電阻不然 LED 很快會燒壞)

所以之後開發新的發明品,需要透過 USB 讀取 Analog 資料但是又不需要太強大的 MCU 的時候就可以用它啦!