Você está na página 1de 69

Arduino Introduo e Recursos Avanados

Escola Naval

ESCOLA NAVAL
DEPARTAMENTO DE ENGENHEIROS NAVAIS RAMO DE ARMAS E ELECTRNICA

Arduino Introduo e Recursos Avanados


Nuno Pessanha Santos ASPOF EN-AEL nuno.pessanha.santos@marinha.pt

2009
ASPOF EN-AEL Pessanha Santos 1

Arduino Introduo e Recursos Avanados

Escola Naval

No se pode ensinar tudo a algum, pode-se apenas ajud-lo a encontrar por si mesmo. Galilleu Galilei

ASPOF EN-AEL Pessanha Santos

Arduino Introduo e Recursos Avanados

Escola Naval

ndice
1. 2. Introduo ............................................................................................................................ 7 Hardware vs Software ......................................................................................................... 8 2.1. Hardware ...................................................................................................................... 8 Microprocessador ................................................................................................ 9 Microcontrolador ................................................................................................. 9 Tipos e Quantidades de Memria Disponveis ................................................ 11 Pinout Disponvel ............................................................................................... 12

2.1.1. 2.1.2. 2.1.3. 2.1.4. 2.2.

Software ..................................................................................................................... 15 Instalao e Utilizao ...................................................................................... 15 Ciclo de Desenvolvimento ................................................................................ 17 Interaco do Arduino com outro Software .................................................... 18

2.2.1. 2.2.2. 2.2.3. 3.

ndice de Instrues ........................................................................................................... 18 3.1. Funes Base ............................................................................................................. 19 void setup()......................................................................................................... 19 void loop()........................................................................................................... 19 Resumindo ......................................................................................................... 20

3.1.1 3.1.2 3.1.3. 3.2.

Ciclos ........................................................................................................................... 21 Ciclo If.else .................................................................................................. 21 Ciclo for ............................................................................................................... 22 Ciclo switch / case .............................................................................................. 23 Ciclo while .......................................................................................................... 24 Ciclo do.while ................................................................................................. 25

3.2.1 3.2.2 3.2.3 3.2.4 3.2.5 3.3.

Tipos de variveis disponveis .................................................................................. 26 Varivel do Tipo Boolean .................................................................................. 26 Varivel do tipo char vs unsigned char ............................................................. 27 Varivel do tipo byte ......................................................................................... 27 Varivel do tipo int vs unsigned int .................................................................. 28 Varivel do tipo long vs unsigned long ............................................................. 28 Varivel do tipo float vs double ........................................................................ 29 Varivel do Tipo array e a Noo de string ...................................................... 29

3.3.1 3.3.2. 3.3.3. 3.3.4. 3.3.5. 3.3.6. 3.3.7. 3.4.

Converter tipos de variveis ..................................................................................... 30 char(x) ................................................................................................................. 30 byte(x) ................................................................................................................ 30

3.4.1. 3.4.2.

ASPOF EN-AEL Pessanha Santos

Arduino Introduo e Recursos Avanados 3.4.3. 3.4.4. 3.4.5. 3.5. 3.5.1.

Escola Naval

int(x).................................................................................................................... 30 long(x)................................................................................................................. 30 float(x) ................................................................................................................ 30

Funes....................................................................................................................... 31 Input/Output digital ............................................................................................... 31 pinMode() ....................................................................................................... 31 digitalWrite() ...................................................................................................... 32 digitalRead()................................................................................................... 33

3.5.1.1. 3.5.1.2 3.5.1.3. 3.5.2. 3.5.2.1 3.5.2.2 3.5.3.

Input/Output analgico ......................................................................................... 34 analogRead() ...................................................................................................... 34 analogWrite() ..................................................................................................... 35 Tempo ..................................................................................................................... 36 millis() ............................................................................................................. 36 micros() ........................................................................................................... 36 delay (milisegundos) ..................................................................................... 37 delayMicroseconds (microsegundos)........................................................... 37

3.5.3.1. 3.5.3.2. 3.5.3.3. 3.5.3.4. 3.5.4.

Funes Matemticas ........................................................................................... 39 min(valor1,valor2) ......................................................................................... 39 max(valor1,valor2) ........................................................................................ 39 abs(valor) ........................................................................................................ 39 constrain(valor, valor1.,valor2) .................................................................... 40 map(X,valor1,valor2,para valor1,para valor2) ............................................ 40 pow(valor, expoente) .................................................................................... 41 sqrt(valor) ....................................................................................................... 41

3.5.4.1. 3.5.4.2. 3.5.4.3. 3.5.4.4. 3.5.4.5. 3.5.4.6. 3.5.4.7. 3.5.5.

Funes Trigonomtricas ..................................................................................... 42 sen(valor) ........................................................................................................ 42 cos(valor) ........................................................................................................ 42 tan(valor) ........................................................................................................ 42

3.5.5.1. 3.5.5.2. 3.5.5.1. 3.5.6. 3.5.6.1 3.5.6.2. 3.5.7.

Nmeros Aleatrios .............................................................................................. 43 randomSeed(valor) ............................................................................................ 43 random() ......................................................................................................... 43

Interrupts................................................................................................................ 45 attachInterrupt(interrupt, funo,modo) ................................................... 45 detachInterrupt(interrupt)............................................................................ 46

3.5.7.1. 3.5.7.2.

ASPOF EN-AEL Pessanha Santos

Arduino Introduo e Recursos Avanados 3.5.7.3. 3.5.7.4. 3.5.8.

Escola Naval

interrupts() ..................................................................................................... 46 noInterrupts() ................................................................................................. 46

Comunicao Srie ................................................................................................ 48 Serial.available() ............................................................................................ 48 Serial.begin(int baud rate) ............................................................................ 48 Serial.read() .................................................................................................... 49 Serial.flush() ................................................................................................... 49 Serial.print() vs Serial.println() ..................................................................... 50 Serial.write() .................................................................................................. 50

3.5.8.1. 3.5.8.2. 3.5.8.3. 3.5.8.4. 3.5.8.5. 3.5.8.1. 4.

Recursos Avanados .......................................................................................................... 51 4.1. Flash ............................................................................................................................ 51 Sintaxe a Utilizar para Guardar Dados em Flash ............................................ 51 Sintaxe a Utilizar para Ler Dados da Memria Flash ..................................... 51

4.1.1. 4.1.2. 4.2.

EEPROM ..................................................................................................................... 52 Sintaxe de Escrita em EEPROM ....................................................................... 52 Sintaxe de Leitura em EEPROM....................................................................... 52

4.2.1. 4.2.2. 4.3.

Servomotor ................................................................................................................ 53 Sintaxe das Instrues da Biblioteca <Servo.h> ............................................. 54 attach() ........................................................................................................... 54 detach()........................................................................................................... 55 write() ............................................................................................................. 55 read() ............................................................................................................... 56 attached() ....................................................................................................... 56

4.3.1. 4.3.1.1. 4.3.1.2. 4.3.1.3. 4.3.1.4. 4.3.1.5. 4.4.

Software Serial .......................................................................................................... 58 Sintaxe das Instrues da Biblioteca <SoftwareSerial.h> ............................. 59 SoftwareSerial(Pino de Rx, Pino de Tx) ...................................................... 59 begin(Baud Rate) ........................................................................................... 59 read() ............................................................................................................... 60 print(dados) vs println(dados) ...................................................................... 60

4.4.1. 4.4.1.1. 4.4.1.2. 4.4.1.3. 4.4.1.4. 4.5. 4.6.

FIRMATA vs Processing ............................................................................................ 62 Aquisio de Sinal Converso A/D......................................................................... 63 Alguns Conceitos Tericos ................................................................................ 63 Arduino vs ADC .................................................................................................. 64 Sintaxe para Alterar o Valor do Factor de Diviso ...................................... 66

4.6.1. 4.6.2. 4.6.3.

ASPOF EN-AEL Pessanha Santos

Arduino Introduo e Recursos Avanados 5. 6.

Escola Naval

Concluso ........................................................................................................................... 68 Bibliografia ......................................................................................................................... 69

ASPOF EN-AEL Pessanha Santos

Arduino Introduo e Recursos Avanados

Escola Naval

1.

Introduo

Este tutorial tem como principal objectivo ser uma referncia para a utilizao da placa de desenvolvimento Arduino, no s para quem se est a iniciar no assunto, mas, tambm, para quem procura aprofundar mais o seu conhecimento sobre o tema. O Arduino uma ferramenta de desenvolvimento open source, tendo surgido de um projecto acadmico - quem sabe um projecto seu no poder ter o mesmo sucesso?... Como ferramenta usualmente associado filosofia de Physical Computing, ou seja, ao conceito que engloba a criao de sistemas fsicos atravs do uso de Software e Hardware capazes de responder a inputs vindos do mundo real. Podemos designar o Arduino simplesmente como uma pea de Hardware ou um Software de desenvolvimento, mas muito mais que isso. Devido ao sucesso que tem vindo a alcanar ao longo do tempo, existe uma enorme comunidade de utilizadores/seguidores em todo o Mundo, podendo afirmar-se que o Arduino representa tambm uma enorme comunidade. As razes para tal sucesso baseiam-se no seu baixo custo - dadas as suas funcionalidades -, a simplicidade na utilizao e a possibilidade de utilizao em vrios sistemas operativo, como o Windows, Macintosh OS e Linux - capacidade essa denominada por Cross-platform. O estudo do Arduino abre-nos portas compreenso de uma importante ferramenta de desenvolvimento atravs de uma aprendizagem simples mas dedicada, onde podemos fazer desde robots a domtica entre muitas outras aplicaes, bastando simplesmente ter imaginao. Devido sua enorme utilizao, como foi referido anteriormente, torna-se um assunto quase que obrigatrio a abordar, sendo o seu conhecimento uma mais-valia para todos os interessados pela electrnica (e no s). Assim, espera-se que este tutorial seja uma pequena ajuda para a aquisio de conhecimento sobre a temtica em estudo, que dever pautar pela dedicao.

ASPOF EN-AEL Pessanha Santos

Arduino Introduo e Recursos Avanados

Escola Naval

2.

Hardware vs Software

Antes de comear a trabalhar propriamente com esta plataforma de desenvolvimento, torna-se necessrio comear por perceber o seu funcionamento, para tal descrever-se- neste captulo o funcionamento do Arduino, em termos de Hardware e Software. Espera-se assim de certa forma iluminar o caminho neste estudo, fazendo com que toda a percepo do assunto a tratar se torne mais simples, ou seja, sero aqui apresentadas as bases para a sua compreenso.

2.1.

Hardware

De seguida, far-se- uma exposio do tema incidindo na placa Arduino Duemilinove (disponvel na Escola Naval -EN), em tudo semelhante em termos de utilizao placa de desenvolvimento Arduino Mega. Contudo verificam-se pequenas diferenas como a diferena na sua capacidade de armazenamento (memria disponvel), o nmero de pinos analgicos, o nmero de pinos digitais e as dimenses. O Arduino Duemilinove (Fig. 1) apresenta-se com o microcontrolador ATMega168 ou ATMega328, enquanto o Arduino Mega (Fig.2) apresenta-se com um microcontrolador ATMega1280.

Fig. 1 Arduino Duemilinove Fonte: Site oficial Arduino (www.arduino.cc)

Fig. 2 Arduino Mega Fonte: Site oficial Arduino (www.arduino.cc)

ASPOF EN-AEL Pessanha Santos

Arduino Introduo e Recursos Avanados

Escola Naval

Vo ser abordados neste subcaptulo dois temas de grande importncia relativamente ao Arduino Duemilinove, s~o eles: Tipos e quantidades de memria disponveis e o pinout disponvel. Mais informaes relativas ao microcontrolador em estudo, ou qualquer outro, devem ser consultados os respectivos datasheet. Mas antes de abordar os temas referidos anteriormente torna-se necessrio fazer a distino entre microprocessador e microcontrolador, que por vezes alvo de confuso.

2.1.1.

Microprocessador

Um microprocessador, basicamente, constitudo por um circuito integrado com a capacidade de executar determinadas instrues, sendo a sua velocidade de processamento determinada por um circuito que produz um determinado Clock (kHz, MHz ou GHz). O seu poder de processamento afectado por caractersticas como Bits, quantidade de ncleos, arquitectura apresentada, tipo de instrues, entre outras. Como factor de grande importncia tem-se ainda a existncia de memria externa, onde esto armazenados os programas que sero executados. Memria ROM Memria RAM

Microprocessador

Clock

Perifricos

Fig. 3 Exemplo de uma montagem utilizando um microprocessador

2.1.2. Microcontrolador
Um microcontrolador, ao contrrio de um microprocessador, desenhado e construdo de forma a integrar diversos componentes num nico circuito integrado, evitando, assim, a necessidade de adicionar componentes externos ao microcontrolador, que permitiriam as suas funcionalidades. Etc CPU ROM RAM Etc D/A Temporizadores (Timers) Etc UART Porta Srie Etc

A/D

Porta Paralela

Fig. 4 Exemplo de um microcontrolador com algumas das funcionalidades possveis

ASPOF EN-AEL Pessanha Santos

Arduino Introduo e Recursos Avanados

Escola Naval

Pela anlise da figura acima, pode-se ter uma noo de alguns exemplos de componentes que se encontram disponveis, conseguindo reunir uma grande quantidade de recursos num nico circuito integrado. Na figura seguinte, apresentado um diagrama de blocos de um microcontrolador ATMega168 em tudo idntico a um ATMega328 em que possvel identificar todos os seus constituintes.

Fig. 5 Diagrama de blocos de um microcontrolador ATMega168 Fonte: Datasheet do microcontrolador ATMega168

As diferenas entre microprocessador e microcontrolador, so fundamentais para a correcta compreenso de todos os subcaptulos que se seguem.

ASPOF EN-AEL Pessanha Santos

10

Arduino Introduo e Recursos Avanados

Escola Naval

2.1.3. Tipos e Quantidades de Memria Disponveis


Uma das principais diferenas em termos de capacidade nos diferentes modelos disponveis reside na memria do microcontrolador utilizado. Vamos comear por analisar essa diferena, j que representa um factor crucial no seu desempenho. As quantidades de memria disponveis nos diversos modelos de microcontrolador utilizados pelo Arduino so os seguintes:
ATMega168 16 KBytes (2 KBytes Bootloader) 1024 Bytes 512 Bytes ATMega328 32 KBytes (2 KBytes Bootloader) 2048 Bytes 1024 Bytes ATMega1280 128 KBytes (4 KBytes Bootloader) 8192 Bytes 4096 Bytes

