micooke / arduino-nRF5-smartwatches

Smartwatch variants for sandeepmistry's Nordic Semiconductor nRF5 core
MIT License
62 stars 13 forks source link

putc error #5

Closed scientistnobee closed 4 years ago

scientistnobee commented 6 years ago

Dear Micooke,

When I used your OLED smarty example, I am getting the following error. Could you please let me know, how to troubleshoot it.

C:\Users\nobee\Documents\Arduino\libraries\SFE_MicroOLED/SFE_MicroOLED.h:118:18: error: macro "putc" requires 2 arguments, but only 1 given

micooke commented 6 years ago

Heya, can you please provide me with more info so that i can replicate it :

  1. Arduino version?
  2. Have you installed sandeeps repo?
  3. What example are you trying?
scientistnobee commented 6 years ago

Dear Micooke,

My Arduino version is 1.6.9. Yes, I installed Sandeep's repo. I am able to upload a simple blick sketch without a problem. However, for this to happen, I need to choose "none" option for softdevice. If not Arduino is hanging saying "Uploading", but never going to say "uploaded". If I choose softdevice "none", I am able to upload the sketch. If I am trying to upload any of your examples, they are not getting compiled, even though I have the correct libraries installed. For example, when I tried to compile the following example from your files https://github.com/micooke/Kx022-1020/blob/1083297cac12a4750ab15018c95c06e5300b62f9/examples/KX022_getAcc/KX022_getAcc.ino

the error was about SSD1306Spi.h. If I install that library it is saying some other file is missing. It's kind of loop. These files are compiling without a problem if I use rogerclark's repo. But I couldn't upload them as my Arduino/BMP is hanging at the uploading process. In the following, I am posting the output from Arduino's output for a successful flash (simple blink) using Sandeep's repo.

c:/users/nobee/appdata/local/arduino15/packages/sandeepmistry/tools/gcc-arm-none-eabi/5_2-2015q4/bin/../lib/gcc/arm-none-eabi/5.2.1/../../../../arm-none-eabi/bin/ld.exe: warning: changing start of section .heap by 4 bytes

c:/users/nobee/appdata/local/arduino15/packages/sandeepmistry/tools/gcc-arm-none-eabi/5_2-2015q4/bin/../lib/gcc/arm-none-eabi/5.2.1/../../../../arm-none-eabi/bin/ld.exe: warning: changing start of section .stack_dummy by 4 bytes

c:/users/nobee/appdata/local/arduino15/packages/sandeepmistry/tools/gcc-arm-none-eabi/5_2-2015q4/bin/../lib/gcc/arm-none-eabi/5.2.1/../../../../arm-none-eabi/bin/ld.exe: warning: changing start of section .heap by 4 bytes

c:/users/nobee/appdata/local/arduino15/packages/sandeepmistry/tools/gcc-arm-none-eabi/5_2-2015q4/bin/../lib/gcc/arm-none-eabi/5.2.1/../../../../arm-none-eabi/bin/ld.exe: warning: changing start of section .stack_dummy by 4 bytes

c:/users/nobee/appdata/local/arduino15/packages/sandeepmistry/tools/gcc-arm-none-eabi/5_2-2015q4/bin/../lib/gcc/arm-none-eabi/5.2.1/../../../../arm-none-eabi/bin/ld.exe: warning: changing start of section .heap by 4 bytes

c:/users/nobee/appdata/local/arduino15/packages/sandeepmistry/tools/gcc-arm-none-eabi/5_2-2015q4/bin/../lib/gcc/arm-none-eabi/5.2.1/../../../../arm-none-eabi/bin/ld.exe: warning: changing start of section .stack_dummy by 4 bytes

