MCO018703 2024 2 AULA05

De MediaWiki do Campus São José
Ir para navegação Ir para pesquisar

1 Comunicação Serial

OBJETIVOS

O aluno será capaz de:

  • Utilizar o monitor serial para enviar e receber informações do Arduino.


METODOLOGIA
A aula será expositiva e dialogada, utilizando apresentação de texto base na Internet, onde serão mostrados exemplos executados programas para programação de microcontroladores. Na prática faremos testes de comunicação serial com o Arduino através da porta USB.


INTRODUÇÃO
Apesar do Arduino ser gravado via porta USB, a comunicação se dá como serial padrão (USART). O ATmega328 permite comunicação serial no padrão UART TTL (5 V), que está disponível nos pinos digitais 0 (RX) e 1 (TX). Um chip FTDI FT232RL na placa encaminha esta comunicação serial através da USB e os drivers FTDI (incluído no software do Arduino) fornecem uma porta virtual para o software no computador. O software Arduino inclui um Monitor Serial que permite que dados simples de texto sejam enviados e recebidos à placa Arduino. Os LEDs RX e TX da placa piscam quando os dados estão sendo transferidos ao computador pelo chip FTDI e há conexão USB (mas não quando há comunicação serial pelos pinos 0 e 1). A biblioteca SoftwareSerial permite comunicação serial por quaisquer dos pinos digitais do Uno. O ATmega328 também oferece suporte aos padrões de comunicação I2C (TWI) e SPI. Inclui uma biblioteca Wire para simplificar o uso do barramento I2C. Para usar a comunicação SPI, veja o manual do ATmega328. Assim, no Arduino existe uma parte do hardware especifica para a conversão Serial/USB. Disso resulta a criação de uma porta COM virtual no computador para a comunicação com o Arduino.


Figura 1 - Porta COM virtual no computador para a comunicação com o Arduino.


Como a comunicação é a serial padrão, é fácil trocar informações entre o computador e o Arduino.

Existe uma ferramenta própria na IDE do Arduino para a comunicação serial.

Figura 2 - Ferramenta da IDE do Arduino para a comunicação serial com o Arduino.


A biblioteca Serial() do Wiring tem todas as funções necessárias para se implementar comunicação serial entre o Arduino e o PC.

A porta serial te permite ler e escrever facilmente dados de e para dispositivos externos.

Isto permite a duas máquinas se comunicarem através de portas seriais de 8 pinos, dos PCs, ou emulads através de um adaptador serial.

Velocidades típicas de comunicação são: 2400, 4800, 9600, 14400, 19200, 28800, 38400, 57600 e 115200 BPS.

Apenas uma aplicação pode utilizar a porta serial, a cada vez.


