arduino bÁsico lição iii -...

88
04/02/14 Frederico Möller 1 ARDUINO BÁSICO Lição III Frederico José Dias Möller

Upload: lamhanh

Post on 28-Jan-2019

216 views

Category:

Documents


0 download

TRANSCRIPT

04/02/14 Frederico Möller 1

ARDUINO BÁSICOLição III

Frederico José Dias Möller

04/02/14 Frederico Möller 2

Sumário

● "Conversando" com o Arduíno

● Comunicação de máquinas

● Comunicação Serial● A função

Serial.begin()

● Os pinos de comunicação serial.

● Serial Monitor● "Escrevendo" Serial● Exemplo 5 Voltímetro

digital– Hardware– Software

04/02/14 Frederico Möller 3

Sumário

● O divisor de tensão e o cálculo da resistência.

● Exercício V Resistência do LDR

● Enviando dados pelo serial monitor.

● A função Serial.read

● A função Serial.available

● Exemplo VI comandando um led RGB pelo teclado– Software– Hardware

04/02/14 Frederico Möller 4

Sumário

● Exercício VI comandando um RGB com intensidade.

● Revisão● Leitura complementar

04/02/14 Frederico Möller 5

"Conversando" com o Arduino

● A melhor forma de construir programas é o ir fazendo aos poucos e testando.

● Programadores experientes fazem com que variáveis chaves de seus programas sejam mostradas, a fim de analizar como elas estão sendo manipuladas pelo programa e assim saber se o mesmo está funcionando da forma esperada.

04/02/14 Frederico Möller 6

"Conversando" com o Arduino

● Até agora, se quiséssemos testar trechos de programas do Arduinos, teríamos que montar uma interface física (um led, um botão) e observar o resultado.

● O Arduino, no entanto tem um grupo de funções voltado para a comunicação. Com essas funções não é possível fazer com que valores de variáveis apareçam na tela.

04/02/14 Frederico Möller 7

"Conversando" com o Arduino

● Na verdade, essa é apenas um dos usos secundários desse grupo de funções.

● A principal utilidade dela é realizar a troca de dados do arduino com outros dispositivos, incluindo outros arduinos.

● É possível comandar dispositivos à distância usando Arduínos e módulos de rádio!

04/02/14 Frederico Möller 8

Comunicação de máquinas

● Existem duas formas de comunicação entre máquinas. A comunicação paralela e a serial.

● Na paralela, todos os bits de uma determinada informação são mandados ao mesmo tempo.

● Esse tipo de comunicação é mais rápida, no entanto gasta mais pinos...

● Se você tivesse que enviar uma palavra de 1 byte (8bits) gastaria 8 pinos do Arduino.

04/02/14 Frederico Möller 9

Comunicação serial

● Na comunicação serial, cada bit é mandado em sequência, por um unico pino.

● A comunicação serial pode ser síncrona (na qual cada bit é mandado por pulso de clock) ou assíncrona.

● Ela é mais lenta que a paralela, porém muito mais econômica.

04/02/14 Frederico Möller 10

A função Serial.begin()

● Para começarmos habilitarmos a comunicação serial do Arduino devemos fazer isso no setup.

● Para isso precisamos chamar a função Serial.begin(BR)

● BR é a baud rate, ou seja a taxa de bits que serão transmitidos por segundo. Por padrão a maioria das aplicações utiliza 9600bps.

04/02/14 Frederico Möller 11

Os pinos de comunicação serial

● O arduino pode utilizar sua comunicação serial com qualquer outro dispositivo através de seu cabo USB.

● Seus pinos 0 e 1 também funcionam comum pinos de comunicação serial.

04/02/14 Frederico Möller 12

Os pinos de comunicação serial

● Neste curso, por questões logísticas, só faremos a comunicação do Arduino com o computador, utilizando o cabo USB.

● No entanto, vale lembrar que o processo de comunicação com qualquer outro dispositivo, seja por cabo, seja por pino, é exatamente o mesmo.

04/02/14 Frederico Möller 13