Sketch uses 1,580 bytes (0%) of program storage space. Maximum is 262,144 bytes. C:\Users\nobee\AppData\Local\Arduino15\packages\sandeepmistry\tools\gcc-arm-none-eabi\5_2-2015q4/bin/arm-none-eabi-gdb -quiet -cd C:\Users\nobee\AppData\Local\Temp\buildd0753066408258c07747789135b326db.tmp -b 230400 -l 10 -ex set debug remote 0 -ex set target-async off -ex set remotetimeout 10 -ex set mem inaccessible-by-default off -ex set confirm off -ex set height 0 -ex target extended-remote .\COM15 -ex monitor swdp_scan -ex attach 1 -ex file Blink2.ino.elf -ex load -ex tbreak main -ex run -ex echo \nProgram complete!\n -ex quit Remote debugging using .\COM15 Target voltage: 3.3V Available Targets: No. Att Driver 1 Nordic nRF51 Attaching to Remote target 0x000004c2 in ?? () Reading symbols from Blink2.ino.elf...done. Loading section .text, size 0x62c lma 0x0 Loading section .ARM.exidx, size 0x8 lma 0x62c Loading section .data, size 0x6c lma 0x634 Start address 0x210, load size 1696 Transfer rate: 12 KB/sec, 424 bytes/write. Temporary breakpoint 1 at 0x416: file C:\Users\nobee\AppData\Local\Arduino15\packages\sandeepmistry\hardware\nRF5\0.5.1\cores\nRF5\main.cpp, line 29. Starting program: C:\Users\nobee\AppData\Local\Temp\buildd0753066408258c07747789135b326db.tmp\Blink2.ino.elf Note: automatically using hardware breakpoints for read-only addresses.

Temporary breakpoint 1, main () at C:\Users\nobee\AppData\Local\Arduino15\packages\sandeepmistry\hardware\nRF5\0.5.1\cores\nRF5\main.cpp:29 29 init();

Program complete!

micooke commented 6 years ago

Ah, theres a few issues here. Have you uploaded the softdevice to your hardware? This needs to be done using a board from sandeeps repo at the moment (any board with the right chipset). The accelerometer example uses my squix78_OLED repo - which is currently broken. Ill redo the example to use u8g2 or my sparkfun_OLED. Ill also create a travis CI build file for this so i can very every push works. Long story short, ill look in to it and get back to you.

scientistnobee commented 6 years ago

Thank you very much micooke. Yes, I have flashed the softdevice. I was so desperately trying to reach anyone who can help me with this. Hope I can work with this fitness tracker. So far it was difficult.

micooke commented 6 years ago

One thing i noted - sandeep's repo lists that Arduino 1.6.12 is the minimum that is supported (I use 1.8.4 - no issues). Ill look in to it a bit more, but the putc error sounds like it cant find the arm headers which are installed by using the board manager with sandeeps repo.

scientistnobee commented 6 years ago

Yes, in fact I am also using 1.8.5 version. May be a stupid question, but I think I misunderstood your instructions from your github:

4.3 Install arduino-nRF5-smartwatches : Do you mean that I need to keep this folder inside the hardware folder in Documents/Arduino/hardware/arduino-nRF5-smartwatches or do I need to keep it in Documents/Arduino/hardware/arduino-nRF5, which is sandeep's repo.

I am asking this because I am getting the following error:

No valid hardware definitions found in folder arduino-nRF5-smartwatches.

Could not find boards.txt in C:\Users\nobee\Documents\Arduino\hardware\arduino-nRF5-smartwatches\variants. Is it pre-1.5?

micooke commented 6 years ago

The folder structure for hardware has changed, so the easiest way is to install it through the board manager then copy over the latest version from github into its installed directory. Otherwise from memory the folder in documents/hardware needs another layer to say what architecture it is. I.e. Boards.txt would be located in Hardware/arduino-nRF5-smartwatches/nRF5/boards.txt instead of Hardware/arduino-nRF5-smartwatches/boards.txt

Im sorry, i dont have a pc with me to check. If that doesn't work then the easiest way is to install the old release then copy over the libraries you want to the libraries folder until i create a nee release.

scientistnobee commented 6 years ago

Success. Thanks for the tip. I uninstalled Arduino and installed everything again in order as you explained above. Now the MicroOLED_64X32 is compiled. Although, I don't see anything on the screen yet, but compiling the code itself seems a big success for the time being. I think, my definition of pins might be wrong. Could you please if the below definitions are correct for ID107HR:

define PIN_RESET 30 // Connect RST to pin 30 (SPI & I2C)

define PIN_DC 0 // Connect DC to pin 0 (SPI only)

define PIN_CS 29 // Connect CS to pin 29 (SPI only)

