I2C Communication With a Color, Gesture, and Proximity sensor
Notes:
- I2C is a common protocol among many ICs, and it’s handy because you can combine many devices on the same bus.
- I2C devices exchange bits of data whenever the shared clock signal changes.
SPI Communication With A Digital Potentiometer
Two-way (Duplex) Serial Communication using an Arduino and Processing
Program the Microcontroller to Read the IMU:
#include <Arduino_LSM6DS3.h>
void setup() {
Serial.begin(9600);
while (!Serial) {
; // wait for serial port to connect. Needed for native USB port only
}
if (!IMU.begin()) {
Serial.println("Failed to initialize IMU!");
while (true); // halt program
}
Serial.println("IMU initialized!");
}
void loop() {
float aX, aY, aZ;
float gX, gY, gZ;
const char * spacer = ", ";
if (
IMU.accelerationAvailable()
&& IMU.gyroscopeAvailable()
) {
IMU.readAcceleration(aX, aY, aZ);
IMU.readGyroscope(gX, gY, gZ);
Serial.print(aX); Serial.print(spacer);
Serial.print(aY); Serial.print(spacer);
Serial.print(aZ); Serial.print(spacer);
Serial.print(gX); Serial.print(spacer);
Serial.print(gY); Serial.print(spacer);
Serial.println(gZ);
delay(1000);
}
}
Add Serial Handshaking:
void loop() {
// values for acceleration and rotation:
float xAcc, yAcc, zAcc;
float xGyro, yGyro, zGyro;
// check if the IMU is ready to read:
if (IMU.accelerationAvailable() & amp; & amp;
IMU.gyroscopeAvailable()) {
// read accelerometer and gyrometer:
IMU.readAcceleration(xAcc, yAcc, zAcc);
IMU.readGyroscope(xGyro, yGyro, zGyro);
// update the filter, which computes orientation:
filter.updateIMU(xGyro, yGyro, zGyro, xAcc, yAcc, zAcc);
// print the heading, pitch and roll
roll = filter.getRoll();
pitch = filter.getPitch();
heading = filter.getYaw();
}
// if you get a byte in the serial port,
// send the latest heading, pitch, and roll:
if (Serial.available()) {
char input = Serial.read();
Serial.print(heading);
Serial.print(",");
Serial.print(pitch);
Serial.print(",");
Serial.println(roll);
}
}
Arduino Code (with serial port .js) :
var serial; // variable to hold an instance of the serialport library
var portName = 'COM3'; // fill in your serial port name here
var portSelector; // a select menu for the port list
// orientation variables:
let heading = 0.0;
let pitch = 0.0;
let roll = 0.0;
function setup() {
createCanvas(500, 600, WEBGL);
smooth(); // antialias drawing lines
serial = new p5.SerialPort(); // make a new instance of the serialport library
serial.on('list', printList); // set a callback function for the serialport list event
serial.on('connected', serverConnected); // callback for connecting to the server
serial.on('open', portOpen); // callback for the port opening
serial.on('data', serialEvent); // callback for when new data arrives
serial.on('error', serialError); // callback for errors
serial.on('close', portClose); // callback for the port closing
serial.list(); // list the serial ports
}
// get the list of ports:
function printList(portList) {
// make a select menu and position it:
portSelector = createSelect();
portSelector.position(10,10);
// portList is an array of serial port names
for (var i = 0; i < portList.length; i++) {
// Display the list the console:
// console.log(i + " " + portList[i]);
// add item to the select menu:
portSelector.option(portList[i]);
}
// set a handler for when a port is selected from the menu:
portSelector.changed(openPort);
}
function openPort() {
var thisPort = portSelector.value();
if (thisPort != null) {
serial.open(thisPort);
}
}
function serverConnected() {
print('connected to server.');
}
function portOpen() {
print('the serial port opened.')
// send a byte to prompt the microcontroller to send:
serial.write('x');
}
function serialError(err) {
print('Something went wrong with the serial port. ' + err);
}
function portClose() {
print('The serial port closed.');
}
// callback function for incoming serial data:
function serialEvent() {
// read from port until new line:
let message = serial.readStringUntil('\n');
if (message != null) {
let list = split(trim(message), ',');
if (list.length >= 3) {
// conver list items to floats:
heading = float(list[0]);
pitch = float(list[1]);
roll = float(list[2]);
console.log(heading + ',' + pitch + ',' + roll);
// send a byte to the microcontroller to get new data:
serial.write('x');
}
}
}
// draws the Arduino Nano:
function drawArduino() {
// the base board:
stroke(0, 90, 90); // set outline color to darker teal
fill(0, 130, 130); // set fill color to lighter teal
box(300, 10, 120); // draw Arduino board base shape
// the CPU:
stroke(0); // set outline color to black
fill(80); // set fill color to dark grey
translate(30, -6, 0); // move to correct position
box(60, 0, 60); // draw box
// the radio module:
stroke(80); // set outline color to grey
fill(180); // set fill color to light grey
translate(80, 0, 0); // move to correct position
box(60, 15, 60); // draw box
// the USB connector:
translate(-245, 0, 0); // move to correct position
box(35, 15, 40); // draw box
}
function draw() {
// update the drawing:
background(255); // set background to white
push(); // begin object to draw
// variables for matrix translation:
let c1 = cos(radians(roll));
let s1 = sin(radians(roll));
let c2 = cos(radians(pitch));
let s2 = sin(radians(pitch));
let c3 = cos(radians(heading));
let s3 = sin(radians(heading));
applyMatrix(c2 * c3, s1 * s3 + c1 * c3 * s2,
c3 * s1 * s2 - c1 * s3, 0, -s2, c1 * c2,
c2 * s1, 0, c2 * s3, c1 * s2 * s3 - c3 * s1,
c1 * c3 + s1 * s2 * s3, 0, 0, 0, 0, 1);
// draw arduino board:
drawArduino();
pop(); // end of object
}
No comments.