|Product Performed to Expectations:||9|
|Specifications were sufficient to design with:||10|
|Demo Software was of good quality:||10|
|Product was easy to use:||10|
|Support materials were available:||10|
|The price to performance ratio was good:||8|
|TotalScore:||57 / 60|
Rohm Sensor Board
Thanks to element14 and ROHM for selecting me to do this RoadTest. The RoadTest will be done in two parts – a traditional RoadTest posted here and a project using selected sensors in a prototype marine buoy. The project will use the sensors to measure conditions such as barometric pressure, temperature, sediments in the water (turbidity), wave action, and possibly other matters on a floating buoy which will be transmitted back to shore using LoRa. That project will be posted separately with a link to this RoadTest.
The traditional RoadTest which follows consists of an unboxing, description of the sensor board (shield), and the eight sensors that are provided with the kit. The description of the sensors includes:
- Description of sensor and general specifications
- Application diagram or block diagram
- Impressions / problems encountered during testing
- Test description
- Screen Shot of Arduino Serial output from the sensor
- Test Results
- Plans for future testing and application
A common finding throughout the RoadTest was the high quality of the documentation. All sensors were found to be within the specifications in the datasheet to the best that I could determine although the temperature sensor was at the high end of what was expected. The sensor board is well engineered and suited to demonstrating how the sensors work. The Arduino sketches are clearly written and look to be easily ported to other microcontrollers.
The evaluation board and sensors come beautifully packaged and well protected.
Inside there is an evaluation board (shield) in the Arduino form factor. Getting started instructions in English and Japanese are provided with a link to the location of the software and manuals. The instructions and manuals are well written and comprehensive. The eight sensors are nicely packaged in protective plastic trays with foam protection for the pins. Thumbs up for quality of packaging and instructions.
The sensors provided are:
- Accelerometer KX224-I2C
- Pressure Sensor BM1383AGLV
- Magnetometer BM1422AGMV
- Ambient Light and Proximity RPR-0521RS
- Color BH1749NUC
- Optical Heart Rate BH1790GLC
- Hall BD7411G
- Temperature BD1020HFV
The sensor shield uses the Arduino Uno form factor and Arduino sketches compatible with the Arduino Uno are provided for all the sensors in the kit. Not only does this make for easy demonstration of the sensors, it is helpful for porting to other microcontrollers. The sensors come on individual PCBs approximately 20 x 20 mm (.79” x .79”) with male pins on 0.1” spacing.
There are four sections to place modules on the sensor shield (two analog, 1 digital IO, and five I2C). There are many jumpers provided for setting voltage, and interrupts – most are not used in the directions provided. As an example setup, in the photo below the heart rate sensor is in the I2C section and the voltage jumper is set to 3V while there is a flying jumper to 5V from the module to power a LED on the module. The pressure sensor has been placed in one of the I2C locations.
The jumpers settings prescribed in the instructions are noted in the individual sensor sections. This is a minor criticism but my personal preference would be for all sensors on the same 3V setting. The one 5V sensor appears to have 3V3 equivalents in the ROHM catalog.
Hall Sensor – BD7411G
The hall sensor is omnipolar and operates whenever a magnetic field (N or S) is detected with the operating point being +/- 3.4 mT according to the datasheet. Supply voltage is 4.5 to 5.5 Volts with a stated hysteresis of 0.4 mT. Output low voltage is 0.2V and high is Vdd – 0.2 V. It comes in a relatively large SSOP5 package which could easily be hand soldered. The circuit is simple and the supplied module has a single bypass capacitor from Vdd to ground.
Setting up the module is straight forward other than the supply voltage jumper must be set to 5V and it is the only module that is not 3V. ROHM makes a similar SSOP5 packaged hall sensor, the BU52025G, that operates off of a supply voltage of 2.4 to 3.6 V and I wonder why they did not use it for the sensor shield – it might prevent someone from accidently damaging one of the other modules by failing to change a jumper setting. Since the sensor is digital in nature it is placed in the section of the board labelled GPIO.
The sketch polls continuously with a 500 millisecond delay statement. The library itself is very simple – just a digital read of the pin connected to the output of the hall sensor which could be easily ported to any microcontroller. Testing involved moving a magnet back and forth over the sensor and looking for detection. Detection was successful provided the magnet was close enough. Below is a screen shot of the Arduino Serial output from the test.
I have used hall sensors in the past, mostly the US5881LUA in a through-hole package. The US5881LUA is unipolar (it only detects a south pole) as opposed to omnipolar like the BD7411G. I had no issues with the ROHM BD7411G and would consider the 3V version should a use occur in future but do not have an application for it currently in the buoy.
Temperature Sensor – BD1020HFV
The temperature sensor is an analog sensor that works over the range of -30°C to +100°C. The stated accuracy is +/- 2.5°C (max) at -30°C and +100°C. At 30°C it is said to be +/- 2.5°C (max). The normal operating voltage is 2.4V to 5.5V. It comes in a HVSOF5 package which while small could be hand soldered. The supplied module has a single bypass capacitor from Vdd to ground. Note that there is a thermal pad (PAD1) which should be in contact with the object for which temperature is desired.
Setting up the module is straight forward and it was placed in the analog section with the supply voltage set to 3V. The header is unusual in that the sensor module only had 3 pins but the header has 4 female sockets and care should be taken to center it within the dotted white lines on the sensor shield.
The sketch polls continuously with a 500 millisecond delay statement. The library itself is also simple with the main calculation involving conversion of an analog read to temperature through constants for slope and intercept in the linear equation. Porting to another microcontroller would be easy.
The testing consisted of comparison to two digital multimeters at room temperature and an attempt at achieving equilibrium measurements in a thermally insulated ice bath. The two multimeters used for comparison were an Extech EX330 with resolution of 1°C and a TENMA 72-1020 with resolution of 0.1°C. Both have K type thermocouple probes. These instruments have stated accuracy similar to the ROHM BD1020HDV but probe accuracy is not guaranteed. The probes were taped to the ROHM sensor but good contact was not assured. The probes and sensor were then placed in a plastic bag with leads connected through the sipping hole in the plastic lid of an insulated coffee mug after removing air from the bag as best possible and taping the bag shut to keep out drafts and moisture.
The basic apparatus is shown below prior to placing in the mug with measurements taken after everything had come to equilibrium (approximately 15 minutes) at room temperature. The digital multimeters read 20°C (Extech) and 20.5°C (TENMA) at room temperature. The ROHM varies from 22.40 to 23.59°C – call it 23°C. The variation could be smoothed with software averaging. Note however that it is read about 2.5°C higher than the multimeters.
Because of the differences in readings at room temperature the next test used an ice bath composed of chipped ice and tap water in a thermally insulated mug. The test apparatus was allowed to come to equilibrium by waiting until 15 minutes had elapsed with no change in readings and is shown below.
The two multimeters are both reading 1°C and the Rohm is ranging 2.75 to 3.35°C – call it 3°C or about a 2°C difference while in the ice bath. In a more ideal apparatus with pure water the expected temperature would of course be 0°C.
It was hypothesized that the plastic bag might be impacting results. The bag was removed and the two multimeter probes reinserted bare. The TENMA actually read slightly higher than 1°C this time. Perhaps leakage through the cup lid / sip opening and along the conductors is warming the sensors.
The Rohm sensor appears to be reading high but due to the crude nature of my setup and instruments it cannot be shown to be out of specification. It would be interesting to see if others have similar results and to see results from a better instrumentation setup. I am considering using it to do temperature measurements on the buoy but as will be shown shortly the barometric pressure sensor also reports temperature and it may be used instead.
Accelerometer – KX224-I2C
The accelerometer is a 3-axis accelerometer that can be user set to +/-8g, +/-16g, or +/-32g. It contains orientation, direction tap, double tap, and free fall algorithms. It comes in a 3 x 3 x 0.9 mm LGA package which would be somewhat difficult to hand solder. The accepted supply voltage range is 1.71V to 3.6 V. The communication protocol can be either SPI or I2C. The offset and sensitivity is factory set with a maximum of 175 mg zero-g offset.
The circuit has bypass capacitors on the power supply for digital communication and Vdd. There is also a zero ohm jumper (R3) on the trigger pin to ground. The other pads are not used.
Setup consisted of setting the supply voltage jumper to 3V and the plugging the module into the I2C section of the sensor shield.
The sketch polls every 500 milliseconds with a delay statement and prints acceleration in the X, Y, and Z axis in units of g, the gravity of Earth.
It appears that the value for the range of g can be set in the KX224_I2C.h file and I did not see anything strange going on in the cpp file so it should be easy to port to other microcontrollers.
I tested by orienting each axis of the sensor on my work table using a square with an expectation of seeing approximately 1g along the vertical axis and 0g on the two perpendicular axis. The expectation is approximate as my table is not completely level and it is difficult to get everything perfectly square.
Results are shown below.
Even though the table and alignment are not perfect, these results are well within the product specification. I then moved the sensor back and forth along various axis and checked to see if response was as expected. Below is a typical screen shot of what the Arduino Serial output looks like during testing of movement:
In the past I have used the MPU6050 which in addition to acceleration has a 3-axis gyroscope. The ROHMKX224 does not have this capability but is easy to use and I plan to investigate it further for use in my marine buoy for estimating wave activity and period, buoy pitch, and so forth.
Pressure Sensor – BM1383AGLV
The piezo-resistive pressure sensor has temperature measurement and temperature compensation within the chip. The measurement range is 300hPa to 1100hPa with +/- 0.12hPa (Typ) relative pressure accuracy and +/-1hPa (Typ) absolute. To put this in perspective, a 0.12hPa relative change is equivalent to approximately 1 meter change in elevation at sea level. The temperature sensor has +/-2°C accuracy in the range of 25°C to 85°C according to the datasheet.
It comes in a 2.5 x 2.5 mm package that would be difficult to hand solder but could be done with a hot plate or toaster oven. The recommended power supply is 1.7 to 3.6V. Communication is by I2C.
There are bypass capacitors on Vdd and the logic voltage pin. Resistors R1 and R2 are not populated.
Setup was done by inserting the sensor module into an I2C socket and placing the jumper at 3V.
The sketch polls the sensor every 500 milliseconds using a simple delay statement and reports pressure in hPa and temperature in °C. A quick review of the Arduino cpp and h files did not review anything unusual that would make porting to another microcontroller difficult and I was able to run the code on an Arduino MKR WAN 1300 (SAMD21) LoRa board without a problem.
Below is a representative screenshot from the Serial output of the sketch.
I have a TDK InvenSense ICP10100 sensor which my friend Adrian was kind enough to give to me for comparison. You can find Adrian’s module design and the Arduino library for it here.
The ICP10100 has similar absolute pressure specification to the BM1383 but an improved relative pressure specification. The absolute accuracy is given as +/- 1 hPa over the range of 950 hPa to 1050 hPa at 25°C. The relative pressure accuracy is given as +/- 1Pa for any 10hPa change over that range (compared to 13Pa for the BM1383AGLV over an unspecified range).
To compare the sensors I placed them on the same breadboard connected to an Arduino MKR WAN 1300 as shown below.
Adrian’s code was modified to include the ROHM library so that the results of both sensors are reported. Pressure readings were taken with the sensors on my desktop which is approximately 805 mm off of the floor and then on the floor to see if the sensors could detect such a small change in elevation. A temperature check was also performed. The results are shown below.
The ICP10100 indicates a temperature of 19.1°C while the BM1383 indicates 21.8°C. An Extech multimeter showed 20°C. Once again the ROHM temperature measurement seems on the high side but cannot be ruled out of spec given the accuracy of the comparison instrument.
The absolute pressure difference between the two sensor is around 135 Pa (1.35 hPa). Both sensors claim +/- 1 hPa absolute accuracy and the error bands overlap.
The Mide Technology Air Pressure at Altitude Calculator can be used to calculate the expected differential pressure between the table top and the floor. Results are below.
The ICP10100 reports a 830 mm difference in altitude and the BM1383 reports 700 mm. There was some variation from test to test but the ICP10100 had less jitter and was more accurate. Smoothing the BM1383 could be done in software. Both sensors meet their datasheet specifications. It is truly amazing that these tiny sensors can sense such small changes in pressure and thus altitude.
I also compared the readings for the two pressure sensors to the isobars on the windy.com website for a rough evaluation of absolute pressure:
It so happens that the 1012 hPa isobar went through my home that day which is 50+ m above sea level. Assuming the isobars are for sea level, the calculated barometric pressure at my home would be 1006 hPa which agrees closely with the sensors.
I am interested in using this sensor on my buoy project and will be investigating it further for use in capturing general environmental data.
Magnetometer – BM1422AGMV
The geomagnetic sensor is a 3-axis magnetic sensor in a small 2.0 x 2.0 mm package. It has an I2C interface and can give 12bit / 14bit digital output. The input voltag3e rage is 1.7V to 3.6V and the magnetic measurable range is +/- 1200 uT(Typ) with sensitivity of 0.042 uT/LSB(Typ). The circuit as implemented on the module consists of 3 bypass capacitors to ground.
The setup instructions should be followed carefully. Insert the module into socket one (I2C_1) of the sensor shield and set the voltage to 3V. The interrupt jumper INTR1 should also be set which need not be set for the other sensors.
The Arduino Uno only has external interrupt capability on digital pins 2 and 3. The code be easily ported to other microcontrollers and should be simple for other Arduino boards. There is blocking in the get_rawval function while waiting for completion which needs evaluation for some uses. Everything else looks straight forward. The sketch itself polls and prints to serial the magnitude of the 3 axis every 500 ms.
I calibrated the sensor according to the method described in the comments of Jan Crump’s BM1422AGMV RoadTest. Thanks to Jan, kulky64, Jon Clift, and shabaz for a great thread.
An example of Serial output is shown below both before and after calibration:
Here is the expected magnetic field as calculated at the NOAA site:
The ROHM example code was modified to determine the minimum and maximum values in the X, Y, and Z directions which are shown below:
#define X_MIN (-95.042) #define X_MAX (28.792) #define Y_MIN (-101.292) #define Y_MAX (17.375) #define Z_MIN (-100.958) #define Z_MAX (15.833)
The Rohm example code was then modified to print the calibrated readings, and aligned with magnetic North. There was variability in the output, but here is one where Y came out to be zero. The expected values based on the NOAA site are also shown.
This calibration was done indoors as it has been raining. I intend to repeat calibration and test again at a later date and will also smooth the data through software averaging.
I am interested in using this sensor on my buoy project and will be investigating it further for possible use in determining current direction when the buoy is moored.
Ambient Light / Proximity Sensor – RPR-0521RS
The Ambient Light / Proximity Sensor module combines an optical proximity, digital ambient light sensor IC and infrared LED onto one module. The ambient light sensor is capable of measuring illuminance for both IR and the visible light spectrums and can reject 50Hz/60Hz noise. Supply voltage range is 2.5V to 3.6V for the sensor and it communicates on the I2C bus. Detection range is given as 1-100mm and the sensor IC has a built-in current driver for the infrared LED. Gain can be set and there is a flag that indicates whether the level is low or high. I don’t see where the maximum light intensity is described in the datasheet where saturation might occur. Darkness results in a low count in the data register (max 5). The sensor package cannot be hand soldered and would need at least a hot plate or toaster oven.
Setup is done by placing the module in the I2C area and setting the power supply jumper to 3V. The Arduino code looks straight forward and the conversion to illuminance in lux from the raw values is done in the code.
Proximity is reported in uncalibrated counts and a “near” / “far” indication set at around 1 cm. Calibration could be done in code but would depend on object size and reflectivity. Typical Serial output is shown below:
Ambient light is reported in lux. I tried to saturate the sensor by shining bright LED light directly into it but was unable to do so – this is a good thing as I have had previous sensors fail this test and take time to recover. Covering the sensor gave low readings (around 4.66 lx) as expected. Shining a bright LED directly into the sensor gave readings as high as 86,000 lx. The light reaching lab desk reads about 700 lx.
Going outside on a cloudy day with light drizzle here in Seattle around noon gave a reading of 1656 lx. My trusty Nikon DSLR recommends f8 and 1/30 second exposure for ISO200 under the same conditions when pointed at a grey background. This corresponds to an EV of 10 and lux of 2600 according to this web site.
For comparison, Wikipedia states that a moonless overcast night sky has 0.0001 lx, office lighting typically has 320-500 lx, an overcast sky has about 1000 lx, and direct sunlight can have 32,000 to 100,000 lx.
The datasheet does not give accuracy of the lux calculation and my investigation is relatively rough. Calibration would be necessary for more accurate readings. I intend to repeat the tests outdoors at a later date when there is full sun.
I am interested in using this sensor in the buoy project and will investigate using it further.
Color Sensor – BH1749NUC
The color sensor is a digital sensor which uses the I2C interface. It senses Red, Green, Blue and Infrared and converts them to digital values. The primary use is stated to be adjusting LCD backlights of TVs, mobile phones, and tablets. VCC voltage range is 2.3V to 3.6V and the illuminance detection range is stated to be 80klx. The IC is provided in 2.10 mm x 2.00 mm WSON008 package.
The module is easy to use and inserted into the I2C section of the board with the supply voltage jumper set to 3V.
The spectral response in the datasheets shows very clean peaks for RGB and infrared compared to the TCS3200 which I have used in the past. This should make calibration easier and give improved color description.
I plan to pursue how the sensor performs when reading a backlit liquid sample. This is not ROHM’s intended application so the results will be experimental and will not be used to check the datasheet.
The initial experiment was to determine how the color sensor distinguishes backlit liquids in these color concentrations. Each sample was illuminated by a small LED flashlight with the color sensor on the other side of the sample and covered with a paper dish to shield it from the computer monitor. The lab lights were turned off. In the photo below the yellow sample is being tested.
The raw results are shown below.
A typical response for each color is given in the table below.
There is clear differentiation in the samples and these preliminary results are promising. The concept will be pursued further in the buoy project. It is hoped that turbidity can be measured as well as possibly detecting red tide and other environmental conditions.
Optical Heart Rate Sensor – BH1790GLC
The optical heart rate sensor has a green light photo-diode that detects the light from two LEDs on the sensor module. There are LED drivers in the IC which simplifies the circuit down to the chip itself and two LEDs. The LED terminal voltage can be from 0.7V to 5.5V but must be enough to get a response from the photo-diode. On the sensor board provided it is connected to 5V by a jumper which differentiates it from all the other sensors. It comes in a small 2.8 x 2.8 mm package not well suited to hand soldering. The power supply voltage range is 2.5V to 3.6V but it can handle IO power from 1.7V to 3.6V. Communication is via I2C.
Setup involves setting the power supply voltage to 3V, inserting the sensor module into the I2C area, and then connecting the LED jumper (VLED) to 5V. There are two sketches that can be run with the HeartRate sketch demonstrated here. The library is more complicated than the others and I did not review it thoroughly. Although I did not see it in the directions, it is necessary to install FlexiTimer.h off of github to get the library to work on the Uno. FlexiTimer is AVR specific and I expect some additional effort might be necessary to port it to other microcontrollers (note I did not try porting but would not expect it to be overly difficult).
My first test was to run the sketch, observe the reported heart rate, and then calculate it myself by counting my pulse for 30 seconds. The results are shown below.
My manual count was 64 beats per minute and the average for the screen shot was 65. Quite close and entirely acceptable.
My friend Adrian also loaned me a commercial pulse oximeter and I thought it would be interesting to demonstrate it here along with the ROHM Arduino sketch.
The oximeter shows SP02 to be 97 (normal is 95 to 100) and pulse about 67. Disregard the top part of the Arduino Serial output – I was trying to hold both fingers steady on the sensors with the right hand while filming with the left hand. The pulse meter accurately recorded my pulse as around 67 when I held still.
The heart rate sensor performed well and I will be on the lookout for a further use for it in the future but I don’t have an application identified for the buoy project.
The sensor board, sensor modules, and the Arduino sketches are all easy to use. Incorporating these sensors into products would be easy and the additional component count is low. The documentation is quite good. To the best of my determination all of the sensors were within the ROHM specifications although the temperature appeared to be on the high end. I really like the concept of the sensor board – It makes testing and demonstrating the sensors simple. The ROHM sensor shield and modules are expensive at $148.31 from Newark but most customers probably are not interested in all 8 sensor modules. The cost is minimal for an industrial customer given the time and labor savings associated with being able to put a working circuit and code to work immediately however. And given the simplicity of the circuits it would be easy to design a small PCB and test the sensors individually with the provided code if the user is able to solder the small parts.
Edits and Corrections
27/11/2018: Corrected specification comparison in pressure sensor review and made pressure units consistent