Sei sulla pagina 1di 69

Arduino Introduo e Recursos Avanados Escola Naval

ASPOF EN-AEL Pessanha Santos 1


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








Arduino Introduo e Recursos Avanados Escola Naval
ASPOF EN-AEL Pessanha Santos 2



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













Arduino Introduo e Recursos Avanados Escola Naval
ASPOF EN-AEL Pessanha Santos 3
ndice

1. Introduo ............................................................................................................................ 7
2. Hardware vs Software ......................................................................................................... 8
2.1. Hardware ...................................................................................................................... 8
2.1.1. Microprocessador ................................................................................................ 9
2.1.2. Microcontrolador ................................................................................................. 9
2.1.3. Tipos e Quantidades de Memria Disponveis ................................................ 11
2.1.4. Pinout Disponvel ............................................................................................... 12
2.2. Software ..................................................................................................................... 15
2.2.1. Instalao e Utilizao ...................................................................................... 15
2.2.2. Ciclo de Desenvolvimento ................................................................................ 17
2.2.3. Interaco do Arduino com outro Software .................................................... 18
3. ndice de Instrues ........................................................................................................... 18
3.1. Funes Base ............................................................................................................. 19
3.1.1 void setup()......................................................................................................... 19
3.1.2 void loop()........................................................................................................... 19
3.1.3. Resumindo ......................................................................................................... 20
3.2. Ciclos ........................................................................................................................... 21
3.2.1 Ciclo If.else .................................................................................................. 21
3.2.2 Ciclo for ............................................................................................................... 22
3.2.3 Ciclo switch / case .............................................................................................. 23
3.2.4 Ciclo while .......................................................................................................... 24
3.2.5 Ciclo do.while ................................................................................................. 25
3.3. Tipos de variveis disponveis .................................................................................. 26
3.3.1 Varivel do Tipo Boolean .................................................................................. 26
3.3.2. Varivel do tipo char vs unsigned char ............................................................. 27
3.3.3. Varivel do tipo byte ......................................................................................... 27
3.3.4. Varivel do tipo int vs unsigned int .................................................................. 28
3.3.5. Varivel do tipo long vs unsigned long ............................................................. 28
3.3.6. Varivel do tipo float vs double ........................................................................ 29
3.3.7. Varivel do Tipo array e a Noo de string ...................................................... 29
3.4. Converter tipos de variveis ..................................................................................... 30
3.4.1. char(x) ................................................................................................................. 30
3.4.2. byte(x) ................................................................................................................ 30
Arduino Introduo e Recursos Avanados Escola Naval
ASPOF EN-AEL Pessanha Santos 4
3.4.3. int(x) .................................................................................................................... 30
3.4.4. long(x) ................................................................................................................. 30
3.4.5. float(x) ................................................................................................................ 30
3.5. Funes ....................................................................................................................... 31
3.5.1. Input/Output digital ............................................................................................... 31
3.5.1.1. pinMode() ....................................................................................................... 31
3.5.1.2 digitalWrite() ...................................................................................................... 32
3.5.1.3. digitalRead() ................................................................................................... 33
3.5.2. Input/Output analgico ......................................................................................... 34
3.5.2.1 analogRead() ...................................................................................................... 34
3.5.2.2 analogWrite() ..................................................................................................... 35
3.5.3. Tempo ..................................................................................................................... 36
3.5.3.1. millis() ............................................................................................................. 36
3.5.3.2. micros() ........................................................................................................... 36
3.5.3.3. delay (milisegundos) ..................................................................................... 37
3.5.3.4. delayMicroseconds (microsegundos)........................................................... 37
3.5.4. Funes Matemticas ........................................................................................... 39
3.5.4.1. min(valor1,valor2) ......................................................................................... 39
3.5.4.2. max(valor1,valor2) ........................................................................................ 39
3.5.4.3. abs(valor) ........................................................................................................ 39
3.5.4.4. constrain(valor, valor1.,valor2) .................................................................... 40
3.5.4.5. map(X,valor1,valor2,para valor1,para valor2) ............................................ 40
3.5.4.6. pow(valor, expoente) .................................................................................... 41
3.5.4.7. sqrt(valor) ....................................................................................................... 41
3.5.5. Funes Trigonomtricas ..................................................................................... 42
3.5.5.1. sen(valor) ........................................................................................................ 42
3.5.5.2. cos(valor) ........................................................................................................ 42
3.5.5.1. tan(valor) ........................................................................................................ 42
3.5.6. Nmeros Aleatrios .............................................................................................. 43
3.5.6.1 randomSeed(valor) ............................................................................................ 43
3.5.6.2. random() ......................................................................................................... 43
3.5.7. Interrupts ................................................................................................................ 45
3.5.7.1. attachInterrupt(interrupt, funo,modo) ................................................... 45
3.5.7.2. detachInterrupt(interrupt) ............................................................................ 46
Arduino Introduo e Recursos Avanados Escola Naval
ASPOF EN-AEL Pessanha Santos 5
3.5.7.3. interrupts() ..................................................................................................... 46
3.5.7.4. noInterrupts() ................................................................................................. 46
3.5.8. Comunicao Srie ................................................................................................ 48
3.5.8.1. Serial.available() ............................................................................................ 48
3.5.8.2. Serial.begin(int baud rate) ............................................................................ 48
3.5.8.3. Serial.read() .................................................................................................... 49
3.5.8.4. Serial.flush() ................................................................................................... 49
3.5.8.5. Serial.print() vs Serial.println() ..................................................................... 50
3.5.8.1. Serial.write() .................................................................................................. 50
4. Recursos Avanados .......................................................................................................... 51
4.1. Flash ............................................................................................................................ 51
4.1.1. Sintaxe a Utilizar para Guardar Dados em Flash ............................................ 51
4.1.2. Sintaxe a Utilizar para Ler Dados da Memria Flash ..................................... 51
4.2. EEPROM ..................................................................................................................... 52
4.2.1. Sintaxe de Escrita em EEPROM ....................................................................... 52
4.2.2. Sintaxe de Leitura em EEPROM ....................................................................... 52
4.3. Servomotor ................................................................................................................ 53
4.3.1. Sintaxe das Instrues da Biblioteca <Servo.h> ............................................. 54
4.3.1.1. attach() ........................................................................................................... 54
4.3.1.2. detach()........................................................................................................... 55
4.3.1.3. write() ............................................................................................................. 55
4.3.1.4. read() ............................................................................................................... 56
4.3.1.5. attached() ....................................................................................................... 56
4.4. Software Serial .......................................................................................................... 58
4.4.1. Sintaxe das Instrues da Biblioteca <SoftwareSerial.h> ............................. 59
4.4.1.1. SoftwareSerial(Pino de Rx, Pino de Tx) ...................................................... 59
4.4.1.2. begin(Baud Rate) ........................................................................................... 59
4.4.1.3. read() ............................................................................................................... 60
4.4.1.4. print(dados) vs println(dados) ...................................................................... 60
4.5. FIRMATA vs Processing ............................................................................................ 62
4.6. Aquisio de Sinal Converso A/D ......................................................................... 63
4.6.1. Alguns Conceitos Tericos ................................................................................ 63
4.6.2. Arduino vs ADC .................................................................................................. 64
4.6.3. Sintaxe para Alterar o Valor do Factor de Diviso ...................................... 66
Arduino Introduo e Recursos Avanados Escola Naval
ASPOF EN-AEL Pessanha Santos 6
5. Concluso ........................................................................................................................... 68
6. Bibliografia ......................................................................................................................... 69

