Arduinoで CH32X035 の HID Keyboard を使えるようにします。
arduino_core_ch32 にUSBのサンプルプログラムが存在しませんでした。
Github の Issue にてサンプルプログラムがありましたのでこちらを弄ってみます。
A simple demo for USB Keyboard with CH32X033 #61
プログラム
CH32X033 用のプログラム CH32X033USBKB.zip をダウンロードします。
WWW.LAB-Z.COM Ch32x033 Arduino 环境USB 键盘开发
実行する
最初にそのまま動かしてみましょう。
Serial2 でエラーが出ますので Serial に直します。
主にUSB Keyboardで使うコード
USB キーボードを作る際に主に以下3つの動作が行われます。
Press
押し続ける
Release
離す
Write
一度だけ入力する
今回のサンプルプログラムは USBFS_Endp_DataUp の1コードのみとなっていることと
Write は Press と Release を1つにして構成されているようなので今回は、こちらを加工して作ってみます。
USBFS_Endp_DataUp
USBFS_Endp_DataUp は ch32x035_usbfs_device.c において以下のようなプログラムになっています。
* @fn USBFS_Endp_DataUp
*
* @brief USBFS device data upload
*
* @return none
*/
uint8_t USBFS_Endp_DataUp(uint8_t endp, uint8_t *pbuf, uint16_t len, uint8_t mod)
{
/* DMA config, endp_ctrl config, endp_len config */
if( ( endp >= DEF_UEP1 ) && ( endp <= DEF_UEP7 ) )
{
if( USBFS_Endp_Busy[ endp ] == 0 )
{
USBFS_Endp_Busy[ endp ] = 0x01;
/* copy mode */
memcpy( USBFS_EP1_Buf, pbuf, len );
USBFSD->UEP1_TX_LEN = len;
USBFSD->UEP1_CTRL_H = ( USBFSD->UEP1_CTRL_H & ~USBFS_UEP_T_RES_MASK ) | USBFS_UEP_T_RES_ACK;
}
else
{
return NoREADY;
}
}
else
{
return NoREADY;
}
return READY;
}
記述例
3つの動作を以下のようにしてみます。
キー入力は、チャタリングがあるので、delay を入れます。
これにより、Press,Release,Write となります。
Press
Buffer[2] = 0x04; //"A"
USBFS_Endp_DataUp( DEF_UEP1, Buffer, sizeof( Buffer ), DEF_UEP_CPY_LOAD );
Serial.println("Send pressA");
delay(50);
Release
memset(Buffer, 0, sizeof(Buffer));
USBFS_Endp_DataUp( DEF_UEP1, Buffer, sizeof( Buffer ), DEF_UEP_CPY_LOAD );
Serial.println("Send ReleaseA");
delay(100);
Write
Buffer[2] = 0x04; //"A"
USBFS_Endp_DataUp( DEF_UEP1, Buffer, sizeof( Buffer ), DEF_UEP_CPY_LOAD );
delay(50);
memset(Buffer, 0, sizeof(Buffer));
Serial.println("Send pressA");
USBFS_Endp_DataUp( DEF_UEP1, Buffer, sizeof( Buffer ), DEF_UEP_CPY_LOAD );
Serial.println("Send ReleaseL");
delay(50);
最後に
Serial.printlnは最終的に外して問題ありません。
USBSerialが使えていませんが、いずれ、アップデートされる事でCH55xの代わりのマイコンとして使用できるのではと期待しています。