Files
IOBoard/pi_boardtest.py
2017-06-21 14:05:18 -05:00

128 lines
3.4 KiB
Python

"""Test the IO Board using a Raspberry Pi."""
try:
import RPi.GPIO as GPIO
except RuntimeError:
print("Error importing RPi.GPIO! This is probably because you need superuser privileges. You can achieve this by using 'sudo' to run your script")
import time
import spidev
spi = spidev.SpiDev()
spi.open(0, 0)
GPIO.setmode(GPIO.BOARD)
if GPIO.getmode() == 11:
mux_channels = [5, 6, 13]
inp_channel = 19
relay_channels = [21, 20, 16, 12, 25, 24, 23, 18]
else:
mux_channels = [29, 31, 33]
inp_channel = 35
relay_channels = [40, 38, 36, 32, 22, 18, 16, 12]
GPIO.setup(mux_channels, GPIO.OUT)
GPIO.setup(relay_channels, GPIO.OUT)
GPIO.setup(inp_channel, GPIO.IN)
input_mux = [
[],
[0, 0, 0], # Input 1
[1, 0, 0], # Input 2
[0, 1, 0], # Input 3
[1, 1, 0], # Input 4
[0, 0, 1], # Input 5
[1, 0, 1], # Input 6
[0, 1, 1], # Input 7
[1, 1, 1], # Input 8
]
GPIO_mux = [
(),
(GPIO.LOW, GPIO.LOW, GPIO.LOW), # 1
(GPIO.HIGH, GPIO.LOW, GPIO.LOW), # 2
(GPIO.LOW, GPIO.HIGH, GPIO.LOW), # 3
(GPIO.HIGH, GPIO.HIGH, GPIO.LOW), # 4
(GPIO.LOW, GPIO.LOW, GPIO.HIGH), # 5
(GPIO.HIGH, GPIO.LOW, GPIO.HIGH), # 6
(GPIO.LOW, GPIO.HIGH, GPIO.HIGH), # 7
(GPIO.HIGH, GPIO.HIGH, GPIO.HIGH) # 8
]
def relay_write(relay_number, status):
"""Write the specified status to the relay at the relay_number."""
write_val = GPIO.HIGH if status >= 1 else GPIO.LOW
if relay_number <= 8 and relay_number >= 1:
GPIO.output(relay_channels[relay_number - 1], write_val)
return True
else:
print("CANNOT WRITE TO A RELAY THAT DOES NOT EXIST: {}".format(relay_number))
return False
def relay_loop():
"""Set all relays to 1 sequentially, then set all relays to 0 sequentially."""
for i in range(1, 9):
relay_write(i, 1)
time.sleep(1)
for i in range(1, 9):
relay_write(i, 0)
time.sleep(1)
def read_dig_in(io_port):
"""Read IO Board digital input."""
if io_port == 0 or io_port > 8:
print("CANNOT READ A PORT THAT DOES NOT EXIST: {}".format(io_port))
return False
GPIO.output(mux_channels, GPIO_mux[io_port])
return GPIO.input(inp_channel) == 0
def dig_in_loop():
"""Read all digital inputs."""
for i in range(1, 9):
print("DIGIN {} = {}".format(i, read_dig_in(i)))
def read_analog_in(io_port, verbose=False):
"""Read IO Board digital input."""
global spi_bus
if io_port < 1 or io_port > 4:
print("CANNOT READ A PORT THAT DOES NOT EXIST: {}".format(io_port))
return False
GPIO.output(mux_channels, GPIO_mux[io_port])
ok_status = False
tries = 0
while (ok_status is False) and (tries < 5):
GPIO.output(mux_channels, GPIO_mux[io_port])
x = spi.xfer2(bytearray([0, 0, 0]))
if verbose:
print((x[0], x[1], x[2]))
c_bin = format(x[2], '#010b')[2:]
if c_bin[-3:] == "101":
ok_status = True
if verbose:
print("OK: {}, Status: {}".format(ok_status, c_bin))
print(x[0] * 256 + x[1])
if ok_status:
return x[0] * 256 + x[1]
time.sleep(0.25)
tries += 1
if __name__ == '__main__':
# led_flash(10)
# relay_loop()
dig_in_loop()
for x in range(0, 10):
for i in range(1, 5):
print("Analog {}".format(i))
print(read_analog_in(i))
GPIO.cleanup()