Arduino Introduo e Recursos Avanados Escola Naval
ASPOF EN-AEL Pessanha Santos 7
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.

Arduino Introduo e Recursos Avanados Escola Naval
ASPOF EN-AEL Pessanha Santos 8
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)
Arduino Introduo e Recursos Avanados Escola Naval
ASPOF EN-AEL Pessanha Santos 9
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.

















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.









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

CPU
A/D
D/A
ROM
RAM
Temporizadores
(Timers)
Porta Paralela

Porta Srie
UART
Etc
Etc
Etc
Etc

Microprocessador
Memria RAM Memria ROM
Perifricos
Clock
Arduino Introduo e Recursos Avanados Escola Naval
ASPOF EN-AEL Pessanha Santos 10
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.

Arduino Introduo e Recursos Avanados Escola Naval
ASPOF EN-AEL Pessanha Santos 11
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 ATMega328 ATMega1280
Flash
16 KBytes
(2 KBytes Bootloader)
32 KBytes
(2 KBytes Bootloader)
128 KBytes
(4 KBytes Bootloader)
SRAM 1024 Bytes 2048 Bytes 8192 Bytes
EEPROM 512 Bytes 1024 Bytes 4096 Bytes
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:

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.

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)
Arduino Introduo e Recursos Avanados Escola Naval
ASPOF EN-AEL Pessanha Santos 12
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
14
(6 com Pulse Width Modulation (PWM))
Pinos analgicos 6
Pinos de Ground (GND) 3
Pinos de 5 V 1
Pinos de 3.3 V 1
Pinos de Analog Reference (AREF) 1
Pinos de reset (RESET) 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.






