apostila - arduino (cartilha para programação em c)

apostila - arduino (cartilha para programação em c)

(Parte 1 de 3)

w.revistadoarduino.com.br

João Alexandre da Silveira

ARDUINO Cartilha para Programação em C

Para Interfaces Simples de Hardware - Edição 1.0

Esse material é de domínio público e pode ser livremente distribuído e impresso desde que sem modificações em seu conteúdo.

Porta USB - usada
para comunicação serial

com um computador

Funções em C: begin( ) end( ) available( ) read( ) print( ) println( )

Pinos analógicos

usados para leitura de sinais de sensores

Função em C: analogRead( ) Pinos de Alimentação usados para alimentação de circuitos externos e reset do Arduino

usados para deteção
ou transmissão de

Pinos Digitais controles digitais

Funções em C: pinMode( ) digitalRead( ) digitalWrite( ) analogWrite( ) attachInterrupt( ) pulseIn( ) w.revistadoarduino.com.br

ARDUINO - Cartilha para Programação em C - Edição 1.0página I w.revistadoarduino.com.br

Cartilha de Programação em C para o ARDUINO Escrita e produzida por João Alexandre da Silveira

Com informações e inspirações tomadas de:

“Arduino Programming Notebook” - Brian W. Evans “Experimentos com o ARDUINO“ - João Alexandre da Silveira “Programming Interactivity” - Josua Noble “The C Programming Language” - Kernighan and Ritche “Let Us C“ - Yashavant Kanetkar “C for Engineers and Scientists“ - Gary Bronson w.arduino.c w.revistadoarduino.com.br

Edição 1.0 - janeiro de 2012

Esse material é de domínio público e pode ser livremente distribuído e impresso desde que sem modificações em seu conteúdo.

e-mail do autor: planctum@yahoo.com w.revistadoarduino.com.br

João Alexandre da Silveirapágina I PREFÁCIO

Este livreto de pouco mais de 20 páginas é um guia de consulta rápida para os iniciantes em programação do ARDUINO para criação de interfaces simples de hardware. Ele resume em tabelas, imagens e gráficos de fácil compreensão a função das portas físicas de entrada e de saída do ARDUINO e os principais comandos da sua linguagem de programação. A idéia foi reunir em um pequeno guia de bancada a descrição de cada pino do ARDUINO e as funções na sua linguagem de programação relativas a esses pinos. Tambem estão incluídas as funções para comunicação serial.

ções de controle

O texto foi dividido em duas partes: uma que trata da estrutura da linguagem de programação, e uma que trata do hardware controlado por essa programação. Nessa primeira parte é apresentada a estrutura básica da linguagem com as suas duas principais funções; a seguir uma breve introdução sobre constantes, variáveis, matrizes, funções de matemática e tempo e, por fim, as funções de controle de fluxo herdadas da linguagem C/C++. Na segunda parte as portas de entrada e saída (pinos) digitais, as portas analógicas e a porta serial do ARDUINO são descritas junto com as suas fun-

Para aqueles leitores interessados em se aprofundar mais no mundo do ARDUINO e na linguagem C sugerimos os livros e sites web que aparecem na página I deste livreto. Sugestões, críticas e comentários sobre esse trabalho podem ser enviadas diretamente para o autor pelo site w.revistadoarduino.com.br; onde o leitor poderá tambem cadastrar seu e-mail para ser notificado sobre uma nova edição desta Cartilha.

João Alexandre da Silveira janeiro de 2012

ARDUINO - Cartilha para Programação em C - Edição 1.0página IV

w.revistadoarduino.com.br

MAPA DAS ENTRADAS E SAÍDAS DO ARDUINO 2

A - A ESTRUTURA DA LINGUAGEM DO ARDUINO 3

A Estrutura Básica Funções Declaração de funções setup( ) loop( ) Os símbolos { } ; //

A.1 - CONSTANTES E VARIÁVEIS4

TRUE/FALSE HIGH/LOW INPUT/OUPUT Escopo da Variável Declaração da Variável Tipos de variáveis

A.2 - MATRIZES5

Declaração de uma Matriz Escrever/Ler uma Matriz

A.3 - LÓGICA E ARITMÉTICA6

Símbolos compostos Operadores de comparação Operadores lógicos

A.5 - FUNÇÕES PARA CONTROLE DE FLUXO 8 if if...else if...else...if w.revistadoarduino.com.br

