From 335490b185c2a182d28ba938677cd59f86c1699d Mon Sep 17 00:00:00 2001 From: jonny Date: Thu, 23 Jan 2025 17:31:03 +0100 Subject: [PATCH 01/14] Add rpi-scripts folder, Add global pin assignment in "interface_board_pins.py" --- rpi-scripts/examples/read_digital_inputs.py | 29 ++++++++ rpi-scripts/interface_board_pins.py | 80 +++++++++++++++++++++ 2 files changed, 109 insertions(+) create mode 100644 rpi-scripts/examples/read_digital_inputs.py create mode 100644 rpi-scripts/interface_board_pins.py diff --git a/rpi-scripts/examples/read_digital_inputs.py b/rpi-scripts/examples/read_digital_inputs.py new file mode 100644 index 0000000..8dcbbc0 --- /dev/null +++ b/rpi-scripts/examples/read_digital_inputs.py @@ -0,0 +1,29 @@ +# Add the parent directory to the module search path +sys.path.append(os.path.abspath(os.path.join(os.path.dirname(__file__), ".."))) +from interface_board_pins.py import GPIO_DIGITAL_INPUTS # map of which GPIO pins are associated with which input terminal (1-8) + +import RPi.GPIO as GPIO + + + +# Initialize GPIO +GPIO.setmode(GPIO.BCM) +for pin in DIGITAL_INPUTS.values(): + GPIO.setup(pin, GPIO.IN) + + + +# Repeatedly read GPIOs +print("Reading digital inputs:") +try: + while True: + for label, pin in DIGITAL_INPUTS.items(): + state = GPIO.input(pin) + print(f"Input {label} (GPIO {pin}): {'HIGH' if state else 'LOW'}") + print("-" * 40) + +except KeyboardInterrupt: + print("Exiting...") + +finally: + GPIO.cleanup() diff --git a/rpi-scripts/interface_board_pins.py b/rpi-scripts/interface_board_pins.py new file mode 100644 index 0000000..8bb289f --- /dev/null +++ b/rpi-scripts/interface_board_pins.py @@ -0,0 +1,80 @@ +# Pin mappings for GPIOs and other components specifically for the pi-interface-board_v1.0 + + + +# === Digital Inputs === +# Pin mappings for digital inputs (labeled on housing as 1-8) +GPIO_DIGITAL_INPUTS = { + 1: 25, # Dig-IN_1 is connected to GPIO_25 + 2: 16, # Dig-IN_2 is connected to GPIO_16 + 3: 26, # Dig-IN_3 is connected to GPIO_26 + 4: 13, # Dig-IN_4 is connected to GPIO_13 + 5: 6, # Dig-IN_5 is connected to GPIO_6 + 6: 5, # Dig-IN_6 is connected to GPIO_5 + 7: 22, # Dig-IN_7 is connected to GPIO_22 + 8: 24, # Dig-IN_8 is connected to GPIO_24 +} + + + + +# === Shift Register === +GPIO_SHIFT_REG_DATA = 27 +GPIO_SHIFT_REG_LATCH = 17 +GPIO_SHIFT_REG_CLOCK = 4 + + + + +# === ADC === +# ADC IC is connected to RPI SPI interface 0 (pins below) +ADC_SPI_BUS_NUM = 0 +ADC_SPI_DEVICE_NUM = 0 +ADC_SPI_CS_PIN = 8 # SPI Chip Select for MCP3208 +# MISO_0: GPIO_9 +# MOSI_0: GPIO_10 +# SCLK_0: GPIO_11 +# CE_0: GPIO# MCP3208 (ADC) + +ADC_CHANNELS = { + 1: 0, # Channel 1 = ADC channel 0 + 2: 1, # Channel 2 = ADC channel 1 + 3: 2, # ... + 4: 3, + 5: 4, + 6: 5, + 7: 6, + 8: 7 +} + + + + +# === SPI Terminal === +SPI_BUS_NUM = 1 +# MISO_1: GPIO_19 +# MOSI_1: GPIO_20 +# SCLK_1: GPIO_21 +# CE_1: GPIO_7 + + + + +# === I2C Terminal === +GPIO_I2C_SDA = 2 +GPIO_I2C_SCL = 3 + + + + +# === PWM outputs === +GPIO_PWM1 = 12 # RPI_PWM0 +GPIO_PWM2 = 18 # RPI_PWM0 too + + + + +# === UART / RS485 === +GPIO_UART_TX = 14 # RPI TXD +GPIO_UART_RX = 15 # RPI RXD +GPIO_UART_DIR = 23 \ No newline at end of file From 4abdc2f565e6d385ec2e677a1331c1ce91a831ba Mon Sep 17 00:00:00 2001 From: jonny Date: Fri, 24 Jan 2025 11:27:03 +0100 Subject: [PATCH 02/14] Add examples: ADC, Digital-out, Fix Digital-in; Add shift_register class --- rpi-scripts/examples/read_analog_inputs.py | 20 ++++++ rpi-scripts/examples/read_digital_inputs.py | 3 +- .../write_digital_outputs_shift_reg.py | 66 +++++++++++++++++++ .../interface_board_libs/shift_register.py | 49 ++++++++++++++ rpi-scripts/interface_board_pins.py | 5 ++ 5 files changed, 142 insertions(+), 1 deletion(-) create mode 100644 rpi-scripts/examples/read_analog_inputs.py create mode 100644 rpi-scripts/examples/write_digital_outputs_shift_reg.py create mode 100644 rpi-scripts/interface_board_libs/shift_register.py diff --git a/rpi-scripts/examples/read_analog_inputs.py b/rpi-scripts/examples/read_analog_inputs.py new file mode 100644 index 0000000..84f1c0a --- /dev/null +++ b/rpi-scripts/examples/read_analog_inputs.py @@ -0,0 +1,20 @@ +# Include external libraries +import os +import sys +import time +from mcp3208 import MCP3208 + + +# Include custom files +# Add the parent directory to the module search path +sys.path.append(os.path.abspath(os.path.join(os.path.dirname(__file__), ".."))) +from interface_board_libs.adc_mcp3208 import MCP3208 +from interface_board_pins import ADC_CHANNELS + + +adc = MCP3208() + +while True: + for i in range(8): + print('ADC[{}]: {:.2f}'.format(i, adc.read(i))) + time.sleep(0.5) \ No newline at end of file diff --git a/rpi-scripts/examples/read_digital_inputs.py b/rpi-scripts/examples/read_digital_inputs.py index 8dcbbc0..de2a5eb 100644 --- a/rpi-scripts/examples/read_digital_inputs.py +++ b/rpi-scripts/examples/read_digital_inputs.py @@ -1,5 +1,6 @@ # Add the parent directory to the module search path sys.path.append(os.path.abspath(os.path.join(os.path.dirname(__file__), ".."))) +# Include the common pin assignment (from parent folder) from interface_board_pins.py import GPIO_DIGITAL_INPUTS # map of which GPIO pins are associated with which input terminal (1-8) import RPi.GPIO as GPIO @@ -17,7 +18,7 @@ for pin in DIGITAL_INPUTS.values(): print("Reading digital inputs:") try: while True: - for label, pin in DIGITAL_INPUTS.items(): + for label, pin in GPIO_DIGITAL_INPUTS.items(): state = GPIO.input(pin) print(f"Input {label} (GPIO {pin}): {'HIGH' if state else 'LOW'}") print("-" * 40) diff --git a/rpi-scripts/examples/write_digital_outputs_shift_reg.py b/rpi-scripts/examples/write_digital_outputs_shift_reg.py new file mode 100644 index 0000000..1f40901 --- /dev/null +++ b/rpi-scripts/examples/write_digital_outputs_shift_reg.py @@ -0,0 +1,66 @@ +# Include external libraries +import os +import sys +from time import sleep + +# Add the parent directory to the module search path +sys.path.append(os.path.abspath(os.path.join(os.path.dirname(__file__), ".."))) + +# Include custom files +from interface_board_libs.shift_register import ShiftRegister # custom shift register class +from interface_board_pins import ( # pin / channel assignment + GPIO_SHIFT_REG_DATA, + GPIO_SHIFT_REG_LATCH, + GPIO_SHIFT_REG_CLOCK, + SHIFT_REG_CHANNEL_BUZZER, + SHIFT_REG_CHANNEL_RELAY1, + SHIFT_REG_CHANNEL_RELAY2, +) + + +# Initialize the shift register +sr = ShiftRegister(GPIO_SHIFT_REG_DATA, GPIO_SHIFT_REG_LATCH, GPIO_SHIFT_REG_CLOCK) + +try: + print("Writing to shift register...") + + # repeatedly write to shift register + while True: + # # Cycle through all combinations of pin states (write entire byte) + # print("Writing all byte values (0-255)...") + # for value in range(256): + # sr.write_byte(value) # Write the current value + # print(f"Output: {bin(value)}") # Print binary representation + # sleep(0.05) # Delay between each byte + + # Turn each pin on and off one by one + print("\nToggling each pin one by one...") + # channels 0-4 are connected to terminal only + for pin in range(4): # 0-4 are connected to terminal only + print(f"Setting pin {pin} HIGH.") + sr.set_pin(pin, True) # Set the pin HIGH + sleep(0.5) + print(f"Setting pin {pin} LOW.") + sr.set_pin(pin, False) # Set the pin LOW + sleep(0.5) + + # channels 5-7 are connected to terminal AND buzzer/relays + print("Activating buzzer...") + sr.set_pin(SHIFT_REG_CHANNEL_BUZZER, True) # Turn buzzer ON + sleep(0.5) + sr.set_pin(SHIFT_REG_CHANNEL_BUZZER, False) # Turn buzzer OFF + + print("Toggling Relay 1...") + sr.toggle_pin(SHIFT_REG_CHANNEL_RELAY1) + sleep(0.5) + sr.toggle_pin(SHIFT_REG_CHANNEL_RELAY1) + + print("Activating Relay 2...") + sr.set_pin(SHIFT_REG_CHANNEL_RELAY2, True) # Turn relay ON + sleep(0.5) + sr.set_pin(SHIFT_REG_CHANNEL_RELAY2, False) # Turn relay OFF + +finally: + sr.clear() # Clear the shift register + print("Shift register cleared.") + GPIO.cleanup() # Clean up GPIO settings diff --git a/rpi-scripts/interface_board_libs/shift_register.py b/rpi-scripts/interface_board_libs/shift_register.py new file mode 100644 index 0000000..8ab1f0e --- /dev/null +++ b/rpi-scripts/interface_board_libs/shift_register.py @@ -0,0 +1,49 @@ +import RPi.GPIO as GPIO +from time import sleep + + +class ShiftRegister: + def __init__(self, data_pin, latch_pin, clock_pin): + self.data_pin = data_pin + self.latch_pin = latch_pin + self.clock_pin = clock_pin + self.current_byte = 0 # Tracks the current state of the shift register + + GPIO.setmode(GPIO.BCM) + GPIO.setup(self.data_pin, GPIO.OUT) + GPIO.setup(self.latch_pin, GPIO.OUT) + GPIO.setup(self.clock_pin, GPIO.OUT) + + def write_byte(self, byte): + """Writes an 8-bit value to the shift register.""" + GPIO.output(self.latch_pin, 0) + for i in range(8): + GPIO.output(self.clock_pin, 0) + GPIO.output(self.data_pin, (byte >> (7 - i)) & 1) # MSB first + GPIO.output(self.clock_pin, 1) + GPIO.output(self.latch_pin, 1) + self.current_byte = byte # Update the internal state + + def clear(self): + """Clears the shift register (sets all outputs to 0).""" + self.write_byte(0) + + def set_pin(self, pin, state): + """ + Sets an individual pin to HIGH (1) or LOW (0). + Pins are numbered 0-7, with 0 being the MSB. + """ + if not 0 <= pin <= 7: + raise ValueError("Pin must be in range 0-7.") + if state: + self.current_byte |= (1 << (7 - pin)) # Set the bit to 1 + else: + self.current_byte &= ~(1 << (7 - pin)) # Set the bit to 0 + self.write_byte(self.current_byte) + + def toggle_pin(self, pin): + """Toggles the state of an individual pin.""" + if not 0 <= pin <= 7: + raise ValueError("Pin must be in range 0-7.") + self.current_byte ^= (1 << (7 - pin)) # Flip the bit + self.write_byte(self.current_byte) diff --git a/rpi-scripts/interface_board_pins.py b/rpi-scripts/interface_board_pins.py index 8bb289f..afadddf 100644 --- a/rpi-scripts/interface_board_pins.py +++ b/rpi-scripts/interface_board_pins.py @@ -23,6 +23,11 @@ GPIO_SHIFT_REG_DATA = 27 GPIO_SHIFT_REG_LATCH = 17 GPIO_SHIFT_REG_CLOCK = 4 +# Shift Register Channel Assignments +SHIFT_REG_CHANNEL_BUZZER = 7 # Buzzer connected to shift register channel 7 +SHIFT_REG_CHANNEL_RELAY1 = 6 # Relay 1 connected to shift register channel 6 +SHIFT_REG_CHANNEL_RELAY2 = 5 # Relay 2 connected to shift register channel 5 + From 6bd766ee41eae9378e9357d1657344299e48f63d Mon Sep 17 00:00:00 2001 From: jonny Date: Tue, 28 Jan 2025 16:30:25 +0100 Subject: [PATCH 03/14] Fix shift-register, pin assignment - Digital in/out tests work --- .gitignore | 7 +++ .../pass_through_inputs_to_outputs.py | 57 +++++++++++++++++++ rpi-scripts/examples/read_digital_inputs.py | 11 +++- .../write_digital_outputs_shift_reg.py | 50 +++++++++------- .../interface_board_libs/shift_register.py | 10 ++-- rpi-scripts/interface_board_pins.py | 10 ++-- 6 files changed, 116 insertions(+), 29 deletions(-) create mode 100644 rpi-scripts/examples/pass_through_inputs_to_outputs.py diff --git a/.gitignore b/.gitignore index 0fa35b9..f7814f2 100644 --- a/.gitignore +++ b/.gitignore @@ -23,3 +23,10 @@ fp-info-cache #freecad *.FCBak *.stl + + +#vim +*.swp + +#python +__pycache__ diff --git a/rpi-scripts/examples/pass_through_inputs_to_outputs.py b/rpi-scripts/examples/pass_through_inputs_to_outputs.py new file mode 100644 index 0000000..4a1517c --- /dev/null +++ b/rpi-scripts/examples/pass_through_inputs_to_outputs.py @@ -0,0 +1,57 @@ +import os +import sys +import time +import RPi.GPIO as GPIO + +# Add the parent directory to the module search path +sys.path.append(os.path.abspath(os.path.join(os.path.dirname(__file__), ".."))) + +# Import pin assignments and custom libraries +from interface_board_pins import GPIO_DIGITAL_INPUTS # Input GPIO mapping +from interface_board_pins import ( # Shift register pin assignment + GPIO_SHIFT_REG_DATA, + GPIO_SHIFT_REG_LATCH, + GPIO_SHIFT_REG_CLOCK, +) +from interface_board_libs.shift_register import ShiftRegister # Custom shift register class + +# Initialize GPIO for digital inputs +GPIO.setmode(GPIO.BCM) +for pin in GPIO_DIGITAL_INPUTS.values(): + print(f"Configuring GPIO pin {pin} as input") + GPIO.setup(pin, GPIO.IN) + +# Initialize shift register +sr = ShiftRegister(GPIO_SHIFT_REG_DATA, GPIO_SHIFT_REG_LATCH, GPIO_SHIFT_REG_CLOCK) + +# Main loop: Read inputs and write to shift register +print("\nStarting passthrough mode: Digital inputs → Shift register outputs") +try: + while True: + shift_register_value = 0 # Byte to be written to the shift register + print("\nReading inputs and updating shift register...") + + for i, (label, pin) in enumerate(GPIO_DIGITAL_INPUTS.items()): + state = GPIO.input(pin) # Read GPIO state + print(f"Input {label} (GPIO {pin}): {'HIGH' if state else 'LOW'}") + + # Set corresponding bit in shift register byte + if state: + shift_register_value |= (1 << i) # Set bit at position `i` + else: + shift_register_value &= ~(1 << i) # Clear bit at position `i` + + # Write the final byte to the shift register + sr.write_byte(shift_register_value) + print(f"Shift Register Output: {bin(shift_register_value)}") + + time.sleep(0.5) # Small delay to prevent excessive polling + +except KeyboardInterrupt: + print("\nExiting...") + +finally: + sr.clear() # Clear shift register before exiting + print("Shift register cleared.") + GPIO.cleanup() # Cleanup GPIO settings + diff --git a/rpi-scripts/examples/read_digital_inputs.py b/rpi-scripts/examples/read_digital_inputs.py index de2a5eb..3a3dde7 100644 --- a/rpi-scripts/examples/read_digital_inputs.py +++ b/rpi-scripts/examples/read_digital_inputs.py @@ -1,15 +1,19 @@ +import os +import sys # Add the parent directory to the module search path sys.path.append(os.path.abspath(os.path.join(os.path.dirname(__file__), ".."))) # Include the common pin assignment (from parent folder) -from interface_board_pins.py import GPIO_DIGITAL_INPUTS # map of which GPIO pins are associated with which input terminal (1-8) +from interface_board_pins import GPIO_DIGITAL_INPUTS # map of which GPIO pins are associated with which input terminal (1-8) import RPi.GPIO as GPIO +import time # Initialize GPIO GPIO.setmode(GPIO.BCM) -for pin in DIGITAL_INPUTS.values(): +for pin in GPIO_DIGITAL_INPUTS.values(): + print(f"configuring pin {pin} as input") GPIO.setup(pin, GPIO.IN) @@ -18,10 +22,13 @@ for pin in DIGITAL_INPUTS.values(): print("Reading digital inputs:") try: while True: + print("reading all gpio pins...") for label, pin in GPIO_DIGITAL_INPUTS.items(): + print(f"reading pin {pin}") state = GPIO.input(pin) print(f"Input {label} (GPIO {pin}): {'HIGH' if state else 'LOW'}") print("-" * 40) + time.sleep(0.5) except KeyboardInterrupt: print("Exiting...") diff --git a/rpi-scripts/examples/write_digital_outputs_shift_reg.py b/rpi-scripts/examples/write_digital_outputs_shift_reg.py index 1f40901..57b08e8 100644 --- a/rpi-scripts/examples/write_digital_outputs_shift_reg.py +++ b/rpi-scripts/examples/write_digital_outputs_shift_reg.py @@ -18,6 +18,11 @@ from interface_board_pins import ( # pin / channel assignment ) + +# Config +COUNT_UP_TEST_ENABLED = True + + # Initialize the shift register sr = ShiftRegister(GPIO_SHIFT_REG_DATA, GPIO_SHIFT_REG_LATCH, GPIO_SHIFT_REG_CLOCK) @@ -26,40 +31,47 @@ try: # repeatedly write to shift register while True: - # # Cycle through all combinations of pin states (write entire byte) - # print("Writing all byte values (0-255)...") - # for value in range(256): - # sr.write_byte(value) # Write the current value - # print(f"Output: {bin(value)}") # Print binary representation - # sleep(0.05) # Delay between each byte + # Cycle through all combinations of pin states (write entire byte) + if COUNT_UP_TEST_ENABLED: + print("Writing all byte values (0-255)...") + for value in range(256): + sr.write_byte(value) # Write the current value + print(f"Output: {bin(value)}") # Print binary representation + sleep(0.01) # Delay between each byte + + sleep(1) + sr.clear() # Clear the shift register + # Turn each pin on and off one by one print("\nToggling each pin one by one...") - # channels 0-4 are connected to terminal only - for pin in range(4): # 0-4 are connected to terminal only - print(f"Setting pin {pin} HIGH.") - sr.set_pin(pin, True) # Set the pin HIGH - sleep(0.5) - print(f"Setting pin {pin} LOW.") - sr.set_pin(pin, False) # Set the pin LOW - sleep(0.5) - - # channels 5-7 are connected to terminal AND buzzer/relays - print("Activating buzzer...") + # channels 0-2 are connected to buzzer and relays: + print(f"Num {SHIFT_REG_CHANNEL_BUZZER}: Toggling buzzer...") # channel 0 sr.set_pin(SHIFT_REG_CHANNEL_BUZZER, True) # Turn buzzer ON sleep(0.5) sr.set_pin(SHIFT_REG_CHANNEL_BUZZER, False) # Turn buzzer OFF - print("Toggling Relay 1...") + print(f"Num {SHIFT_REG_CHANNEL_RELAY1}: Toggling Relay 1...") # channel 1 sr.toggle_pin(SHIFT_REG_CHANNEL_RELAY1) sleep(0.5) sr.toggle_pin(SHIFT_REG_CHANNEL_RELAY1) - print("Activating Relay 2...") + print(f"Num {SHIFT_REG_CHANNEL_RELAY2}: Toggling Relay 2...") # channel 2 sr.set_pin(SHIFT_REG_CHANNEL_RELAY2, True) # Turn relay ON sleep(0.5) sr.set_pin(SHIFT_REG_CHANNEL_RELAY2, False) # Turn relay OFF + + # channels 3-7 are connected to terminals only (no dedicated device on pcb): + for pin in range(3,8): # 3-7 are connected to terminal only + print(f"Num: {pin}: Toggling Terminal") + sr.set_pin(pin, True) # Set the pin HIGH + sleep(0.5) + #print(f"Setting pin {pin} LOW.") + sr.set_pin(pin, False) # Set the pin LOW + #sleep(0.5) + + finally: sr.clear() # Clear the shift register print("Shift register cleared.") diff --git a/rpi-scripts/interface_board_libs/shift_register.py b/rpi-scripts/interface_board_libs/shift_register.py index 8ab1f0e..1745798 100644 --- a/rpi-scripts/interface_board_libs/shift_register.py +++ b/rpi-scripts/interface_board_libs/shift_register.py @@ -31,19 +31,21 @@ class ShiftRegister: def set_pin(self, pin, state): """ Sets an individual pin to HIGH (1) or LOW (0). - Pins are numbered 0-7, with 0 being the MSB. + Pins are numbered 0-7, with 0 being the LSB (Q0) and 7 being the MSB (Q7). """ if not 0 <= pin <= 7: raise ValueError("Pin must be in range 0-7.") if state: - self.current_byte |= (1 << (7 - pin)) # Set the bit to 1 + self.current_byte |= (1 << pin) # Set the bit to 1 else: - self.current_byte &= ~(1 << (7 - pin)) # Set the bit to 0 + self.current_byte &= ~(1 << pin) # Set the bit to 0 self.write_byte(self.current_byte) + def toggle_pin(self, pin): """Toggles the state of an individual pin.""" if not 0 <= pin <= 7: raise ValueError("Pin must be in range 0-7.") - self.current_byte ^= (1 << (7 - pin)) # Flip the bit + self.current_byte ^= (1 << pin) # Flip the bit self.write_byte(self.current_byte) + diff --git a/rpi-scripts/interface_board_pins.py b/rpi-scripts/interface_board_pins.py index afadddf..7b38ef4 100644 --- a/rpi-scripts/interface_board_pins.py +++ b/rpi-scripts/interface_board_pins.py @@ -23,10 +23,12 @@ GPIO_SHIFT_REG_DATA = 27 GPIO_SHIFT_REG_LATCH = 17 GPIO_SHIFT_REG_CLOCK = 4 + +# FIXME: numbering in schematic is wrong (inverse) layout / terminal order matches the shift register though (left to right -> 0-7) # Shift Register Channel Assignments -SHIFT_REG_CHANNEL_BUZZER = 7 # Buzzer connected to shift register channel 7 -SHIFT_REG_CHANNEL_RELAY1 = 6 # Relay 1 connected to shift register channel 6 -SHIFT_REG_CHANNEL_RELAY2 = 5 # Relay 2 connected to shift register channel 5 +SHIFT_REG_CHANNEL_BUZZER = 0 # Buzzer connected to shift register channel 7 +SHIFT_REG_CHANNEL_RELAY1 = 1 # Relay 1 connected to shift register channel 6 +SHIFT_REG_CHANNEL_RELAY2 = 2 # Relay 2 connected to shift register channel 5 @@ -82,4 +84,4 @@ GPIO_PWM2 = 18 # RPI_PWM0 too # === UART / RS485 === GPIO_UART_TX = 14 # RPI TXD GPIO_UART_RX = 15 # RPI RXD -GPIO_UART_DIR = 23 \ No newline at end of file +GPIO_UART_DIR = 23 From 1fa1149170a9a093f65ba3c19ba60ba210dee5f3 Mon Sep 17 00:00:00 2001 From: jonny Date: Tue, 28 Jan 2025 16:32:57 +0100 Subject: [PATCH 04/14] Add custom ADC lib - ADC test success --- rpi-scripts/examples/read_analog_inputs.py | 4 +- .../interface_board_libs/adc_mcp3208.py | 53 +++++++++++++++++++ 2 files changed, 55 insertions(+), 2 deletions(-) create mode 100644 rpi-scripts/interface_board_libs/adc_mcp3208.py diff --git a/rpi-scripts/examples/read_analog_inputs.py b/rpi-scripts/examples/read_analog_inputs.py index 84f1c0a..1eaa494 100644 --- a/rpi-scripts/examples/read_analog_inputs.py +++ b/rpi-scripts/examples/read_analog_inputs.py @@ -2,7 +2,6 @@ import os import sys import time -from mcp3208 import MCP3208 # Include custom files @@ -15,6 +14,7 @@ from interface_board_pins import ADC_CHANNELS adc = MCP3208() while True: + print ("==================") for i in range(8): print('ADC[{}]: {:.2f}'.format(i, adc.read(i))) - time.sleep(0.5) \ No newline at end of file + time.sleep(0.5) diff --git a/rpi-scripts/interface_board_libs/adc_mcp3208.py b/rpi-scripts/interface_board_libs/adc_mcp3208.py new file mode 100644 index 0000000..a560a2f --- /dev/null +++ b/rpi-scripts/interface_board_libs/adc_mcp3208.py @@ -0,0 +1,53 @@ +import spidev +import time + +class MCP3208: + def __init__(self, bus=0, device=0): + # Initialize SPI bus and device + self.spi = spidev.SpiDev() + self.spi.open(bus, device) # Default SPI bus 0, device 0 (you can change as needed) + self.spi.max_speed_hz = 1000000 # Adjust based on your needs (e.g., 1MHz) + self.spi.mode = 0b00 # Set SPI mode (Mode 0 for MCP3208) + + def read(self, channel): + """ + Read the ADC value from the specified channel (0-7). + """ + if channel < 0 or channel > 7: + raise ValueError("Channel must be between 0 and 7.") + + # MCP3208 sends a 3-byte response, which needs to be processed + # Start with the single bit control byte, followed by the channel selection + # MCP3208 uses 3 bits for the channel: 0-7 + # The command byte looks like this: + # | Start | Single-ended | Channel (3 bits) | Don't Care (1 bit) | + + # Construct the 3-byte command + # Start bit (1) | Single-ended (1) | Channel (3 bits) | Don't care (1) | End (1) + command = [1, (8 + channel) << 4, 0] + + # Send command and receive the 3-byte result + result = self.spi.xfer2(command) + + # Combine the result bytes (result is a list of 3 bytes) + # First byte is ignored, we want the 2nd and 3rd bytes for our result + value = ((result[1] & 0x03) << 8) | result[2] # Convert to 10-bit value (0-1023) + + return value + + def close(self): + """Close SPI connection.""" + self.spi.close() + +# Example usage: +if __name__ == "__main__": + adc = MCP3208() + try: + while True: + for i in range(8): + adc_value = adc.read(i) + print(f'ADC[{i}]: {adc_value}') + time.sleep(0.5) + finally: + adc.close() + From 1be9545cd182a3929e8b8a4b306562b16cda9862 Mon Sep 17 00:00:00 2001 From: jonny Date: Wed, 29 Jan 2025 11:08:53 +0100 Subject: [PATCH 05/14] Fix ADC-lib to use 12Bit, Rework read_analog example + channel mapping --- rpi-scripts/examples/read_analog_inputs.py | 68 +++++++++++++++++-- .../interface_board_libs/adc_mcp3208.py | 63 +++++++++++------ rpi-scripts/interface_board_pins.py | 59 +++++++++++----- 3 files changed, 146 insertions(+), 44 deletions(-) diff --git a/rpi-scripts/examples/read_analog_inputs.py b/rpi-scripts/examples/read_analog_inputs.py index 1eaa494..52ebbb3 100644 --- a/rpi-scripts/examples/read_analog_inputs.py +++ b/rpi-scripts/examples/read_analog_inputs.py @@ -7,14 +7,70 @@ import time # Include custom files # Add the parent directory to the module search path sys.path.append(os.path.abspath(os.path.join(os.path.dirname(__file__), ".."))) -from interface_board_libs.adc_mcp3208 import MCP3208 -from interface_board_pins import ADC_CHANNELS +from interface_board_libs.adc_mcp3208 import MCP3208 # custom driver for ADC-IC +from interface_board_pins import ( + ADC_CHANNELS, + + ADC_CHANNEL_T0__0_TO_3V3, + ADC_CHANNEL_T1__0_TO_3V3, + ADC_CHANNEL_T2__0_TO_5V, + ADC_CHANNEL_T3__0_TO_5V, + ADC_CHANNEL_T4__0_TO_12V, + ADC_CHANNEL_T5__0_TO_12V, + ADC_CHANNEL_T6__0_TO_20MA, + ADC_CHANNEL_T7__0_TO_20MA, +) # mapping of ADC channels to terminals +# create ADC instance adc = MCP3208() + + +# local helper function to scale the adc value to an actual voltage +def adc2value(adc_value, max_value): + max_adc = 4095 + return adc_value * max_value / max_adc + + + + while True: - print ("==================") - for i in range(8): - print('ADC[{}]: {:.2f}'.format(i, adc.read(i))) - time.sleep(0.5) + print ("") + + # Read all available channels in a loop according to terminal order / map + values = [] + for terminal, adc_channel in ADC_CHANNELS.items(): + value = adc.read(adc_channel) + print(f"T{terminal}: ADC={value:04d} => U_ADC = {adc2value(value, 3.3):5.3f}V") + + + # Read channels one by one using defined constants (more intuitive) + print("-" * 40) + value = adc.read(ADC_CHANNEL_T0__0_TO_3V3) + print(f"Terminal 0 (0 to 3.3V): ADC={value:04d} => Terminal={adc2value(value, 3.3):4.2f}V") + + value = adc.read(ADC_CHANNEL_T1__0_TO_3V3) + print(f"Terminal 1 (0 to 3.3V): ADC={value:04d} => Terminal={adc2value(value, 3.3):4.2f}V") + + value = adc.read(ADC_CHANNEL_T2__0_TO_5V) + print(f"Terminal 2 (0 to 5V): ADC={value:04d} => Terminal={adc2value(value, 5):4.2f}V") + + value = adc.read(ADC_CHANNEL_T3__0_TO_5V) + print(f"Terminal 3 (0 to 5V): ADC={value:04d} => Terminal={adc2value(value, 5):4.2f}V") + + value = adc.read(ADC_CHANNEL_T4__0_TO_12V) + print(f"Terminal 4 (0 to 12V): ADC={value:04d} => Terminal={adc2value(value, 12):05.2f}V") + + value = adc.read(ADC_CHANNEL_T5__0_TO_12V) + print(f"Terminal 5 (0 to 12V): ADC={value:04d} => Terminal={adc2value(value, 12):05.2f}V") + + value = adc.read(ADC_CHANNEL_T6__0_TO_20MA) + print(f"Terminal 6 (0 to 20mA): ADC={value:04d} => Terminal={adc2value(value, 20):05.2f}mA") + + value = adc.read(ADC_CHANNEL_T7__0_TO_20MA) + print(f"Terminal 7 (0 to 20mA): ADC={value:04d} => Terminal={adc2value(value, 20):05.2f}mA") + + print("-" * 40) + time.sleep(1) # Delay before next read cycle + diff --git a/rpi-scripts/interface_board_libs/adc_mcp3208.py b/rpi-scripts/interface_board_libs/adc_mcp3208.py index a560a2f..d985ecf 100644 --- a/rpi-scripts/interface_board_libs/adc_mcp3208.py +++ b/rpi-scripts/interface_board_libs/adc_mcp3208.py @@ -1,6 +1,9 @@ import spidev import time +DEBUG = False + + class MCP3208: def __init__(self, bus=0, device=0): # Initialize SPI bus and device @@ -9,36 +12,55 @@ class MCP3208: self.spi.max_speed_hz = 1000000 # Adjust based on your needs (e.g., 1MHz) self.spi.mode = 0b00 # Set SPI mode (Mode 0 for MCP3208) + def read(self, channel): """ Read the ADC value from the specified channel (0-7). """ - if channel < 0 or channel > 7: - raise ValueError("Channel must be between 0 and 7.") - # MCP3208 sends a 3-byte response, which needs to be processed - # Start with the single bit control byte, followed by the channel selection - # MCP3208 uses 3 bits for the channel: 0-7 - # The command byte looks like this: - # | Start | Single-ended | Channel (3 bits) | Don't Care (1 bit) | - - # Construct the 3-byte command - # Start bit (1) | Single-ended (1) | Channel (3 bits) | Don't care (1) | End (1) - command = [1, (8 + channel) << 4, 0] - - # Send command and receive the 3-byte result - result = self.spi.xfer2(command) - - # Combine the result bytes (result is a list of 3 bytes) - # First byte is ignored, we want the 2nd and 3rd bytes for our result - value = ((result[1] & 0x03) << 8) | result[2] # Convert to 10-bit value (0-1023) - - return value + # MCP3208 is a 12-bit SPI ADC. Communication requires sending a 3-byte command and receiving a 3-byte response. + # The bits in the command sequence are structured as follows: + # Command Byte (8 bits): + # | Start (1) | Mode (1) | Channel (3) | Padding (3) | + + # The MCP3208 responds with 3 bytes: + # - Byte 1: Contains the highest bit (bit 11) of the 12-bit ADC result. + # - Byte 2: Contains bits 10-3 of the ADC result. + # - Byte 3: Contains bits 2-0 of the ADC result. + + # Ensure the channel is valid (0-7) + if channel < 0 or channel > 7: + raise ValueError(f"Channel must be between 0 and 7. (current channel={channel})") + + # Construct the command byte sequence: + # - Start bit (1) -> 1000 0000 (0x80) + # - Single-ended (1) -> 1100 0000 (0xC0) + # - Channel (3 bits) shifted into position + cmd = 0x80 # Start bit: 1000 0000 + cmd |= 0x40 # Single-ended mode: 1100 0000 + cmd |= (channel & 0x07) << 3 # Move channel number to bits 5-3 + + # Send the command and receive the 3-byte response + ret = self.spi.xfer2([cmd, 0x00, 0x00]) # Send 3 bytes, receive 3 bytes + + if DEBUG: + print(f"result[0]: {bin(ret[0])}, result[1]: {bin(ret[1])}, result[2]: {bin(ret[2])}") + + # Extract the 12-bit ADC result from the received bytes: + val = (ret[0] & 0x01) << 11 # Extract bit 11 (MSB) + val |= ret[1] << 3 # Extract bits 10-3 + val |= ret[2] >> 5 # Extract bits 2-0 (shift down) + + return val & 0x0FFF # Mask to ensure only the lower 12 bits are used + + def close(self): """Close SPI connection.""" self.spi.close() + + # Example usage: if __name__ == "__main__": adc = MCP3208() @@ -50,4 +72,3 @@ if __name__ == "__main__": time.sleep(0.5) finally: adc.close() - diff --git a/rpi-scripts/interface_board_pins.py b/rpi-scripts/interface_board_pins.py index 7b38ef4..3022da1 100644 --- a/rpi-scripts/interface_board_pins.py +++ b/rpi-scripts/interface_board_pins.py @@ -2,28 +2,32 @@ + +# ====================== # === Digital Inputs === +# ====================== # Pin mappings for digital inputs (labeled on housing as 1-8) GPIO_DIGITAL_INPUTS = { - 1: 25, # Dig-IN_1 is connected to GPIO_25 - 2: 16, # Dig-IN_2 is connected to GPIO_16 - 3: 26, # Dig-IN_3 is connected to GPIO_26 - 4: 13, # Dig-IN_4 is connected to GPIO_13 - 5: 6, # Dig-IN_5 is connected to GPIO_6 - 6: 5, # Dig-IN_6 is connected to GPIO_5 - 7: 22, # Dig-IN_7 is connected to GPIO_22 - 8: 24, # Dig-IN_8 is connected to GPIO_24 + 0: 25, # Dig-IN_1 is connected to GPIO_25 + 1: 16, # Dig-IN_2 is connected to GPIO_16 + 2: 26, # Dig-IN_3 is connected to GPIO_26 + 3: 13, # Dig-IN_4 is connected to GPIO_13 + 4: 6, # Dig-IN_5 is connected to GPIO_6 + 5: 5, # Dig-IN_6 is connected to GPIO_5 + 6: 22, # Dig-IN_7 is connected to GPIO_22 + 7: 24, # Dig-IN_8 is connected to GPIO_24 } +# ====================== # === Shift Register === +# ====================== GPIO_SHIFT_REG_DATA = 27 GPIO_SHIFT_REG_LATCH = 17 GPIO_SHIFT_REG_CLOCK = 4 - # FIXME: numbering in schematic is wrong (inverse) layout / terminal order matches the shift register though (left to right -> 0-7) # Shift Register Channel Assignments SHIFT_REG_CHANNEL_BUZZER = 0 # Buzzer connected to shift register channel 7 @@ -33,7 +37,9 @@ SHIFT_REG_CHANNEL_RELAY2 = 2 # Relay 2 connected to shift register channel 5 -# === ADC === +# =============== +# ===== ADC ===== +# =============== # ADC IC is connected to RPI SPI interface 0 (pins below) ADC_SPI_BUS_NUM = 0 ADC_SPI_DEVICE_NUM = 0 @@ -43,21 +49,34 @@ ADC_SPI_CS_PIN = 8 # SPI Chip Select for MCP3208 # SCLK_0: GPIO_11 # CE_0: GPIO# MCP3208 (ADC) +# Pin mappings for Terminal number to actual ADC channels (due to routing they do not match) ADC_CHANNELS = { - 1: 0, # Channel 1 = ADC channel 0 - 2: 1, # Channel 2 = ADC channel 1 - 3: 2, # ... - 4: 3, + 0: 1, # Terminal 0 = ADC channel 1 + 1: 0, # Terminal 1 = ADC channel 0 + 2: 3, # ... + 3: 2, + 4: 5, 5: 4, - 6: 5, - 7: 6, - 8: 7 + 6: 7, + 7: 6 } +# Alternative to ADC_CHANNELS list have separate constants for the channels (more intuitive) +ADC_CHANNEL_T0__0_TO_3V3 = 1 +ADC_CHANNEL_T1__0_TO_3V3 = 0 +ADC_CHANNEL_T2__0_TO_5V = 3 +ADC_CHANNEL_T3__0_TO_5V = 2 +ADC_CHANNEL_T4__0_TO_12V = 5 +ADC_CHANNEL_T5__0_TO_12V = 4 +ADC_CHANNEL_T6__0_TO_20MA = 7 +ADC_CHANNEL_T7__0_TO_20MA = 6 + +# ==================== # === SPI Terminal === +# ==================== SPI_BUS_NUM = 1 # MISO_1: GPIO_19 # MOSI_1: GPIO_20 @@ -67,21 +86,27 @@ SPI_BUS_NUM = 1 +# ==================== # === I2C Terminal === +# ==================== GPIO_I2C_SDA = 2 GPIO_I2C_SCL = 3 +# =================== # === PWM outputs === +# =================== GPIO_PWM1 = 12 # RPI_PWM0 GPIO_PWM2 = 18 # RPI_PWM0 too +# ==================== # === UART / RS485 === +# ==================== GPIO_UART_TX = 14 # RPI TXD GPIO_UART_RX = 15 # RPI RXD GPIO_UART_DIR = 23 From cd0ebd889145da82bbdec57b47d648e3d6b3f661 Mon Sep 17 00:00:00 2001 From: jonny Date: Thu, 30 Jan 2025 11:08:18 +0100 Subject: [PATCH 06/14] Add PWM test, Minor optimizations, Swap Relay + PWM assignment --- .../pass_through_inputs_to_outputs.py | 15 +++- .../write_digital_outputs_shift_reg.py | 24 +++--- rpi-scripts/examples/write_pwm_outputs.py | 76 +++++++++++++++++++ rpi-scripts/interface_board_pins.py | 10 +-- 4 files changed, 106 insertions(+), 19 deletions(-) create mode 100644 rpi-scripts/examples/write_pwm_outputs.py diff --git a/rpi-scripts/examples/pass_through_inputs_to_outputs.py b/rpi-scripts/examples/pass_through_inputs_to_outputs.py index 4a1517c..f42b6fb 100644 --- a/rpi-scripts/examples/pass_through_inputs_to_outputs.py +++ b/rpi-scripts/examples/pass_through_inputs_to_outputs.py @@ -3,10 +3,11 @@ import sys import time import RPi.GPIO as GPIO -# Add the parent directory to the module search path -sys.path.append(os.path.abspath(os.path.join(os.path.dirname(__file__), ".."))) + # Import pin assignments and custom libraries +# Add the parent directory to the module search path +sys.path.append(os.path.abspath(os.path.join(os.path.dirname(__file__), ".."))) from interface_board_pins import GPIO_DIGITAL_INPUTS # Input GPIO mapping from interface_board_pins import ( # Shift register pin assignment GPIO_SHIFT_REG_DATA, @@ -15,15 +16,21 @@ from interface_board_pins import ( # Shift register pin assignment ) from interface_board_libs.shift_register import ShiftRegister # Custom shift register class + + # Initialize GPIO for digital inputs GPIO.setmode(GPIO.BCM) for pin in GPIO_DIGITAL_INPUTS.values(): print(f"Configuring GPIO pin {pin} as input") GPIO.setup(pin, GPIO.IN) + + # Initialize shift register sr = ShiftRegister(GPIO_SHIFT_REG_DATA, GPIO_SHIFT_REG_LATCH, GPIO_SHIFT_REG_CLOCK) + + # Main loop: Read inputs and write to shift register print("\nStarting passthrough mode: Digital inputs → Shift register outputs") try: @@ -43,9 +50,9 @@ try: # Write the final byte to the shift register sr.write_byte(shift_register_value) - print(f"Shift Register Output: {bin(shift_register_value)}") + print(f"Shift Register Output: {format(shift_register_value, '08b')[::-1]}") # Print binary representation (mirrored, lsb first = terminal order) - time.sleep(0.5) # Small delay to prevent excessive polling + time.sleep(0.3) # Small delay to prevent excessive polling except KeyboardInterrupt: print("\nExiting...") diff --git a/rpi-scripts/examples/write_digital_outputs_shift_reg.py b/rpi-scripts/examples/write_digital_outputs_shift_reg.py index 57b08e8..7b67839 100644 --- a/rpi-scripts/examples/write_digital_outputs_shift_reg.py +++ b/rpi-scripts/examples/write_digital_outputs_shift_reg.py @@ -1,12 +1,13 @@ # Include external libraries import os import sys +import RPi.GPIO as GPIO from time import sleep -# Add the parent directory to the module search path -sys.path.append(os.path.abspath(os.path.join(os.path.dirname(__file__), ".."))) # Include custom files +# Add the parent directory to the module search path +sys.path.append(os.path.abspath(os.path.join(os.path.dirname(__file__), ".."))) from interface_board_libs.shift_register import ShiftRegister # custom shift register class from interface_board_pins import ( # pin / channel assignment GPIO_SHIFT_REG_DATA, @@ -20,7 +21,9 @@ from interface_board_pins import ( # pin / channel assignment # Config -COUNT_UP_TEST_ENABLED = True +COUNT_UP_TEST_ENABLED = False +DELAY_COUNT_UP = 0.008 +DELAY_TOGGLE = 0.3 # Initialize the shift register @@ -29,6 +32,7 @@ sr = ShiftRegister(GPIO_SHIFT_REG_DATA, GPIO_SHIFT_REG_LATCH, GPIO_SHIFT_REG_CLO try: print("Writing to shift register...") + # repeatedly write to shift register while True: # Cycle through all combinations of pin states (write entire byte) @@ -36,10 +40,10 @@ try: print("Writing all byte values (0-255)...") for value in range(256): sr.write_byte(value) # Write the current value - print(f"Output: {bin(value)}") # Print binary representation - sleep(0.01) # Delay between each byte + print(f"Output: {'{0:08b}'.format(value)}") # Print binary representation + sleep(DELAY_COUNT_UP) # Delay between each byte - sleep(1) + sleep(0.5) sr.clear() # Clear the shift register @@ -48,17 +52,17 @@ try: # channels 0-2 are connected to buzzer and relays: print(f"Num {SHIFT_REG_CHANNEL_BUZZER}: Toggling buzzer...") # channel 0 sr.set_pin(SHIFT_REG_CHANNEL_BUZZER, True) # Turn buzzer ON - sleep(0.5) + sleep(DELAY_TOGGLE) sr.set_pin(SHIFT_REG_CHANNEL_BUZZER, False) # Turn buzzer OFF print(f"Num {SHIFT_REG_CHANNEL_RELAY1}: Toggling Relay 1...") # channel 1 sr.toggle_pin(SHIFT_REG_CHANNEL_RELAY1) - sleep(0.5) + sleep(DELAY_TOGGLE) sr.toggle_pin(SHIFT_REG_CHANNEL_RELAY1) print(f"Num {SHIFT_REG_CHANNEL_RELAY2}: Toggling Relay 2...") # channel 2 sr.set_pin(SHIFT_REG_CHANNEL_RELAY2, True) # Turn relay ON - sleep(0.5) + sleep(DELAY_TOGGLE) sr.set_pin(SHIFT_REG_CHANNEL_RELAY2, False) # Turn relay OFF @@ -66,7 +70,7 @@ try: for pin in range(3,8): # 3-7 are connected to terminal only print(f"Num: {pin}: Toggling Terminal") sr.set_pin(pin, True) # Set the pin HIGH - sleep(0.5) + sleep(DELAY_TOGGLE) #print(f"Setting pin {pin} LOW.") sr.set_pin(pin, False) # Set the pin LOW #sleep(0.5) diff --git a/rpi-scripts/examples/write_pwm_outputs.py b/rpi-scripts/examples/write_pwm_outputs.py new file mode 100644 index 0000000..f85aaed --- /dev/null +++ b/rpi-scripts/examples/write_pwm_outputs.py @@ -0,0 +1,76 @@ +# Include external libraries +import os +import sys +import RPi.GPIO as GPIO +from time import sleep + + +# Include custom files +# Add the parent directory to the module search path +sys.path.append(os.path.abspath(os.path.join(os.path.dirname(__file__), ".."))) +from interface_board_pins import ( # pin / channel assignment + GPIO_PWM1, # RPI_PWM0 + GPIO_PWM2 # RPI_PWM0 too +) + + + +# Config +BLINK_ONLY = False + + + +# PWM Settings +FREQ = 1000 # PWM frequency in Hz +STEP = 2 # Step size for fading +DELAY = 0.03 # Delay between steps + +try: + print("Configuring PWM pins...") + GPIO.setmode(GPIO.BCM) + GPIO.setup(GPIO_PWM1, GPIO.OUT) + GPIO.setup(GPIO_PWM2, GPIO.OUT) + + + if BLINK_ONLY: + while True: + print(f"PWM1 ON (GPIO {GPIO_PWM1})") + GPIO.output(GPIO_PWM1, 1) + sleep(2) + print("PWM1 OFF") + GPIO.output(GPIO_PWM1, 0) + print(f"PWM2 ON (GPIO {GPIO_PWM2})") + GPIO.output(GPIO_PWM2, 1) + sleep(2) + print("PWM2 OFF") + GPIO.output(GPIO_PWM2, 0) + + + # Initialize PWM on both pins + pwm1 = GPIO.PWM(GPIO_PWM1, FREQ) + pwm2 = GPIO.PWM(GPIO_PWM2, FREQ) + + pwm1.start(0) # Start with 0% duty cycle + pwm2.start(100) # Start with 100% duty cycle + + print("Starting PWM fade effect...") + while True: + # Fade up PWM1 and fade down PWM2 + for duty in range(0, 101, STEP): # Duty cycle from 0% to 100% + pwm1.ChangeDutyCycle(duty) + pwm2.ChangeDutyCycle(100 - duty) # Opposite fade + print(f"PWM1: {duty}% | PWM2: {100 - duty}%") + sleep(DELAY) + + # Fade down PWM1 and fade up PWM2 + for duty in range(100, -1, -STEP): # Duty cycle from 100% to 0% + pwm1.ChangeDutyCycle(duty) + pwm2.ChangeDutyCycle(100 - duty) # Opposite fade + print(f"PWM1: {duty}% | PWM2: {100 - duty}%") + sleep(DELAY) + +finally: + print("Exiting, stopping PWM and cleaning up...") + pwm1.stop() + pwm2.stop() + GPIO.cleanup() # Clean up GPIO settings diff --git a/rpi-scripts/interface_board_pins.py b/rpi-scripts/interface_board_pins.py index 3022da1..b265ce5 100644 --- a/rpi-scripts/interface_board_pins.py +++ b/rpi-scripts/interface_board_pins.py @@ -30,9 +30,9 @@ GPIO_SHIFT_REG_CLOCK = 4 # FIXME: numbering in schematic is wrong (inverse) layout / terminal order matches the shift register though (left to right -> 0-7) # Shift Register Channel Assignments -SHIFT_REG_CHANNEL_BUZZER = 0 # Buzzer connected to shift register channel 7 -SHIFT_REG_CHANNEL_RELAY1 = 1 # Relay 1 connected to shift register channel 6 -SHIFT_REG_CHANNEL_RELAY2 = 2 # Relay 2 connected to shift register channel 5 +SHIFT_REG_CHANNEL_BUZZER = 0 # Buzzer connected to shift register channel 0 +SHIFT_REG_CHANNEL_RELAY1 = 2 # Relay 1 connected to shift register channel 2 +SHIFT_REG_CHANNEL_RELAY2 = 1 # Relay 2 connected to shift register channel 1 @@ -98,8 +98,8 @@ GPIO_I2C_SCL = 3 # =================== # === PWM outputs === # =================== -GPIO_PWM1 = 12 # RPI_PWM0 -GPIO_PWM2 = 18 # RPI_PWM0 too +GPIO_PWM1 = 18 # RPI_PWM0 +GPIO_PWM2 = 12 # RPI_PWM0 too From 48bfbb98ef02417d04254cab18914408d15511ae Mon Sep 17 00:00:00 2001 From: jonny Date: Thu, 30 Jan 2025 11:57:05 +0100 Subject: [PATCH 07/14] Add gui for control and visualizing inputs (basic functionality works) --- rpi-scripts/gui/gui_helpers.py | 49 +++++++++++++++ rpi-scripts/gui/main.py | 105 +++++++++++++++++++++++++++++++++ 2 files changed, 154 insertions(+) create mode 100755 rpi-scripts/gui/gui_helpers.py create mode 100755 rpi-scripts/gui/main.py diff --git a/rpi-scripts/gui/gui_helpers.py b/rpi-scripts/gui/gui_helpers.py new file mode 100755 index 0000000..5f63315 --- /dev/null +++ b/rpi-scripts/gui/gui_helpers.py @@ -0,0 +1,49 @@ +import tkinter as tk +from matplotlib.figure import Figure +from matplotlib.backends.backend_tkagg import FigureCanvasTkAgg +import time + +def create_adc_plot(frame, adc): + """ + Creates a live-updating ADC plot in the given Tkinter frame. + """ + figure = Figure(figsize=(6, 4), dpi=100) + ax = figure.add_subplot(1, 1, 1) + ax.set_title("ADC Readings Over Time") + ax.set_xlabel("Time (s)") + ax.set_ylabel("Voltage (V)") + ax.set_ylim(0, 12) + + canvas = FigureCanvasTkAgg(figure, master=frame) + canvas.get_tk_widget().pack(fill=tk.BOTH, expand=True) + + adc_channels = list(range(8)) + data = {ch: [] for ch in adc_channels} + time_data = [] + + def update_plot(): + current_time = time.time() + if len(time_data) > 50: + for ch in adc_channels: + data[ch].pop(0) + time_data.pop(0) + + time_data.append(current_time) + for ch in adc_channels: + voltage = round(adc.read(ch) * 12 / 4095, 2) + data[ch].append(voltage) + + ax.clear() + ax.set_title("ADC Readings Over Time") + ax.set_xlabel("Time (s)") + ax.set_ylabel("Voltage (V)") + ax.set_ylim(0, 12) + + for ch in adc_channels: + ax.plot(time_data, data[ch], label=f"ADC {ch+1}") + + ax.legend(loc="upper right") + canvas.draw() + frame.after(1000, update_plot) + + update_plot() diff --git a/rpi-scripts/gui/main.py b/rpi-scripts/gui/main.py new file mode 100755 index 0000000..7ee30f3 --- /dev/null +++ b/rpi-scripts/gui/main.py @@ -0,0 +1,105 @@ +import os +import sys +import time +import tkinter as tk +from tkinter import ttk +from tkinter import messagebox +import RPi.GPIO as GPIO +# Add the parent directory to the module search path +sys.path.append(os.path.abspath(os.path.join(os.path.dirname(__file__), ".."))) +from interface_board_libs.adc_mcp3208 import MCP3208 +from interface_board_libs.shift_register import ShiftRegister +from interface_board_pins import * # Import pin assignments +from gui_helpers import create_adc_plot + +# Initialize ADC & Shift Register +adc = MCP3208() +shift_reg = ShiftRegister(GPIO_SHIFT_REG_DATA, GPIO_SHIFT_REG_LATCH, GPIO_SHIFT_REG_CLOCK) + +# GPIO Setup +GPIO.setmode(GPIO.BCM) +for pin in GPIO_DIGITAL_INPUTS.values(): + GPIO.setup(pin, GPIO.IN) +GPIO.setup(GPIO_PWM1, GPIO.OUT) +GPIO.setup(GPIO_PWM2, GPIO.OUT) +pwm1 = GPIO.PWM(GPIO_PWM1, 1000) +pwm2 = GPIO.PWM(GPIO_PWM2, 1000) +pwm1.start(0) +pwm2.start(0) + +# Tkinter GUI +root = tk.Tk() +root.title("Raspberry Pi Interface Board") +root.attributes('-fullscreen', True) +root.configure(bg="black") + +# Tabbed Interface +notebook = ttk.Notebook(root) +main_frame = ttk.Frame(notebook) +plot_frame = ttk.Frame(notebook) +notebook.add(main_frame, text="Controls") +notebook.add(plot_frame, text="ADC Plot") +notebook.pack(expand=True, fill="both") + +# Layout Variables +digital_input_states = [tk.StringVar(value="LOW") for _ in range(8)] +digital_output_states = [tk.BooleanVar(value=False) for _ in range(8)] +adc_values = [tk.StringVar(value="0.00V") for _ in range(8)] +pwm_values = [tk.IntVar(value=0), tk.IntVar(value=0)] + +def update_inputs(): + for i, pin in enumerate(GPIO_DIGITAL_INPUTS.values()): + digital_input_states[i].set("HIGH" if GPIO.input(pin) else "LOW") + root.after(500, update_inputs) + +def update_adc(): + for i, adc_channel in enumerate(ADC_CHANNELS.values()): + value = adc.read(adc_channel) + adc_values[i].set(f"{round(value * 12 / 4095, 2)}V") + root.after(1000, update_adc) + +def toggle_output(index): + shift_reg.set_pin(index, digital_output_states[index].get()) + +def update_pwm(channel, value): + duty_cycle = int(float(value)) + if channel == 0: + pwm1.ChangeDutyCycle(duty_cycle) + else: + pwm2.ChangeDutyCycle(duty_cycle) + +def exit_program(): + pwm1.stop() + pwm2.stop() + GPIO.cleanup() + root.quit() + +# Create UI Elements in Main Frame +frame = ttk.Frame(main_frame, padding=20) +frame.pack(expand=True, fill="both") + +for i in range(8): + ttk.Label(frame, text=f"ADC {i+1}:").grid(row=i, column=0, sticky="e") + ttk.Label(frame, textvariable=adc_values[i], width=10).grid(row=i, column=1, sticky="w") + ttk.Label(frame, text=f"IN {i+1}:").grid(row=i, column=2, sticky="e") + ttk.Label(frame, textvariable=digital_input_states[i], width=6).grid(row=i, column=3, sticky="w") + btn = ttk.Checkbutton(frame, text=f"OUT {i+1}", variable=digital_output_states[i], command=lambda i=i: toggle_output(i)) + btn.grid(row=i, column=4, sticky="w") + +for i in range(2): + ttk.Label(frame, text=f"PWM{i+1}").grid(row=i, column=5, sticky="e") + slider = ttk.Scale(frame, from_=0, to=100, orient="horizontal", length=300, variable=pwm_values[i], command=lambda val, i=i: update_pwm(i, val)) + slider.grid(row=i, column=6, sticky="w") + +exit_button = ttk.Button(root, text="Exit", command=exit_program) +exit_button.place(relx=0.9, rely=0.9, anchor="center") + +# Create ADC Plot in Second Tab +create_adc_plot(plot_frame, adc) + +# Start Updates +update_inputs() +update_adc() + +# Run GUI +root.mainloop() From bb8420553107161ae70b9359271cc13457454678 Mon Sep 17 00:00:00 2001 From: jonny Date: Thu, 30 Jan 2025 13:59:56 +0100 Subject: [PATCH 08/14] GUI: Outsource tabs, Add tab digital_plot --- rpi-scripts/gui/main.py | 74 ++----------- .../gui/{gui_helpers.py => tab_adc_plot.py} | 101 +++++++++--------- rpi-scripts/gui/tab_control.py | 62 +++++++++++ rpi-scripts/gui/tab_digital_plot.py | 56 ++++++++++ 4 files changed, 178 insertions(+), 115 deletions(-) mode change 100755 => 100644 rpi-scripts/gui/main.py rename rpi-scripts/gui/{gui_helpers.py => tab_adc_plot.py} (81%) mode change 100755 => 100644 create mode 100644 rpi-scripts/gui/tab_control.py create mode 100644 rpi-scripts/gui/tab_digital_plot.py diff --git a/rpi-scripts/gui/main.py b/rpi-scripts/gui/main.py old mode 100755 new mode 100644 index 7ee30f3..bbd21cc --- a/rpi-scripts/gui/main.py +++ b/rpi-scripts/gui/main.py @@ -1,16 +1,17 @@ import os import sys -import time import tkinter as tk from tkinter import ttk -from tkinter import messagebox import RPi.GPIO as GPIO + # Add the parent directory to the module search path sys.path.append(os.path.abspath(os.path.join(os.path.dirname(__file__), ".."))) from interface_board_libs.adc_mcp3208 import MCP3208 from interface_board_libs.shift_register import ShiftRegister from interface_board_pins import * # Import pin assignments -from gui_helpers import create_adc_plot +from tab_control import create_control_tab +from tab_adc_plot import create_adc_plot_tab +from tab_digital_plot import create_digital_plot_tab # Initialize ADC & Shift Register adc = MCP3208() @@ -35,71 +36,12 @@ root.configure(bg="black") # Tabbed Interface notebook = ttk.Notebook(root) -main_frame = ttk.Frame(notebook) -plot_frame = ttk.Frame(notebook) -notebook.add(main_frame, text="Controls") -notebook.add(plot_frame, text="ADC Plot") notebook.pack(expand=True, fill="both") -# Layout Variables -digital_input_states = [tk.StringVar(value="LOW") for _ in range(8)] -digital_output_states = [tk.BooleanVar(value=False) for _ in range(8)] -adc_values = [tk.StringVar(value="0.00V") for _ in range(8)] -pwm_values = [tk.IntVar(value=0), tk.IntVar(value=0)] - -def update_inputs(): - for i, pin in enumerate(GPIO_DIGITAL_INPUTS.values()): - digital_input_states[i].set("HIGH" if GPIO.input(pin) else "LOW") - root.after(500, update_inputs) - -def update_adc(): - for i, adc_channel in enumerate(ADC_CHANNELS.values()): - value = adc.read(adc_channel) - adc_values[i].set(f"{round(value * 12 / 4095, 2)}V") - root.after(1000, update_adc) - -def toggle_output(index): - shift_reg.set_pin(index, digital_output_states[index].get()) - -def update_pwm(channel, value): - duty_cycle = int(float(value)) - if channel == 0: - pwm1.ChangeDutyCycle(duty_cycle) - else: - pwm2.ChangeDutyCycle(duty_cycle) - -def exit_program(): - pwm1.stop() - pwm2.stop() - GPIO.cleanup() - root.quit() - -# Create UI Elements in Main Frame -frame = ttk.Frame(main_frame, padding=20) -frame.pack(expand=True, fill="both") - -for i in range(8): - ttk.Label(frame, text=f"ADC {i+1}:").grid(row=i, column=0, sticky="e") - ttk.Label(frame, textvariable=adc_values[i], width=10).grid(row=i, column=1, sticky="w") - ttk.Label(frame, text=f"IN {i+1}:").grid(row=i, column=2, sticky="e") - ttk.Label(frame, textvariable=digital_input_states[i], width=6).grid(row=i, column=3, sticky="w") - btn = ttk.Checkbutton(frame, text=f"OUT {i+1}", variable=digital_output_states[i], command=lambda i=i: toggle_output(i)) - btn.grid(row=i, column=4, sticky="w") - -for i in range(2): - ttk.Label(frame, text=f"PWM{i+1}").grid(row=i, column=5, sticky="e") - slider = ttk.Scale(frame, from_=0, to=100, orient="horizontal", length=300, variable=pwm_values[i], command=lambda val, i=i: update_pwm(i, val)) - slider.grid(row=i, column=6, sticky="w") - -exit_button = ttk.Button(root, text="Exit", command=exit_program) -exit_button.place(relx=0.9, rely=0.9, anchor="center") - -# Create ADC Plot in Second Tab -create_adc_plot(plot_frame, adc) - -# Start Updates -update_inputs() -update_adc() +# Add tabs +create_control_tab(notebook, adc, shift_reg, pwm1, pwm2) +create_adc_plot_tab(notebook, adc) +create_digital_plot_tab(notebook) # Run GUI root.mainloop() diff --git a/rpi-scripts/gui/gui_helpers.py b/rpi-scripts/gui/tab_adc_plot.py old mode 100755 new mode 100644 similarity index 81% rename from rpi-scripts/gui/gui_helpers.py rename to rpi-scripts/gui/tab_adc_plot.py index 5f63315..f0d934d --- a/rpi-scripts/gui/gui_helpers.py +++ b/rpi-scripts/gui/tab_adc_plot.py @@ -1,49 +1,52 @@ -import tkinter as tk -from matplotlib.figure import Figure -from matplotlib.backends.backend_tkagg import FigureCanvasTkAgg -import time - -def create_adc_plot(frame, adc): - """ - Creates a live-updating ADC plot in the given Tkinter frame. - """ - figure = Figure(figsize=(6, 4), dpi=100) - ax = figure.add_subplot(1, 1, 1) - ax.set_title("ADC Readings Over Time") - ax.set_xlabel("Time (s)") - ax.set_ylabel("Voltage (V)") - ax.set_ylim(0, 12) - - canvas = FigureCanvasTkAgg(figure, master=frame) - canvas.get_tk_widget().pack(fill=tk.BOTH, expand=True) - - adc_channels = list(range(8)) - data = {ch: [] for ch in adc_channels} - time_data = [] - - def update_plot(): - current_time = time.time() - if len(time_data) > 50: - for ch in adc_channels: - data[ch].pop(0) - time_data.pop(0) - - time_data.append(current_time) - for ch in adc_channels: - voltage = round(adc.read(ch) * 12 / 4095, 2) - data[ch].append(voltage) - - ax.clear() - ax.set_title("ADC Readings Over Time") - ax.set_xlabel("Time (s)") - ax.set_ylabel("Voltage (V)") - ax.set_ylim(0, 12) - - for ch in adc_channels: - ax.plot(time_data, data[ch], label=f"ADC {ch+1}") - - ax.legend(loc="upper right") - canvas.draw() - frame.after(1000, update_plot) - - update_plot() +import tkinter as tk +from tkinter import ttk +from matplotlib.figure import Figure +from matplotlib.backends.backend_tkagg import FigureCanvasTkAgg +import time + +ADC_PLOT_UPDATE_INTERVAL = 100 + +def create_adc_plot_tab(notebook, adc): + frame = ttk.Frame(notebook) + notebook.add(frame, text="ADC Plot") + + figure = Figure(figsize=(8, 5), dpi=100) + ax = figure.add_subplot(1, 1, 1) + ax.set_title("ADC Readings Over Time") + ax.set_xlabel("Time (s)") + ax.set_ylabel("Voltage (V)") + ax.set_ylim(0, 12) + + canvas = FigureCanvasTkAgg(figure, master=frame) + canvas.get_tk_widget().pack(fill=tk.BOTH, expand=True) + + adc_channels = list(range(8)) + data = {ch: [] for ch in adc_channels} + time_data = [] + + def update_plot(): + current_time = time.time() + if len(time_data) > 50: + for ch in adc_channels: + data[ch].pop(0) + time_data.pop(0) + + time_data.append(current_time) + for ch in adc_channels: + voltage = round(adc.read(ch) * 12 / 4095, 2) + data[ch].append(voltage) + + ax.clear() + ax.set_title("ADC Readings Over Time") + ax.set_xlabel("Time (s)") + ax.set_ylabel("Voltage (V)") + ax.set_ylim(0, 12) + + for ch in adc_channels: + ax.plot(time_data, data[ch], label=f"ADC {ch+1}") + + ax.legend(loc="upper right") + canvas.draw() + frame.after(ADC_PLOT_UPDATE_INTERVAL, update_plot) + + update_plot() diff --git a/rpi-scripts/gui/tab_control.py b/rpi-scripts/gui/tab_control.py new file mode 100644 index 0000000..f079300 --- /dev/null +++ b/rpi-scripts/gui/tab_control.py @@ -0,0 +1,62 @@ +import sys +import os +import tkinter as tk +from tkinter import ttk +import RPi.GPIO as GPIO + +# Add the parent directory to the module search path +sys.path.append(os.path.abspath(os.path.join(os.path.dirname(__file__), ".."))) +from interface_board_pins import * # Import pin assignments + +def create_control_tab(notebook, adc, shift_reg, pwm1, pwm2): + frame = ttk.Frame(notebook) + notebook.add(frame, text="Controls") + + digital_input_states = [tk.StringVar(value="LOW") for _ in range(8)] + digital_output_states = [tk.BooleanVar(value=False) for _ in range(8)] + adc_values = [tk.StringVar(value="0.00V") for _ in range(8)] + pwm_values = [tk.IntVar(value=0), tk.IntVar(value=0)] + + def update_inputs(): + for i, pin in enumerate(GPIO_DIGITAL_INPUTS.values()): + digital_input_states[i].set("HIGH" if GPIO.input(pin) else "LOW") + frame.after(500, update_inputs) + + def update_adc(): + for i, adc_channel in enumerate(ADC_CHANNELS.values()): + value = adc.read(adc_channel) + adc_values[i].set(f"{round(value * 12 / 4095, 2)}V") + frame.after(1000, update_adc) + + def toggle_output(index): + shift_reg.set_pin(index, digital_output_states[index].get()) + + def update_pwm(channel, value): + duty_cycle = int(float(value)) + if channel == 0: + pwm1.ChangeDutyCycle(duty_cycle) + else: + pwm2.ChangeDutyCycle(duty_cycle) + + # UI Layout + style = ttk.Style() + style.configure("TScale", thickness=30) # Increases slider thickness + + control_frame = ttk.Frame(frame, padding=30) + control_frame.pack(expand=True, fill="both") + + for i in range(8): + ttk.Label(control_frame, text=f"ADC {i+1}:", font=("Arial", 14)).grid(row=i, column=0, sticky="e") + ttk.Label(control_frame, textvariable=adc_values[i], width=10, font=("Arial", 14)).grid(row=i, column=1, sticky="w") + ttk.Label(control_frame, text=f"IN {i+1}:", font=("Arial", 14)).grid(row=i, column=2, sticky="e") + ttk.Label(control_frame, textvariable=digital_input_states[i], width=6, font=("Arial", 14)).grid(row=i, column=3, sticky="w") + btn = ttk.Checkbutton(control_frame, text=f"OUT {i+1}", variable=digital_output_states[i], command=lambda i=i: toggle_output(i)) + btn.grid(row=i, column=4, sticky="w") + + for i in range(2): + ttk.Label(control_frame, text=f"PWM{i+1}:", font=("Arial", 14)).grid(row=i, column=5, sticky="e") + slider = ttk.Scale(control_frame, from_=0, to=100, orient="horizontal", length=400, variable=pwm_values[i], command=lambda val, i=i: update_pwm(i, val), style="TScale") + slider.grid(row=i, column=6, sticky="w", pady=10) # Added spacing with `pady=10` + + update_inputs() + update_adc() diff --git a/rpi-scripts/gui/tab_digital_plot.py b/rpi-scripts/gui/tab_digital_plot.py new file mode 100644 index 0000000..25b8851 --- /dev/null +++ b/rpi-scripts/gui/tab_digital_plot.py @@ -0,0 +1,56 @@ +import sys +import os +import tkinter as tk +from tkinter import ttk +import RPi.GPIO as GPIO +from matplotlib.figure import Figure +from matplotlib.backends.backend_tkagg import FigureCanvasTkAgg +import time +# Add the parent directory to the module search path +sys.path.append(os.path.abspath(os.path.join(os.path.dirname(__file__), ".."))) +from interface_board_pins import * # Import pin assignments + +def create_digital_plot_tab(notebook): + frame = ttk.Frame(notebook) + notebook.add(frame, text="Digital Inputs") + + figure = Figure(figsize=(8, 5), dpi=100) + ax = figure.add_subplot(1, 1, 1) + ax.set_title("Digital Input States Over Time") + ax.set_xlabel("Time (s)") + ax.set_ylabel("State (0=LOW, 1=HIGH)") + ax.set_ylim(-0.2, 1.2) + + canvas = FigureCanvasTkAgg(figure, master=frame) + canvas.get_tk_widget().pack(fill=tk.BOTH, expand=True) + + input_channels = list(range(8)) + data = {ch: [] for ch in input_channels} + time_data = [] + + def update_plot(): + current_time = time.time() + if len(time_data) > 50: + for ch in input_channels: + data[ch].pop(0) + time_data.pop(0) + + time_data.append(current_time) + for ch in input_channels: + state = GPIO.input(GPIO_DIGITAL_INPUTS[ch]) + data[ch].append(state) + + ax.clear() + ax.set_title("Digital Input States Over Time") + ax.set_xlabel("Time (s)") + ax.set_ylabel("State (0=LOW, 1=HIGH)") + ax.set_ylim(-0.2, 1.2) + + for ch in input_channels: + ax.step(time_data, data[ch], label=f"IN {ch+1}", where="post") + + ax.legend(loc="upper right") + canvas.draw() + frame.after(500, update_plot) + + update_plot() From 7d83e354fa41c5b7b1c4f6a098b376f266c3cfcb Mon Sep 17 00:00:00 2001 From: jonny Date: Thu, 30 Jan 2025 17:15:36 +0100 Subject: [PATCH 09/14] GUI: Optimize performance, Layout, Add "EXIT" tab --- rpi-scripts/gui/main.py | 29 ++++++++ rpi-scripts/gui/tab_adc_plot.py | 50 ++++++------- rpi-scripts/gui/tab_control.py | 106 ++++++++++++++++++++++------ rpi-scripts/gui/tab_digital_plot.py | 59 +++++++++------- rpi-scripts/gui/tab_exit.py | 21 ++++++ 5 files changed, 191 insertions(+), 74 deletions(-) create mode 100644 rpi-scripts/gui/tab_exit.py diff --git a/rpi-scripts/gui/main.py b/rpi-scripts/gui/main.py index bbd21cc..607bc45 100644 --- a/rpi-scripts/gui/main.py +++ b/rpi-scripts/gui/main.py @@ -1,7 +1,9 @@ import os import sys +import time import tkinter as tk from tkinter import ttk +from tkinter import messagebox import RPi.GPIO as GPIO # Add the parent directory to the module search path @@ -10,8 +12,12 @@ from interface_board_libs.adc_mcp3208 import MCP3208 from interface_board_libs.shift_register import ShiftRegister from interface_board_pins import * # Import pin assignments from tab_control import create_control_tab +from tab_control import set_updating_enabled as tab_control__set_updating_enabled from tab_adc_plot import create_adc_plot_tab +from tab_adc_plot import set_updating_enabled as tab_analog_plot__set_updating_enabled from tab_digital_plot import create_digital_plot_tab +from tab_digital_plot import set_updating_enabled as tab_digital_plot__set_updating_enabled +from tab_exit import create_exit_tab # Initialize ADC & Shift Register adc = MCP3208() @@ -38,10 +44,33 @@ root.configure(bg="black") notebook = ttk.Notebook(root) notebook.pack(expand=True, fill="both") +# Track active tab +def on_tab_change(event): + active_tab = event.widget.tab(event.widget.index("current"), "text") + print (f"INFO: switched to tab {active_tab}") + match active_tab: + case "ADC Plot": + tab_control__set_updating_enabled(False) + tab_analog_plot__set_updating_enabled(True) + tab_digital_plot__set_updating_enabled(False) + case "Digital Inputs": + tab_control__set_updating_enabled(False) + tab_analog_plot__set_updating_enabled(False) + tab_digital_plot__set_updating_enabled(True) + case "Controls": + tab_control__set_updating_enabled(True) + tab_analog_plot__set_updating_enabled(False) + tab_digital_plot__set_updating_enabled(False) + case _: + print(f"unhandled change to tab {active_tab}") + +notebook.bind("<>", on_tab_change) + # Add tabs create_control_tab(notebook, adc, shift_reg, pwm1, pwm2) create_adc_plot_tab(notebook, adc) create_digital_plot_tab(notebook) +create_exit_tab(notebook, root, pwm1, pwm2) # Run GUI root.mainloop() diff --git a/rpi-scripts/gui/tab_adc_plot.py b/rpi-scripts/gui/tab_adc_plot.py index f0d934d..ac87be4 100644 --- a/rpi-scripts/gui/tab_adc_plot.py +++ b/rpi-scripts/gui/tab_adc_plot.py @@ -4,7 +4,14 @@ from matplotlib.figure import Figure from matplotlib.backends.backend_tkagg import FigureCanvasTkAgg import time -ADC_PLOT_UPDATE_INTERVAL = 100 +ADC_PLOT_UPDATE_INTERVAL = 50 # 20 FPS, smooth and efficient +NOT_ACTIVE_CHECK_INTERVAL = 2000 +MAX_HISTORY = 100 + +updating_enabled = False +adc_channels = list(range(8)) +data = {ch: [0] * MAX_HISTORY for ch in adc_channels} # Preallocate lists +time_data = list(range(-MAX_HISTORY, 0)) # Simulated time axis def create_adc_plot_tab(notebook, adc): frame = ttk.Frame(notebook) @@ -12,41 +19,34 @@ def create_adc_plot_tab(notebook, adc): figure = Figure(figsize=(8, 5), dpi=100) ax = figure.add_subplot(1, 1, 1) - ax.set_title("ADC Readings Over Time") - ax.set_xlabel("Time (s)") - ax.set_ylabel("Voltage (V)") ax.set_ylim(0, 12) - + ax.set_xlim(-MAX_HISTORY, 0) # Keep time axis fixed canvas = FigureCanvasTkAgg(figure, master=frame) canvas.get_tk_widget().pack(fill=tk.BOTH, expand=True) - adc_channels = list(range(8)) - data = {ch: [] for ch in adc_channels} - time_data = [] + # Initialize lines for fast updates + lines = {ch: ax.plot(time_data, data[ch], label=f"ADC {ch+1}")[0] for ch in adc_channels} def update_plot(): - current_time = time.time() - if len(time_data) > 50: - for ch in adc_channels: - data[ch].pop(0) - time_data.pop(0) + if not updating_enabled: + frame.after(NOT_ACTIVE_CHECK_INTERVAL, update_plot) + return - time_data.append(current_time) + # Shift existing data left for ch in adc_channels: - voltage = round(adc.read(ch) * 12 / 4095, 2) - data[ch].append(voltage) - - ax.clear() - ax.set_title("ADC Readings Over Time") - ax.set_xlabel("Time (s)") - ax.set_ylabel("Voltage (V)") - ax.set_ylim(0, 12) + data[ch].pop(0) + data[ch].append(round(adc.read(ch) * 12 / 4095, 2)) + # Update only the y-data for efficiency for ch in adc_channels: - ax.plot(time_data, data[ch], label=f"ADC {ch+1}") + lines[ch].set_ydata(data[ch]) - ax.legend(loc="upper right") - canvas.draw() + canvas.draw_idle() # Efficient redraw frame.after(ADC_PLOT_UPDATE_INTERVAL, update_plot) update_plot() + +def set_updating_enabled(is_active): + global updating_enabled + updating_enabled = is_active + print(f"adc_plot tab: set updating_enabled to {updating_enabled}") diff --git a/rpi-scripts/gui/tab_control.py b/rpi-scripts/gui/tab_control.py index f079300..6d12e8e 100644 --- a/rpi-scripts/gui/tab_control.py +++ b/rpi-scripts/gui/tab_control.py @@ -8,6 +8,12 @@ import RPi.GPIO as GPIO sys.path.append(os.path.abspath(os.path.join(os.path.dirname(__file__), ".."))) from interface_board_pins import * # Import pin assignments +updating_enabled = False + +ADC_VALUES_UPDATE_INTERVAL = 500 +DIGITAL_INPUTS_UPDATE_INTERVAL = 200 +NOT_ACTIVE_CHECK_INTERVAL = 2000 + def create_control_tab(notebook, adc, shift_reg, pwm1, pwm2): frame = ttk.Frame(notebook) notebook.add(frame, text="Controls") @@ -16,47 +22,101 @@ def create_control_tab(notebook, adc, shift_reg, pwm1, pwm2): digital_output_states = [tk.BooleanVar(value=False) for _ in range(8)] adc_values = [tk.StringVar(value="0.00V") for _ in range(8)] pwm_values = [tk.IntVar(value=0), tk.IntVar(value=0)] + output_buttons = {} # Store button references to change colors def update_inputs(): + if not updating_enabled: + frame.after(NOT_ACTIVE_CHECK_INTERVAL, update_inputs) + return for i, pin in enumerate(GPIO_DIGITAL_INPUTS.values()): digital_input_states[i].set("HIGH" if GPIO.input(pin) else "LOW") - frame.after(500, update_inputs) + frame.after(DIGITAL_INPUTS_UPDATE_INTERVAL, update_inputs) def update_adc(): + if not updating_enabled: + frame.after(NOT_ACTIVE_CHECK_INTERVAL, update_adc) + return for i, adc_channel in enumerate(ADC_CHANNELS.values()): value = adc.read(adc_channel) adc_values[i].set(f"{round(value * 12 / 4095, 2)}V") - frame.after(1000, update_adc) + frame.after(ADC_VALUES_UPDATE_INTERVAL, update_adc) def toggle_output(index): - shift_reg.set_pin(index, digital_output_states[index].get()) + """ Toggle shift register output and update button color. """ + new_state = not digital_output_states[index].get() + digital_output_states[index].set(new_state) + shift_reg.set_pin(index, new_state) - def update_pwm(channel, value): - duty_cycle = int(float(value)) - if channel == 0: - pwm1.ChangeDutyCycle(duty_cycle) - else: - pwm2.ChangeDutyCycle(duty_cycle) + if index in output_buttons: + for btn in output_buttons[index]: + btn.configure(bg="green" if new_state else "red", activebackground="green" if new_state else "red") - # UI Layout style = ttk.Style() - style.configure("TScale", thickness=30) # Increases slider thickness + style.configure("TScale", thickness=60) + style.configure("TButton", font=("Arial", 18), padding=5) - control_frame = ttk.Frame(frame, padding=30) - control_frame.pack(expand=True, fill="both") + control_frame = ttk.Frame(frame, padding=40) + control_frame.grid(row=0, column=0, sticky="nsew") + + frame.grid_rowconfigure(0, weight=1) + frame.grid_rowconfigure(1, weight=0) + frame.grid_columnconfigure(0, weight=1) for i in range(8): - ttk.Label(control_frame, text=f"ADC {i+1}:", font=("Arial", 14)).grid(row=i, column=0, sticky="e") - ttk.Label(control_frame, textvariable=adc_values[i], width=10, font=("Arial", 14)).grid(row=i, column=1, sticky="w") - ttk.Label(control_frame, text=f"IN {i+1}:", font=("Arial", 14)).grid(row=i, column=2, sticky="e") - ttk.Label(control_frame, textvariable=digital_input_states[i], width=6, font=("Arial", 14)).grid(row=i, column=3, sticky="w") - btn = ttk.Checkbutton(control_frame, text=f"OUT {i+1}", variable=digital_output_states[i], command=lambda i=i: toggle_output(i)) - btn.grid(row=i, column=4, sticky="w") + ttk.Label(control_frame, text=f"ADC {i}:", font=("Arial", 18)).grid(row=i, column=0, sticky="e") + ttk.Label(control_frame, textvariable=adc_values[i], width=10, font=("Arial", 18)).grid(row=i, column=1, sticky="w") + ttk.Label(control_frame, text=f"IN {i}:", font=("Arial", 18)).grid(row=i, column=2, sticky="e", padx=20) + ttk.Label(control_frame, textvariable=digital_input_states[i], width=6, font=("Arial", 18)).grid(row=i, column=3, sticky="w") - for i in range(2): - ttk.Label(control_frame, text=f"PWM{i+1}:", font=("Arial", 14)).grid(row=i, column=5, sticky="e") - slider = ttk.Scale(control_frame, from_=0, to=100, orient="horizontal", length=400, variable=pwm_values[i], command=lambda val, i=i: update_pwm(i, val), style="TScale") - slider.grid(row=i, column=6, sticky="w", pady=10) # Added spacing with `pady=10` + btn = tk.Button(control_frame, text=f"OUT {i}", font=("Arial", 16), width=10, bg="red", activebackground="red", command=lambda i=i: toggle_output(i)) + btn.grid(row=i, column=4, sticky="w", padx=20) + + output_buttons.setdefault(i, []).append(btn) + + if i == 0: + buzzer_btn = tk.Button(control_frame, text="BUZZER", font=("Arial", 16), width=10, bg="red", activebackground="red", command=lambda: toggle_output(0)) + buzzer_btn.grid(row=i, column=5, padx=20) + output_buttons[0].append(buzzer_btn) + + if i == 1: + relay2_btn = tk.Button(control_frame, text="RELAY2", font=("Arial", 16), width=10, bg="red", activebackground="red", command=lambda: toggle_output(1)) + relay2_btn.grid(row=i, column=5, padx=20) + output_buttons[1].append(relay2_btn) + + if i == 2: + relay1_btn = tk.Button(control_frame, text="RELAY1", font=("Arial", 16), width=10, bg="red", activebackground="red", command=lambda: toggle_output(2)) + relay1_btn.grid(row=i, column=5, padx=20) + output_buttons[2].append(relay1_btn) + + pwm_frame = ttk.Frame(frame, padding=20) + pwm_frame.grid(row=1, column=0, sticky="ew") + + pwm_frame.columnconfigure(0, weight=0) + pwm_frame.columnconfigure(1, weight=1) + pwm_frame.columnconfigure(2, weight=0) + + pwm1_label = ttk.Label(pwm_frame, text="PWM1:", font=("Arial", 18)) + pwm1_label.grid(row=0, column=0, padx=20, sticky="e") + + pwm1_slider = ttk.Scale( + pwm_frame, from_=0, to=100, orient="horizontal", length=400, + variable=pwm_values[0], command=lambda val: pwm1.ChangeDutyCycle(int(float(val))) + ) + pwm1_slider.grid(row=0, column=1, columnspan=2, sticky="we", padx=10) + + pwm2_label = ttk.Label(pwm_frame, text="PWM2:", font=("Arial", 18)) + pwm2_label.grid(row=1, column=0, padx=20, sticky="e") + + pwm2_slider = ttk.Scale( + pwm_frame, from_=0, to=100, orient="horizontal", length=400, + variable=pwm_values[1], command=lambda val: pwm2.ChangeDutyCycle(int(float(val))) + ) + pwm2_slider.grid(row=1, column=1, columnspan=2, sticky="we", padx=10) update_inputs() update_adc() + +def set_updating_enabled(is_active): + global updating_enabled + updating_enabled = is_active + print(f"control tab: set updating_enabled to {updating_enabled}") diff --git a/rpi-scripts/gui/tab_digital_plot.py b/rpi-scripts/gui/tab_digital_plot.py index 25b8851..445f73a 100644 --- a/rpi-scripts/gui/tab_digital_plot.py +++ b/rpi-scripts/gui/tab_digital_plot.py @@ -1,5 +1,6 @@ import sys import os +import threading import tkinter as tk from tkinter import ttk import RPi.GPIO as GPIO @@ -10,47 +11,53 @@ import time sys.path.append(os.path.abspath(os.path.join(os.path.dirname(__file__), ".."))) from interface_board_pins import * # Import pin assignments +# Adjusted Constants +DIGITAL_PLOT_UPDATE_INTERVAL = 50 # 50ms (20 FPS) is smooth enough +NOT_ACTIVE_CHECK_INTERVAL = 2000 # Check inactive tabs less frequently +MAX_HISTORY = 100 # Keep last 100 values for scrolling + +updating_enabled = False # Track if the tab is active +input_channels = list(range(8)) +data = {ch: [0] * MAX_HISTORY for ch in input_channels} # Preallocate data +time_data = list(range(-MAX_HISTORY, 0)) # Simulated time axis + + def create_digital_plot_tab(notebook): frame = ttk.Frame(notebook) notebook.add(frame, text="Digital Inputs") figure = Figure(figsize=(8, 5), dpi=100) ax = figure.add_subplot(1, 1, 1) - ax.set_title("Digital Input States Over Time") - ax.set_xlabel("Time (s)") - ax.set_ylabel("State (0=LOW, 1=HIGH)") ax.set_ylim(-0.2, 1.2) - + ax.set_xlim(-MAX_HISTORY, 0) # Keep time axis fixed canvas = FigureCanvasTkAgg(figure, master=frame) canvas.get_tk_widget().pack(fill=tk.BOTH, expand=True) - input_channels = list(range(8)) - data = {ch: [] for ch in input_channels} - time_data = [] + # Initialize lines for fast updates + lines = {ch: ax.step(time_data, data[ch], where="post")[0] for ch in input_channels} def update_plot(): - current_time = time.time() - if len(time_data) > 50: - for ch in input_channels: - data[ch].pop(0) - time_data.pop(0) - - time_data.append(current_time) + if not updating_enabled: + frame.after(NOT_ACTIVE_CHECK_INTERVAL, update_plot) + return + + # Shift existing data left for ch in input_channels: - state = GPIO.input(GPIO_DIGITAL_INPUTS[ch]) - data[ch].append(state) - - ax.clear() - ax.set_title("Digital Input States Over Time") - ax.set_xlabel("Time (s)") - ax.set_ylabel("State (0=LOW, 1=HIGH)") - ax.set_ylim(-0.2, 1.2) + data[ch].pop(0) + data[ch].append(GPIO.input(GPIO_DIGITAL_INPUTS[ch])) + # Update only the y-data for efficiency for ch in input_channels: - ax.step(time_data, data[ch], label=f"IN {ch+1}", where="post") + lines[ch].set_ydata(data[ch]) - ax.legend(loc="upper right") - canvas.draw() - frame.after(500, update_plot) + canvas.draw_idle() # More efficient than draw() + frame.after(DIGITAL_PLOT_UPDATE_INTERVAL, update_plot) update_plot() + + +def set_updating_enabled(is_active): + global updating_enabled + updating_enabled = is_active + print(f"digital_plot tab: set updating_enabled to {updating_enabled}") + diff --git a/rpi-scripts/gui/tab_exit.py b/rpi-scripts/gui/tab_exit.py new file mode 100644 index 0000000..81f6edb --- /dev/null +++ b/rpi-scripts/gui/tab_exit.py @@ -0,0 +1,21 @@ + +import tkinter as tk +from tkinter import ttk + +def create_exit_tab(notebook, root, pwm1, pwm2): + frame = ttk.Frame(notebook) + notebook.add(frame, text="EXIT") + + ttk.Label(frame, text="Exit the GUI", font=("Arial", 20)).pack(pady=20) + + def exit_program(): + pwm1.stop() + pwm2.stop() + root.quit() + root.destroy() + + exit_button = ttk.Button(frame, text="Exit Application", command=exit_program, style="TButton") + exit_button.pack(pady=20) + + style = ttk.Style() + style.configure("TButton", font=("Arial", 18), padding=10) From a96344f6b9aa901ccd95201fe0baa2c36b6a1a28 Mon Sep 17 00:00:00 2001 From: jonny Date: Thu, 30 Jan 2025 17:16:34 +0100 Subject: [PATCH 10/14] Add systemd service file for auto starting GUI, Update Readme (WIP) --- README.md | 46 +++++++++++++++++++++++++++++++ rpi-scripts/gui/gui-start.service | 14 ++++++++++ 2 files changed, 60 insertions(+) create mode 100644 rpi-scripts/gui/gui-start.service diff --git a/README.md b/README.md index 933e8d6..24031fc 100644 --- a/README.md +++ b/README.md @@ -166,6 +166,52 @@ Small PCBs with LEDs, resistors, and mounting holes for housing indicators. # Software/Firmware Python code for operating the extension PCBs (e.g., GPIO pins, shift registers, ADC, and bus communication). This section is a work in progress (WIP), and example scripts will be added as development continues. +# ======== WIP ======== +# Python scripting + +The pin assignment to the actual terminals are defined / mapped in +`rpi-scripts\interface_board_pins.py` so it should be included in any custom script created to easily reference the terminal numbers printed onto the project housing in the code. See examples in `rpi-scripts\examples` +TODO: make those files link to file but with text still the file path + +# Usage Raspberry-PI +## Connectivity + +### Establish LAN Connection (ethernet) +configure in command.txt in boot partition? +### Establish WIFI Connection +```bash +s nmcli device wifi connect password +# replace and with actual wifi +``` + +### Connect via ssh +```powershell +ssh pi@192.168.1.100 +``` + +### Connect via rdp +Open mstsc from windows start menu, and enter ip, user root and password. +Or use powershell: +```powershell +mstsc /v:192.168.1.100:3389 +``` +Note: currently only user `root` works (using user pi results in blackscreen) + +### Mount filesystem in windows +You can mount /home/pi folder in windows natively using samba +Run in powershell to mount it as network device X (replace ip with the current ip of rpi) +Find out ip with running `ip a` on the raspberry +```powershell +net use X: \\192.168.1.100\pi /user:pi +``` + +## Scripts + +### Autostart GUI +```bash +git/rpi-interface-board/rpi-scripts/gui% s cp gui-start.service /etc/systemd/system/ +``` +# ======== END WIP ======== --- diff --git a/rpi-scripts/gui/gui-start.service b/rpi-scripts/gui/gui-start.service new file mode 100644 index 0000000..bf7a7c3 --- /dev/null +++ b/rpi-scripts/gui/gui-start.service @@ -0,0 +1,14 @@ +[Unit] +Description=Start Python GUI on boot +After=graphical.target + +[Service] +Environment=DISPLAY=:0 +ExecStart=/bin/python ./main.py +WorkingDirectory=/home/pi/git/rpi-interface-board/rpi-scripts/gui +User=pi +Group=pi +Restart=always + +[Install] +WantedBy=graphical.target From ee55d4483f6256e052800886fc71eae26b08666a Mon Sep 17 00:00:00 2001 From: jonny Date: Fri, 31 Jan 2025 10:19:46 +0100 Subject: [PATCH 11/14] Update Readme: Add RPI + Python usage instructions --- README.md | 199 ++++++++++++++++++++++++++++++++++++++++++------------ 1 file changed, 154 insertions(+), 45 deletions(-) diff --git a/README.md b/README.md index 24031fc..38f229e 100644 --- a/README.md +++ b/README.md @@ -1,4 +1,4 @@ -# Raspberry Pi Extension board +# Raspberry Pi Extension Board A custom PLC-like system based on the Raspberry Pi. With a custom interface board, a Raspberry Pi is extended with protected I/O, bus systems, analog inputs, and Relay or PWM outputs. All components, including a display, are housed in a custom-designed enclosure. @@ -9,7 +9,7 @@ The project is intended for versatile use in prototyping and project development --- -### Photo of all hardware components +## Photo of All Hardware Components