Fig. 7 Exemplo de sinal PWM
Fonte: Adaptado de Sousa and Lavinia 2006, pg. 155
Frequncia constante
duty cicle vari|vel
Arduino Introduo e Recursos Avanados Escola Naval
ASPOF EN-AEL Pessanha Santos 13
A teoria por detr|s deste fenmeno pode ser facilmente descrita. Analisemos a
seguinte equao:

=
1

0

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:

=

<


Nota: Na equa~o anterior

representa a dura~o do impulso, e

representa
a tenso do impulso do sinal PWM.







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

Aplicando os conceitos descritos anteriormente:

=

+ 0

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:
2
10
= 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.



Arduino Introduo e Recursos Avanados Escola Naval
ASPOF EN-AEL Pessanha Santos 14
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 Mantm a referncia por definio (5V)
INTERNAL Altera a referncia para 1.1 V (ATMega168)
EXTERNAL 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 V
in
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 V
in
estaro
acessveis os 9 V da alimentao).
Alguns pormenores de configurao de cariz mais avanado podero ser encontrados
no captulo 4 Recursos avanados.

Arduino Introduo e Recursos Avanados Escola Naval
ASPOF EN-AEL Pessanha Santos 15
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.
1- O 1 passo consiste em efectuar o download do respectivo software de
desenvolvimento, atravs do site oficial Arduino (www.arduino.cc).

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
Arduino Introduo e Recursos Avanados Escola Naval
ASPOF EN-AEL Pessanha Santos 16
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.



Fig. 13 Software de desenvolvimento Arduino


Opo Tools
Seleccionar Modelo a utilizar
Porta COM a ser utilizada
Arduino Introduo e Recursos Avanados Escola Naval
ASPOF EN-AEL Pessanha Santos 17
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.








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)


Editar Compilar Uploading Executar
Arduino Introduo e Recursos Avanados Escola Naval
ASPOF EN-AEL Pessanha Santos 18
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.
Arduino Introduo e Recursos Avanados Escola Naval
ASPOF EN-AEL Pessanha Santos 19
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)
Arduino Introduo e Recursos Avanados Escola Naval
ASPOF EN-AEL Pessanha Santos 20
(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;
Instruo 2;
(.)
}
void loop(){
Instruo 6;
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.

Conjunto de instrues apenas executado uma vez,
na inicializao do programa a executar
Conjunto de instrues que executado em loop
Arduino Introduo e Recursos Avanados Escola Naval
ASPOF EN-AEL Pessanha Santos 21
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 igual a Y
X != Y
X diferente de Y (no igual)
X > Y
X maior que Y
X >= Y
X maior ou igual a Y
X < Y
X menor que Y
X <= Y
X menor ou igual a Y
Tabela 4 Condies possveis
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
Arduino Introduo e Recursos Avanados Escola Naval
ASPOF EN-AEL Pessanha Santos 22
(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
Arduino Introduo e Recursos Avanados Escola Naval
ASPOF EN-AEL Pessanha Santos 23
(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)
Arduino Introduo e Recursos Avanados Escola Naval
ASPOF EN-AEL Pessanha Santos 24
(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) }


Arduino Introduo e Recursos Avanados Escola Naval
ASPOF EN-AEL Pessanha Santos 25
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) }

