Skip to content
William Wood edited this page Apr 10, 2024 · 30 revisions

JISA Wiki

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

GUI Building

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.

https://i.imgur.com/EV394pd.png

See More

Instrument Control

Connecting to instruments is easy with JISA. All you need to know is:

  1. The name of the driver class for your instrument
  2. 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).

See More

Data Handling

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(...).

See More

Clone this wiki locally