collapse

* Links de Robótica

* Posts Recentes

URGENTE - display de 7 segmentos com backpack por helderjsd
[Hoje às 12:30]


Preços e fabricantes de pcb por Sérgio_Sena
[Ontem às 10:20]


Palavras Cruzadas por Njay
[Ontem às 02:24]


Isaac Asimov - I, Robot por senso
[18 de Setembro de 2017, 03:41]


Apresentação por TigPT
[17 de Setembro de 2017, 07:31]


ic SL440 da Plessey? por senso
[16 de Setembro de 2017, 13:11]


Compra Colectiva RS-Amidata por brunus
[15 de Setembro de 2017, 22:31]


Ideias para construir um quadrúpede simples por zordlyon
[15 de Setembro de 2017, 10:18]


Preparar bancada de testes por jm_araujo
[14 de Setembro de 2017, 10:24]


Mitos: mudança da ilumação tradicional p/ iluminação a LEDs? por LVirtual
[14 de Setembro de 2017, 07:46]

Autor Tópico: Ligar leds por porta serie no arduino  (Lida 1429 vezes)

0 Membros e 1 Visitante estão a ver este tópico.

Offline iMartins87

  • Mini Robot
  • *
  • Mensagens: 39
Ligar leds por porta serie no arduino
« 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

Offline GnGz

  • Mini Robot
  • *
  • Mensagens: 665
Re: Ligar leds por porta serie no arduino
« Responder #1 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!
}


« Última modificação: 26 de Fevereiro de 2011, 15:32 por GnGz »

Offline iMartins87

  • Mini Robot
  • *
  • Mensagens: 39
Re: Ligar leds por porta serie no arduino
« Responder #2 em: 26 de Fevereiro de 2011, 16:39 »
Obrigado pelo esclarecimento.
Já esta a funcionar correctamente.

Cumprimentos

Offline GnGz

  • Mini Robot
  • *
  • Mensagens: 665
Re: Ligar leds por porta serie no arduino
« Responder #3 em: 26 de Fevereiro de 2011, 16:41 »
De nada , mais duvidas não hesites?

:)

Offline Njay

  • Mini Robot
  • *
  • Mensagens: 3.086
    • Tróniquices
Re: Ligar leds por porta serie no arduino
« Responder #4 em: 27 de Fevereiro de 2011, 00:47 »
Obrigado pelo esclarecimento.
Já esta a funcionar correctamente.

E percebeste exactamente pq é que não funcionava?

Offline iMartins87

  • Mini Robot
  • *
  • Mensagens: 39
Re: Ligar leds por porta serie no arduino
« Responder #5 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