imprimir

Comunicação pela porta serial


Através da porta serial podem-se enviar dados a partir do Arduino para outros dispositivos ou para uma máquina rodando PD, por exemplo. O cabo de comunicação serial é o mesmo usado para programar o Arduino a partir do computador. Para que sua função se estenda à comunicação durante o tempo de execução, é necesário antes de mais nada abrir a porta serial através do programa que carregamos no Arduino. Para isso, utiliza-se a função
beginSerial(19200);


Já que só precisamos rodar essa ordem uma vez, essa linha normalmente vai no bloco void setup(). O número que aparece entre parênteses indica a velocidade de transmissão. Na comunicação esse valor é ultra-relevante, pois todos os dispositivos que vão interagir devem ter a mesma velocidade para poder entender-se. 19200 é um valor padrão e é o que o Arduino tem por default ao iniciar.

Uma vez aberta a porta serial, você deve querer enviar logo ao computador os dados obtidos de um ou mais sensores. A função que envia um dado é
Serial.print(data);


Uma consulta à ArdunoReferencia? permitirá constatar que as funções print e println (println: mesma coisa que a anterior porém pulando uma linha) têm a opção de um modificador que pode ser de vários tipos:

Serial.print(data, DEC); // decimal em ASCII
Serial.print(data, HEX); // hexadecimal em ASCII
Serial.print(data, OCT); // octal em ASCII
Serial.print(data, BIN); // binario em ASCII
Serial.print(data, BYTE); // um Byte

Como se pode ver, praticamente todos os modificadores, menos um, enviam mensagens em ASCII. Há uma explicação breve:

Series de pulsos

No modo mais simples e comum de comunicação serial (assincrônica, 8 bits, mais um bit de parada) envia-se sempre um byte, isto é, uma fila de 8 pulsos de voltagem entendida pela máquina como uma série de 8 (1s ou 0s):

O que se quer dizer aqui é que não importa qual modificador usemos, sempre esão sendo enviados bytes. A diferença está no que esses bytes representam e, no caso do Arduino, só existem duas alternativas: uma serie de caracteres ASCII ou um número.

Se o Arduino lê um sensor analógico valendo 65, o equivalente à serie binária 01000001 será enviado, conforme indicado no modificador, como em:

dado Modificador Envio (pulsos)

65 ---DEC---- (“6″ e “5″ ACIIs 54–55) 000110110–000110111
65 ---HEX---- (“4″ e “1″ ACIIs 52–49) 000110100–000110001
65 ---OCT---- (“1″, “0″ e “1″ ACIIs 49–48–49) 000110001–000110000–000110001
65 ---BIN---- (“0″,”1″,”0″,”0″,”0″,”0″,”0″y”1″ ACIIs 49–48–49–49–49–49–49–48) 000110000-…
65 ---BYTE--- 01000001

É importante lembrar aqui que o modificador BYTE permite o envio de informação mais simples (menos pulsos para a mesma quantidade de informação) o que implica maior velocidade na comunicação.

Exemplo simples

Enviar somente um dado através de um potenciômetro conectado ao pino 24 do atmega:


int potPin = 2;    
int ledPin = 13;   
int val = 0;       

void setup() {
  Serial.begin(9600);
  pinMode(ledPin, OUTPUT);
  digitalWrite(ledPin, HIGH);  // acende-se o ledPin, para saber quando o programa rodou
}

void loop() {
  val = analogRead(potPin);    // leitura do valor do pino do potenciômetro
  Serial.println(val);
}



Se não utilizarmos nenhum modificador para a função Serial.println, isso dá na mesma que usar o modificador DEC. Este não é o modo de transmissão mais eficente, e sim o mais fácil de se ler no mesmo Arduino. Ao rodar este programa podemos imediatamente abrir o monitor serial do software Arduino (último botão à direita) aparecerá o dado controlado pelo potenciômetro.

(fonte e mais detalhes sobre Arduino e Serial: taller.tagabot.org)


Links

Última alteração: 20/08/2007 às 04:40, por: glerm