Prévia do material em texto
APOSTILA DE INTRODUÇÃO A COMPUTAÇÃO ENGENHARIA ELÉTRICA E ELETRÔNICA 2 1. CONCEITOS BÁSICOS Microcontroladores e Microprocessadores, qual a diferença? A diferença entre os dois tipos de hardwares está basicamente em sua construção, os microcontroladores são dispositivos específicos para controle, em sua construção todos os componentes necessários para o seu funcionamento são encapsulados em um único chip. A memória RAM e ROM, o conversor AD, os temporizadores estão todos integrados em um único bloco, diferentemente dos microprocessadores que é um circuito integrado e depende de dispositivos externos para o seu funcionamento, como a memória. Os microcontroladores surgiram da necessidade de implementar tarefas mais simples com custo mais baixo, como o acionamento de motores de passos, controle de impressora, reguladores de velocidade. Existem no mercado diversos fabricantes de microcontroladores cada um com suas particularidades. Os mais conhecidos e utilizados no ramo educacional são os da família PIC, produzidos pela Microchip Technology, os da família ATmega, produzidos pela Atmel Corporation e os microcontroladores de 8 bits produzidos pela Intel, sendo o mais famoso o 8051. Nessa apostila será abordada a plataforma Arduino que utiliza microcontroladores da família Atmega. O Arduino é composto de uma placa que contém o hardware, composto de um microcontrolador, entradas e saídas e um conjunto de software que seria a linguagem de programação e o bootloader que carrega na memória flash o software que recebe pela serial, dispensando o uso do gravador externo. 3 2. CARACTERÍSTICAS DO ARDUINO UNO R3 Durante o curso será utilizada a plataforma do Arduino UNO R3 com o microcontrolador Atmega328. Na figura 2.1 podemos ver a disposição dos componentes na placa Arduino. Figura 2.1 - Placa Arduino UNO R3 Esquematicamente o Arduino Uno é representado por um retângulo com vários terminais conforme podemos observar na figura 2.2. Figura 2.2. – Diagrama esquemático do Arduino Uno. 4 Na tabela 2.1 está uma breve descrição das características da placa Arduino UNO R3. UNO R3 Controlador: ATmega328 Tensão de Operação: 5V Tensão de alimentação (recomendado): 7-12V Portas I/O digitais: 14 (6 com PWM) Portas Analógicas: 6 Memória Flash: 32 KB (0.5 KB usado para bootloader) Corrente DC (I/O): 40 mA Corrente DC p/ 3.3V: 50 mA SRAM: 2 KB EEPROM: 1 KB Clock: 16 MHz Tabela 2.1 - Características UNO R3 5 3. IDE ARDUINO Para programar o Arduino não é necessário utilizar somente a IDE Arduino, é possível utilizar outras IDEs como Eclipse, AtmelStudio e o Netbeans, no site oficial do Arduino é possível fazer o download do ambiente oficial de programação. A IDE oficial apresenta diversas facilidades, a começar a inclusão automática de uma biblioteca que inicializa os dispositivos, registradores, entradas/ saídas e etc. A programação do microcontrolador é realizada utilizando uma linguagem derivada do C++ e o upload dos sketches (códigos) é realizado facilmente devido a existência do padrão de conexão dos Shields. Como qualquer plataforma a IDE Arduino possui desvantagens, uma delas é o Debug, não sendo possível visualizar passo a passo do programa e visualizar o seu comportamento. Após a instalação da IDE Arduino uma interface semelhante a da figura 3.1 será exibida. Figura 3.1 – IDE Arduino 6 A seguir será descrito detalhes da interface de desenvolvimento Arduino. Verify – verifica se há algum erro de sintaxe no código, o erro será indicado na parte inferior da interface. Upload – compila e envia o código para a placa Arduino. New – Cria um novo sketch. Open – Abre um sketch salvo anteriormente. Save – Salva o sketch aberto. Serial Monitor – Abre o terminal serial, que auxilia no recebimento e envio de dados para a placa. Após abrir a IDE Arduino é necessário configurar dois itens relacionados à placa, o modelo e a porta que está conectada. Modelo da placa: Tools > Board > Arduino Uno Porta que a placa está conectada: Tools > Port /Serial Port > COMX Figura 3.2 – Selecionando modelo da placa utilizada 7 A estrutura da programação Arduino é composta por duas funções essenciais, a setup e o loop. A função void setup() é inicializada somente uma vez, quando a sketch inicia ou quando o reset do Arduino é acionado. É possível iniciar as variáveis e as bibliotecas e indicar ao Arduino onde estão ligados os componentes. A função void loop() é iniciada logo após a setup, todo o código de controle da placa é executado no loop, permitindo mudanças no programa de acordo com a leitura de sensores, estado lógico e etc. É importante lembrar que as funções escritas no loop estarão em ciclo constante. 8 4. PORTAS DIGITAIS Os pinos digitais servem para receber ou transmitir níveis lógicos digitais. Quando estamos lendo ou escrevendo em um pino digital existem apenas dois valores que um pino deste tipo pode ter: HIGH (alto) e LOW (baixo). HIGH: O significado de HIGH (em referência a um pino) pode variar um pouco dependendo se este pino é uma entrada (INPUT) ou saída (OUTPUT). Quando um pino é configurado como INPUT com a função pinMode, e lido com a função digitalRead, o microcontrolador considera como HIGH se a voltagem for de 3V ou mais. Um pino também pode ser configurado como um INPUT com o pinMode, e posteriormente receber um HIGH com um digitalWrite, isto vai “levantar” o resistor interno de 20KΩ que vai manter a leitura do pino como HIGH a não ser que ela seja alterada para LOW por um circuito externo. Quando um pino é configurado como OUTPUT com o pinMode, e marcado como HIGH com o digitalWrite, ele está a 5V. Neste estado ele pode enviar corrente para, por exemplo, acender um LED que está conectado com um resistor ou a outro pino configurado como OUTPUT e marcado como LOW; LOW: O significado de LOW também pode variar dependendo do pino ser marcado como INPUT ou OUTPUT. Quando um pino é configurado como INPUT com a função pinMode, e lido com a função digitalRead, o microcontrolador considera como LOW se a voltagem for de 2 Volts ou menos. Quando um pino é configurado como OUTPUT com a função pinMode, e marcado como LOW com a função digitalWrite, ele está a 0V. Neste estado ele pode “drenar” corrente para, por exemplo, acender um LED que está conectado com um resistor em série ao +5V, ou a outro pino configurado como OUTPUT e marcado como HIGH. 9 A placa do Arduino Uno possui 14 pinos digitais que podem ser utilizados como entrada ou saída. Estes pinos operam em 5V, onde cada pino pode receber ou fornecer uma corrente máxima de 40 mA. Cada pino possui um resistor interno de 20KΩ chamado de pull-up, utilizado para garantir que o estado de um pino de entrada seja sempre alto. Pinos 0 (RX) e 1 (TX): São usados para receber (RX) e transmitir (TX) dados seriais TTL. Esses pinos são conectados aos pinos correspondentes do chip serial USB para TL ATmega8U2; Pinos 2 ao 13: São utilizados para entrada e saída de dados. Os pinos 2 e 3 são usados para interrupções externas, podem ser configurados para disparar interrupções com nível lógico baixo, com borda de subida ou descida, oucom mudança de valor. Os pinos 3, 5, 6, 9, 10 e 11 possuem suporte a PWM (Modulação por largura de Pulso). O pino 13 está associado ao LED que vem integrado na placa do Arduino UNO. Nas figuras 4.1a e 4.1b podemos ver a localização das conexões referentes às portas digitais. EXEMPLO I: Acionamento do LED acoplado no pino 13 da placa Arduino Figura 4.1b – Diagrama esquemático: localização das portas digitais Figura 4.1a – Localização das portas digitais 10 Para exemplificar o funcionamento dos pinos digitais iremos acionar o LED que está acoplado na placa do Arduino. Na figura 4.2 está a placa do Arduino com a indicação do LED. Figura 4.2 – Placa Arduino. Código fonte: Sintaxe: pinMode(pin, mode) Parâmetros: pin: refere-se o número do pino que deseja utilizar. mode: o modo como o pino será utilizado, ou seja, INPUT, OUTPUT ou INPUT_PULLUP. Retorno: nada Código fonte: Sintaxe: digitalWrite(pin, value) Parâmetros: pin: refere-se o número do pino que deseja utilizar. value: o estado que a saída deve assumir HIGH ou LOW. Retorno: nada Explicação do código fonte: Dentro da função void setup(), foi utilizado a sintaxe “pinMode(13, OUTPUT)”. Esta sintaxe é responsável pela configuração do pino, ou seja, é nela que determinamos se o pino será de entrada ou saída. Primeiramente, temos que LED acoplado a placa e associado ao pino 13 void setup() { pinMode(13, OUTPUT); } void loop() { digitalWrite(13, HIGH); } void setup() { pinMode(13, OUTPUT); } void loop() { digitalWrite(13, HIGH); } 11 informar o número do pino e depois o modo que iremos trabalhar. No caso do exemplo, o pino está configurado como saída. Na função seguinte, void loop(), foi utilizado a sintaxe “digitalWrite(pino, HIGH)”. Esta sintaxe é responsável por escrever um valor no pino especificado. Neste exemplo, o pino 13 está recebendo o valor HIGH, que fisicamente a placa estará enviando para o pino 5V, proporcionando o acionamento do LED. Porém o LED só irá acender se for adicionada a linha de comando no loop, que é composta pelo digitalWrite. Um detalhe importante é a forma de escrita DIGITALWRITE é diferente de digitalWrite. EXEMPLO II: Fazer o LED acoplado no pino 13 da placa Arduino piscar 12 Se analisarmos o código anterior o mandamos o LED acender, porém ele não irá apagar, para isso acontecer devemos acrescentar mais uma linha de comando digitalWrite(pin, LOW). Com essa linha o LED irá acender e apagar muito rapidamente e claro que não queremos, para isso iremos adicionar mais uma função a delay(). Código fonte: Sintaxe: delay(ms) Parâmetros: ms: o tempo de pausa em milissegundos Retorno: nada Explicação do código fonte: Para que o estado do Led seja alterado é necessário fazer com que o pino 13 mude seu estado também, para isso foi utilizado a função digitalWrite igualmente no exemplo anterior e o estado do pino foi alterado de HIGH para LOW. Desta forma o Led irá piscar tão rapidamente que não iremos notar ele piscando, para isso foi acrescentado a função delay() é uma função que pausa todo o sistema durante o tempo programado, dentro dos parênteses é acrescentado o tempo desejado em milissegundos, assim no código acima como podemos notar que o Led ficará 1 segundo aceso e 1 segundo apagado. Capítulo 4 – Exercícios void setup() { pinMode(13, OUTPUT); } void loop() { digitalWrite(13, HIGH); delay(1000); digitalWrite(13, LOW); delay(1000); } 13 1) Ligar um LED a porta 10 do Arduino e fazer o mesmo piscar de 0,5s em 0,5s. 2) Ligar 2 LEDs ao Arduino e fazer eles piscarem alternadamente. 3) Montar um semáforo com os seguintes estágios: Vermelho Amarelo Verde Duração Estágio 1 Aceso Apagado Apagado 5,0 s Estágio 2 Aceso Aceso Apagado 1,5 s Estágio 3 Apagado Aceso Aceso 1,5 s Estágio 4 Apagado Apagado Aceso 5,0 s Estágio 5 Apagado Aceso Aceso 1,5 s Estágio 6 Aceso Aceso Apagado 5,0 s 14 5. ESTRUTURAS DE CONTROLE Para apreender a programar é necessário ter uma base sólida em cada assunto referente à linguagem de programação que se deseja programar. Geralmente toda a programação é executada em torno das estruturas de controle de fluxo, por isso consideramos a parte mais importante da programação. As estruturas de controle são blocos de instruções que de acordo com uma condição podem executar comandos diferentes e também podem repetir uma série de comandos várias vezes, dessa forma são conhecidas como comandos de seleção e de repetição. Como comandos condicionais ou de seleção podemos citar a estrutura if e como comandos de repetições temos while e for. IF – ELSE A estrutura if é utilizada em conjunto com um operador de comparação1 e também é possível combiná-la com else. A estrutura if - else permite múltiplos testes agrupados entre si e com isso um maior controle de fluxo do código. O if - else basicamente verifica e executa o comando indicado, se a condição for TRUE (verdadeiro, 1) um comando é executado, caso contrário se a condição for FALSE (falsa, 0) um outro comando é executado. 1 Operadores de comparação mais utilizados: == (“igual a”), != (“diferente de”), > (“maior que”), < (“menor que”), >= (“maior ou igual a”), <= (“menor ou igual a”), ! (“não”), && (“e”), || (“ou”). if(condição) { ... } 15 WHILE O while é uma estrutura que funciona como um loop de repetição. O while executa um comando ou um conjunto de comandos enquanto a condição permanecer verdadeira, quando a condição for falsa o programa continua normalmente. É importante tomar alguns cuidados na utilização da estrutura while, ao utilizarmos uma variável para determinar uma condição devemos inicializa-la antes, pois o C/C++ não inicia automaticamente em zero, ou seja, quando comparamos a variável sem inicializa-la estamos comparando com qualquer coisa ou até mesmo o zero. Também é importante lembrarmos que podemos entrar em um loop infinito, assim devemos indicar a partir de uma entrada que o loop termine, pois diferentemente da for o while não trabalha com incremento ou decremento da variável em sua estrutura. if(condição) { ... } else { ... } 16 FOR A estrutura for também executa um comando ou um conjunto de comandos por um número definido de vezes. Uma das diferenças do for em relação ao while é que não precisamos inicializar a variável antes, outra diferença é que a estrutura for é composta de três partes, inicialização, condição e finalização. A parte da inicialização é executada apenas uma vez no inicio do for, é também onde iniciamos a variável. A condição é o bloco que trabalha com o loop, toda vez que a função for repetida a condição será testada e enquanto ela for verdadeira os comandos entre as chaves continuam sendo executados. O incremento é executado se a condição for verdadeira, se a condição for falsa o loopé terminado. while(condição) { ... } 17 EXEMPLO I: Acionar o LED acoplado no pino 13 ao pressionar um Push Button Para acionarmos o LED acoplado a placa do Arduino ao pressionar um botão (Push Button) é necessária à montagem do circuito abaixo, figuras 5.1a e 5.1b. for(inicialização; condição; incremento) { ... } 18 Figura 5.1a – Acionar um LED a partir de um Push Button. Figura 5.1b – Diagrama esquemático: acionar um LED a partir de um Push Button. Componentes: 1 resistor de 10KΩ; 1 botão (tipo: Push Button). Explicação do circuito: Para acender o LED quando ao pressionar um botão, temos que ligar um botão (tipo: Push Button) em um dos pinos digitais da placa Arduino, neste exemplo, o botão foi ligado no pino 2. Porém, devido ao Push Button trabalhar com uma corrente muito baixa o que faz com que o pino digital do Arduino não seja capaz de identificar se o botão foi pressionado, por isso, não podemos ligar o botão diretamente ao pino desejado. O botão e o pino devem estar ligados a um circuito de resistor pull-up 19 ou pull-down para obtermos o funcionamento correto do projeto. No exemplo em questão, estamos utilizando um circuito de resistor pull-down, figura 4.3. Figura 4.3: Circuito de resistor pull-down O circuito de resistor pull-down está sendo utilizado para garantir que o pino 2 receba nível lógico baixo (0V) enquanto o botão não estiver pressionado e quando for pressionado receba nível lógico alto (5V). Assim, evita-se que o pino 2 flutue, ou seja, varie entre 0V e 5V o que ocasionaria um funcionamento não desejável do projeto. Código fonte: Sintaxe: if (condição) { código...} else {código...} Instrução: if: valida uma condição, e mediante o resultado, executar o código correspondente. else: só será executado se o “ if ” for falso. Parâmetros: condição: informação a ser comparada. Retorno: TRUE ou FALSE Código fonte: void setup(){ pinMode(13, OUTPUT); pinMode(2, INPUT); } void loop(){ if(digitalRead(2)==HIGH){ digitalWrite(13, HIGH); } else{ digitalWrite(13, LOW); } } 20 Sintaxe: digitalRead(pin) Parâmetros: pin: refere-se o número do pino que deseja utilizar. Retorno: TRUE ou FALSE Explicação do código fonte: Para que o estado do LED seja alterado quando for pressionado o botão, primeiramente, temos que definir os pinos de entrada e saída. Estes foram definidos dentro da função void setup. O pino 13 foi definido como saída, pinMode(13, OUTPUT), e o pino 2 como entrada, pinMode(2, INPUT). Na função void loop foi inserida uma condição para verificar o estado do botão. Através do comando if, que serve para validar uma condição. Neste caso, a condição passada como parâmetro foi “digitalRead(2) == HIGH”, onde, a sintaxe digitalRead(2) é responsável pela leitura do estado de um determinado pino digital de entrada. Então, na condição mencionada será feita a seguinte verificação: Se (if), o pino 2 for igual ao nível lógico alto, significa que o botão foi pressionado e executará a linha a seguir, digitalWrite(13, HIGH). Senão (else), significa que a condição é falsa, e o programa executará a seguinte linha, digitalWrite(13, LOW). void setup(){ pinMode(13, OUTPUT); pinMode(2, INPUT); } void loop(){ if(digitalRead(2)==HIGH){ digitalWrite(13, HIGH); } else{ digitalWrite(13, LOW); } } 21 EXEMPLO II: Fazer o LED piscar utilizando a estrutura WHILE Nesse exemplo iremos utilizar a estrutura while para fazer o LED piscar, inicialmente ele irá piscar cinco vezes, saíra do loop e piscará mais cinco vezes e assim sucessivamente. Código fonte: Sintaxe: while(condição) { código..} Instrução: while: verifica se a condição é verdadeira e executa o código até que a condição seja falsa. Parâmetros: condição: informação a ser comparada. Retorno: TRUE ou FALSE Explicação do código fonte: Analisando a primeira linha do código podemos notar na expressão int led = 7; definindo que a variável led será equivalente ao pino 7, logo declaramos a variável led como saída pinMode(led, OUTPUT); Em seguida uma variável que chamamos de cont será o nosso contador indicando quantas vezes o led irá piscar, essa variável será a nossa condição de saída da estrutura while. Dentro da estrutura while tem-se a expressão cont = cont + 1; que realiza a soma do contador. No caso do nosso exemplo enquanto a variável cont for menor que 5 o programa continuará sendo executado e quando a condição for atingida será executado um delay de 2 segundos e a variável cont é zerada. Dessa forma com a variável cont = 0 o while será executado novamente e assim sucessivamente o programa será repetido infinitamente. EXEMPLO III: Fazer o LED piscar utilizando a estrutura FOR int led = 7; void setup() { pinMode(led, OUTPUT); } void loop(){ int cont = 0; while(cont < 5){ digitalWrite(led, HIGH); delay(500); digitalWrite(led, LOW); delay(500); cont = cont + 1; } delay(2000); } 22 Nesse programa utilizamos basicamente o código do exemplo II, porém alterando a estrutura while para for. Código fonte: Sintaxe: for(inicialização; condição; incremento) { código..} Instrução: for: verifica se a condição é verdadeira, executa o código e incrementa o contador até que a condição seja falsa. Parâmetros: condição: informação a ser comparada. Retorno: TRUE ou FALSE Explicação do código fonte: Nesse exemplo fica claro que o for é praticamente um while. A diferença está na estrutura, quando utilizamos o for podemos inicializar e incrementar a variável cont, garantindo que o loop será finalizado em algum momento. Capítulo 5 – Exercícios int led = 7; void setup() { pinMode(led, OUTPUT); } void loop(){ int cont; for(cont = 0; cont < 5; cont++){ digitalWrite(led, HIGH); delay(500); digitalWrite(led, LOW); delay(500); } delay(2000); } 23 1) Montar um circuito com um LED e um botão (push button), se o botão estiver pressionado o LED deve piscar em intervalos de 0,5s caso contrário deve piscar em intervalos de 2s. Funcionamento do Push Button de 4 terminais: Quando o botão não está pressionado os terminais estão ligados entre si na vertical, ou seja, o 1 com 3 e o 2 com 4 e quando o botão esta pressionado todos os terminais ficam ligados entre si. 2) Montar um circuito contendo 4 LEDs e 2 botões (push button), cada botão pressionado deve acender dois LEDs conforme mostrado na figura abaixo. OBS.: Para os exercícios de 3 até 5 utilizar um intervalo de pelo menos 1 segundo entre as alterações de estados das sequências. 3) Aproveite o circuito montado no exercício 2, faça com que os LEDs acendam em sequência conforme a figura abaixo representada. 24 Embora não sejam utilizados os botões neste exercício não retire da protoboard,pois serão utilizados posteriormente. 4) Utilizar o circuito do exercício 3 e faça com que os LEDs se acendam conforme a sequência abaixo representada. 25 5) Utilizar o circuito do exercício 2, enquanto o botão da esquerda estiver pressionado a sequência de LEDs deve acender no sentido da esquerda para direita e enquanto o botão da direita estiver pressionado a sequência de LEDs deve acender no sentido da direita para esquerda. Se os dois botões estiverem pressionados todos os LEDs devem estar acesos e se nenhum botão estiver pressionado os LEDs devem permanecer apagados. 6) Montar um circuito com um LED e um botão (push button), se o botão estiver pressionado continuamente o LED deve permanecer aceso, um toque rápido no botão deve fazer com que o LED pisque em intervalos de 0,3s e, neste caso, para parar de piscar o botão deve ser mantido pressionado por mais de 1s (durante o tempo pressionado o LED pode permanecer aceso). 26 6. RELÉ Os relés são dispositivos elétricos que funcionam como interruptores, a sua aplicação mais comum é quando precisamos acionar componentes que demandam alta intensidade de corrente como motores e lâmpadas através de um dispositivo com baixa intensidade de corrente, no caso os transistores e CI’s. Além disso, o dispositivo eletromecânico possui outras vantagens: Acionam um ou mais circuitos ao mesmo tempo; Os sinais de saída são isolados e independentes dos de entrada; O relé pode controlar um sinal DC por meio de tensão AC e vice-versa; Se analisarmos o seu funcionamento notamos que é algo bem simples. As partes que constituem um relé podem ser vistas na figura 6.1a, no caso são as bobinas, uma armadura de ferro móvel, um conjunto de contatos, uma mola de arame e os terminais para conexão. Figura 6.1a - Estrutura do relé Figura 6.1b – Diagrama esquemático: relé Todo o funcionamento do relé está em torno de sua bobina, que nada mais é que um fio em torno de um núcleo de aço. Quando a bobina é energizada ela se torna um eletroímã, pois os materiais que a constituem apresentam baixa relutância para o fluxo magnético, gerando assim um campo magnético. Esse campo magnético irá atuar sobre a armadura móvel atraindo-a podendo abrir, fechar ou comutar os contatos do relé. C B B NF NA 27 Proteção do circuito de acionamento: quando a corrente que circula pela bobina é cortada às linhas de força do campo magnético começam a se contrair havendo a indução de uma tensão alta com polaridade oposta aquela que criou o campo. Para evitar que o circuito de acionamento do relé seja danificado um diodo é colocado em paralelo com as bobinas do relé no sentido inverso a tensão que aciona o relé. Assim o diodo absorverá a energia gerada que poderia danificar outros componentes. Para dimensionamento é recomendado à utilização de um diodo com tensão reversa mínima de 10 vezes a tensão do circuito e a corrente direta maior que a corrente da carga, para obter esses dados é necessária à consulta no datasheet do fabricante. 28 EXEMPLO I: Acionamento do relé utilizando o transistor O circuito que está demonstrado na figura 6.2 será o exemplo que iremos utilizar para testar o acionamento do relé a partir do Arduino. Nesse circuito foi utilizado um transistor BC-337, um resistor de 47Ω, um motor DC e um relé 5V. O circuito montado é destinado a acionar o motor em apenas um sentido, assim caso queira acionar nos dois sentidos uma ponte H deve ser construída. Figura 6.2 – Acionamento do relé simulado na protoboard. É importante notar que nesse exemplo foram utilizadas duas fontes de alimentação, um lado da protoboard é alimentado pelo 5V do Arduino e o outro lado é alimentado por uma fonte externa. A parte de controle comandada pela placa Arduino está totalmente isolada da carga (motor) que é acionada por outra fonte. Dessa forma a parte de controle não tem nenhum contato com a carga, na figura 6.3 é possível observar que a saída é independente da entrada. 29 Figura 6.3 – Diagrama esquemático de acionamento do relé. Código fonte: Explicação do código fonte: Para o controle do motor foi utilizada a porta 8 do Arduino pinMode(8, OUTPUT);, O código faz com que o motor seja acionado indefinidamente por 2 segundos em um intervalo de 1 segundo, pois não temos nenhuma condição de pausa. Capítulo 6 – Exercícios void setup() { pinMode(8, OUTPUT); } void loop() { digitalWrite(8, HIGH); delay(2000); digitalWrite(8, LOW); delay(2000); } 30 1) Utilizar o sensor reed switch para o acionamento do relé. O Arduino deve receber o sinal do reed switch para poder ativar o circuito de acionamento do relé. O relé deverá ligar um motor CC. Figura 1a - Sugestão de montagem do circuito referente ao exercício 1. Figura 2b – Diagrama esquemático da sugestão de montagem do circuito referente ao exercício 1. 2) Elaborar um circuito que simule a ré do carro, o circuito deve atender os requisitos abaixo: B B NF NA + - C 31 Deverão ser utilizados dois botões, um botão para simular que foi engatada a marcha e outro botão sendo o acelerador do carro. Botão 1: quando o botão 1 for acionado um LED ( utilizar o LED interno do Arduino – porta 13) deverá indicar que a marcha ré foi engatada e habilitará o botão da aceleração, se o mesmo for pressionado novamente a luz apaga e o botão da aceleração não poderá funcionar. Botão 2: deverá funcionar somente depois que o botão 1 for acionado, o botão 2 indica o acelerador e deverá acionar o motor. Um sensor do tipo reed switch deverá ser utilizado para indicar a proximidade de um objeto, caso o sensor seja acionado o sistema todo deverá ser desligado. Figura 3a - Sugestão de montagem do circuito referente ao exercício 2. 32 Figura 4b – Diagrama esquemático da sugestão de montagem do circuito referente ao exercício 2. B B NF NA + - C 33 7. PORTA SERIAL Quando ligamos o cabo USB no Arduino e a outra extremidade no computador podemos dizer que é por meio desse cabo que o Arduino se comunica com o computador ou a outros dispositivos que tenham também uma interface. Quando conectado ao computador a placa também é alimentada através dos 5V da porta. Todas as placas Arduino possui pelo menos uma porta Serial, conhecida como UART ou USART. No Arduino UNO a comunicação é feita através dos pinos digitais 0 (RX) e 1(TX). O termo serial significa um após o outro, ou seja, quando transferimos os dados enviamos um bit de cada vez, um após o outro. Figura 7.1 – Transmissão dos bits A transmissão da informação entre o Arduino e o Computador é feita através do cabo USB. A informação é transmitida com zero (0) e um (1), conhecido também como bits. Na figura 7.1 está a representação de uma informação sendo transmitida. Para analisar se a placa está enviando ou recebendo informação é só verificar os LEDs indicadores na placa Arduino, que podem ser visualizados na figura 7.2. Notamos que ao lado do TX e RX existem dois LEDs e à medida que enviamos ou recebemos34 informações eles acendem ou apagam, assim um pisca quando o Arduino está recebendo dados (RX) e o outro pisca quando o Arduino está transmitindo dados (TX). Figura 7.2 – TX e RX da placa Arduino. Porém se só executarmos a transmissão e recepção dos dados através do código programado conseguiremos ver somente as luzes piscando, para conseguir visualizar o que está acontecendo devemos abrir o Serial Monitor que já está incorporado na IDE do Arduino. Através desse ícone é possível acessar o Serial Monitor e monitorar a comunicação serial entre o Arduino e o computador. Ou através da barra de ferramentas: Tools> Serial Monitor É importante lembrar que só podemos abrir o Serial Monitor com uma placa Arduino conectada, pois ela precisa iniciar uma conexão. Na figura 7.3 podemos visualizar o monitor serial incorporado na IDE do Arduino. Figura 7.3 - Serial Monitor. EXEMPLO I: ESCREVENDO UMA FRASE NO SERIAL MONITOR 35 Nesse exemplo iremos transmitir apenas a frase “Hello World!” pela porta serial. Código fonte: Sintaxe: Serial.begin(taxa); Parâmetros: Serial.begin: habilita a porta serial. taxa: fixa a taxa de transmissão e recepção em bits por segundo entre o computador e o Arduino. Retorno: nada. Código fonte: Sintaxe: Serial.println(valor, formato); Parâmetros: Serial.println: envia para a porta serial um caractere ASCII que pode ser capturado por um terminal de comunicação. valor: o caractere que será enviado. Formato: é opcional e especifica com quantas casas decimais ou com que base numérica vai ser o número transmitido. Retorno: Caracteres ASCII que fazem o cursor ir para o início da próxima linha, caso deseje continuar escrevendo na mesma linha deve utilizar o comando Serial.print . Explicação do código fonte: No código mostrado no exemplo I a função setup() ativa a porta serial em 9600 bits/s e a função loop(), transmite a frase “Hello World” pela porta serial a cada 2 segundos. OBS.: Para que a transmissão seja realizada corretamente é necessário que a velocidade no painel da Serial Monitor seja a mesma utilizada pelo arduino. Este valor pode ser fixado na parte inferior direita da janela como podemos ver na figura 7.4. void setup(){ Serial.begin(9600); } void loop(){ Serial.println("Hello World!"); delay(2000); } void setup(){ Serial.begin(9600); } void loop(){ Serial.println("Hello World!"); delay(2000); } 36 Figura 7.4 – Velocidade do Serial Monitor 37 EXEMPLO II: ESCREVENDO UMA LETRA(BYTE) A PARTIR DE UMA ENTRADA NO SERIAL MONITOR Iremos utilizar o Serial Monitor para escrever uma letra (ou byte) e quando a mensagem for enviada faremos com que seja escrita no monitor. Código fonte: Sintaxe: Serial.available(); Parâmetros: Serial.available: obtém o número de bytes disponíveis para leitura no buffer da porta serial. Retorno: retorna o número de bytes disponíveis ou zero (0) quando não há informação na porta serial. Código fonte: Sintaxe: Serial.read(); Parâmetros: Serial.read: lê o primeiro byte que está no buffer da porta serial Retorno: retorna o primeiro byte de dados da porta serial ou -1 quando não há informação na porta serial. Código fonte: Sintaxe: Serial.write(); Parâmetros: Serial.write: Escreve os dados em binário na porta serial, para enviar os caracteres que representam os dígitos utilizar a função Serial.print() em seu lugar. Retorno: retorna o número de bytes escritos, a leitura é opcional. byte msg; void setup() { Serial.begin(9600); } void loop() { if (Serial.available()){ msg = Serial.read(); Serial.write(msg); } } byte msg; void setup() { Serial.begin(9600); } void loop() { if (Serial.available()){ msg = Serial.read(); Serial.write(msg); } } byte msg; void setup() { Serial.begin(9600); } void loop() { if (Serial.available()){ msg = Serial.read(); Serial.write(msg); } } 38 Explicação do código fonte: Inicialmente não será exibido nada no monitor serial, pois precisamos de uma entrada. Assim que enviarmos um dado a função Serial.available() reconhecerá o número de caracteres disponível para leitura e em seguida o dado é lido através da função Serial.read() e posteriormente é escrito no monitor através da função Serial.write(). Funções e comandos extras: digitalWrite(porta,!digitalRead(porta)): inverte o estado do porta digital. Operador +=: é utilizado para concatenar os bytes, formando uma string. '0': geralmente as strings são terminadas com caractere nulo que na tabela ASCII é representado por 0 indicando o final da string. tone(porta,frequência): envia um sinal para porta indicada na frequência selecionada. noTone(porta) : desliga o sinal gerado pela função “tone()” na porta selecionada. 39 Capítulo 7 – Exercícios 1) Se a taxa de transferência de dados do Arduino está em 9600 bps e você está enviando 12 bytes de dados, quanto tempo leva para enviar esta informação? 2) Se a taxa de transferência de dados do Arduino está em 19200 bps e você está enviando 12 bytes de dados, quanto tempo leva para enviar esta informação? 3) Exibir um contador no Serial Monitor atualizado a cada 1s, quando o contador chegar a 10 ele deve ser reiniciado. 4) Ligue dois LEDs ao arduino, ao digitar o número da porta do LED ele deve acender e se estiver aceso ele deve apagar. 5) Ligue dois LEDs e dois botões (um para cada LED) ao arduino, quando o botão for pressionado o LED deve mudar de estado (aceso/apagado) e deve ser informado no Serial Monitor qual seria o estado do LED. 6) A partir da nota musical digitada no Serial Monitor o buzzer deverá ser acionado na frequência correspondente. • Frequência das notas musicais: • Sol (396Hz) • Lá (440Hz) • Si(495Hz) • Dó(528Hz) • Ré(594Hz) • Mi(660Hz) • Fá(704Hz) 40 8. FUNÇÃO pulseIn() E O SENSOR DE ULTRASSOM A função pulseIn() retorna o tempo que um pino leva até receber o estado indicado (LOW ou HIGH) ou seja, ao ser iniciada esta função começa a contar o tempo em microssegundos, quando o pino recebe o estado configurado na função ela interrompe o contador retornando o total de tempo. Sintaxe: pulseIn(pino,estado,tempo limite) pino: inserir o número do pino a ser verificado. estado: definir o estado a ser verificado (HIGH ou LOW). tempo limite: este parâmetro é opcional e define o tempo máximo que a função vai esperar para que ocorra o estado indicado. Por default o tempo limite é de 1 segundo. Exemplo: long Tempo = pulseIn(6,HIGH); Neste exemplo é criada uma variável chamada Tempo que recebe o tempo decorrido até o pino 6 receber o valor HIGH. SENSOR DE ULTRASSOM Os sensores de ultrassom são equipamentos que utilizam as ondas sonoras para medir a distância entre o sensor e um determinado objeto. O sensor é composto por um emissor e um receptor de ultrassom, o emissor emite uma onda na frequência do ultrassom e se houver algum objeto na frente parte da onda vai refletir e voltar para o ultrassom. O sinal de saída do sensor é dado pelo tempo que a onda levou para ir e voltar, assim para o calculo da distância basta multiplicar o tempo pela velocidadedo som no ar (343 m/s) e depois dividir por dois, ida e volta da onda. Os sensores mais comuns de ultrassom normalmente são constituídos por dois módulos de ultrassom, um emissor e o outro receptor, o emissor está ligado ao pino Trig e o receptor ao pino Echo. Quando aplicamos uma tensão (normalmente 5V) no pino Trig o módulo passa a emitir um sinal ultrassônico, o modulo ligado ao pino Echo, quando 41 recebe um sinal ultrassônico fornece uma tensão neste pino, ou seja, através da diferença de tempo entre a emissão e a recepção podemos calcular a distância do sensor até um objeto. No sensor existem ainda mais dois pinos um de alimentação (Vcc) e um de terra (Gnd), como podemos observar na figura 8.1. Figura 9.1 – Sensor HC-SR04 Capítulo 8 – Exercício 1) Utilizar o sensor de ultrassom e mostrar no Serial Monitor a distância, em centímetros, de um objeto até o sensor. Obs.: Para calcular a distância você pode utilizar a seguinte expressão: Distância = Velocidade da onda * tempo em microssegundos / 20000 42 9. DISPLAY LCD 16X02 Os displays LCD são componentes essenciais em muitas aplicações onde se utiliza um microcontrolador, pois deixa o projeto muito mais amigável e atraente. Com a inclusão do display é possível disponibilizar parâmetros e informações ao usuário, aumentando assim a gama de funções e operações com baixo custo de implementação. Um diferencial do display é a sua simplicidade de uso, alguns modelos como o que utiliza o processador HD44780 podem ser utilizados com apenas 4 vias de dados (modo 4 bits), economizando as portas do microcontrolador. Porém para quem está desenvolvendo um projeto que exige muito do display e precisa de uma taxa de atualização mais eficiente recomenda-se utilizar o display no modo 8 bits, obtendo assim um ganho de performance. Nas figuras 9.1 e 9.2 pode-se observar o diagrama esquemático do display LCD. Figura 9.1 – Diagrama esquemático do display LCD. Figura 9.2 – Display LCD. Na tabela 9.1 está descrito a função de cada pino de controle. 43 Pino Nome Função 1 Vss Terra/ GND 2 Vdd Positivo (5V) 3 V0/ Vee Controla o contraste, a partir de uma tensão de 0 à +5V. Para o controle basta utilizar um potenciômetro entre 10kΩ e 20kΩ. 4 RS Indica se o dado enviado é um comando ou um caractere. 5 R/W Informa se o comando é de leitura (1) e gravação (0) 6 E Informa que o dado está pronto para ser lido pelo display LCD. 7 D0 Barramentos de dados de 8 bits. O barramento pode ser utilizado de duas formas, com os oito sinais em paralelo ou quatro sinais (D4 a D7) que são transmitidos em dois pacotes, conhecido também como “nibble”. 8 D1 9 D2 10 D3 11 D4 12 D5 13 D6 14 D7 15 A Controle da luz de fundo (Anodo) 16 K Controle da luz de fundo (Catodo) Tabela 9.1 – Características do Display LCD. UTILIZANDO BIBLIOTECAS COM O ARDUINO Quando pensamos em bibliotecas temos em mente uma sala cheia de livros de diversas áreas, podemos fazer essa analogia à biblioteca utilizada com os microcontroladores, nesse caso seria uma pasta que contém arquivos de diversos dispositivos. Cada dispositivo possui suas particularidades, como por exemplo, o display LCD, na tabela 9.1 podemos ver que existem pinos de controle de gravação, controle de dados e assim por diante, o que a biblioteca faz é se encarregar de toda essa parte de baixo nível e deixa de forma mais simples a sua utilização. Mas para isso ser possível um usuário precisou estudar toda a estrutura do dispositivo, qualquer pessoa é capaz de desenvolver a sua biblioteca basta conhecer/ estudar o dispositivo desejado. Na web existem diversas bibliotecas disponíveis para download e a que iremos estudar é a LiquidCrystal. Como essa biblioteca vem com a IDE do Arduino não é necessário baixá-la. EXEMPLO I: Demonstração do funcionamento do display LCD 44 O intuito do exemplo é demonstrar o funcionamento do display LCD através da biblioteca LiquidCrystal. Figura 9.3 – Montagem do display LCD no Arduino. Figura 9.4 – Circuito esquemático da montagem do display LCD no Arduino. 45 Explicação do circuito: No circuito esquemático na figura 9.3 demonstra a ligação dos pinos do display LCD. É válido lembrar que o pino R/W do display foi colocado no GND, pois está indicando o modo de gravação. O display também está ligado no modo 4bits, ou seja, apenas os pinos de dados D4, D5, D6, D7 foram ligados. O pino V0 do display é correspondente ao contraste e para o seu ajuste foi acionado um potenciômetro de 10KΩ, sem o potenciômetro os caracteres podem não aparecer no visor. Adicionando a biblioteca LiquidCrystal No início do programa é onde adicionamos as bibliotecas que iremos utilizar ao longo da programação. Para adicionar a biblioteca LiquidCrystal basta acessar na IDE do Arduino Sketch/ Import Library/ LiquidCrystal. Na figura 9.1 segue a demonstração de como adicionar a biblioteca. Figura 9.5 – Inserindo a biblioteca LiquidCrystal. 46 Código fonte: Sintaxe: LiquidCrystal lcd(RS, Enable, D4, D5, D6, D7); Parâmetros: lcd: é uma variável do tipo LiquidCrystal. RS: deve ser inserido o número da porta que o RS que está conectado ao Arduino. Enable: deve ser inserido o número da porta que o Enable está conectado ao Arduino. D4 – D7: inserir os números das portas que os pinos de dados estão conectados ao Arduino. Retorno: nada Código fonte: Sintaxe: lcd.begin(colunas, linhas) Parâmetros: lcd: é uma variável do tipo LiquidCrystal. colunas: inserir o número de colunas do display que está sendo utilizado. linhas: inserir o número de linhas do display que está utilizado. Retorno: nada #include <LiquidCrystal.h> LiquidCrystal lcd(12, 11, 10, 5, 4, 3, 2); void setup() { lcd.begin(16,2); lcd.print("hello, world!"); } void loop() {} #include <LiquidCrystal.h> LiquidCrystal lcd(12, 11, 10, 5, 4, 3, 2); void setup() { lcd.begin(16,2); lcd.print("hello, world!"); } void loop() {} 47 Código fonte: Sintaxe: lcd.print(data) Parâmetros: lcd: uma variável do tipo LiquidCrystal. print: exibe as informações desejadas no display. data: inserir as informações que se deseja exibir no display (char, byte, int, long ou string). Retorno: o print() retorna o número de bytes escrito, a leitura desse dado é opcional. Explicação do código fonte: No exemplo o pino RS do display foi ligado ao pino 12 do Arduino e o pino Enable foi ligado na porta 11. Os pinos de dados D4, D5, D6, D7 estão ligados respectivamente nas portas 5, 4, 3, 2. #include <LiquidCrystal.h> LiquidCrystal lcd(12, 11, 10, 5, 4, 3, 2); void setup() { lcd.begin(16,2); lcd.print("hello, world!"); } void loop() {} 48 Capítulo 9 – Exercícios 1) Fazer um cronômetro para marcar minutos e segundos exibidos em um display LCD, ligar um botão ao circuito e quando este for pressionado o cronômetro deve ser zerado. 2) Desenvolver um circuito para sinalizar a proximidade do objeto com o sensor de ultrassom, o circuito deve atender os requisitos abaixo: A distância do objetodeve ser exibida display LCD; Assim que a distância for menor que 30 cm um alarme deve ser ativado, no caso um buzzer que imitirá bips. Se a distância for menor que 15 cm o alarme sonoro deve ficar contínuo. Se a distância for menor que 8 cm o circuito deve ser desligado e uma fileira de LEDs deverá acender da esquerda para esquerda indicando que o sistema está desligado.
Compartilhar