OpenSesame Plugin: Radboud Buttonbox
An OpenSesame plugin for the Radboud Buttonbox (BITSI): button responses, sound and voice key, and stimulus synchronization triggers to data acquisition systems.
Copyright (C) 2016-2026 Bob Rosbag
This plugin makes use of the RuSocSci python package developed by Wilbert van Ham. Radboud Buttonbox is developed by Pascal de Water. Exact references will follow in the future.
About
The Technical Support Group (Radboud University, Social Sciences) developed a USB Arduino based Buttonbox which can be used for time accurate (1ms) button press, voice key, sound key registration and sending parallel port like triggers. Upper case A, B, C, D, E (, F, G, H) are used for key presses, and lower case a, b, c, d, e (, f, g, h) are used for key releases. Uppercase S is used for sound key detection and uppercase V for voice key.
For more information:
https://tsgdoc.socsci.ru.nl/index.php/ButtonBox
This plugin consists of foreground and background (multithreaded) items.
Difference between foreground and background:
- The foreground item registers buttons/signals until it detects an allowed button or the set duration has passed.
- The background items are a 'start' and a 'wait' item. These are fully multi-threaded. After the start of the button/signal registration, the item will immediately advance to the next item. When the experiment reaches the 'wait' item, it will wait until a button/signal has been detected by the 'start' item or the duration has passed.
This plugin has six items:
- Init initialization of the buttonbox, this should be placed at the beginning of an experiment.
- Wait Buttons waits for a button press or release before continuing to the next item in the experiment.
- Get Buttons Start starts a new thread which monitors for button presses/releases, it will directly advance to the next item in the experiment.
- Get Buttons Wait waits until the thread from 'Get Buttons Start' is finished (has detected a button press/release) before advancing to the next item in the experiment.
- Send Control sends a control command to the buttonbox, for example 'Calibrate Sound' or 'Detect Sound'.
- Send Trigger sends a trigger to hardware with a parallel port, e.g. an EEG system.
The time of a response is logged as time_response_[item_name].
In dummy mode (an option of the Init item) the plugin runs without a buttonbox: the keyboard is used for button responses, and triggers and commands are not sent. Get Buttons Start then waits for the key press itself, because the keyboard can't be read in the background.
Linux and Windows are supported (possibly also macOS, not tested). The plugin needs OpenSesame 4 (Python 3.10 or later) and the RuSocSci package, which is installed with it:
pip install opensesame-plugin-radboudbox
Buttonboxes
| BITSI 2015 | BITSI 2018 | |
|---|---|---|
| Board | Arduino Duemilanove, FTDI USB (0403:6001) | Teensy 3.6 (USB vendor 16C0) |
| Port on Linux | /dev/ttyUSB*, /dev/serial/by-id/usb-FTDI_* | /dev/ttyACM* |
| Simple mode | hold A+H while connecting | hold A+E while connecting |
| Extended mode | hold B+H while connecting | hold B+E while connecting |
Firmware. The BITSI 2015 runs one of three firmware versions; the ID string it sends when it starts (extended mode) tells which:
| Box | Firmware | ID string (extended mode) |
|---|---|---|
| BITSI 2015 | 2014 | BITSI_extend mode, Ready! |
| BITSI 2015 | 2015-11-18 | BITSI_extend mode, Ready! 2015-11-18 |
| BITSI 2015 | 2018 | BITSI_extend mode, Ready! w:2018 |
| BITSI 2018 | 2018 (Teensy) | BITSI_extend mode, Ready! w:2018 |
The sources of the 2014 and 2018 firmware, for the Duemilanove and the Teensy, are in the Buttonbox downloads of the TSG; the 2018 Duemilanove firmware uses the same pins as the 2014 firmware. The source of the 2015-11-18 firmware is not in these downloads.
Mode. The box stores its mode (simple or extended) itself. Bitsi Extended Mode in the Init item must match it: a box in the other mode sends wrong triggers. Init checks this with the ID string the box sends when it starts, and raises an error when the modes differ. When the ID string doesn't arrive in time, the mode can't be checked; there is a warning in the log.
Port. With port autodetect, Init takes the first buttonbox it finds (an FTDI, Arduino or Teensy USB device). Other USB serial devices, such as the serial port of an audio interface, are skipped. A Device id takes that position in the list of USB serial devices (0 is the device connected last). To choose a port yourself, set Port, e.g. /dev/ttyUSB0 or COM3.
Latency timer. The FTDI chip of the BITSI 2015 sends small amounts of data after its latency timer, 16 ms by default: button presses can then arrive up to 16 ms late. It must be 1 ms, and Init raises an error otherwise. On Windows, set it in the Device Manager (Ports, the COM port, Properties, Port Settings, Advanced, Latency Timer); it can change back, e.g. after a driver update. On Linux it is /sys/bus/usb-serial/devices/ttyUSB0/latency_timer; the chip starts at 16 ms each time it is connected, so set it permanently with a udev rule (Init's error gives the commands). On Linux the latency timer is the only setting: the USB transfer sizes are fixed in the driver, and the timeouts, the COM port number and the FIFO buffers of the BITSI 2018 exist only on Windows.
ModemManager (Linux). The Teensy of the BITSI 2018 says it takes modem commands, so ModemManager opens its port and sends modem commands to the box when it is connected. When ModemManager runs and no udev rule makes it ignore the box (ID_MM_DEVICE_IGNORE), Init writes a warning in the log with a rule that does. The udev rules of PJRC for the Teensy (00-teensy.rules) do the same. The Teensy box has no latency timer.
FIFO buffers (Windows). On Windows, the BITSI 2018 (Teensy) is a USB serial port (driver usbser.sys). Its port must have Use FIFO buffers off and the receive and transmit buffers at Low (1). Set them in the Device Manager (Ports, the COM port, Properties, Port Settings, Advanced): first set Receive Buffer and Transmit Buffer to Low (1), then uncheck Use FIFO buffers; unchecked first, the buffers stay at their values, greyed out. Init reads them from the registry (ForceFifoEnable, RxFIFO and TxFIFO in the port's Device Parameters) and raises an error when one of them is different. A setting that was never changed is not in the registry and counts as its default (FIFO buffers on, Receive Buffer 14, Transmit Buffer 16). Windows keeps the registry keys of boxes that were connected before, and two boxes can have the same COM port name; Init then reads the key of the connected box (by its USB serial number). When the port's registry key can't be found or read, or the connected box can't be told apart, there is a warning in the log. The values are on the experiment as radboudbox_fifo_settings.
COM port number (Windows). The port of the buttonbox (both types) must be COM1 to COM9; Init raises an error for COM10 and higher. Change it in the Device Manager (Ports, the COM port, Properties, Port Settings, Advanced, COM Port Number) to a free number below 10.
Port settings error (Windows). On Windows, Init lists all port settings of the box in one error. BITSI 2015: COM port number (below 10), USB transfer sizes Receive and Transmit (64 bytes), latency timer (1 ms) and minimum read and write timeouts (0 ms). BITSI 2018: COM port number and the FIFO buffers. Each setting is marked correct or incorrect, and the error says where to change them in the Device Manager and what to set. A setting that was never changed is not in the registry and counts as the driver's default (BITSI 2015: transfer sizes 4096 bytes, latency timer 16 ms, timeouts 0). The values are on the experiment as radboudbox_ftdi_settings (BITSI 2015) and radboudbox_fifo_settings (BITSI 2018).
Wrong port settings. Wrong port settings in the Init item chooses what happens when a port setting is wrong: error (the default) stops the experiment with the error above; warning writes the same text as a warning in the log, and the experiment continues. Use warning only for tests, e.g. on a computer where you can't change the settings: radboudbox_port_settings in the log file then says incorrect. The checks don't run in dummy mode.
Log variables. Init sets these variables, so a logger with Log all variables writes them to the log file (NA in dummy mode and for settings the box or the system doesn't have, unknown when they can't be read):
| Variable | Value |
|---|---|
radboudbox_type |
BITSI 2015 or BITSI 2018 (by the USB vendor id) |
radboudbox_port |
e.g. COM3 or /dev/ttyUSB0 |
radboudbox_driver |
e.g. FTSER2K or usbser (Windows), ftdi_sio or cdc_acm (Linux) |
radboudbox_id_string |
the ID string the box sent (mode and firmware) |
radboudbox_port_settings |
correct, incorrect or unknown |
radboudbox_latency_timer |
ms (BITSI 2015) |
radboudbox_receive_bytes, radboudbox_transmit_bytes |
USB transfer sizes (BITSI 2015, Windows) |
radboudbox_min_read_timeout, radboudbox_min_write_timeout |
ms (BITSI 2015, Windows) |
radboudbox_use_fifo_buffers |
on or off (BITSI 2018, Windows) |
radboudbox_receive_buffer, radboudbox_transmit_buffer |
1 (Low) to 14 or 16 (High) (BITSI 2018, Windows) |
radboudbox_modemmanager |
not running, does not use the box or may use the box (BITSI 2018, Linux) |
Triggers. Send Trigger works on all boxes, in both modes. Its pulse mode sets the value, waits for the pulse time and sets 0, so it also works with the 2014 firmware.
Send Control (extended mode only):
| Command | Sends | 2015, fw 2014 | 2015, fw 2015-11-18 | 2015, fw 2018 | 2018 Teensy | Notes |
|---|---|---|---|---|---|---|
| Calibrate Sound / Voice | C S / C V |
yes | not tested | yes | yes | the item waits 1000 ms: be silent |
| Detect Sound / Voice | D S / D V |
yes | not tested | yes | yes | the box sends S / V once; collect it with Wait Buttons or Get Buttons (allowed response S or V) |
| Marker Out | M value |
yes | yes (tested) | yes | yes | the output keeps the value until the next marker |
| Pulse Out | P value |
no | yes (tested) | yes | yes | value for the pulse time, then 0 (default 100 ms) |
| Pulse Time | X ms |
no | yes (tested) | yes | yes | pulse time of Pulse Out, 0-255 ms |
| Analog Out 1 / 2 | Y / Z value |
yes | not tested | yes | yes | 0-255 |
| Tone | T |
yes | not tested | yes | yes | beep of 100 ms |
| Analog In 1-4 | A 1-A 4 |
yes | not tested | yes | yes | the value is logged as analog_in_[item_name] |
| LEDs Off / Input / Output | L X / L I / L O |
Off and Output | Output (tested); Off and Input not tested | yes | no effect | Input: the LEDs show the buttons; Output: the LEDs show the markers |
The 2014 and 2018 columns follow the firmware sources; the 2015-11-18 column is what was tested on a box. Pulse Out and Pulse Time are an error on a box with the 2014 firmware (when its ID string arrived, and it ends with Ready!): that firmware doesn't have them.
License
This plugin is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version (GPL-3.0-or-later).
The full license text is in the file COPYING, and is also available at https://www.gnu.org/licenses/gpl-3.0.html.
Documentation
Installation instructions and documentation on OpenSesame are available on the documentation website:
Metadata
Release files for opensesame-plugin-radboudbox 5.4.3
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | Provenance | Actions |
|---|---|---|---|---|
| opensesame_plugin_radboudbox-5.4.3.tar.gz | 53.6 kB | Without provenance | Details for opensesame_plugin_radboudbox-5.4.3.tar.gz |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Actions Reset |
|---|---|---|---|---|
| opensesame_plugin_radboudbox-5.4.3-py3-none-any.whl | Python 3 | none | any | Details for opensesame_plugin_radboudbox-5.4.3-py3-none-any.whl |
Total release size: 114.8 kB
Release files / opensesame_plugin_radboudbox-5.4.3.tar.gz
| Download URL | opensesame_plugin_radboudbox-5.4.3.tar.gz |
|---|---|
| Size | 53.6 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
d95e6db8982739b07223e4b37b96d743d56e0a8cb5f52395b7d5717ba7f20a60
|
|
BLAKE2b-256 checksum How to use checksums |
be6f48d3701d44d0ca7e8ed183087cff19f41c924281a9310c1a0cfeba73370d
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/6.1.0 CPython/3.13.5
|
Release files / opensesame_plugin_radboudbox-5.4.3-py3-none-any.whl
| Download URL | opensesame_plugin_radboudbox-5.4.3-py3-none-any.whl |
|---|---|
| Size | 61.2 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
975db80727c2b36f3b2f987262593bb5b9bd7a2d79d3c0f39982fa8c61522bcd
|
|
BLAKE2b-256 checksum How to use checksums |
1a434fffb31883259299780298c122789256e7ae90725bf2aebd7ca350bd5550
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/6.1.0 CPython/3.13.5
|
Security for opensesame-plugin-radboudbox 5.4.3
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
No provenance found
None of the files in this release were uploaded with provenance metadata.
A note on package security
PyPI is a repository for distributing packages, not a service for auditing them. While third-party security researchers and our staff do their best to detect and remove malicious packages, PyPI cannot guarantee the quality, security or suitability of any given package.
To learn more about protecting yourself from malicious actors, visit our package security documentation.