define DC_JUMPER 0 // DC jumper setting(I2C only)

MicroOLED oled(7,8);

Do I need to change anything?

Thank you so much for your help so far.

micooke commented 6 years ago

Its an SPI oled, so you need to use the spi initialisation and comment out/delete the i2c stuff. I.e.

MicroOLED oled(PIN_RESET, PIN_DC, PIN_CS);  // SPI Example
//MicroOLED oled(PIN_RESET, DC_JUMPER);  // I2C Example
//#ifdef SFE_MicroOLED_SoftwareI2C
//MicroOLED oled(7,8); // SoftwareI2C Example - sda,scl = 7,8
//#else
//MicroOLED oled; // I2C Example (No RST pin, i2c address  = 0x3C)
//#endif

Note that for the smartwatch variants ive also added #defines for a lot/all of the pin mapping (look at the relevant variant.h file). So for example you could instead ignore the PIN_* defines and use MicroOLED oled(OLED_RST, OLED_DC, OLED_CS); to instantiate the screen.

micooke commented 6 years ago

Ive tested my libraries against i2c, SoftwareI2C and SPI for the 64x32 and 64x128 oled screens. Hence my examples are in a bit of flux. When i get time ill tidy them up so that it instantiates using the correct pin mapping and peripheral type, based off whether e.g. _VARIANT_ID107HR_ is defined

scientistnobee commented 6 years ago

Thanks for the help. I got the screen working now. I am able to display the acceleratorometer data on screen. I didn't use: MicroOLED oled(OLED_RST, OLED_DC, OLED_CS) as it was giving me an error. My code is as following:

#include <Wire.h>
#include <SPI.h>
#include <KX022.h>
#include <SFE_MicroOLED.h>  // Include the SFE_MicroOLED library

#define PIN_RESET 30 // Connect RST to pin 30 (SPI & I2C)
#define PIN_DC     0 // Connect DC to pin 0 (SPI only)
#define PIN_CS    29 // Connect CS to pin 29 (SPI only)
#define DC_JUMPER 0  // DC jumper setting(I2C only)

//#define USE_SOFTWAREI2C
#ifdef USE_SOFTWAREI2C 
#include <SoftwareI2C.h>
SoftwareI2C sWire(14, 16);
KX022<SoftwareI2C> acc(sWire);
#else
KX022<> acc(Wire);
//KX022<TwoWire> acc(Wire); // TwoWire is the default class, so this is the same as above
#endif

#define OLED_WIDTH 64
#define OLED_HEIGHT 32
MicroOLED oled(OLED_RST, OLED_DC, OLED_CS); // (pin_rst, pin_dc, pin_cs)

float xyz[3];
uint32_t tPage;
bool B1_isPressed = false;
uint8_t page_num = 0;
const uint8_t page_count = 2;

void draw_page(uint8_t idx = 0);

void setup()
{
  Wire.begin();

  Serial.begin(9600);
  Serial.println(__FILE__);

  pinMode(PIN_BUTTON1, INPUT_PULLUP);

  acc.init();

  oled.setScreenSize(OLED_WIDTH, OLED_HEIGHT);
  oled.begin();
  //oled.flipScreenVertically();
//  oled.setTextAlignment(TEXT_ALIGN_LEFT);
//  oled.setFont(ArialMT_Plain_10);
  draw_page(page_num++);
  delay(3000); // show splash for 3s
  tPage = millis();
}

void loop()
{
  if (!B1_isPressed & !digitalRead(PIN_BUTTON1)) // timer used for button debounce
  {
    page_num = (page_num + 1 < page_count)?page_num+1:0;
  }
  B1_isPressed = !digitalRead(PIN_BUTTON1);

  if (millis() - tPage > 20) // 20ms = 50Hz
  {
    tPage = millis();
    draw_page(page_num);
  }
  yield();
  delay(500);
  oled.clear(PAGE); // Clear the display's internal memory
  oled.clear(ALL);  // Clear the library's display buffer

}

void float2chars(float &in, char (&out)[5])
{
  bool sign_bit = (in < 0);
  uint16_t tmp = sign_bit?(-in * 10):(in * 10);
  out[0] = (sign_bit)?'-':' ';
  out[1] = char('0' + (tmp / 10));
  out[2] = '.';
  out[3] = char('0' + (tmp % 10));
  out[4] = '\0';
}

