LusoRobótica - Robótica em Português

Electrónica => Electrónica Geral => Tópico iniciado por: luisjustin em 29 de Junho de 2013, 06:05

Título: Preciso de ajuda, com erro no código de uma bobinadeira.
Enviado por: luisjustin em 29 de Junho de 2013, 06:05
Olá, venho pedir a ajuda de vocês sobre o código de uma bobinadeira que comecei a criar criar apenas o setup dela, mas como posso fazer para que isto funcione ele faça cada pergunta de uma vez e aguarde a resposta, geralmente em outras linguagens eu sempre fiz assim.

Código: [Seleccione]
int M1A = 5;
int M1B = 6;
int M2A = 9;
int M2B = 10;
int ConfigStep = 0;
int Mm = 0;
int Voltas = 0;
int Speed = 0;

void setup(){
  Serial.begin(9600);
}

void loop(){
  if(Serial.available()){
   
    if(ConfigStep == 0){
      Serial.write("Insira a espessura do cabo em mm.");
      if(Serial.read()){
        Mm = (int)Serial.read();
        Serial.write("|OK|");
        delay(100);
        ConfigStep = 1;
      }
    }
   
    if(ConfigStep == 1){
      Serial.write("Insira quantas voltas a bobina vai ter.");
      if(Serial.read()){
        Voltas = (int)Serial.read();
        Serial.write("|OK|");
        delay(100);
        ConfigStep = 2;
      }
    }
   
    if(ConfigStep == 2){
      Serial.write("Insira a velocidade desejada velocidade default 1, maxima 10");
      if(Serial.read()){
        Speed = (int)Serial.read();
        Serial.write("|OK|");
        delay(100);
        ConfigStep = 3;
      }
    }
   
    if(ConfigStep == 3){
      Serial.write("Configuracao Salva com sucesso, por favor verificar e gitar |OK|");
      Serial.write("Bitola do Fio: "+Mm);
      Serial.write("Numero de Voltas: "+Voltas);
      Serial.write("Velocidade de Giro: "+Speed);
      Serial.write("Digite |OK| para confirmar ou digite |R| para reconfigurar.");
      if(Serial.read() == 'OK'){
        Serial.write("Iniciando Montagem da Bobina.");
      }
      if(Serial.read() == 'R'){
        Serial.write("Reiniciando sitema para reconfigurar.");
        delay(500);
      }
    }
   
  }
}