O Serial monitor

● Qualquer programa telnet, como o Hyperterminal do windows, ou o xTerm do linux podem interfacear a comunicação do computador com o Arduino.

● Mas para esse curso básico, utilizaremos apenas o serial monitor, do próprio arduino IDE.

04/02/14 Frederico Möller 14

O Serial monitor

● Para acessar o serial monitor, basta abrir o programa Arduino IDE e clicar na lupa no canto superior direito da tela.

04/02/14 Frederico Möller 15

O Serial monitor

04/02/14 Frederico Möller 16

● A tela do monitor vai se abrir● Na parteinferior direita do monitor, podemos

escolher a taxa de envio/recebimento do mesmo. Ela deve bater com a escolhida na função "Serial.begin".

O Serial monitor

04/02/14 Frederico Möller 17

"Escrevendo" serial

● Existem diversas funções "escrever" no serial: Serial.write(), Serial.print e Serial.println().

● A Serial.write(dado) escreve o dado em um byte literalmente.

● Como os programas telnet convertem os bytes recebidos em seus equivalentes na tabela ASCII, o dado escrito através da Serial.write() não será devidamente visualizado.

04/02/14 Frederico Möller 18

"Escrevendo" serial

● Por exemplo, a função Serial.write(52) enviará um byte com valor 52 via serial. Um outro dispositivo qualquer que receber, "entenderá" o valor quantitativo 52 e poderá operar ele matemáticamente.

● No entanto, um programa telnet que receber esse 52, procurará o valor na tabela ASCII.

● Em tal tabela 54 equivale ao dígito 4 e é isso que será expresso na tela.

04/02/14 Frederico Möller 19

"Escrevendo" serial

● Nem sempre algum símbolo será visualizado na tela.

● Por exemplo Serial.write(10) enviará um byte de valor 10, que na tabela ASCII significa uma alimentação de linha.

● Ou seja, o programa telnet dará um "ENTER"

04/02/14 Frederico Möller 20

"Escrevendo" serial

04/02/14 Frederico Möller 21

"Escrevendo" serial

● Já as funções Serial.print(dado) e Serial.println(dado) transformar o dado em uma string, convertem cada símbolo para o valor correspondente da tabela ASCII e o enviam.

● Por exemplo Serial.print(52) exibirá 52 no serial monitor.

● É como se a função tranformasse 52 em uma arrays tipo char, procurasse o valor dos dígitos 5 e 2 na tabela e os transmitisse.

04/02/14 Frederico Möller 22

"Escrevendo" serial

● Seria o equivalente a fazer Serial.write(53); Serial.write(50);

● A única diferença da função Serial.println da função Serial.print é que a primeira, após enviar o dado em questão alimenta uma linha, ou seja dá um "ENTER" no serial monitor.

04/02/14 Frederico Möller 23

"Escrevendo" serial

04/02/14 Frederico Möller 24

Exemplo V leitura de um potenciômetro

● Vamos fazer um exemplo bem simples, onde visualizaremos a tensão sobre uma entrada analógica ligada a um potenciômetro.

● Sim, de forma limitada, estaremos transformando o Arduino em um voltímetro digital.

● Lembre-se que o ADC do Arduino converte 0V a 5V para valores entre 0 e 1023.

04/02/14 Frederico Möller 25

Exemplo V hardware

● A montagem do circuito é bastante simples. Simplesmente ligaremos o potenciômetro no Arduino.

04/02/14 Frederico Möller 26

Exemplo V software

● O programa também é bem simples e possui poucas linhas.

● É importante observar a função Serial.begin(9600) dentro do setup

04/02/14 Frederico Möller 27

Exemplo V software

● Observe também que executamos as operações de conversão valordigital>tensão dentro do print.

● Chamamos um println com a letra V em seguida.

04/02/14 Frederico Möller 28

Exemplo V software

● A letra V está entre aspas para dizer ao programa que não estamos nos referindo à variável V (que sequer existe) e sim a uma letra, um caracter V.