As funções mais utilizadas são:

  • begin() Abre a porta serial para leitura ou escrita.
  • read() Retorna um número entre 0 e 255 para o próximo byte que está esperando no buffer. Retorna -1 se não há nenhum byte, embora isto possa ser evitado pelo uso da função available(), que informa se há dado disponível
  • write() Escreve um byte na porta serial.
  • print() Escreve dados (int, float, byte, char, char[], números nas bases (DEC, BIN, OCT or HEX) ou textos na porta serial.
  • println() O mesmo que a função print(), exceto que acrescenta uma linha nova ao final da chamada.
  • available() Retorna o número de bytes disponíveis.
  • peek() Investiga o próximo byte de dados no buffer da porta serial. Não o recupera do buffer. Retorna -1 se não há dado disponível.
  • flush() Descarrega o buffer da porta serial.
  • end() Fecha a porta serial.


1.1 Enviando texto para Monitor Serial

EXEMPLO 1
void setup(){
   Serial.begin(9600);  //Inicia a comunicação serial a 9600 bauds
}

void loop(){
   Serial.println("Aprendendo a programar no arduino");   
 // Envia a string "Aprendendo a programar no arduino"       
 //para a console
}


Agora acesse o Monitor Serial, no menu do Arduino.

O resultado é uma sucessão de impressões da string “Aprendendo a programar no arduino”.

Vimos que iniciamos a comunicação serial através do comando serial.begin(9600) que colocamos dentro do setup(){} .

O valor de 9600 pode variar dependendo da sua aplicação veja mais sobre velocidade da porta serial nesse post: [Baud Rates]

O comando Serial.print(“string aqui”) que faz com que a informação seja impressa no serial monitor.

Adiante veremos outros exemplos do uso do Serial.print, mas por ora quero que reparem que todo comando que não constrói um bloco (não tem “chaves” como o setup e o loop), ou então que não e uma diretiva de pré-processador (#include, #define que veremos adiante também) termina com ponto e vírgula, isso indica o fim do comando.

1.2 Acionando o LED via Monitor Serial

No segundo teste, vamos acionar, acender e apagar, o led do pino 13 através de comandos de teclado do PC, na interface Serial Monitor, do Arduino. A programação também é simples e bem interessante.

EXEMPLO 2
 
#define LED 13
byte estebyte = 35;
void setup() {
   pinMode(LED, OUTPUT);
   Serial.begin(9600);
}
void loop() {
   Serial.println(" Como enviar valores formatados: ");
   Serial.println("Formato ASCII do valor: ");
   Serial.write(estebyte);
   Serial.println(".");
   Serial.println("Formato DECIMAL:");
   Serial.print(estebyte, DEC);
   Serial.println(".");
   Serial.println("Formato HEXADECIMAL:");
   Serial.print(estebyte, HEX);
   Serial.println(".");
   Serial.println("Formato BINÁRIO:");
   Serial.print(estebyte, BIN);
   Serial.println(".");
   Serial.println("");
   Serial.println("Agora, digite 0 no Monitor para apagar o LED e 1, para acender!");
   while(true) { 
      if(Serial.available() > 0) { 
         estebyte = Serial.read();
         if(estebyte == '1') {     // Digitou 1 no Monitor Serial
            digitalWrite(LED, HIGH);
            Serial.println(" LED ACESO!");
         }
         if(estebyte == '0'){         // Digitou 0 no Monitor Serial
            digitalWrite(LED, LOW);
            Serial.println(" LED APAGADO!");
         }  //end if
      }     //end if
   }//end while
}//end loop

2 Exercícios

Monte o circuito eletrônico respectivo para os códigos abaixo:

[1] Acender o LED se digitar 1 no monitor serial.

byte estebyte; // variável que vai receber o valor do monitor serial
void setup() {
    pinMode(10, OUTPUT);
    Serial.begin(9600);
}

void loop() {
    Serial.println("Digite 1 no Monitor para acender o LED: ");
    while(true)
    { 
      if(Serial.available() > 0)
      { 
        estebyte = Serial.read();
        if(estebyte == '1') // Digitou 1 no Monitor Serial
        { 
          digitalWrite(10, HIGH);
          Serial.println(" LED ACESO!");
        }
      }//end if
   }//end while
}//end loop


[2] Acende o LED se digitar 1 no monitor serial senão for 1 apaga.

byte estebyte; // variável que vai receber o valor do monitor serial
void setup() {
    pinMode(10, OUTPUT);
    Serial.begin(9600);
}

void loop() {
    Serial.println("Digite 1 no Monitor para acender o LED e qualquer outro para apagar: ");
    while(true)
    { 
      if(Serial.available() > 0)
      { 
        estebyte = Serial.read();
        if(estebyte == '1') // Digitou 1 no Monitor Serial
        { 
          digitalWrite(10, HIGH);
          Serial.println(" LED ACESO!");
        } 
        else
        {
          digitalWrite(10, LOW);
          Serial.println(" LED APAGADO!");
        }
      }//end if
   }//end while
}//end loop

[3] Acende o LED se digitar 1 no monitor serial senão se for 2 apaga.

byte estebyte; // variável que vai receber o valor do monitor serial
void setup() {
    pinMode(10, OUTPUT);
    Serial.begin(9600);
}

void loop() {
    Serial.println("Digite 1 no Monitor para acender o LED e digite 2 para apagar o LED: ");
    while(true)
    { 
      if(Serial.available() > 0)
      { 
        estebyte = Serial.read();
        if(estebyte == '1') // Digitou 1 no Monitor Serial
        { 
          digitalWrite(10, HIGH);
          Serial.println(" LED ACESO!");
        } 
        else if(estebyte == '2') // Digitou 2 no Monitor Serial
        {
          digitalWrite(10, LOW);
          Serial.println(" LED APAGADO!");
        }
      }//end if
   }//end while
}//end loop

[4] Desafio: Acrescente mais um LED no seu experimento e, utilizando o comando switch..case, crie todas as possibilidades de acender e apagar os dois LEDs.

3 Responda

  1. Para que serve o monitor serial da IDE do Arduino?
  2. Qual a função de configuração padrão do monitor serial?
  3. Como enviar um texto para o monitor serial?
  4. Como enviar uma informação para o Arduino?