#!/usr/bin/env python3 # Control AD5206 digital potentiometer using SPI # remind me to set geany from tabs to spaces import spidev import time import RPi.GPIO as GPIO # Setup the SPI connection spi = spidev.SpiDev() spi.open(0, 0) # Bus 0, device 0 (Chip Select 0) spi.max_speed_hz = 50000 # Set the SPI speed (adjust as needed) # IO Chip Select pins cs1 = 23 cs2 = 24 cs3 = 25 # Constants MAX = 255 MIN = 0 MID = 127 # Setup GPIO for Chip Select (CS) GPIO.setmode(GPIO.BCM) GPIO.setwarnings(False) GPIO.setup(cs1, GPIO.OUT) # Chip Select for AD5206 #1 GPIO.setup(cs2, GPIO.OUT) # Chip Select for AD5206 #2 GPIO.setup(cs3, GPIO.OUT) # Chip Select for AD5206 #3 # Function to write data to a specific channel of an AD5206 def set_pot(cs_pin, channel, value): if channel < 0 or channel > 5: raise ValueError("Channel must be between 0 and 5.") if value < 0 or value > 255: raise ValueError("Value must be between 0 and 255.") GPIO.output(cs_pin, GPIO.LOW) # Enable the chip by pulling CS low # Command byte: Bits 2:0 for channel (0-5), others 0 command_byte = channel & 0x07 # Ensure only the last 3 bits are used data = [command_byte, value] # Command byte followed by value spi.xfer2(data) # Send the data to the AD5206 GPIO.output(cs_pin, GPIO.HIGH) # Disable the chip by pulling CS high print("AD5206 control program running. Press Ctrl+C to exit.") print("I forget is 0 min brightness or max?") # Enable all the devices for write GPIO.output(cs1, GPIO.LOW) # Enable the chip by pulling CS low GPIO.output(cs2, GPIO.LOW) # Enable the chip by pulling CS low GPIO.output(cs3, GPIO.LOW) # Enable the chip by pulling CS low # Initialize all channels on all chips to minimum resistance for channel in range(6): set_pot(cs1, channel, MIN) set_pot(cs2, channel, MIN) set_pot(cs3, channel, MIN) # disable all the devices GPIO.output(cs1, GPIO.HIGH) # disable the chip by pulling CS high GPIO.output(cs2, GPIO.HIGH) # disable the chip by pulling CS high GPIO.output(cs3, GPIO.HIGH) # disable the chip by pulling CS high # Test: Set channel 3 on each chip to MID resistance #set_pot(cs1, 3, MID) #set_pot(cs2, 3, MID) #set_pot(cs3, 3, MID) # Cleanup GPIO on exit def cleanup(): GPIO.cleanup() spi.close() # Ensure GPIO cleanup on exit try: while True: # Example: Gradually increase channel 0 resistance on cs1 for value in range(MIN, MAX + 1, 10): for n in range(6): set_pot(cs1, n, value) # print(f{value}) time.sleep(0.1) for value in range(MIN, MAX + 1, 10): for n in range(6): set_pot(cs2, n, value) #print(f{value}) time.sleep(0.1) for value in range(MIN, MAX + 1, 10): for n in range(6): set_pot(cs3, n, value) #print(f{value}) time.sleep(0.1) except KeyboardInterrupt: print("\nExiting program.") finally: cleanup()