Download - Programação I (Arduino)
-
Programao em C
Sistemas Embarcados
(ARDUINO)
IFSP - Programao I
Prof. Fernando Paes Landim
-
2
Sumrio
1 Introduo .................................................................................................................................. 3
2 Linguagem de Programao ...................................................................................................... 3
3 Arduino IDE ................................................................................................................................ 4
4 Programando no ARDUINO IDE ................................................................................................ 6
4.1 Simbologia .......................................................................................................................... 6
4.2 Funo void setup( ) ........................................................................................................... 6
4.3 Funo pinMode( ) .............................................................................................................. 7
4.4 Funo void loop( ) ............................................................................................................. 7
4.5 Funes Digitais de INPUT / OUTPUT ................................................................................ 8
4.5.1 Funo digitalWrite( ) ................................................................................................... 8
4.5.2 Funo digitalRead( ) ................................................................................................... 8
4.5.3 Funo delay() ............................................................................................................. 9
4.6 Estruturas de Controle ........................................................................................................ 9
4.6.1 Estrutura de Controle If (Se) ........................................................................................ 9
4.6.2 Estrutura de Controle If .. Else (Se .. seno) .............................................................. 10
5 Exemplos de programas comentados ...................................................................................... 12
5.1 Pisca LED ......................................................................................................................... 12
5.2 Semforo .......................................................................................................................... 13
5.3 Boto e LED ..................................................................................................................... 14
-
3
1 Introduo
Nesta matria iremos abordar a Linguagem de Programao C voltada para Sistemas
Embarcados, especificamente para a plataforma ARDUINO.
Lembrando que a linguagem C para sistemas embarcados uma adaptao do C criado
para desktop com a finalidade de gerar um programa (firmware) para embarcarmos no nosso
microcontrolador. Com isso, os desenvolvedores do ARDUINO criaram o ARDUINO IDE (Integrated
Development Environment), que o ambiente de desenvolvimento do programa que iremos
embarcar no nosso ARDUINO. Essa IDE foi inspirada em C, desenvolvida com funes pr-
programadas a fim de facilitar seu uso, mantendo as funes de controle de fluxo herdadas do C.
Mas por que C ?
Evidente que a Linguagem C a principal Linguagem de Programao, sendo a linguagem
mais utilizada, direta ou indiretamente, desde sua criao. Diversas outras linguagens muito
utilizadas hoje, tiveram sua base em C, assim como: C++, C#, JAVA, entre outras. Assim tambm
como h indcios de que os principais Sistemas Operacionais (Windows, Mac OS e Linux) foram
desenvolvidos em C.
Ento por isso a Linguagem C importantssima para comearmos a aprender
programao.
2 Linguagem de Programao
Podemos imaginar o computador como uma super calculadora capaz de realizar clculos
muito mais rpido do que ns, mas para isso, devemos dizer ao computador o que deve ser
calculado e como deve ser calculado. A funo das linguagens de programao exatamente
essa, ou seja, servir de um meio de comunicao entre computadores e humanos.
Existem dois tipos de linguagens de programao: as de baixo nvel e as de alto nvel. Os
computadores interpretam tudo como nmeros em base binria, ou seja, s entendem zero e um.
As linguagens de baixo nvel so interpretadas diretamente pelo computador, tendo um resultado
rpido, porm muito difcil e incmodo de se trabalhar com elas. Exemplos de linguagens de
baixo nvel so: a linguagem binria e a linguagem Assembly.
-
4
Exemplo de cdigo em Assembly:
MOV AX,WORD1 ;movimenta o contedo da posio de memria WORD1 para o registrador AX
MOV AH,A ;transfere o caracter ASCII A para AH
MOV AH,41h ;idem anterior: 41h corresponde ao caracter A
MOV AH,BL ;move o contedo do byte baixo de BX o byte alto de AX
MOV AX,CS ;transfere uma cpia do contedo de CS para AX
Como pode-se notar, uma linguagem bastante complicada.
J as linguagens de alto nvel so mais fceis de se trabalhar e de entender, as aes so
representadas por palavras de ordem (exemplo : faa, imprima, etc) geralmente em ingls, foram
feitos assim para facilitar a memorizao e a lgica. Elas no so interpretadas diretamente pelo
computador, sendo necessrio traduzi-las para linguagem binria utilizando-se de um programa
chamado compilador.
Quando programamos em uma linguagem de programao de alto nvel, primeiramente
criamos um arquivo de texto comum contendo a lgica do programa, ou seja, onde falamos ao
computador como deve ser feito o que queremos. Este arquivo de texto chamado de cdigo-
fonte, cada palavra de ordem dentro do cdigo-fonte chamada de instruo. Aps criarmos o
cdigo-fonte devemos traduzir este arquivo para linguagem binria usando o compilador
correspondente com a linguagem na qual estamos programando. O compilador ir gerar um
segundo arquivo que chamamos de executvel ou programa, este arquivo gerado interpretado
diretamente pelo computador.
3 Arduino IDE
Agora daremos introduo a nossa plataforma de desenvolvimento, conhecer um pouco do
ambiente e seus principais recursos. Lembrando que o compilador do ARDUINO pode ser
gratuitamente baixado no site arduino.cc .
-
5
Figura 1 - Imagem do Arduino IDE
Por padro, o nome do nosso arquivo vem nomeado como sketch_data, que em ingls pode
significar esboo ou rascunho, mas pode ser facilmente alterado quando salvamos nosso arquivo
no disco.
- Verificar : Compila nosso cdigo, verificando se existe algum erro de instruo ou sintaxe.
- Carregar: Verifica e embarca nosso programa para o Arduino, quando o mesmo estiver
conectado ao computador.
- Novo : Cria um novo arquivo.
- Abrir : Abri um arquivo existente.
- Salvar : Salva o arquivo atual.
-
6
4 Programando no ARDUINO IDE
Para cada programa teremos apenas uma funo void setup( ) e uma funo void loop( ).
Funes em linguagem de programao so como sub-rotinas ou procedimentos; so
pequenos blocos de programas usados para montar o programa principal. Elas so escritas pelo
programador para realizar tarefas repetitivas, ou podem ser importadas prontas para o programa
em forma de bibliotecas.
4.1 Simbologia
{ } - Dentro das chaves vo os procedimentos que a funo deve executar
; - O ponto e vrgula usado para marcar o final de uma instruo.
// - comentrio de uma linha: qualquer caractere depois das duas barras ignorado pelo
compilador.
/* comentrio de vrias linhas */ - qualquer texto colocado entre esses smbolos tambm
ignorado pelo compilador.
4.2 Funo void setup( )
A funo void setup( ), ser responsvel por determinar as configuraes dos pinos
utilizados no nosso programa logo quando inicia, e executada apenas essa primeira vez.
Exemplo:
void setup( ){
pinMode(0,OUTPUT); // Define o pino 0 como sada
pinMode(1,INPUT); // Define o pino 1 como entrada
}
A funo void setup( ) comea na " { " (chave aberta) e termina na " } " (chave fechada), e
todas as configuraes de pinos devem ser feitas dentro dessas chaves.
Percebam que as palavras utilizadas pelo compilador ficam em cores diferentes, por isso
importante diferenciar maisculas de minsculas. Como por exemplo a instruo " pinMode ",
se digitarmos tudo minsculo " pinmode ", nosso compilador no ir entender qual instruo deve
realizar e dar erro de compilao.
-
7
4.3 Funo pinMode( )
Sintaxe: pinMode(pino,MODO)
pino : se refere ao nmero do pino do ARDUINO que iremos configurar.
MODO : estado do pino, podendo ser INPUT (entrada de dados), OUTPUT (sada
de dados) ou INPUT_PULLUP (entrada de dados com resistores de pull-up internos).
Exemplos:
pinMode(13,OUTPUT); // Configurando o pino 13 como sada de dados
pinMode(0,INPUT); // Configurando o pino 0 como entrada de dados
Isso significa que no pino 13, o microcontrolador ir enviar uma tenso de 0 Volt ou 5 Volts,
sendo 0 Volt nvel lgico baixo e 5 Volts nvel lgico alto. J no pino 0 iremos receber uma
tenso entre 0 Volt e 5 Volts, considerando uma leitura prxima a 0 Volt como nvel lgico baixo e
leitura prxima a 5 Volts como nvel lgico alto.
4.4 Funo void loop( )
A funo void loop( ) chamada logo a seguir da funo void setup( ), e todas as funes
embarcadas nela so repetidamente executadas. Ela fica lendo os pinos de entrada do Arduino,
comandando os pinos de sada e a porta serial. Dentro dela que desenvolveremos o programa
para embarcarmos no Arduino a fim de controlar logicamente e sequencialmente os dispositivos
conectados na plataforma. Basicamente a principal funo da linguagem C j composta por um lao
de repetio infinito.
Exemplo em linguagem C:
void main(){ // Funo principal
while(1){ // Funo de repetio infinita
/* Espao destinado
ao desenvolvimento
do programa */
} // Fim da funo while
} // Fim da funo principal
Exemplo no Arduino IDE:
void loop(){ // Funo principal com lao de repetio
/* Espao destinado
ao desenvolvimento
do programa */
} /* Fim da funo principal, volta primeira instruo
da funo void loop() */
-
8
4.5 Funes Digitais de INPUT / OUTPUT
Como vimos na funo pinMode( ), as instrues INPUT e OUTPUT so as funes de
entrada e sada de dados. Aps configurarmos os pinos, utilizaremos as funes digitalWrite( ) e
digitalRead( ).
4.5.1 Funo digitalWrite( )
A funo digitalWrite( ) utilizada para escrever um valor na sada do pino digital.
Sintaxe: digitalWrite(pino, VALOR)
pino: Esse pino dever estar configurado como OUTPUT, e assim estamos indicando
em qual pino iremos escrever um valor.
VALOR: Valor do pino, podendo ser HIGH (nvel lgico alto) ou LOW (nvel lgico
baixo).
Exemplo:
digitalWrite(13, HIGH); // Pino 13 como nvel lgico alto
digitalWrite(12, LOW); // Pino 12 como nvel lgico baixo
Com essa funo conseguimos acionar dispositivos externos de 5 Volts ou chavear um
transistor no caso de tenses maiores.
4.5.2 Funo digitalRead( )
A funo digitalRead( ) utilizada para ler um valor na entrada do pino.
Sintaxe: digitalRead(pino)
pino: Esse pino dever estar configurado como INPUT, e assim estamos indicando
qual pino queremos fazer a leitura.
Exemplo:
digitalRead(5); // Realiza a leitura do pino 5
-
9
4.5.3 Funo delay()
A funo delay( ) utilizada para gerar um atraso no programa.
Sintaxe: delay(tempo)
tempo: valor em milissegundos que determinar o atraso naquele instante do
programa.
Exemplo:
delay(1000); // Atraso de 1 segundo
delay(500); // Atraso de 0,5 segundo
4.6 Estruturas de Controle
So utilizadas para tomar decises lgica durante o programa dependendo dos valores
obtidos.
4.6.1 Estrutura de Controle If (Se)
If um controle de fluxo usado para selecionar uma ou mais instrues baseadas no
resultado de um teste de comparao. Todas as instrues entre as chaves { e } so executadas
somente se o resultado desse teste for verdadeiro; se no, essas instrues no so executadas.
Verdadeiro qualquer resultado diferente de zero, mesmo negativo. Falso um resultado zero.
Figura 2 - Estrutura If
-
10
Sintaxe: if (teste lgico){
// bloco a ser realizado caso o teste lgico retorne Verdadeiro
}
Exemplo:
if (digitalRead(5) == 1){ // Se leitura do pino 5 for igual a 1
digitalWrite(13,HIGH); // Pino 13 vai pra nvel lgico alto
} // Fim da funo If
Operadores de Comparao:
Podemos utilizar os seguintes smbolos como operadores de comparao:
== - Compara se os dois valores so iguais.
!= - Compara se os dois valores so diferentes.
< - Compara se o primeiro valor menor que o segundo.
- Compara se o primeiro valor maior que o segundo.
>= - Compara se o primeiro valor maior ou igual ao segundo.
4.6.2 Estrutura de Controle If .. Else (Se .. seno)
Ao acrescentar mais um bloco de instrues na funo do comando if, pode-se criar o
comando if .. else, para fazer um teste novo caso o resultado da expresso retorne falso.
Figura 3 - Estrutura If .. Else
-
11
Sintaxe: if (teste lgico){
// bloco a ser realizado caso o teste lgico retorne Verdadeiro
}
else{
// bloco a ser realizado caso o teste lgico retorne Falso
}
Exemplo:
if (digitalRead(5) == 1){ // Se leitura do pino 5 for igual a 1
digitalWrite(13,HIGH); // Pino 13 vai pra nvel lgico alto
}
else{
digitalWrite(13,LOW); // Pino 13 vai pra nvel lgico baixo
}
-
12
5 Exemplos de programas comentados
5.1 Pisca LED
Figura 4 - Nvel lgico alto
Figura 5 - Nvel lgico baixo
Dado o circuito acima criaremos um programa para piscar um LED a cada 1 segundo, com isso
tambm conseguimos fornecer um sinal digital com frequncia de 1 Hz.
void setup( ){
pinMode(10, OUTPUT); // Define pino 10 como sada de dados
}
void loop( ){
digitalWrite(10,HIGH); // Coloca pino 10 em nvel alto
delay(1000); // Atraso de 1000 milissegundos ou 1 segundo
digitalWrite(10,LOW); // Coloca pino 10 em nvel alto
delay(1000); // Atraso de 1000 milissegundos ou 1 segundo
}
-
13
5.2 Semforo
Figura 6 - Semforo
int led_verde = 0; // Cria varivel led_verde do tipo inteiro e atribui valor 0
int led_amarelo = 1; // Cria varivel led_amarelo do tipo inteiro e atribui valor 1
int led_vermelho = 2; // Cria varivel led_vermelho do tipo inteiro e atribui valor 2
// Variveis do tipo INTEIRO podem receber valores inteiro entre -32768 e +32767
void setup( ){
pinMode(led_verde,OUTPUT); // Configura pino do led_verde como sada
pinMode(led_amarelo,OUTPUT); // Configura pino do led_amarelo como sada
pinMode(led_vermelho,OUTPUT); // Configura pino do led_vermelho como sada
}
void loop( ){
digitalWrite(led_verde,HIGH); // led_verde para nvel alto
delay(1000); // Atraso de 1 segundo
digitalWrite(led_verde,LOW); // led_verde para nvel baixo
digitalWrite(led_amarelo,HIGH); // led_amarelo para nvel alto
delay(500); // Atraso de 0,5 (meio) segundo
digitalWrite(led_amarelo,LOW); // led_amarelo para nvel baixo
digitalWrite(led_vermelho,HIGH); // led_vermelho para nvel alto
delay(1000); // Atraso de 1 segundo
digitalWrite(led_vermelho,LOW); // led_vermelho para nvel baixo
}
-
14
5.3 Boto e LED
Figura 7 - Boto solto
Figura 8 - Boto pressionado
Para o circuito acima queremos acionar um dispositivo, no nosso caso um LED, usando um boto
do tipo push_button (solto = 0 e pressionado = 1).
int botao = 13; // Cria varivel botao do tipo inteiro e atribui valor 13
int led = 0; // Cria varivel led do tipo inteiro e atribui valor 0
void setup(){
pinMode(botao, INPUT); // Configura botao como entrada de dados
pinMode(led, OUTPUT); // Configura led como sada de dados
}
void loop(){
if (digitalRead(botao) == 1){ // Se leitura do botao for igual a 1
digitalWrite(led,HIGH); // Acende led
}
else{ // Seno, se leitura do boto for igual a 0
digitalWrite(led,LOW); // Apaga o led
}
}