Coder Social home page Coder Social logo

openbci_cyton_library's Introduction

WELCOME!

Welcome to OpenBCI's Github. This is the place where we will keep the software that we want to share with the community and where we will keep the software that the community shares with us.

Contents

  • Arduino: Here are the Arduino libraries and sketches to help you run OpenBCI with an Arduino. Currently, all development has been with the Arduino UNO. We will expand to other Arduino platforms in the future.

  • Processing GUI: Here are some Processing libraries and sketches to help you receive data from the Arduino/OpenBCI. You can use these sketches to watch the data in real time. Some of the sketches also log the data to disk so that you can analyze it after the test.

openbci_cyton_library's People

Contributors

biomurph avatar gerrievanzyl avatar irenevigueguix avatar per1234 avatar waffle-iron avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

openbci_cyton_library's Issues

Bug: Intermittent Channels go to ground

  • Intermittent problem
  • NOT reproducible as of writing this
  • OpenBCI board will have all channels go to ground.
  • This bug was thought to be solved with V2 but does not appear to be fixed.

It is as if a 0 was sent to the board and a d has to be sent to reset back. Might be something in initialization?

Test all the example .ino files

All the examples need to be tested

  • BasicBoard.ino
  • DefaultBoard.ino
  • BoardWithAccel.ino
  • BoardWithSD.ino
  • BoardWithAnalogSensor.ino

compile fails - Arduino can't find <OpenBCI system library>

MacOS 10.11.6, Arduino 1.6.5

Following along with the README, I install all the prerequisites and then open one of the OpenBCI examples. Compilation fails with this mesage:

Arduino: 1.6.5 (Mac OS X), Board: "OpenBCI 32"

Using library OBCI32_SD in folder: /Users/ashroyer/Documents/Arduino/libraries/OBCI32_SD (legacy)

/Users/ashroyer/Library/Arduino15/packages/chipKIT/tools/pic32-tools/1.42-pic32gcc/bin/pic32-g++ -c -g -O2 -Wall -DARDUINO_ARCH_PIC32 -mno-smart-io -ffunction-sections -fdata-sections -mdebugger -Wcast-align -fno-short-double -ftoplevel-reorder -MMD -fno-exceptions -mprocessor=32MX250F128B -DF_CPU=40000000L -DARDUINO=10605 -D_BOARD_DP32_ -DMPIDEVER=16777998 -DMPIDE=150 -DIDE=Arduino -G1024 -D_USE_USB_FOR_SERIAL_ -I/var/folders/27/w1myz2vn78gflt11gb_hydfr0000gp/T/build8231903212779785058.tmp/sketch -I/Users/ashroyer/Library/Arduino15/packages/chipKIT/hardware/pic32/1.3.1/cores/pic32 -I/Users/ashroyer/Library/Arduino15/packages/chipKIT/hardware/pic32/1.3.1/variants/OpenBCI -I/Users/ashroyer/Documents/Arduino/libraries/OBCI32_SD /var/folders/27/w1myz2vn78gflt11gb_hydfr0000gp/T/build8231903212779785058.tmp/ReadWrite.cpp -o /var/folders/27/w1myz2vn78gflt11gb_hydfr0000gp/T/build8231903212779785058.tmp/ReadWrite.cpp.o 
ReadWrite.pde:24:23: fatal error: OBCI32_SD.h: No such file or directory
compilation terminated.
/Users/ashroyer/Library/Arduino15/packages/chipKIT/tools/pic32-tools/1.42-pic32gcc/bin/pic32-g++ returned 255
Error compiling.

I thought it was kind of odd that the SD library is contained in an otherwise empty OpenBCI_32bit_SD folder, so I copied OBCI32_SD into ~/Documents/Arduino/libraries

Now I get this error:

Arduino: 1.6.5 (Mac OS X), Board: "OpenBCI 32"

Using library OBCI32_SD in folder: /Users/ashroyer/Documents/Arduino/libraries/OBCI32_SD (legacy)