void draw_page(uint8_t idx)
{
  switch(idx)
  {
    case 1:
      page_accelerometer(); break;
    default:
      page_startup();
    break;
  }
}

void page_startup()
{
  oled.clear();
  //oled.drawString(0,0,"github.com/");
  //oled.drawString(0,10,"micooke");
//  oled.drawString(0,20,__TIME__);
  oled.display();
}

void page_accelerometer()
{
    char fltBuf[5];

    acc.getAccelXYZ(xyz);

    oled.clear();
    oled.setCursor(5, 4); // points cursor to x=27 y=0
    oled.print("X");
    oled.setCursor(25, 4); // points cursor to x=27 y=0
    float2chars(xyz[0],fltBuf);
    oled.print(fltBuf);

    oled.setCursor(5, 14); // points cursor to x=27 y=0
    oled.print("Y");
    oled.setCursor(25, 14); // points cursor to x=27 y=0
    float2chars(xyz[1],fltBuf);
    oled.print(fltBuf);

    oled.setCursor(5, 24); // points cursor to x=27 y=0
    oled.print("Z");
    oled.setCursor(25, 24); // points cursor to x=27 y=0
    float2chars(xyz[2],fltBuf);
    oled.print(fltBuf);

    oled.display();  
}
scientistnobee commented 6 years ago

Now, I would like to work with the HR sensor. If you don't mind could you please point me towards a right direction. Thanks a lot for your help so far.

micooke commented 6 years ago

I haven't got that working properly. I need to upload my update, but not getting any usefull data from the sensor. It is a Si1143, ive pulled another repo into mine but haven't done anything with it. It didn't work for me in its default state. Pinout is in readme.md

scientistnobee commented 6 years ago

Okay, Thanks for letting me know. I am looking at the following libraries:

https://github.com/Cornell-Engineering-World-Health/Si1143-Pulse-Oximetry/blob/master/IRE.ino https://github.com/openenergymonitor/RFu_jeelib/blob/master/examples/Ports/lux_demo/lux_demo.ino

micooke commented 6 years ago

Let me know if you get something working and ill write/adapt a library using it

micooke commented 6 years ago

This is the one i was working on https://github.com/micooke/SI1143_Pulse_Prox_Sensors

If you find an algorithm to decouple the motion induced noise using the accelerometer - definitely let me know 😊

scientistnobee commented 6 years ago

I too looked at that library, but it is written with ports for providing the I2C address. Are you sure that I2C address for HR sensor is 0x5A ??

To be frank, I am really not good with coding. I am trying my best to hack this fitness tracker to use it for light measuring device. If I get it working I will let you know.

scientistnobee commented 6 years ago

Hi, I have Si1143 file compiled. But unfortunately, I was not able to see the output on the serial port as I don't know how to use the serial port with black magic probe. So, I am now trying to see the bmp values on OLED screen which might take some time. Please see the file below, which would work with serial port. Let me know, if it works with your fitness tracker.

https://github.com/scientistnobee/Si1143

micooke commented 6 years ago

Yes, its 0x5A. SPI and I2C interrupts are shared on the nRF51, by default it is set to use 1xSPI, 1xI2C - so you need to use a SoftwareI2C library (luckily i wrote one) and modify your code to work with SoftwareI2C

scientistnobee commented 6 years ago

Okay. But I feel I didn't progress much today, although I spent my whole day on it. Just to clarify, I want to detect the light values using this SI1143 sensor. I am not interested in BPM measurements. So, if you have any semi working code, could you please share. I had a look at your library in the following, but I couldn't able to compile it.

micooke commented 6 years ago

