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!
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.
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.
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).
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.
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.
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.
Muito legal!!
Parabens Gedeane!
Ótimo post, parabéns Gedeane!