In the serial host bridge example, you'll see serial messages printed out from another microcontroller plugged into your USB Host FeatherWing.
Simple Serial Printing Sketch
First, load a sketch onto the microcontroller that you'll be plugging into the USB Host FeatherWing that prints something to the Serial Monitor. This quick example will print hello world from another arduino!
every second.
void setup() { Serial.begin(115200); } void loop() { Serial.println("hello world from another arduino!"); delay(1000); }
- Plug a non-ESP32 TinyUSB supported Feather and USB Host FeatherWing into a FeatherWing Doubler
- Plug a microcontroller running an Arduino program that prints data to the Serial Monitor into the USB Host FeatherWing. A Trinkey QT2040 is shown in the Fritzing diagram.
Serial Host Bridge Example
Load the example code onto your Feather after following the library installation instructions on the Arduino Library Install page.
Navigate to the Adafruit TinyUSB Library Examples and select DualRole - CDC - serial_host_bridge
/********************************************************************* Adafruit invests time and resources providing this open source code, please support Adafruit and open-source hardware by purchasing products from Adafruit! MIT license, check LICENSE for more information Copyright (c) 2019 Ha Thach for Adafruit Industries All text above, and the splash screen below must be included in any redistribution *********************************************************************/ /* This example demonstrates use of both device and host, where * - Device run on native usb controller (roothub port0) * - Host depending on MCUs run on either: * - rp2040: bit-banging 2 GPIOs with the help of Pico-PIO-USB library (roothub port1) * - samd21/51, nrf52840, esp32: using MAX3421e controller (host shield) * * Requirements: * - For rp2040: * - [Pico-PIO-USB](https://github.com/sekigon-gonnoc/Pico-PIO-USB) library * - 2 consecutive GPIOs: D+ is defined by PIN_USB_HOST_DP, D- = D+ +1 * - Provide VBus (5v) and GND for peripheral * - CPU Speed must be either 120 or 240 Mhz. Selected via "Menu -> CPU Speed" * - For samd21/51, nrf52840, esp32: * - Additional MAX2341e USB Host shield or featherwing is required * - SPI instance, CS pin, INT pin are correctly configured in usbh_helper.h */ /* This example demonstrates use of Host Serial (CDC). SerialHost (declared below) is * an object to manage an CDC peripheral connected to our USB Host connector. This example * will forward all characters from Serial to SerialHost and vice versa. */ // nRF52 and ESP32 use freeRTOS, we may need to run USBhost.task() in its own rtos's thread. // Since USBHost.task() will put loop() into dormant state and prevent followed code from running // until there is USB host event. #if defined(ARDUINO_NRF52_ADAFRUIT) || defined(ARDUINO_ARCH_ESP32) #define USE_FREERTOS #endif // USBHost is defined in usbh_helper.h #include "usbh_helper.h" // CDC Host object Adafruit_USBH_CDC SerialHost; // forward Seral <-> SerialHost void forward_serial(void) { uint8_t buf[64]; // Serial -> SerialHost if (Serial.available()) { size_t count = Serial.read(buf, sizeof(buf)); if (SerialHost && SerialHost.connected()) { SerialHost.write(buf, count); SerialHost.flush(); } } // SerialHost -> Serial if (SerialHost.connected() && SerialHost.available()) { size_t count = SerialHost.read(buf, sizeof(buf)); Serial.write(buf, count); Serial.flush(); } } #if defined(CFG_TUH_MAX3421) && CFG_TUH_MAX3421 //--------------------------------------------------------------------+ // Using Host shield MAX3421E controller //--------------------------------------------------------------------+ #ifdef USE_FREERTOS #ifdef ARDUINO_ARCH_ESP32 #define USBH_STACK_SZ 2048 #else #define USBH_STACK_SZ 200 #endif void usbhost_rtos_task(void *param) { (void) param; while (1) { USBHost.task(); } } #endif void setup() { Serial.begin(115200); // init host stack on controller (rhport) 1 USBHost.begin(1); // Initialize SerialHost SerialHost.begin(115200); #ifdef USE_FREERTOS // Create a task to run USBHost.task() in background xTaskCreate(usbhost_rtos_task, "usbh", USBH_STACK_SZ, NULL, 3, NULL); #endif // while ( !Serial ) delay(10); // wait for native usb Serial.println("TinyUSB Host Serial Echo Example"); } void loop() { #ifndef USE_FREERTOS USBHost.task(); #endif forward_serial(); } #elif defined(ARDUINO_ARCH_RP2040) //--------------------------------------------------------------------+ // For RP2040 use both core0 for device stack, core1 for host stack //--------------------------------------------------------------------+ //------------- Core0 -------------// void setup() { Serial.begin(115200); // while ( !Serial ) delay(10); // wait for native usb Serial.println("TinyUSB Host Serial Echo Example"); } void loop() { forward_serial(); } //------------- Core1 -------------// void setup1() { // configure pio-usb: defined in usbh_helper.h rp2040_configure_pio_usb(); // run host stack on controller (rhport) 1 // Note: For rp2040 pico-pio-usb, calling USBHost.begin() on core1 will have most of the // host bit-banging processing works done in core1 to free up core0 for other works USBHost.begin(1); // Initialize SerialHost SerialHost.begin(115200); } void loop1() { USBHost.task(); } #endif //--------------------------------------------------------------------+ // TinyUSB Host callbacks //--------------------------------------------------------------------+ extern "C" { // Invoked when a device with CDC interface is mounted // idx is index of cdc interface in the internal pool. void tuh_cdc_mount_cb(uint8_t idx) { // bind SerialHost object to this interface index SerialHost.mount(idx); Serial.println("SerialHost is connected to a new CDC device"); } // Invoked when a device with CDC interface is unmounted void tuh_cdc_umount_cb(uint8_t idx) { SerialHost.umount(idx); Serial.println("SerialHost is disconnected"); } }
After uploading the sketch to your board, open up the Serial Monitor (Tools -> Serial Monitor) at 115200 baud. After you plug in your additional microcontroller to the USB Host FeatherWing, you see it mount and then print to the Serial Monitor thru the USB Host FeatherWing.
Text editor powered by tinymce.