この記事は 本郷学園マイコン部 Advent Calendar 2023 23日目の記事です。
やったこと
8ビットUSBマイコンのCH552Tの環境構築とLチカを行い、さらにHidKeyboardのサンプルを使用してみました。
用意したもの
- PC
- CH552T
- USBmicroB->DIP変換基板
- SSOP20->DIP変換基板
- 細ピンヘッダ
- LED、炭素被膜抵抗330Ω、10kΩ
- セラミックコンデンサ0.1μF
- ブレッドボード、線材
- データ転送可能なUSBmicroB-USBA変換ケーブル
- 忍耐力
変換基板へのマイコンの実装
SOP8パッケージの実装と同様に半田を流し込んで過剰分を後から吸い取りました。パッケージのテープ固定に失敗してマイコンが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Ω炭素皮膜抵抗でプルアップしておきます。
ドライバのインストール
WCH-LinkUtilityのインストールによって、必要なドライバはすべてインストールされるようです。
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
という番号に対応するようです。
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から直接ダウンロードし、その中からスケッチをフォルダごと取り出します。
P3.0
、P3.1
、P3.2
がそれぞれa
、Hello
、Capslockに割り当てられており、入力がLOW
になるとそれぞれの機能が発動します。
CH552に採用されているコアプロセッサはIntel8051から派生したMCS51ですが、これに対応したフリーのC++コンパイラがなく、オブジェクトやポリモーフ関数などが利用できません。このため通常のArduino用のコードと異なり、関数名はアンダーバーで指定されます(Keyboard.press
->Keyboard_press
など)。
#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
を選択する必要があります。
私が試した際にはBootload用のプルアップ抵抗をつけっぱなしにしていましたが、これを外さなければUSB通信を正常に行うことができません。開発ボードなどを利用している環境では起こらないトラブルですが、一応書き記しておきます。
おわりに
パスコンの入れ忘れによる不動作で数時間を溶かしてしまいました。やはりパスコンは全てを解決する
#CapacitorLife pic.twitter.com/86OoeMdE3d
— 🌟𝘾𝙮𝙗𝙚𝙧 𝘾𝙞𝙩𝙮 𝘾𝙞𝙧𝙘𝙪𝙞𝙩𝙨🌟 (@MakeAugusta) April 30, 2023
先日KiCadでProMicroサイズの開発ボードを組んでみたのですが、どうも虚無を錬成しているといった気分に支配されてしまい途中で放り出してしまいました。
このマイコンでUSBデバイスを作れることがわかったので、実際にマクロパッドを作ってみたいと思います。