arduino bÁsico lição iii -...
TRANSCRIPT
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 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 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 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 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 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 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 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 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 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