Академический Документы
Профессиональный Документы
Культура Документы
APOSTILA ARDUINO
Com aplicaes baseada na placa: ARDUINO UNO
www.fbseletronica.com.br
V0RV1
1 www.facebook.com/fbseletronica
Sumrio
1 2 3 4 5 6 Sobre a FBS Eletrnica ........................................................................................ 5 Termos de uso.................................................................................................... 5 Objetivos ........................................................................................................... 6 Introduo ......................................................................................................... 6 O que ARDUINO? ............................................................................................. 7 Plataforma de desenvolvimento ARDUINO .............................................................. 8 6.1 6.2 Hardware do ARDUINO ................................................................................... 8 Software do ARDUINO .................................................................................... 9 IDE do ARDUINO ..................................................................................... 10
6.2.1 7
Programao ..................................................................................................... 13 7.1 7.2 7.3 Estrutura de um programa ARDUINO .............................................................. 13 Funes ....................................................................................................... 13 Constantes................................................................................................... 15 Definindo estados lgicos, true(verdadeiro) e false(falso) ............................. 15 Definindo Nvel lgico alto e baixo nos pinos ............................................... 15 Definindo direo de um pino digital e Pull-up ............................................. 15
Variveis ..................................................................................................... 16 Escopo de variveis....................................................................................... 16 Qualificadores de variveis ............................................................................. 17 static ..................................................................................................... 17 volatile................................................................................................... 17 const ..................................................................................................... 18
Tipos de dados ............................................................................................. 18 void ....................................................................................................... 19 Boolean ................................................................................................. 19 char ...................................................................................................... 20 unsigned char ......................................................................................... 20
2 www.facebook.com/fbseletronica
7.7.5 7.7.6 7.7.7 7.7.8 7.7.9 7.7.10 7.7.11 7.7.12 7.7.13 7.8
byte ...................................................................................................... 20 int ......................................................................................................... 20 unsigned int ........................................................................................... 21 word ...................................................................................................... 21 long ....................................................................................................... 21 unsigned long ...................................................................................... 21 short................................................................................................... 22 float.................................................................................................... 22 double ................................................................................................ 22
string (vetor do tipo char) .............................................................................. 23 Vetores de string ....................................................................................... 24 Operadores ............................................................................................... 24 Atribuio ............................................................................................ 25 Aritmticos .......................................................................................... 25 Operadores Relacionais ......................................................................... 26 Operadores Lgicos .............................................................................. 26 Operadores Lgicos Bit a Bit .................................................................. 27
7.11.1 7.11.2 7.11.3 7.11.4 7.11.5 7.12 7.13 7.14 7.15 7.16 7.17 7.18
Associao de operadores ........................................................................... 29 if .............................................................................................................. 30 switch....................................................................................................... 31 for ........................................................................................................... 32 while ........................................................................................................ 33 do - while ................................................................................................. 34 Diretivas do compilador .............................................................................. 34 #define ............................................................................................... 34 #include .............................................................................................. 35
7.18.1 7.18.2
3 www.facebook.com/fbseletronica
7.19
Funes do ARDUINO ................................................................................. 36 Funes de Entrada/Sada Digital ........................................................... 36 Funes de Entrada Analgica ................................................................ 38 Funes de temporizao ...................................................................... 39 Funes de bit e byte ............................................................................ 42 Funes matemticas............................................................................ 44 Funes de Converso .......................................................................... 47
Projetos ............................................................................................................ 50 8.1 8.2 8.3 8.4 8.5 Sada digital - Piscar LED ............................................................................... 50 Entrada Digital Lendo tecla .......................................................................... 53 Entrada analgica Lendo o valor em um potencimetro................................... 59 Comunicao Serial ....................................................................................... 62 6.5. Sada PWM ............................................................................................ 68
REFERNCIAS ................................................................................................... 70
4 www.facebook.com/fbseletronica
2 TERMOS DE USO
Este material de domnio pblico podendo ser livremente distribudo. proibida a venda deste material. Pode ser usado livremente, s pedimos que seja citadas na referncias quando usada para compor outros artigos. E-mail do desenvolvedor: fbseletronica@hotmail.com
5 www.facebook.com/fbseletronica
3 OBJETIVOS
O objetivo desta apostila apresentar a plataforma ARDUINO. Ser baseada na plataforma ARDUINO UNO onde sero abordados os conceitos bsicos de hardware e software com exemplos prticos.
4 INTRODUO
A plataforma Arduino est presente em muitos artigos na internet, porm para quem est iniciando na programao dessa plataforma geralmente sente dificuldade de um ter um ponto de partida. A fonte de principal de pesquisa deve ser o site do prprio Arduino, l esto as informaes bsicas para iniciar. Um fator que bloqueia os iniciantes o fato desse site ser em ingls. Essa apostila usa como referncia principal o site do Arduino, e o objetivo apresentar para os iniciantes um ponto de partida para essa plataforma. abordado a teoria bsica da plataforma, assim como a linguagem de programao e so apresentados no captulo final alguns exemplos para colocar em prtica. Esperamos que essa apostila colabore com a comunidade que a cada dia que passa cresce mais. Bons estudos!!
Caso encontrem erros (tero muitos), por gentileza nos enviem um e-mail para correo. e-mail: fbseletronica@hotmail.com
6 www.facebook.com/fbseletronica
5 O QUE ARDUINO?
ARDUINO uma plataforma flexvel open-source de hardware e software para prototipagem eletrnica. destinada a designers, hobbistas, tcnicos, engenheiros e pessoas interessadas em criar projetos ou ambientes interativos. ARDUINO pode receber entradas de uma variedade de sensores e pode atuar o ambiente ao seu redor por controladores de iluminao, motores e uma infinidade de atuadores. O microcontrolador presente na placa programado usando a linguagem de programao do ARDUINO (baseada em wiring) e o ambiente de desenvolvimento ARDUINO (baseada em processing). Os projetos com ARDUINO podem ser STANDALONE ou comunicar com um software rodando no PC. Os kits de desenvolvimento podem ser montados pelo prprio projetista ou podem ser compradas e o software pode ser baixado gratuitamente no site do ARDUINO. Os projetos de hardware para referncias esto disponveis em www.arduino.cc, sob licena open-source, onde est livre para adaptao as suas necessidades.
O ARDUINO diferente das outras plataformas presentes no mercado devido aos seguintes fatores: um ambiente multiplataforma, podendo ser executado em Windows, Macintosh e Linux; Tem por base um ambiente de fcil utilizao baseado em processing; Pode ser programado utilizando um cabo de comunicao USB onde geralmente no necessria uma fonte de alimentao; Possui hardware e software open-source, facilitando a montagem do seu prprio hardware sem precisar pagar nada aos criadores originais; Hardware de baixo custo; Grande comunidade ativa de usurios; Ambiente educacional, ideal para iniciantes que desejam resultados rpidos.
7 www.facebook.com/fbseletronica
Conforme visto na imagem acima a placa Arduino UNO possui diversos conectores que servem para interface com o mundo externo. A seguir e dada uma explicao de como cada pino da placa pode ser utilizado. 14 pinos de entra e sada digital (pinos 0-13):
8 www.facebook.com/fbseletronica
Esses pinos podem ser utilizados como entradas ou sadas digitais de acordo com a necessidade do projeto e conforme foi definido no sketch criado na IDE.
6 pinos de entradas analgicas (pinos 0 - 5): o Esses pinos so dedicados a receber valores analgicos, por exemplo, a tenso de um sensor. O valor a ser lido deve estar na faixa de 0 a 5 V onde sero convertidos para valores entre 0 e 1023.
6 pinos de sadas analgicas (pinos 3, 5, 6, 9, 10 e 11): o So pinos digitais que podem ser programados para ser utilizados como sadas analgicas, utilizando modulao PWM.
A alimentao da placa pode ser feita a partir da porta USB do computador ou atravs de um adaptador AC. Para o adaptador AC recomenda-se uma tenso de 9 volts com pino redondo de 2,1 mm e centro positivo.
A partir do momento que o software gravado no ARDUINO no precisa mais do computador: o ARDUINO funciona como um computador independente e conseguir sozinho executar o sketch criado, desde que seja ligado a uma fonte de energia.
9 www.facebook.com/fbseletronica
10
OBS.: Caso o sistema operacional utilizado seja diferente do Windows, pode haver algumas diferenas, mas o IDE basicamente o mesmo. O IDE dividido em trs partes: A Toolbar no topo, o cdigo ou a Sketch Window no centro, e a janela de mensagens na base, conforme exibido na figura abaixo:
10 www.facebook.com/fbseletronica
11
Sob a Toolbar h uma guia, ou um conjunto de guias, com o nome do arquivo do sketch. Tambm h um boto posicionado no lado direito que habilita o serial monitor. Ao longo do topo h uma barra de menus, com os itens File, Edit, Sketch, Tools e Help. Os botes na Toolbar fornecem acesso conveniente s funes mais utilizadas dentro desses menus. Abaixo so identificados os cones de atalho da IDE: Verify o Verifica se existe erro no cdigo digitado. Upload o Compila o cdigo e grava na placa Arduino se corretamente conectada; New o Cria um novo sketch em branco. Open
11 www.facebook.com/fbseletronica
12
o Abre um sketch, presente no sketchbook. Save o Salva o sketch ativo Seria monitor o Abre o monitor serial. Os demais comandos presentes na barra de menus podem ser consultados atravs do help do IDE.
12 www.facebook.com/fbseletronica
13
7 PROGRAMAO
7.1 Estrutura de um programa ARDUINO
A estrutura bsica de um programa para ARDUINO extremamente simples e dividida em dois blocos de funes. Primeiro bloco de funo chamado de setup () e o segundo chamado de loop (). A estrutura exibida a seguir: void setup() { procedimentos; } void loop() { procedimentos; } A funo setup() responsvel pela configurao inicial do ARDUINO e a funo loop() responsvel pela execuo das tarefas. Ambas as funes so requeridas para o correto funcionamento do ARDUINO. A funo setup segue logo abaixo da declarao de variveis no inicio do programa. Esta a primeira funo a ser executada e usada para configurao dos pinos ou inicializao da comunicao serial. A funo loop vem em seguida e inclui os comandos que sero executados durante o funcionamento do ARDUINO, por exemplo: leitura de entradas, acionamento de sadas, etc. Essa a funo principal do ARDUINO onde executada a maior parte dos comandos.
7.2 Funes
Funo um bloco de cdigo que possui um nome e procedimentos que so executados quando a mesma chamada. As funes setup() e loop() foram explicados anteriormente e as demais funes do compilador sero apresentadas mais a frente neste captulo. Funes customizadas podem ser escritas para simplificar em tarefas repetitivas reduzindo repeties na programao. Funes so declaradas primeiramente definindo o seu tipo, que dir qual o tipo de dado retornado pela funo. Depois de definido o tipo de retorno
13 www.facebook.com/fbseletronica
14
deve dar um nome a funo e definir entre parntese se algum parmetro deve ser passado para a funo, conforme exemplo de cdigo a seguir:
A seguinte funo do tipo inteiro chamada delayVal() usada para atribuir um valor no programa atravs da leitura de um potencimetro. Dentro do bloco da funo primeiramente declarado a varivel local do tipo inteira chamada v, depois atribudo o valor lido do potencimetro pela funo analogRead(pot) que retorna um valor entre 0 e 1023, depois este valor divido por 4 para dar um resultado final entre 0 e 255. Finalmente retornado este valor para o programa principal. int delayVal() { int v; v = analogRead(pot); v /= 4; return v; } Os seguintes smbolos so utilizados na construo de funes: { } as chaves so utilizadas para delimitar os blocos de funes, dentro das chaves se encontram os procedimentos da funo:
tipo funo () { procedimentos; }
// create temporary variable 'v' // read potentiometer value // converts 0-1023 to 0-255 // return final value
; - ponto e vrgula so utilizados para marcar o final do procedimento; int x = 13; // declara a varivel 'x' como um inteiro igual a 13 //- qualquer caractere despois das duas barras ignorado pelo compilador, utilizado para comentrios de apenas uma nica linha. // comentrio de linha simples como no exemplo acima
14 www.facebook.com/fbseletronica
15
/*........*/ - qualquer texto entre esses smbolos ignorado pelo compilador, usado para comentar varias linhas.
/* comentrio de mltiplas Linhas geralmente utilizado Para documentao ou para Ignorar uma sequncia de Cdigos*/
7.3 Constantes
A linguagem Arduino possui algumas programao. So divididas em grupos: constantes pr-definidas que auxiliam na
15 www.facebook.com/fbseletronica
16
7.4 Variveis
Variveis so posies na memria de programa do ARDUINO marcadas com um nome e o tipo de dado que iro ser armazenados nessa posio. Essa posio de memria pode receber valores durante a execuo do programa e podem ser alterados a qualquer momento pelo programa e deve ser respeitado o tipo de dado da varivel. Ates de ser utilizada uma varivel ela deve ser declara com um tipo e nome, e opcionalmente pode ser atribuir um valor a ela. E seguida apresentado um trecho de cdigo onde declarada uma varivel do tipo inteira chamada entradaAnalog e atribudo incialmente o valor zero e em seguida atribudo o valor da entrada analgica 2 a esta varivel, vejamos:
Int entradaAnalog = 0; entradaAnalog = analogRead(2); //declara a varivel e atribui o valor 0 //atribui o valor da entrada analgica 2
OBS.: Os nomes dados as variveis podem descrever sua aplicao, para ficar mais fcil o entendimento do cdigo durante o desenvolvimento ou em uma manuteno do mesmo no futuro.
16 www.facebook.com/fbseletronica
17
// 'i' uma varivel local //visvel apenas no loop for // f uma varivel local dentro de loop
7.6.2
volatile
um qualificador de varivel que usado antes do tipo de dado para modificar o modo pelo qual o compilador e programa subsequente trata essa varivel. Especificamente, ele orienta o compilador a carregar a varivel a partir da RAM e no a partir de um registador de armazenamento, o que uma localizao de memria temporria em que as variveis do programa so armazenadas e manipuladas. Sob certas condies o valor de uma varivel armazenada em registros pode ser imprecisa. Uma varivel deve ser declarada voltil sempre que o seu valor pode ser alterado por algo alm do controle da seo de cdigo em que ela aparece como na carente thread executada. No Arduino, o nico lugar que isto provvel de ocorrer em sees de cdigo associado com interrupes, chamado de rotina de servio de interrupo. Exemplo:
// Inverte estado do LED quando interrupo executada int pin = 13; volatile int state = LOW; void setup() {
17 www.facebook.com/fbseletronica
18
pinMode(pin, OUTPUT); attachInterrupt(0, blink, CHANGE); } void loop() { digitalWrite(pin, state); } void blink() { state = !state; }
7.6.3
const
um qualificador que modifica o comportamento da varivel, tornando uma varivel "readonly". Isto significa que a varivel pode ser utilizada tal como qualquer outra varivel do seu tipo, mas o seu valor no pode ser alterado. Voc receber um erro do compilador se voc tentar atribuir um valor a uma varivel const. Constantes definidas com a palavra-chave const obedecer as regras de escopo de variveis que governam outras variveis.
Exemplo:
const float pi = 3.14; float x; // .... x = pi * 2; pi = 7; // legal usar const em expresses matemticas // illegal - you can't write to (modify) a constant
Voc pode usar const ou #define para criar constates numricas ou constantes de textos. Para vetores voc vai precisar usar const. Em geral prefervel a const a #define para definir constantes.
18 www.facebook.com/fbseletronica
19
7.7.1
void
A palavra reservada void usada em declaraes de funes. Este tipo indica que a funo no retorna nenhum valor quando executada. Exemplo:
// as funes setup e loop no retornam valores quando so executadas void setup() { // ... }
7.7.2
Boolean
O tipo boolean pode representar valores booleanos, verdadeiro (true) ou falso(false). Um tipo boolean ocupa um byte da memria. Exemplo:
int LEDpin = 5; int switchPin = 13; // LED no pino 5 // chave no 13 //varivel booleana
boolean running = false; void setup() { pinMode(LEDpin, OUTPUT); pinMode(switchPin, INPUT); digitalWrite(switchPin, HIGH); }
//configura pino como sada //configura pino como entrada //Liga pullup do pino
void loop() { if (digitalRead(switchPin) == LOW) //se pino em nvel baixo { // switch is pressed // pullup keeps pin high //normally delay(100); running = !running; digitalWrite(LEDpin, running) } } // delay to debounce switch // toggle running variable // indicate via LED
19 www.facebook.com/fbseletronica
20
7.7.3
char
O tipo char armazena valores de 1 byte. Caracteres so codificados em um nico byte e so especificados na tabela ASCII. O tipo char sinalizado e representa nmeros de -128 a 127. Para nmeros no sinalizados usa-se o tipo byte. Exemplo char myChar = 'A'; char myChar = 65; // both are equivalent
7.7.4
unsigned char
unsigned char armazena valores de 1 byte no sinalizados, mesmo que utiliza o tipo byte. A faixa de valores vai de 0 a 255. Para programao consistente no estilo Arduino o tipo byte preferido para esse tipo de dado. Exemplo unsigned char myChar = 240;
7.7.5 byte
Armazena valores de 8 bits no sinalizados de 0 a 255. Exemplo byte b = B10010; // B10010 = 18 decimal
7.7.6 int
Inteiros so tipos primrios de armazenamento. No Arduino Uno ( e em outras placas baseadas em ATMEGA) um int armazena valores de 16 bits(2 bytes). Esse tipo compreende valores de -32768 a 32767. J no Arduino Due, um int armazena valores de 32 bits (4 bytes) que compreende valores de -2147483648 a 2,147483647. Exemplo:
int ledPin = 13;
Quando o valor contido na varivel excede o seu valor mximo o seu valor reiniciado para o mnimo. Exemplo
int x; x = -32768; x = x - 1; //atribui o valor mnimo a varivel x // x agora contm o valor mximo: 32,767
20 www.facebook.com/fbseletronica
21
7.7.8 word
O tipo armazena valores de 16 bis no sinalizados que compreendem valores de 0 a 65535. Exemplo
word w = 10000;
7.7.9 long
O tipo de dado Long armazena valores inteiros sinalizados de 32 bits (4 bytes) que compreendem a faixa de -2147483648 a 2147483647 Exemplo
long speedOfLight = 186000L;
7.7.10
unsigned long
O tipo unsigned long armazena valores de 32 bits(4 bytes) no sinalizados que compreendem a faixa de 0 a 429967295. Exemplo
unsigned long time; void setup() { Serial.begin(9600); } void loop()
21 www.facebook.com/fbseletronica
22
7.7.11
Exemplo
short
7.7.12
float
O tipo float armazena valor em ponto flutuante, ou seja, um valor que possui casas decimais. O tipo float armazena valores de 32 bits (4 bytes) e compreendem a faixa de 3,4028235 E+38 a 3,4028235 E+38.4. A matemtica em ponto flutuante requer muito processamento, por exemplo, se for feita uma operao em ponto flutuante dentro de um loop, ocorrer um atraso maior, do que se fosse feita uma operao com inteiros. Deve-se ficar atento ao uso do tipo float tanto na questo de espao de memria quanto no processamento. As funes de manipulao do tipo float requerem muito processamento, Exemplos
float myfloat; float sensorCalbrate = 1.117;
7.7.13
double
O tipo double tambm armazena valores de ponto flutuante, porm no Arduino Uno e outras placas baseadas em ATMEGA esse tipo exatamente o mesmo que o tipo float, sem ganho de preciso, j no Arduino Due o tipo double pussui 64 bits (8 bytes) provendo maior preciso, seu valor mximo pode chegar a 1,7976931348623157 x 10308.
7.8 Vetores
Uma matriz uma coleo de variveis que so acessadas por meio de um ndice. Matrizes em um programa em linguagem C, na qual o Arduino baseado, pode ser um pouco
22 www.facebook.com/fbseletronica
23
complicado. Mas utilizando uma matriz de linha simples, conhecida como vetores, pode tornar a programao mais simples.
Declarar um vetor de char com um caractere adicional que o compilador encarregar de colocar o caractere nulo:
char Str2[8] = {'a', 'r', 'd', 'u', 'i', 'n', 'o'};
Declarar um vetor de char inicializando com todos os caracteres inclusive o caractere nulo
char Str3[8] = {'a', 'r', 'd', 'u', 'i', 'n', 'o', '\0'};
Inicializar o vetor sem tamanho determinado e atribuir uma string.O compilador se encarrega de determinar o tamanho, conforme tamanho da string atribuda e adiciona o caractere nulo automaticamente:
char Str4[ ] = "arduino";
23 www.facebook.com/fbseletronica
24
Inicializar vetor com tamanho determinado e atribuir uma string para inicializar. Importante observar que o tamanho deve ser suficiente para conter o caractere nulo:
char Str5[8] = "arduino";
Inicializar o vetor com tamanho extra e inicializar com uma string de quantidades de caracteres menor que a quantidades de variveis no vetor:
char Str6[15] = "arduino";
7.11 Operadores
A linguagem C muito rica em operadores sendo possivelmente uma das linguagens com maior numero de operadores disponveis. Possui operadores encontrados em linguagens de alto nvel como operadores encontrados em linguagens de baixo nvel como o Assembly. Os operadores so divididos nas seguintes categorias: Atribuio, aritmticos, relacionais, lgicos, lgicos bit a bit.
24 www.facebook.com/fbseletronica
25
7.11.1
Atribuio
O operador de atribuio em linguagem C o =, que utilizado para atribuir determinado valor a uma varivel. Exemplo:
x = 10; y = x+3;
Verificando as linhas anteriores duas operaes de atribuio foram feitas. Primeiro foi atribudo o valor 10 a varivel x, e na segunda foi atribudo o resultado da soma entre a varivel x(que 10) com o valor 3, portanto ao final desta operao ser atribudo o valor 13 a varivel y. A atribuio sempre feita da direita para a esquerda.
7.11.2
Aritmticos
So utilizados para efetuar operaes matemticas, a tabela abaixo exibe os operadores aritmticos disponveis na linguagem C: OPERADOR + * / % ++ -AO Adio Subtrao Multiplicao Diviso Resto de diviso inteira Incremento Decremento
Os operadores de adio, subtrao, multiplicao e diviso possuem a mesmas funes j conhecida em matemtica. O operador % utilizado para retornar o resto de uma diviso inteira. Exemplo:
x = 5%2; //retorna para a varivel x o valor 1 que o resto de uma diviso inteira de 5 por 2.
Os operadores de incremento e decremento so utilizados para adicionar ou subtrair em 1 o valor de uma varivel. Exemplos:
x= 10; x++; //incrementa em 1 o valor da varivel x, portanto x valer 11 x = 20; x--; //decrementa em 1 do valar da varivel x, portanto x valer 19
25 www.facebook.com/fbseletronica
26
7.11.3
Operadores Relacionais
So utilizados em testes condicionais para determinar a relao entre dados, so os seguintes: OPERADOR > >= < <= == != AO Maior que Maior ou igual que Menor que Menor ou igual que Igual a Diferente de
O funcionamento destes operadores idntico ao estudado em matemtica. Eles retornam verdadeiro ou falso conforme a condio testada. So bastante utilizados em estruturas de controle onde a partir de teste o programa toma caminhos diferentes, como ser visto mais a frente. Exemplo:
a = 5; b = 10; x = a > b; //neste caso x valer 0, pois 5 menor do que 10.
importante observar que o operador relacional de igualdade lembra bastante o operador de atribuio. Um erro muito comum para iniciantes em linguagem C o uso do operador de atribuio em testes relacionais. Deve-se ficar atento, pois usar o operador de atribuio ao invs do relacional de igualdade pode ocasionar erros de lgica no programa.
7.11.4
Operadores Lgicos
Os operadores lgicos so utilizados para realizar testes booleanos entre elementos em um teste condicional. Eles retornam verdadeiro ou falso conforme o resultado do teste. So os seguintes: OPERADOR && || ! AO AND(E) OR(OU) NOT(NO)
Os operadores lgicos so muito importantes na construo de testes condicionais, com eles pode-se relacionar diversas condies em um mesmo teste. Exemplo:
x = 10; y = x>>5 && x<<20; //neste caso y valer 1, pois 10
26 www.facebook.com/fbseletronica
27
Esses operadores so muito utilizados em conjuntos com os operadores relacionais em estruturas de controle.
7.11.5
Os operadores Lgicos bit a bit so utilizados para operaes lgicas entre elementos ou variveis. So os seguintes: OPERADOR & | ^ ~ >> << AO AND(E) OR(OU) XOR (OU EXCLUSIVO) NOT (NO) Deslocamento direita Deslocamento esquerda
O operador & (AND) faz a operao booleana AND para cada bit dos operandos. Exemplo:
int v1, v2; v1 = 0x5A; v2 = v1 & 0x0F;
A operao ocorrer da seguinte forma: 0x5A hexadecimal = 0 1 0 1 1 0 1 0 binrio AND(&) 0x0F Hexadecimal Resultado = 0 0 0 0 1 1 1 1 binrio = 0 0 0 0 1 0 1 0 binrio = 0x0A hexadecimal
Portanto o valor armazenado em v2 ser 0x0Ah ou 10d. O operador AND bastante utilizado para desligar bits de variveis ou registradores. O operador || (OR) faz a operao booleana OR para cada bit dos operandos. Exemplo: int v1, v2; v1 = 0x01; v2 = v1 || 0xF0; A operao ocorrer da seguinte forma: 0x20 hexadecimal = 0 0 0 0 0 0 0 1 binrio
27 www.facebook.com/fbseletronica
28
Resultado = 1 1 1 1 0 0 0 1 binrio = 0xF1 hexadecimal Portanto o valor armazenado em v2 ser 0xF2h ou 242d. O operador OR muito utilizado para ligar bits de variveis ou registradores. O operador ^(XOR) faz a operao booleana XOR entre dois operandos, lembrando que a operao XOR resulta em 0 quando os valores so iguais e resulta em 1 quando os valores so diferentes.
int v1, v2; v1 = 0x50; v2 = v1 ^ 0x50;
A operao ocorrer da seguinte forma: 0x20 hexadecimal = 0 1 0 1 0 0 0 0 binrio XOR(^) 0x04 Hexadecimal = 0 1 0 1 0 0 0 0 binrio binrio = 0x00hexadecimal
Resultado = 0 0 0 0 0 0 0 0
Portanto o valor armazenado em v2 ser 0x00h ou 00d. O operador XOR e muito utilizado para fazer a comparao entre variveis e teste de registradores. O operador ~(NOT) faz a operao booleana NOT, ou complemento de uma varivel. Exemplo: int x , y;
x = 0b00001111; y = ~x; O resultado desta operao ser: y = 0b11110000; O operador NOT muito utilizado para inverter estados de bit em variveis, registradores e pinos de I/O. Os operadores de deslocamento so utilizados para deslocar determinadas quantidades de bits para direita ou esquerda. A forma geral para o uso destes operadores : Valor >> quantidade de bits a ser deslocados para a direita;
28 www.facebook.com/fbseletronica
29
As operaes acima funcionam da seguinte forma: Primeiramente foi atribudo a varivel y o valor da varivel x com deslocamento de dois bits esquerda: 10 decimal = 00001010 Deslocando 2 bits para a esquerda resultar em: 00101000 = 40 decimal. Depois foi atribudo a varivel z o valor da varivel x deslocado em um bit para a direita, que resultou em: 00000101 = 5 decimal. Nota-se que ao deslocar em um bit para a esquerda na verdade a varivel est sendo multiplicada por dois e ao deslocar um bit para a direita a varivel est sendo dividida por 2.
29 www.facebook.com/fbseletronica
30
x = x<< y x = x>>y
x <<= y x >>= y
7.13 if
O comando if utilizado para executar um comando ou bloco de comandos no caso de uma determinada condio ser avaliada como verdadeira. A forma geral do comando if :
if (condio) comandoA;
Caso seja necessrio executar um comando se a condio for avaliada com Falsa usa a clausula else junto com o comando if, o comando ficar da seguinte forma:
Desta forma possvel executar comandos conforme o resultado do teste feito. Pode-se executar um bloco de cdigo dentro da declarao if else, pra isso deve-se limitar com { e }, exemplo:
if(condio) { comandoA1; comandoaA2; ... comandoAn; } else { comandoB1; comandoB2; ... comandoBn; }
Deve-se ficar claro que a clausula else no necessria para o funcionamento do comando if, funciona apena como uma opo para tomar uma ao se a condio testada for avaliada como falsa. Desta forma a maneira mais simples de seu utilizar o comando if :
if(condio) comandoA;
H a possibilidade de aninhar diversos comandos if, um dentro do outro para executar uma sequncia de testes, exemplo:
if(condio1) comandoA; else if(condio2) comandoB;
30 www.facebook.com/fbseletronica
31
Neste caso ser avaliada a condio1, se verdadeira ser executado o comandoA e finalizada a estrutura de teste, caso a condio1 seja falsa ser avaliada a condio2, caso verdadeira ser executado o comandoB e finalizado a estrutura, caso a condio2 seja falsa ser avaliada a condio3 e assim por diante at finalizarem os testes. Tambm possvel utilizar estruturas if-else dentro de estruturas if-else, como por exemplo:
if(condio1) { if(condio2) { comandoA; comandoB; } else { comandoC; comandoD; } } else { if(condio3) { comandoE; comandoF; } else { comandoG; comandoH; } }
Neste caso a condio1 avaliada caso verdadeira ser avaliada a condio2. Caso a condio1 seja avaliada como falsa ser avaliada a condio3.
7.14 switch
Em alguns caso, como na comparao de uma determinada varivel com diversos valores diferentes o comando if pode torna-se extenso, confuso e pouco eficiente. O comando switch permite a realizao de comparaes sucessivas de uma forma elegante, clara e eficiente. O formato do comando switch :
switch(varivel) { case constante1:
31 www.facebook.com/fbseletronica
32
O valor da varivel testado com os valores especificados pelas clausulas case. Caso a varivel possua o mesmo valor de uma das constantes, os comandos seguintes quela clausula case sero executados. Caso o valor da varivel no for igual a nenhum valor das constantes especificadas ento os comandos aps clausula default sero executados. Em cada sequncia de comandos da clausula case encerrado por uma clausula break. Est clausula tem a funo de interromper o a estrutura switch de realizar outros testes. Caso esta clausula seja omitida os comandos seguintes de outra clausula case sero executados at ser encontrada uma clausula break ou chegar ao fim do switch. Portanto deve-se ficar atento ao uso da clausula break para determinar o fim dos comandos de cada clausula case. Algumas caractersticas importantes do comando switch devem ser observadas: O comando switch somente pode testar igualdades. No so admitidos outros operadores como no comando if. Somente nmeros inteiros e caracteres podem ser usados. Dentro de um mesmo switch no poder haver cases com constantes iguais; As clusulas break e a default so opcionais.
7.15 for
O comando for uma das mais comuns estruturas de repetio utilizadas, sendo bem poderosa na linguagem C em relao a outras linguagens de programao. A forma geral do for :
for( inicializao;condio;incremento) comando;
ou
for( inicializao;condio;incremento) { Comando1; Comando2; . . .
32 www.facebook.com/fbseletronica
33
ComandoN; }
Cada uma das trs sees do comando for possui uma funo distinta conforme em seguida: Inicializao: esta seo conter uma expresso valida utilizada normalmente pra inicializar a varivel de controle do lao. Condio: esta seo pode conter a condio a ser avaliada para deciso de continuidade do lao de repetio. Enquanto a condio for avaliada como verdadeira o lao permanecer em execuo. Incremento: esta seo pode conter uma declarao para incremento da varivel de controle do lao. O funcionamento bsico do comando for o seguinte: Primeiramente a seo de inicializao executada, em seguida a condio testada e se for verdadeira o comando ou bloco de comandos so executados, aps o fim dos comandos o lao executa a seo de incremento da varivel de controle. possvel utilizar a clausula break para encerrar a execuo do lao for independente de a condio de repetio ser avaliada, desta forma quando o comando break for executado dentro de um lao de repetio for, este lao interrompido imediatamente.
7.16 while
Outro tipo de estrutura de repetio da linguagem C comando while, que utilizado para repetir um comando ou um conjunto de instrues enquanto uma condio for avaliada como verdadeira. No comando while existe apenas o teste condicional, diferentemente do comando for que possui ciclos definidos. A estrutura do comando while a seguinte:
while(condio) { comando1; comando2; ... comandoN; }
O funcionamento do comando while ocorre de uma forma bem simples. Primeiramente a condio avaliada, caso a condio seja avaliada como verdadeira o comando ou o bloco de comandos executado em seguida a condio avaliada
33 www.facebook.com/fbseletronica
34
novamente. Caso seja avaliada como verdadeira o lao repetido, quando avaliada como falsa o lao interrompido. Assim como no comando for possvel usar a clausula break para interromper prematuramente um lao while.
7.17 do - while
O comando do-while utilizado para criar uma estrutura de repetio com funcionamento ligeiramente diferente do while e for tradicionais. De fato, a diferena entre a estrutura while e a estrutura do-while que esta ltima realiza a avaliao da condio de teste no final de cada ciclo de iterao do lao de repetio, ao contrrio do comando while, que realiza o teste no incio de cada ciclo. A forma geral da estrutura do-while :
do comando; while (condio);
Ou
do { comandoA; comandoB; ... comandoN; } while (condio);
O funcionamento da estrutura do-while o seguinte: o comando ou bloco de comandos executado e logo depois ser avaliada a condio de teste, caso ela seja verdadeira, ser iniciada uma nova iterao do ciclo, caso seja falsa, o lao terminado. Assim como nos comandos for e while pode-se utilizar a clausula break para interromper o lao do-while.
34 www.facebook.com/fbseletronica
35
Exemplo:
#define ledPin 3
7.18.2
#include
utilizado para incluir bibliotecas externas ao scketch. Dessa forma pode-se acessar um grande nmero de bibliotecas seja ela do padro da linguagem C ou as feitas especialmente para Arduino, ou at mesmo bibliotecas feitas pelo programador. Exemplo:
#include <biblioteca.h >
35 www.facebook.com/fbseletronica
36
7.19.1 pinMode()
Parametros: Pino: deve-se colocar o numero correspondente ao pino que se deseja configurar, conforme placa que est trabalhando. Modo: deve-se INPUT_PULLUP. Exemplo:
int ledPin = 13; void setup() { pinMode(ledPin, OUTPUT); } // LED connected to digital pin 13
colocar
modo
que
deseja
configurar
pino.
INPUT,
OUTPUT,
void loop() { digitalWrite(ledPin, HIGH); //sets the LED on delay(1000); // waits for a second digitalWrite(ledPin, LOW); // sets the LED off delay(1000); // waits for a second }
digitalWrite()
Coloca um nvel lgico Alto (HIGH, 5V) ou baixo (LOW, 0V) em um pino configurado como sada digital. Sintaxe
digitalWrite(pino, valor)
Parmetros
36 www.facebook.com/fbseletronica
37
// // // //
sets the LED on waits for a second sets the LED off waits for a second
digitalRead()
L o valor presente e um pino digital. Este valor pode ser HIGH ou LOW. Sintaxe:
digitalRead(pino)
Parmetros: Pino: valor correspondente ao pino que se deseja ler. Retorno HIGH ou LOW. Exemplo: int ledPin = 13; // LED connected to digital pin 13
int inPin = 7; int val = 0; // pushbutton connected to digital pin 7 // variable to store the read value
void setup() { pinMode(ledPin, OUTPUT); pinMode(inPin, INPUT); } void loop() { val = digitalRead(inPin); digitalWrite(ledPin, val); }
// sets the digital pin 13 as output // sets the digital pin 7 as input
// read the input pin // sets the LED to the button's value
37 www.facebook.com/fbseletronica
38
7.19.2
analogReference()
Configura a referencia de tenso para a converso analgica/digital. Os tipos possveis de configuraes so: DEFAULT: a tenso padro para converso a tenso de alimentao da placa. 5 Voltas para placas alimentadas com 5 volts e 3.3 Voltas para placas alimentadas com 3.3 V. INTERNAL1V1: referncia de 1,1V, Apenas no Arduino mega; INTERNAL2V56: referncia interna de 5,6 V, apenas no Arduino mega; EXTERNAL: Referncia de tenso aplicada no pino AREF(valor entre 0 e 5V).
Sintaxe:
analogReference(tipo)
analogRead()
L o valor presente em um pino configurado como entrada analgica. Internamente o Arduino possui um conversor A/D de 10 bits. Dessa forma o valor retornado por esta funo estar na faixa de 0 a 1023 conforme o valor presente no pino. Sintaxe:
analogRead(pino)
Parmetros: Pino: valor do pino configurado como entrada analgica(0 a 5 na maioria da placas, 0 a 7 na MINI e NANO, 0 a 15 na MEGA). Retorno Int(0 a 1023)
38 www.facebook.com/fbseletronica
39
Exemplo:
int analogPin = 3; pin 3 int val = 0; void setup() { Serial.begin(9600); } void loop() { val = analogRead(analogPin); Serial.println(val); } // potentiometer wiper (middle terminal) connected to analog // outside leads to ground and +5V // variable to store the value read
//
setup serial
7.19.3
Funes de temporizao
millis()
Retorna o numero de milissegundos desde que a placa comeou a executar o programa. Este nmero retorna a zero aps aproximadamente 50 dias. Sintaxe:
time = millis();
Exemplo:
unsigned long time; void setup(){ Serial.begin(9600); } void loop(){ Serial.print("Time: "); time = millis(); //prints time since program started Serial.println(time); // wait a second so as not to send massive amounts of data delay(1000); }
39 www.facebook.com/fbseletronica
40
micros()
Retorna o tempo em microssegundos que a placa est executando o programa. Este numero retorna a zero em aproximadamente 70 minutos. Sintaxe: tempo = micros(); Parmetros: Nenhum Retorno:
unsigned long
Exemplo:
unsigned long time; void setup(){ Serial.begin(9600); } void loop(){ Serial.print("Time: "); time = micros(); //prints time since program started Serial.println(time); // wait a second so as not to send massive amounts of data delay(1000); }
delay()
Pausa o programa por um tempo em milissegundos passado no parmetro. Sintaxe:
delay(ms)
Parmetros: ms: valor de milissegundos que se deseja esperar(unsigned long) Retorno: Nenhum
40 www.facebook.com/fbseletronica
41
Exemplo:
int ledPin = 13; void setup() { pinMode(ledPin, OUTPUT); } void loop() { digitalWrite(ledPin, HIGH); delay(1000); digitalWrite(ledPin, LOW); delay(1000); } // LED connected to digital pin 13
// // // //
sets the LED on waits for a second sets the LED off waits for a second
delayMicroseconds()
Pausa o programa pelo tempo em microssegundos passado no parmetro. O valor mximo que produz um valor preciso 16383. Sintaxe: delayMicroseconds(us) Parmetros: us: valor em microssegundos que se deseja esperar(unsigned int) Exemplo:
int outPin = 8; void setup() { pinMode(outPin, OUTPUT); } void loop() { digitalWrite(outPin, HIGH); delayMicroseconds(50); digitalWrite(outPin, LOW); delayMicroseconds(50); } // digital pin 8
// // // //
sets the pin on pauses for 50 microseconds sets the pin off pauses for 50 microseconds
41 www.facebook.com/fbseletronica
42
7.19.4
lowByte()
Retorna o byte menos significativos de uma varivel Sintaxe lowByte(x) Parmetros x: um valor de qualquer tipo
highByte()
Retorna o byte mais significativo de uma varivel.
S in t a x e
highByte(x)
Parmetros
bitRead()
L um bit de um numero Sintaxe
bitRead(x, n)
Parmetros x: varivel que deseja ser lido o bit n: a posio do do bit na varivel. Retorno O valor do bit (0 ou 1).
bitWrite()
Escreve um bit em uma varivel. Sintaxe:
42 www.facebook.com/fbseletronica
43
bitWrite(x, n, b)
Parmetros x: varivel que deseja ser escrito o bit n: posio do bit a ser escrito. b: o valor do bit (0 or 1)
bitSet()
Coloca em 1 o bit de uma varivel. Sintaxe:
bitSet(x, n)
Parmetros x: a varivel que se deseja manipular n: posio do bit que se deseja colocar em 1
bitClear()
Colocar em 0 o bit desejado. Sintaxe
bitClear(x, n)
Parametros
x: a varivel que se deseja manipular n: posio do bit que se deseja colocar em 0
bit()
Calcula o valor de um especifico bit. Sintaxe: bit(n) Parmetros: n: a posio do bit que deseja calcular o valor. Retorno:
43 www.facebook.com/fbseletronica
44
O valor do bit.
7.19.5
Funes matemticas
min(x, y)
Retorna o menor dos dois nmeros. Parmetros x: o primeiro valor a ser comparado y: o segundo valor a ser comparado Retorno O menor dos dois nmeros passados Exemplo
sensVal = min(sensVal, 100); //verifica se sensval menor que se 100 se maior //garante que no ultrapasse 100
max(x, y)
Descrio Retorna o maior de dois nmeros. Parmetros x: o primeiro valor a ser comparado y: o segundo valor a ser comparado Retorno O maior entre os dois nmeros. Exemplo
sensVal = max(senVal, 20); // garante que sensVal maior que 20
abs(x)
Calcula o valor absoluto de um numero. Parmetros x: o numero
44 www.facebook.com/fbseletronica
45
constrain(x, a, b)
Restringe um nmero para estar dentro de um intervalo. Parmetros x: O numero que deseja restringir; a: meno valor do intervalo b: maior valor do intervalo Retorno x: se x estiver entre a e b a: se x menor que a b: se x maior que b Exemplo
sensVal = constrain(sensVal, 10, 150); // limits range of sensor values to between 10 and 150
map(value, fromLow, fromHigh, toLow, toHigh) Re-mapeia um nmero a partir de um intervalo para o outro. Isto , um valor de fromLow ficaria mapeada para toLow, um valor de fromHigh ficaria mapeado para toHigh. No restringe os valores dentro do intervalo, Por que valores fora do intervalo as vezes so desejados e uteis. A funo constrain () pode ser usada antes ou aps esta funo, se os limites para os intervalos so desejados. Note que os limites inferiores pode ser maior ou menor do que os "limites superiores" de modo que o map () pode ser usado para inverter uma srie de nmeros, por exemplo
y = map(x, 1, 50, 50, 1);
A funo map() usa matemtica inteiro por isso no ir gerar fraes. Restos fracionrios so truncados, e no so arredondados. Parmetros value: numero para mapear fromLow: limite inferior da faixa atual fromHigh: limite superior da faixa atual
45 www.facebook.com/fbseletronica
46
toLow: limite inferior da faixa futura toHigh:limite superior da faixa futura Retorno O valor Re-mapeado Exemplo
/* Map an analog value to 8 bits (0 to 255) */ void setup() {} void loop() { int val = analogRead(0); val = map(val, 0, 1023, 0, 255); analogWrite(9, val); }
pow(base, exponent)
Calcula o valor de um nmero elevado a uma potncia. pow() pode ser usado para elevar um nmero a uma potncia fraccionada. Isto til para a gerao valores de mapeamento exponencial ou curvas. Parmetros base: o numero da base (float) exponent: o numero do expoente (float) Retorno Resultado da operao (double)
sqrt(x)
Calcula a raiz quadrada de um numero. Parmetros x: o numero, pode ser de qualquer tipo Retorno O resultado da operao(double)
sin(rad)
Calcula o seno de um ngulo(radianos). O resultado ser entre -1 e 1.
46 www.facebook.com/fbseletronica
47
cos(rad)
Calcula o Cosseno de um ngulo(radianos). O resultado ser entre -1 e 1. Parmetros rad: ngulo em radianos(float) Retorno Cosseno do ngulo.(double)
tan(rad)
Calcula a tangente de um ngulo (radianos). O resultado estar entre menos infinito e mais infinito. Parmetros rad: ngulo em radianos(float) Retorno Tangente do ngulo. (double)
7.19.6
Funes de Converso
char()
Converte o valor para o tipo char. Sintaxe
char(x)
47 www.facebook.com/fbseletronica
48
byte()
Converte um valor para o tipo byte Sintaxe
byte(x)
int()
Converte um valor para o tipo int Sintaxe
int(x)
word()
Converte um valor em um dado do tipo word ou cria uma word a partir de dois bytes. Sintaxe
word(x) word(h, l)
Parmetros x: um valor de qualquer tipo. h: Parte alta da word l: parte baixa da word
48 www.facebook.com/fbseletronica
49
Retorno Word
float()
Converte um valor para o tipo de dado float. Sintaxe
float(x)
49 www.facebook.com/fbseletronica
50
8 PROJETOS
A seguir sero apresentadas algumas aplicaes bsicas com o ARDUINO, aplicando na pratica as funes estudadas anteriormente. Sero exibidos os conceitos com exemplos assim como a proposta de exerccios.
50 www.facebook.com/fbseletronica
51
Para configurar o pino como sada digital utiliza a funo pinMode(). Inicialmente definiu-se uma varivel do tipo int com o valor correspondente ao pino que se deseja ligar o LED, no caso o pino 13. Para definir o pino como sada usa-se a constante OUTPUT, conforme instruo abaixo:
pinMode(led, OUTPUT);
Para acionar a sada utiliza-se a funo digitalWrite(). Para escrever nvel lgico 1, usa-se a constante HIGH e para um nvel lgico baixo usa-se a constante LOW, conforme instrues abaixo.
digitalWrite(led, HIGH); digitalWrite(led, LOW); // liga led //desliga led
A funo delay() utilizada para aguardar 1 segundo entre a mudana de estados. Como a funo delay() aguarda por x milissegundos so necessrios 1000 ms para se ter 1 segundo:
delay(1000); // aguarda 1 segundo
51 www.facebook.com/fbseletronica
52
/* Pisca LED Liga led por 1 segundo e depois desliga por mais 1 segundo */ // Pino 13 tem um led conectado na maioria das placas int led = 13; //cria uma varivel inteira cchamada led com o numero do pino
// rotina de configurao void setup() { pinMode(led, OUTPUT); } void loop() { digitalWrite(led, HIGH); delay(1000); digitalWrite(led, LOW); delay(1000); } // liga led // aguarda 1 segundo //desliga led //aguarda 1 segundo // inicaliza pino do led como sada digital
Exerccio 1: Criar um sketch para acionar 4 LED, conectados aos pinos 10,11,12,13. Os LEDs devem piscar da seguinte forma: 1. Ligar os LEDs 13, 11 e desligar os LEDs 12,10. 2. Aguardar 1 segundo 3. Desligar os LEDs 13, 11 e ligar os LEDs 12,10. 4. Aguardar 1 segundo 5. Repetir o processo.
52 www.facebook.com/fbseletronica
53
Para ler uma entrada digital utiliza-se a funo digitalRead() ela retorna o valor presente no pino. Porm antes de ler o valor presente no pino deve-se configurar o pino correspondente como entrada utilizando a funo pinMode(). O abaixo exibido o esquema eltrico para leitura de uma tecla:
53 www.facebook.com/fbseletronica
54
A tecla est ligada no pino digital 2, nota-se que existe um resistor ligado a +5V. Este resistor chamado de resistor de pull up e tem a funo de garantir um nvel lgico, no caso 5V, quando a tecla permanecer solta. Para configurar o pino 2 como entrada utiliza-se a seguinte instruo na funo setup():
pinMode(inputPin, INPUT); // declara pino como entrada
O circuito possui um LED ligado ao pino 13 que deve ser configurado como sada digital, conforme visto no captulo anterior. A montagem do circuito pode ficar conforme a figura abaixo:
54 www.facebook.com/fbseletronica
55
O exemplo consiste em ler a tecla e ligar o LED quando a tecla estiver pressionada, o sketch a seguir mostra a programao para leitura de uma entrada digital:
/* Leitura de tecla O exemplo le uma tecla conectada ao pino 2 e aciona um led conectado ao pino 13 */ const int ledPin = 13; // cria uma constante com o numero do pino ligado ao LED const int inputPin = 2; // cria uma constante com o numero do pino conectado a tecla void setup() { pinMode(ledPin, OUTPUT); // declara o pino do led como sada pinMode(inputPin, INPUT); // declara o pino da tecla como entrada } void loop() { int val = digitalRead(inputPin); // le o valor na entrada if (val == LOW) // se valor est em zero( tecla pressionada) {
55 www.facebook.com/fbseletronica
56
digitalWrite(ledPin, HIGH); // Liga LED indicando tecla pressionada } else { digitalWrite(ledPin, LOW); // Desliga led indicando tecla solta } }
Os pinos de entrada possuem resistores de pull-up internos, dessa forma pode-se ler o estado de uma tecla sem a necessidade de ligar um resistor, como foi feito no exemplo anterior. A figura a seguir exibe o esquema eltrico para ligar uma tecla sem o resistor de pull-up:
O circuito fica mais limpo e mais simples de montar no protoboard, a figura a seguir exibe a ligao no protoboard para teste:
56 www.facebook.com/fbseletronica
57
Para configura a entrada com resistor de pull-up ligado, utiliza-se a constante INPUT_PULLUP na funo pinMode(), conforme instruo a seguir:
pinMode(inputPin, INPUT_PULLUP); //declara o pino da tecla como //entrada E PULL UP habilitado
O sketch completo para o teste da leitura de tecla sem resistor de pull up exibido a seguir:
/* Leitura de tecla O exemplo le uma tecla conectada ao pino 2 e aciona um led conectado ao pino 13 */
const int ledPin = 13; // cria uma constante com o numero do pino ligado ao LED const int inputPin = 2; // cria uma constante com o numero do pino conectado a tecla
57 www.facebook.com/fbseletronica
58
void setup() { pinMode(ledPin, OUTPUT); // declara o pino do led como sada pinMode(inputPin, INPUT_PULLUP); // declara o pino da tecla como entrada } void loop() { int val = digitalRead(inputPin); // le o valor na entrada
if (val == LOW) // se valor est em zero( tecla pressionada) { digitalWrite(ledPin, HIGH); // Liga LED indicando tecla pressionada } else { digitalWrite(ledPin, LOW); // Desliga led indicando tecla solta } }
Quando uma tecla pressionada gerado oscilaes at o nvel lgico se estabilizar, essas oscilaes so conhecidas como bounce. Esse podem gerar leituras indesejadas fazendo o programa tomar aes que no eram previstas. O processo para eliminar a leitura durante as oscilao chamado de Debounce. A tcnica de debounce feita por software e existem muitas maneiras de se resolver este problema, umas delas apresentada no sketch a seguir:
/* * Debounce sketch uma tecla conectada ao pino e um led no pino 13 a lgica de debounce previne leituras indesejadas da tecla */ const int inputPin = 2; // pino onde esta a tecla const int ledPin = 13; // pino onde est conectado o led const int debounceDelay = 10; // tempo para estabilizar // rotina de debounce boolean debounce(int pin) { boolean state; boolean previousState; previousState = digitalRead(pin); // armazena o estado da tecla
58 www.facebook.com/fbseletronica
59
for(int counter=0; counter < debounceDelay; counter++) { delay(1); //aguarda 1 milisegundo state = digitalRead(pin); // le a tecla if( state != previousState) { counter = 0; //reinicia contador previousState = state; // armazena o valor atual da tecla } } // retorna o estado da tecla return state; } void setup() { pinMode(inputPin, INPUT); //configura pino da tecla como entrada pinMode(ledPin, OUTPUT); //configura pino do led como sada } void loop() { if (!debounce(inputPin)) //le tecla com rotina de debounce { digitalWrite(ledPin, HIGH); //liga led se tecla pressionada } else { digitalWrite(ledPin, LOW); //Desliga led se tecla solta } }
A funo debounce chamada passando como parmetro o numero do pino da tecla que se deseja fazer a leitura. A funo retorna o nvel lgico presente no pinio aps a estabilizao.
Exerccio 2: Desenvolver um sketch para a leitura de uma tecla e acionar 4 LEDS de sada. A cada vez que a tecla for pressionada deve-se acender um LED e apagar o anterior. Inicialmente os leds encontram-se apagados. Quando tecla pressionada pela primeira vez acende LED1, na segunda vez apaga LED1 e acende LED 2, e assim por diante. Quando o LED4 estiver aceso e a tecla for pressionada apaga o LED4. Quando a tecla for pressionada novamente repetem-se as instrues anteriores.
59 www.facebook.com/fbseletronica
60
Os microcontroladores Atmega usados para o Arduino contm embarcados 6 canais de converso analgica-digital (A/D). O conversor do Arduino tem uma resoluo de 10 bits, retornando inteiros entre 0 e 1023. Enquanto a funo principal das portas analgicas para a maioria dos usurios do Arduino ler sensores, as portas analgicas tambm tem a funcionalidade de entrada/sada de propsito geral (GPIO) (da mesma forma que as portas digitais 0~13). Consequentemente, se o usurio precisar mais entradas/sadas de propsito geral, e todas as portas analgicas no estiverem em uso, estas podem ser usadas para GPIO. Para iniciar o estudo da entrada analgica, a maneira mais simples e rpida ligando um potencimetro a uma entrada analgica, conforme esquema apresentado em seguida:
Se girarmos o cursor do potencimetro, alteramos a resistncia em cada lado do contato eltrico que vai conectado ao terminal central do boto. Isso provoca a mudana na proximidade do terminal central aos 5 volts ou GND o que implica numa mudana no valor analgico de entrada. Quando o cursor for levado at o final da escala, teremos, por exemplo, zero volt a ser fornecido ao pino de entrada do Arduino e, assim, ao l-lo obtmse 0. Quando giramos o cursor at o outro extremo da escala, haver 5 volts a ser fornecido ao pino do Arduino e, ao l-lo, teremos 1023. Em qualquer posio intermediria do cursor, teremos um valor entre 0 e 1023, que ser proporcional tenso eltrica sendo aplicada ao pino do Arduino. A ligao no Arduino UNO pode ser feita conforme a figura abaixo:
60 www.facebook.com/fbseletronica
61
O exemplo a seguir l o valor no potencimetro. O tempo que o LED permanece ligado ou desligado depende do valor obtido pelo analogRead().
/* * Entrada analgica
* Liga e desliga um LED conectado ao pino digital 13. O tempo * que o LED permanece ligado ou desligado depende do valor * obtido pelo analogRead(). No caso mais simples, conecta-se * um potencimetro ao pino analgico 0. */
// selecione o pino de entrada ao potencimetro // selecione o pino ao LED // varivel a guardar o valor proveniente do sensor
61 www.facebook.com/fbseletronica
62
void loop() { val = analogRead(potPin); digitalWrite(ledPin, HIGH); delay(val); digitalWrite(ledPin, LOW); delay(val); } // ler o valor do potencimetro // ligar o ledPin // pausar o programa por algum tempo // desligar o ledPin // pausar o programa por algum tempo
Exerccio 3: Elaborar um sketch para ler um potencimetro e acender 8 leds nas sadas digitais que representaro o nvel de tenso na entrada analgica como um bargraph. Quando entrada for zero volts todos os leds estaro apagados e quando for 5 Volts todos estaro acesos e qualquer valor dentro desse intervalo deve acender os leds proporcionalmente.
62 www.facebook.com/fbseletronica
63
A funo Serial.begin() seleciona o baudrate da comunicao serial. O baudrate determina quantos bits por segundo enviando na transmisso de um dado. Para a comunicao com um computador usa-se os seguintes valores: 300, 1200, 2400, 4800, 9600, 14400, 19200, 28800, 38400, 57600 ou 115200. A sintaxe exibida a seguir: Serial.begin(speed); Exemplo: Serial.begin(9600);
A funo print envia textos pela serial. O texto deve ser colocado dentro de aspas duplas, por exemplo: Serial.print(ol, mundo); Para enviar nmeros, o valor exibido depender do tipo da varivel. Por exemplo, para enviar uma varivel do tipo int, chamada numero, usa-se a seguinte funo: Serial.print(numero); Para visualizar os valores no computador pode-se utilizar o terminal serial integrado a IDE conforme figura a seguir:
63 www.facebook.com/fbseletronica
64
Exemplo A Enviando nmeros para o computador O sketch a seguir exibe como a comunicao serial pode ser utilizada para enviar dados para um computador.
/* * comunicao Serial * Envia nmeros pela comunicao serial * para ser exibido no computador */ void setup() { Serial.begin(9600); // seleciona velocidade para 9600 bps } int number = 0; //varivel para ser enviada void loop() { Serial.println(number); // envia numero em noiva linha delay(500); // aguarda 0,5 segundo number++; // incrementa o valor do numero. }
64 www.facebook.com/fbseletronica
65
Exemplo B Enviando nmeros em diferentes formatos Para imprimir um texto simplesmente usa a funo: Serial.print(texto a ser enviado!). para enviar uma nova linha aps o envio do texto, usa-se a funo: Serial.println(texto a ser enviado); Para imprimir valores numricos pode ser um pouco mais complicado. A forma que um valor do tipo byte ou inteiro so exibidos depende do tipo de varivel e dos parmetros de formatao. A linguagem ARDUINO auxilia nessa tarefa possibilitando a exibir um valor em diferente tipo de dados. Por exemplo, enviando um char, um byte e um int de um mesmo valor a sada no ser a mesma. Segue um exemplo especifico todas as variveis a seguir tem valores similares:
char asciiValue = 'A'; // ASCII A has a value of 65 char chrValue = 65; // an 8 bit signed character, this also is ASCII 'A' byte byteValue = 65; // an 8 bit unsigned character, this also is ASCII 'A' int intValue = 65; // a 16 bit signed integer set to a value of 65 float floatValue = 65.0; // float with a value of 65
65 www.facebook.com/fbseletronica
66
Os seguintes parmetros podem ser utilizados para enviar valores em diferentes tipos de dados: Serial.print(valor, BIN) - envia no formato binrio Serial.print(valor, OCT) -envia no formato octal Serial.print(valor, DEC) envia no formato decimal Serial.print(78, HEX ) envia no formato hexadecimal Serial.println(1.23456, 0) - envia numero flutuante sem casa decimal Serial.println(1.23456, 2) - envia numero flutuante com duas casa decimais Serial.println(1.23456, 4) - envia numero flutuante com 4 casas decimais
void loop() { Serial.print("chrValue: "); Serial.print(chrValue); Serial.print(" "); Serial.write(chrValue); Serial.print(" "); Serial.print(chrValue,DEC); Serial.println(); Serial.print("byteValue: "); Serial.print(byteValue); Serial.print(" "); Serial.write(byteValue); Serial.print(" "); Serial.print(byteValue,DEC); Serial.println(); Serial.print("intValue: "); Serial.print(intValue);
66 www.facebook.com/fbseletronica
67
Serial.print(" "); Serial.print(intValue,DEC); Serial.print(" "); Serial.print(intValue,HEX); Serial.print(" "); Serial.print(intValue,OCT); Serial.print(" "); Serial.print(intValue,BIN); Serial.println(); Serial.print("floatValue: "); Serial.print(floatValue); Serial.println(); Serial.println(); Serial.println(); delay(5000); // aguarda 5 segundo chrValue++; // incremnta para o prximo valor byteValue++; intValue++; floatValue +=1; }
Exemplo C Enviando nmeros para o Arduino So enviados valores em ASCII para o Arduino, esses valores podem ser convertidos em valores numricos de de uma maneira bem simples, bastando conhecer a tabela ASCII.
67 www.facebook.com/fbseletronica
68
O valores de 0 a 9 possuem o valor 48 a 57 na tabela ASCII. Desta forma para converter um valor ASCII de 0 a 9 em um valor numrico basta subtrair o valor 48, ou seja subtrair o caractere 0 em ASCII. O sketch a seguir exibe uma maneira simples de receber valores em ASCII e converter em valores numricos:
/* * Comunicao Serial - Enviar dados para o Arduino * PISCA o led com o valor proporcional ao recebino pela serial */ const int ledPin = 13; //pino do led int blinkRate=0; // valor para piscar void setup() { Serial.begin(9600); // Inicializa serial com 9600 bps pinMode(ledPin, OUTPUT); //configura pino do led como saida } void loop() { if ( Serial.available()) // verifica se h caracter disponivel na serial { char ch = Serial.read(); //le o caracter if( isDigit(ch) ) // verifica se valor est entre 0 e 9 { blinkRate = (ch - '0'); // converte caracter em um valor numrico blinkRate = blinkRate * 100; // atualiza valor da piscagem } } blink();//chama rotina para piscar led } void blink() { digitalWrite(ledPin,HIGH); delay(blinkRate); digitalWrite(ledPin,LOW); delay(blinkRate); }
Exerccio 4: Desenvolver um sketch para ligar os leds conforme o nmero enviado pela serial. Se enviado o numero 1 deve-se ligar o led1 e assim por diante. Quando enviado o mesmo numero na segunda vez deve-se desligar o led correspondente.
68 www.facebook.com/fbseletronica
69
A sada PWM no Arduino pode ser feita atravs da funo analogWrite(), que pode ser utilizada para controle diversos, como por exemplo a intensidade do brilho de um led conectado ao ARDUINO. A tcnica de PWM (do ingls Pulse width modulation) consiste em emular um sinal analgico atravs de pulsos digitais. PWM consiste na variao proporcional dos pulsos, mantendo a frequncia constante. Sadas de baixo nvel de sinal analgico so conseguidas com pulso curtos de nvel lgico alto, j sadas com maior nvel de sinal analgico so conseguidos atravs de perodos maiores de pulso em nvel alto. A figura a seguir exibe a modulao PWM para variar a intensidade de um led:
O Arduino possui pinos especficos com essa funo. Na placa ARDUINO UNO, pode se utilizar os pinos 3,5,6,9,10 e 11 para esta funo. A funo analogWrite deve ser utilizada da seguinte forma: Sintaxe: analogWrite(pino, valor); Onde o parmetro pino corresponde ao pino que ser gerado o sinal PWM e valor corresponde ao duty cycle, ou seja, o valor que permanecer em nvel alto o sinal.
69 www.facebook.com/fbseletronica
70
O valor deve ser de 0 a 255 onde 0 a sada permanece sempre em nvel zero e 225 a sada permanece sempre em nvel alto. O sketch a seguir exibe como controlar a intensidade de um led atravs da leitura de um sinal analgico em um potencimetro.
/* PWM controla a luminosidade de um led conforme o valor presente em um potenciometro */ int ledPin = 13; int analogPin = 3; int val = 0; // pino do led // pino para leitura do potenciometro // variable to store the read value
// le o valor analgico // aciona led com o valor anlogico lido divido por 4
Exerccio 5 Desenvolver um sketch para controlar o brilho do led atravs de duas teclas onde uma aumenta o brilho do led e outra diminui o brilho do led.
9 REFERNCIAS
1. http://arduino.cc/en/Reference/HomePage
70 www.facebook.com/fbseletronica