Projeto

Geral

Perfil

Protocolo » Histórico » Versão 4

« Anterior - Versão 4/5 (diferença) - Próximo » - Versão atual
Joao Manuel Leite da Silva, 14/02/2013 23:13


Protocolo de comunicação (AINDA EM CONSTRUÇÃO)

O protocolo de comunicação definido para a comunicação entre robô e uma qualquer aplicação de controlo é baseado em dois tipos de mensagem: uma transmitida pelo robô para o controlador, outra transmitida pelo controlador para o robô.

Estas mensagens são na sua essência um fluxo de bytes, que têm que ser escritos de um lado e interpretados do outro em concordância. Foram definidos 3 bytes especias para que seja possível sincronizar os pacotes de dados:

  • 0x25 - Início de trama: o primeiro byte em qualquer mensagem, sinalizando o início de uma trama. É usado o valor 0x25 (carácter '%' na tabela ASCII)
  • 0x03 - Fim de trama: o último byte em qualquer mensagem, sinalizando o final de uma trama. É usado o valor 0x03 (carácter ETX na tabela ASCII)
  • 0x5C - Byte de escape: byte para retirar o significado especial ao seguinte, de forma a que o byte seguinte seja interpretado como dados. É usado o valor 0x5C (carácter '\' na tabela ASCII)
Assim, qualquer mensagem tem o formato:
0x25 ...(data bytes) Checksum 0x03

No entanto, qualquer valor do bloco de dados da mensagem pode ser igual a um dos bytes especiais. Nesse caso é necessário fazer o escape desse valor para que seja interpretado como dados. Nesse caso, é necessário adicionar o byte de escape antes do byte de dados. É necessário fazer o excape a qualquer byte de dados que tenha o mesmo valor que um especial, incluindo ao próprio byte de escape.

No cálculo do Checksum NÃO se incluem os valores dos bytes de escape.
O checksum é calculado pela soma de todos os bytes úteis a enviar, truncada a 1 byte e transformada em complemento para dois.

A definição base da mensagem do controlador para o robô é a seguinte:
0x25 Lmotor Rmotor beaconMotor Checksum 0x03

Assim, o tamanho padrão desta mensagem é 6 bytes. No pior caso, se todos os bytes de dados tiverem o valor de um byte especial, ficará com 10 bytes.
Quanto aos dados, seus domínos e significados:

  • Lmotor, Rmotor: valores no intervalo [-100, 100], indicando a percentagem de velocidade a aplicar à roda correspondente. O sinal define o sentido de rotação (para a frente ou para trás).
  • beaconMotor: comando para a posição do receptor do farol. O valor está no intervalo [-15, 15], onde -15 é aproximadamente 180º para a esquerda e 15 é aproximadamente 180º para a direita. Este valor terá que sofrer um shift à esquerda de uma posição, para que o bit menos significativo seja usado como flag de controlo:
    • 0 significa que não há envio de posição, o receptor fará automaticamente 1 varrimento a cada 4 segundos.
    • 1 significa que o robô deverá colocar o receptor no valor que está a ser enviado neste byte.

(exemplo brevemente)

A definição base da mensagem do robô para o controlador é a seguinte:
0x25 Lsensor Csensor Rsensor Ground Beacon Bat xOdoHigh xOdoLow yOdoHigh yOdoLow thetaOdoHigh thetaOdoLow Checksum 0x03

O tamanho padrão desta mensagem é 15 bytes. No pior caso, terá 28 bytes.
Os dados, seus domínios e interpretação:

  • Lsensor, Csensor, Rsensor: valores sem sinal em toda a gama do byte [0; 255] que representam aproximadamente a tensão lida pelos sensores de distância frontais esquerdo, central e direito respectivamente. O valor de tensão é multiplicado por 100. Os valores enviados pelo robô são na verdade apenas os 8 bits mais significativos, dos 10 que os sensores utilizam. A aproximação da distância é feita de acordo com as características apresentadas no datasheet dos sensores (nome do modelo)
  • Ground: valores dos sensores de "detecção de chão"- Estes são, na plataforma actual, 5 sensores de reflexão, que têm o valor 0 quando estão sobre uma superfície reflectora (branco) e 1 quando estão sobre uma superfície não reflectora (preto). Os valores dos 5 sensores são os bits menos significativos deste byte, sendo o menos significativo o sensor da direita.
  • Beacon: De forma semelhante ao comando do receptor do farol, este valor está no mesmo intervalo de [-15; 15]. Como no comando, este valor sofreu um shift à esquerda e o bit menos significativo serve para sinalizar se o farol foi detectado nesta posição (1) ou não (0).
  • Bat: Este byte é um valor sem sinal que indica a tensão da bateria, uma vez mais multiplicado por 100.
  • ...

(exemplo brevemente)