/Users/ashroyer/Library/Arduino15/packages/chipKIT/tools/pic32-tools/1.42-pic32gcc/bin/pic32-g++ -c -g -O2 -Wall -DARDUINO_ARCH_PIC32 -mno-smart-io -ffunction-sections -fdata-sections -mdebugger -Wcast-align -fno-short-double -ftoplevel-reorder -MMD -fno-exceptions -mprocessor=32MX250F128B -DF_CPU=40000000L -DARDUINO=10605 -D_BOARD_DP32_ -DMPIDEVER=16777998 -DMPIDE=150 -DIDE=Arduino -G1024 -D_USE_USB_FOR_SERIAL_ -I/var/folders/27/w1myz2vn78gflt11gb_hydfr0000gp/T/build8231903212779785058.tmp/sketch -I/Users/ashroyer/Library/Arduino15/packages/chipKIT/hardware/pic32/1.3.1/cores/pic32 -I/Users/ashroyer/Library/Arduino15/packages/chipKIT/hardware/pic32/1.3.1/variants/OpenBCI -I/Users/ashroyer/Documents/Arduino/libraries/OBCI32_SD /var/folders/27/w1myz2vn78gflt11gb_hydfr0000gp/T/build8231903212779785058.tmp/ReadWrite.cpp -o /var/folders/27/w1myz2vn78gflt11gb_hydfr0000gp/T/build8231903212779785058.tmp/ReadWrite.cpp.o 
In file included from ReadWrite.pde:24:0:
/Users/ashroyer/Documents/Arduino/libraries/OBCI32_SD/OBCI32_SD.h:19:18: fatal error: DSPI.h: No such file or directory
 #include <DSPI.h>
                  ^
compilation terminated.
/Users/ashroyer/Library/Arduino15/packages/chipKIT/tools/pic32-tools/1.42-pic32gcc/bin/pic32-g++ returned 255
Error compiling.

For completeness, after trying this I also tried installing the chipkit hardware libraries via the "automatic" route, but this did not change anything for me.

Any ideas?

ADD: Variable Sample_Rate

  • Set the sample rate to 250, 500, 1000, 2000Hz.
    To do this, send an '.' followed by a char in '1' to '4' corresponding to 250..2000.
    ex : '.2' sets to 500Hz

Full code from : https://github.com/yj-xxxiii/OpenBCI_2kHz

case waiting_freq_value : if('1' <= testChar && testChar <='4') { Sample_Rate_SD_Only = 0b110-(testChar-'1'); if(EEPROM.read(2)!=Sample_Rate_SD_Only) EEPROM.write(2 , (uint8_t)Sample_Rate_SD_Only); Serial0.println(250<<(0b110-Sample_Rate_SD_Only)); } command_state = waiting_command_beginning ; break ; ... ... case 'N': writeToSDonly = true; OBCI.Sample_Rate = Sample_Rate_SD_Only ; ...
In OpenBCI_32_Daisy.cpp
WREG(CONFIG1,0xB0+Sample_Rate,BOARD_ADS); // tell on-board ADS to output its clk, set the data rate to Sample_Rate WREG(CONFIG1,0x90+Sample_Rate,BOARD_ADS); // turn off clk output if no daisy present
I am still unable to paste the code properly formatted...
y.j.

SD Card Start/Stop Stamps Broken

With git HEAD, v2.0.1, the 'START AT' and 'STOP AT' stamps don't seem to be written correctly to the SD file.

Sometimes BOTH are written immediately following each other, to the start of the file:

%START AT
0019B699
%STOP AT
0019C691
... data

Sometimes ONLY 'STOP AT' is written, but it is written at the start:

%STOP AT
000745EE
... data

The documentation states that the data should be between these stamps, not following them.

EEG hiccups when '`' is sent via serial

I have tried the following on 2.0.1 and 3.0.0 dev firmware.

In my attempts to insert markers into the stream I have used the functionality in 2.0.1 to send the '`' character. When I type this on the keyboard it creates a "hiccup" on the EEG data stream in the GUI plots. See the attached screenshot around t=-4s. I have not checked whether these artifacts are present in the SD files. This instability would certainly limit the ability gather data where stimulations are handled by the Cyton board.