All Components (Disassembled)

@@ -21,7 +21,7 @@ The project is intended for versatile use in prototyping and project development # Repository Content - **KiCad Projects**: 3 KiCad projects with schematics and PCB layouts for the custom PCBs created. - **Housing**: Custom enclosure design for PCBs and Raspberry Pi created in FreeCAD. -- **Software/Firmware**: Python scripts for operating and testing the PCB features (WIP). +- **Software/Firmware**: Python scripts run on the Raspberry Pi for operating and testing the PCB features and providing examples as base for future projects. --- @@ -42,7 +42,7 @@ Detailed features of each PCB are described in the respective sections below. # Designed PCBs -## 1. **Raspberry Pi Interface Board** +## 1. Raspberry Pi Interface Board This board connects to the Raspberry Pi via a 40-pin ribbon cable and provides protected GPIO extensions and versatile input/output features. ### Photo @@ -51,7 +51,7 @@ This board connects to the Raspberry Pi via a 40-pin ribbon cable and provides p ### Features **Inputs**: - **8x Digital Inputs**: - - Wide continuous voltage range (-1.7 V to 120 V), idea: compatible with 3 V and 24 V devices. + - Wide voltage range (-1.7 V to 120 V) → compatible with 3 V and 24 V devices. - TVS diodes for ESD and spike protection. - Reverse polarity protection. - Isolated with optocouplers. @@ -74,7 +74,7 @@ This board connects to the Raspberry Pi via a 40-pin ribbon cable and provides p - 8x digital outputs (via shift register): - Low-power (30 mA push-pull) and high-power (500 mA open-drain) outputs. - Buzzer and relays connected to channels 6-8, with enable/disable switches. - - Note: Outputs are **not short-circuit proof**. + - **Note**: Outputs are **not short-circuit proof**. **General**: - WAGO spring-loaded terminals for easy wiring. @@ -85,7 +85,7 @@ This board connects to the Raspberry Pi via a 40-pin ribbon cable and provides p - UART (unprotected). - I2C (TVS diodes, 2.2 kΩ pull-ups). - SPI (unprotected). -Note: Either RS485 or UART can be used at the same time (select with jumpers). + - **Note**: RS485 and UART cannot be used simultaneously (select via jumpers). ### Schematic and Layout

