Skip to content
Snippets Groups Projects
README.md 1.88 KiB
Newer Older
  • Learn to ignore specific revisions
  • Quentin Bolsee's avatar
    Quentin Bolsee committed
    # USB I2S Speaker
    
    
    Quentin Bolsee's avatar
    Quentin Bolsee committed
    <img width=60% src="img/speaker.jpg"/>
    
    Quentin Bolsee's avatar
    Quentin Bolsee committed
    
    
    Quentin Bolsee's avatar
    Quentin Bolsee committed
    This code implements a USB speaker streaming audio to an I2S device, based on [Phil Schatzmann's port](https://www.pschatzmann.ch/home/2024/10/13/tinyusb-audio-on-an-rp2040-in-arduino/) of the TinyUSB Audio class for the rp2040.
    
    Quentin Bolsee's avatar
    Quentin Bolsee committed
    
    
    Quentin Bolsee's avatar
    Quentin Bolsee committed
    An example board is available on How to Make (Almost) Anything's website (hello.MAX98357A.RP2040):
    
    Quentin Bolsee's avatar
    Quentin Bolsee committed
    [https://academy.cba.mit.edu/classes/output_devices/](https://academy.cba.mit.edu/classes/output_devices/)
    
    
    Quentin Bolsee's avatar
    Quentin Bolsee committed
    ## Dependencies
    
    Quentin Bolsee's avatar
    Quentin Bolsee committed
    
    
    Quentin Bolsee's avatar
    Quentin Bolsee committed
    This code uses the [Arduino pico](https://github.com/earlephilhower/arduino-pico) core, and two libraries:
    
    Quentin Bolsee's avatar
    Quentin Bolsee committed
    
    
    Quentin Bolsee's avatar
    Quentin Bolsee committed
    - [Adafruit TinyUSB](https://github.com/pschatzmann/Adafruit_TinyUSB_Arduino/tree/Audio): this is the version modified by Phil Schatzmann to handle the Audio class on the rp2040.
    
    Quentin Bolsee's avatar
    Quentin Bolsee committed
    - [I2S](https://docs.arduino.cc/learn/built-in-libraries/i2s/): Arduino's standard I2S library.
    
    Quentin Bolsee's avatar
    Quentin Bolsee committed
    
    
    Quentin Bolsee's avatar
    Quentin Bolsee committed
    ## Code
    
    Quentin Bolsee's avatar
    Quentin Bolsee committed
    
    
    Quentin Bolsee's avatar
    Quentin Bolsee committed
    ```cpp
    
    Quentin Bolsee's avatar
    Quentin Bolsee committed
    #include <Adafruit_TinyUSB.h>
    #include <I2S.h>
    
    #define I2S_CLK 1
    #define I2S_FRAME (I2S_CLK+1)
    #define I2S_DATA 4
    #define SAMPLE_RATE 44100
    #define SAMPLE_BITS 16
    
    Adafruit_USBD_Audio usb;
    
    I2S i2s(OUTPUT);
    
    size_t writeCB(const uint8_t* data, size_t len, Adafruit_USBD_Audio& ref) {
      int16_t* data16 = (int16_t*)data;
    
      size_t n_written = i2s.write(data, len);
    
      // returns the amount written (and convert to bytes)
      return n_written * 2 *  sizeof(int16_t);
    }
    
    void setup() {
      // init USB
      if (!TinyUSBDevice.isInitialized()) {
        TinyUSBDevice.begin(0);
      }
    
      Serial.begin(115200);
    
      // reconfigure USB
      usb.setWriteCallback(writeCB);
      usb.begin(SAMPLE_RATE, 2, SAMPLE_BITS);
      if (TinyUSBDevice.mounted()) {
        TinyUSBDevice.detach();
        delay(10);
        TinyUSBDevice.attach();
      }
    
      // start I2S
      i2s.setBCLK(I2S_CLK);
      i2s.setDATA(I2S_DATA);
      i2s.setBitsPerSample(SAMPLE_BITS);
      i2s.begin(SAMPLE_RATE);
    }
    
    void loop() {
      #ifdef TINYUSB_NEED_POLLING_TASK
      TinyUSBDevice.task();
      #endif
    }
    
    Quentin Bolsee's avatar
    Quentin Bolsee committed
    ```