Skip to content

Commit 28cef2b

Browse files
committed
release of new GPIO modules
1 parent e53cfa0 commit 28cef2b

File tree

5 files changed

+115
-136
lines changed

5 files changed

+115
-136
lines changed

experiments/base/stimulation.py

+37-5
Original file line numberDiff line numberDiff line change
@@ -19,18 +19,35 @@ def __init__(self):
1919
self._name = 'BaseStimulation'
2020
self._parameter_dict = dict(TYPE='str',
2121
PORT='str',
22+
IP = 'str',
2223
STIM_TIME='float')
2324
self._settings_dict = get_stimulation_settings(self._name, self._parameter_dict)
2425
self._running = False
25-
self._stim_device = self._setup_device(self._settings_dict['TYPE'], self._settings_dict['PORT'])
26+
self._stim_device = self._setup_device(self._settings_dict['TYPE'], self._settings_dict['PORT'], self._settings_dict['IP'])
2627

2728
@staticmethod
28-
def _setup_device(type, port):
29+
def _setup_device(type, port, ip):
2930
device = None
3031
if type == 'NI':
3132
from experiments.utils.DAQ_output import DigitalModDevice
3233
device = DigitalModDevice(port)
3334

35+
if type == 'RASPBERRY':
36+
from experiments.utils.gpio_control import DigitalPiDevice
37+
device = DigitalPiDevice(port)
38+
39+
if type == 'RASP_NETWORK':
40+
from experiments.utils.gpio_control import DigitalPiDevice
41+
if ip is not None:
42+
device = DigitalPiDevice(port, ip)
43+
else:
44+
raise ValueError('IP required for remote GPIO control.')
45+
46+
if type == 'ARDUINO':
47+
from experiments.utils.gpio_control import DigitalArduinoDevice
48+
device = DigitalArduinoDevice(port)
49+
50+
3451
return device
3552

3653
def stimulate(self):
@@ -72,23 +89,38 @@ class RewardDispenser(BaseStimulation):
7289
def __init__(self):
7390
self._name = 'RewardDispenser'
7491
self._parameter_dict = dict(TYPE = 'str',
92+
IP = 'str',
7593
STIM_PORT= 'str',
7694
REMOVAL_PORT = 'str',
7795
STIM_TIME = 'float',
7896
REMOVAL_TIME = 'float')
7997
self._settings_dict = get_stimulation_settings(self._name, self._parameter_dict)
8098
self._running = False
81-
self._stim_device = self._setup_device(self._settings_dict['TYPE'], self._settings_dict['STIM_PORT'])
82-
self._removal_device = self._setup_device(self._settings_dict['TYPE'], self._settings_dict['REMOVAL_PORT'])
99+
self._stim_device = self._setup_device(self._settings_dict['TYPE'], self._settings_dict['STIM_PORT'],
100+
self._settings_dict['IP'])
101+
self._removal_device = self._setup_device(self._settings_dict['TYPE'], self._settings_dict['REMOVAL_PORT'],
102+
self._settings_dict['IP'])
83103

84104

85105
@staticmethod
86-
def _setup_device(type, port):
106+
def _setup_device(type, port, ip):
87107
device = None
88108
if type == 'NI':
89109
from experiments.utils.DAQ_output import DigitalModDevice
90110
device = DigitalModDevice(port)
91111

112+
if type == 'RASPBERRY':
113+
from experiments.utils.gpio_control import DigitialPiBoardDevice
114+
device = DigitialPiBoardDevice(port)
115+
116+
if type == 'RASP_NETWORK':
117+
from experiments.utils.gpio_control import DigitialPiBoardDevice
118+
if ip is not None:
119+
device = DigitialPiBoardDevice(port, ip)
120+
else:
121+
raise ValueError('IP required for remote GPIO control.')
122+
123+
92124
return device
93125

94126
def stimulate(self):

experiments/configs/default_config.ini

+8
Original file line numberDiff line numberDiff line change
@@ -98,12 +98,20 @@ STIMULATION = BaseStimulation
9898
;[STIMULATION]
9999

100100
[BaseStimulation]
101+
; can be NI, RASPBERRY or RASP_NETWORK
101102
TYPE = NI
103+
;only used in RASP_NETWORK
104+
IP = None
105+
;PORT parameter is used for all (Port from DAQ, PIN from Raspberry, or serial port from Arduino)
102106
PORT = Dev1/PFI6
103107
STIM_TIME = 3.5
104108

105109
[RewardDispenser]
110+
; can be NI, RASPBERRY, RASP_NETWORK or ARDUINO
106111
TYPE = NI
112+
;only used in RASP_NETWORK
113+
IP = None
114+
;PORT parameter is used for all (Port from DAQ, PIN from Raspberry, or serial port from Arduino)
107115
STIM_PORT = Dev1/PFI6
108116
REMOVAL_PORT = Dev1/PFI5
109117
STIM_TIME = 3.5

experiments/utils/gpio_control.py

+66
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,66 @@
1+
from gpiozero import DigitalOutputDevice
2+
from gpiozero.pins.pigpio import PiGPIOFactory
3+
4+
import serial
5+
6+
7+
8+
class DigitalPiDevice:
9+
"""
10+
Digital modulated devices in combination with Raspberry Pi GPIO
11+
Setup: https://gpiozero.readthedocs.io/en/stable/remote_gpio.html
12+
"""
13+
14+
def __init__(self, PIN, BOARD_IP: str = None):
15+
16+
"""
17+
:param BOARD_IP: IP adress of board connected to the Device
18+
"""
19+
if BOARD_IP is not None:
20+
self._factory = PiGPIOFactory(host = BOARD_IP)
21+
self._device = DigitalOutputDevice(PIN, pin_factory = self._factory)
22+
else:
23+
self._factory = None
24+
self._device = DigitalOutputDevice(PIN)
25+
self._running = False
26+
27+
def turn_on(self):
28+
self._device.on()
29+
self._running = True
30+
31+
def turn_off(self):
32+
self._device.off()
33+
self._running = False
34+
35+
def toggle(self):
36+
self._device.toggle()
37+
self._running = self._device.is_active
38+
39+
40+
class DigitalArduinoDevice:
41+
"""
42+
Digital modulated devices in combination with Arduino boards connected via USB
43+
setup: https://pythonforundergradengineers.com/python-arduino-LED.html
44+
45+
"""
46+
47+
def __init__(self, PORT):
48+
"""
49+
:param PORT: USB PORT of the arduino board
50+
"""
51+
self._device = serial.Serial(PORT, baudrate=9600)
52+
self._running = False
53+
54+
def turn_on(self):
55+
self._device.write(b'H')
56+
self._running = True
57+
58+
def turn_off(self):
59+
self._device.write(b'L')
60+
self._running = False
61+
62+
def toggle(self):
63+
if self._running:
64+
self.turn_off()
65+
else:
66+
self.turn_on()

experiments/utils/readme.md

-130
This file was deleted.

requirements.txt

+4-1
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,11 @@
1+
gpiozero
2+
pigpio
3+
pyserial
14
nidaqmx>=0.5.7
25
click>=7.0
36
opencv-python>=3.4.5.20
47
numpy>=1.14.5
58
pandas>=0.21.0
69
matplotlib>=3.0.3
710
scikit-image>=0.14.2
8-
scipy>=1.1.0
11+
scipy>=1.1.0

0 commit comments

Comments
 (0)