@@ -160,70 +160,179 @@ Small PCBs with LEDs, resistors, and mounting holes for housing indicators.

+
+ --- +
-# Software/Firmware -Python code for operating the extension PCBs (e.g., GPIO pins, shift registers, ADC, and bus communication). This section is a work in progress (WIP), and example scripts will be added as development continues. +# Raspberry Pi Usage -# ======== WIP ======== -# Python scripting - -The pin assignment to the actual terminals are defined / mapped in -`rpi-scripts\interface_board_pins.py` so it should be included in any custom script created to easily reference the terminal numbers printed onto the project housing in the code. See examples in `rpi-scripts\examples` -TODO: make those files link to file but with text still the file path - -# Usage Raspberry-PI ## Connectivity +The Raspberry Pi can operate **standalone** with a connected keyboard, mouse, and HDMI monitor, or by using the integrated display in the housing. -### Establish LAN Connection (ethernet) -configure in command.txt in boot partition? -### Establish WIFI Connection +However, for **development**, it is recommended to connect it to a network via **WiFi or LAN**, allowing easy remote access from a laptop. A direct **Ethernet connection** between the Raspberry Pi and a laptop is often the simplest method. + +### LAN Connection (Ethernet) +- **Connection**: Connect cable directly between raspberry and PC +- **Configure the PC interface**: Set a static ip address e.g. `192.168.1.1/24` + Note: Optionally also enable network sharing to enable the RPI to use the internet connection the PC currently has. +- **Configure the Raspberry Interface**: Set a static ip address e.g. `192.168.1.100/24` + The Raspberry Pi can be configured for **Ethernet access** using different methods: + - **Boot Partition Configuration:** Modify `cmdline.txt` on the SD card. + - **GUI Setup:** Use the built-in network manager if a monitor is connected. + - **Command Line (`nmcli`)**: Configure networking via the terminal. + +To check the assigned IP run: ```bash -s nmcli device wifi connect password -# replace and with actual wifi +ip a ``` -### Connect via ssh -```powershell +### WiFi Connection +Probably the **fastest and easiest** way to set up communication between the Raspberry Pi and a PC - while even maintaining internet access - is to **use a mobile phone as a WiFi hotspot**. +Simply **connect both the Raspberry Pi and the laptop** to the same hotspot. + +To connect to a WiFi network, use: +```bash +nmcli device wifi connect password +``` +Replace `` and `` with the actual credentials. +The Raspberry Pi will **automatically reconnect** after a reboot. + +Once connected, you can check the assigned IP on the Raspberry Pi using: + ``` + ip a + ``` + +### SSH Access +For remote terminal access, connect via SSH from a laptop: +```bash ssh pi@192.168.1.100 ``` +Replace the IP with the actual address of the Raspberry Pi. -### Connect via rdp -Open mstsc from windows start menu, and enter ip, user root and password. -Or use powershell: +### Remote Desktop (RDP) +To control the Raspberry Pi’s **GUI remotely**, RDP is pre-configured. + +#### Connect via Windows Remote Desktop: +- Open **Remote Desktop Connection (mstsc)**. +- Enter the Raspberry Pi’s IP address. +- **Login:** + - **User:** `root` + - **Password:** (configured during setup) + - **Note:** Logging in as `pi` may result in a black screen. + +#### Alternatively, use PowerShell: ```powershell mstsc /v:192.168.1.100:3389 ``` -Note: currently only user `root` works (using user pi results in blackscreen) -### Mount filesystem in windows -You can mount /home/pi folder in windows natively using samba -Run in powershell to mount it as network device X (replace ip with the current ip of rpi) -Find out ip with running `ip a` on the raspberry -```powershell -net use X: \\192.168.1.100\pi /user:pi -``` +### Mount Raspberry Pi Filesystem in Windows (SAMBA) +For convenient file access and editing (e.g., with **VS Code**), the Raspberry Pi’s `/home/pi` directory can be **mounted as a network drive** using Samba. -## Scripts +#### Steps: +1. Determine the Raspberry Pi’s IP address: + ```bash + ip a + ``` +2. Mount the `/home/pi` directory in Windows: + ```powershell + net use X: \\192.168.1.100\pi /user:pi + ``` + Replace `192.168.1.100` with the actual IP address. -### Autostart GUI +**Note:** +Currently, only `/home/pi` is available for mounting. To share additional directories, edit the Samba configuration file: ```bash -git/rpi-interface-board/rpi-scripts/gui% s cp gui-start.service /etc/systemd/system/ +# add a new `[share]` section with the desired folder path and permissions. +sudo nano /etc/samba/smb.conf +# then restart samba +sudo systemctl restart smbd ``` -# ======== END WIP ======== + + +
--- +
+ + +# Python Scripting +All **terminal-to-pin assignments** are mapped in [`interface_board_pins.py`](rpi-scripts/interface_board_pins.py), allowing easy reference to terminal numbers labeled on the housing. + +Example scripts demonstrating I/O control can be found in [`rpi-scripts/examples`](rpi-scripts/examples). + +--- + +## Scripts & Development + +### Running Python Examples +Pre-written **Python scripts** to control I/O terminals are located in: +``` +rpi-scripts/examples +``` +To run an example, execute: +```bash +cd /home/pi/git/rpi-interface-board/rpi-scripts/examples/ +python read_digital_inputs.py +``` + +### Starting a New Python Project with I/O Access +To create a custom Python project using the **interface board**, follow these steps: + +1. **Copy the entire `rpi-scripts/` folder** to your new project directory. +2. **Remove unnecessary files**, keeping at least: + - `rpi-scripts/interface_board_libs/` → contains custom drivers. + - `rpi-scripts/interface_board_pins.py` → maps terminal numbers to GPIO/ADC channels. +3. **Start coding** by modifying an existing example in `examples/`. + +--- + +## GUI Interface +A **Python GUI** is available for **real-time monitoring** and **control** of all I/O terminals for quick testing. + +### Run the GUI +```bash +cd rpi-scripts/gui +python main.py +``` + +### Enable GUI Autostart on Boot +The GUI is configured to start automatically on boot in **fullscreen mode**. To modify this behavior: + +#### Enable autostart: +```bash +sudo cp rpi-scripts/gui/gui-start.service /etc/systemd/system/ +sudo systemctl enable gui-start.service +``` + +#### Disable autostart: +```bash +sudo systemctl disable gui-start.service +``` + +### GUI Screenshots +

