Latest revision |
Your text |
Line 7: |
Line 7: |
| {| class="wikitable" style="text-align:center" | | {| class="wikitable" style="text-align:center" |
| |- | | |- |
| ! !! Linux !! [[Octave for Microsoft Windows:GNU Octave on cygwin | Windows (Cygwin)]] !! Windows (native) !! FreeBSD !! Mac OS X | | ! !! Linux !! Windows (Cygwin) !! Windows (native) !! FreeBSD !! Mac OS X |
| |- | | |- |
| ! Serial | | ! Serial |
Line 17: |
Line 17: |
| ! i2c | | ! i2c |
| | bgcolor="green" | v0.1.0 || - || - || bgcolor="skyblue" | stalled || - | | | bgcolor="green" | v0.1.0 || - || - || bgcolor="skyblue" | stalled || - |
| |-
| |
| ! modbus
| |
| | bgcolor="green" | v0.8.0 || bgcolor="green" | v0.8.0 || bgcolor="green" | v0.8.0 || - || bgcolor="green" | v0.8.0
| |
| |-
| |
| ! spi
| |
| | bgcolor="green" | v0.6.0 || - || - || - || -
| |
| |- | | |- |
| ! TCP | | ! TCP |
| | bgcolor="green" | v0.2.0 || bgcolor="green" | v0.2.0 || bgcolor="green" | v0.2.0 || bgcolor="skyblue" | stalled || bgcolor="green" | v0.2.2 | | | bgcolor="green" | v0.2.0 || bgcolor="green" | v0.2.0 || bgcolor="green" | v0.2.0 || bgcolor="skyblue" | stalled || bgcolor="green" | v0.2.2 |
| |-
| |
| ! UDP
| |
| | bgcolor="green" | v0.3.0 || bgcolor="green" | v0.3.0 || bgcolor="green" | v0.3.0 || - || bgcolor="green" | v0.3.0
| |
| |- | | |- |
| ! USBTMC | | ! USBTMC |
Line 34: |
Line 25: |
| |- | | |- |
| ! GPIB | | ! GPIB |
| | bgcolor="green" | v0.2.0 [[#Linux|(*)]] || bgcolor="green" | v0.2.0 [[#Windows_.28cygwin.29|(*)]] || - ||- || - | | | bgcolor="green" | v0.2.0 [[#Linux|(*)]] || - || - ||- || - |
| |- | | |- |
| ! VXI11 | | ! VXI11 |
Line 46: |
Line 37: |
| {{Code|Check for interface support|<syntaxhighlight lang="octave" style="font-size:13px"> | | {{Code|Check for interface support|<syntaxhighlight lang="octave" style="font-size:13px"> |
| pkg load instrument-control | | pkg load instrument-control |
| supportedinterfaces = instrhwinfo().SupportedInterfaces
| |
|
| |
|
| if ! isempty(strfind (supportedinterfaces , "serial")) | | if (exist("serial") == 3) |
| disp("Serial: Supported") | | disp("Serial: Supported") |
| else | | else |
Line 55: |
Line 45: |
|
| |
|
| #similarly with: | | #similarly with: |
| # ! isempty(strfind (supportedinterfaces , "parallel")) | | #exist("parallel") == 3 |
| # ! isempty(strfind (supportedinterfaces , "i2c")) | | #exist("i2c") == 3 |
| </syntaxhighlight>}} | | </syntaxhighlight>}} |
|
| |
|
Line 67: |
Line 57: |
|
| |
|
| For VXI11 support, please install 'rpcgen', 'libtirpc-devel', and 'libtirpc1' before installing instrument-control. | | For VXI11 support, please install 'rpcgen', 'libtirpc-devel', and 'libtirpc1' before installing instrument-control. |
|
| |
| To be able to use GPIB on windows, the linux-gpib library needs to be 'faked'. This can be done by copying the following script and run it in a bash-terminal.
| |
|
| |
| <syntaxhighlight lang="bash">
| |
| #!/bin/bash
| |
| # fake_linux_gpib.sh, Kire Pûdsje, Dec 2017
| |
|
| |
| # This file generates a fake linux-gpib library on Windows, based on the
| |
| # installed NI libraries.
| |
| # Prerequisits are that during install of the NI drivers, the C/C++ support
| |
| # and the NI Measurement & Automation explorer has been enabled.
| |
|
| |
| # set the base for includes and libraries on your system
| |
| # it is usually /usr, but on newer windows installs of octave, it will be
| |
| # /mingw64
| |
| INSTALL_BASE=/usr
| |
|
| |
| # this define should find the NI header file, if properly installled
| |
| # otherwise just point it to the proper header file.
| |
| NI_H_FILE="${NIEXTCCOMPILERSUPP}/include/ni4882.h"
| |
| NI_DLL_FILE=ni4882.dll
| |
| NI_DEF_FILE=/tmp/${0##*/}-$$.def
| |
|
| |
| # symlink NI header file
| |
| mkdir -p ${INSTALL_BASE}/include/gpib/
| |
| ln -sf "${NI_H_FILE}" ${INSTALL_BASE}/include/gpib/ib.h
| |
|
| |
| # generate .def for all functions in the NI header file with a NI488CC prefix
| |
| echo LIBRARY ${NI_DLL_FILE} > ${NI_DEF_FILE}
| |
| echo EXPORTS >> ${NI_DEF_FILE}
| |
| grep "NI488CC *[A-Za-z]" ${INSTALL_BASE}/include/gpib/ib.h \
| |
| | sed "s/^.*NI488CC *//" \
| |
| | sed "s/(.*$//" >> ${NI_DEF_FILE}
| |
|
| |
| # generate the wrapper library simulating gpib-linux
| |
| dlltool -d ${NI_DEF_FILE} -l ${INSTALL_BASE}/lib/libgpib.a
| |
|
| |
| #cleanup
| |
| rm -f ${NI_DEF_FILE}
| |
| </syntaxhighlight>
| |
|
| |
|
| == MacOS == | | == MacOS == |
|
| |
|
| You need to build '''rpcgen''' from source [http://mirror.ancl.hawaii.edu/pub/FreeBSD/FreeBSD-current/src/usr.bin/rpcgen]. | | You need to build rpcgen from source [http://mirror.ancl.hawaii.edu/pub/FreeBSD/FreeBSD-current/src/usr.bin/rpcgen]. |
| | |
| If rpcgen cannot be build from source, the following error might be obtained:
| |
| <syntaxhighlight lang="text" style="font-size:13px">
| |
| pkg: error running `make' for the instrument-control package.
| |
| error: called from
| |
| configure_make at line 99 column 9
| |
| install at line 184 column 7
| |
| pkg at line 437 column 9
| |
| </syntaxhighlight>
| |
| | |
| If the '''VXI-11 interface''' is not required, a workarround is proposed in [https://stackoverflow.com/questions/46720092/make-error-when-installing-instrument-control-package-for-octave/52860282#52860282] after the bug reported on [https://savannah.gnu.org/bugs/?54842].
| |
|
| |
|
| = Examples = | | = Examples = |
Line 156: |
Line 95: |
| }} | | }} |
|
| |
|
| Changing some configurations is simply done by calling helper functions
| | Chaging some configurations is simple done by calling helper functions |
| {{Code|Serial port example: helper functions|<syntaxhighlight lang="octave" style="font-size:13px"> | | {{Code|Serial port example: helper functions|<syntaxhighlight lang="octave" style="font-size:13px"> |
| set(s1, "baudrate", 9600) # Change baudrate | | set(s1, "baudrate", 9600) # Change baudrate |
Line 367: |
Line 306: |
|
| |
|
| == i2c == | | == i2c == |
| Example with a Si7021 i2c breakout board (https://www.sparkfun.com/products/1376) connected to a i2c master interface.
| | i2c |
| | |
| To work out the devices available (assuming i2ctools are installed) run the i2cdetect command from a terminal window.
| |
| | |
| <syntaxhighlight lang="bash" style="font-size:13px">
| |
| $ i2cdetect -l
| |
| i2c-1 i2c i2c-ch341-usb at bus 002 device 008 I2C adapter
| |
| i2c-0 unknown SMBus I801 adapter at 4000 N/
| |
| </syntaxhighlight>
| |
| | |
| In the example case the temperature sensor is connected to the i2c-ch341-usb device, and it is assumed the user has sufficient permissions to access the device.
| |
| | |
| According to the datasheet, the temperature device uses address 0x40, so create a i2c device using the linux device and address:
| |
| | |
| <syntaxhighlight lang="octave" style="font-size:13px">
| |
| i2cdev = i2c("/dev/i2c-1", 0x40)
| |
| </syntaxhighlight>
| |
| | |
| To read the temperature, register 0xF3 must be addressed and read (2 bytes of data):
| |
| | |
| <syntaxhighlight lang="octave" style="font-size:13px">
| |
| TEMP_MEASURE_NOHOLD = hex2dec("F3");
| |
| fwrite (i2cdev, uint8([TEMP_MEASURE_NOHOLD]));
| |
| pause (0.02);
| |
| data = fread (i2cdev, 3);
| |
| </syntaxhighlight>
| |
| | |
| The data must be converted to a deg K value by making 16 bit number of the value and masking out unused bits.
| |
| | |
| <syntaxhighlight lang="octave" style="font-size:13px">
| |
| value = uint16(data(1))*256 + uint16(data(2));
| |
| value = bitand (value, hex2dec("FFFC"));
| |
| temp_Code = double(value);
| |
| </syntaxhighlight>
| |
| | |
| Now convert the temperature to degrees C and display:
| |
| | |
| <syntaxhighlight lang="octave" style="font-size:13px">
| |
| C = (175.72*temp_Code/65536)-46.85;
| |
| printf ("temperature read %f C\n", C);
| |
| </syntaxhighlight>
| |
|
| |
|
| == TCP == | | == TCP == |
Line 471: |
Line 370: |
| # Convert uint8 array to string, | | # Convert uint8 array to string, |
| char(data) | | char(data) |
| # close VXI11 session | | # close usbtmc session |
| vxi11_close(t0) | | vxi11_close(t0) |
| </syntaxhighlight> | | </syntaxhighlight> |
| }} | | }} |
|
| |
| === Limitations === | | === Limitations === |
| For now, | | For now, |
Line 503: |
Line 401: |
| * Every read or write command opens and closes a new gpib session, since the linux-gpib session pointer is only valid for single command. | | * Every read or write command opens and closes a new gpib session, since the linux-gpib session pointer is only valid for single command. |
|
| |
|
| == SPI ==
| | [[Category:Octave-Forge]] |
| === Configuring interface ===
| |
| SPI currently only works in linux.
| |
| | |
| instrhwinfo will display the avilable devices in the system
| |
| | |
| {{Code|SPI example|<syntaxhighlight lang="octave" style="font-size:13px">
| |
| instrhwinfo("spi")
| |
| </syntaxhighlight>
| |
| }}
| |
| | |
| You will need read/write permissions to the device used.
| |
| | |
| === Example: basic use ===
| |
| Example opening an performing IO on a device /dev/spidev0.0.
| |
|
| |
| {{Code|SPI example|<syntaxhighlight lang="octave" style="font-size:13px">
| |
| # open device
| |
| spidev = spi("/dev/spidev0.0", 'clockpolarity', 'idlehigh', 'clockphase', 'firstedge')
| |
| | |
| # I/O to device
| |
| | |
| data = writeAndRead (spidev, uint8([0x01 0x00]))
| |
| | |
| # close the device
| |
| clear spidev
| |
| </syntaxhighlight>
| |
| }}
| |
| | |
| | |
| [[Category:Octave Forge]][[Category:Packages]] | |