LED RGB com Arduino e Android

RGB Android
 Arduino e Android

Arduino e Android

Trocar cor do LED RGB pelo celular com Arduino e Android

É isso ai, LED RGB com Arduino e Android. Apertou um pouco, mas nada absurdo. Só que devido aos novos conceitos que entrarão, esse post será um pouco longo.
O ambiente foi montado com um Arduino Uno, um ethernet shield, um celular Milestone (sistema Android). O Arduino foi ligado a um roteador wireless via RJ45 enquanto o celular se conectou sem fio.
O software para seleção de cor que desenvolvi para o Android foi feito em:
QT ! Isso mesmo! QT utilizando o Necessitas. É um projeto demasiado recente, porém de suportável instabilidade. Tive alguns problemas estranho, como por exemplo, na criação de uma segunda thread criada somente para utilização de mutex (que no final não foi utilizado). Outro problema que achei muito estranho foi a impossibilidade de criar sinais, o que praticamente inviabilizou a criação da thead que controla a conexão UDP.
Se você pretender desenvolver em Qt para Android, deve passar pelo Market e instalar o ‘Ministro’. Sempre que for instalar algum programa em Qt, ele fará o download das bibliotecas necessárias, caso não esteja no sistema.

Deixando de prosa, vamos ao ambiente.
Anteriormente utilizei o pino 9, 10 e 11 para a conexão do LED RGB, porém minha controladora ethernet possui um leitor de micro-sd que se utiliza do pino 10 e 11, então os pinos de OUTPUT passaram a ser os seguintes:
RED – pino 2
GREEN – pino 3
BLUE – pino 9
O terra pode ser qualquer um (óbvio).

Programação

 

#include <SPI.h>// necessario por qualquer versao acima de 0018
#include <Ethernet.h>// modulo de rede
#include <UDP.h>// UDP library from: bjoern@cs.stanford.edu 12/30/2008

#define START_COLOR_CHAR '^' //nao utilizado
#define END_COLOR_CHAR '$' //nao utilizado
#define COLOR_SIZE 8 //nao utilizado
#define PIN_RED 2
#define PIN_GREEN 3
#define PIN_BLUE 9

char serialMessage[COLOR_SIZE]; //nao utilizado - eliminei toda a comunicacao serial de outro teste
unsigned int readChar;
unsigned int count;
unsigned long color;
unsigned int r;
unsigned int g;
unsigned int b;
boolean readingSerial;

// Nao lhe fara mal algum manter o MAC atual, porem se quiser, mude

static uint8_t mac[6] = {0x54,0x55,0x58,0x10,0x00,0x24};
//IP que utilizei para o Arduino na minha rede
byte ip[] = {
192,168,1,10 };

// int para inteiro, como explicado anteriormente.
//Quando se quer um valor nao assinalado, utiliza-se 'unsigned int' para criar a variavel
unsigned int localPort = 8888; // local port to listen on

//as proximas duas variaveis sao ajustadas quando um pácote eh recebido
//Originador do pacote. Como UDP nao tem confirmacao, tanto faz.
byte remoteIp[] = {192,168,1,1};
unsigned int remotePort = 8888; // Porta remota. O mesmo caso anterior

// buffer para receber e enviar dados
char packetBuffer[UDP_TX_PACKET_MAX_SIZE]; //buffer to hold incoming packet,
char ReplyBuffer[] = "acknowledged"; // a string to send back. Para esse teste nao importa

/*unsigned long eh para um inteiro maior que o normal. Como as cores possiveis
para RGB sao de 255^3 ou 16.581.375 possibilidades, devemos utilizar esse tipo de variavel para
que nao haja pontuacao.
*/
unsigned long int valor;

void setup() {
//comentarios basicos deixarei em ingles
// start the Ethernet and UDP:
Ethernet.begin(mac,ip);
Udp.begin(localPort);
Serial.begin(9600); //nao utilizado

readingSerial = false; //nao utilizado
}

void loop() {

// if there's data available, read a packet

int packetSize = Udp.available(); // note that this includes the UDP header
if(packetSize)
{
packetSize = packetSize - 8; // subtract the 8 byte header
Serial.print("Received packet of size ");
Serial.println(packetSize);

// read the packet into packetBufffer and get the senders IP addr and port number
Udp.readPacket(packetBuffer,UDP_TX_PACKET_MAX_SIZE, remoteIp, remotePort);
Serial.println("Contents:");
Serial.println(packetBuffer);

setColor(packetBuffer);

Serial.println("enviando...");
Udp.sendPacket( ReplyBuffer, remoteIp, remotePort);
Serial.println("enviado!");
}
delay(1000);
}

//encerrada a parte de rede, vamos ao controle RGB
void setColor(char* value)
{
// Convert Char* to Long
color = atol(value);

// Extract RGB
r = color >> 16 & 0xFF;
g = color >> 8 & 0xFF;
b = color >> 0 & 0xFF;

//acima, utilizamos o deslocamento de bits. Leia o post anterior para ter referencias.

// Send values to analog pins
analogWrite(PIN_RED, r);
analogWrite(PIN_GREEN, g);
analogWrite(PIN_BLUE, b);
}

Com basicamente isso, o LED RGB pode ser controlado por rede com Arduino e Android. A principio pode lhe parecer um código demasiadamente grande, mas na verdade é muito básico, tirado dos próprios exemplos; tanto que nem quis apagar variáveis desnecessárias e traduzir strings para que você possa perceber que o trabalho não é tão intenso na implementação de uma funcionalidade em Arduino.

No Qt o trabalho foi um pouco maior e não vou entrar em detalhes pois se realmente for iniciante, por certo isso te desmotivaria. O código foi feito ao acaso, sem planejamento e com diversos percalços que me levaram a perder a organização, mas como o programa foi feito para demonstração apenas, disponibilizo o código no estado em que está nesse link.

O vídeo desse exemplo:

Não é um tutorial muito didático, mas ainda temos o que fazer com LED RGB e sensor de temperatura, então, entraremos em detalhes no próximo tutorial, esse fica só pra diversão.

(link sugerido: controle de LED RGB com Arduino e Asterisk)

Inscreva-se no nosso newsletter, alí em cima à direita e receba novos posts por email.

Siga-nos no Do bit Ao Byte no Facebook.

Prefere twitter? @DobitAoByte.

Inscreva-se no nosso canal Do bit Ao Byte Brasil no YouTube.

Nossos grupos:

Arduino BR – https://www.facebook.com/groups/microcontroladorarduinobr/
Raspberry Pi BR – https://www.facebook.com/groups/raspberrybr/
Orange Pi BR – https://www.facebook.com/groups/OrangePiBR/
Odroid BR – https://www.facebook.com/groups/odroidBR/
Sistemas Embarcados BR – https://www.facebook.com/groups/SistemasEmbarcadosBR/
MIPS BR – https://www.facebook.com/groups/MIPSBR/
Do Bit ao Byte – https://www.facebook.com/groups/dobitaobyte/

Próximo post a caminho!

 

One comment

Deixe uma resposta