I got it the wrong way around, the Si1143 library (https://github.com/micooke/Si1143) is hardware I2C, use SoftwareI2C for the accelerometer.

See https://github.com/micooke/Si1143/blob/master/Examples/ReadSensors/ReadSensors.ino for an example on reading the sensors with and without (Ambiant) the LEDs on.

scientistnobee commented 6 years ago

Thank you. I will check it now and let you know my progress.

micooke commented 6 years ago

No worries. Ill leave this issue open for the meantime. If i dont hear anything ill close it in a couple months

scientistnobee commented 6 years ago

Hi Mark, I am able to communicate with Si114 using the code from @najnesnaj below link. I am updating here, so anyone following this thread might find this useful. Thanks for your help in troubleshooting the code.

https://github.com/najnesnaj/smartband

54696d21 commented 6 years ago

@micooke concerning an algorithm for cleaning up the heart rate signal: I started digging around for scientific papers on that topic and there are quite a few. For a start you can simply type: "photoplethysmography accelerometer" into Google Scholar. I plan to try to implement such an algorithm at some point but getting DFU to work has a higher priority to me :)

micooke commented 6 years ago

Thanks Tim, ill look in to it 👍

scientistnobee commented 6 years ago

Hi Mark,

What are the typical values of photodiodes (als_vis and als_ir) you get using your Si1143 codes. I am getting these values as below:

AMBIENT_VIS 4294910181 AMBIENT_IR 15859711 AMBIENT_VIS 21234092 AMBIENT_IR 16843020 AMBIENT_VIS 20906423 AMBIENT_IR 16449826 AMBIENT_VIS 20840893 AMBIENT_IR 16843038 AMBIENT_VIS 21496239 AMBIENT_IR 16580882 AMBIENT_VIS 21234088 AMBIENT_IR 16974110 AMBIENT_VIS 21430716 AMBIENT_IR 16974110 AMBIENT_VIS 21168546 AMBIENT_IR 16580890 AMBIENT_VIS 21758384 AMBIENT_IR 16843038 AMBIENT_VIS 21168569 AMBIENT_IR 16711968 AMBIENT_VIS 20709798 AMBIENT_IR 17039635 AMBIENT_VIS 20644250 AMBIENT_IR 16777498 AMBIENT_VIS 21234097 AMBIENT_IR 16908574 AMBIENT_VIS 21168543 AMBIENT_IR 16580891 AMBIENT_VIS 21168564 AMBIENT_IR 16908577 AMBIENT_VIS 21365150 AMBIENT_IR 16515358 AMBIENT_VIS 20840879 AMBIENT_IR 16711960 AMBIENT_VIS 21561779 AMBIENT_IR 16580897 AMBIENT_VIS 20709793 AMBIENT_IR 16777501 AMBIENT_VIS 21168539

Do you think these values are realistic and do they make sense? I don't know what these numbers corresponds to. Please let me know, if you have any idea. Thank you.

micooke commented 6 years ago

Heya, i haven't looked at this in a while.. I'm away from my test setup at the moment, so I'll try and reply next week. From memory they both should be measuring distance, so try placing a solid object different distances away and observing the measurements. Ambiant is without the leds on. Should be useful for detecting on /off wrist to turn on /off the leds for hr measurement

micooke commented 6 years ago

Oh, and it's short range. 8cm as the max distance comes to mind.. Dunno, i would have to check the datasheet

scientistnobee commented 6 years ago

I think als_vis and als_ir are the only photodode measurements while ps_data measuring the distance.

I thought als_vis is given by ALS_VIS_DATA=256*ALS_VIS_DATA1+ALS_VIS_DATA0 as shown in page 36 of the following pdf. https://www.silabs.com/documents/public/application-notes/AN498.pdf

But these values (als_vis and ALS_VIS_DATA) are not the same when I read from the sensor. So I don't know what pulse.als_vis is measuring.

scientistnobee commented 6 years ago

Mark any update on these pulse.als_vis values?

scientistnobee commented 6 years ago

No worries. All the best with your work. By the way, did you ever encountered the following problem, while working with ID107HR.

I was able to upload the code, If I chose softdevice as "none" in the "tools" "softdevice" options of Arduino IDE. However, if I chose "s130", Arduino IDE is struck while uploading the code to ID107HR.

If you are busy please ignore this.

micooke commented 6 years ago

Yeah sometimes my programmer gets itself into a state. I normally have to remove it and restart Arduino. Normally with a blackmagic probe.

scientistnobee commented 6 years ago

Hi Mark,

I resolved the above soft device inclusion problem. I downloaded the softdevice file from Nordioc and kept in the softdevice folder of Sandeep's core.

micooke commented 6 years ago