+ + +

+ + +
+ +--- + +
+ # Housing Custom-designed enclosure includes: -- Ports for Raspberry Pi. -- Banana sockets for power outputs. -- Exposed screw terminals. -- Openings for buttons and LEDs. -- Mounts for all PCBs and wiring. - +- Cutouts for all Ports for Raspberry Pi. +- Mounting screws for all pcbs and Raspberry +- Fan mount + venting slots +- Cutouts for all external pcb terminals +- Cutout + mounting arms (M2.5) for Display 3D Model From 0e0f9e053cf08eb6b48eda521f7bf75f29b15d35 Mon Sep 17 00:00:00 2001 From: jonny Date: Mon, 3 Feb 2025 11:41:37 +0100 Subject: [PATCH 12/14] Fix ADC scaling to voltages, GUI: chart autoscale, labels, units --- rpi-scripts/examples/read_analog_inputs.py | 19 +++--- rpi-scripts/gui/main.py | 16 ++++- rpi-scripts/gui/tab_adc_plot.py | 70 ++++++++++++++++------ rpi-scripts/gui/tab_control.py | 51 +++++++++++----- rpi-scripts/gui/tab_digital_plot.py | 37 ++++++++---- rpi-scripts/interface_board_pins.py | 23 +++---- 6 files changed, 151 insertions(+), 65 deletions(-) diff --git a/rpi-scripts/examples/read_analog_inputs.py b/rpi-scripts/examples/read_analog_inputs.py index 52ebbb3..ad54907 100644 --- a/rpi-scripts/examples/read_analog_inputs.py +++ b/rpi-scripts/examples/read_analog_inputs.py @@ -9,14 +9,15 @@ import time sys.path.append(os.path.abspath(os.path.join(os.path.dirname(__file__), ".."))) from interface_board_libs.adc_mcp3208 import MCP3208 # custom driver for ADC-IC from interface_board_pins import ( - ADC_CHANNELS, - + # mapping of ADC channels to terminals + max value: + ADC_TERMINALS, + # mapping of ADC channels to terminals: ADC_CHANNEL_T0__0_TO_3V3, ADC_CHANNEL_T1__0_TO_3V3, ADC_CHANNEL_T2__0_TO_5V, ADC_CHANNEL_T3__0_TO_5V, ADC_CHANNEL_T4__0_TO_12V, - ADC_CHANNEL_T5__0_TO_12V, + ADC_CHANNEL_T5__0_TO_24V, ADC_CHANNEL_T6__0_TO_20MA, ADC_CHANNEL_T7__0_TO_20MA, ) # mapping of ADC channels to terminals @@ -36,13 +37,15 @@ def adc2value(adc_value, max_value): while True: - print ("") + print("-" * 40) # Read all available channels in a loop according to terminal order / map values = [] - for terminal, adc_channel in ADC_CHANNELS.items(): + for terminal, config in ADC_TERMINALS.items(): + adc_channel = config["adc_channel"] + max_value = config["max_value"] value = adc.read(adc_channel) - print(f"T{terminal}: ADC={value:04d} => U_ADC = {adc2value(value, 3.3):5.3f}V") + print(f"T{terminal}: ADC={value:04d} => U_ADC = {adc2value(value, max_value):5.3f}V") # Read channels one by one using defined constants (more intuitive) @@ -62,8 +65,8 @@ while True: value = adc.read(ADC_CHANNEL_T4__0_TO_12V) print(f"Terminal 4 (0 to 12V): ADC={value:04d} => Terminal={adc2value(value, 12):05.2f}V") - value = adc.read(ADC_CHANNEL_T5__0_TO_12V) - print(f"Terminal 5 (0 to 12V): ADC={value:04d} => Terminal={adc2value(value, 12):05.2f}V") + value = adc.read(ADC_CHANNEL_T5__0_TO_24V) + print(f"Terminal 5 (0 to 24V): ADC={value:04d} => Terminal={adc2value(value, 24):05.2f}V") value = adc.read(ADC_CHANNEL_T6__0_TO_20MA) print(f"Terminal 6 (0 to 20mA): ADC={value:04d} => Terminal={adc2value(value, 20):05.2f}mA") diff --git a/rpi-scripts/gui/main.py b/rpi-scripts/gui/main.py index 607bc45..70ac308 100644 --- a/rpi-scripts/gui/main.py +++ b/rpi-scripts/gui/main.py @@ -19,10 +19,12 @@ from tab_digital_plot import create_digital_plot_tab from tab_digital_plot import set_updating_enabled as tab_digital_plot__set_updating_enabled from tab_exit import create_exit_tab + # Initialize ADC & Shift Register adc = MCP3208() shift_reg = ShiftRegister(GPIO_SHIFT_REG_DATA, GPIO_SHIFT_REG_LATCH, GPIO_SHIFT_REG_CLOCK) + # GPIO Setup GPIO.setmode(GPIO.BCM) for pin in GPIO_DIGITAL_INPUTS.values(): @@ -34,16 +36,19 @@ pwm2 = GPIO.PWM(GPIO_PWM2, 1000) pwm1.start(0) pwm2.start(0) + # Tkinter GUI root = tk.Tk() root.title("Raspberry Pi Interface Board") root.attributes('-fullscreen', True) root.configure(bg="black") + # Tabbed Interface notebook = ttk.Notebook(root) notebook.pack(expand=True, fill="both") + # Track active tab def on_tab_change(event): active_tab = event.widget.tab(event.widget.index("current"), "text") @@ -61,16 +66,25 @@ def on_tab_change(event): tab_control__set_updating_enabled(True) tab_analog_plot__set_updating_enabled(False) tab_digital_plot__set_updating_enabled(False) + case "EXIT": + pass case _: print(f"unhandled change to tab {active_tab}") notebook.bind("<>", on_tab_change) + # Add tabs create_control_tab(notebook, adc, shift_reg, pwm1, pwm2) create_adc_plot_tab(notebook, adc) create_digital_plot_tab(notebook) create_exit_tab(notebook, root, pwm1, pwm2) + # Run GUI -root.mainloop() +try: + root.mainloop() + +except KeyboardInterrupt: + print('Keyboard interrupt -> exiting') + exit() \ No newline at end of file diff --git a/rpi-scripts/gui/tab_adc_plot.py b/rpi-scripts/gui/tab_adc_plot.py index ac87be4..1ca176b 100644 --- a/rpi-scripts/gui/tab_adc_plot.py +++ b/rpi-scripts/gui/tab_adc_plot.py @@ -1,17 +1,30 @@ +import sys +import os import tkinter as tk from tkinter import ttk from matplotlib.figure import Figure from matplotlib.backends.backend_tkagg import FigureCanvasTkAgg import time -ADC_PLOT_UPDATE_INTERVAL = 50 # 20 FPS, smooth and efficient -NOT_ACTIVE_CHECK_INTERVAL = 2000 -MAX_HISTORY = 100 +# Add the parent directory to the module search path +sys.path.append(os.path.abspath(os.path.join(os.path.dirname(__file__), ".."))) +from interface_board_pins import ADC_TERMINALS # Import pin assignments + +# CONFIG +ADC_PLOT_UPDATE_DELAY_MS = 50 # note: delay is additional to time it takes to update the chart +TAB_NOT_ACTIVE_CHECK_INTERVAL_MS = 2000 +MAX_X_HISTORY_VALUES = 150 +AUTO_SCALE_ENABLED = True +DEBUG = False + + +# Variables updating_enabled = False adc_channels = list(range(8)) -data = {ch: [0] * MAX_HISTORY for ch in adc_channels} # Preallocate lists -time_data = list(range(-MAX_HISTORY, 0)) # Simulated time axis +data = {ch: [0] * MAX_X_HISTORY_VALUES for ch in adc_channels} # Preallocate lists +time_data = list(range(-MAX_X_HISTORY_VALUES, 0)) # Simulated time axis + def create_adc_plot_tab(notebook, adc): frame = ttk.Frame(notebook) @@ -19,34 +32,55 @@ def create_adc_plot_tab(notebook, adc): figure = Figure(figsize=(8, 5), dpi=100) ax = figure.add_subplot(1, 1, 1) - ax.set_ylim(0, 12) - ax.set_xlim(-MAX_HISTORY, 0) # Keep time axis fixed + + ax.set_title("ADC Inputs") # Set title + ax.set_xlabel("Time (s)") # X-axis label + ax.set_ylabel("Voltage / Current (V / mA)") # Y-axis label + + ax.set_xlim(-MAX_X_HISTORY_VALUES, 0) # Keep time axis fixed canvas = FigureCanvasTkAgg(figure, master=frame) canvas.get_tk_widget().pack(fill=tk.BOTH, expand=True) # Initialize lines for fast updates - lines = {ch: ax.plot(time_data, data[ch], label=f"ADC {ch+1}")[0] for ch in adc_channels} + lines = {} + for terminal, config in ADC_TERMINALS.items(): + label = f"T{terminal} ({config['max_value']} {config['unit']})" # Format: T1 (3.3V) + lines[terminal] = ax.plot(time_data, data[terminal], label=label)[0] + + ax.legend() # Show legend def update_plot(): if not updating_enabled: - frame.after(NOT_ACTIVE_CHECK_INTERVAL, update_plot) + frame.after(TAB_NOT_ACTIVE_CHECK_INTERVAL_MS, update_plot) return - # Shift existing data left - for ch in adc_channels: - data[ch].pop(0) - data[ch].append(round(adc.read(ch) * 12 / 4095, 2)) + for terminal, config in ADC_TERMINALS.items(): + adc_channel = config["adc_channel"] + max_value = config["max_value"] + # Shift existing data left and + # read new data + scale based on the correct max voltage + data[terminal].pop(0) + data[terminal].append(round(adc.read(adc_channel) * max_value / 4095, 2)) - # Update only the y-data for efficiency - for ch in adc_channels: - lines[ch].set_ydata(data[ch]) + # Recalculate limits (autoscale) + if AUTO_SCALE_ENABLED: + ax.set_ylim(bottom=0) # Lower limit always 0 + ax.autoscale(enable=True, axis='y', tight=False) # Enable autoscale for upper limit + ax.relim() # Recalculate limits + ax.autoscale_view(scalex=False, scaley=True) # Autoscale only y-axis + else: + ax.set_ylim(0, 24) # Fixed range if autoscale is disabled + + for terminal in ADC_TERMINALS: + lines[terminal].set_ydata(data[terminal]) canvas.draw_idle() # Efficient redraw - frame.after(ADC_PLOT_UPDATE_INTERVAL, update_plot) + frame.after(ADC_PLOT_UPDATE_DELAY_MS, update_plot) update_plot() + def set_updating_enabled(is_active): global updating_enabled updating_enabled = is_active - print(f"adc_plot tab: set updating_enabled to {updating_enabled}") + if DEBUG: print(f"adc_plot tab: set updating_enabled to {updating_enabled}") diff --git a/rpi-scripts/gui/tab_control.py b/rpi-scripts/gui/tab_control.py index 6d12e8e..21898d1 100644 --- a/rpi-scripts/gui/tab_control.py +++ b/rpi-scripts/gui/tab_control.py @@ -8,11 +8,17 @@ import RPi.GPIO as GPIO sys.path.append(os.path.abspath(os.path.join(os.path.dirname(__file__), ".."))) from interface_board_pins import * # Import pin assignments + +# CONFIG +ADC_VALUES_UPDATE_INTERVAL_MS = 500 +DIGITAL_INPUTS_UPDATE_INTERVAL_MS = 200 +TAB_NOT_ACTIVE_CHECK_INTERVAL_MS = 2000 +DEBUG = False + + +# Variables updating_enabled = False -ADC_VALUES_UPDATE_INTERVAL = 500 -DIGITAL_INPUTS_UPDATE_INTERVAL = 200 -NOT_ACTIVE_CHECK_INTERVAL = 2000 def create_control_tab(notebook, adc, shift_reg, pwm1, pwm2): frame = ttk.Frame(notebook) @@ -20,26 +26,36 @@ def create_control_tab(notebook, adc, shift_reg, pwm1, pwm2): digital_input_states = [tk.StringVar(value="LOW") for _ in range(8)] digital_output_states = [tk.BooleanVar(value=False) for _ in range(8)] - adc_values = [tk.StringVar(value="0.00V") for _ in range(8)] + adc_values = [tk.StringVar(value=" --- ") for _ in range(8)] pwm_values = [tk.IntVar(value=0), tk.IntVar(value=0)] output_buttons = {} # Store button references to change colors + def update_inputs(): if not updating_enabled: - frame.after(NOT_ACTIVE_CHECK_INTERVAL, update_inputs) + frame.after(TAB_NOT_ACTIVE_CHECK_INTERVAL_MS, update_inputs) return for i, pin in enumerate(GPIO_DIGITAL_INPUTS.values()): digital_input_states[i].set("HIGH" if GPIO.input(pin) else "LOW") - frame.after(DIGITAL_INPUTS_UPDATE_INTERVAL, update_inputs) + frame.after(DIGITAL_INPUTS_UPDATE_INTERVAL_MS, update_inputs) + def update_adc(): if not updating_enabled: - frame.after(NOT_ACTIVE_CHECK_INTERVAL, update_adc) + frame.after(TAB_NOT_ACTIVE_CHECK_INTERVAL_MS, update_adc) return - for i, adc_channel in enumerate(ADC_CHANNELS.values()): + + for terminal, config in ADC_TERMINALS.items(): + adc_channel = config["adc_channel"] + max_value = config["max_value"] + unit = config["unit"] + + # Read ADC value and scale to the correct voltage value = adc.read(adc_channel) - adc_values[i].set(f"{round(value * 12 / 4095, 2)}V") - frame.after(ADC_VALUES_UPDATE_INTERVAL, update_adc) + adc_values[terminal].set(f"{value * max_value / 4095:4.2f} {unit}") + + frame.after(ADC_VALUES_UPDATE_INTERVAL_MS, update_adc) + def toggle_output(index): """ Toggle shift register output and update button color. """ @@ -51,6 +67,7 @@ def create_control_tab(notebook, adc, shift_reg, pwm1, pwm2): for btn in output_buttons[index]: btn.configure(bg="green" if new_state else "red", activebackground="green" if new_state else "red") + style = ttk.Style() style.configure("TScale", thickness=60) style.configure("TButton", font=("Arial", 18), padding=5) @@ -63,12 +80,12 @@ def create_control_tab(notebook, adc, shift_reg, pwm1, pwm2): frame.grid_columnconfigure(0, weight=1) for i in range(8): - ttk.Label(control_frame, text=f"ADC {i}:", font=("Arial", 18)).grid(row=i, column=0, sticky="e") + ttk.Label(control_frame, text=f"ADC-{i}: ", font=("Arial", 18)).grid(row=i, column=0, sticky="e") ttk.Label(control_frame, textvariable=adc_values[i], width=10, font=("Arial", 18)).grid(row=i, column=1, sticky="w") - ttk.Label(control_frame, text=f"IN {i}:", font=("Arial", 18)).grid(row=i, column=2, sticky="e", padx=20) + ttk.Label(control_frame, text=f"IN-{i}:", font=("Arial", 18)).grid(row=i, column=2, sticky="e", padx=20) ttk.Label(control_frame, textvariable=digital_input_states[i], width=6, font=("Arial", 18)).grid(row=i, column=3, sticky="w") - btn = tk.Button(control_frame, text=f"OUT {i}", font=("Arial", 16), width=10, bg="red", activebackground="red", command=lambda i=i: toggle_output(i)) + btn = tk.Button(control_frame, text=f"OUT-{i}", font=("Arial", 16), width=10, bg="red", activebackground="red", command=lambda i=i: toggle_output(i)) btn.grid(row=i, column=4, sticky="w", padx=20) output_buttons.setdefault(i, []).append(btn) @@ -95,7 +112,7 @@ def create_control_tab(notebook, adc, shift_reg, pwm1, pwm2): pwm_frame.columnconfigure(1, weight=1) pwm_frame.columnconfigure(2, weight=0) - pwm1_label = ttk.Label(pwm_frame, text="PWM1:", font=("Arial", 18)) + pwm1_label = ttk.Label(pwm_frame, text="PWM-1:", font=("Arial", 18)) pwm1_label.grid(row=0, column=0, padx=20, sticky="e") pwm1_slider = ttk.Scale( @@ -104,7 +121,7 @@ def create_control_tab(notebook, adc, shift_reg, pwm1, pwm2): ) pwm1_slider.grid(row=0, column=1, columnspan=2, sticky="we", padx=10) - pwm2_label = ttk.Label(pwm_frame, text="PWM2:", font=("Arial", 18)) + pwm2_label = ttk.Label(pwm_frame, text="PWM-2:", font=("Arial", 18)) pwm2_label.grid(row=1, column=0, padx=20, sticky="e") pwm2_slider = ttk.Scale( @@ -116,7 +133,9 @@ def create_control_tab(notebook, adc, shift_reg, pwm1, pwm2): update_inputs() update_adc() + + def set_updating_enabled(is_active): global updating_enabled updating_enabled = is_active - print(f"control tab: set updating_enabled to {updating_enabled}") + if DEBUG: print(f"control tab: set updating_enabled to {updating_enabled}") diff --git a/rpi-scripts/gui/tab_digital_plot.py b/rpi-scripts/gui/tab_digital_plot.py index 445f73a..2d14ca0 100644 --- a/rpi-scripts/gui/tab_digital_plot.py +++ b/rpi-scripts/gui/tab_digital_plot.py @@ -11,15 +11,19 @@ import time sys.path.append(os.path.abspath(os.path.join(os.path.dirname(__file__), ".."))) from interface_board_pins import * # Import pin assignments -# Adjusted Constants -DIGITAL_PLOT_UPDATE_INTERVAL = 50 # 50ms (20 FPS) is smooth enough -NOT_ACTIVE_CHECK_INTERVAL = 2000 # Check inactive tabs less frequently -MAX_HISTORY = 100 # Keep last 100 values for scrolling +# CONFIG +DIGITAL_PLOT_UPDATE_DELAY_MS = 50 # note: delay is additional to time it takes to update the chart +TAB_NOT_ACTIVE_CHECK_INTERVAL_MS = 2000 # Check inactive tabs less frequently +MAX_X_HISTORY_VALUES = 100 # Keep last 100 values for scrolling +DEBUG = False + + +# Variables updating_enabled = False # Track if the tab is active input_channels = list(range(8)) -data = {ch: [0] * MAX_HISTORY for ch in input_channels} # Preallocate data -time_data = list(range(-MAX_HISTORY, 0)) # Simulated time axis +data = {ch: [0] * MAX_X_HISTORY_VALUES for ch in input_channels} # Preallocate data +time_data = list(range(-MAX_X_HISTORY_VALUES, 0)) # Simulated time axis def create_digital_plot_tab(notebook): @@ -28,17 +32,27 @@ def create_digital_plot_tab(notebook): figure = Figure(figsize=(8, 5), dpi=100) ax = figure.add_subplot(1, 1, 1) + + ax.set_title("Digital Inputs") # Set title + ax.set_xlabel("Time (s)") # X-axis label + ax.set_ylabel("State (1=HIGH / 0=LOW)") # Y-axis label + ax.set_ylim(-0.2, 1.2) - ax.set_xlim(-MAX_HISTORY, 0) # Keep time axis fixed + ax.set_xlim(-MAX_X_HISTORY_VALUES, 0) # Keep time axis fixed canvas = FigureCanvasTkAgg(figure, master=frame) canvas.get_tk_widget().pack(fill=tk.BOTH, expand=True) # Initialize lines for fast updates - lines = {ch: ax.step(time_data, data[ch], where="post")[0] for ch in input_channels} + lines = {} + for ch in input_channels: + label = f"Digital In {ch}" + lines[ch] = ax.step(time_data, data[ch], where="post", label=label)[0] + + ax.legend() # Show legend def update_plot(): if not updating_enabled: - frame.after(NOT_ACTIVE_CHECK_INTERVAL, update_plot) + frame.after(TAB_NOT_ACTIVE_CHECK_INTERVAL_MS, update_plot) return # Shift existing data left @@ -51,13 +65,14 @@ def create_digital_plot_tab(notebook): lines[ch].set_ydata(data[ch]) canvas.draw_idle() # More efficient than draw() - frame.after(DIGITAL_PLOT_UPDATE_INTERVAL, update_plot) + frame.after(DIGITAL_PLOT_UPDATE_DELAY_MS, update_plot) update_plot() + def set_updating_enabled(is_active): global updating_enabled updating_enabled = is_active - print(f"digital_plot tab: set updating_enabled to {updating_enabled}") + if DEBUG: print(f"digital_plot tab: set updating_enabled to {updating_enabled}") diff --git a/rpi-scripts/interface_board_pins.py b/rpi-scripts/interface_board_pins.py index b265ce5..b5a497e 100644 --- a/rpi-scripts/interface_board_pins.py +++ b/rpi-scripts/interface_board_pins.py @@ -49,25 +49,26 @@ ADC_SPI_CS_PIN = 8 # SPI Chip Select for MCP3208 # SCLK_0: GPIO_11 # CE_0: GPIO# MCP3208 (ADC) -# Pin mappings for Terminal number to actual ADC channels (due to routing they do not match) -ADC_CHANNELS = { - 0: 1, # Terminal 0 = ADC channel 1 - 1: 0, # Terminal 1 = ADC channel 0 - 2: 3, # ... - 3: 2, - 4: 5, - 5: 4, - 6: 7, - 7: 6 +# Pin mappings for Terminal number to actual ADC channels, including max voltage range +ADC_TERMINALS = { + 0: {"adc_channel": 1, "max_value": 3.3, "unit": "V"}, # Terminal 0 -> ADC channel 1, max 3.3V + 1: {"adc_channel": 0, "max_value": 3.3, "unit": "V"}, # Terminal 1 -> ADC channel 0, max 3.3V + 2: {"adc_channel": 3, "max_value": 5, "unit": "V"}, # Terminal 2 -> ADC channel 3, max 5V + 3: {"adc_channel": 2, "max_value": 5, "unit": "V"}, + 4: {"adc_channel": 5, "max_value": 12, "unit": "V"}, + 5: {"adc_channel": 4, "max_value": 24, "unit": "V"}, + 6: {"adc_channel": 7, "max_value": 20, "unit": "mA"}, # Terminal 6 -> ADC channel 7, max 20mA + 7: {"adc_channel": 6, "max_value": 20, "unit": "mA"}, } + # Alternative to ADC_CHANNELS list have separate constants for the channels (more intuitive) ADC_CHANNEL_T0__0_TO_3V3 = 1 ADC_CHANNEL_T1__0_TO_3V3 = 0 ADC_CHANNEL_T2__0_TO_5V = 3 ADC_CHANNEL_T3__0_TO_5V = 2 ADC_CHANNEL_T4__0_TO_12V = 5 -ADC_CHANNEL_T5__0_TO_12V = 4 +ADC_CHANNEL_T5__0_TO_24V = 4 ADC_CHANNEL_T6__0_TO_20MA = 7 ADC_CHANNEL_T7__0_TO_20MA = 6 From 385ef87eb025635453ff4709eff23f7e1d8bf5b0 Mon Sep 17 00:00:00 2001 From: jonny Date: Mon, 3 Feb 2025 16:27:32 +0100 Subject: [PATCH 13/14] Fix systemd service waiting for network (gui autostart) --- rpi-scripts/gui/gui-start.service | 18 ++++++++++++++---- 1 file changed, 14 insertions(+), 4 deletions(-) diff --git a/rpi-scripts/gui/gui-start.service b/rpi-scripts/gui/gui-start.service index bf7a7c3..c8ac916 100644 --- a/rpi-scripts/gui/gui-start.service +++ b/rpi-scripts/gui/gui-start.service @@ -1,14 +1,24 @@ +# systemd service file for auto starting the python gui +# at the correct time after startup (when window manager finished starting) + + +# Usage: +# - Install: `sudo cp rpi-scripts/gui/gui-start.service /etc/systemd/system/` +# - Enable autostart: `sudo systemctl enable gui-start.service` +# - Disable autostart: `sudo systemctl disable gui-start.service` + [Unit] -Description=Start Python GUI on boot -After=graphical.target +Description=Start Python GUI for IO-control and monitoring after startup +After=display-manager.service +Wants=display-manager.service [Service] Environment=DISPLAY=:0 -ExecStart=/bin/python ./main.py +ExecStart=/usr/bin/python3 /home/pi/git/rpi-interface-board/rpi-scripts/gui/main.py WorkingDirectory=/home/pi/git/rpi-interface-board/rpi-scripts/gui User=pi Group=pi Restart=always [Install] -WantedBy=graphical.target +WantedBy=default.target From 98fb8846fda08dda9ddcf314d4d8acad2e4ae4f9 Mon Sep 17 00:00:00 2001 From: jonny Date: Tue, 4 Feb 2025 08:57:15 +0100 Subject: [PATCH 14/14] Update Readme: Add photos of GUI, TOC --- README.md | 46 +++++++++++++++++++++----- doc/graphics/GUI_tab-adc-plot.png | Bin 0 -> 157533 bytes doc/graphics/GUI_tab-control.png | Bin 0 -> 59333 bytes doc/graphics/GUI_tab-digital-plot.png | Bin 0 -> 38749 bytes 4 files changed, 38 insertions(+), 8 deletions(-) create mode 100644 doc/graphics/GUI_tab-adc-plot.png create mode 100644 doc/graphics/GUI_tab-control.png create mode 100644 doc/graphics/GUI_tab-digital-plot.png diff --git a/README.md b/README.md index 38f229e..94d74e3 100644 --- a/README.md +++ b/README.md @@ -8,8 +8,32 @@ The project is intended for versatile use in prototyping and project development --- +# TOC +- [Photos](#photos) +- [Repository Content](#repository-content) +- [Features Overview](#features-overview) +- [Designed PCBs](#designed-pcbs) + * [1. Raspberry Pi Interface Board](#1-raspberry-pi-interface-board) + * [2. **Power Supply Board**](#2---power-supply-board--) + * [3. **LED Boards**](#3---led-boards--) +- [Raspberry Pi Usage](#raspberry-pi-usage) + * [Connectivity](#connectivity) + + [LAN Connection (Ethernet)](#lan-connection--ethernet-) + + [WiFi Connection](#wifi-connection) + + [SSH Access](#ssh-access) + + [Remote Desktop (RDP)](#remote-desktop--rdp-) + + [Mount Raspberry Pi Filesystem in Windows (SAMBA)](#mount-raspberry-pi-filesystem-in-windows--samba-) +- [Python Scripting](#python-scripting) + * [Running Python Examples](#running-python-examples) + * [Starting a New Python Project with I/O Access](#starting-a-new-python-project-with-i-o-access) + * [GUI Interface](#gui-interface) +- [Housing](#housing) +- [Dropped Features](#dropped-features) -## Photo of All Hardware Components + + +# Photos +### Photo of all Hardware Components

