LoginSignup
0
1

ArduinoでCH32X035をHID Keyboardとして使えるようにする

Last updated at Posted at 2024-05-17

Arduinoで CH32X035HID Keyboard を使えるようにします。

arduino_core_ch32 にUSBのサンプルプログラムが存在しませんでした。
GithubIssue にてサンプルプログラムがありましたのでこちらを弄ってみます。

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コードのみとなっていることと
WritePressRelease を1つにして構成されているようなので今回は、こちらを加工して作ってみます。

USBFS_Endp_DataUp

USBFS_Endp_DataUpch32x035_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の代わりのマイコンとして使用できるのではと期待しています。

0
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
1