USBマイコンCH552TでLチカ&HidKeyboardのサンプルを動作【電子工作】

この記事は [本郷学園マイコン部 Advent Calendar 2023](https://qiita.com/advent-calendar/2023/hongomcc) 23日目の記事です。

## やったこと
8ビットUSBマイコンのCH552Tの環境構築とLチカを行い、さらにHidKeyboardのサンプルを使用してみました。

## 用意したもの
- PC
- [CH552T](https://akizukidenshi.com/catalog/g/g118026/)
- [USBmicroB->DIP変換基板](https://akizukidenshi.com/catalog/g/g106656/)
- [SSOP20->DIP変換基板](https://akizukidenshi.com/catalog/g/g110497/)
- [細ピンヘッダ](https://akizukidenshi.com/catalog/g/g104398/)
- LED、炭素被膜抵抗330Ω、10kΩ
- セラミックコンデンサ0.1μF
- ブレッドボード、線材
- データ転送可能なUSBmicroB-USBA変換ケーブル
- 忍耐力

## 変換基板へのマイコンの実装
[SOP8パッケージの実装](https://qiita.com/ctes091x/items/997995b5bf4dac22a4a0#%E5%9B%9E%E8%B7%AF%E3%82%92%E7%B5%84%E3%82%80)と同様に半田を流し込んで過剰分を後から吸い取りました。パッケージのテープ固定に失敗してマイコンが1個犠牲になりましたが、後日友人(非マイコン部員)がヒートガンを使って再実装してくれました。リフロー最強。

## ブレッドボードへの回路実装
USBの電源と信号線をマイコンに接続し、LEDを`P1.1`(8番ピン)に接続します。また`V33`と`GND`、`VCC`と`GND`それぞれの間に0.1μFのバイパスコンデンサを入れる必要があり、これがないとPCに正常に認識されません。

USBmicroBのDIP化基板から出ている`ID`ピンはUSB On-The-Go機能のためのものであり、`GND`と直結するとその側がホストとして扱われるようになります。今回の使い方ではオープンのままとします。

USBの`D+`を`V33`でプルアップしてPCと接続すると、マイコンがBootloadモードで起動して書き込みを受け付ける状態となるので、`D+`を10kΩ炭素皮膜抵抗でプルアップしておきます。

![配線](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2708674/22da57ca-c795-1207-6e94-b5ee7bc1e4e7.jpeg)


## ドライバのインストール
[WCH-LinkUtilityのインストール](https://qiita.com/ctes091x/items/997995b5bf4dac22a4a0#%E3%83%89%E3%83%A9%E3%82%A4%E3%83%90%E3%81%AE%E3%82%A4%E3%83%B3%E3%82%B9%E3%83%88%E3%83%BC%E3%83%AB)によって、必要なドライバはすべてインストールされるようです。

<!-- ## USB Device tree Viewerのインストール
マイコンのUSB接続状態を確認するためのツールをインストールしました。https://www.uwe-sieber.de/usbtreeview_e.html の下の方にある`Conditions and Download`セクション内からPCに合った適切なものをダウンロードして展開しました。 -->

## ArduinoIDEへのch55xduinoの登録
**ch55xduino**は、ArduinoIDE上でCH552の開発を行うための環境です。ArduinoIDE上の`Preferences`->`Additional Board Manager`に https://raw.githubusercontent.com/DeqingSun/ch55xduino/ch55xduino/package_ch55xduino_mcs51_index.json を追加することでこれが利用できるようになります。

## Lチカ！！！
Bootload用のタクトスイッチを押下しながらPCと接続した後、ArduinoIDEで次のコードをコンパイルして書き込みました。LEDを接続したIOピンは`P1.1`(8番)なので、これに対応する数`11`をピン番号として指定します。同様に`P1.2`は`12`という番号に対応するようです。

```arduino
void setup() {
  pinMode(11, OUTPUT);
}
void loop() {
  digitalWrite(11, HIGH);
  delay(100);
  digitalWrite(11, LOW);
  delay(100);
}
```
初回の書き込みによってマイコンにブートローダが書き込まれるようですが、このあたりの挙動はまだよく把握できていません。

## HidKeyboardのサンプルを試す
CH552の内蔵USB機能を用いたHIDキーボードのサンプルが用意されていたので、これを試してみました。

該当のサンプルスケッチは`File`->`Examples`->`Generic_Examples`->`05.USB`->`HidKeyboard`にありますが、これをそのまま開くとフォルダ構造が再現されないため、ch55xduinoをGitHubから直接ダウンロードし、その中からスケッチをフォルダごと取り出します。

https://github.com/DeqingSun/ch55xduino/tree/cbe7d72626c3cfe1e6f6f13a2afdcf91dfea41df/ch55xduino/ch55x/libraries/Generic_Examples/examples/05.USB/HidKeyboard

`P3.0`、`P3.1`、`P3.2`がそれぞれ`a`、`Hello`、Capslockに割り当てられており、入力が`LOW`になるとそれぞれの機能が発動します。

CH552に採用されているコアプロセッサはIntel8051から派生したMCS51ですが、これに対応したフリーのC++コンパイラがなく、オブジェクトやポリモーフ関数などが利用できません。このため通常のArduino用のコードと異なり、関数名はアンダーバーで指定されます(`Keyboard.press`->`Keyboard_press`など)。

```arduino
#ifndef USER_USB_RAM
#error "This example needs to be compiled with a USER USB setting"
#endif

#include "./src/userUsbHidKeyboard/USBHIDKeyboard.h"
// 略
void loop() {
  //button 1 is mapped to letter 'a'
  bool button1Press = !digitalRead(BUTTON1_PIN);
  if (button1PressPrev != button1Press) {
    button1PressPrev = button1Press;
    if (button1Press) {
      Keyboard_press('a');
    } else {
      Keyboard_release('a');
    }
  }
  // 略
}
```

コード先頭には、USB通信機能用のRAMを確保する設定を選択するよう促すプリプロセッサがあり、コンパイルする際には`Tools`->`USB Settings`->`USER CODE w/ 148B USB ram`を選択する必要があります。

![usbsettings.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2708674/0ec74cdc-bb32-566c-3214-cfa81385f97d.png)

私が試した際にはBootload用のプルアップ抵抗をつけっぱなしにしていましたが、これを外さなければUSB通信を正常に行うことができません。開発ボードなどを利用している環境では起こらないトラブルですが、一応書き記しておきます。

## おわりに
パスコンの入れ忘れによる不動作で数時間を溶かしてしまいました。やはりパスコンは全てを解決する

<blockquote class="twitter-tweet"><p lang="qme" dir="ltr"><a href="https://twitter.com/hashtag/CapacitorLife?src=hash&amp;ref_src=twsrc%5Etfw">#CapacitorLife</a> <a href="https://t.co/86OoeMdE3d">pic.twitter.com/86OoeMdE3d</a></p>&mdash; 🌟𝘾𝙮𝙗𝙚𝙧 𝘾𝙞𝙩𝙮 𝘾𝙞𝙧𝙘𝙪𝙞𝙩𝙨🌟 (@MakeAugusta) <a href="https://twitter.com/MakeAugusta/status/1652659269542584325?ref_src=twsrc%5Etfw">April 30, 2023</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>

先日KiCadでProMicroサイズの開発ボードを組んでみたのですが、どうも虚無を錬成しているといった気分に支配されてしまい途中で放り出してしまいました。

https://github.com/HongoMCC/ch552t_board

このマイコンでUSBデバイスを作れることがわかったので、実際にマクロパッドを作ってみたいと思います。

https://github.com/HongoMCC/ch552t_tinypad