04/02/14 Frederico Möller 29

Exemplo V software

● A sequencia print e println, faz com que a tensão seja escrita, a letra V (de volts) seja escrita ao lado da tensão e por fim seja dado um "ENTER" no monitor.

04/02/14 Frederico Möller 30

O divisor de tensão e o calculo da resistência

● Como vimos anteriormente, sensores como o LDR são usados dentro de um divisor de tensão.

● A tensão sobre o LDR é medida, a medida que sua resistência varia, sua tensão varia proporcionamente.

● Como conhecemos a tensão total sobre o circuito e a resistência do resistor de referência fica fácil calcular a resistência do sensor.

04/02/14 Frederico Möller 31

O divisor de tensão e o calculo da resistência

● Alimentando o LDR com uma tensão de 5V e utilizando um resistor de referência de resistência R, num momento qualquer o sensor terá resistência S e a tensão T de saída será dada por:

T(S) = 5SR+S

04/02/14 Frederico Möller 32

O divisor de tensão e o calculo da resistência

● A função inversa, nos dará a resistência S em função da tensão T

● OBS.: Apesar de ter S, T, inversa, nada aqui tem haver com Laplace...

S = TR 5-T

04/02/14 Frederico Möller 33

Exercício V Resistência do LDR

● Com base no que foi aprendido até agora, desenvolva um programa que exiba no monitor serial a resistência de um LDR

● Faça com que no programa seja escrito um "kohms" ao lado de cada medida, caso o valor esteja expresso em kΩ e "ohms" caso expresso em Ω.

● Tome cuidado para que os valores sejam atualizados numa frequencia que qualquer pessoa consiga acompanha-los.

04/02/14 Frederico Möller 34

Exercício V Resistência do LDR

● Mais uma vez, um código simples.

● Vale observar que o valor de T foi manipulado antes de entrar no Serial.print.

● Tal manipulação poderia ter sido executada dentro da função, mas o risco de errar alguma expressão é bem maior.

04/02/14 Frederico Möller 35

Exercício V Resistência do LDR

● Outra coisa que vale observar é que o kOhms está entre aspas duplas.

● O motivo aqui é que temos mais que um caracter. Temos uma palavra completa e por isso essa mudança.

04/02/14 Frederico Möller 36

Enviando dados pelo serial monitor.

● É possível enviar dados para o Arduino pelo serial monitor, ou qualquer outro programa telnet.

● Pelo serial monitor, basta digitar a informação na barra superior do mesmo e em seguida clicar em send.

● A função utilizada para receber esse dado é a mesma que será utilizada para receber dados enviados via serial por outros dispositivos ao Arduino.

04/02/14 Frederico Möller 37

Enviando dados pelo serial monitor.

04/02/14 Frederico Möller 38

A função Serial.read()

● A função Serial.read() lê o próximo byte recebido pelo arduino e retorna uma valor tipo char.

● Por isso, se você enviar o número 255 pelo Serial monitor, o primeiro comando Serial.read() vai retornar 50 (valor ASCII para o dígito 2) e os outros dois seguintes vão retornar 53 cada).

04/02/14 Frederico Möller 39

Exemplo VI comandando um led pelo teclado

● Comandaremos um led rgb pelo teclado.● Faremos um exemplo simples, usando apenas

escrita digital para o acionamento do led.● Ao digitarmos R o led vermelho deverá ser

aceso, digitando novamente, ele deverá ser apagado.

● O mesmo para B (azul) e G (verde).

04/02/14 Frederico Möller 40

A função Serial.available()

● Uma vez que a Serial.read() só lê um byte, é importante informar quantos bytes existem para serem lidos.

● A função Serial.available() serve exatamente para isso, ela retorna quantos bytes estão disponíveis para leitura no serial.

● Por exemplo, se digitarmos 255, ela retornará 3. Se digitarmos Arduino, ela retornará 7.

04/02/14 Frederico Möller 41

Exemplo VI hardware

● Precisaremos apenas de um led RGB e um resistor de 100Ω

