BpodAnalogIn()

Description

The BpodAnalogIn class provides an object representing Bpod's Analog Input Module (a general purpose voltage ADC with a dedicated microcontroller).

The Analog Input Module has 8 input channels with 12 bits of resolution and configurable ranges up to +/-10V.

The object has functions to:

    • Acquire data to a microSD card, on trigger from the Bpod state machine

    • Return acquired data to MATLAB via USB

    • Stream live analog input data to USB for online viewing and data capture

    • Stream live data to a Bpod output module (DDS or Analog Output).

    • Set voltage thresholds to generate discrete behavior events, which can be handled by the state machine

After running Bpod, an BpodAnalogIn object is initialized with the following syntax:

A = BpodAnalogIn('COM3');

Where COM3 is the analog input module's serial port.

The Analog Input device is controlled in 2 ways:

  • Setting the BpodWavePlayer object's fields

  • Calling the BpodWavePlayer object's functions

Object Fields

  • Port

  • SamplingRate (Hz)

    • 1Hz-20kHz, affects all channels.

    • Other functions (streaming to USB, streaming to external module, running threshold logic) can be used in combination, but will reduce the maximum sampling rate.

  • InputRange (String)

    • A cell array of strings specifying voltage input range for EACH channel:

      • '-10V:10V'

      • '-5V:5V'

      • '-2.5V:2.5V'

      • '0V:10V'

    • For best signal quality, use the smallest voltage range necessary for your application.

    • Signals that exceed the maximum or minimum will be constrained to the range boundary

  • nActiveChannels (positive integer)

    • Number of channels actively sampled (consecutive, beginning with Ch1).

      • Fewer channels = faster sampling possible. Read the fewest channels necessary for your application.

  • Thresholds (V)

    • A simple voltage threshold and reset scheme is supported by the standard firmware, to generate discrete events

    • Thresholds is a 1 x nChannels vector of voltages.

    • If events are enabled (see startReportingEvents() below), on voltage threshold crossing, the channel# is sent to the state machine.

    • A low->high crossing will trigger the event, if ResetVoltage (below) is less than threshold.

    • A high->low crossing will trigger the event, if ResetVoltage is greater than threshold.

    • After a channel's voltage crosses threshold, event generation is disabled until the channel voltage crosses ResetVoltage (below)

  • ResetVoltages (V)

    • A 1 x nChannels vector of voltages

    • Event generation is re-enabled after the voltage crosses ResetVoltages(chan).

    • If a channel's ResetVoltage is below Threshold, events are triggered on low -> high threshold crossing.

    • If a channel's ResetVoltage is above Threshold, events are triggered on high -> low threshold crossing.

  • SMeventsEnabled (logical vector of length nChannels)

    • Indicates whether each channel's threshold crossing events are sent to the state machine

    • To enable or disable event transmission for the channels selected in SMeventsEnabled:

      • Call startEventReporting() to enable events (below)

      • Call stopEventReporting() to disable events (below)

    • Channels greater than nActiveChannels (above) are ignored.

  • Stream2Module (logical vector of length nChannels)

    • Indicates whether each channel's measurements are sent to a connected output module

    • Channels greater than nActiveChannels (above) are ignored.

  • nSamplesToLog (positive integer)

    • Determines the maximum number of samples to log to the microSD card after logging is started with startLogging()

    • Fewer samples can be acquired, if a stop command arrives while logging.

    • Set nSamplesToLog to 'Inf' to log until a stop command arrives

Object Functions

  • startLogging()

    • Starts logging all samples acquired to the microSD card, overwriting any previously stored data

    • Channels between 1 and nActiveChannels (above) are logged.

    • After logging, acquired data is retrieved with getData() below.

  • stopLogging()

    • Stops logging samples to the microSD card.

  • Data = getData()

    • Returns a struct containing data logged to the microSD card since the last call to startLogging()

    • Stops logging, if logging was enabled

    • Fields of the data struct are:

      • X: 1 x nSamples vector containing time of each sample from logging start (in seconds)

      • Y: nActiveChannels x nSamples matrix, containing voltages measured at each time in X

  • startModuleStream()

    • Starts streaming data to the "output stream" module connector

    • For each sample, the data stream output is:

      • Character 'R' (byte 82)

      • one 2-byte sample for each channel up to nActiveChannels

    • Example firmware for the analog output module expects data in this format, and converts it into a voltage signal output.

  • stopModuleStream()

    • Stops streaming data to the "output stream" module connector

  • startUSBStream()

    • Starts streaming data to the USB serial object (obj.Port).

    • Data is in the same format used for streaming to modules (see startModuleStream() above)

    • Following startUSBStream, a sample can be read from the port with:

      • obj.Port.read(1, 'uint8') % This will return 'R'

      • obj.Port.read(nActiveChannels, 'uint16') % This will return 1 sample (in bits) for each active channel

    • Other commands to the module will FAIL while USB streaming. Stop the stream with stopUSBStream().

  • stopUSBStream()

    • Stops streaming data to the USB port

  • startReportingEvents()

    • Starts sending bytes to the state machine to report threshold crossing events.

    • Bytes sent indicate the channel of the threshold crossing event (i.e. byte 7 = a threshold crossing on Channel 7)

    • Only channels chosen in SMeventsEnabled (above) send events.

    • The conditions for triggering events are controlled by 2 fields: Thresholds and ResetVoltages (above).

  • stopReportingEvents()

    • Stops sending threshold crossing events to the state machine.

  • setZero()

    • This function is used to compensate for the ADC's zero-code offset, by shifting the ranges so that the ground potential reads as 0V.

    • IMPORTANT: Connect a wire between channel 1's + and - terminals before running setZero.

    • The offset will be saved to the microSD card and loaded automatically on boot.

  • scope()

    • Launches an oscilloscope-style GUI for troubleshooting, threshold configuration and online monitoring.

      • By entering a filename in the 'File' field (including the full path) The scope() GUI can continuously capture streaming data to a file during a behavior session, as an alternative to microSD acquisition. See example protocol here.

Cleanup

  • Clear the BpodAnalogIn object with clear:

A = BpodAnalogIn('COM3');

... % Use the analog input module

clear A

  • Clearing the object releases the serial port, so other applications can access it.

  • If a BpodAnalogIn object is created inside a MATLAB function, the object is cleared automatically when the function returns.