Würth Elektronik Sensor/Calypso FeatherWing review and experiments.

Table of contents

RoadTest: Wurth Sensor FeatherWing Kit

Author: station240

Creation date:

Evaluation Type: Development Boards & Tools

Did you receive all parts the manufacturer stated would be included in the package?: True

What other parts do you consider comparable to this product?: Arduino MKR series, combined with various QUIIC sensors from Adafruit/Sparkfun. Not as convenient or compact however. Not sure what would replicate the MQTT functionaility.

What were the biggest problems encountered?: Software libraries implement basic functionality, but medium and advanced functionality is missing.No Arduino library for the Calypso, even though it communicates over serial1.

Detailed Review:

Overview

Review contains the following

1. Look at the hardware and software

2. MQTT experiments, and monitoring humidity in sealed component bags.

3. Designing and adding a UI FeatherWing with an 128x64 OLED display, multidirectional button (like a joystick) and two additional buttons.

The hardware

Both Würth Elektronik FeatherWing modules come packaged in resealable antistatic bags.

An Adafruit Feather M0 Basic was included to create a functional development platform.

image

The Sensor FeatherWing has the 4 sensor ICs, one each QUIIC and 6 pin I2C connectors, and various passive components.

The Calypso FeatherWing is a carrier for a Calypso module, plus some buttons, LEDs, and headers/jumpers.


Initial setup/testing in Arduino IDE
Put a simple blink example onto the Adafruit Feather M0 to test functionality, and later while it was charging the external Lithium Batteries I added.

Found, downloaded and installed the libraries/examples to use the sensor board in Arduino.
https://github.com/WurthElektronik/SensorLibrariesArduino
Found I needed to set the Feather M0 to debug mode to have a functioning comm port.
Tools > Debug > On

Finally able to run "check_communication" scripts for each sensor, which return the sensor's device ID
1. HIDS: id=BC 16-bit humidity sensor
2. ITDS: id=44 14-bit three-axis accelerometer
3. PADS: id=B3 24-bit MEMS absolute pressure sensor with a temperature sensor
4. TIDS: id=A0 16-bit Temperature sensor

First two readings for HIDS were 34% humidity 31C, values returned after that showed 42% humidity 26C.
The Arduino example script used has two delays, 5000ms in Initialization, 1000ms between each reading.
Therefore we can assume the first 2 values should be ignored, which combined with the 5000ms delay on bootup, means it takes 7 seconds.
Lets do some tests to see if this is true.

In setup function, we added a 3rd delay of 2000ms after setting the sensor mode.
  sensor.set_continuous_mode(ODR);
  delay(2000);
Yes this fixed the issue.
Commenting out the first delay proves it is only needed to allow time to connect with a serial monitor.
//delay(5000);
Therefore, the sensor needs 2 seconds to stabilize it's readings, and such a delay should be added to the code after setting the mode.

Multiple issues found with the available Arduino Library.
Cannot use 2 or more sensors at once.
Problems found:
1. ArduinoPlatform.cpp and ArduinoPlatform.h exist as copies in each sensor library, thus when multiple are used, many compilier errors are reported due to duplicated variables and function calls.
2. I2C address for each sensor is set, but not saved anywhere.
3. Calls to read data/status of a sensor, do not set the I2C address again.
4. Thus only one sensor can be read at a time.

Problem #1 was solved by putting all the code for the different sensors into the same folder, thusly there is only one copy of the ArduinoPlatform files. However some of the examples are also overwritten as they have the same file names.
Next step was creating a script that reads data from two sensors.
However, ITDS was the second sensor and has a function is_Ready_To_Read(). This call never returned true, I suspect due to the sensor not being read from correctly.
I added the following code to check this.
int sensor_ID = sensorA.get_DeviceID();
Serial.print("Sensor ID: ");
Serial.print(sensor_ID, HEX);
Serial.println();
This code printed BC, which is the deviceID for the humidity sensor.

Managed to fix Problem #3 by using the function I2CSetAddress() to set the address again, before reading from the sensor.
Properly fixing this issue is done by altering the Library itself, this is still a work in progress.

Setting up Mosquitto
"C:\Program Files\mosquitto\mosquitto.exe" -v -c .\mosquitto.conf
When run on windows, Mosquitto cannot cope with spaces or quotes in the path given for a log file.
Also if the log file doesn't exist, Mosquitto will not create it.


Software Example for MQTT
1. SensorFeatherWing - Not only an example using the SensorFeatherWing/without the Calypso, but also the location of the all important sensor libraries needed for the other examples.
2. CalypsoWiFiFeatherWing - Calypso communicates with MQTT server, but doesn't read the SensorFeatherWing. Includes the libraries needed for Calypso.
3. Sensor2CloudConnectivity - Calypso communicates with Cloud server, example supports AWS or Azure hosting.
So by putting the missing libraries into the Sensor2CloudConnectivity example, then swapping out the CloudConnectivity code for basic MQTT support from the 2nd example, I finally have an example that can be used. I did however change the time server from the included DE (german) GMT+1 to the generic world pool.ntp.org and local time offset.
In Main.cpp
// SNTP settings
#define SNTP_TIMEZONE "+60"
#define SNTP_SERVER "0.de.pool.ntp.org"
Details of this explained on https://support.ntp.org/bin/view/Servers/NTPPoolServers
timezone offset in minutes, so GMT+12 => 12*60 = 720