João Alexandre da Silveirapágina V while do...while for switch...case operador ternário ‘?’

B.1 - OS PINOS DIGITAIS13

B- AS PORTAS DE E/S DO ARDUINO E SUAS FUNÇÕES EM C 13 pinMode( ) digitalRead( ) digitalWrite( ) analogWrite( ) attachInterrupt( ) pulseIn( )

B.2 - OS PINOS ANALÓGICOS15

analogRead( )

B.3 - A PORTA SERIAL DO ARDUINO16

Serial.begin( ) Serial.end( ) Serial.available( ) Serial.read( ) Serial.print( ) Serial.println( )

B.4 - OS PINOS DE ALIMENTAÇÃO 17 w.revistadoarduino.com.br w.revistadoarduino.com.br

ARDUINO - Cartilha para Programação em C - Edição 1.0página 2

w.revistadoarduino.com.br

A estrutura básica da linguagem de programação do Arduino é bastante simples; ela é formada por dois blocos de funções que carregam outros blocos de funções escritas em linguagem C/C++. O primeiro bloco de funções forma a função setup( ); o segundo, a função loop( ).

Os Símbolos usados na construção de funções são os seguintes:

{ } - Dentro das chaves vão os procedimentos (statements) que a função deve executar; ; - O ponto-e-vírgula é usado para marcar o final de um procedimento; // - comentário de uma linha: qualquer caracter depois das duas barras é ignorado pelo programa;

/*...*/ - comentário em várias linhas: qualquer texto colocado entre esses simbolos tambem é ignorado pelo programa.

Funções em linguagens de programação são como sub-rotinas ou procedimentos; são pequenos blocos de programas usados para montar o programa principal. Elas são escritas pelo programador para realizar tarefas repetitivas, ou podem ser importadas prontas para o programa em forma de bibliotecas.

Declaração da Função toda função deve ser declarada antes de ser chamada atribuindo-lhe um tipo e um nome seguido de parênteses, onde serão colocados os parâmetros de passagem da função. Depois do nome são definidos entre as chaves ‘ { ‘e ‘} ‘os procedimentos que a função vai executar.

setup( ): Essa é a primeira função a ser chamada quando o programa inicia. E é executada apenas nessa primeira vez. Esta é uma função de preparação: ela dita o comportamento dos pinos do Arduino e inicializa a porta serial.

loop( ): A função loop( ) é chamada logo a seguir e todas as funções embarcadas nela são repetidamente executadas. Ela fica lendo os pinos de entrada do Arduino e comandando os pinos de saída e a porta serial.

w.revistadoarduino.com.br

João Alexandre da Silveirapágina 3

Exemplo:

/* Nesse código a função setup( ) ativa a porta serial em 9600 bits/s e a função loop( ) fica transmitindo a frase ‘Hello World!’ pela porta serial a cada 2 segundos. */

Serial.begin(9600);// inicializa a porta serial
delay(2000);

Serial.println(“ Hello World! “); // transmite frase }

A.1 - CONSTANTES E VARIÁVEIS

CONSTANTES são valores predefinidos que nunca podem ser alterados. Na linguagem C do Arduino são 3 os grupos de constantes; os dois componentes de cada grupo sempre podem ser representados pelos números binários 1 e 0.

TRUE/FALSE são constantes booleanas que definem estados lógicos. Verdadeiro é qualquer valor que não seja zero. Falso é sempre o valor zero.

HIGH/LOW essas constantes definem as tensões nos pinos digitais do Arduino. Alto é uma tensão de 5 volts; baixo o terra (ou 0 volt).

INPUT/OUPUT são constantes programadas pela função pinMode( ) para os pinos do Arduino; eles podem ser entradas (de sensores) ou podem ser saídas (de controle).

VARIÁVEIS são posições na memória de programa do Arduino marcadas com um nome e o tipo de informação que irão guardar. Essas posições podem estar vazias ou podem receber um valor inicial. Os valores das variáveis podem ser alterados pelo programa.

Escopo da Variável é o limite ou abrangência da variável. Uma variável pode ser declarada em qualquer parte do programa. Se for declarada logo no início, antes da função setup( ), ela tem o escopo de Variável Global, e porisso ela pode ser vista e usada por qualquer função no programa. Se declarada dentro de uma função ela tem o escopo de Variável Local, e só pode ser usada por essa função.

Declaração da Variável como as funções, toda variável deve ser declarada antes de ser chamada. Essa declaração consiste em atribuir previamente um tipo e um nome à variável.