Arduino Introduo e Recursos Avanados Escola Naval
ASPOF EN-AEL Pessanha Santos 26
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) }

Arduino Introduo e Recursos Avanados Escola Naval
ASPOF EN-AEL Pessanha Santos 27
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

Arduino Introduo e Recursos Avanados Escola Naval
ASPOF EN-AEL Pessanha Santos 28
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

Arduino Introduo e Recursos Avanados Escola Naval
ASPOF EN-AEL Pessanha Santos 29
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 10
38
e 3.4028235 10
38
. 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
Arduino Introduo e Recursos Avanados Escola Naval
ASPOF EN-AEL Pessanha Santos 30
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);
Arduino Introduo e Recursos Avanados Escola Naval
ASPOF EN-AEL Pessanha Santos 31
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) }

Arduino Introduo e Recursos Avanados Escola Naval
ASPOF EN-AEL Pessanha Santos 32
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) }

Arduino Introduo e Recursos Avanados Escola Naval
ASPOF EN-AEL Pessanha Santos 33
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) }

Arduino Introduo e Recursos Avanados Escola Naval
ASPOF EN-AEL Pessanha Santos 34
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) }

Arduino Introduo e Recursos Avanados Escola Naval
ASPOF EN-AEL Pessanha Santos 35
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) }

Arduino Introduo e Recursos Avanados Escola Naval
ASPOF EN-AEL Pessanha Santos 36
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) }

Arduino Introduo e Recursos Avanados Escola Naval
ASPOF EN-AEL Pessanha Santos 37
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)
Arduino Introduo e Recursos Avanados Escola Naval
ASPOF EN-AEL Pessanha Santos 38
(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) }


Arduino Introduo e Recursos Avanados Escola Naval
ASPOF EN-AEL Pessanha Santos 39
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 =
valor valor 0
valor valor < 0



Exemplo:

int modulo=0;
modulo = abs(-5) // O valor atribudo varivel modulo seria o valor 5

Arduino Introduo e Recursos Avanados Escola Naval
ASPOF EN-AEL Pessanha Santos 40
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

Arduino Introduo e Recursos Avanados Escola Naval
ASPOF EN-AEL Pessanha Santos 41
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 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
2
2
= 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.
Arduino Introduo e Recursos Avanados Escola Naval
ASPOF EN-AEL Pessanha Santos 42
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 ; +

Arduino Introduo e Recursos Avanados Escola Naval
ASPOF EN-AEL Pessanha Santos 43
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) ()
Arduino Introduo e Recursos Avanados Escola Naval
ASPOF EN-AEL Pessanha Santos 44
(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) }

Arduino Introduo e Recursos Avanados Escola Naval
ASPOF EN-AEL Pessanha Santos 45
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 Valor 0 -corresponde ao pino digital 2;
o Valor 1 -corresponde ao pino digital 3.

Arduino Mega

o Valor 0 -corresponde ao pino digital 2;
o Valor 1 -corresponde ao pino digital 3;
o Valor 2 -corresponde ao pino digital 21;
o Valor 3 -corresponde ao pino digital 20;
o Valor 4 -corresponde ao pino digital 19;
o 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.
CHANGE
O interrupt efectuado sempre que o valor
no pino muda de valor.
RISING
O interrupt efectuado sempre que o valor
lgico no pino muda de 0 para 1.
FALLING
O interrupt efectuado sempre que o valor
lgico no pino muda de 1 para 0.
Tabela 5 Condies possveis do par}metro modo









Arduino Introduo e Recursos Avanados Escola Naval
ASPOF EN-AEL Pessanha Santos 46
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) ()
Arduino Introduo e Recursos Avanados Escola Naval
ASPOF EN-AEL Pessanha Santos 47
(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) }

Arduino Introduo e Recursos Avanados Escola Naval
ASPOF EN-AEL Pessanha Santos 48
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) }
Arduino Introduo e Recursos Avanados Escola Naval
ASPOF EN-AEL Pessanha Santos 49
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) }

Arduino Introduo e Recursos Avanados Escola Naval
ASPOF EN-AEL Pessanha Santos 50
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.

