Há duas semanas me deu uma vontade de voltar a brincar com hardware. Sei lá, um pouco de nostalgia dos meus tempos de criança em Araguari, desmontando tudo o que passava pela minha frente, e também dos laboratórios de eletrônica da UNICAMP. O que sei é que passei horas namorando os sites sobre o Arduino, uma plataforma de prototipagem eletrônica open-source, e resolvi brincar com ele também.
Fiz uma compra básica de várias bugingangas na SparkFun Electronics: dois Arduinos (sim, tenho certeza que queimarei coisas no meio do caminho), breadboards, leds, resistores, fonte de alimentação, cabos, fios, matrizes de leds, shield ethernet e alguns sensores. Tudo necessário para várias horas de diversão e vários projetos interessantes. Na realidade, tudo isto foi meu presente de aniversário antecipado (special thanks para a Dona Isabella).
Em três dias tudo já estava em minha casa. Apesar de ter sido apenas minha primeira experiência com a SparkFun, posso dizer que o serviço foi nota 10, tudo foi enviado com muita rapidez, muito bem embalado e sem nenhum problema no pedido (e olha que eram várias peças diferentes). Um aviso importante é verificar bem os impostos que você deverá pagar, pois trata-se de mercadoria importada (cuidado para não ter surpresas).
Bom, com todo o material em mãos, era hora de fazer o Hello World do Arduino. Chega a ser frustrante de tão simples. Instale o Arduino IDE em seu computador, conectando-o através de um cabo USB e carregue seu primeiro sketch (sketches são os programas do Arduino). O site oficial do Arduino é a melhor fonte de referências para você começar a experimentar com o Arduino (comece aqui). Se você quiser nem precisa usar componentes externos para o Hello World (Led Blinking). No pino 13 do Arduino já existe um LED na placa e você pode controlá-lo com o sketch.
Mas fazer um LED piscar é muito pouco para o Arduino e, por isto, resolvi fazer um projeto um pouco mais complexo. No novo projeto resolvi controlar um LED RGB e usar um display LCD para apresentar os valores de cada componente de cor (Red, Green e Blue) que o LED RGB estivesse apresentando.
Bom, basicamente conectei o display LCD seguindo as instruções do exemplo do site do Arduino (Liquid Crystal Library – Hello World), mas usando os pinos 12 e 13, ao invés dos pinos 11 e 12. Fiz isto para liberar o pino 11, que é um dos pinos PWM, que usaria para controlar um dos componentes de cor do LED RGB.
Depois conectei cada um dos componentes de cor do LED RGB aos pinos 9, 10 e 11 do Arduino (todos eles são saídas PWM). Ahh, e também coloquei resistores de 220ohms entre cada um dos componentes de cor do led e os pinos do Arduino, de acordo com o que vi no exemplo de entrada e saída analógica (Analog I/O – Fading).
Com o circuido devidamente montado, era hora de montar o programa – sketch – para que o Arduino fizesse o que eu queria. Fiz um programa bem simples, basicamente um loop que faria o LED RGB variar de cor correndo todo o espectro de cores. Para isto, usei uma função que gerava os valores RGB para uma determinada cor, a partir dos valores HSB (Hue, Saturation & Brightness). Encontrei esta função – HSBtoRGB – no fórum do site do Arduino. A cada iteração do loop, onde o valor de Hue varia entre 0 e 255, programei o Arduino para imprimir no display LCD duas linhas de informações: na primeira o valor do Hue, e na segunda os valores de RGB equivalentes.
O resultado foi o seguinte:
O código do Sketch está aqui:
/* Led RGB e Display LCD : HSB loop Makes an RGB led to loop on all colors and displays the RGB values into an LCD display. The color loop is achieved varying the Hue value from 0 to 255 and converting the HSB value into RGB values. The circuit: * LCD RS pin to digital pin 13 * LCD Enable pin to digital pin 12 * LCD D4 pin to digital pin 5 * LCD D5 pin to digital pin 4 * LCD D6 pin to digital pin 3 * LCD D7 pin to digital pin 2 * 10K resistor: * ends to +5V and ground * wiper to LCD VO pin (pin 3) * RGB Led Red pin to PWM pin 9 * RGB Led Green pin to PWM pin 10 * RGB Led Blue pin to PWM pin 11 * RGB Led GND pin to GND * 220 resistors: * on each led's color pin Based on the Arduino Liquid Crystal tutorial and the HSBtoRGB function from Paul V. (Arduino Forum). * http://www.arduino.cc/en/Tutorial/LiquidCrystal * http://www.arduino.cc/cgi-bin/yabb2/YaBB.pl?num=1235225449/13#13 By Manoel Lemos http://manoellemos.com/category/arduino */ // include the library code: #include // initialize the library with the numbers of the interface pins LiquidCrystal lcd(13, 12, 5, 4, 3, 2); int rPin = 9; // Led Red pin connected to PWM pin 9 int gPin = 10; // Led Green pin connected to PWM pin 10 int bPin = 11; // Led Blue pin connected to PWM pin 11 unsigned int r, g, b; // RGB values from the HSBtoRGB function char rS[5], gS[5], bS[5], hS[5]; // RGB & Hue values as strings int hue; // Hue value void setup() { // set up the Arduino pins as PWM pinMode(gPin, OUTPUT); pinMode(bPin, OUTPUT); // set up the LCD's number of rows and columns: lcd.begin(16, 2); } void loop() { for(int hue = 0; hue <= 255; hue = hue + 4){ // calculate the RGB values for the current Hue value HSBToRGB( hue, 255, 255, &r, &g, &b ); // set the RGB Led to the calculated RGB values analogWrite(rPin, r); analogWrite(gPin, g); analogWrite(bPin, b); // convert the RGB and Hue values to strings itoa(hue,hS,10); itoa((int) r, rS, 10); itoa((int) g, gS, 10); itoa((int) b, bS, 10); // print the data on the display lcd.setCursor(0,0); lcd.print("Hue: "); lcd.print(hS); lcd.print(" "); lcd.setCursor(0,1); lcd.print("RGB: "); lcd.print(rS); lcd.print(","); lcd.print(gS); lcd.print(","); lcd.print(bS); lcd.print(" "); // wait delay(50); } } void HSBToRGB( unsigned int inHue, unsigned int inSaturation, unsigned int inBrightness, unsigned int *oR, unsigned int *oG, unsigned int *oB ) { if( inSaturation == 0 ) { // achromatic (grey) *oR = *oG = *oB = inBrightness; } else { unsigned int scaledHue = (inHue * 6); unsigned int sector = scaledHue >> 8; // sector 0 to 5 around the color wheel unsigned int offsetInSector = scaledHue - (sector << 8); // position within the sector unsigned int p = (inBrightness * ( 255 - inSaturation )) >> 8; unsigned int q = (inBrightness * ( 255 - ((inSaturation * offsetInSector) >> 8) )) >> 8; unsigned int t = (inBrightness * ( 255 - ((inSaturation * ( 255 - offsetInSector )) >> 8) )) >> 8; switch( sector ) { case 0: *oR = inBrightness; *oG = t; *oB = p; break; case 1: *oR = q; *oG = inBrightness; *oB = p; break; case 2: *oR = p; *oG = inBrightness; *oB = t; break; case 3: *oR = p; *oG = q; *oB = inBrightness; break; case 4: *oR = t; *oG = p; *oB = inBrightness; break; default: // case 5: *oR = inBrightness; *oG = p; *oB = q; break; } } }
Manoel NettoVisitor
Nerd que é nerd não pensa em hobbies como fotografia, basquete, coleção de selos … nas horas vagas ele faz programinhas para controlar um hardware montado por ele próprio.
Elderclei ReamiVisitor
Oh yeah!
Deu vontade de comprar um desses pra gastar a energia de programmer que está ficando represada no horário comercial. Trabalhar com protoboards e projetos de Xylinx era show de bola na faculdade – parece um hobby muito legal.
TanakaVisitor
e nerd que é nerd capricha até no video demo…hehehe
LeviVisitor
meu amigo, muito bom seus trabalhos
sou novato na area,
vc poderia me ajudar?
vc sabe como faço para ligar 2 ou mais display LCD
numa arduino??
sem mais, desde ja agradeço
Levi
Fabio MoreiraVisitor
Maneiro…
Daqui a pouco vc ta fazendo um Telao de LED como passatempo.
Muito Legal.
Pablo CanteroVisitor
Me animou para comprar um desse para integrar com o Hudson (CI)
João ConstantinoVisitor
Muito bom, o vídeo ficou muito massa…
Tu é ferra !
vlw..