04/02/14 Frederico Möller 42

Exemplo VI software

● Apesar de grande, o código não apresenta grande desafio.

● Temos inicialmente a declaração de uma variável char, uma int e uma array de ints.

04/02/14 Frederico Möller 43

Exemplo VI software

● A variável char "letra" é a variável que vai receber o byte enviado via serial.

● A array valor, tem tamanho 3 e armazena o valor lógico de cada saída digital.

04/02/14 Frederico Möller 44

Exemplo VI software

● A variável char "letra" é a variável que vai receber o byte enviado via serial.

● A array valor, tem tamanho 3 e armazena o valor lógico de cada saída digital.

04/02/14 Frederico Möller 45

Exemplo VI software

● A variável char "letra" é a variável que vai receber o byte enviado via serial.

● A array valor, tem tamanho 3 e armazena o valor lógico de cada saída digital.

04/02/14 Frederico Möller 46

Exemplo VI software

● A variável char "letra" é a variável que vai receber o byte enviado via serial.

● A array valor, tem tamanho 3 e armazena o valor lógico de cada saída digital.

04/02/14 Frederico Möller 47

Exemplo VI software

● Em seguida temos a setagem dos pinos e da comunicação serial.

● Ainda no setup, temos um ciclo for que é responsável por zerar todos as posições de "valor[]"

04/02/14 Frederico Möller 48

Exemplo VI software

● Em seguida temos a setagem dos pinos e da comunicação serial.

● Ainda no setup, temos um ciclo for que é responsável por zerar todos as posições de "valor[]"

04/02/14 Frederico Möller 49

Exemplo VI software

● O loop começa com um ciclo while.

● A condição do ciclo, diz que este deve rodar enquanto a variável letra não for igual a 'R', nem a 'G' nem a 'B'.

04/02/14 Frederico Möller 50

Exemplo VI software

● Ou seja, o ciclo vai rodar até que letra seja igual a 'R', 'G', ou 'B'.

● É muito comum errarmos a condição de um ciclo desses, construindo-o pensando na condição de quebra.

04/02/14 Frederico Möller 51

Exemplo VI software

● O correto é pensar na condição oposta a quebra.

● Caso seja difícil montar a condição oposta sem confusão, a dica é construir a condição de quebra, coloca-la entre parênteses e por fim colocar uma negativa nela (um "!")

04/02/14 Frederico Möller 52

Exemplo VI software

● Dentro do ciclo, a variável letra recebe a leitura serial.

● Se o Arduino receber o byte 52 via serial, a variável letra vai receber o valor 52.

● Porém 52 = 4 pela tabela ASCII

04/02/14 Frederico Möller 53

Exemplo VI software

● Sendo assim, o ciclo não será quebrado e letra receberá um novo valor.

● Assim que o valor correspondente a 'R', 'G', ou 'B' for transmitido o ciclo será quebrado.

04/02/14 Frederico Möller 54

Exemplo VI software

● Supondo que letra esteja com o valor de 'R'.

● Após sair do ciclo, ela entrará nesse condicional.

● O índice 0 de valor contém o bit lógico que será usado no pino 13

04/02/14 Frederico Möller 55

Exemplo VI software

● Supondo que letra esteja com o valor de 'R'.

● Após sair do ciclo, ela entrará nesse condicional.

● O índice 0 de valor contém o bit lógico que será usado no pino 13

04/02/14 Frederico Möller 56

Exemplo VI software

● Ele é inicialmente 0 por causa do ciclo for que implementamos no setup.

● No entanto, na primeira vez que entra no condicional, valor[0] passa a receber o oposto de seu último valor.

04/02/14 Frederico Möller 57

Exemplo VI software

● Ele é inicialmente 0 por causa do ciclo for que implementamos no setup.

● No entanto, na primeira vez que entra no condicional, valor[0] passa a receber o oposto de seu último valor.

04/02/14 Frederico Möller 58

Exemplo VI software

● Mesmo sendo tipo int, o arduino entende isso como um valor lógico e nesse caso a negação de 0 é 1.

