LusoRobótica - Robótica em Português

Discussão Geral => Mercado LusoRobótica => Compra-se => Tópico iniciado por: tgferreira em 05 de Maio de 2012, 14:48

Título: ["Comprado"] Ajuda em C++ (Arduino) +/-20 Linhas de código!
Enviado por: tgferreira em 05 de Maio de 2012, 14:48
Boas,

Compro a ajuda de alguém que me ensine a fazer mais ou menos 20 linhas de código.

O código é para receber uma string de 4 caracteres com a possibilidade de ter um caracter inicial/final, e comparar essa string com código já pré-definido.

Explico melhor a quem estiver interessado!

Contactem-me preferencialmente por e-mail: tg@tgferreira.com
Podem sempre usar PM.

URGENTE!!!


Cumprimentos,
Tiago Ferreira.
Título: Re: [Compro] Ajuda em C++ (Arduino) +/-20 Linhas de código!
Enviado por: TigPT em 05 de Maio de 2012, 14:57
Por estas bandas deves de ter mais sucesso a pedir ajuda do que a comprar.
Título: Re: [Compro] Ajuda em C++ (Arduino) +/-20 Linhas de código!
Enviado por: GnGz em 05 de Maio de 2012, 15:12
E que tal explicar já no tópico, e concordo com o tigpt : tens mais sucesso em pedir ajuda do que comprar.
Título: Re: [Compro] Ajuda em C++ (Arduino) +/-20 Linhas de código!
Enviado por: tgferreira em 05 de Maio de 2012, 15:29
Boas,

Sim, têm razão. Aqui sou capaz de ter bem mais sorte a pedir. No entanto, caso alguém ache que deve ser remunerado por me ensinar (e como o desespero já é muito) não me importo de o aceitar.

Então vou expor a situação:

Eu tenho um Arduino que vai estar ligado a um router, e programado para:
Recebe "a", faz x, recebe "b", faz y. No entanto, e como eu vou estar a receber strings de informação vindas do router que não me interessam vou ter que alterar o código. Isto é: recebes "aaaa", fazes x, recebes "bbbb", fazes y. E é aqui que começa o meu problema...

Tenho um tópico no fórum Arduino onde provavelmente até já me responderam, mas pela minha falta de conhecimentos em programação ainda não percebi.

Tópico: http://arduino.cc/forum/index.php/topic,104306.0.html (http://arduino.cc/forum/index.php/topic,104306.0.html)

Eles lá sugeriram usar caracteres de início de envio de packet e de fim, e até puseram código. Mas nesse código, onde exactamente é que ponho os comandos a executar? E como comparo as strings?

Alguém me pode ensinar a fazer? (preciso mesmo de entender uma vez que isto é para extender a coisas mais complexas (controlo total de robot)).

Muito obrigado desde já,

Tiago Ferreira.
Título: Re: [Compro] Ajuda em C++ (Arduino) +/-20 Linhas de código!
Enviado por: msr em 05 de Maio de 2012, 16:01
Se compreendi bem a tua situação, o teu problema está na sincronização dos dados. Isto é, o Arduino tem que saber quando/onde começa a mensagem.

Existem várias maneiras de fazer isso, uma delas, e simples, é adicionares uma sequência de bytes no inicio, por exemplo, "0x00 0xFF" (hexadecimal) que indiquem "início de mensagem", e no Arduino detectas essa sequência. No resto da mensagem tens que garantir que não se repete essa sequência.

Ficas com algo deste género:

<0x00> <0xFF> <data0> <data1> <data2> ... etc

No caso concreto que referes, e tendo em conta que '0' e '1' em hexadecimal são 0x30 e 031 respectivamente (vê uma tabela ASCII), as mensagens a enviar teriam este aspecto:
0x00 0xFF 0x30
0x00 0xFF 0x31

No Arduino terás algo deste género (é só um esboço):
Código: [Seleccione]
// inicializar lastbyte com um valor != 0
// int lastbyte = 0xFF;

byte = serial.read();
if(lastbyte == 0x00 && byte == 0xFF)
{
  comando = serial.read();
  switch(comando)
  {
  case '0':
     // desliga led
     break;
  case '1':
     // liga led
     break;
  default: ;
  }
}
lastbyte = byte;
Título: Re: [Compro] Ajuda em C++ (Arduino) +/-20 Linhas de código!
Enviado por: tgferreira em 05 de Maio de 2012, 19:43
Boas a todos!

Acabei por conseguir, graças à ajuda de dois amigos! Deixo aqui o código para verem e sugerirem alterações, ou para quem necessitar!

Código: [Seleccione]
#define SOP '<'
#define EOP '>'

bool started = false;
bool ended = false;

char inData[80];
byte index;

void setup()
{
   Serial.begin(57600);
   pinMode(13, OUTPUT);
   // Other stuff...
}

void loop()
{
  // Read all serial data available, as fast as possible
  while(Serial.available() > 0)
  {
    char inChar = Serial.read();
    if(inChar == SOP)
    {
       index = 0;
       inData[index] = '\0';
       started = true;
       ended = false;
    }
    else if(inChar == EOP)
    {
       ended = true;
       break;
    }
    else
    {
      if(index < 79)
      {
        inData[index] = inChar;
        index++;
        inData[index] = '\0';
      }
    }
  }




  if(started && ended)
  {
 

    if (strcmp(inData, "AAAA") == 0){
      digitalWrite(13, HIGH);    //x
    }
    else if (strcmp(inData, "BBBB") == 0){
      digitalWrite(13, LOW);
      //y
    }


    // Reset for the next packet
    started = false;
    ended = false;
    index = 0;
    inData[index] = '\0';
  }
}

MSR: Sim, era isso a que me referia, mas também à minha incompreensão do código! No entanto, muito obrigado pela tua participação!

Cumprimentos,
Tiago Ferreira.
Título: Re: ["Comprado"] Ajuda em C++ (Arduino) +/-20 Linhas de código!
Enviado por: iyahdub em 06 de Maio de 2012, 13:51
Tg, afinal o problema residia mais ou menos naquilo que eu pensei desde o inicio. Apesar de nao ter conhecimento suficiente para te ter ajudado. Mas aprendi bastante com a questao, para uma proxima vez, sem duvida.
Eu ja tinha nocao do problema de perifericos que nao computadores tem em manter uma comunicacao solida sem perca de data atraves da porta serie. Dai solucoes como clear to send e request to send, handshakes, etc.,
 Mas interessei-me porque sei que vou precisar de o fazer mais tarde tb com o arduino !!
Ja agora mantem-nos informados do resto do  projecto !!
Título: Re: ["Comprado"] Ajuda em C++ (Arduino) +/-20 Linhas de código!
Enviado por: zordlyon em 06 de Maio de 2012, 19:43
fico contente por teres conseguido Tiago... ;)

Título: Re: ["Comprado"] Ajuda em C++ (Arduino) +/-20 Linhas de código!
Enviado por: tgferreira em 06 de Maio de 2012, 22:43
Boas a todos!

Obrigado Zordlyon!

E Iyahdub, a continuação deste projecto encontra-se no "tópico oficial" :P

http://lusorobotica.com/index.php?topic=4039.0 (http://lusorobotica.com/index.php?topic=4039.0)


Vou postar lá um update ainda hoje, com fotos.

Cumprimentos,

Tiago Ferreira.