NewRow User Manual

For setting up motor-imagery BCI experiments with OpenVibe, a short summary can be found from the OpenVibe tutorial page.

Setting up the game

Following the EEG equipment setup with the OpenVibe acquisition server and the BCI experiment setup through the Designer, the following steps are necessary for communicating with NeuRow:

1. Motor-imagery scenario with VRPN servers

Slide3

Setup the VRPN server settings with the following parameters: Setup the VRPN server settings with the following parameters:

Peripheral name: openvibe-vrpn

 

Slide2

Peripheral name: openvibe-vrpn

Button 1 ON: OVTK_GDF_LEFT
Button 1 OFF: OVTK_GDF_End_Of_Trial
Button 2 ON: OVTK_GDF_RIGHT
Button 2 OFF: OVTK_GDF_End_Of_Trial

 

2. Launch Reh@panel in BCI mode:

Slide5

Right click over the desktop shortcut and add the "bci" parameter in the end of the target address.

 

3. Acquire data from OpenVibe and send to VR:

Slide6 Slide7

Slide8

1. Add the network address and port of the device* running NeuRow.
2. Start VRPN client to receive incoming data from OpenVibe

* Select "Emulate Keys" in case of web-based NeuRow for emulating the Left/Right arrow keys.

 

4. Play with NeuRow

neuro firewall 1

Allow NeuRow to communicate with the network layer in order to receive data from Reh@panel

pc menupc general

Choose if you are performing motor-imagery training or not and game related settings.

pc network

Get IP address and port in order to receive data from Reh@panel

For setting up motor-imagery BCI experiments with OpenVibe, a short summary can be found from the OpenVibe tutorial page.

Following the EEG equipment setup with the OpenVibe acquisition server and the BCI experiment setup through the Designer, the following steps are necessary for communicating with NeuRow:

Vibrotactile Module

 For enhancing the sense of movement in VR, a custom vibrotactile module has been developed with out-of-the-box components including an Arduino board. The vibrotactile module can function as a valuable feedback modality for promoting induced illusions  relying on the sensorimotor contingencies between perception and action, useful in motor-imagery training in BCI.

This module is composed by three main components:

  1. Arduino board
  2. Vibrating motors
  3. Cylindrical tubes

1. Arduino board setup:

For connecting the Arduino board with the motors (see figure 1(a)), the following components are needed:

  • 1N4001 Diode
  • 0.1µF ceramic capacitor
  • 1KΩ Resistor
  • 2N2222 NPN Transistor
  • USB Connector

Vibration motor circuit with arduino 300x164Slide2 300x206

2. Vibrating tubes

– For installing the motors inside the tubes, a 3D printed case has been designed (STL model) in order to accommodate the motor before inserted inside the tube (see figure on the right).

motor case 3d 300x193Slide1 300x111

– Cylindrical tubes act as grasping objects for simulating the rows movement. For our setup, a pair of carton based tubed had been used with 12cm of length, 3cm diameter and 0.5cm of thickness (see figure 3).

tube scema 300x148vibromodule 300x143

 

3. Technical specifications

Vibrating Motor Specs:

coin shaftless vibration motor

  • Dimension: 10mm diameter, 2.7mm thick
  • Voltage: 2V – 5V
  • Current Draw:5V current draw: 100mA
    • 4V current draw: 80mA
    • 3V current draw: 60mA
    • 2V current draw: 40mA
  • 11000 RPM at 5V
  • Weight: 0.9 gram

Arduino Mega 2560

arduino 300x215Microcontroller: ATmega2560
Operating Voltage: 5V
Input Voltage (recommended): 7-12V
Input Voltage (limit): 6-20V
Digital I/O Pins: 54 (of which 15 provide PWM output)
Analog Input Pins: 16
DC Current per I/O Pin: 20 mA
DC Current for 3.3V Pin: 50 mA
Flash Memory: 256 KB of which 8 KB used by bootloader
SRAM: 8 KB
EEPROM: 4 KB
Clock Speed: 16 MHz
Length: 101.52 mm
Width: 53.3 mm
Weight: 37 g



Finally, upload the following code to the Arduino board for controlling the motors through NeuRow:

 

String str;
int values[2][6];
int power = 0;
int hand = 0;
int finger = 0;
void setup()
{ 
 Serial.begin(9600);
 Serial.flush(); //clears any possible left over information
}
void loop() { if(Serial.available() > 0) { str = Serial.readStringUntil(';'); power = str.toInt(); str = Serial.readStringUntil(';'); hand = str.toInt(); str = Serial.readStringUntil(';'); finger = str.toInt(); values[hand][finger] = power; } for(int i = 0; i <2; i++) { for(int j = 0; j < 6; j++) { analogWrite(i*6+j+2, values[i][j]); } } }