It's easy to use NeoTrellis panels with Python or CircuitPython and the Adafruit CircuitPython NeoTrellis module. This module allows you to easily write Python code that reads the button presses, and then light up the LEDs
You can use NeoTrellis with any CircuitPython microcontroller board or with a computer that has GPIO and Python thanks to Adafruit_Blinka, our CircuitPython-for-Python compatibility library.
CircuitPython Microcontroller Wiring
First wire up a NeoTrellis to your board exactly as shown on the previous pages for Arduino.
Wiring is easy, solder the four VIN GND SDA SCL pads to wires and then connect to your CircuitPython device
- VIN to USB (if you are going to have it always plugged into USB), BAT (if you're always going to have a lipo battery plugged in) or 3.3V (if you're not sure)
- GND to GND
- SDA to I2C data SDA
- SCL to I2C clock SCL
If you want to use the interrupt pin, wire that as well to a digital I/O pin. We'll be using #5 by default
Python Computer Wiring
Since there's dozens of Linux computers/boards you can use we will show wiring for Raspberry Pi. For other platforms, please visit the guide for CircuitPython on Linux to see whether your platform is supported.
Here's the Raspberry Pi wired with I2C:
Wiring is easy, solder the four VIN GND SDA SCL pads to wires and then connect to your CircuitPython device
- VIN to 5V
- GND to GND
- SDA to I2C data SDA
- SCL to I2C clock SCL
If you want to use the interrupt pin, wire that as well to a digital I/O pin. We'll be using GPIO #5 by default
CircuitPython Installation of NeoTrellis Library
You'll need to install the Adafruit CircuitPython NeoTrellis library on your CircuitPython board.
First make sure you are running the latest version of Adafruit CircuitPython for your board.
Next you'll need to install the necessary libraries to use the hardware--carefully follow the steps to find and install these libraries from Adafruit's CircuitPython library bundle. Our CircuitPython starter guide has a great page on how to install the library bundle.
For non-express boards like the Trinket M0 or Gemma M0, you'll need to manually install the necessary libraries from the bundle:
- adafruit_neotrellis
- adafruit_seesaw
- adafruit_bus_device
Before continuing make sure your board's lib folder or root filesystem has the adafruit_seesaw, adafruit_neotrellis, and adafruit_bus_device files and folders copied over.
Next connect to the board's serial REPL so you are at the CircuitPython >>> prompt.
Python Installation of NeoTrellis Library
You'll need to install the Adafruit_Blinka library that provides the CircuitPython support in Python. This may also require enabling I2C on your platform and verifying you are running Python 3. Since each platform is a little different, and Linux changes often, please visit the CircuitPython on Linux guide to get your computer ready!
Once that's done, from your command line run the following command:
sudo pip3 install adafruit-circuitpython-neotrellis
If your default Python is version 3 you may need to run 'pip' instead. Just make sure you aren't trying to use CircuitPython on Python 2.x, it isn't supported!
CircuitPython & Python Usage
To demonstrate the usage of the board we will initialize and run an example.
If you're using an I2C connection run the following code to import the necessary modules and initialize the I2C connection with the board:
import time from board import SCL, SDA import busio from adafruit_neotrellis.neotrellis import NeoTrellis #create the i2c object for the trellis i2c_bus = busio.I2C(SCL, SDA) #create the trellis trellis = NeoTrellis(i2c_bus)
Next lets define the function we want to call when a button is pressed or released:
OFF = (0, 0, 0) CYAN = (0, 255, 255) def blink(event): #turn the LED on when a rising edge is detected if event.edge == NeoTrellis.EDGE_RISING: trellis.pixels[event.number] = CYAN #turn the LED off when a rising edge is detected elif event.edge == NeoTrellis.EDGE_FALLING: trellis.pixels[event.number] = OFF
Now lets activate all the buttons and hook up the callbacks:
for i in range(16): #activate rising edge events on all keys trellis.activate_key(i, NeoTrellis.EDGE_RISING) #activate falling edge events on all keys trellis.activate_key(i, NeoTrellis.EDGE_FALLING) #set all keys to trigger the blink callback trellis.callbacks[i] = blink
Finally, we poll for new events in a loop:
while True: #call the sync function call any triggered callbacks trellis.sync() #the trellis can only be read every 10 millisecons or so time.sleep(.02)
This will turn on the corresponding LED when a button is being pressed, and then turn the LED off when the button is released.
Here is a complete example:
# SPDX-FileCopyrightText: 2022 ladyada for Adafruit Industries # SPDX-License-Identifier: MIT import time import board from adafruit_neotrellis.neotrellis import NeoTrellis # create the i2c object for the trellis i2c_bus = board.I2C() # uses board.SCL and board.SDA # i2c_bus = board.STEMMA_I2C() # For using the built-in STEMMA QT connector on a microcontroller # create the trellis trellis = NeoTrellis(i2c_bus) # Set the brightness value (0 to 1.0) trellis.brightness = 0.5 # some color definitions OFF = (0, 0, 0) RED = (255, 0, 0) YELLOW = (255, 150, 0) GREEN = (0, 255, 0) CYAN = (0, 255, 255) BLUE = (0, 0, 255) PURPLE = (180, 0, 255) # this will be called when button events are received def blink(event): # turn the LED on when a rising edge is detected if event.edge == NeoTrellis.EDGE_RISING: trellis.pixels[event.number] = CYAN # turn the LED off when a falling edge is detected elif event.edge == NeoTrellis.EDGE_FALLING: trellis.pixels[event.number] = OFF for i in range(16): # activate rising edge events on all keys trellis.activate_key(i, NeoTrellis.EDGE_RISING) # activate falling edge events on all keys trellis.activate_key(i, NeoTrellis.EDGE_FALLING) # set all keys to trigger the blink callback trellis.callbacks[i] = blink # cycle the LEDs on startup trellis.pixels[i] = PURPLE time.sleep(0.05) for i in range(16): trellis.pixels[i] = OFF time.sleep(0.05) while True: # call the sync function call any triggered callbacks trellis.sync() # the trellis can only be read every 17 millisecons or so time.sleep(0.02)
Connecting multiple NeoTrellis boards
Multiple NeoTrellis boards can be chained together if they are set to different I2C addresses. See the Arduino Code section of this guide for information on how to connect the boards and set the I2C addresses, and then run this example to test your setup!
# SPDX-FileCopyrightText: 2022 ladyada for Adafruit Industries # SPDX-License-Identifier: MIT import time import board from adafruit_neotrellis.neotrellis import NeoTrellis from adafruit_neotrellis.multitrellis import MultiTrellis # Create the I2C object for the NeoTrellis i2c_bus = board.I2C() # uses board.SCL and board.SDA # i2c = board.STEMMA_I2C() # For using the built-in STEMMA QT connector on a microcontroller # Create the NeoTrellis object """ # This is for a 2x1 array (2 boards connected left to right): trelli = [ [NeoTrellis(i2c_bus, False, addr=0x2E), NeoTrellis(i2c_bus, False, addr=0x2F)], ] """ # This is for a 2x2 array of NeoTrellis boards: trelli = [ [NeoTrellis(i2c_bus, False, addr=0x2E), NeoTrellis(i2c_bus, False, addr=0x2F)], [NeoTrellis(i2c_bus, False, addr=0x30), NeoTrellis(i2c_bus, False, addr=0x31)], ] trellis = MultiTrellis(trelli) # Set the brightness value (0 to 1.0) trellis.brightness = 0.5 # some color definitions OFF = (0, 0, 0) RED = (255, 0, 0) YELLOW = (255, 150, 0) GREEN = (0, 255, 0) CYAN = (0, 255, 255) BLUE = (0, 0, 255) PURPLE = (180, 0, 255) # This will be called when button events are received def blink(xcoord, ycoord, edge): # Turn the LED on when a rising edge is detected if edge == NeoTrellis.EDGE_RISING: trellis.color(xcoord, ycoord, BLUE) # Turn the LED off when a falling edge is detected elif edge == NeoTrellis.EDGE_FALLING: trellis.color(xcoord, ycoord, OFF) for y in range(8): for x in range(8): # Activate rising edge events on all keys trellis.activate_key(x, y, NeoTrellis.EDGE_RISING) # Activate falling edge events on all keys trellis.activate_key(x, y, NeoTrellis.EDGE_FALLING) trellis.set_callback(x, y, blink) trellis.color(x, y, PURPLE) time.sleep(0.05) for y in range(8): for x in range(8): trellis.color(x, y, OFF) time.sleep(0.05) while True: # The NeoTrellis can only be read every 17 milliseconds or so trellis.sync() time.sleep(0.02)