Se poderem ajudar eu agradeço.
Título: Re: Preciso de ajuda, com erro no código de uma bobinadeira.
Enviado por: metRo_ em 29 de Junho de 2013, 10:27
Código: [Seleccione]
if(Serial.read()){Quando fazes isto o microcontrolador não espera que o utilizar escreva, apenas verifica se já esvreu ou não, mas isto acontece us a seguir a teres pedido para ele escrever.

Depois tens outro problema que é o facto de que isto
Código: [Seleccione]
Serial.write("Insira a espessura do cabo em mm."); só é executado após  utilizador escrever alguma coisa na consola até lá fica sem saber o que fazer.

Código: [Seleccione]
Serial.write("Insira a espessura do cabo em mm.");
ConfigStep = 0;

if(Serial.available()){
   
    if(ConfigStep == 0){
        Mm = (int)Serial.read();
        Serial.write("|OK|");
        delay(100);
        Serial.write("Insira quantas voltas a bobina vai ter.");
        ConfigStep = 1;
    }else if(ConfigStep == 1){
        Voltas = (int)Serial.read();
        Serial.write("|OK|");
        delay(100);
        ConfigStep = 2;
    }
    ...
    ...
    ...

}
Título: Re: Preciso de ajuda, com erro no código de uma bobinadeira.
Enviado por: luisjustin em 29 de Junho de 2013, 16:01
Você me ajudou bastante mas só 1 duvida quando eu envio o comando parece que ele não esta salvando.
E quando ele vai exibir a configuração para revisar ele mostra -1 as vezes +10 mas números que não coloquei.
Pode me ajudar ?
Código: [Seleccione]
int M1A = 5;
int M1B = 6;
int M2A = 9;
int M2B = 10;
int ConfigStep = 0;
int Mm = 0;
int Voltas = 0;
int Speed = 0;

void setup(){
  Serial.begin(9600);
}

void loop(){
  if(Serial.available()){
   
    if(ConfigStep == 0){
      Serial.write("Insira a espessura do cabo em mm.");
      if(Serial.read()){
        Mm = (int)Serial.read();
        Serial.println("|OK|");
        delay(100);
        ConfigStep = 1;
        delay(100);
      }
    }else if(ConfigStep == 1){
      Serial.write("Insira quantas voltas a bobina vai ter.");
      if(Serial.read()){
        Voltas = (int)Serial.read();
        Serial.println("|OK|");
        delay(100);
        ConfigStep = 2;
        delay(100);
      }
    }else if(ConfigStep == 2){
      Serial.write("Insira a velocidade desejada velocidade default 1, maxima 10");
      if(Serial.read()){
        Speed = (int)Serial.read();
        Serial.println("|OK|");
        delay(100);
        ConfigStep = 3;
        delay(100);
      }
    }else if(ConfigStep == 3){
      Serial.println("Configuracao Salva com sucesso, por favor verificar e gitar |OK|");
      Serial.println("Bitola do Fio: ");
      Serial.print(Mm);
      Serial.println("Numero de Voltas: ");
      Serial.print(Voltas);
      Serial.println("Velocidade de Giro: ");
      Serial.print(Speed);
      Serial.println("Digite |OK| para confirmar ou digite |R| para reconfigurar.");
      if(Serial.read() == 'K'){
        Serial.println("Iniciando Montagem da Bobina.");
        ConfigStep = 4;
        delay(100);
      }
      if(Serial.read() == 'R'){
        Serial.println("Reiniciando sitema para reconfigurar.");
        delay(500);
      }
    }else{
      //Inicia a criacao da bobina(Vou implantar o codigo)
    }
   
  }
}
Título: Re: Preciso de ajuda, com erro no código de uma bobinadeira.
Enviado por: Njay em 29 de Junho de 2013, 16:08
Luis, o Serial.read não funciona como estás a pensar, ele só lê um caracter e em ASCII. Dá uma olhada na documentação. Tens que fazer uma função para ler os vários caracteres ASCII de um número (até, por exemplo, ser lido um "enter" do utilizador) e depois converter isso para um int com atoi() ou para float com atof().
Título: Re: Preciso de ajuda, com erro no código de uma bobinadeira.
Enviado por: luisjustin em 29 de Junho de 2013, 16:53
Sim, concordo mas eu já fiz um sistema que identificava pelo menos os números.
Título: Re: Preciso de ajuda, com erro no código de uma bobinadeira.
Enviado por: Njay em 29 de Junho de 2013, 18:12
Se queres identificar só um número de 0 a 9 é fácil,

int  num = Serial.read() - '0';

Agora para ler números maiores... terás que ir estudar primeiro :)
Título: Re: Preciso de ajuda, com erro no código de uma bobinadeira.
Enviado por: luisjustin em 30 de Junho de 2013, 00:00
Sim, mas eu testo com o numero de 1 a 5 e ele mostra um numero nada a ver.
Título: Re: Preciso de ajuda, com erro no código de uma bobinadeira.
Enviado por: senso em 30 de Junho de 2013, 00:21
Possivelmente dá-te qualquer coisa acima de 48, não é?
Estás a ler os valores do ascii, já te disseram o que tens de fazer.
Título: Re: Preciso de ajuda, com erro no código de uma bobinadeira.
Enviado por: tarquinio em 30 de Junho de 2013, 19:16
Para ler numeros como strings vindas do serial eu costuma usar uma função deste género:
Código: [Seleccione]
int readIntFromSerial()
{
    char buffer[12];
    byte pos = 0;
    int chr = Serial.read();
    while(chr==' ' || chr=='\r' || chr=='\n' ) chr = Serial.read();
    while(chr!=-1 && chr!=' ' && chr!='\r' && chr!='\n' )
    {
        buffer[pos++] = chr;
        chr = Serial.read();
        if (chr==-1)
        {
            delay(5);
            chr = Serial.read();           
        }
    }
    buffer[pos] = 0;
    return atoi(buffer);   
}

Título: Re: Preciso de ajuda, com erro no código de uma bobinadeira.
Enviado por: samc em 30 de Junho de 2013, 19:38
Quando é para ler apenas um valor numérico (exemplo: nível PWM de 8bits para o analogWrite 0 a 255), basta usar o parseInt, não há necessidade de complicar. Este código corre bem no serial monitor da IDE do Arduino. Assim que introduzo o valor numérico e carrego em ENTER, o valor é logo associado à variável, exemplo de parte do código em que uso isto:
Código: [Seleccione]
if (Serial.available()>0) {
    x2 = Serial.parseInt();
    if (x2 != x){
      Serial.println(x2);
      x=x2;
    }
  }
Título: Re: Preciso de ajuda, com erro no código de uma bobinadeira.
Enviado por: tarquinio em 30 de Junho de 2013, 20:36
Sim é verdade não costumo usar essa função por outras razões, às vezes até me esqueço que ela existe :P Mas para o caso actual server perfeitamente :)
Já agora, podes fazer tb
Código: [Seleccione]
Serial.setTimeout(10);
Para o programa não ter de esperar 1 segundo entre escreveres um valor e ele ser lido pelo arduino