Arquivo do mês de setembro 2009

 
 

Brincando com o Arduino : Led RGB e Display LCD

Arduino RGB LED + LCD Display

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

Não nasci para blogar

Screen shot 2009-09-12 at 10.29.42 PM.png

Pois é, eu tento, tento, mas não consigo me organizar e engajar para escrever algo decente aqui no blog. O pior é que tenho vontade de compartilhar um montão de experiências legais que tenho vivido nos últimos anos, mas quando tento encarar o Mars Edit para escrever algo, logo me deparo com novas idéias em minha cabeça e em minutos estou codando programando mais um pouco ou viajando em algum tipo de informação pela rede. Acaba que a nova idéia ou assunto de pesquisa fica tão excitante que o que eu antes cogitava escrever torna-se sem graça e enfadonho.

A coisa é até irônica. Às vezes me chamam para participar de algum evento como um “blogueiro de sucesso”. Um dia ao lado do Edney, outro ao lado da MariMoon e outro do Juliano Spyer. Chega a ser constrangedor, pois tenho que me apresentar já me desculpando por ser um “blogueiro mequetrefe”.

Mas no último feriado acho que a ironia chegou a seu limite máximo. Meu cunhado, um professor de direito, advogado, promotor, escritor, super inteligente, que se considera um “muggle” da Internet e que há até pouco tempo atrás (meses) tinha um desktop bem surrado em casa conectado à rede através de um modem de linha discada que não passava dos 33.6Kbps, me pediu para ajudá-lo a criar um blog. O Machado viu o BlogBlogs nascer, me escutou explicar o que eram os blogs e a blogosfera várias vezes e sempre achou tudo muito interessante, mas nunca me passou pela cabeça que ele iria, algum dia, criar um blog. Bom, mas ele insistiu, estava lá em casa com um notebook novinho, modem 3G e todo animado para começar o seu blog. Baixei o WordPress MU, instalei num de meus servidores, criei o blog e expliquei como se faz para criar um post e para aprovar comentários. É um blog engraçado, com template padrão do WordPress, sem links nos posts, mas já deu para ver que temos um novo blogueiro no pedaço. Se passaram apenas alguns dias e já temos no Blog do Machado mais posts que fui capaz de escrever em um ano ou mais.

Com isto concluo que não nasci para blogar, mas talvez para codar um pouco e ajudar outras pessoas mais talentosas a compartilharem suas idéias com o mundo através da Internet. Continuarei tentando, só que agora sem peso na consciência. HeyHo!!!

Luz do Jardim

Teste da nova iPhone app do Wordpress. Close de um poste de iluminação do jardim de minha casa em Araguari.


Últimos Leitores

Ver todos no BlogBlogs | Controlar visibilidade

Destaques