Blog

// Veja mais...
Brincando com o Arduino : Led RGB e Display LCD
7


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;
		}
	}
}
// |

Discussion (7) Comment


  1. 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.
    ;-)


  2. 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.
    :)


  3. TanakaVisitor

    e nerd que é nerd capricha até no video demo…hehehe


  4. 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


  5. Fabio MoreiraVisitor

    Maneiro…
    Daqui a pouco vc ta fazendo um Telao de LED como passatempo.

    Muito Legal.


  6. Pablo CanteroVisitor

    Me animou para comprar um desse para integrar com o Hudson (CI)

  7. Muito bom, o vídeo ficou muito massa…

    Tu é ferra !

    vlw..

 

Leave a Comment


Categorias

Newsletter

Últimos Tweets