LusoRobótica - Robótica em Português

Sistemas específicos => Arduino / AVR => Tópico iniciado por: iMartins87 em 26 de Fevereiro de 2011, 14:18

Título: Ligar leds por porta serie no arduino
Enviado por: iMartins87 em 26 de Fevereiro de 2011, 14:18
Olá pessoal,

Hoje voltei a pegar no arduino, e comecei por fazer um pequeno programa em WPF C# que comunica com o arduino pela porta serie.
A aplicação contem dois botões e consoante os click nos botões envia a valores para o Arduino.

Com um só botão e com o seguinte código no arduino, tudo funciona bem.

Citar
const int ledPin = 13;
int luzon = 0;

void setup() {
pinMode(ledPin, OUTPUT);
Serial.begin(9600);
}

void loop(){
  
if (Serial.available())
{
if(Serial.read()==48) //0
{luzon = 0;}
else
{luzon=1;}
}

if(luzon == 0)
{digitalWrite(ledPin, LOW);}
else
{digitalWrite(ledPin, HIGH);}
 
}


Mas, de forma a aumentar o numero de led's fiz este codigo que não consegue ligar nenhum dos led's.

Citar
const int ledPin = 13;
const int ledPin2 = 12;
int luzon = 0;
int luzon2 = 0;
 
void setup() {
pinMode(ledPin, OUTPUT);
pinMode(ledPin2, OUTPUT);
Serial.begin(9600);
}

void loop(){

if (Serial.available())
{
if(Serial.read()==48) //0
{ luzon = 0; }
else if (Serial.read()==49) //1
{ luzon = 1; }
else if (Serial.read()==50) //2
{ luzon2 = 0; }
else if (Serial.read()==51) //3
{ luzon2 = 1; }
else
{ luzon = 0; luzon2 = 0;}
}

if(luzon == 0)
{ digitalWrite(ledPin, LOW); }
else if (luzon == 1)
{ digitalWrite(ledPin, HIGH); }
else if (luzon2 == 0)
{ digitalWrite(ledPin2, LOW); }
else if (luzon2 == 1)
{ digitalWrite(ledPin2, HIGH); }
else
{ digitalWrite(ledPin, LOW);
  digitalWrite(ledPin2, LOW);}
  
}


Alguém me pode ajudar e explicar o que estou a fazer mal?

Cumprimentos
Título: Re: Ligar leds por porta serie no arduino
Enviado por: GnGz em 26 de Fevereiro de 2011, 15:22
No primeiro exemplo sem enviares qualquer numero menos 0 ele fica em high e se enviares 0 ele não fica a low...

Para o segundo vê isto:
Citar
const int ledPin = 13;
const int ledPin2 = 12;
int luzon = 0;

 
void setup() {
pinMode(ledPin, OUTPUT);
pinMode(ledPin2, OUTPUT);
Serial.begin(9600);
}

void loop(){

if (Serial.available() > 0)// Alteração n1
{
luzon = Serial.read();
}

if(luzon == '0')
{ digitalWrite(ledPin, LOW); }
else if (luzon == '1')
{ digitalWrite(ledPin, HIGH); }
else if (luzon == '2')
{ digitalWrite(ledPin2, LOW); }
else if (luzon == '3')
{ digitalWrite(ledPin2, HIGH); }

  // Limpei codigo!
}


E se quiseres receber o estado dos portos por serial:
Citar
const int ledPin = 13;
const int ledPin2 = 12;
int luzon = 0;

 
void setup() {
pinMode(ledPin, OUTPUT);
pinMode(ledPin2, OUTPUT);
Serial.begin(9600);
}

void loop(){

if (Serial.available() > 0)// Alteração n1
{
luzon = Serial.read();
}

if(luzon == '0')
{ digitalWrite(ledPin, LOW);
Serial.println("Pino 13 a Low");}
else if (luzon == '1')
{ digitalWrite(ledPin, HIGH);
Serial.println("Pino 13 a High");}
else if (luzon == '2')
{ digitalWrite(ledPin2, LOW);
Serial.println("Pino 12 a Low");}
else if (luzon == '3')
{ digitalWrite(ledPin2, HIGH);
Serial.println("Pino 12 a High");}

  // Limpei codigo!
}


Título: Re: Ligar leds por porta serie no arduino
Enviado por: iMartins87 em 26 de Fevereiro de 2011, 16:39
Obrigado pelo esclarecimento.
Já esta a funcionar correctamente.

Cumprimentos
Título: Re: Ligar leds por porta serie no arduino
Enviado por: GnGz em 26 de Fevereiro de 2011, 16:41
De nada , mais duvidas não hesites?

:)
Título: Re: Ligar leds por porta serie no arduino
Enviado por: Njay em 27 de Fevereiro de 2011, 00:47
Obrigado pelo esclarecimento.
Já esta a funcionar correctamente.

E percebeste exactamente pq é que não funcionava?
Título: Re: Ligar leds por porta serie no arduino
Enviado por: iMartins87 em 27 de Fevereiro de 2011, 02:12
E percebeste exactamente pq é que não funcionava?

Eu penso que sim, em primeiro lugar eu deveria atribuir o valor lido na porta serie a uma variável, e o erro mais grave no meu codigo era a cadeia de "else if" com variáveis diferentes, ou seja, eu tinha isto:

Citar
if(luzon == 0)
{ digitalWrite(ledPin, LOW); }
else if (luzon == 1)
{ digitalWrite(ledPin, HIGH); }
else if (luzon2 == 0)
{ digitalWrite(ledPin2, LOW); }
else if (luzon2 == 1)
{ digitalWrite(ledPin2, HIGH); }
else
{ digitalWrite(ledPin, LOW);
  digitalWrite(ledPin2, LOW);}


e neste caso ele nunca iria passar do primeiro "else if" porque aquela variável só podia ter dois valores, 0 ou 1, e isso são uma das duas primeiras condições.

Para o código que eu tinha ficar correcto teria de ser corrigido e ficar da seguinte forma:

Citar
const int ledPin = 13;
const int ledPin2 = 12;
int luzon = 0;
int luzon2 = 0;
int valor_serial_read;
 
void setup() {
pinMode(ledPin, OUTPUT);
pinMode(ledPin2, OUTPUT);
Serial.begin(9600);
}

void loop(){

if (Serial.available())
{
valor_serial_read = Serial.read();

if(valor_serial_read ==48) //0
{ luzon = 0; }
else if (valor_serial_read ==49) //1
{ luzon = 1; }
else if (valor_serial_read ==50) //2
{ luzon2 = 0; }
else if (valor_serial_read ==51) //3
{ luzon2 = 1; }
}

if(luzon == 0)
{ digitalWrite(ledPin, LOW); }
else if (luzon == 1)
{ digitalWrite(ledPin, HIGH); }

if (luzon2 == 0)
{ digitalWrite(ledPin2, LOW); }
else if (luzon2 == 1)
{ digitalWrite(ledPin2, HIGH); }
 
}


Mas o código que o GnGz fez está bem mais simples.
Corrigiam me se disse alguma coisa mal, quererá dizer que não fiquei a perceber o erro!

Cumprimentos