● Sendo assim valor[0] passa a ter o valor de 1.

04/02/14 Frederico Möller 59

Exemplo VI software

● O próximo comando é um digitalWrite. Perceba que no lugar de LOW, ou HIGH colocamos "valor[0]"

● Como valor[0] = 1 ele interpreta isso como "digitalWrite(13,HIGH)" e aquela parte do led é acesa!

04/02/14 Frederico Möller 60

Exemplo VI software

● Após isso, a variável letra recebe o valor 0.

● Se não mudasse de valor ela pularia o while no início do ciclo (afinal já teria valor igual a 'R').

● Logo ela executaria o condicional R novamente e o led ficaria piscando vermelho indefinidamente

04/02/14 Frederico Möller 61

Exemplo VI software

● Com o valor igual a zero, logo que um novo ciclo é iniciado, o programa fica preso no ciclo while novamente.

● Se o R for digitado novamente, ele vai passar pelo condicional de novo...

04/02/14 Frederico Möller 62

Exemplo VI software

● E nesse caso, valor[0] que estava em 1 volta para 0

● Assim teremos um digitalWrite(13,low)

04/02/14 Frederico Möller 63

Exemplo VI software

● A mesma lógica segue para G e para B

04/02/14 Frederico Möller 64

Exemplo VI software

● A mesma lógica segue para G e para B

04/02/14 Frederico Möller 65

Exercício VI comandando rgb com intensidade

● Altere a lógica do exemplo VI e faça com que seja possível não só acionar os leds, mas também alterar sua intensidade.

● Para simplificar, faça com que a intensidade seja um valor entre 0 e 255.

● Se possível, faça com que o Arduino imprima mensagens no Monitor serial, como "Digite a inicial do led que deseja regular" e "Digite a intensidade do led".

04/02/14 Frederico Möller 66

Exercício VI comandando rgb com intensidade

● A complexidade dos programas que exigem comunicação, em geral, crescem exponencialmente à complexidade do problema.

● Observem que temos 3 tipos de variáveis.

04/02/14 Frederico Möller 67

Exercício VI comandando rgb com intensidade

● A variável letra vai receber a indicação de qual cor do led regularemos

● A qtd char receberá a quantidade de bytes que enviamos na hora de digitar a intensidade.

04/02/14 Frederico Möller 68

Exercício VI comandando rgb com intensidade

● Temos a variável i que é um índice.

● Por fim, temos uma variável do tipo double que receberá a intensidade do led.

04/02/14 Frederico Möller 69

Exercício VI comandando rgb com intensidade

● Para não nos adentramos em explicações técnicas, encarem o tipo double como se fosse um float que pode armazenar uma gama maior de valores.

04/02/14 Frederico Möller 70

Exercício VI comandando rgb com intensidade

● O primeiro conjunto de instruções do exercício, remete ao exemplo anterior e tem exatamente a mesma função

● Observem o println antes do While.

04/02/14 Frederico Möller 71

Exercício VI comandando rgb com intensidade

● Agora vamos para a próxima etapa.

● Ela começa, assim como a anterior com uma frase impressa no serial monitor.

● Em seguida ele entra em um ciclo while, que vai permanescer enquanto intensidade for menor que zero.

● Como, já na sua declaração, a variável intensidade teve o valor -1 atribuído, significa que o programa só vai executar as outras operações após o valor da intensidade ser definido.

04/02/14 Frederico Möller 72

Exercício VI comandando rgb com intensidade

04/02/14 Frederico Möller 73

Exercício VI comandando rgb com intensidade

● Em seguida temos um delay de 100ms● Ele serve para que o Arduino tenha tempo para

"encher" seu buffer de recebimento.● Ou seja, para que, ao digitarmos 3 bytes, como

por exemplo189, ele não perca o 8 e o 9.● Após o recebimento de todos os bytes, a

quantidade de bytes é armazenada na variável qtd_char

04/02/14 Frederico Möller 74

Exercício VI comandando rgb com intensidade

