-
Notifications
You must be signed in to change notification settings - Fork 9
Home
Welcome to the wiki for JISA
!
JISA
is a library written in Java, intended to be used as a means of creating experimental control systems for common laboratory instrumentation. Whilst it is written in Java, it can be used in any language that can run on or use the JVM (which is just about anything). For example:
Language | How |
---|---|
Java | Java.isJava() == true |
Kotlin | Designed to compile to java byte-code (thus fully inter-operable with Java) |
Python | By running on the Jython interpreter (which is written in Java) or by using JPype / PyJISA |
Ruby | By running on the jRuby interpreter (which is written in Java) |
MATLAB | MATLAB is written in Java |
C++ | Can be compiled to java byte-code by use of gcc-bridge |
JISA
provides a suite of pre-made GUI elements that you can piece together to create simple GUIs to control your experiment. They are easy to use for simple tasks but also allow you to do more complex things with them, offering a scale of simplicity and complexity to suit both your needs and ability.
Connecting to instruments is easy with JISA
. All you need to know is:
- The name of the driver class for your instrument
- How your instrument is connected
For example, if we have a Keithley 2400 connected via GPIB (board 0, address 12), then the driver class is K2400
and the address is GPIBAddress(0,12)
. Thus, in Kotlin, we would write:
val smu = K2400(GPIBAddress(0,12))
Now, the variable smu
is an object that represents our connection to the Keithley 2400, letting us do things like:
smu.setVoltage(5.0) // Set to source 5 V
smu.setIntegrationTime(0.2) // Set integration time to 0.2 s
smu.setCurrentLimit(30e-3) // Limit current to 30 mA
smu.useAutoRanges() // Use auto-ranging for voltage and current
smu.turnOn() // Enable output
If we were to use a different SMU, the code remains the same. All that changes is which driver class we use. For example if we use a Keithley 236 instead:
val smu = K236(GPIBAddress(0,12))
smu.setVoltage(5.0) // Set to source 5 V
smu.setIntegrationTime(0.2) // Set integration time to 0.2 s
smu.setCurrentLimit(30e-3) // Limit current to 30 mA
smu.useAutoRanges() // Use auto-ranging for voltage and current
smu.turnOn() // Enable output
This is why the instrument control is called "standardised": the way you use the same "type" of instrument is the same regardless of make and/or model (despite what actually has to happen "under the hood" being completely different).
Storing and using experimental data is a must for any experimental control system. To this end, JISA
provides the ResultList
and ResultTable
classes. For example:
val VOLTAGE = Column.ofDoubles("Voltage", "V")
val CURRENT = Column.ofDoubles("Current", "A")
val results = ResultList(VOLTAGE, CURRENT)
will define a "table of results" with two columns: "Voltage [V]" and "Current [A]", like so:
Voltage [V] | Current [A] |
---|---|
............ | ............ |
............ | ............ |
............ | ............ |
We can then add data to it, one row at a time, like so:
results.mapRow(
VOLTAGE to voltageValue,
CURRENT to currentValue
)
For example, if we were to sweep voltage on an SMU:
val smu = K2400(GPIBAddress(0,12))
val VOLTAGE = Column.ofDoubles("Voltage", "V")
val CURRENT = Column.ofDoubles("Current", "A")
val results = ResultList(VOLTAGE, CURRENT)
smu.turnOn()
for (v in 0..60) {
smu.setVoltage(v)
results.mapRow(
VOLTAGE to smu.getVoltage(),
CURRENT to smu.getCurrent()
)
}
smu.turnOff()
results.output("data.csv");
Then as we can see, this can be easily output as a CSV file by use of results.output(...)
.
- Getting Started
- Object Orientation
- Choosing a Language
- Using JISA in Java
- Using JISA in Python
- Using JISA in Kotlin
- Exceptions
- Functions as Objects
- Instrument Basics
- SMUs
- Thermometers (and old TCs)
- PID and Temperature Controllers
- Lock-Ins
- Power Supplies
- Pre-Amplifiers
- Writing New Drivers