Tipos de variáveis:

byte - esse tipo armazena 8 bits (0-255); int - armazena números inteiros de até 16 bits; long - armazena números inteiros de até 32 bits; float - variáveis deste tipo podem armazenar números fracionários de até 32 bits.

ARDUINO - Cartilha para Programação em C - Edição 1.0página 4 w.revistadoarduino.com.br

Exemplo:

/* Esse programa escrito em C do Arduino aumenta e diminui gradativamente o brilho de um LED conectado no pino PWM 10 do Arduino. */

int i=0;// declaração da variável global inteira i iniciada com 0
void ledOn( );// declaração da função criada ledOn do tipo void
void ledOn( ) {// função que acende o led
delay (10);

void setup( ) { pinMode(10,OUTPUT); // aqui 2 parâmetros são passados à função pinMode( ) } void loop( ) { for (i=0; i <= 255; i++) ledOn( ); // aumenta o brilho do led for (i=255; i >= 0; i--) ledOn( ); // diminui o brilho do led } analogWrite (10, i); // o nº do pino e o valor de i são passados à função analogWrite( ) }

A.2 - MATRIZES

MATRIZES são coleções de variáveis do mesmo tipo, portanto são posições na memória de programa, com endereços que podem ser acessados por meio de um identificador, chamado de índice. A primeira posição de uma matriz é sempre a de índice 0.

Declaração de uma Matriz I As matrizes, como as variáveis e as funções, devem ser declaradas com um tipo e um nome seguido de colchetes; e podem também ser inicializadas com os valores entre as chaves. Exemplo:

int nomeMatriz [ ] = { 16,32,64,128,};
matriz
int nomeMatriz [ 10 ] ; //nomeMatriz com dez 10
//posições para variáveis inteiras

Declaração de uma Matriz I Pode-se tambem declarar somente o tipo, o nome e o tamanho da matriz, deixando para o programa o armazenamento de variáveis nas posições, ou índices, da

Escrever/Ler uma Matriz Para guardar o inteiro 16 na 4ª posição da matriz nomeMatriz, usa-se: nomeMatriz [3] = 16;

Para atribuir o valor armazenado na 5ª posição de nomeMatriz à variável x: int x = nomeMatriz[4]; w.revistadoarduino.com.br

João Alexandre da Silveirapágina 5 A.3 - LÓGICA E ARITMÉTICA

Operações Aritméticas e lógicas as 4 operações aritméticas, divisão, multiplicação, adição e subtração, são representadas pelos símbolos: /, *, + e -, respectivamente, separando os operandos. E são 3 os operadores lógicos na linguagem do Arduino que são usados para comparar duas expressões e retornar a constante TRUE/ FALSE.

Símbolos compostos são aqueles que combinam os símbolos aritméticos entre si e com o sinal de atribuição: x ++ // x=x+1 x -- // x=x-1 x += y // x=x+y x -= y // x=x-y x *= y // x=x*y x /= y // x=x/y

Operadores de comparação comparam uma variável com uma constante, ou variáveis entre si. São usados para testar se uma condição é verdadeira. x == y // x é igual a y x != y // x não é igual a y x < y // x é menor que y x > y // x é maior que y x <= y // x é menor ou igual a y x >= y // x é maior ou igual a y

Operadores lógicos são usados para comparar duas expressões, retornam 1 ou 0 (verdadeiro/falso). && AND porta lógica ‘E’ || OR porta lógica ‘OU’ ! NOT porta lógica NÃO

ARDUINO - Cartilha para Programação em C - Edição 1.0página 6 w.revistadoarduino.com.br

Função Exemplo Notas delay(ms) Essa função pausa o programa por um período em milissegundos indicado pelo parâmetro entre parênteses.

delay(1000); Com esse parâmetro o programa vai pausar durante 1 segundo (1000 ms).

Durante o período em que essa função está ativa qualquer outra função no programa é suspensa; é equivalente ao HALT em Assembly. Somente as interrupções de hardware podem parar essa função.

delayMicroseconds(us) Essa função pausa o programa por um período em microssegundos indicado pelo parâmetro entre parênteses.

delayMicrosec- onds(1000); Com esse parâmetro o programa vai pausar durante 1 ms (1000 us).

As mesmas observações acima para a função delay(ms) são válidas aqui.

millis( ) Retorna o número de milissegundos desde que o Arduino começou a executar o programa corrente.

long total = millis( ); Aqui a variável inteira longa (de 32 bits) ‘total’ vai guardar o tempo em ms desde que o Arduino foi inicializado.

Essa variável vai ser resetada depois de aproximadamente 9 horas.

random(min,max) Gera números pseudo-aleatórios entre os limites min e max especificados como parâmetros.

int valor = random(100,400); À variável ‘valor’ vai ser atribuido um número inteiro qualquer entre 100 e 400.

O parâmetro min é opcional e se excluído o limite mínimo é 0. No exemplo variável ‘valor’ poderá ser qualquer número inteiro entre 0 e 400.

abs(x) Retorna o módulo ou valor absoluto do número real passado como parâmetro.

float valor = abs(-3.14); À variável ‘valor’ vai ser atribuído o número em ponto flutuante (e sem sinal) 3.14.

map(valor,min1,max1,min2,max2) A função map( ) converte uma faixa de valores para outra faixa. O primeiro parâmetro ‘valor’ é a variável que será convertida; o segundo e o terceiro parâmetros são os valores mínimo e máximo dessa variável; o quarto e o quinto são os novos valores mínimo e máximo da variavel ‘valor’.

int valor = map(analog Read(A0),0,1023,0,255)); A variável ‘valor’ vai guardar a leitura do nível analógico no pino A0 convertida da faixa de 0-1023 para a faixa 0-255.

Com essa função é possível reverter uma faixa de valores, exemplo: int valor = map(x,1,100,100,1);

A.4 - FUNÇÕES MATEMÁTICAS E DE TEMPO w.revistadoarduino.com.br

João Alexandre da Silveirapágina 7

A.5 - FUNÇÕES PARA CONTROLE DE FLUXO if é um controle de fluxo usado para selecionar uma ou mais instruções baseado no resultado de um teste de comparação. Todas as instruções entre as chaves { e } são executadas somente se o resultado desse teste for verdadeiro; se não, essas instruções não são executadas. Verdadeiro é qualquer resultado, mesmo negativo, diferente de zero. Falso é um resultado zero.

if (expressão) { bloco de instruções; // se ‘expressão’ for verdadeira, ‘bloco de instruções’ é executado } if...else Ao se acrescentar mais um bloco de instruções no loop do comando if pode-se criar o comando if...else, para fazer um teste novo quando o resultado da expressão for falsa.

if (expressão) { bloco de instruções1; // se ‘expressão’ for verdadeira, ‘bloco de instruções1’ é executado } else { bloco de instruções2; // se ‘expressão’ for falsa, ‘bloco de instruções2’ é executado } da instrução anterior para a próxima instrução

NÃO O comando if...else

EXPRESSÃO

é verdadeira? da instrução anterior para a próxima instrução

NÃO O comando if

EXPRESSÃO

é verdadeira?

BLOCO DE INSTRUÇÔESBLOCO DEINSTRUÇÔES 1BLOCO DE INSTRUÇÔES 2

ARDUINO - Cartilha para Programação em C - Edição 1.0página 8 w.revistadoarduino.com.br switch...case É possível ir inserindo comandos if...else na posição do segundo bloco de instruções de outro comando if...else e assim criar uma cadeia de comandos para testar dezenas de expressões até encontrar uma que retorne um resultado verdadeiro e executar um dos blocos de instruções; mas existe um comando próprio que simplifica bastante essa seleção, é o comando switch... case. Esse comando permite comparar uma mesma variável inteira, ou uma expressão que retorne um inteiro, com vários valores possíveis.

if...else if E de novo ao se acrescentar agora o comando if...else no loop do comando if podese criar mais um outro comando, o if...else if. No exemplo abaixo se ‘expressão1’ for verdadeira o ‘bloco de instruções1’ é executado; se ‘expressão1’ for falsa mas expressão2 for verdadeira ‘bloco de instruções2’ é executado; e se ‘expressão1’ e ‘expressão2’ forem falsas o ‘bloco de instruções3’ é executado.

O comando if...else ifda instrução anterior para a próxima instrução

EXPRESSÃO 1

é verdadeira?

EXPRESSÃO 2

é verdadeira?

BLOCO DE INSTRUÇÔES 3

BLOCO DE INSTRUÇÔES 1

BLOCO DE INSTRUÇÔES 2

O comando switch...case para a próxima instrução é 3 ? é 2 ? da instrução anterior

(Parte 1 de 3)

Comentários