04/02/14 Frederico Möller 75

Exercício VI comandando rgb com intensidade

● Em seguida temos um condicional, ele evita que valores com mais de 3 dígitos sejam inseridos.

● Apesar do código não ter sido feito todo usando programação defensiva, esse condicional, em especial é para evitar erros na execução de instruções posteriores.

● Após o condicional, a variável intensidade assume o valor de 0;

04/02/14 Frederico Möller 76

Exercício VI comandando rgb com intensidade

04/02/14 Frederico Möller 77

Exercício VI comandando rgb com intensidade

● O fato dela receber um novo valor não afeta a execução do ciclo while. A condição de saída só vai ser testada quando este ciclo terminar e o próximo começar.

● Temos então, ainda no while, um ciclo interno do tipo for, observe que o índice "i" começa com o valor inicial de qtd_char-1 e vai diminuindo de 1 em 1 enquanto i for maior ou igual à 0.

04/02/14 Frederico Möller 78

Exercício VI comandando rgb com intensidade

04/02/14 Frederico Möller 79

Exercício VI comandando rgb com intensidade

● Dentro do ciclo ocorre talvez a construção mais complexa do programa: a variável intensidade é acrescida de seu valor anterior somada com uma parcela que é igual ao valor lido no serial, subtraido de 48 .

● Esta parcela é multiplicada pelo resultado da função pow(10,i), ou seja 10 elevado a i.

04/02/14 Frederico Möller 80

Exercício VI comandando rgb com intensidade

● A parcela é o resultado da leitura serial, subtraido de 48. Isso porque, como já foi dito a função Serial.read() retorna valores char, ou seja, ela não lê números, lê dígitos.

● O dígito 0 equivale a 48 na tabela ASCII, o restante, de 1 a 9, seguem na sequência (1 é 49, 2 é 50...)

04/02/14 Frederico Möller 81

Exercício VI comandando rgb com intensidade

● Se digitarmos 139, termos qtd_char = 3● O i terá seu valor inicial igual a 2● Intensidade, como foi visto antes, sempre

começa o for com valor igual a 0● Na primeira iteração do ciclo for, termos:● Intensidade = 0 + (49 – 48) * 10^2● Ou seja, intensidade = 100

04/02/14 Frederico Möller 82

Exercício VI comandando rgb com intensidade

● Na segunda iteração (i=1) teremos:● Intensidade = 100 + (51-48)*10^1● Intensidade = 100 + 30● Intensidade = 130● Na terceira iteração (i=0):● Intensidade = 130 + (57-48)*10^0● Intensidade = 130 + 9● Intensidade = 139

04/02/14 Frederico Möller 83

Exercício VI comandando rgb com intensidade

● Ao fim de cada ciclo, i é reduzido de 1, assim no início da quarta iteração i tem o valor de -1.

● Como a condição do for é i>=1, o ciclo é quebrado e quarta iteração não ocorre.

● Com o fim do for, o while chega ao fim de sua iteração e retorna para começar uma nova.

● Porém, logo no início do ciclo, é verificado que intensidade >=0 e o ciclo é quebrado.

04/02/14 Frederico Möller 84

Exercício VI comandando rgb com intensidade

● Por fim, o programa segue de forma parecida com o exemplo anterior.

● Observe que ao fim do ciclo geral, intensidade e letra são resetados com seus valores iniciais.

04/02/14 Frederico Möller 85

Revisão

● Nessa lição aprendemos sobre:– Conceitos básicos sobre comunicação de

máquinas– A comunicação serial do Arduino– O serial monitor– As funções begin, write, print, println, available e

read do serial.

04/02/14 Frederico Möller 86

Leitura complementar

● Na resolução do exercício VI, citamos o termo programação defensiva, para saber mais sobre ele:– Defensive programming

● Um material interessante sobre comunicação entre máquinas– InetDaemon

04/02/14 Frederico Möller 87

Dúvidas???

04/02/14 Frederico Möller 88

Obrigado e até a próxima lição!!!