However after longer term testing testing I found the Wifi connection would drop out, I did find code to automatically reconnect, however this didn't work. Still investigating the various aspects of this: Why does the wifi drop out, is the Calypso reconnecting correctly, is the MQTT server (Mosquitto) blocking the Calypso in the first place, or preventing it from re-connecting.
However, switching to an altertive WIFI AP (a Raspberry PI running in bridge mode), solved all these issues, so the problem is my ISP supplied Huawei is unstable, which doesn't suprise me.


The Calypso offers a provisioning mode, which is where it's configured as a Wifi AP (Access Point), and has a web interface to locate and configure it's wireless connections.
I found this to be troublesome to use however, it's painfully slow to load, and it's intergration with software is less than ideal.
Provisioning mode is entered by either sending the command "AT+provisioningStart" via serial to Calypso, or moving the jumper to bridge pins 1 & 3.
You simply connect to "calypso.net" in a web browser, I used an Android phone, annoyingly it changes "calypso.net" to 10.123.45.1.

Provisioning mode
When in this mode, connect to "http://calypso.net/usersettings.html" to create and save a WIFI connection config. Why this isn't simply a link from the earlier used "calypso.net" remains a mystery.

However I didn't find a way to access these premade configs in uploaded code.
Powersaving mode
Sending the command:
AT+sleep=1
will put the Calypso into sleep mode for one second, 0 puts it in sleep forever, other values will cause it to sleep for that number of seconds.
In sleep mode it only draws 10uA.
Unfortunately, the examples don't have sleep mode as a function that can be called.
So I had to add that to the library itself.

I also tried to enable the power saving mode: "AT+powersave" however this returns "ERROR: command not exist,0".

Presumably it needs a firmware update, but oddly the library doesn't have a function to retrieve the firmware versions to see this information.


Tracking moisture levels inside sealed component bags.

For this experiment, I needed a Li-Ion battery, rather than use a 400mAh LIpo cell, I assembled two 18650 cells to create a 4-5Ah pack. It was then wrapped in black insulation tape to prevent short circuits with the 


Measured 40-41% humidity in the ambient air.
quickly stuffing the battery powered Calypso/Sensor pack into a factory sealed antistatic bag, and resealing it, gives readings of 46-47% humidity.
In other words, these bags bought directly from China come presealed with humid air inside.
After a few hours, the readings dropped down to 32/43% humidity.

Attempting to find the actual time the battery discharged enough to stop transmitting data
timestamp:1648236315 => unixTime_ms
1,648,236,315
except actual milliseconds not transmitted, add 000 to end to get actual miliseconds.
so Fri Mar 25 2022 19:25:15 GMT


image


Firmware version and Updating
sending the command:
AT+get=general,version
Will return 6 different version string, MAC, PHY, NWP, ROM and finally Calypso firmware version.

documents used
Calypso Manual
https://www.we-online.com/catalog/datasheet/2610011025000_Calypso%20261001102500x%20Manual_rev2.0.pdf
https://www.we-online.com/katalog/media/o677986v410%20ANR028_Calypso_TransparentMode.pdf
Calypso WiFi FeatherWing Github (for jumper settings)
https://github.com/WurthElektronik/FeatherWings/tree/main/CalypsoWiFiFeatherWing
https://www.we-online.de/katalog/media/o158588v410%20ANR007_Calypso_Iot_Application_Based_On_Calypso.pdf



FeatherWing OLED/ board design
Original design (version 0.8)
1x 128*64 OLED display
1x I2C digital IO
1x Directional Button
1x Tactile Buttons
1x QUIIC port

Final design (version 1.0)
1x 128*64 OLED display
1x I2C digital IO
1x Directional Button
2x Mini Tactile Buttons (as the switches I normally use were too large to fit around the headers)
2x QUIIC port for daisy chaining.

image

Changes need to the design for 1.1 version.
1. Multidirectional switch orientated incorrectly, due to lack of orientation mark.
P0 and P5 swapped in software to correct this issue.
2. Buzzing noise from OLED Display, I assume this can be solved with bypass capacitor, but haven't yet been able to test to see what value is need.
3. 16 way connector orientated incorrectly in schematic, means that power and ground go to the wrong locations. Annoyingly this is fixed on the open source featherwing design files I shared earlier. Board still functions correctly is connected via QUIIC instead of the headers.
4. No orientation marker for 20 pin SOIC part on PCB, it's on a documentation layer but not the silkscreen layer, I was aware of this issue but didn't have time to figure out how to fix before ordering the PCB.

The software is based off an existing Arduino library Rob Tillaart, but altered to cope with buttons as a 1x7 array, and returns a char instead of integer. So returns UDLRMKC (up,down,left,right,menu,ok,cancel).

Software used for this board and other experiments used in this review will be uploaded elsewhere, I'll post links in a reply below when they are available.

Summary

Overall a well made and thought out system, expect to do a lot of messing around with software libraries if you want to make full use of all the features of the Sensor FeatherWing or Calypso FeatherWing.

Still everything is documented in the various PDFs.

Anonymous