Pinout
This page makes reference to both the front and back of the EP-2350's PCB. For these purposes "front" is the side of the PCB that is visible after removing just the back cover. The "back" side is the one that becomes visible after removing the PCB retention screws, unplugging the 3.5mm audio connector, and flipping the PCB over.
| GPIO | Board names | Function |
|---|---|---|
| GPIO0 |
GP0, LED_WHITE1, LED
|
White LED 1 (top) |
| GPIO6 |
GP6, LED_WHITE2
|
White LED 2 |
| GPIO4 |
GP4, LED_WHITE3
|
White LED 3 |
| GPIO5 |
GP5, LED_WHITE4
|
White LED 4 (bottom) |
| GPIO16 |
GP16, LED_RED1
|
Red LED 1 (top) |
| GPIO24 |
GP24, LED_RED2
|
Red LED 2 |
| GPIO18 |
GP18, LED_RED3
|
Red LED 3 |
| GPIO17 |
GP17, LED_RED4
|
Red LED 4 (bottom) |
| GPIO21 |
GP21, BUTTON_TOP
|
Top side button |
| GPIO3 |
GP3, BUTTON_MIDDLE
|
Middle side button |
| GPIO1 |
GP1, BUTTON_BOTTOM
|
Bottom side button |
| GPIO19 |
GP19, HANDLE_IN
|
Handle seated switch |
| GPIO20 |
GP20, HANDLE_OUT
|
Handle moved switch |
| GPIO28 |
GP28, A2, HANDLE_POSITION
|
Handle position potentiometer |
| GPIO2 |
GP2, POWER_HOLD
|
Power hold latch |
| GPIO14 |
GP14, SDA
|
I2C1 SDA |
| GPIO15 |
GP15, SCL
|
I2C1 SCL |
| — | board.I2C() |
Shared I2C1 bus object |
| GPIO8 |
GP8, I2S_DIN
|
Data in (from codec) |
| GPIO9 |
GP9, I2S_DOUT
|
Data out (to codec) |
| GPIO10 |
GP10, I2S_WS
|
Word select / LRCLK |
| GPIO11 |
GP11, I2S_BIT_CLOCK
|
Bit clock |
| GPIO12 |
GP12, I2S_MCLK
|
Mclock |
| GPIO29 |
GP29, A3, VOLUME
|
Volume potentiometer wiper |
The main brains of the operation is a Raspberry Pi RP2350A microcontroller.
It is situated in the top right corner of the front side of the board, near the top orange button.
In the standard TE firmware, the RP2350 runs a customized build of MicroPython.
The USB C connector is mounted on the back of the PCB in the lower right corner. The device can be powered via USB from this port, or by two AA batteries. There is no charging circuit in the device, so USB power will not recharge any type of AA batteries.
The reset button is just above the USB C, right next to the bottom white side button. Pressing reset once will reboot the device. Double pressing reset while holding the handle all the way in will access the bootloader. The device will connect to the host computer as the TING BOOT removable storage drive.
The EP-2350 has two quirks about power management as compared to most CircuitPython devices.
- It stays powered off by default when you plug in the USB C cable. In order to turn it on you must press the handle all the way in.
- There is a power watchdog monitoring GPIO2 pin. The pin must be held high for the device to remain powered. In CircuitPython code, the pin can be accessed with
board.GP2orboard.POWER_HOLD. Your code can drive it low to power down the device. When the handle is pressed again it will boot up. The CircuitPython firmware automatically drives it high on boot up and reset.
There is a small 24 pin chip on the front of the PCB that has the markings "PG", "3101", "B7880", and a logo. The informal.cc teardown post lists this as the Analog Devices LTC3101 power converter
The green handle on the side of the device has an internal spring that pushes it outward, returning it to its resting position when you release the handle.
There are two buttons actuated by the handle. One that is pressed when the handle is in the resting position, and another that is pressed when the handle is held all the way in.
- The "handle out" button is pressed when the handle is at rest with spring tension. When you start to squeeze the handle, the button gets released. The button is connected to GPIO20. It can be accessed in code with
board.GP20, orboard.HANDLE_OUT. Use aPull.UPin code to read it. When the handle is at rest the pin is driven low to GND, when you start to squeeze the handle the pin goes high. This button is small, non-tactile, and mounted on the front of the PCB. - The "handle in" button is a tactile button mounted on the back of the PCB. It gets pressed when the handle is fully squeezed. Use a
Pull.UPin code to read it. It can be accessed in code withboard.GP19orboard.HANDLE_IN. When the handle is fully squeezed the pin is driven low to GND. When the handle isn't squeezed its pulled high. This is also the button that powers the device on.
Inside the pivot point of the handle there is a potentiometer connected to GPIO28. It can be accessed in code with board.GP28, board.A2, or board.HANDLE_POSITION.
It is an analog pin which would ordinarilly read as a value between 0-65535. But, the physical movement of the potentiometer constrained to a subset of the full range. When the handle is fully squeezed it reads around 29850, and when the handle is fully released it reads around 32370.
The 3 buttons on the side of the EP-2350 ting have tactile momentary switches mounted on the back side of the board.
To read the buttons use Pull.UP in the code. When a button is pressed its pin will be driven low to GND.
-
Top orange button is connected to GPIO21, it can be accessed in code with
board.GP21orboard.BUTTON_TOP. -
Middle green button is connected to GPIO3, it can be accessed in code with
board.GP3orboard.BUTTON_MIDDLE. -
Bottom white button is connected to GPIO1, it can be accessed in code with
board.GP1orboard.BUTTON_BOTTOM.
On the back of the PCB there are 8 LEDs broken up into one column of 4 red LEDs, and one column of 4 white LEDs. The red LEDs are at the top, and the white LEDs are beneath them. The pins below are listed from the top of the device down
-
1st red LED is on GPIO16. It's available in code as
board.GP16, orboard.LED_RED1. -
2nd red LED is on GPIO24. It's available in code as
board.GP24orboard.LED_RED2. -
3rd red LED is on GPIO18. It's available in code as
board.GP18, orboard.LED_RED3. -
4th red LED is on GPIO17. It's available in code as
board.GP17, orboard.LED_RED4. -
1st white LED is on
GPIO0. It's available in code asboard.GP0,board.LED_WHITE1, orboard.LED. -
2nd white LED is on GPIO6. It's available in code as
board.GP6, orboard.LED_WHITE2 -
3rd white LED is on GPIO4. It's available in code as
board.GP4, orboard.LED_WHITE3 -
4th white LED is on GPIO5. It's available in code as
board.GP5, orboard.LED_WHITE4
A potentiometer with a green phillips screw head cap is mounted on the back of the PCB in the lower left corner. In the stock Teenage Engineering firmware, this acts as a volume knob.
The potentiometer is connected to GPIO29. It is available in code as board.GP29, board.A3, and board.VOLUME. It sweeps the full range of 0 to 3.3V. Turning the knob clockwise raises the voltage. The pin will read 3.3V when the knob is fully turned to the right clockwise.
I2C Bus
The I2C bus used on the device is available as board.I2C(). It consists of the following pins.
-
SDA is GPIO14. It's available in code as
board.GP14, orboard.SDA. -
SCL is GPIO15. It's available in code as
board.GP15, orboard.SCL.
There is an accelerometer on the back of the PCB near the top right corner. It is connected on the I2C bus with address 0x18. It's compatible with the LIS331 library. However, it reports a non-standard chip ID of 0x11 instead of the expected 0x32.
The original MicroPython firmware uses this to enable shake motions to trigger changes to the audio effects being applied or played.
The star of the show on this device is the NAU88L21 audio CODEC chip. It is configured and controlled over I2C. The audio input and output between it and the RP2350 occurs over I2S both ways.
Sending audio to it with I2SOut will cause the audio to be played from the 3.5mm jack.
Using an I2SIn object will allow you to capture audio from the microphone on the device.
-
I2S MCLK is GPIO12. It's available in code as
board.GP12, orboard.I2S_MCLK -
I2S BCLK is GPIO11. It's available in code as
board.GP11, orboard.I2S_BCLK. -
I2S WS is GPIO10. It's available in code as
board.GP10, orboard.I2S_WS. -
I2S DIN is GPIO8. It's available in code as
board.GP8, orboard.I2S_DIN. -
I2S DOUT is GPIO9. It's available in code as
board.GP9, orboard.I2S_DOUT
The microphone is connected to the CODEC with two very thin wires soldered near the NAU88L21 chip. The 3.5mm line connects to the PCB with a small plastic press fit connector.
Page last edited August 05, 2026
Text editor powered by tinymce.