Arduino Introduo e Recursos Avanados Escola Naval
ASPOF EN-AEL Pessanha Santos 51
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.
Arduino Introduo e Recursos Avanados Escola Naval
ASPOF EN-AEL Pessanha Santos 52
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) }
Arduino Introduo e Recursos Avanados Escola Naval
ASPOF EN-AEL Pessanha Santos 53
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


Arduino Introduo e Recursos Avanados Escola Naval
ASPOF EN-AEL Pessanha Santos 54
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) (..)
Arduino Introduo e Recursos Avanados Escola Naval
ASPOF EN-AEL Pessanha Santos 55
(6) void loop(){
(7) (..)
(8) }

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
Arduino Introduo e Recursos Avanados Escola Naval
ASPOF EN-AEL Pessanha Santos 56
(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:
Arduino Introduo e Recursos Avanados Escola Naval
ASPOF EN-AEL Pessanha Santos 57
Servo nome_a_atribuir;
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.

Arduino Introduo e Recursos Avanados Escola Naval
ASPOF EN-AEL Pessanha Santos 58
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
Arduino Introduo e Recursos Avanados Escola Naval
ASPOF EN-AEL Pessanha Santos 59
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
Arduino Introduo e Recursos Avanados Escola Naval
ASPOF EN-AEL Pessanha Santos 60
(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);
Arduino Introduo e Recursos Avanados Escola Naval
ASPOF EN-AEL Pessanha Santos 61
SoftwareSerial.println(dado a enviar);
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) }

Arduino Introduo e Recursos Avanados Escola Naval
ASPOF EN-AEL Pessanha Santos 62
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
Arduino Introduo e Recursos Avanados Escola Naval
ASPOF EN-AEL Pessanha Santos 63
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, recorre-
se a um conversor A/D (ADC Analog-to-digital converter). Os constituintes de um conversor
A/D so os seguintes:







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 X
a
(t) - para uma sequncia discreta X(n). Esta sequncia discreta
criada ao guardar os valore de X
a
(t) em intervalos de tempo constantes T
s
.
() =

(.

) 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
1
C/D
Quantizer
Encoder
() ()
3

()
2

()
Arduino Introduo e Recursos Avanados Escola Naval
ASPOF EN-AEL Pessanha Santos 64
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, torna-
se 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):


=
10
6
13
77000
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
Arduino Introduo e Recursos Avanados Escola Naval
ASPOF EN-AEL Pessanha Santos 65
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 7 6 5 4 3 2 1 0
(0x7A) ADEN ADSC ADATE ADI F ADI E ADPS2 ADPS1 ADPS0
Read/Write R/W R/W R/W R/W R/W R/W R/W R/W
Valor
Inicial
0 0 0 0 0 0 0 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 ADPS1 ADPS0
Factor de
diviso
0 0 0 2
0 0 1 2
0 1 0 4
0 1 1 8
1 0 0 16
1 0 1 32
1 1 0 64
1 1 1 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
Clock de entrada no ADC
(MHz)
2 8
4 4
8 2
16 1
32 0.5
64 0.25
128 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
Arduino Introduo e Recursos Avanados Escola Naval
ASPOF EN-AEL Pessanha Santos 66
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)

Arduino Introduo e Recursos Avanados Escola Naval
ASPOF EN-AEL Pessanha Santos 67
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
Taxa de amostragem
()
128 8
64 16
32 31
16 50
8 63
4 83
2 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.

Arduino Introduo e Recursos Avanados Escola Naval
ASPOF EN-AEL Pessanha Santos 68
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

Arduino Introduo e Recursos Avanados Escola Naval
ASPOF EN-AEL Pessanha Santos 69
6. Bibliografia

Arduiniana. (2009). "Arduino software jewellry and wisdom." Retrieved 4 August 2009,
2009, from http://arduiniana.org/.
Arduino. (2006, 14 July 2009). Retrieved 21 July 2009, 2009, from
http://www.arduino.cc.
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, 2009, from
http://www.esen.pt/on/file.php/45/Cerqueira/Servo_Motor.pdf.
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.

Potrebbero piacerti anche