Como usar o acelerômetro do Genuino 101 3

Olá a todos! Meu nome é Gedeane Kenshima e é com grande prazer que estou estreando aqui no blog MakerHero pra falar de uma placa que está fazendo muito sucesso, chamada Genuino 101. E com ela vamos fazer um projeto utilizando o acelerômetro do Genuino 101 para controlar um led endereçável!

acelerômetro do Genuino 101

Comparação Genuino 101 x Arduino Uno

Para quem acompanha o universo Arduino há uns tempos, percebeu que as placas estão cada vez mais cheias de novidades, com periféricos integrados. A Genuino 101 não é diferente. Esta versão possui um acelerômetro/giroscópio 6 eixos integrado, além do Bluetooth Low Energy (BLE). Para esquemático desta placa, acesse o link no Arduino.cc.

Faremos uma comparação com o Uno, a placa Arduino mais conhecida, para vocês entenderem porque a Genuino 101 é tão diferente do que vemos por aí. As duas placas podem ser vistas na próxima figura:

Quanto às semelhanças, vemos na figura 2 que são do mesmo tamanho e formato, possuem mesma quantidade de pinos digitais, analógicos e Power, além da alimentação via Jack P4 e USB tipo A-B. Também possui pinos ICSP para gravação externa com conversor.

Comparativo Genuino 101 e Arduino Uno

Agora veremos as diferenças, a começar pelo módulo Intel Curie, processador 32 bits compostos de dois núcleos, um Quark x86 e um ARC (Argonaut RISC Core), presentes no Genuino 101. Neste módulo estão incluídos o acelerômetro/giroscópio 6 eixos, Bluetooth e RTC (Real Time Clock). Já o Uno conta com um ATmega328 de 8 bits. O sketch é rodado pelo ARC.

Intel Curie

A tensão de operação da 101 é 3,3V, porém ela trabalha com 5V devido a uma proteção na placa, porém, se utilizado um sensor analógico, ele fará a leitura na faixa de 0 a 3.3V e não até 5V. O Uno trabalha com 5V.

A 101 possui menos portas PWM que um Uno (pinos digitais 3, 5, 6 e 9), contra os 6 disponíveis no Uno. Porém, a 101 conta com dois botões de Reset, um para sketchs (reset) e outro geral (chamado Master Reset).

Master Reset

O que achei interessante foi a compatibilidade de bibliotecas feitas para AVR (para Arduino Uno, Mega, Leonardo, etc) com a Genuino 101. Faremos um exemplo destas a seguir.

Utilizando acelerômetro do Genuino 101 com Led Endereçável

Quem me conhece sabe que gosto muito de leds endereçáveis. Podem ser os modelos WS2811 e WS2812B. Existem diversos modelos em formato de anel, linha e módulos. Para este experimento, utilizei um pedacinho de fita de led endereçável, porém fiquem a vontade para experimentar os efeitos mágicos dos formatos disponíveis.

 As conexões do Genuino 101 com led endereçável são bem simples. DIN no pino 6, GND no GND e 5V no 5V (porém, queira utilizar 3.3V do Arduino não há problemas). Caso utilizar mais de um módulo, lembre-se de conectar o pino DOUT do primeiro no DIN do segundo e assim sucessivamente.

 Circuito com Genuino 101 e led endereçável

Abaixo temos o vídeo mostrando a montagem real:

É necessário baixar duas bibliotecas externas. A Adafruit NeoPixel para utilizar o led endereçável e CurieIMU para usar o acelerômetro do Genuino 101, interno da placa. A IDE Arduino precisa ser versão 1.6.7 ou mais recente.

A seguir temos o sketch, disponível no Github:

//Programa: Acelerômetro do Genuino 101 e led endereçável

#include <Adafruit_NeoPixel.h> //Biblioteca Adafruit Neopixel para WS2812
#ifdef __AVR__
  #include <avr/power.h>
#endif

#include "CurieIMU.h" // biblioteca para acelerometro

unsigned long loopTime = 0;          // get the time since program started
unsigned long interruptsTime = 0;    // get the time when motion event is detected

#define PIN            6 // pino digital do WS2812b

// How many NeoPixels are attached to the Arduino?
#define NUMPIXELS      1 //Quantos leds então anexados 

Adafruit_NeoPixel strip = Adafruit_NeoPixel(NUMPIXELS, PIN, NEO_GRB + NEO_KHZ800);

void setup() {
  Serial.begin(9600);
  while(!Serial);   // wait for the serial port to open

  Serial.println("Initializing IMU device...");
  CurieIMU.begin();

  // Set the accelerometer range to 2G
  CurieIMU.setAccelerometerRange(2);

  strip.begin();
  strip.show(); // Initialize all pixels to 'off'
}

void loop() {
  int axRaw, ayRaw, azRaw,x,y,z;         // raw accelerometer values
  float ax, ay, az;

  // leitura do acelerometro
  CurieIMU.readAccelerometer(axRaw, ayRaw, azRaw);

  // convert the raw accelerometer data to G's
  ax = convertRawAcceleration(axRaw);
  ay = convertRawAcceleration(ayRaw);
  az = convertRawAcceleration(azRaw);

  x = map(axRaw,-1023,1023,0,255);
  y = map(ayRaw,-1023,1023,0,255);
  z = map(azRaw,-1023,1023,0,255);
  
  // mostra valores mapeados em x,y e z
  Serial.print("a:t");
  Serial.print(x);
  Serial.print("t");
  Serial.print(y);
  Serial.print("t");
  Serial.print(z);
  Serial.println();
  colorWipe(strip.Color(x, y, z), 100); // Red
}

float convertRawAcceleration(int aRaw) {
  // since we are using 2G range
  // -2g maps to a raw value of -32768
  // +2g maps to a raw value of 32767
  
  float a = (aRaw * 2.0) / 32768.0;

  return a;
}
// Funcao para mostrar cores 
void colorWipe(uint32_t c, uint8_t wait) {
  for(uint16_t i=0; i<strip.numPixels(); i++) {
    strip.setPixelColor(i, c);
    strip.show();
    delay(wait);
  }
}

Em resumo, este sketch faz com que as cores primárias do led (vermelho, verde e azul) sejam variadas conforme mexemos a placa. Para o eixo X, variação do vermelho de 0 a 255. Eixo Y varia o verde e Z o azul.

Agora, basta movimentar a placa e ver as cores mudando. E caso abrir o Serial Monitor, verá a variação dos eixos conforme movimento.

Medidas do acelerômetro no Serial Monitor

Espero que tenham gostado, foi uma demostração simples das muitas possibilidades desta placa Genuino 101. Caso queiram mais informações, acesse os links abaixo. Obrigada, até a próxima!

https://www.arduino.cc/en/Main/ArduinoBoard101

https://software.intel.com/en-us/articles/getting-to-know-the-arduino-101-platform

Gostou? Deixe seu comentário logo abaixo.

Faça seu comentário

Acesse sua conta e participe

3 Comentários

  1. Ótimo post, parabéns Gedeane!