LimeSDR GPIO Board: Difference between revisions
AndrewBack (talk | contribs) (Created page with "An expansion board for the LimeSDR family that provides individually settable, bi-directional level-shifted I/O for FPGA GPIO 0-7. Each I/O has a high-voltage and power Darlin...") |
AndrewBack (talk | contribs) No edit summary |
||
(11 intermediate revisions by the same user not shown) | |||
Line 1: | Line 1: | ||
An expansion board for the LimeSDR family that provides individually settable, bi-directional level-shifted I/O for FPGA GPIO 0-7. Each I/O has a high-voltage and power Darlington drive stage suitable for inductive loads, such as coaxial relays. | An expansion board for the LimeSDR family that provides individually settable, bi-directional level-shifted I/O for FPGA GPIO 0-7. | ||
Each I/O has a high-voltage and power Darlington drive stage suitable for inductive loads, such as coaxial relays. | |||
== Key features == | == Key features == | ||
* Provides bi-directional level shifted IO for GPIO 0-7 | * Provides bi-directional level shifted IO for GPIO 0-7 | ||
** 1.2-5.5V IO on J2 | ** 1.2-5.5V IO on J2 | ||
* Each IO has a high voltage and power Darlington drive stage | * Each IO has a high voltage and power Darlington drive stage | ||
** Acceptable rating 30V 300mA (0-4) 200mA (5-7) | ** Acceptable rating 30V 300mA (0-4) 200mA (5-7) | ||
** Suitable for inductive loads | ** Suitable for inductive loads | ||
* Input/Output are individually switch-able | * Input/Output are individually switch-able | ||
* LimeSDR form factor | * LimeSDR form factor | ||
* Individually pluggable relay connections | * Individually pluggable relay connections | ||
== Documentation == | == Documentation == | ||
=== Layout === | |||
[[File:LimeSDR CPIO Board Layout.jpg]] | |||
* <span style="background:#ff00ff">Data direction switches and data indication</span> | |||
* <span style="background:#00ff00">J2 Level shifted interface (1.2-5.5V)</span> | |||
*<span style="background:#00ff00"> J1 (cable) and J23 (direct connection)</span> | |||
* <span style="background:#00ff00">LimeSDR interface (3v3 only)</span> | |||
* <span style="background:#ff0000">Power input</span> | |||
* <span style="background:#00ff00">Relay out 0 to 3</span> | |||
* <span style="background:#00ff00">Relay out 4 to 7</span> | |||
=== Relay outputs and power in === | === Relay outputs and power in === | ||
Line 23: | Line 37: | ||
Equivalent Circuit: | Equivalent Circuit: | ||
[[ File:LimeSDR GPIO Board Equivalent Circuit.png ]] | |||
=== J3 Power bypass === | === J3 Power bypass === | ||
Line 35: | Line 51: | ||
==== LimeSuiteGUI ==== | ==== LimeSuiteGUI ==== | ||
[[File:LimeSuiteGUI GPIO Controls.png]] | |||
Connect as normal with LimeSuiteGUI within the board controls tab there is a GPIO control section. “Dir” Ticked is an output un-ticked an input. | Connect as normal with LimeSuiteGUI within the board controls tab there is a GPIO control section. “Dir” Ticked is an output un-ticked an input. | ||
==== Python ==== | ==== C++ (LMS API) ==== | ||
See the [https://github.com/myriadrf/LimeSuite/tree/master/src/examples example provided with Lime Suite]. | |||
==== Python (SoapySDR API) ==== | |||
These control examples use [https://github.com/pothosware/SoapySDR/wiki/PythonSupport Soapy SDR Python support]. Please ensure that you have this installed. | |||
===== Read pin status ===== | |||
<source lang="python" line='line'> | |||
import SoapySDR | |||
from SoapySDR import * #SOAPY_SDR_ constants | |||
import time | |||
print("Done!") | |||
def main(): | |||
d = SoapySDR.Device() | |||
d.writeGPIODir('MAIN', 0x00) #all inputs | |||
while(1): | |||
data = d.readGPIO('MAIN') | |||
print(data) | |||
time.sleep(1) | |||
if __name__ == '__main__': main() | |||
</source> | |||
===== Toggle each pin ===== | |||
<source lang="python" line='line'> | |||
import SoapySDR | |||
from SoapySDR import * #SOAPY_SDR_ constants | |||
import time | |||
print("Done!") | |||
def main(): | |||
d = SoapySDR.Device() | |||
d.writeGPIODir('MAIN', 0xFF) #all outputs | |||
data = d.listGPIOBanks() | |||
print "Device being used: %s" %(data) | |||
toggle =0 | |||
while(1) | |||
if(toggle==0): | |||
GPIOVal = 0x00 | |||
print "GPIO %d set with value %d" % (toggle,GPIOVal) | |||
d.writeGPIO('MAIN', GPIOVal) #all off | |||
if(toggle==1): | |||
GPIOVal = 0x01 | |||
print "GPIO %d set with value %d" % (toggle,GPIOVal) | |||
d.writeGPIO('MAIN', GPIOVal) #GPIO 1 On | |||
if(toggle==2): | |||
GPIOVal = 0x02 | |||
print "GPIO %d set with value %d" % (toggle,GPIOVal) | |||
d.writeGPIO('MAIN', GPIOVal) #GPIO 2 On | |||
if(toggle==3): | |||
GPIOVal = 0x04 | |||
print "GPIO %d set with value %d" % (toggle,GPIOVal) | |||
d.writeGPIO('MAIN', GPIOVal) #GPIO 3 On | |||
if(toggle==4): | |||
GPIOVal = 0x08 | |||
print "GPIO %d set with value %d" % (toggle,GPIOVal) | |||
d.writeGPIO('MAIN', GPIOVal) #GPIO 4 On | |||
if(toggle==5): | |||
GPIOVal = 0x10 | |||
print "GPIO %d set with value %d" % (toggle,GPIOVal) | |||
d.writeGPIO('MAIN', GPIOVal) #GPIO 5 On | |||
if(toggle==6): | |||
GPIOVal = 0x20 | |||
print "GPIO %d set with value %d" % (toggle,GPIOVal) | |||
d.writeGPIO('MAIN', GPIOVal) #GPIO 6 On | |||
if(toggle==7): | |||
GPIOVal = 0x40 | |||
print "GPIO %d set with value %d" % (toggle,GPIOVal) | |||
d.writeGPIO('MAIN', GPIOVal) #GPIO 7 On | |||
if(toggle==8): | |||
GPIOVal = 0x80 | |||
print "GPIO %d set with value %d" % (toggle,GPIOVal) | |||
d.writeGPIO('MAIN', GPIOVal) #GPIO 8 On | |||
toggle =0 | |||
toggle = toggle + 1 # increment the loop | |||
time.sleep(2) # sleep | |||
if __name__ == '__main__': main() | |||
</source> | |||
== Design files == | |||
The KiCAD design files can be found on GitHub: | |||
https://github.com/myriadrf/LimeSDR_GPIO_Board | |||
{{Community}} | {{Community}} |
Latest revision as of 07:14, 21 February 2018
An expansion board for the LimeSDR family that provides individually settable, bi-directional level-shifted I/O for FPGA GPIO 0-7.
Each I/O has a high-voltage and power Darlington drive stage suitable for inductive loads, such as coaxial relays.
Key features
- Provides bi-directional level shifted IO for GPIO 0-7
- 1.2-5.5V IO on J2
- Each IO has a high voltage and power Darlington drive stage
- Acceptable rating 30V 300mA (0-4) 200mA (5-7)
- Suitable for inductive loads
- Input/Output are individually switch-able
- LimeSDR form factor
- Individually pluggable relay connections
Documentation
Layout
- Data direction switches and data indication
- J2 Level shifted interface (1.2-5.5V)
- J1 (cable) and J23 (direct connection)
- LimeSDR interface (3v3 only)
- Power input
- Relay out 0 to 3
- Relay out 4 to 7
Relay outputs and power in
All 8 relay outputs are designed with inductive load switching in mind.
Channels 0-4 have 3 stages of the ULN2003A connected so are suitable for high power applications, It is recommended to keep below 300mA to avoid excessive heating.
Power is connected from J6, Use caution when connecting high voltage supplies not to in correctly connect them as they can cause permanent damage to your LimeSDR.
Equivalent Circuit:
J3 Power bypass
The GPIO board requires power for the level shifting circuity, J2’s VCC must be connected to your interface logic level (i.e. 5V).
If this the level shifting feature is not being used then connect a jumper on J3 to set the whole board to 3v3.
NOTE: DO NOT PROVIDE POWER TO J2 WHEN J3 IS CONNECTED!
Control
LimeSuiteGUI
Connect as normal with LimeSuiteGUI within the board controls tab there is a GPIO control section. “Dir” Ticked is an output un-ticked an input.
C++ (LMS API)
See the example provided with Lime Suite.
Python (SoapySDR API)
These control examples use Soapy SDR Python support. Please ensure that you have this installed.
Read pin status
import SoapySDR from SoapySDR import * #SOAPY_SDR_ constants import time print("Done!") def main(): d = SoapySDR.Device() d.writeGPIODir('MAIN', 0x00) #all inputs while(1): data = d.readGPIO('MAIN') print(data) time.sleep(1) if __name__ == '__main__': main()
Toggle each pin
import SoapySDR from SoapySDR import * #SOAPY_SDR_ constants import time print("Done!") def main(): d = SoapySDR.Device() d.writeGPIODir('MAIN', 0xFF) #all outputs data = d.listGPIOBanks() print "Device being used: %s" %(data) toggle =0 while(1) if(toggle==0): GPIOVal = 0x00 print "GPIO %d set with value %d" % (toggle,GPIOVal) d.writeGPIO('MAIN', GPIOVal) #all off if(toggle==1): GPIOVal = 0x01 print "GPIO %d set with value %d" % (toggle,GPIOVal) d.writeGPIO('MAIN', GPIOVal) #GPIO 1 On if(toggle==2): GPIOVal = 0x02 print "GPIO %d set with value %d" % (toggle,GPIOVal) d.writeGPIO('MAIN', GPIOVal) #GPIO 2 On if(toggle==3): GPIOVal = 0x04 print "GPIO %d set with value %d" % (toggle,GPIOVal) d.writeGPIO('MAIN', GPIOVal) #GPIO 3 On if(toggle==4): GPIOVal = 0x08 print "GPIO %d set with value %d" % (toggle,GPIOVal) d.writeGPIO('MAIN', GPIOVal) #GPIO 4 On if(toggle==5): GPIOVal = 0x10 print "GPIO %d set with value %d" % (toggle,GPIOVal) d.writeGPIO('MAIN', GPIOVal) #GPIO 5 On if(toggle==6): GPIOVal = 0x20 print "GPIO %d set with value %d" % (toggle,GPIOVal) d.writeGPIO('MAIN', GPIOVal) #GPIO 6 On if(toggle==7): GPIOVal = 0x40 print "GPIO %d set with value %d" % (toggle,GPIOVal) d.writeGPIO('MAIN', GPIOVal) #GPIO 7 On if(toggle==8): GPIOVal = 0x80 print "GPIO %d set with value %d" % (toggle,GPIOVal) d.writeGPIO('MAIN', GPIOVal) #GPIO 8 On toggle =0 toggle = toggle + 1 # increment the loop time.sleep(2) # sleep if __name__ == '__main__': main()
Design files
The KiCAD design files can be found on GitHub:
https://github.com/myriadrf/LimeSDR_GPIO_Board
|