|
|
Linha 1: |
Linha 1: |
− | =Comunicação Serial=
| |
− |
| |
− | 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.
| |
− |
| |
− | [[imagem:Fig020_MCO18703.png|500px|center]]
| |
− |
| |
− |
| |
− | 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.
| |
− |
| |
− | [[imagem:Fig021_MCO18703.png|500px|center]]
| |
− |
| |
− | A biblioteca ''Serial()'' do [http://wiring.org.co/reference/Serial.html 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.
| |
− |
| |
− |
| |
− |
| |
− |
| |
− |
| |
− | ==Enviando texto para Monitor Serial==
| |
− |
| |
− | ;EXEMPLO 1:
| |
− |
| |
− | <syntaxhighlight lang=vhdl>
| |
− | 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
| |
− | }
| |
− | </syntaxhighlight>
| |
− |
| |
− |
| |
− | 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:
| |
− | [[http://www.tech-faq.com/difference-between-bit-rate-and-baud-rate.html 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 tambem) termina com ponto e vírgula, isso indica o fim do comando.
| |
− |
| |
− | ==Acionando o LED do Arduino, via Monitor Serial==
| |
− |
| |
− | ;EXEMPLO 2:
| |
− |
| |
− | 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:
| |
− |
| |
− |
| |
− | <syntaxhighlight lang=c>
| |
− | #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
| |
− | </syntaxhighlight>
| |
− |
| |
− | ==Enviando estado de chave para Monitor Serial==
| |
− |
| |
− | ;EXEMPLO 3:
| |
− |
| |
− | Neste teste, o estado de uma chave externa será lido e enviado pro Monitor Serial.
| |
− |
| |
− | ;Esquemático:
| |
− |
| |
− |
| |
− | [[imagem:Fig022_MCO18703.png|500px|center]]
| |
− |
| |
− | ;Código fonte:
| |
− |
| |
− | <syntaxhighlight lang=c>
| |
− | int pushButton=2;
| |
− |
| |
− | void setup()
| |
− | {
| |
− | Serial.begin(9600);
| |
− | pinMode(pushButton, INPUT);
| |
− | }
| |
− |
| |
− | void loop()
| |
− | {
| |
− | int buttonState=digitalRead(pushButton);
| |
− |
| |
− | Serial.println(buttonState);
| |
− | delay(1);
| |
− | }
| |
− | </syntaxhighlight>
| |
− |
| |
− | ;No protoshield do laboratório:
| |
− |
| |
− | [[imagem:Fig023_MCO18703.jpg|400px|center]]
| |
− |
| |
− | ;Quando pressiona a chave, efeito no Monitor Serial:
| |
− |
| |
− | [[imagem:Fig024_MCO18703.png|500px|center]]
| |
− |
| |
− | ==Acionando leds externos a partir do Monitor Serial ==
| |
− | ;EXEMPLO 4:
| |
− |
| |
− | Nosso primeiro teste de uso do Monitor Serial vai ser um circuito e programação que acionam dois leds, conforme a montagem abaixo:
| |
− |
| |
− | [[imagem:Fig025_MCO18703.png|400px|center]]
| |
− |
| |
− | Agora, abra a IDE do Arduino e escreva/compile/carregue a seguinte programação:
| |
− |
| |
− | <syntaxhighlight lang=c>
| |
− |
| |
− | char c;
| |
− | void setup()
| |
− | {
| |
− | pinMode(2,OUTPUT);
| |
− | pinMode(3,OUTPUT);
| |
− | Serial.begin(9600);
| |
− | }
| |
− |
| |
− | void loop()
| |
− | {
| |
− | if (Serial.available()>0)
| |
− | {
| |
− | c = Serial.read() - '0';
| |
− | Serial.flush();
| |
− | digitalWrite(c,!digitalRead(c));
| |
− | }
| |
− | }
| |
− | </syntaxhighlight>
| |
− |
| |
− |
| |
− | Conecte o Arduino no PC, selecione a versão do seu Arduino (UNO, Duemilanove) e porta (COMx, ttyUSBx, ttyACMx) e clique em UPLOAD. Abra o Serial Monitor e selecione 9600 no ''baud''.
| |
− |
| |
− | Ao digitar o número 2 no Serial Monitor, irá acender o LED conectado na porta digital 2 do Arduino, e ao digitar novamente o número 2, o LED apagará. Agora se digitar o número 3, irá acender o LED da porta digital 3 e se digitar novamente o número 3, o LED apagará.
| |
− |
| |
− | E é isso!
| |
− |
| |
| =Portas Analógicas= | | =Portas Analógicas= |
| | | |
Portas Analógicas
É possível ler grandezas analógicas com o Arduino, além de valores digitais.
Para isto, existem 6 Portas analógicas para ENTRADA de dados:
- A0 (pino 14),
- A1 (pino 15),
- A2 (pino 16),
- A3 (pino 17),
- A4 (pino 18) e
- A5 (pino 19).
Não é necessário definir-se na função setup( ) se as portas serão usadas como entrada, ou saída.
A função de leitura das portas analógicas é a analogRead( PORTA )
O microcontrolador do Arduino dispõe de um Conversor Analógico-Digital (ADC) de 10 bits, o que significa capacidade de quantificar 1024 patamares de valor: 0 a 1023.
Ou seja, as tensões analógicas de entrada, que devem variar de 0 a 5 V, são quantificadas como:
- 0 - correspondente ao valor de 0 V (GND)
- 1 - correspondente ao valor de 1x(5 V - 0 V)/1024 = 0,0048828125 V
- 2 - correspondente ao valor de 2x(5 V - 0 V)/1024 = 0,009765625 V
- 3 - correspondente ao valor de 3x(5 V - 0 V)/1024 = 0,0146484375 V
- ...
- 1023 - correspondente ao valor de 5 V (VCC)
O programador deve saber como interpretar o número digital da conversão. Desta forma, podem ser lidos os mais variados sensores, desde que eles gerem um sinal de tensão de até 5V (limite permitido).
ADC de 10 bits - 1024 patamares de quantificação.
Lendo dados de um potenciômetro
- EXEMPLO 1
- Esquemático
Para ler os valores diretamente em Volts:
- Código fonte
void setup()
{
Serial.begin(9600);
}
void loop()
{
float valt;
int val = analogRead(0);
valt = (val*5.0)/1023;
Serial.println(valt);
}
Lendo dados do potenciômetro para temporizar o LED
- EXEMPLO 2
- Esquemático
- Código fonte
const int led=6;
void setup()
{
pinMode(led, OUTPUT);
Serial.begin(9600);
}
void loop()
{
int val=analogRead(0);
Serial.println(val);
digitalWrite(led, HIGH);
delay(val);
digitalWrite(led, LOW);
delay(val);
}
Lendo um NTC e utilizando a equação de Steinhart-Hart
- EXEMPLO 3
- Esquemático
- Código fonte (5V)
#include <math.h>
const int sensor = A0;
double tempCelsius(int valorNTC)
{
double temp;
temp = log(((10240000/valorNTC)-10000)); // para NTC de 10k
temp = 1/(0.001129148+(0.000234125+(0.0000000876741*temp*temp))*temp);
temp=temp-273.15; // Coonverte Kelvin para Cesius
return temp;
}
void setup()
{
Serial.begin(9600);
}
void loop()
{
int valor=analogRead(sensor);
double c=tempCelsius(valor);
Serial.println(valor);
Serial.println(c);
delay(250);
}
Referências
[1] https://wiki.ifsc.edu.br/mediawiki/index.php/AULA_4_-_Microcontroladores_-_T%C3%A9cnico
[2] https://wiki.ifsc.edu.br/mediawiki/index.php/AULA_5_-_Microcontroladores_-_T%C3%A9cnico