I actually had the same issue when running this on Linux so i wrote this (only valid for the current revision of sandeeps repo) : https://github.com/micooke/micooke.github.io/blob/master/canihaz_softdevices.sh

micooke commented 6 years ago

@scientistnobee - regarding the sensor value : ALS_VIS_DATA=256*ALS_VIS_DATA1+ALS_VIS_DATA0 is the same as ALS_VIS_DATA=(ALS_VIS_DATA1 << 8) +ALS_VIS_DATA0 << is a bit shift operator in c. So im bit shifting left by 8, which is multiplying by 2^8 (bit shifting to the right >> is dividing) The max 16b value is 2^16 - 1 = 65535 so something else is happening. I'm averaging (line 402 - 413) and i suspect the issue is there. I'll have a look in the next week, sorry been busy with the release :) Cheers

scientistnobee commented 6 years ago

Thanks for your working on this problem. I am still struggling with this. Hope we can resolve this soon.

micooke commented 6 years ago

Just a note, using the board manager - try installing 0.2.0 to get the latest of everything... excluding the file i just updated :) https://github.com/micooke/Si1143/blob/master/Examples/ReadSensors/ReadSensors.ino

Using ReadSensors.ino, Im getting the following :

inside the house

Note, by default 5 samples are averaged together (see samples_to_average): https://github.com/micooke/Si1143/blob/da51cfe2a745b1db8d0f387e96afe5eb6a8f245c/Si114.h#L104

I just commited this. The diff may make the measurements a bit easier to understand: https://github.com/micooke/Si1143/commit/da51cfe2a745b1db8d0f387e96afe5eb6a8f245c

scientistnobee commented 6 years ago

I never be able to get connected to Si114x with your library. I don't know what the problem is. I get only the following result

No SI114x found

scientistnobee commented 6 years ago

I use the si114x files I uploaded in the following folder and they work at least for finding the si114

https://github.com/scientistnobee/Robot_learn

micooke commented 6 years ago

What board settings are you using? The example i pointed to assumes you have the hr sensor attached to hardware i2c, which is not the default configuration for my id107hr variant

scientistnobee commented 6 years ago

I used the generic nrf51 variant with your files of variant.h in it.
How can I attach the HR sensor to the hardware i2c? Could you please tell me your configuration?

micooke commented 6 years ago

What is the physical device? I'm using the id107hr variant - it's a nrf51. Do you have the latest si1143 library? As i said I updated it. If your library is templated, then it is the latest. One thing, i released the wrong commit by accident - software i2c doesn't work (no error produced), but the standard wire library does (this is the default example)

scientistnobee commented 6 years ago

I have only 107HR device. yes, I do download your latest version of the library. I updated your variants as well to version 0.2.0. I am not changing anything in your ReadSensors.ino, so I am sure I am not using software I2C. Please let me know, if I have to change any lines in the files of Si1143 library.

micooke commented 6 years ago

Are you selecting ID107HR for the board and I2C:Accel=SW, HeartRate=HW for the Board Variant?

scientistnobee commented 6 years ago

Thanks for the tip. Now I understood, what you have been saying all these days. I didn't see the Board variant before. I am extremely sorry for that. Now I am getting sensible values.

scientistnobee commented 6 years ago

Now coming to the values, if I keep my smart phone flash light shining on to the sensor, I can see the Ambient Visible and IR photo diode values changing as expected. However, there is no significant change in the Active LEDS values. So Active LEDS are only measuring the reflectance values i.e distance wrt to the sensor rather than light coming on the sensor. If that is the case, how these LEDS are used to measure the heartbeat rate?

micooke commented 6 years ago

Not a problem, it's easy enough to miss. With PPG you measure the variance in reflected signal, which should peak and trough in time with your blood flow - ie your heartrate. As i said, I haven't got this part working

scientistnobee commented 6 years ago

Thanks for understanding. I am looking forward to PPG measurements.

scientistnobee commented 6 years ago

Hi Mark, I again hit the softdevice problem. If I select softdevice as "none" I am able to upload the code, but if I chose s130, I could not. This time, I copied the softdevice into the softdevice folder in your core, just like I did before for sandeep's code. But it is still not working. Please let me know, if there are any tricks to get it worked this time.