Flash SRAM EEPROM

Tabela 1 Quantidade de memria disponvel em cada modelo de microcontrolador Fonte: Retirado do datasheet dos respectivos microcontroladores

Como podemos constatar pela anlise da tabela 1, o ATMega1280 leva clara vantagem em termos de capacidade. Uma das memrias mais importantes, alm da memria Flash que permite o armazenamento do bootloader e do programa sketch - a ser executado, a memria SRAM (Static Random Access Memory), que se comporta de forma semelhante RAM nos nossos computadores. na SRAM que o programa, ao ser executado, cria e modifica todo o tipo de variveis necessrias sua execuo. Este tipo de memria apenas mantm os dados enquanto se encontra alimentada, o mesmo no acontece com a memria EEPROM (Electrically-Erasable Programmable Read-Only Memory) e memria Flash. A memria Flash nos dias de hoje comummente utilizada em cartes de memria, pendrives, memria de armazenamento em cmaras de vdeo, telemveis, PDA (Personal Digital Assistant), entre muitas outras aplicaes. Podemos resumir o tipo de memria, em funo da sua utilizao, da seguinte forma:
Flash aqui que o sketch e o bootloader so armazenados SRAM Onde so criadas e modificadas as variveis ao longo da execuo do sketch EEPROM Pode ser usada para guardar informao (no voltil) Tabela 2 Utilizao dada pelo Arduino (utilizador) aos diversos tipos de memria Fonte: Site oficial Arduino (www.arduino.cc)

