collapse

* Links de Robótica

* Posts Recentes

Feira de electricidade e eletrónica por artur36
[Ontem às 23:07]


Power_OK Enermax por almamater
[Ontem às 12:10]


Recomendação de um opamp para um DAC r2r por jm_araujo
[23 de Novembro de 2017, 10:48]


RN42 e TP-Link MR3020 por doiga
[22 de Novembro de 2017, 19:22]


Ajuda Projecto IR / RF por senso
[22 de Novembro de 2017, 13:15]


Ideias para construir um quadrúpede simples por dropes
[21 de Novembro de 2017, 22:43]


Ajuda com TRIAC por senso
[17 de Novembro de 2017, 18:00]


TV LG White Screen por almamater
[15 de Novembro de 2017, 08:37]


Pergunta sobre prototipagem ( Pesquisa ) por luisjustin
[14 de Novembro de 2017, 23:22]


Medir Agua que está no Poço por Njay
[14 de Novembro de 2017, 13:28]

Autor Tópico: Preciso de ajuda, com erro no código de uma bobinadeira.  (Lida 2332 vezes)

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

Offline luisjustin

  • Mini Robot
  • *
  • Mensagens: 136
Preciso de ajuda, com erro no código de uma bobinadeira.
« 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.

Offline metRo_

  • Administrator
  • Mini Robot
  • *****
  • Mensagens: 3.727
Re: Preciso de ajuda, com erro no código de uma bobinadeira.
« Responder #1 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;
    }
    ...
    ...
    ...

}

Offline luisjustin

  • Mini Robot
  • *
  • Mensagens: 136
Re: Preciso de ajuda, com erro no código de uma bobinadeira.
« Responder #2 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)
    }
   
  }
}

Offline Njay

  • Mini Robot
  • *
  • Mensagens: 3.141
    • Tróniquices
Re: Preciso de ajuda, com erro no código de uma bobinadeira.
« Responder #3 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().

Offline luisjustin

  • Mini Robot
  • *
  • Mensagens: 136
Re: Preciso de ajuda, com erro no código de uma bobinadeira.
« Responder #4 em: 29 de Junho de 2013, 16:53 »
Sim, concordo mas eu já fiz um sistema que identificava pelo menos os números.

Offline Njay

  • Mini Robot
  • *
  • Mensagens: 3.141
    • Tróniquices
Re: Preciso de ajuda, com erro no código de uma bobinadeira.
« Responder #5 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 :)

Offline luisjustin

  • Mini Robot
  • *
  • Mensagens: 136
Re: Preciso de ajuda, com erro no código de uma bobinadeira.
« Responder #6 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.

Offline senso

  • Global Moderator
  • Mini Robot
  • *****
  • Mensagens: 9.402
  • Helpdesk do sitio
Re: Preciso de ajuda, com erro no código de uma bobinadeira.
« Responder #7 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.
Avr fanboy

Offline tarquinio

  • Mini Robot
  • *
  • Mensagens: 529
Re: Preciso de ajuda, com erro no código de uma bobinadeira.
« Responder #8 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);   
}


Offline samc

  • Mini Robot
  • *
  • Mensagens: 403
Re: Preciso de ajuda, com erro no código de uma bobinadeira.
« Responder #9 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;
    }
  }
« Última modificação: 30 de Junho de 2013, 19:40 por samc »

Offline tarquinio

  • Mini Robot
  • *
  • Mensagens: 529
Re: Preciso de ajuda, com erro no código de uma bobinadeira.
« Responder #10 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