Wio Terminal でUSB Host機能を堪能
Wio Terminal はUSB Host機能を有しUSBデバイスを接続することが可能です。
早速キーボードを繋いで試してみましたので、報告させてください。
目次
USB Host
Wio Terminal でUSB Hostを使用するには USB Host Library SAMD が必要となります。
以下を参考にライブラリを導入しました。
キーボード接続
Wio Terminalにキーボードを繋いでみました。以下を参考に進めました。
https://wiki.seeedstudio.com/Wio-Terminal-USBH-Keyboard/
USB-C OTG ケーブルを介してキーボードをWioに繋ぎます。
USB Host機能を使用時には給電とUSBシリアル通信ができないので、
Wioの裏面の40ピンヘッダを使用します。
USBシリアル変換ケーブルの電源は3.3Vに設定しています。
Serial1で出力してTera Termなどのシリアル通信ソフトでモニタ出来ます。
USB Host 動作
Wio Terminalにキーボードを繋いで、キーにブザーの音階を割り振って演奏してみました。
LCDディスプレイに音階も表示しています。
Wio Terminal でUSB Host機能を堪能#WioTerminal #USB pic.twitter.com/JtA6VrcnUJ
— HomeMadeGarbage (@H0meMadeGarbage) May 16, 2020
Arduinoコード
キーボード動作については以下を参考にしました。
https://wiki.seeedstudio.com/Wio-Terminal-USBH-Keyboard/
ディスプレイ表示については以下を参考にしました。
https://wiki.seeedstudio.com/Wio-Terminal-LCD-Basic/
ブザーについては以下を参考にしました。
https://wiki.seeedstudio.com/Wio-Terminal-Buzzer/
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 |
#include <KeyboardController.h> #define SerialDebug Serial1 #include"TFT_eSPI.h" #include"Free_Fonts.h" //include the header file #define BUZZER_PIN WIO_BUZZER // Initialize USB Controller USBHost usb; // Attach keyboard controller to USB KeyboardController keyboard(usb); void printKey(); TFT_eSPI tft; int key; // This function intercepts key press void keyPressed() { SerialDebug.print("Pressed: "); printKey(); switch (key) { case 20: tft.drawString("C",140,100); playTone(1915, 400); break; case 26: tft.drawString("D",140,100); playTone(1700, 400); break; case 8: tft.drawString("E",140,100); playTone(1519, 400); break; case 21: tft.drawString("F",140,100); playTone(1432, 400); break; case 23: tft.drawString("G",140,100); playTone(1275, 400); break; case 28: tft.drawString("A",140,100); playTone(1136, 400); break; case 24: tft.drawString("B",140,100); playTone(1014, 400); break; case 12: tft.drawString("C+",140,100); playTone(956, 400); break; } } // This function intercepts key release void keyReleased() { SerialDebug.print("Released: "); printKey(); tft.fillScreen(TFT_BLACK); digitalWrite(BUZZER_PIN, LOW); } void printKey() { // getOemKey() returns the OEM-code associated with the key key = keyboard.getOemKey(); SerialDebug.print(" key:"); SerialDebug.print(key); // getModifiers() returns a bits field with the modifiers-keys int mod = keyboard.getModifiers(); SerialDebug.print(" mod:"); SerialDebug.print(mod); SerialDebug.print(" => "); if (mod & LeftCtrl) SerialDebug.print("L-Ctrl "); if (mod & LeftShift) SerialDebug.print("L-Shift "); if (mod & Alt) SerialDebug.print("Alt "); if (mod & LeftCmd) SerialDebug.print("L-Cmd "); if (mod & RightCtrl) SerialDebug.print("R-Ctrl "); if (mod & RightShift) SerialDebug.print("R-Shift "); if (mod & AltGr) SerialDebug.print("AltGr "); if (mod & RightCmd) SerialDebug.print("R-Cmd "); // getKey() returns the ASCII translation of OEM key // combined with modifiers. SerialDebug.write(keyboard.getKey()); SerialDebug.println(); } uint32_t lastUSBstate = 0; void setup(){ tft.begin(); tft.setRotation(3); tft.fillScreen(TFT_BLACK); tft.setFreeFont(FSSBO24); SerialDebug.begin( 115200 ); SerialDebug.println("Keyboard Controller Program started"); if (usb.Init()) SerialDebug.println("USB host did not start."); delay( 20 ); //Coqnfigure pins to enable USB Host on Wio Terminal digitalWrite(PIN_USB_HOST_ENABLE, LOW); digitalWrite(OUTPUT_CTR_5V, HIGH); pinMode(BUZZER_PIN, OUTPUT); } void loop() { // Process USB tasks usb.Task(); uint32_t currentUSBstate = usb.getUsbTaskState(); if (lastUSBstate != currentUSBstate) { SerialDebug.print("USB state changed: 0x"); SerialDebug.print(lastUSBstate, HEX); SerialDebug.print(" -> 0x"); SerialDebug.println(currentUSBstate, HEX); switch (currentUSBstate) { case USB_ATTACHED_SUBSTATE_SETTLE: SerialDebug.println("Device Attached"); break; case USB_DETACHED_SUBSTATE_WAIT_FOR_DEVICE: SerialDebug.println("Detached, waiting for Device"); break; case USB_ATTACHED_SUBSTATE_RESET_DEVICE: SerialDebug.println("Resetting Device"); break; case USB_ATTACHED_SUBSTATE_WAIT_RESET_COMPLETE: SerialDebug.println("Reset complete"); break; case USB_STATE_CONFIGURING: SerialDebug.println("USB Configuring"); break; case USB_STATE_RUNNING: SerialDebug.println("USB Running"); break; } lastUSBstate = currentUSBstate; } } void playTone(int tone, int duration) { for (long i = 0; i < duration * 1000L; i += tone * 2) { digitalWrite(BUZZER_PIN, HIGH); delayMicroseconds(tone); digitalWrite(BUZZER_PIN, LOW); delayMicroseconds(tone); } } |
注意
USB Hostのコードを書き込むと以降はWio TerminalのUSB-CコネクタとPCを接続しても、認識されません。
その際にはWio Terminal側面の電源ボタンをトトンと素早く2回下に下げて書き換えモードにしてください。