I tried this on a modified 3.0.0 dev firmware (modified to expect `n and insert a marker with value n into auxData[0] ) and it creates the same artifact.

What I did notice was that whenever I sent serial commands to the board, it did miss at least one packet. Is this just a problem with the GUI filters?

It is not clear to me why sending 2 chars to the board (with trivial processing on the board side) would mess up timing enough to miss one packet. Is this this possibly a bug?

untitled

Wifi breaks pin accessability

3.0.0 commandeers pins for wifi reset, ss, etc. This makes these pins unaccessible for, for example, analog read.

Migrate SD_Card_Stuff.ino into library

There are several functions in here that should be moved into the library. This is because with the example files, we have to copy and past the same files. No good.

Board does not send data when sampling higher rates v3.0.0

The new wifi supporting code does not send any data over the air when the sample rate is changed from 250 to any of the higher rates. Would it be nice if it would send at 250 even if it's sampling at higher rates? for example, if someone wants to write the higher rate to an SD card, they can still monitor the signal with the GUI or whatever...

Cyton writing bad files to sd card

I have a Cyton which I've been using for several months, saving data to the sd card. At first, the files were formatted just as the documentation shows they should be. But last week I opened one of the recent files, and found they had switched at some point to containing binary data that makes no sense to me. As an example, a recent file starts with these hex values:

41 10 01 A0 B0 00 01....

The change happened at a definite point in time, and all files since then have been more or less like this. It happens with both Linux and Windows hosts, and both with my own software (which uses OpenBCI_NodeJS to talk to the Cyton) and with the OPENBCI_GUI app. I'm using a Transcend 8GB class 10 card, which I've formatted several times using the SDFormatter app. The files are written to the SD card with the expected names and sizes, they just contain what looks like binary garbage.

Cyton firmware 2.0.0.

wjcroft suggested firmware might be corrupted. Will try reflashing.

Make communication protocol machine readable instead of human readable

Right now communication protocol sends (or may not send) replies in plain text, with information being (or not being) present depending on the current status of the board. It would be much easier for client code to be able to parse machine-ready replies formatted in JSON, XML or at least following a machine parseable format, especially including delimiters for begin and end of a reply. The content of the reply should be consistent across different device configuration, e.g. :

{
    "version" : 3,
    "max-channels" : 16,
    "on-board-ads1299" : "0x3E",
    "on-daisy-ads1299" : "0x3E",
    "has-daisy" : true,
}

(note the 'has-daisy' which would show-up even though daisy is not attached)

Feature request: User callback function in the DefaultBoard.ino

This suggestion may make the firmware more hackable by users with limited experience.

To make small changes how/what data is logged, would it be possible to create user function in DefaultBoard.ino that is called just before data is written to serial, wifi and SD card (something like void userDataProcessing() ). This would be setup as a simple call back that is run just before the EEG and accel/aux data is written out.

The purpose of this callback would be to give users one simple place to make any modifications to the data before it is written out. This would eliminate the need for users to mess with any of the Library code.

For example: to insert "markers" into the data streams the callback function would allow someone the ability to change the auxData[] values just before they are written out.

Make sense?

Remove delays in firmware

The communication protocol on the firmware side implements many (hardcoded) delays. These delays aren't documented and it is difficult to make timings optimal on the client side without falling in cases where the delays would not be sufficient as compared to firmware expectations

Rename This Library

Should be called OpenBCI_Cyton_Library
Examples should also specify Cyton in their names

Rename library

Current library name is OpenBCI_32Bit and this needs to be changed to OpenBCI_32bit_Library

Potential differences in data between stock OpenBCI firmware and Pushtheworld code

I'm running Radio with https://github.com/pushtheworldllc/OpenBCI_Radios/releases/tag/v2.0.0-rc.2 and Firmware at https://github.com/pushtheworldllc/OpenBCI_32bit_Library/releases/tag/v2.0.0-rc.3 . But see that there is a difference in the noise floor and a particular ~31hz noise. The screenshot of the GUI in two different firmwares attached. I'm not sure if this is an issue. But would like to be tracked.
Not that all the leads were floating and not connected to anything in both the cases.
The OpenBCI firmware
stock_openbci firmware
The pushtheworld firmware
pushtheworld firmware

Logic error on first sample with daisy

I do not have a daisy board to test anything, but I noticed this reading the code:

firstDataPacket, initialized to true, is cleared to false at the end of updateBoardData(). It is then checked if false which it always will be because it was just set, data that hasn't been read yet is backed up, and the flag is re-cleared to false if true which will never happen because it has just been set to false, in updateDaisyData(). It looks like this would result in the first sample being corrupt.

It looks like the clearing of firstDataPacket should be moved out of the individual channel update functions here and here and into the end of updateChannelData which calls them both, right here.

After this change, though, it still looks like the first sample sent would still be corrupt, because meanDaisyChannelDataRaw is not specified in the first sample. One solution would be to add an else { } block here containing code that would fill meanDaisyChannelDataRaw with the contents of daisyChannelDataRaw without any averaging.

If one were to address this area of code more thoroughly, there is an additional possible 'issue' which is that the daisy and board running averages are sampled when output, alternatingly, so there is no way to reconstruct from the output a complete 'snapshot' at any point of time -- the daisy information represents time = (x+1/2), and the board information represents time = (x-1/2). A different approach would be to change the logical flow to output briefly buffered averages from the past that are both taken from the same points in time.

Tracking: Over The Air Programming Failures

This issue shall be used to report over the air programming failures. Please adhere to the following format for you bug report.

## Error

## Steps to reproduce error
1. 

## Computer System Details
Laptop: 
OS Version: 
Processor: 
Memory (RAM): 
Poll Time (ms):

Add: Impedance testing on board

Be able to compute impedance on the board and just send the values to the computer to drastically reduce the time it takes to measure impedances.

Private communication between Pic and Device RFDuino

The PIC and the Device Radio could communicate.

Such as:

  • The Device Radio could be able to ask the PIC what state it is in if it hasn't heard from it in say 100ms. This could directly lead to the Device being able to issue a reset command.

Issue recording at 2kHz on SD card (Cyton v3.0.0, Python)

Hello,
I am trying ask via python to record on sd card at 1kHz, using v3.0.0
I looked around and tried quite a bit but cant get it to work.
My code looks like below, does anyone knows what i'm doing wrong by chance?
i get createfdContiguous fail without softreset, and if i do a soft reset i get back to 250Hz,
Thanks

board.ser.write(b'~6');sleep(1);read() # ask 250Hz
board.ser.write(b'v');sleep(1);read() # soft reset
board.getSampleRate() # check 250.0
board.ser_write(b'a');sleep(1);read() # record ~14sec
sleep(20)
board.ser.write(b'~4');sleep(1);read() # ask 1kHz
board.ser.write(b'v');sleep(1);read() # soft reset
board.getSampleRate() # check 1kHz
board.ser_write(b'a');sleep(1);read() # record ~14sec
sleep(20)

Handshake at connection

At connection time, it would be great to have a handshake to declare the device to client code. This allows to easily scan available ports and figure out which port have an OpenBCI plugged in and have basic information about the capabilities of the device. This handshake may also include a protocol version !

Multibyte timeout protection

Is there a way to protect against lockout if too few characters are received on channel/impedance settings?

Could do something like if you get a X or Z you could check to see if you got all the bytes and THEN send the command to the board?

Timer on multichar messages

@aj-ptw ,

As I was messing about with the 3.0.0 firmware, I noticed that there is no timeout for multi-char messages from the GUI to the board. At least this is the way it looks to me.

Without a timeout we run the risk of getting out-of-state between the GUI and the board in the event that a character is missed (or a message incorrectly sent). For example, the board expects 'n' and receives the '' but does not receive the 'n'. The way I read the code it will be "stuck" waiting for the 'n'. If you send the next command, it will believe it is the 'n' and then process the second char for that command as a new command. (Making any sense?)

Should we not enforce a 5ms timeout (or some other value) for multi-char messages? If the timeout is reached the serial is reset to expect a command.

This seems easy to do, if you agree I can give a shot at implementing something simple and sending a pull request.

ADD type for analog sensors

There is sometimes a need to convert aux bytes into numbers, should there be a stream packet type for this?

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    ๐Ÿ–– Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. ๐Ÿ“Š๐Ÿ“ˆ๐ŸŽ‰

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google โค๏ธ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.