All Components (Disassembled)

@@ -265,9 +289,7 @@ Example scripts demonstrating I/O control can be found in [`rpi-scripts/examples --- -## Scripts & Development - -### Running Python Examples +## Running Python Examples Pre-written **Python scripts** to control I/O terminals are located in: ``` rpi-scripts/examples @@ -278,7 +300,9 @@ cd /home/pi/git/rpi-interface-board/rpi-scripts/examples/ python read_digital_inputs.py ``` -### Starting a New Python Project with I/O Access +--- + +## Starting a New Python Project with I/O Access To create a custom Python project using the **interface board**, follow these steps: 1. **Copy the entire `rpi-scripts/` folder** to your new project directory. @@ -290,7 +314,8 @@ To create a custom Python project using the **interface board**, follow these st --- ## GUI Interface -A **Python GUI** is available for **real-time monitoring** and **control** of all I/O terminals for quick testing. +A **Python GUI** is available for **real-time monitoring** and **control** of all I/O terminals for quick testing. +Currently it auto starts after boot and shows on the integrated display in fullscreen mode. ### Run the GUI ```bash @@ -314,8 +339,9 @@ sudo systemctl disable gui-start.service ### GUI Screenshots

- - + + +

@@ -336,8 +362,12 @@ Custom-designed enclosure includes: 3D Model +
+ --- +
+ # Dropped Features The following ideas were considered but not implemented: diff --git a/doc/graphics/GUI_tab-adc-plot.png b/doc/graphics/GUI_tab-adc-plot.png new file mode 100644 index 0000000000000000000000000000000000000000..e0f9b6aa8724ff99ee69e518f26f9da222fb082f GIT binary patch literal 157533 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

!kuAh(L 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 fUk*<&+9OYEgTR`h6ph>tgeE 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%0DGa4R?l;WQIxZITGdUpoxENb(Z?cLWB4_ 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 literal 0 HcmV?d00001 diff --git a/doc/graphics/GUI_tab-control.png b/doc/graphics/GUI_tab-control.png new file mode 100644 index 0000000000000000000000000000000000000000..c192d55303c97f3ab566ce05193479f6a50a9430 GIT binary patch literal 59333 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�XQ@ti9fos!3XqiOIxqd^UT6vE9V0+Z-yk6A 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 Q6S>I+1=VvYa)#dj16wRG=>Px# literal 0 HcmV?d00001 diff --git a/doc/graphics/GUI_tab-digital-plot.png b/doc/graphics/GUI_tab-digital-plot.png new file mode 100644 index 0000000000000000000000000000000000000000..76ccc9fcf3ce0cef9c25783f4fecf0814debc7c4 GIT binary patch literal 38749 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 literal 0 HcmV?d00001