Com vista a ser poupada memria SRAM, necessria para a correcta execuo do programa, por vezes so guardadas constantes (p.ex. o nmero ) na memria Flash e EEPROM. Para tal, recorrem-se a bibliotecas prprias que possibilitam essa leitura e escrita, para a EEPROM pode-se recorrer { biblioteca <EEPROM.h> e para a memria Flash pode-se recorrer biblioteca <pgmspace.h> ou <Flash.h>. Neste tutorial apenas vo ser abordadas a biblioteca <EEPROM.h> e <Flash.h>, mas, devido ao carcter open source, existem muitas outras bibliotecas disponveis para as mesmas finalidades, devendo o leitor procurar trabalhar com a que se sente mais vontade e obtm os melhores resultados. A abordagem a estas duas bibliotecas encontra-se no captulo 4 Recursos Avanados.

ASPOF EN-AEL Pessanha Santos

11

Arduino Introduo e Recursos Avanados

Escola Naval

2.1.4.

Pinout Disponvel

Torna-se importante uma descrio das possibilidades em termos de pinout do Arduino, sendo uma representao esquemtica possvel para o Arduino Duemilinove a seguinte:

Fig. 6 Representao esquemtica do Arduino Duemilinove Fonte: Obtido a partir Software open source Fritzing (Software de download gratuito a partir do site - www.fritzing.org)

Pela anlise da figura acima podemos retirar as seguintes concluses, em termos de pinout disponvel:
Pinos de I/O digitais Pinos analgicos Pinos de Ground (GND) Pinos de 5 V Pinos de 3.3 V Pinos de Analog Reference (AREF) Pinos de reset (RESET) 14 (6 com Pulse Width Modulation (PWM)) 6 3 1 1 1 1

Tabela 2 Pinout disponvel (Arduino Duemilinove)

ainda importante referir que a corrente mxima por cada pino analgico e digital de 40 mA, excepo da sada que providencia 3.3 V (visvel na figura 1 e figura 5), que permite correntes mximas de 50 mA. De acordo com Sousa and Lavinia, 2006, a capacidade de utilizar Pulse Width Modulation (PWM), muito importante, pois permite obter uma tenso analgica a partir de um sinal digital, ou seja, de um sinal que apenas pode assumir o estado lgico 0 (0V) ou 1 (5 V). O conceito de PWM utilizado para referir sinal que possua uma frequncia constante e um duty cicle vari|vel.

Frequncia constante

duty cicle vari|vel

Fig. 7 Exemplo de sinal PWM Fonte: Adaptado de Sousa and Lavinia 2006, pg. 155

ASPOF EN-AEL Pessanha Santos

12

Arduino Introduo e Recursos Avanados

Escola Naval

A teoria por detr|s deste fenmeno pode ser facilmente descrita. Analisemos a seguinte equao: 1 =

Nota: Na equao anterior, T representa o perodo e V(t) representa a tens~o em funo do tempo. Aplicando o conceito de PWM equao descrita anteriormente, obtemos o seguinte: = 0 0 <

Nota: Na equa~o anterior representa a dura~o do impulso, e representa a tenso do impulso do sinal PWM.

0
Fig. 8 Representao de um impulso PWM Fonte: Adaptado de Sousa and Lavinia 2006, pg. 156

Aplicando os conceitos descritos anteriormente:


=
0

Ficando pois: Podemos concluir, pela an|lise da equa~o anterior, que a tens~o mdia ( ") directamente proporcional ao duty cicle do sinal PWM. Esta caracterstica permite-nos fazer variar a tenso, neste caso especfico, variar a tenso entre 0 e 5 V (Arduino). Aps uma breve descrio sobre o modo de funcionamento de um sinal PWM, vamos agora aprofundar um pouco mais a converso A/D. Este factor de grande interesse e a sua compreenso fundamental para perceber os valores obtidos nos pinos analgicos. O microcontrolador utilizado possui um conversor analgico digital de 10 bits, fazendo as contas: 210 = 1024 Como a tenso mxima de referncia, por definio, se encontra nos 5V, correspondendo ao valor 1023, obtemos a seguinte resoluo: = 5 1024 0,00488 V 5 mV O que significa que s se conseguir| detectar variaes superiores a 5 mV, ou seja, o valor lido pelo Arduino s se altera a cada 5 mV de variao do sinal analgico de entrada.

ASPOF EN-AEL Pessanha Santos

13

Arduino Introduo e Recursos Avanados

Escola Naval

Em caso de aplicaes que possuam sensores analgicos, por vezes 5 mV no uma resoluo aceitvel - existindo uma grande perda de resoluo. Uma possvel soluo, sem recorrer a electrnica externa, apresentada de seguida. Para a resoluo da questo, existe um pino de entrada denominado AREF, que significa Analog Reference. Este pino permite mudar a referncia analgica do standard 5V para o valor de entrada. Ficando todas as entradas analgicas com a referncia introduzida. Simplificando, se for introduzido no pino AREF a tenso de 2V obtm-se a seguinte resoluo: 2 1024 1.953 mV 2 mV importante ter em conta que todos os pinos analgicos ficam com esta referncia, sendo necessria tambm a sua declarao por Software pela forma analogReference(tipo). A referncia analgica pode, assim, ser de trs tipos:
DEFAULT INTERNAL EXTERNAL Mantm a referncia por definio (5V) Altera a referncia para 1.1 V (ATMega168) A voltagem introduzida no pino AREF tomada como referencia Tabela 3 Modos de configurao da referncia analgica Fonte: Site oficial Arduino (www.arduino.cc)

Basicamente, faz-se a configurao do contedo do registo ADMUX (pgina 205 e 206 do respectivo datasheet). importante, por vezes, fazer uma interligao entre a funo em C, uma linguagem de alto nvel (com um nvel de abstraco elevado, mais perto da linguagem humana), e o assembly, uma linguagem de baixo nvel. ento muito importante tentar perceber o que acontece na configurao do microcontrolador e no apenas ver os resultados, embora sejam estes que nos interessam, no ser isso que se pretende na compreenso do funcionamento do microcontrolador e, posteriormente, do Arduino. igualmente de referir que aps configurar o Arduino para o uso do pino AREF, ele deixa de ter disponveis os pinos de 3.3V e 5V, sendo estes desligados necessrio recorrer a alimentao externa, caso se queiram utilizar essas tenses de alimentao. O Arduino possui capacidade de operar alimentado, quer pela porta USB ou por uma entrada Pwr (do tipo Power Jack), sendo recomendada a sua alimentao (Pwr) entre os 7 e os 12V, possibilita uma opera~o do tipo Standalone. O pino Vin no foi referido juntamente com os outros tipos de alimentao, pois possui um comportamento duplo. Ou seja, pode servir para alimentar o Arduino na gama de valores especificada ou, caso se alimente o Arduino recorrendo a uma das alimentaes especificadas anteriormente, pode-se ter disponvel um pino com a tenso utilizada na entrada (p.ex. se for alimentado o Arduino recorrendo a uma alimentao externa de 9 V, no pino Vin estaro acessveis os 9 V da alimentao). Alguns pormenores de configurao de cariz mais avanado podero ser encontrados no captulo 4 Recursos avanados.

ASPOF EN-AEL Pessanha Santos

14

Arduino Introduo e Recursos Avanados

Escola Naval

2.2. Software
2.2.1. Instalao e Utilizao
Neste captulo, vai ser efectuada uma breve descrio de como instalar e utilizar o Software de desenvolvimento Arduino. O Software de desenvolvimento Arduino bastante fcil e intuitivo de utilizar, no havendo qualquer nvel de dificuldade. Foram estruturados passos de forma a simplificar a sua utilizao e instalao. O 1 passo consiste em efectuar o download do respectivo software de desenvolvimento, atravs do site oficial Arduino (www.arduino.cc).

1-

Fig. 9 Imagem da parte superior do site oficial do Arduino Fonte: Site oficial Arduino (www.arduino.cc)

A ltima verso disponvel aparecer na parte superior da pgina, como mostra a figura abaixo, sendo s necessrio escolher a verso apropriada para o sistema operativo que nos encontramos a trabalhar. Actualmente, a verso mais actual a 0016, mas quando estiver a ler este tutorial muito provavelmente j deve haver uma verso mais avanada.

Fig. 10 Imagem da parte superior do site oficial do Arduino. Fonte: Site oficial Arduino (www.arduino.cc)

2- O 2 passo consiste em descompactar o ficheiro .ZIP (vers~o Windows w Mac OS) ou .tgz (vers~o Linux) para uma pasta { sua escolha. Escolha uma pasta de destino final, pois o programa no necessita de instalao. Utilizando o sistema operativo Windows, o contedo da pasta dever ser o seguinte:

Fig. 11 Contedo da pasta que contm o Software de desenvolvimento Arduino

ASPOF EN-AEL Pessanha Santos

15

Arduino Introduo e Recursos Avanados

Escola Naval

3- O 3 passo consiste em ligar a placa de desenvolvimento ao computador e instalar os


drivers FTDI, para permitir uma converso de USB para srie. A representao do pinout de um FTDI a seguinte:

Fig. 12 Esquema de um FTDI Fonte: Retirado de Igoe 2007 pg. 55

Os drivers encontram-se disponveis na pasta do Software Arduino - que descompactou no passo 2 - ou se preferir pode sempre retirar os drivers mais actualizados do site oficial FTDI - http://www.ftdichip.com/.

4- O 4 passo consiste em configurar a porta srie a ser utilizada e qual o tipo de modelo Arduino, que nos encontramos a utilizar. Para tal, necessitamos de abrir o Software de desenvolvimento e escolher na barra de separadores a op~o Tools.
Opo Tools

Seleccionar Modelo a utilizar Porta COM a ser utilizada

Fig. 13 Software de desenvolvimento Arduino

ASPOF EN-AEL Pessanha Santos

16

Arduino Introduo e Recursos Avanados

Escola Naval

5- O 5 e ltimo passo para a utilizao do Software consiste em elaborar o seu Sketch,


compilar e, caso no tenha erros, fazer o uploading para a placa de desenvolvimento Arduino.

Fig.14 Boto para compilar o Sketch elaborado

Fig.15 Boto para efectuar uploading

2.2.2. Ciclo de Desenvolvimento


Um resumo do referido anteriormente pode ser encontrado na figura seguinte, que demonstra os passos necessrios para elaborar uma aplicao (aps ter feito a instalao do Software) de uma forma esquemtica e a qual se pode designar por Ciclo de Desenvolvimento.

Editar

Compilar

Uploading

Executar

Fig.16 Esquema da fase de desenvolvimento de uma aplicao (Ciclo de desenvolvimento)

A anlise da figura 16 permite fazer um resumo possvel de todas as fases necessrias at execuo do programa criado, sendo muito importante a sua compreenso e apreenso. A figura 17 visa dar outra perspectiva ao exposto na figura 16, tentando dar a compreender uma vez mais qual o ciclo de desenvolvimento da plataforma de desenvolvimento Arduino.

Fig.17 Esquema da fase de desenvolvimento de uma aplicao (Outra maneira possvel de representar)

ASPOF EN-AEL Pessanha Santos

17

Arduino Introduo e Recursos Avanados

Escola Naval

2.2.3.

Interaco do Arduino com outro Software

Fig. 18 Imagem da parte superior do site oficial do Arduino Fonte: Site oficial Arduino (www.arduino.cc)

Caso se pretenda interagir com outro tipo de Software com a plataforma de desenvolvimento Arduino, pode-se recorrer ao separador Playground (Fig. 18). Podendo encontrar inmeras referncias de interaco do Arduino com outro Software de desenvolvimento (p.ex. Processing, Mathematica, MatLab, entre outros).

3.

ndice de Instrues

Neste captulo, vo ser referidas as mais importantes instrues base do ambiente de desenvolvimento Arduino, sem recorrer a bibliotecas externas, sendo estas enumeradas por tipo de aplicao. Antes de abordar algumas das instrues possveis numa linguagem de alto nvel, podemos fazer uma breve abordagem para analisar qual a classificao a atribuir ao microcontrolador em estudo. De acordo com Arroz, Monteiro et al. 2007, pg. 732, podemos classificar os processadores tendo em conta o seu conjunto de instrues em duas categorias: CISC (Complex Instruction Set Computers) RISC (Reduced Instruction Set Computers) Baseando-se a arquitectura CISC num conjunto de instrues com modos de endereamento bastante complexos, ao utilizar este tipo de arquitectura permitido elaborar programas bastante compactos e codificveis ao recorrer a um uso reduzido de instrues. Alguns dos inconvenientes deste tipo de arquitectura so baseados no elevado tempo de ciclos de relgio, necessrios para executar cada uma das suas instrues. Outro inconveniente a existncia de variados modos de endereamento. Por outro lado os processadores baseados em arquitecturas do tipo RISC, apresentam um conjunto de instrues bastante reduzido, possibilitando assim obter uma enorme simplicidade e um tempo de execuo menor por instruo que a arquitectura CISC. Conseguindo, assim, com um conjunto de instrues bsicas com tempo de execuo menores, obter, no final, velocidades de processamento mais elevadas que a arquitectura CISC. Na sua verso mais simples, baseando a anlise em Arroz, Monteiro et al. 2007 pg. 733, pode afirmar-se que os processadores RISC possuem os seguintes tipos de instrues: Instrues lgicas e aritmticas sobre registos; Instrues de transferncia de dados entre memria e registos; Instrues de controlo.

No datasheet dos microcontroladores utilizados nos modelos do Arduino, pode-se perceber que estamos perante microcontroladores baseados numa arquitectura advanced RISC. Segundo Tecnology 1992 pg. 14, em que efectuado uma reviso completa arquitectura advanced RISC, referido que esta arquitectura foi desenvolvida para ser uma especifica~o standard para uma famlia de microprocessadores baseada na famlia MIPS.

ASPOF EN-AEL Pessanha Santos

18

Arduino Introduo e Recursos Avanados

Escola Naval

MIPS (Microprocessor Without Interlocked Pipeline Stages) uma arquitectura de microcontroladores RISC, desenvolvida pela MIPS Technology. MIPS tambm podem ser as iniciais de Millios of Instructions Per Second, ou seja, Milhares de Instrues Por Segundo.

3.1.

Funes Base 3.1.1 void setup()


Descrio: Esta funo apenas executada uma vez e normalmente utilizada para executar a inicializao de variveis, a inicializao da utilizao bibliotecas (no confundir com declarao de bibliotecas), a definio dos pinos (como input ou output), o incio do uso de comunicao srie, entre outros. Esta funo apenas volta a ser executada novamente ao ser efectuado o reset ou quando se desligar e volta a ligar a placa de desenvolvimento Arduino. Exemplo: (1) int botao=3; // Declarao de uma varivel do tipo integer, com o nome botao inicializada com o valor 3. (2) void setup() { (3) Serial.begin(9600); // Permite a inicializao da comunicao Srie (4) pinMode(botao,INPUT); // Permite definir o pino 3 como INPUT (5) } (6) void loop(){ (7) (.) (8) }

3.1.2

void loop()

Descrio: Esta fun~o faz um loop sucessivo (como o prprio nome indica), ou seja, todos os comandos existentes no interior desta funo so sucessivamente repetidos, o que pode permitir a leitura sucessiva de portas, a leitura sucessiva de parmetros provenientes de sensores externos e actuar de acordo com as condies estabelecidas, entre muitas outras aplicaes, bastando apenas ter criatividade. Exemplo: (1) int botao=3,val; // Declarao de uma varivel do tipo integer, com o nome botao inicializada com o valor 3 e de uma varivel do mesmo tipo com o nome val (2) void setup() { (3) Serial.begin(9600); // Permite a inicializao da comunicao Srie (4) pinMode(botao,INPUT); // Permite definir o pino 3 como INPUT (5) pinMode(13,OUTPUT); // Permite definir o pino 13 como OUTPUT (6) } (7) void loop(){ (8) val=analogRead(botao); // Permite a leitura analgica do valor do pino 3 atribuindo o seu valor varivel val (9) if(val>=500){ // Ciclo if que testa a condio val>=500 (maior ou igual a 500)

ASPOF EN-AEL Pessanha Santos

19

Arduino Introduo e Recursos Avanados

Escola Naval

(10) digitalWrite(13,HIGH); // Se a condio for verificada, atribudo ao pino digital 13 a condio HIGH (5 V) (11) } (12) } Nota: As funes atrs descritas tm de ser necessariamente do tipo void, ou seja, no podem retornar qualquer valor depois da sua execuo.

3.1.3.

Resumindo

As funes void setup()e void loop() s~o de carcter obrigatrio, ou seja, mesmo que no necessria a sua utilizao devero constar no cdigo utilizado. E apenas ser~o chamadas funes externas que constem na fun~o void loop(). Um resumo dos subcaptulos anteriores encontra-se expresso no exemplo seguinte: Exemplo: Declarao de variveis globais; void setup(){ Instruo 1; Conjunto de instrues apenas executado uma vez, Instruo 2; na inicializao do programa a executar (.) } void loop(){ Instruo 6; Conjunto de instrues que executado em loop Instruo 9; Funo1(); (.) } Nos prximos captulos e subcaptulos, vai ser explorado o tipo de variveis possveis de declarar e algumas das instrues julgadas mais importantes. Essas instrues estaro divididas dependendo da sua aplicao, facilitando assim a sua organizao.

ASPOF EN-AEL Pessanha Santos

20

Arduino Introduo e Recursos Avanados

Escola Naval

3.2.

Ciclos 3.2.1 Ciclo If.else


Descrio: utilizado para descrever uma condio, ou seja, quando uma varivel for: igual, maior, menor ou diferente (de acordo com a declarao efectuada) que um determinado valor executada uma determinada condio. Podem-se usar vrios ciclos if.else encadeados, de forma a verificar diversas condies. Sintaxe: if(condio){ Instruo 1; Instruo 2; (..) } else{ Instruo 3; Instruo 4; (..) } A utilizao da instruo else no ciclo if dispensvel, podendo apenas tomar a forma: if(condio){ Instruo 1; Instruo 2; (..) } A condio acima referida pode ser descrita das seguintes formas: X == Y X != Y X>Y X >= Y X<Y X <= Y Exemplo: (1) int botao=3,val; // Declarao de uma varivel do tipo integer, com o nome botao inicializada com o valor 3 e de uma varivel do mesmo tipo com o nome val (2) void setup() { (3) Serial.begin(9600); // Permite a inicializao da comunicao Srie (4) pinMode(botao,INPUT); // Permite definir o pino 3 como INPUT X igual a Y X diferente de Y (no igual) X maior que Y X maior ou igual a Y X menor que Y X menor ou igual a Y
Tabela 4 Condies possveis

ASPOF EN-AEL Pessanha Santos

21

Arduino Introduo e Recursos Avanados

Escola Naval

(5) pinMode(13,OUTPUT); // Permite definir o pino 13 como OUTPUT (6) } (7) void loop(){ (8) val=analogRead(botao); // Permite a leitura analgica do valor do pino 3 atribuindo o seu valor varivel val (9) if(val>=500) // Ciclo if que testa a condio val>=500 (maior ou igual a 500) (10) digitalWrite(13,HIGH); // Se a condio for verificada, atribudo ao pino digital 13 a condio HIGH (5 V) (12) else (13) digitalWrite(13,LOW); // Se a condio no for verificada, atribudo ao pino digital 13 a condio LOW (0 V) (14) }

3.2.2

Ciclo for

Descrio: Esta instruo utilizada quando se quer efectuar uma instruo ou conjunto de instrues um determinado nmero de vezes. Um exemplo possvel de aplicao o preenchimento de um vector (array), com dados provenientes de entradas analgicas. Sintaxe: for(inicializao; condio; incremento a efectuar){ Instruo 1; Instruo 2; (.) } A inicializao apenas efectuada uma vez, no incio do ciclo. Cada vez que o ciclo efectuado a condio testada. Caso a condio se verifique efectuado o incremento, caso a condio no se verifique o ciclo termina a sua execuo. A condio, referida anteriormente, declarada semelhana da condio utilizada no ciclo if. O exemplo abaixo mostra um exemplo de implementao do ciclo for, face s regras expostas acima. Exemplo: (1) int entrada_analogica=3,val,f[10],i; // Declarao de uma varivel do tipo integer, com o nome entrada_analogica inicializada com o valor 3, de variveis do mesmo tipo com o nome val e i no inicializada, e de um vector f[] com 11 posies de memria do mesmo tipo (integer). (2) void setup() { (3) Serial.begin(9600); // Permite a inicializao da comunicao Srie (4) pinMode(entrada_analogica,INPUT); // Permite definir o pino 3 como INPUT (5) } (6) void loop(){ (7) for(i=0;i<=10;i++){ // Ciclo for que percorrido 11 vezes, i<=10 com i a comear no valor 0 (8) val=analogRead(entrada_analogica); // Permite a leitura analgica do valor do pino 3 atribuindo o seu valor varivel val

ASPOF EN-AEL Pessanha Santos

22

Arduino Introduo e Recursos Avanados

Escola Naval

(9) f[i]=val; //Atribui o valor da varivel val ao vector f[i], ou seja, permite preencher o vector com 11 valores do pino analgico 3 (10) } (11) }

3.2.3

Ciclo switch / case

Descrio: normalmente utilizada para declarar uma lista de casos possveis, para uma determinada varivel, sendo verificado cada caso e apenas executado quando a varivel respeitar a condio declarada. Sintaxe: switch(varivel){ case 1: Instruo a executar quando varivel for 1 (varivel == 1) break; case 2: Instruo a executar quando varivel for 2 (varivel == 2) break; (..) default: Conjunto de instrues a executar se nenhuma das condies for verificada. A utilizao desta condio opcional. break; } necess|rio utilizar a instru~o break caso se pretenda sair do ciclo aps a condio ser verificada. Caso contrrio, vai continuar a ser executado o ciclo a partir da condio verificada. Exemplo: (1) int entrada_analogica=3,val; // Declarao de uma varivel do tipo integer, com o nome entrada_analogica inicializada com o valor 3 e de uma varivel do mesmo tipo com o nome val (2) void setup() { (3) Serial.begin(9600); // Permite a inicializao da comunicao Srie (4) pinMode(entrada_analogica,INPUT); // Permite definir o pino 3 como INPUT (5) pinMode(13,OUTPUT); // Permite definir o pino 13 como OUTPUT (6) } (7) void loop(){ (8) val=analogRead(entrada_analogica); // Permite a leitura analgica do valor do pino 3 atribuindo o seu valor varivel val (9) switch(val){ // Ciclo switch, sendo val a varivel a testar (10)case 500: // condio de teste, se val == 500 (igual a 500) (11) digitalWrite(13,HIGH); // Se a condio da linha 10 se verificar, esta instruo executada (12) break; // Instruo que permite terminar o ciclo (13) default: // Se nenhuma das condies se verificar (o seu uso opcional)

ASPOF EN-AEL Pessanha Santos

23

Arduino Introduo e Recursos Avanados

Escola Naval

(14) digitalWrite(13,LOW); // Instruo que executada se a condio do ciclo switch no se verificar (15) } (16) }

3.2.4

Ciclo while

Descrio: normalmente utilizado para efectuar um loop sucessivo at uma determinada condio se verificar. Caso essa condio se deixe de verificar o ciclo termina. Em casos em que a condio no se verifica, estamos perante um ciclo infinito (semelhante { fun~o void loop()). Sintaxe: while(condio){ Instruo 1; Instruo 2; (..) } necessrio fazer com que a condio se torne falsa, caso se queira finalizar o ciclo para executar outras instrues. Pois caso contrrio o ciclo vai ser executado indefinidamente. Exemplo: (1) int entrada_analogica=3,val,i=0,f[10]; // Declarao de uma varivel do tipo integer, com o nome entrada_analogica inicializada com o valor 3, de variveis do mesmo tipo com o nome val no inicializada, i inicializada com o valor 0 e de um vector f[] com 11 posies de memria do mesmo tipo (integer). (2) void setup() { (3) Serial.begin(9600); // Permite a inicializao da comunicao Srie (4) pinMode(entrada_analogica,INPUT); // Permite definir o pino 3 como INPUT (5) } (6) void loop(){ (7) while(i<=10){ // ciclo while, com a condio i<=10 (8) val=analogRead(entrada_analogica); // Permite a leitura analgica do valor do pino 3 atribuindo o seu valor varivel val (9) f[i]=val; //Atribui o valor da varivel val ao vector f[i], ou seja, permite preencher o vector com valores provenientes do pino analgico 3 (10) i++; // Incremento do valor de i inicialmente a zero, instruo semelhante a i=i+1 (11) } (12) }

ASPOF EN-AEL Pessanha Santos

24

Arduino Introduo e Recursos Avanados

Escola Naval

3.2.5

Ciclo do.while

Descrio: Bastante semelhante ao ciclo while, sendo a principal diferena o facto da condio ser testada apenas no fim do ciclo e no no incio do ciclo. Ou seja, mesmo que a condio seja falsa o ciclo vai ser sempre executado uma vez. Sintaxe: do{ Instruo 1; Instruo 2; (..) } while(condio); Exemplo: (1) int entrada_analogica=3,val,i=0,f[10]; // Declarao de uma varivel do tipo integer, com o nome entrada_analogica inicializada com o valor 3, de uma varivel do mesmo tipo com o nome val no inicializada, i inicializada com o valor 0 e de um vector f[] com 11 posies de memria do mesmo tipo (integer). (2) void setup() { (3) Serial.begin(9600); // Permite a inicializao da comunicao Srie (4) pinMode(entrada_analogica,INPUT); // Permite definir o pino 3 como INPUT (5) } (6) void loop(){ (7) do{ // Permite definir o inicio do ciclo (8) val=analogRead(entrada_analogica); // Permite a leitura analgica do valor do pino 3 atribuindo o seu valor varivel val (9) f[i]=val: //Atribui o valor da varivel val ao vector f[i], ou seja, permite preencher o vector com valores provenientes do pino analgico 3 (10) i++; // Incremento do valor de i inicialmente a zero, instruo semelhante a i=i+1 (11)} (12) while(i<=10); // Se a condio se verificar repete o ciclo, caso no se verifique o ciclo termina (13) }

ASPOF EN-AEL Pessanha Santos

25

Arduino Introduo e Recursos Avanados

Escola Naval

3.3.

Tipos de variveis disponveis 3.3.1 Varivel do Tipo Boolean


Descrio: Uma varivel deste tipo apenas pode tomar dois valores distintos true ou false. Esta vari|vel reserva 1 Byte de memria para a sua utilizao. Sintaxe: boolean vari|vel = valor; Quando referido acima a valor, est|-se a referir a true ou false. Exemplo: (1) int entrada_analogica=3,val,i=0,f[10]; // Declarao de uma varivel do tipo integer, com o nome entrada_analogica inicializada com o valor 3, de uma varivel do mesmo tipo com o nome val no inicializada, i inicializada com o valor 0 e de um vector f[] com 11 posies de memria do mesmo tipo (integer). (2) boolean teste = false; // Definio de uma varivel do tipo boolean inicializada com false (3) void setup() { (4) Serial.begin(9600); // Permite a inicializao da comunicao Srie (5) pinMode(entrada_analogica,INPUT); // Permite definir o pino 3 como INPUT (6) } (7) void loop(){ (8) do{ // Permite definir o inicio do ciclo (9) val=analogRead(entrada_analogica); // Permite a leitura analgica do valor do pino 3 atribuindo o seu valor varivel val (10) f[i]=val: //Atribui o valor da varivel val ao vector f[i], ou seja, permite preencher o vector com valores provenientes do pino analgico 3 (11) i++; // Incremento do valor de i inicialmente a zero, instruo semelhante a i=i+1 (12) teste = !teste; //modifica o valo atribudo varivel booleana teste o seu oposto ( se true fica false e vice-versa) (13)} (14) while(i<=10); // Se a condio se verificar repete o ciclo, caso no se verifique o ciclo termina (15) }

ASPOF EN-AEL Pessanha Santos

26

Arduino Introduo e Recursos Avanados

Escola Naval

3.3.2.

Varivel do tipo char vs unsigned char

Descrio: Uma varivel do tipo char apenas pode guardar um nico caracter, ocupando este tipo de varivel 1 Byte de memria. Este tipo de varivel pode armazenar os valores em decimal, correspondentes ao valor decimal (tabela ASCII) do caracter a guardar. Podendo ter valores em decimal no intervalo de 128 a 127. Ao declarar uma varivel do tipo char como unsigned, estamos a abdicar da parte negativa. Podendo armazenar valores correspondendo entre 0 a 255. Sintaxe: char varivel = Caracter: char vari|vel = valor em decimal - tabela ASCII; unsigned char vari|vel = Caracter; unsigned char vari|vel = valor em decimal - tabela ASCII; Exemplos: char exemplo_char = N; // Atribuido varivel do tipo char o caracter N char exemplo_char_1 = 78; // Corresponde ao caracter N, segundo a tabela ASCII

3.3.3.

Varivel do tipo byte

Descrio: Armazena um nmero do tipo unsigned, compreendido entre 0 e 255. Ocupando, como o prprio nome indica, 1 Byte na memria (8 Bits). Sintaxe: byte varivel = valor; Exemplos: byte exemplo = B0000001; // Armazena o valor em binrio que corresponde ao valor 1 em decimal byte exemplo_2 = 1; // Semelhante ao exemplo anterior, mas armazenando o valor directamente em decimal

ASPOF EN-AEL Pessanha Santos

27

Arduino Introduo e Recursos Avanados

Escola Naval

3.3.4.

Varivel do tipo int vs unsigned int

Descrio: Este tipo de varivel (integer) permite guardar um valor inteiro de 2 bytes, ou seja, um nmero inteiro com valor compreendido entre -32768 e 32767. Podemos tambm declarar a varivel int, como sendo do tipo unsigned. Ao declarar uma varivel do tipo unsigned, deixamos de ter parte negativa passando a poder armazenar valores compreendidos entre 0 e 65535. Sintaxe: int varivel = valor; unsigned int varivel = valor; Exemplos: int exemplo = -150; // Declara um varivel do tipo int e atribui-lhe o valor de 150 unsigned int exemplo_1 = 65000; // Declara um varivel do tipo unsigned int e atribui-lhe o valor de 65000

3.3.5.

Varivel do tipo long vs unsigned long

Descrio: um tipo de varivel que pode guarda valores numricos at 32 bits, o que correspondente a 4 bytes, ou seja, valores compreendidos entre 2147483648 e 2147483647. Este tipo de varivel pode tambm ser declarado como unsigned, podendo armazenar valores compreendidos entre 0 e 4294967295. Sintaxe: long varivel = valor; unsigned long varivel = valor; Exemplos: long exemplo = -1500000000; // Declara um varivel do tipo long e atribui-lhe o valor de -1500000000 unsigned long exemplo_1 = 4000000000; // Declara um varivel do tipo unsigned long e atribui-lhe o valor de 4000000000

ASPOF EN-AEL Pessanha Santos

28

Arduino Introduo e Recursos Avanados

Escola Naval

3.3.6.

Varivel do tipo float vs double

Descrio: A varivel do tipo float apresenta uma maior resoluo, face s variveis do tipo integer. So reservados em memria 4 Bytes (32 bits), para armazenar o seu contedo. Este tipo de varivel pode conter valores no intervalo de 3.4028235 1038 e 3.4028235 1038 . Paralelamente o conceito de double leva-nos a considerar uma varivel que possua o dobro da preciso, de uma varivel do tipo float, apesar de no contexto de estudo a declarao de uma varivel do tipo float ou do tipo double ser igual. Ou seja, no existe um incremento de preciso mantendo o mesmo espao reservado de memria para ambos os tipos utilizando o Arduino. Sintaxe: float varivel = valor; double varivel = valor; Exemplos: float exemplo = 1.589; // Declara um varivel do tipo float e atribui-lhe o valor de 1.589 double exemplo_1 = 1.589; // Declara um varivel do tipo double e atribui-lhe o valor de 1.589

3.3.7.

Varivel do Tipo array e a Noo de string

Descrio: considerado um array, um vector de variveis do mesmo tipo ao qual se pode aceder atravs do seu respectivo ndice. O conceito de string comummente utilizado para designar um vector de variveis do tipo char. Sintaxe: tipo_varivel nome_varivel[ndice] = valor; Ao declarar um ndice de valor 10, estamos na verdade a reservar 11 espaos na memria para a varivel do tipo declarado. Pois, tambm, temos de contar com o ndice zero, este factor torna-se muitas vezes objecto de erro. Exemplos: float exemplo[10]; // Declarao de um vector com 11 espaos, do tipo float float exemplo_2[]={1,2,3,4,5,6,7,8,9,10}; // Declarao de um vector do tipo float, que vai ter um ndice compreendido entre 0 e 9 char exemplo_3[11]=Hello World; // Declarao de uma string char exemplo_4[11]={H,E,L,L,O, ,W,O,R,L,D}; // Declarao de uma string, com o contedo semelhante ao exemplo anterior, mas com outra forma de colocar o mesmo contedo

ASPOF EN-AEL Pessanha Santos

29

Arduino Introduo e Recursos Avanados

Escola Naval

3.4.

Converter tipos de variveis 3.4.1. char(x)

Descrio: Converte um valor de x, que pode ser de qualquer tipo, para uma varivel do tipo char. Sintaxe: char varivel = char(valor);

3.4.2.

byte(x)

Descrio: Converte um valor de x, que pode ser de qualquer tipo, para uma varivel do tipo byte. Sintaxe: byte varivel = byte(valor);

3.4.3.

int(x)

Descrio: Converte um valor de x, que pode ser de qualquer tipo, para uma varivel do tipo integer. Sintaxe: int varivel = int(valor);

3.4.4.

long(x)

Descrio: Converte um valor de x, que pode ser de qualquer tipo, para uma varivel do tipo long. Sintaxe: long varivel = long(valor);

3.4.5.

float(x)

Descrio: Converte um valor de x, que pode ser de qualquer tipo, para uma varivel do tipo float. Sintaxe: float varivel = float(valor); ASPOF EN-AEL Pessanha Santos 30

Arduino Introduo e Recursos Avanados

Escola Naval

3.5.

Funes 3.5.1. Input/Output digital 3.5.1.1. pinMode()


Descrio: Ao recorrer a esta instruo, possvel configurar o modo de comportamento de um determinado pino. Possibilitando assim defini-lo como input ou output, esta definio normalmente efectuada recorrendo funo void setup(). Sintaxe: pinMode(Nmero do pino, Modo); O Modo acima descrito pode ser definido da seguinte forma: INPUT OUTPUT Exemplo: (1) int botao=3,val; // Declarao de uma varivel do tipo integer, com o nome botao inicializada com o valor 3 e de uma varivel do mesmo tipo com o nome val no inicializada com nenhum valor (2) void setup() { (3) Serial.begin(9600); // Permite a inicializao da comunicao Srie (4) pinMode(botao,INPUT); // Permite definir o pino 3 como INPUT (5) pinMode(13,OUTPUT); // Permite definir o pino 13 como OUTPUT (6) } (7) void loop(){ (8) val=analogRead(botao); // Permite a leitura analgica do valor do pino 3 atribuindo o seu valor varivel val (9) if(val>=500) // Ciclo if que testa a condio val>=500 (maior ou igual a 500) (10) digitalWrite(13,HIGH); // Se a condio for verificada, atribudo ao pino digital 13 a condio HIGH (5 V) (11) } (12) }

ASPOF EN-AEL Pessanha Santos

31

Arduino Introduo e Recursos Avanados

Escola Naval

3.5.1.2 digitalWrite()
Descrio: Possibilita, nos pinos configurados como output atravs da instruo pinMode, estabelecer a sada dos respectivos pinos com o valor lgico 1 (HIGH 5 V) ou com o valor lgico 0 (LOW 0V) Sintaxe: digitalWrite(Nmero do pino, Modo); O Modo acima descrito, pode ser definido como: HIGH LOW Exemplo: (1) int botao=3,val; // Declarao de uma varivel do tipo integer, com o nome botao inicializada com o valor 3 e de uma varivel do mesmo tipo com o nome val no inicializada com nenhum valor (2) void setup() { (3) Serial.begin(9600); // Permite a inicializao da comunicao Srie (4) pinMode(botao,INPUT); // Permite definir o pino 3 como INPUT (5) pinMode(13,OUTPUT); // Permite definir o pino 13 como OUTPUT (6) } (7) void loop(){ (8) val=analogRead(botao); // Permite a leitura analgica do valor do pino 3 atribuindo o seu valor varivel val (9) if(val>=500) // Ciclo if que testa a condio val>=500 (maior ou igual a 500) (10) digitalWrite(13,HIGH); // Se a condio for verificada, atribudo ao pino digital 13 a condio HIGH (5 V) (11) } (12) }

ASPOF EN-AEL Pessanha Santos

32

Arduino Introduo e Recursos Avanados

Escola Naval

3.5.1.3. digitalRead()
Descrio: Possibilita a leitura de uma entrada digital especfica, retornando um valor no formato integer (int). Se obtivermos um valor de retorno de 1, estamos perante uma leitura do tipo HIGH (valor lgico 1). Se tal no se verificar, e tivermos um valor de retorno igual a 0, estamos perante uma leitura do tipo LOW (valor lgico 0). Sintaxe: Varivel do tipo integer = digitalRead(Nmero do pino); Exemplo: (1) int botao=3,val; // Declarao de uma varivel do tipo integer, com o nome botao inicializada com o valor 3 e de uma varivel do mesmo tipo com o nome val no inicializada com nenhum valor (2) void setup() { (3) Serial.begin(9600); // Permite a inicializao da comunicao Srie (4) pinMode(botao,INPUT); // Permite definir o pino 3 como INPUT (5) pinMode(13,OUTPUT); // Permite definir o pino 13 como OUTPUT (6) } (7) void loop(){ (8) val=digitalRead(botao); // Permite a leitura do valor do pino 3 digital atribuindo o seu valor varivel val (9) if(val==1) // Ciclo if que testa a condio val>=500 (maior ou igual a 500) (10) digitalWrite(13,HIGH); // Se a condio for verificada, atribudo ao pino digital 13 a condio HIGH (5 V) (11) } (12) else{ // Caso a condio do ciclo if no se verifique (13) digitalWrite(13,LOW); // Se a condio no for verificada, atribudo ao pino digital 13 a condio LOW (0 V) (14) } (15) }

ASPOF EN-AEL Pessanha Santos

33

Arduino Introduo e Recursos Avanados

Escola Naval

3.5.2.

Input/Output analgico 3.5.2.1 analogRead()


Descrio: Possibilita a leitura do valor analgico do pino especificado, com um conversor A/D possuindo uma resoluo de 10 bits. O que leva a que um valor compreendido entre 0 e 5 V, esteja compreendido entre os valores inteiros (int) 0 e 1023. Sintaxe: Varivel do tipo integer = analogRead(Nmero do pino); Exemplo: (1) int botao=3,val; // Declarao de uma varivel do tipo integer, com o nome botao inicializada com o valor 3 e de uma varivel do mesmo tipo com o nome val no inicializada com nenhum valor (2) void setup() { (3) Serial.begin(9600); // Permite a inicializao da comunicao Srie (4) pinMode(botao,INPUT); // Permite definir o pino 3 como INPUT (5) pinMode(13,OUTPUT); // Permite definir o pino 13 como OUTPUT (6) } (7) void loop(){ (8) val=analogRead(botao); // Permite a leitura analgica do valor do pino 3 atribuindo o seu valor varivel val (9) if(val>=500) // Ciclo if que testa a condio val>=500 (maior ou igual a 500) (10) digitalWrite(13,HIGH); // Se a condio for verificada, atribudo ao pino digital 13 a condio HIGH (5 V) (11) } (12) }

ASPOF EN-AEL Pessanha Santos

34

Arduino Introduo e Recursos Avanados

Escola Naval

3.5.2.2 analogWrite()
Descrio: Possibilita a utilizao dos pinos PWM (Pulse Width Modulation) da placa Arduino. O sinal PWM mantm-se at ser modificado atravs de uma outra instruo que afecte esse pino, a frequncia do sinal PWM criado de 490 . Sintaxe: analogWrite(Nmero do pino, valor); O valor referido anteriormente varia entre 0 (sempre desligado), at ao valor 255 (que representa um sinal de 5 V constante). Exemplo: (1) int botao=3,val; // Declarao de uma varivel do tipo integer, com o nome botao inicializada com o valor 3 e de uma varivel do mesmo tipo com o nome val no inicializada com nenhum valor (2) void setup() { (3) Serial.begin(9600); // Permite a inicializao da comunicao Srie (4) pinMode(botao,INPUT); // Permite definir o pino 3 como INPUT (5) pinMode(13,OUTPUT); // Permite definir o pino 13 como OUTPUT (6) } (7) void loop(){ (8) val=analogRead(botao); // Permite a leitura analgica do valor do pino 3 atribuindo o seu valor varivel val (9) if(val>=500) // Ciclo if que testa a condio val>=500 (maior ou igual a 500) (10) analogWrite(9,255); // Instruo com a mesma funo que digitalWrite(9,HIGH) (11) } (12) else{ (13) analogWrite(9,0); // Instruo com a mesma funo que digitalWrite(9,LOW) (14) } (15) }

ASPOF EN-AEL Pessanha Santos

35

Arduino Introduo e Recursos Avanados

Escola Naval

3.5.3.

Tempo 3.5.3.1. millis()


Descrio: Possibilita o retorno da quantidade de tempo, em milisegundos na forma de uma vari|vel do tipo unsigned long. O valor retornado representa o tempo que, passou desde que o programa actual comeou a ser executado. O overflow (voltar ao incio, valor zero) do contador ocorre passado um tempo de 50 dias. Sintaxe: unsigned long tempo = millis(); Exemplo: (1) unsigned long tempo; // Declarada uma varivel do tipo unsigned long com o nome tempo (2) void setup() { (3) (..) (4) } (5) void loop(){ (6) tempo = millis(); // Atribui varivel tempo o valor em milisegundos desde que o sketch actual comeou a ser executado (7) }

3.5.3.2. micros()
Descrio: Possibilita o retorno da quantidade de tempo, em microsegundos na forma de uma vari|vel do tipo unsigned long. O valor retornado representa o tempo que, passou desde que o programa actual comeou a ser executado. O overflow (voltar ao incio, valor zero) do contador ocorre passado um tempo de 70 minutos. Sintaxe: unsigned long tempo = micros(); Exemplo: (1) unsigned long tempo; // Declarada uma varivel do tipo unsigned long com o nome tempo (2) void setup() { (3) (..) (4) } (5) void loop(){ (6) tempo = micros(); // Atribui varivel tempo o valor em microsegundos desde que o sketch actual comeou a ser executado (7) }

ASPOF EN-AEL Pessanha Santos

36

Arduino Introduo e Recursos Avanados

Escola Naval

3.5.3.3. delay (milisegundos)


Descrio: Possibilita efectuar uma pausa ao programa em execuo, por uma quantidade de milisegundos especificada. til para manter um estado durante uma certa quantidade de tempo. Sintaxe: delay(tempo que deseja efectuar a pausa ms); Exemplo: (1) int led_pin=13; // Declarao de uma varivel do tipo integer com o nome led_pin, sendo-lhe atribuda o valor 13 (2) void setup() { (4) pinMode(led_pin,OUTPUT); // Permite definir o pino 13 como OUTPUT (5) Serial.begin(9600); // Permite a inicializao da comunicao Srie (6) } (7) void loop(){ (8) digitalWrite(led_pin,HIGH); // atribudo ao pino digital 13 a condio HIGH (5 V) (9) delay(200); // efectuado um delay de 200 ms, antes de efectuar a prxima instruo (10) digitalWrite(led_pin,LOW); // atribudo ao pino digital 13 a condio LOW (0 V) (11) delay(600); // efectuado um delay de 600 ms, antes de efectuar a prxima instruo, neste caso a funo void loop() recomea (12) }

3.5.3.4. delayMicroseconds (microsegundos)


Descrio: Possibilita efectuar uma pausa ao programa em execuo, por uma quantidade de microsegundos especificada. Sintaxe: delayMicroseconds(tempo que deseja efectuar a pausa s); Exemplo: (1) int led_pin=13; // Declarao de uma varivel do tipo integer com o nome led_pin, sendo-lhe atribuda o valor 13 (2) void setup() { (4) pinMode(led_pin,OUTPUT); // Permite definir o pino 13 como OUTPUT (5) Serial.begin(9600); // Permite a inicializao da comunicao Srie (6) } (7) void loop(){ (8) digitalWrite(led_pin,HIGH); // atribudo ao pino digital 13 a condio HIGH (5 V)

ASPOF EN-AEL Pessanha Santos

37

Arduino Introduo e Recursos Avanados

Escola Naval

(9) delayMicroseconds(200); // efectuado um delay de 200 s, antes de efectuar a prxima instruo (10) digitalWrite(led_pin,LOW); // atribudo ao pino digital 13 a condio LOW (0 V) (11) delayMicroseconds(600); // efectuado um delay de 600 s, antes de efectuar a prxima instruo, neste caso a funo void loop() recomea (12) }

ASPOF EN-AEL Pessanha Santos

38

Arduino Introduo e Recursos Avanados

Escola Naval

3.5.4.

Funes Matemticas 3.5.4.1. min(valor1,valor2)


Descrio: Instruo que retorna o menor de dois valores. Sintaxe: Varivel menor = min(Valor 1, Valor 2); Exemplo: int variavel_menor=0; // declarao de uma varivel do tipo integer de nome variavel_menor inicializada com o valor 0 variavel_menor = min(5,9); // O valor atribudo varivel varivel_menor seria o valor 5

3.5.4.2. max(valor1,valor2)
Descrio: Instruo que retorna o maior de dois valores. Sintaxe: Varivel maior = max(Valor 1, Valor 2); Exemplo: int variavel_maior=0; // declarao de uma varivel do tipo integer de nome variavel_maior inicializada com o valor 0 variavel_maior = max(5,9); // O valor atribudo varivel varivel_maior seria o valor 9

3.5.4.3. abs(valor)
Descrio: Instruo que retorna o modulo de um nmero. Sintaxe: Mdulo = abs(valor); Sendo Mdulo um valor que tem de respeitar a seguinte condi~o: Mdulo = Exemplo: int modulo=0; modulo = abs(-5) // O valor atribudo varivel modulo seria o valor 5 valor valor 0 valor valor < 0

ASPOF EN-AEL Pessanha Santos

39

Arduino Introduo e Recursos Avanados

Escola Naval

3.5.4.4. constrain(valor, valor1.,valor2)


Descrio: Limita o valor de retorno a um intervalo definido pelo utilizador. Sintaxe: Valor = constrain(Valor a testar, Valor inferior do intervalo, Valor superior do intervalo); Sendo Valor dado pela seguinte condi~o: Valor = valor Se valor valor1, valor2 valor1 valor < 1 valor2 valor > 2

Exemplo: int valor=0; // declarao de uma varivel do tipo integer de nome valor inicializada com o valor 0 valor = constrain(5,2,10) // O valor atribudo varivel valor seria o valor 5

3.5.4.5. map(X,valor1,valor2,para valor1,para valor2)


Descrio: Instruo til para modificar o intervalo de valores esperados por uma determinada aplicao. Possibilitando assim um ajuste na escala de valores a utilizar. Este tipo de instruo muito utilizado para gerar sinais PWM atravs de sinais analgicos de entrada, podendo assim a partir de um sinal que varia de 0 a 1023 gerar um sinal PWM que varia de 0 a 255 com relativa facilidade. Sintaxe: Valor num novo intervalo = map(Valor, valor1, valor2, Para valor1, Para valor2); valor1 O limite inferior do intervalo actual valor2 O limite superior do intervalo actual Para valor1 O limite inferior do novo intervalo a considerar Para valor2 O limite superior do novo intervalo a considerar

ASPOF EN-AEL Pessanha Santos

40

Arduino Introduo e Recursos Avanados Exemplo:

Escola Naval

1) int entrada_analogica=3,val,i=0,f[10]; // Declarao de uma varivel do tipo integer, com o nome entrada_analogica inicializada com o valor 3, de variveis do mesmo tipo com o nome val no inicializada com nenhum valor, i inicializada com o valor 0 e de um vector f[] com 11 posies de memria do mesmo tipo (integer) (2) void setup() { (3) Serial.begin(9600); // Permite a inicializao da comunicao Srie (4) pinMode(entrada_analogica,INPUT); // Permite definir o pino 3 como INPUT (5) } (6) void loop(){ (7) for(i=0;i<=10;i++){ //Inicio do ciclo for (8) val=analogRead(entrada_analogica); // Permite a leitura analgica do valor do pino 3 atribuindo o seu valor varivel val (10) map(val,0,1023,0,500); // Passa o valor da varivel val que se encontra numa escala de valores entre 0 e 1023 (entrada analgica), para um valor entre 0 e 500 (11) f[i]=val; (12) } (13) }

3.5.4.6. pow(valor, expoente)


Descrio: Permite calcular o resultado ao elevar um nmero a um determinado expoente. Sintaxe: Valor obtido = pow(valor, expoente); Exemplo: int valor=0; valor = pow(2,2) // O valor atribudo varivel valor seria o valor 4, pois 22 = 4.

3.5.4.7. sqrt(valor)
Descrio: Permite o clculo da raiz quadrado de um determinado valor. Sintaxe: Valor obtido = sqrt(valor); Exemplo: int valor=0; valor = sqrt(9) // O valor atribudo varivel valor seria o valor 3, pois 9 = 3.

ASPOF EN-AEL Pessanha Santos

41

Arduino Introduo e Recursos Avanados

Escola Naval

3.5.5.

Funes Trigonomtricas 3.5.5.1. sen(valor)


Descrio: Instruo que retorna o clculo do seno, de um valor em radianos. Sintaxe: Resultado = sen(Valor em Radianos); Com Resultado 1; 1

3.5.5.2. cos(valor)
Descrio: Instruo que retorna o clculo do coseno, de um valor em radianos. Sintaxe: Resultado = cos(Valor em Radianos); Com Resultado 1; 1

3.5.5.1. tan(valor)
Descrio: Instruo que retorna o clculo da tangente, de um valor em radianos. Sintaxe: Resultado = tan(Valor em Radianos); Com Resultado ; +

ASPOF EN-AEL Pessanha Santos

42

Arduino Introduo e Recursos Avanados

Escola Naval

3.5.6.

Nmeros Aleatrios 3.5.6.1 randomSeed(valor)


Descrio: Possibilita variar o ponto onde o algoritmo de sequncia aleatria comea, pois apesar de este ser muito longo (possuir muitos valores no seu intervalo), o seu intervalo apresenta-se constante. Ao fazer variar o ponto onde o algoritmo comea, menos probabilidades temos de repetir um nmero. Sintaxe: randomSeed(Valor); Exemplo: (1) void setup() { (2) () (3) randomSeed(analogRead(0)); //Possibilita fazer variar o ponto onde o algoritmo de sequncia aleatria comea. Se colocar-mos uma entrada aleatria, cada vez que a funo void setup() executada o valor atribudo diferente. (4) () (5) } (6) void loop(){ (7) (..) (8) }

3.5.6.2. random()
Descrio: Instruo que permite gerar nmeros aleatrios (ou melhor escrevendo - pseudo-aleatrios).

Sintaxe: Resultado = random(Valor mximo possvel); Resultado = random(Valor mnimo possvel, Valor mximo possvel); O Valor m|ximo possvel n~o est| includo no intervalo a considerar e a inclus~o do Valor mnimo possvel opcional. Ficando a vari|vel Resultado compreendida no seguinte intervalo: Resultado Valor mnimo possvel; ( 1) . Exemplo: (1) long valor_random; // Declarao de uma varivel do tipo long de nome valor_random (2) void setup() { (3) ()

ASPOF EN-AEL Pessanha Santos

43

Arduino Introduo e Recursos Avanados

Escola Naval

(4) randomSeed(analogRead(0)); //Possibilita fazer variar o ponto onde o algoritmo de sequncia aleatria comea. Se colocar-mos uma entrada aleatria, cada vez que a funo void setup() executada o valor atribudo diferente. (5) () (6) } (7) void loop(){ (8) valor_random=random(10,20); // Valor de valor_random ser um valor compreendido entre o valor 10 e o valor 20 (9) (.) (10) }

ASPOF EN-AEL Pessanha Santos

44

Arduino Introduo e Recursos Avanados

Escola Naval

3.5.7.

Interrupts 3.5.7.1. attachInterrupt(interrupt, funo,modo)


Descrio: Instruo que permite definir o funcionamento de interrupts externos. Ocorrendo a definio atravs desta instruo da funo a executar, do pino onde vai ocorrer o interrupt e o modo como se deve responder variao do sinal de entrada no pino a considerar. Sintaxe: attachInterrupt(interrupt, funo a executar, modo); O par}metro interrupt pode tomar os seguintes valores: Arduino duemilinove o o Valor 0 -corresponde ao pino digital 2; Valor 1 -corresponde ao pino digital 3.

Arduino Mega o o o o o o Valor 0 -corresponde ao pino digital 2; Valor 1 -corresponde ao pino digital 3; Valor 2 -corresponde ao pino digital 21; Valor 3 -corresponde ao pino digital 20; Valor 4 -corresponde ao pino digital 19; Valor 5 -corresponde ao pino digital 18.

Nota: A fun~o a executar, ao ser verificado o interrupt externo, no poder retornar qualquer valor (Ou seja, dever| ser do tipo void). O par}metro modo define o modo como ocorre o reconhecimento, de que ocorreu um interrupt externo. Podendo ter os seguintes valores:
LOW O interrupt efectuado sempre que o valor lgico no pino 0. O interrupt efectuado sempre que o valor no pino muda de valor. O interrupt efectuado sempre que o valor lgico no pino muda de 0 para 1. O interrupt efectuado sempre que o valor lgico no pino muda de 1 para 0.

CHANGE

RISING

FALLING

Tabela 5 Condies possveis do par}metro modo

ASPOF EN-AEL Pessanha Santos

45

Arduino Introduo e Recursos Avanados

Escola Naval

3.5.7.2. detachInterrupt(interrupt)
Descrio: Possibilita desabilitar um interrupt previamente estabelecido utilizando a instru~o attachInterupt().

Sintaxe: detachInterrupt(interrupt); Os valores possveis para interrupt encontram-se enumerados no subcaptulo anterior (3.5.7.1.).

3.5.7.3. interrupts()
Descrio: Instruo que permite voltar a activar o uso de interrupes, depois de esta funcionalidade ter sido desactivada. O uso de interrupts encontra-se por defeito activado. Sintaxe: interrupts(); Exemplo: (1) void setup() { (2) () (3) } (4) void loop(){ (5) noInterrupts(); // Instruo que desactiva o uso de interrupts (6) Instruo 1; (7) (..) (8) interrupts(); // Instruo que activa o uso de interrupts (9) (..) (10) }

3.5.7.4. noInterrupts()
Descrio: Instruo que permite desactivar o uso de interrupes. O uso de interrupts encontra-se por defeito activado. Sintaxe: noInterrupts(); Exemplo: (1) void setup() { (2) ()

ASPOF EN-AEL Pessanha Santos

46

Arduino Introduo e Recursos Avanados (3) } (4) void loop(){ (5) noInterrupts(); // Instruo que desactiva o uso de interrupts (6) Instruo 1; (7) (..) (8) interrupts(); // Instruo que activa o uso de interrupts (9) (..) (10) }

Escola Naval

ASPOF EN-AEL Pessanha Santos

47

Arduino Introduo e Recursos Avanados

Escola Naval

3.5.8.

Comunicao Srie 3.5.8.1. Serial.available()


Descrio: Obtm o nmero de bytes que esto a ser recebidos por srie, podendo assim saber quando esto a ser recebidos dados ou no. Sintaxe: Nmero de bytes a receber (int) = Serial.available(); Exemplo: (1) int leitura_serie=0; //Declarao de uma varivel do tipo integer com o nome leitura_serie, inicializada com o valor 0 (2) void setup() { (3) Serial.begin(9600); // Permite a inicializao da comunicao Srie (4) } (5) void loop(){ (6) if(Serial.available()>0) // Condio if que verifica se esto a ser recebidos dados por Srie (7) leitura_serie=Serial.read(); // Caso se estejam a receber dados por srie, o seu valor guardado na varivel integer leitura_serie (8) } (9) }

3.5.8.2. Serial.begin(int baud rate)


Descrio: Instruo necessria para iniciar a comunicao srie, permitindo definir qual a baud rate da comunica~o. Os valores de velocidade de comunicao mais comuns para comunicao com um computador so: 300, 1200, 2400, 4800, 9600, 14400, 19200, 28800, 38400, 57600 e 115200 (No entanto podem definir-se outros valores). Sintaxe: Serial.begin( int baud rate); Exemplo: (1) int leitura_serie=0; //Declarao de uma varivel do tipo integer com o nome leitura_serie, inicializada com o valor 0 (2) void setup() { (3) Serial.begin(9600); // Permite a inicializao da comunicao Srie (4) } (5) void loop(){ (6) if(Serial.available()>0) // Condio if que verifica se esto a ser recebidos dados por Srie (7) leitura_serie=Serial.read(); // Caso se estejam a receber dados por srie, o seu valor guardado na varivel integer leitura_serie (8) } (9) }

ASPOF EN-AEL Pessanha Santos

48

Arduino Introduo e Recursos Avanados

Escola Naval

3.5.8.3. Serial.read()
Descrio: Permite a leitura dos dados recebidos por srie. Esta funo retorna o valor -1 se no houver dados disponveis. Sintaxe: Valor recebido (int) = Serial.read(); Exemplo: (1) int leitura_serie=0; ; //Declarao de uma varivel do tipo integer com o nome leitura_serie, inicializada com o valor 0 (2) void setup() { (3) Serial.begin(9600); // Permite a inicializao da comunicao Srie (4) } (5) void loop(){ (6) if(Serial.available()>0) ) // Condio if que verifica se esto a ser recebidos dados por Srie (7) leitura_serie=Serial.read(); // Caso se estejam a receber dados por srie, o seu valor guardado na varivel integer leitura_serie (8) } (9) }

3.5.8.4. Serial.flush()
Descrio: Efectua o flush (apaga) de todos os dados presentes no buffer de entrada no momento de execuo da instruo. O buffer de entrada tem uma capacidade de armazenamento de 64 bytes. Sintaxe: Serial.flush(); Exemplo: (1) void setup() { (2) Serial.begin(9600); // Permite a inicializao da comunicao Srie (3) } (4) void loop(){ (5) Serial.flush(); //Apaga o contedo do buffer de entrada (6) () (7) }

ASPOF EN-AEL Pessanha Santos

49

Arduino Introduo e Recursos Avanados

Escola Naval

3.5.8.5. Serial.print() vs Serial.println()


Descrio: Instruo que permite o envio de dados pela porta srie. A nica diferena entre Serial.print e Serial.println() que a segunda instru~o adiciona ao dado enviado o caracter \r (carriage return) e o caracter \n (new line). Sintaxe: Serial.print(dado a enviar); Serial.print(dado a enviar, formato); O formato de envio pode ser decimal (DEC), hexadecimal (HEX), octal (OCT) ou binrio (BIN). O dado a enviar tambm pode tomar o formato de uma string. Exemplo: (1) void setup() { (2) Serial.begin(9600); // Permite a inicializao da comunicao Srie (3) } (4) void loop(){ (5) Serial.flush();//Apaga o contedo do buffer de entrada (6) Serial.println(CADETES AEL); //Envio da string CADETES AEL seguido do caracter \r e \n (7) }

3.5.8.1. Serial.write()
Descrio: Permite enviar dados em binrio pela porta srie. Esses dados podem ser enviados como um nico byte ou um conjunto de bytes. Sintaxe: Serial.write(valor); Serial.write(string); Serial.write(vector, comprimento); A vari|vel valor acima define o valor a ser enviado em bin|rio pela porta srie, o mesmo pode ser efectuado enviando uma string como um conjunto de bytes. Na ltima instruo apresentada acima, enviado um vector (vector) de tamanho comprimento.

ASPOF EN-AEL Pessanha Santos

50

Arduino Introduo e Recursos Avanados

Escola Naval

4.

Recursos Avanados

Este captulo tem como objectivo explorar algumas bibliotecas existentes para a plataforma de desenvolvimento Arduino, possibilitando assim expandir as suas possibilidades. As bibliotecas a ser expostas neste captulo so as mais usadas nos projectos de desenvolvimento, mas no representam a totalidade das bibliotecas existentes. Ser tambm aprofundado neste captulo a tem|tica taxa de amostragem no nosso contexto de estudo, tentando que a sua compreenso se torne maior.

4.1.

Flash

A quantidade de memria SRAM disponvel normalmente muito mais pequena do que a memria flash disponvel e em programas em que necessrio recorrer utilizao de muitas variveis facilmente a memria disponvel se torna uma limitao. Uma soluo bvia, tendo em conta o que foi referido anteriormente, seria gravar o valor de algumas variveis em flash. Mas existe uma limitao, na medida que a gravao de dados na memria flash apenas pode ser efectuada quando o programa se encontra a ser carregado (durante o uploading) para a memria flash. O que leva a que apenas os valores de variveis constantes devam ser armazenados na memria flash, sendo utilizadas s quando necessrio (no se encontrando j a ocupar espao em SRAM). Para utilizar esta funcionalidade vais ser utilizada a biblioteca <Flash.h>, devendo a mesma ser declarada no nosso sketch, esta biblioteca no se encontra disponvel no software de desenvolvimento devendo o seu download ser efectuado do site Arduiniana (http://arduiniana.org/libraries/flash/). Esta biblioteca baseia-se na biblioteca <avr/progmen.h>, tentado simplificar assim o seu uso.

4.1.1. Sintaxe a Utilizar para Guardar Dados em Flash


FLASH_STRING(Nome da string, String a guardar); FLASH_ARRAY(Tipo de varivel a ser guardada, Nome do vector, Valores a colocar no vector); FLASH_TABLE(Tipo de variveis a guardar na tabela, nome da tabela, nmero de colunas, valores a armazenar na tabela); FLASH_STRING_ARRAY(Nome do vector de strings, PSTR(string a armazenar), PSTR(String a armazenar 2), PSTR()); Qualquer dvida em relao ao tipo de variveis possveis de utilizar, pode consultar o subcaptulo - Tipos de variveis disponveis (P|gina 23 26). Nota: A biblioteca <Flash.h> baseada na biblioteca <avr/progmen.h>, como esta no suporta a criao de um vector de strings, o que esta biblioteca faz criar um vector com os endereos guardados em SRAM de strings individuais guardadas em Flash. Isto faz com que o uso desta instruo ocupe 2 bytes por cada string armazenada.

4.1.2. Sintaxe a Utilizar para Ler Dados da Memria Flash


Nome usado (String, vector,tabela, vector de strings)[indice]; O acesso aos dados guardados em Flash em tudo semelhante utilizao de vectores (arrays). O que um dos pontos fortes da utilizao desta biblioteca.

ASPOF EN-AEL Pessanha Santos

51

Arduino Introduo e Recursos Avanados

Escola Naval

Existe mais sintaxe possvel por parte desta biblioteca, mas sem dvida foi aqui apresentado o mais importante (Guardar e ler). Para mais informaes pode ser consultado o site oficial desta biblioteca, j referido anteriormente.

4.2.

EEPROM

O microcontrolador disponvel na placa de desenvolvimento Arduino Duemilinove (ATMega168) possui 512 bytes de memria EEPROM, segundo o datasheet do respectivo microcontrolador. Este tipo de memria tem a vantagem de manter a sua informao armazenada, mesmo aps desligarmos a sua alimentao, visto que pode ser de grande importncia conseguir manter certos dados, dependo da aplicao a implementar. Uma outra vantagem a possibilidade de guardar contedo nesta memria enquanto executamos o nosso sketch, o que no acontece com o armazenamento em flash. Esta biblioteca j se encontra disponvel no Software de desenvolvimento Arduino, no necessitando de ser adicionada. A principal limitao da memria EEPROM est na existncia de um limite de ciclos de leitura/escrita. O que pode ser uma limitao a curto prazo em aplicaes que recorram muito a este tipo de armazenamento (este tipo de informao encontra-se discriminada no datasheet do microcontrolador). O tempo de escrita num ATMega168 de 3.3 ms (informao retirada do seu datasheet).

4.2.1. Sintaxe de Escrita em EEPROM


EEPROM.write(Endereo, Valor a guardar); Com Endereo(int) 0,511 e Valor a guardar(byte) 0,255 .

4.2.2. Sintaxe de Leitura em EEPROM


EEPROM.read(Endereo); Esta instruo, e colocando em Endereo o mesmo valor que na instru~o EEPROM.write, permite obter o valor guardado em memria. Exemplo: (1) #include<EEPROM.h> //Declarao da biblioteca <EEPROM.h> (2)(..) (3) EEPROM.write(1,1); // Escrita no endereo 1 do valor inteiro 1 (4) void setup(){ (5) Instruo 1; (6) (..) (7) } (8) void loop(){ (9) int i=0; //Declarao de uma varivel do tipo integer de nome i, inicializada com o valor 0 (10) i = EEPROM.read(1); //Feita a leitura do endereo 1 e guardado o seu contedo na varivel de nome i (11) (..) (12) } ASPOF EN-AEL Pessanha Santos 52

Arduino Introduo e Recursos Avanados

Escola Naval

4.3.

Servomotor

Um servomotor um pequeno dispositivo cujo veio pode ser posicionado numa determinada posio angular de acordo com um sinal de entrada. Enquanto esse sinal se mantiver constante e for enviado para o servomotor, o servo ir manter a sua posio angular. Ao variar o sinal de entrada possibilita uma variao a posio angular do veio. Os servomotores so muito usados no controlo de avies telecomandados, robots, barcos telecomandados, helicpteros telecomandados, entre outras possveis aplicaes.

Fig. 19 Representao de um servomotor Fonte: Obtido a partir do Software open source Fritzing

Um servomotor, como se pode ver na figura 19, possui trs entradas. Uma entrada a alimentao (normalmente 5V para servomotores standard), outra ser a massa e a ltima que falta referir ser o sinal de entrada. Este sinal de entrada ser um impulso PWM, em que fazendo variar o seu duty cicle, podemos variar a posio angular do servomotor. Isto em servomotores de posio, pois tambm existem servomotores de rotao contnua. Nesses servomotores a varia~o do duty cicle far| variar n~o a posi~o angular, mas a velocidade e sentido de rotao do servomotor. Existe possibilidade de modificar, sem grande dificuldade, um servomotor de posio para rotao contnua. Esta modificao permanente, no podendo ser reversvel. No entanto, o objectivo deste subcaptulo no se centra nisso, mas sim em como fazer a sua interaco com a plataforma de desenvolvimento Arduino.

Fig. 20 Representao de um servomotor de posio mais pormenorizada Fonte: Retirado de Santos 2007, pg. 3

ASPOF EN-AEL Pessanha Santos

53

Arduino Introduo e Recursos Avanados

Escola Naval

Pela anlise da figura 20, podemos constatar os componentes mais importantes de um servomotor de posio so os seguintes: Circuito de controlo (Control Circuit) Potencimetro (Potentiometer) Motor DC (Motor)

O circuito de controlo, como o prprio nome indica, responsvel por controlar e mover o motor DC, com base nas informaes obtidas pela leitura do potencimetro e do sinal de entrada. O potencimetro, neste contexto, utilizado acoplado ao eixo de rotao para conseguir obter a posio angular do eixo. A enorme aplicabilidade dos servomotores leva a que, tendo em conta o universo da electrnica, seja uma temtica obrigatria. Dessa necessidade surge a criao de uma biblioteca especfica para facilitar a operao com servomotores, que at j se encontra disponvel no Software de desenvolvimento Arduino. A biblioteca Servo.h utiliza os pinos 9 e 10 para fazer o controlo dos respectivos servomotores, ao utilizar esta biblioteca (ao associar um servomotor a umas das duas sadas) no poder utilizar os pinos 9 e 10 para outras aplicaes. De seguida, vai ser explorada a sintaxe possvel para o facilitar o uso desta biblioteca.

4.3.1. Sintaxe das Instrues da Biblioteca <Servo.h> 4.3.1.1. attach()


Descrio: Permite atribuir a um pino (pinos disponveis 9 ou 10), uma varivel do tipo Servo. A atribuio de uma varivel deste tipo vai ser necessria para controlar o respectivo servomotor. Sintaxe: Servo.attach(Pino); Servo.attach(Pino, Valor do ngulo mnimo, Valor do ngulo mximo); Servo Vari|vel do tipo Servo pode ser declarada da seguinte forma: Servo nome_a_atribuir; Podendo atribuir qualquer nome escolha, o exemplo abaixo esclarecedor em relao a esta questo. Valor do }ngulo mnimo Permite definir qual a largura mnima do impulso a utilizar, em microsegundos, que vai corresponder ao ngulo mnimo (0). Valor do }ngulo m|ximo Permite definir qual a largura mxima do impulso a utilizar, em microsegundos, que vai corresponder ao ngulo mximo (180). Exemplo: (1) #include<Servo.h> // Declarao da biblioteca <Servo.h> (2) Servo Exemplo; // Criao de uma varivel do tipo Servo, com o nome de Exemplo (3) void setup(){ (4) Exemplo.attach(10); //Atribuio da varivel do tipo Servo Exemplo, ao pino digital 10 (5) (..) ASPOF EN-AEL Pessanha Santos 54

Arduino Introduo e Recursos Avanados (6) void loop(){ (7) (..) (8) }

Escola Naval

4.3.1.2. detach()
Descrio: Permite eliminar a liga~o entre uma vari|vel do Servo a um dos pinos possveis de utilizar pela biblioteca <Servo.h> (Pinos 9 e 10). Se nenhum dos pinos possveis estiver atribudo a uma vari|vel do tipo Servo, os pinos 9 e 10 podem ser utilizados normalmente. Sintaxe: Servo.detach(); Servo Varivel do tipo Servo pode ser declarada da seguinte forma: Servo nome_a_atribuir;

Exemplo: (1) #include<Servo.h> // Declarao da biblioteca <Servo.h> (2) Servo Exemplo; // Criao de uma varivel do tipo Servo, com o nome de Exemplo (3) void setup(){ (4) Exemplo.attach(10); // Atribuio da varivel do tipo Servo Exemplo, ao pino digital 10 (5) (..) (6) void loop(){ (7) Exemplo.detach(); // Elimina a ligao entre a varivel do tipo Servo Exemploe pino digital 10 (8) analogWrite(10, 255); // Como nenhuma varivel do tipo Servo se encontra atribuda, podem-se usar as funcionalidades PWM dos pinos 9 e 10 (9) }

4.3.1.3. write()
Descrio: Permite movimentar o eixo de um servomotor de posio para o ngulo pretendido. No caso de um servomotor de rotao contnua o valor 0 corresponder velocidade de rotao mxima num sentido, o valor 180 a velocidade de rotao mxima noutro sentido e o valor 90 ser o ponto em que o servomotor se encontrar parado. Sintaxe: Servo.write(ngulo); Servo Vari|vel do tipo Servo pode ser declarada da seguinte forma: Servo nome_a_atribuir; ngulo 0,180 Exemplo: (1) #include<Servo.h> // Declarao da biblioteca <Servo.h> (2) Servo Exemplo; // Criao de uma varivel do tipo Servo, com o nome de Exemplo ASPOF EN-AEL Pessanha Santos 55

Arduino Introduo e Recursos Avanados

Escola Naval

(3) Servo Exemplo_2; // Criao de uma varivel do tipo Servo, com o nome de Exemplo_2 (4) void setup(){ (5) Exemplo.attach(10); // Atribuio da varivel do tipo Servo Exemplo, ao pino digital 10 (6) Exemplo_2.attach(9); // Atribuio da varivel do tipo Servo Exemplo_2, ao pino digital 9 (7) (..) (8) void loop(){ (9) Exemplo.write(0); // Faz com que um servomotor p.ex. de posio se movimente para a posio correspondente ao ngulo 0 (1) Exemplo_2.write(90); // Faz com que um servomotor p.ex. de rotao contnua pare a sua rotao (11) }

4.3.1.4. read()
Descrio: Instruo que retorna o valor do ltimo ngulo utilizado, recorrendo instru~o Servo.write(ngulo). Sintaxe: ngulo (int) = Servo.read(); Servo Varivel do tipo Servo pode ser declarada da seguinte forma: Servo nome_a_atribuir; Exemplo: (1) #include<Servo.h> // Declarao da biblioteca <Servo.h> (2) int angulo = 0; // Declarao de uma varivel do tipo integer de nome angulo, atribuindo-lhe o valor de 0 (3) Servo Exemplo; // Criao de uma varivel do tipo Servo, com o nome de Exemplo (4) void setup(){ (5) Exemplo.attach(10); // Atribuio da varivel do tipo Servo Exemplo, ao pino digital 10 (6) (..) (7) void loop(){ (8) Exemplo.write(angulo); // Faz com que um servomotor p.ex. de posio se movimente para a posio correspondente ao valor da varivel angulo (9) angulo = (Exemplo.read() + 1); // Vai incrementado uma unidade ao ltimo valor de ngulo utilizado recorrendo instruo Exemplo.write(angulo) (10) }

4.3.1.5. attached()
Descrio: Instru~o que permite verificar se uma vari|vel do tipo Servo se encontra atribuda a um pino especfico. Sintaxe: Estado (int) = Servo.attached(); Servo Vari|vel do tipo Servo pode ser declarada da seguinte forma:

ASPOF EN-AEL Pessanha Santos

56

Arduino Introduo e Recursos Avanados Servo nome_a_atribuir;

Escola Naval

Estado 0,1 , ou seja, s pode tomar o valor true (valor 1) ou false (valor 0). Exemplo: (1) #include<Servo.h> // Declarao da biblioteca <Servo.h> (2) int atribuido=0; // Declarao de uma varivel do tipo integer de nome atribuido, atribuindo-lhe o valor de 0 (3) Servo Exemplo; // Criao de uma varivel do tipo Servo, com o nome de Exemplo (4) void setup(){ (5) Exemplo.attach(10); // Atribuio da varivel do tipo Servo Exemplo, ao pino digital 10 (6) (..) (7) void loop(){ (8) atribuido = Exemplo.attached(); // Atribui o valor 1 varivel atribudo caso a varivel do tipo Servo Exemplo se encontra associada a algum pino, caso contrrio retorna o valor 0 (9) if (atribuido ==1){ //Se a varivel estiver do tipo Servo Exemplo estiver atribuda a condio verificada (10) Exemplo.write(180); // Faz com que um servomotor p.ex. de posio se movimente para a posio correspondente ao valor 180 (11) } (12) (..) (13) } O uso desta biblioteca simplifica a operao com servomotores, o que no implica que a movimentao dos servomotores no seja feita com recurso directamente instruo analogWrite(), ou seja, gerar os sinais PWM directamente. Tal , obviamente, possvel mas mais trabalhoso, existindo esta biblioteca para simplificar esse trabalho de implementao. Com este subcaptulo espera-se dar noes bsicas de funcionamento e uso de servomotores, estando a partir daqui apenas dependente da criatividade de cada um na implementao e aprofundamento do conhecimento sobre esta temtica.

ASPOF EN-AEL Pessanha Santos

57

Arduino Introduo e Recursos Avanados

Escola Naval

4.4.

Software Serial

A necessidade de utilizao de outros pinos para efectuar a Tx e a Rx que no os pinos digitais 0 e 1,levou criao desta biblioteca. Atravs do uso desta biblioteca existe um expandir das capacidades do Arduino em termos de possibilidades de comunicao, podendo assim comunicar e receber em mais que um pino. A comunica~o standard, por assim dizer, efectua a sua comunicao atravs de uma pea de Hardware denominada UART (universal asynchronous receiver/transmitter). Esta pea permite implementar uma comunicao srie assncrona.

Fig. 21 Representao de uma comunicao srie assncrona Fonte: Retirado de Igoe 2007 pg. 51

Fig. 22 Representao de uma comunicao srie sncrona Fonte: Retirado de Igoe 2007, pg. 51

ASPOF EN-AEL Pessanha Santos

58

Arduino Introduo e Recursos Avanados

Escola Naval

As formas de comunicao srie assncrona e sncrona (Fig. 19 e 20, respectivamente), s~o bastante distintas. A comunica~o sncrona necessita de uma Master e de um Slave, em que o Master que estabelece a velocidade de transmiss~o e vai regulando o fluxo dos dados. Na comunica~o assncrona apenas existe um Sender e um Receiver, sem haver um controlo de fluxo da comunicao por alguma das partes. A bilbioteca <SoftwareSerial.h> permite simular por Software (da o nome) uma comunicao srie assncrona. A no utilizao de uma pea de Hardware para efectuar a comunica~o, face aos pinos standard de comunica~o, faz com que n~o se tenha a capacidade de ter um buffer de entrada (64 bytes de buffer de entrada utilizando UART). Ou seja, todos os dados que forem enviados para pinos de Rx configurados por Software, e se no se encontrarem a ser lidos, ser~o perdidos.

4.4.1. Sintaxe das Instrues da Biblioteca <SoftwareSerial.h> 4.4.1.1. SoftwareSerial(Pino de Rx, Pino de Tx)
Descrio: Permite a cria~o de uma vari|vel do tipo SoftwareSerial, conseguindo definir o respectivo pino de Tx e Rx. Sintaxe: SoftwareSerial Nome_varivel = SoftwareSerial(Pino de Rx, Pino de Tx); Nota: importante ter em conta que os pinos definidos anteriormente para Rx e Tx devem ser declarados na fun~o void setup() como INPUT e OUTPUT respectivamente.

4.4.1.2. begin(Baud Rate)


Descrio: Possibilita definir qual a baud rate a utilizar para a respectiva comunicao srie assncrona, devendo o valor da baud rate situar-se abaixo de 9600. Pois valores superiores a este, no obtm boa performance na comunicao recorrendo a este mtodo de comunicao. Sintaxe: SoftwareSerial.begin(Baud Rate); SoftwareSerial Vari|vel do tipo SoftwareSerial, sendo definida da seguinte forma: SoftwareSerial Nome_varivel = SoftwareSerial(Pino de Rx, Pino de Tx); Tomando depois a seguinte sintaxe: Nome_varivel.begin(Baud Rate); Exemplo: (1) #include<SoftwareSerial.h> // Declarao da biblioteca <SoftwareSerial.h> (2) SoftwareSerial Exemplo = SoftwareSerial(4,5); // Declarao de uma varivel do tipo SoftwareSerial de nome Exemplo, atribuindo-lhe o pino de Rx 4 e o pino de Tx 5 (3) void setup(){ (4) pinMode(4, INPUT); // Define o pino 4 como INPUT (5) pinMode(5, OUTPUT); // Define o pino 5 como OUTPUT

ASPOF EN-AEL Pessanha Santos

59

Arduino Introduo e Recursos Avanados

Escola Naval

(6) Exemplo.begin(9600); // Define a velocidade de comunicao com uma Baud rate de 9600 (7) void loop(){ (8) () (9) }

4.4.1.3. read()
Descrio: Instruo que possibilita a leitura de um caracter proveniente do pino definido como Rx. A instru~o SoftwareSerial.read() espera que chegue um caracter e retorna o seu valor, sendo preciso ter em ateno que os dados que cheguam sem haver uma leituraa aguardar ser~o perdidos (n~o existncia de buffer de recepo). Sintaxe: Valor Leitura (int/char) = SoftwareSerial.read(); SoftwareSerial Vari|vel do tipo SoftwareSerial, sendo definida da seguinte forma: SoftwareSerial Nome_varivel = SoftwareSerial(Pino de Rx, Pino de Tx); Tomando depois a seguinte sintaxe: Valor Leitura (int/char) = Nome_varivel.read(); Exemplo: (1) #include<SoftwareSerial.h> // Declarao da biblioteca <SoftwareSerial.h> (2) SoftwareSerial Exemplo = SoftwareSerial(4,5); // Declarao de uma varivel do tipo SoftwareSerial de nome Exemplo, atribuindo-lhe o pino de Rx 4 e o pino de Tx 5 (3) char recebido; //Declarao de uma varivel do tipo char de nome recebido (4) void setup(){ (5) pinMode(4, INPUT); // Define o pino 4 como INPUT (6) pinMode(5, IOUTPUT); // Define o pino 5 como OUTPUT (7) Exemplo.begin(9600); // Define a velocidade de comunicao com uma Baud rate de 9600 (8) void loop(){ (9) recebido = Exemplo.read(); //Possibilita guardar um valor recebido no pino de Rx, na varivel do tipo char recebido (10) }

4.4.1.4. print(dados) vs println(dados)


Descrio: A instru~o SoftwareSerial.print() tem um comportamento semelhante { instru~o Serial.print(). E, fazendo a mesma analogia, podemos afirmar que a instru~o SoftwareSerial.println() apresenta um comportamento semelhante { instru~o Serial.println(). Qualquer dvida em qual o tipo de comportamento das instrues da comunica~o srie standard, est~o disponveis informaes no subcaptulo 3.5.8 (pgina 44 46). Sintaxe: SoftwareSerial.print(dado a enviar);

ASPOF EN-AEL Pessanha Santos

60

Arduino Introduo e Recursos Avanados SoftwareSerial.println(dado a enviar);

Escola Naval

SoftwareSerial Vari|vel do tipo SoftwareSerial, sendo definida da seguinte forma: SoftwareSerial Nome_varivel = SoftwareSerial(Pino de Rx, Pino de Tx); Tomando depois a seguinte sintaxe: Nome_varivel. print(dado a enviar); Nome_varivel. println(dado a enviar); Exemplo: (1) #include<SoftwareSerial.h> // Declarao da biblioteca <SoftwareSerial.h> (2) SoftwareSerial Exemplo = SoftwareSerial(4,5); // Declarao de uma varivel do tipo SoftwareSerial de nome Exemplo, atribuindo-lhe o pino de Rx 4 e o pino de Tx 5 (3) char recebido; //Declarao de uma varivel do tipo char de nome recebido (4) void setup(){ (5) pinMode(4, INPUT); // Define o pino 4 como INPUT (6) pinMode(5, IOUTPUT); // Define o pino 5 como OUTPUT (7) Exemplo.begin(9600); // Define a velocidade de comunicao com uma Baud rate de 9600 (8) void loop(){ (9) recebido = Exemplo.read(); //Possibilita guardar um valor recebido no pino de Rx, na varivel do tipo char recebido (10) Exemplo.print(recebido); // Envia a varivel do tipo char de nome recebido, atravs do pino definido com Tx (pino 5) (11) }

ASPOF EN-AEL Pessanha Santos

61

Arduino Introduo e Recursos Avanados

Escola Naval

4.5.

FIRMATA vs Processing

No objectivo deste tutorial abordar a sintaxe utilizada pela biblioteca FIRMATA, mas sim dar a conhecer a sua existncia. Esta biblioteca foi elaborada de forma a criar um protocolo genrico de comunicao entre o Arduino e um Software no especfico para essa aplicao, bastando que o Software tenha capacidade de comunicao por porta srie, desde que isso acontea possvel haver um controlo por parte de Software do Arduino. A distribuio padro do sketch elaborado utilizando esta biblioteca toma o nome de standard Firmata, podendo este ser completamente adaptado para a aplica~o especfica de cada utilizador. Uma implementao muito procurada por artistas e designers a implementao do Arduino com o Software open source Processing. Este Software permite uma programao visual, ou seja, permite atravs de instrues de programao fazer objectos visuais (p.ex. quadrados, crculos, linhas, entre outros). Permitindo, assim, desenhar o que se pretende, bem como criar verdadeiras obras de arte. De acordo com Shiffman, 2008, este software foi desenvolvido por Benjamin Fry e Casey Reas, enquanto alunos no MIT Media Lab em 2001. Em Shiffman, 2008, o Software de desenvolvimento Processing apenas abordado como uma ferramenta de ensino de programao, ou seja, o principal foco no o Software em si mas os conceitos computacionais por detrs dele. O que leva a que seja uma leitura aconselhada para quem quer saber mais, no s sobre o Software em si, mas sobre a linguagem de programao java. Visto o Processing ser baseado na linguagem java, uma linguagem de programa~o largamente difundida e utilizada. O Processing pode ser obtido gratuitamente atravs do seu site oficial (www.processing.org), na seco downloads. Esto disponveis verses para Windows, Linux e Macintosh OS. A interac~o entre o Processing e o Arduino pode ser facilmente apreendida recorrendo ao separador Playground, do site oficial Arduino (www.arduino.cc). Este subcaptulo no refere obviamente a tudo o que h a saber sobre esta temtica sendo o seu principal objectivo, como foi referido anteriormente, dar a conhecer novas possibilidades de implementao utilizando o Arduino.

Fig. 23 Representa~o possvel de um Hello World utilizando o Processing Fonte: Retirado de Shiffman 2008, pg. 10

Fig. 24 Alguns exemplos criados utilizando o Processing

ASPOF EN-AEL Pessanha Santos

62

Arduino Introduo e Recursos Avanados

Escola Naval

4.6.

Aquisio de Sinal Converso A/D 4.6.1. Alguns Conceitos Tericos

Ao considerar um sinal discreto estamos, na maioria das vezes, a considerar um sinal contnuo no tempo que foi amostrado com uma determinada taxa de amostragem. Para efectuar a amostragem de um sinal analgico para uma sequncia digital, recorrese a um conversor A/D (ADC Analog-to-digital converter). Os constituintes de um conversor A/D so os seguintes: () 1 C/D () 2 Quantizer () 3 Encoder ()

Fig. 25 Constituintes de um conversor A/D Fonte: Adaptado de Hayes 1999, pg. 101

No bloco 1 da Fig. 25, normalmente chamado de Sampler, permitida a converso de um sinal analgico Xa(t) - para uma sequncia discreta X(n). Esta sequncia discreta criada ao guardar os valore de Xa(t) em intervalos de tempo constantes Ts. () = (. ) com + No bloco 2 efectuada uma quantificao dos valores de amplitude obtidos pelo Sampler, ou seja, como as amostras X(n) tm mltiplos valores possveis de amplitude necessrio atribuir valores de amplitude tambm discretos. Estes valores discretos de amplitude esto divididos em intervalos (). Quantos mais intervalos de quantizao houver e maior nmero de bits, mais preciso vou obter em relao ao valor real. No 3 e ltimo bloco atribuda a respectiva sequncia binria, para cada valor amostrado e quantificado, obtendo aqui os nossos valores digitais para a sequncia de entrada analgica. Para escolhermos a taxa de amostragem a utilizar em cada situao, de forma a ter uma representao discreta fivel do sinal original, temos de ter em conta o Teorema de Nyquist (Teorema da amostragem). Este teorema pode ser basicamente enumerado pela seguinte condio: 2

Ao respeitarmos este teorema esto garantidas as condies para no ocorrer aliasing e o sinal original poder ser reconstrudo a partir da sua amostra, recorrendo a um simples filtro passa baixo (Hayes 1999). referido como aliasing a distoro causada por uma taxa de amostragem insuficiente (Vasegui 2006).

Fig. 26 Exemplo de aliasing

ASPOF EN-AEL Pessanha Santos

63

Arduino Introduo e Recursos Avanados

Escola Naval

Na figura 26, podemos ter um exemplo do que acontece quando o teorema da amostragem no respeitado. O sinal a vermelho (sinal que se pretende amostrar) amostrado como uma frequncia de amostragem inferior frequncia mnima necessria para a reconstruo do sinal original ( 2 ). Sendo o resultado dessa amostragem a onda a azul, que no retrata claramente o sinal original (existncia clara de aliasing).

4.6.2. Arduino vs ADC


Aps uma breve introduo de alguns dos conceitos associados a esta temtica, tornase agora importante abordar o nosso caso concreto (Uso do Arduino). Os microcontroladores utilizados at ao momento, nos modelos disponveis da plataforma de desenvolvimento Arduino, possuem conversores A/D com 10 bits de resoluo (informao retirada do datasheet dos respectivos microcontroladores), ou seja, uma entrada analgica cujo valor varia entre 0 V e 5 V, ter a sua correspondncia em binrio a valores entre 0 (0000000000) e 1023 (1111111111) respectivamente. O que nos leva a resolues, como foi referido no subcaptulo 2.1.4., na ordem dos 5 mV. Segundo informao disponvel no datasheet dos respectivos microcontroladores, a primeira converso A/D demora 25 ciclos de Clock enquanto as restantes demoram 13. Esta diferena acontece pois a primeira converso A/D precisa de efectuar a inicializao do ADC. Analisando o referido anteriormente, e considerando um Clock de 1 MHz podemos facilmente podemos concluir o seguinte (Ignorando a converso inicial): 106 77000 13 Ou seja, estamos perante uma taxa de 77 kHz. Analisando a taxa de amostragem obtida, e tendo em conta o referido no subcaptulo anterior, a frequncia mxima do sinal a amostrar deve ser menor que 38.5 kHz, de forma a respeitar o Teorema da Amostragem. = O Arduino possui um Clock de sistema de 16 MHz, mas no entanto no este o Clock de entrada que vamos obter no nosso conversor A/D. O Clock de sistema dividido por um factor de divis~o (Prescaler), sendo este sim o Clock que vamos obter no nosso ADC como podemos constatar pela figura seguinte:

Fig. 27 ADC Prescaler Fonte: Retirado do datasheet do microcontrolador ATMega168

ASPOF EN-AEL Pessanha Santos

64

Arduino Introduo e Recursos Avanados

Escola Naval

Mas no entanto existe uma forma de configurar este factor de divis~o, fazendo variar o contedo do bit ADPS0, ADPS1 e ADPS2 (Como se pode constatar pela anlise da figura 27). Estes bits so parte integrante do registo ADCSRA, que constitudo da seguinte forma:
Bit (0x7A) Read/Write Valor Inicial 7 ADEN R/W 0 6 ADSC R/W 0 5 ADATE R/W 0 4 ADIF R/W 0 3 ADIE R/W 0 2 ADPS2 R/W 0 1 ADPS1 R/W 0 0 ADPS0 R/W 0

Tabela 6 Contedo do registo ADCSRA Fonte: Retirado do datasheet do microcontrolador ATMega168

As combinaes possveis, para os bits referidos anteriormente, podem ser resumidas pela tabela seguinte:
ADPS2 0 0 0 0 1 1 1 1 ADPS1 0 0 1 1 0 0 1 1 ADPS0 0 1 0 1 0 1 0 1 Factor de diviso 2 2 4 8 16 32 64 128

Tabela 7 Contedo do registo ADCSRA Fonte: Retirado do datasheet do microcontrolador ATMega168

Ou seja, o Clock de entrada do conversor A/D obtido atravs da seguinte condio:

(16 ) ()

Da equao anterior podemos retirar facilmente, e apenas efectuando o clculo acima referido para cada condio, as seguintes concluses:
Factor de diviso 2 4 8 16 32 64 128 Clock de entrada no ADC (MHz) 8 4 2 1 0.5 0.25 0.125

Tabela 8 Valores possveis de Clock de entrada no ADC

Pela anlise da tabela anterior, podemos afirmar ento que a maior frequncia de amostragem que poderemos obter se situa nos 8 MHz. O que leva a que a que para haver uma reconstruo sem perda de informao de um possvel sinal amostrado, o mesmo dever ter uma frequncia mxima de 4 MHz. No entanto os valores apresentados na tabela 8 so

ASPOF EN-AEL Pessanha Santos

65

Arduino Introduo e Recursos Avanados

Escola Naval

apenas tericos, correspondendo os valores reais a valores bastante inferiores aos apresentados.

4.6.3. Sintaxe para Alterar o Valor do Factor de Diviso


Depois do abordado, anteriormente, resta referir a forma de o fazer, indicando a sintaxe a utilizar para alterar os registos referidos anteriormente. A sintaxe utilizada no serve especificamente para alterar o contedo do registo ADCSRA, podendo a mesma sintaxe ser utilizada para alterar o contedo de outros registos com as respectivas adaptaes claro. Os registos disponveis, e o seu contedo e funo, encontram-se disponveis no datasheet do respectivo microcontrolador. De seguida vai ser descrito quais as instrues a utilizar, dando um exemplo de implementao: Cdigo a utilizar: (1) #ifndef cbi (2) #define cbi(sfr, bit) (_SFR_BYTE(sfr) &= ~_BV(bit)) (3) #endif (4) #ifndef sbi (5) #define sbi(sfr, bit) (_SFR_BYTE(sfr) |= _BV(bit)) (6) #endif (7) void setup(void) { (8) Serial.begin(9600); ); // Inicializa o envio por Srie, e define a Baud Rate (9) sbi(ADCSRA, ADPS2); // Neste caso concreto o bit ADPS2 ser definido com o valor 1 (10) cbi(ADCSRA, ADPS1); // Neste caso concreto o bit ADPS1 ser definido com o valor 0 (11) cbi(ADCSRA, ADPS0); // Neste caso concreto o bit ADPS0 ser definido com o valor 0 (12) } (13) int a,b,c; (14) void loop(){ (15) b = micros();); // Atribui varivel b o tempo actual de execuo do programa actual (16) a = analogRead(0); (17) c = micros(); // Atribui varivel c o tempo actual de execuo do programa actual (18) Serial.print(c-b); // Envia (srie) o valor necessrio para executar a instruo analogRead (converso A/D) (19) } Sintaxe utilizada: sbi(Nome do registo, Nome do bit); // Define o bit Nome do bit situado no registo Nome do registo a 1 (set bit) cbi(Nome do registo, Nome do bit); // Define o bit Nome do bit situado no registo Nome do registo a 0 (clear bit)

ASPOF EN-AEL Pessanha Santos

66

Arduino Introduo e Recursos Avanados

Escola Naval

O cdigo acima apresentado est elaborado de forma a, medir na realidade qual o tempo gasto a efectuar uma converso A/D. Os valores obtidos por medidas experimentais, fazendo a mdia de 1000 amostras de tempo gasto na converso A/D (Valores obtidos por comunicao srie efectuando a aquisio e clculo com o Software MatLab). Os resultados obtidos foram os seguintes:
Factor de diviso 128 64 32 16 8 4 2 Taxa de amostragem () 8 16 31 50 63 83 125

Tabela 9 Valore obtidos na converso A/D

O que corresponde, como foi referido anteriormente, a taxas de amostragem bastante inferiores s teoricamente esperadas. Espera-se com este subcaptulo dedicado converso A/D, dar a entender a enorme importncia desta temtica. Pois a aquisio de sinal e respectivo processamento tm sido assunto de grande estudo. Espera-se assim ter aberto os horizontes a esta temtica.

ASPOF EN-AEL Pessanha Santos

67

Arduino Introduo e Recursos Avanados

Escola Naval

5.

Concluso

Espera-se com este tutorial abrir as portas para um entendimento mais aprofundado desta plataforma de desenvolvimento. No correspondendo este documento a tudo o que existe para aprender e desenvolver sobre este tema. Muitos assuntos ficaram por abordar e caber ao leitor caso tenha manifesto interesse (confunde-se muitas vezes com necessidade), pesquisar e desenvolver uma temtica especfica. A placa de desenvolvimento Arduino encontra-se em franca expanso, estando a sua utilizao generalizada quer na rea da electrnica, artes e muitas mais. O que leva a que esta plataforma tenha muitos seguidores e estando a crescer e a desenvolver-se a cada minuto que passa. O que agora uma novidade de implementao, muito provavelmente quando estiver a ler este tutorial ser uma coisa comum. Pois o Arduino est a conquistar o seu espao, e j uma referncia. Quem diria que um projecto acadmico chegaria to longe, provavelmente ningum diria. O que faz com que as pessoas que acreditaram, estejam desde j de parabns pelo magnfico trabalho. Deste exemplo real s podemos retirar que a persistncia e dedicao so o que nos leva mais longe, pois os criadores desta plataforma de desenvolvimento no so os melhores. Mas sim os que acreditaram e trabalharam para isso, o que se revela sempre muito importante. O que preciso ter uma atitude de contnua procura pelo conhecimento.

Pois o saber no ocupa espao de memria

ASPOF EN-AEL Pessanha Santos

68

Arduino Introduo e Recursos Avanados

Escola Naval

6.

Bibliografia

Arduiniana. (2009). "Arduino software jewellry and wisdom." Retrieved 4 August 2009, 2009, from http://arduiniana.org/. Arduino. (2006, 14 July http://www.arduino.cc. 2009). Retrieved 21 July 2009, 2009, from

Arroz, G., J. Monteiro, et al. (2007). Arquitectura de Computadores dos Sistemas Digitais aos Microprocessadores. Lisboa, IST Press. AVR. (2009). "pgmspace reference." Retrieved 31 July 2009, 2009, from http://www.nongnu.org/avr-libc/user-manual/group__avr__pgmspace.html.

Hayes, M. H. (1999). Schaums Outline of Theory and Problems of Digital Signal Processing. Washington DC, USA, McGraw-Hill. Igoe, T. (2007). Making Things Talk. Sebastopol, USA, OREILLY. Santos, A. (2007). "Servomotores." Retrieved 31 July 2009, http://www.esen.pt/on/file.php/45/Cerqueira/Servo_Motor.pdf. 2009, from

Santos, N. P. (2008) "Introduo ao Arduino." Revista PROGRAMAR, 39-44. Santos, N. P. (2009) "Arduino e a Aquisio de dados." Revista PROGRAMAR, 24-26. Shiffman, D. (2008). Learning Processing - A beginners Guide to Programming Images, Animation, and Interaction. Burlington, USA, Morgan Kaufmann. Sousa, D. J. d. S. and N. C. Lavinia (2006). Conectando o PIC 16F877A Recursos Avanados. So Paulo, Brazil. Tecnology, M. (1992). Advanced RISC Computing Specification. California, USA, MIPS Technology. Vasegui, S. V. (2006). Advanced Signal Processing and Noise Reduction. Wiltshire, England, Wiley.

ASPOF EN-AEL Pessanha Santos

69

Você também pode gostar