An introduction to the Intel Curie Module
LinkedIn: https://www.linkedin.com/in/davide-tiriticco-2278719a
Pervasive System course (Sapienza University of Rome): http://ichatz.me/index.php/Site/PervasiveSystems2016
3. Intel®
Curie™ Module
The Intel®
Curie™ Module includes:
● 2 Low power cores: 32-bit Intel®
Quark™ and ARC both clocked at 32 MHz
● 384 Kb of flash memory, 80 Kb SRAM
● Bluetooth Low Energy (BLE)
● 6-axis combo sensor with accelerometer and gyroscope
● Battery charging circuit (PMIC)
It is an ideal solution for “always on” applications such as wellness and sport
activities
4. Arduino / Genuino 101
The Intel®
Curie™ module have been embedded in the Genuino 101 board in order to
combine the “ease-of-use” of classic Arduino boards with the latest Intel technologies in the
field of microprocessors.
● 14 digital input/output pins
● 6 analog inputs
● USB connector for serial communication and sketch upload
● Power jack
In order to be able to interface with the Curie™ module,
two libraries have been made available:
● CurieIMU: to control motion sensors
● CurieBLE: to control BLE module
6. IMU - Calibration
IMU calibration provides to compensate the offsets values for accelerometer and gyroscope
along each one of the reference axis.
In order to calibrate motion sensors, some runtime API are made available in the CurieIMU
library:
● autoCalibrateAccelerometerOffset(int axis, int target)
● autoCalibrateGyroOffset() Z
X
Y
7. IMU - Gyroscope
Gyroscope is a sensor which is able to measure the angular velocity of the device
over each one of the three reference axis.
● readGyro(int gx, int gy, int gz)
Values returned by the function are 16-bit integers ( [-32768/ +32767 ] ).
● The sensitivity of the gyroscope could be:
○ +/- 2000 deg/sec
○ +/- 1000 deg/sec
○ +/- 500 deg/sec
○ +/- 250 deg/sec
○ +/- 125 deg/sec
● in order to get the effective value for the angular velocity
we have to apply the following formula:
○ gyro = ( raw * max_sensitivity) / INT16_MAX
8. IMU - Accelerometer
The accelerometer is a sensor which is able to measure the acceleration of the
device over each one of the three reference axis.
● readAccelerometer(int ax, int ay, int az)
Values returned by the function are 16-bit integers ( [-32768 / +32767 ] )
● Accelerometer values are always in the following ranges:
○ +/- 2 G
○ +/- 4 G
○ +/- 8 G
○ +/- 16 G
In order to get the effective value for the acceleration we have to
apply the following formula:
○ acc = ( raw * range) / INT16_MAX
9. IMU - Sensors Rate
The CurieIMU library allows developers to retrieve or setup the frequency at which
sensors events are sent to the application.
● getAccelerometerRate()/getGyroRate():
○ Returns the sensor data rate expressed in Hz
○ Values returned could be 12.5, 25, 50, 100, 200, 400, 800, 1600 for the
accelerometer, and 12.5, 25, 50, 100, 200, 400, 800, 1600, 3200 for the
gyroscope.
Rate is important because if your application reads sensors registers faster
than sensors rate you will read the same value more than once!! (even if
there is no motion!).
10. CurieIMU - Example
The example provides an implementation of a remote controller for a 3D shape
using the Intel Curie Module.
The main tasks are:
● Device calibration
● Sensors interaction
● Shape orientation ( Madgwick filter )
● Communication through serial port between the Intel Curie and the 3D
application.
Code link: https://github.com/davtir/curie-examples/tree/master/3D-Orientation
12. Bluetooth Low Energy (BLE)
What are the main analogies and differences between BLE and classic
Bluetooth ?
● Different power consumption and targets:
○ Classic bluetooth was designed for continuous, streaming data
applications.
○ BLE is generally used for applications that do not need to exchange large
amounts of data.
● Same band but different approach:
○ Both BLE and bluetooth operates at 2.4 GHz
○ Differently from classic Bluetooth, BLE remains in
sleep mode constantly except for when a connection
is initiated.
● BLE connection times are only few ms (1 Mb/s data rate)
unlike Bluetooth which would take ~100ms
13. BLE - Devices Roles
● Peripheral: small, low power devices that can connect to a much more
powerful central device.
● Central: mobile phones, tablets or laptop with much more processing power
and memory than peripherals.
Advertising
Data
Advertising
Data
Scan Response
Request
Scan Response
Data
Advertising
Data
Peripheral
Central
Advertising
Interval
Advertising
Interval
Advertising
Interval
14. BLE - Services and Characteristic
● Characteristics
○ It represents the shared resource among peripheral and centrals.
○ It is identified by a 16-bit or 128-bit UUID
● Services
○ Represents a service that is offered by peripherals and that interacts with
one or more characteristic.
○ Similarly to characteristics, it is identified by a 16-bit or 128-bit UUID
Service
16/128-bit UUID
Characteristic
16/128-bit UUID
Characteristic
16/128-bit UUID
15. CurieBLE - Entities
● BLEPeripherals:
○ Constantly sends advertising packets
○ Receive connections from centrals
○ You can associated BLEServices and BLECharacteristic to this
entity using the function addAttribute()
● BLEService
○ The service offered by the BLEPeripherals
● BLECharacteristic
○ The resource on which the service works
○ Can be define as:
■ BLERead: centrals are allowed to read the value of the characteristic
■ BLEWrite: centrals are allowed to write the value of the characteristic
■ BLENotify: centrals are allowed to get notifications when the value
changes
16. CurieBLE - Example
The example provides an implementation of a dynamic blinking, i.e., you can
control the velocity of the led blinking through a mobile device using BLE.
The mobile device uses the nRF Master Control Panel application in order to send
data to the Intel Curie.
Code link: https://github.com/davtir/curie-examples/tree/master/dynamicBlink