Aprenda a programar o Arduino – Parte I

Esse será o primeiro post de uma série onde pretendo ensinar a programar o Arduino. Esse tutorial leva em conta que você ja tenha instalado e configurado a ide do Arduino na sua máquina e que você já saiba ao menos o qué é o Arduino, algum conhecimento prévio de programação e bem vindo!

Primeiro programa no Arduino

Vamos fazer agora um programa que não serve literalmente para nada!  Simplesmente vamos ver o que é obrigatório para o código poder roda veja abaixo:

/*                               Codigo Exemplo Numero 1*****************************************************************
Aprenda a programar o Arduino – Primeiros PassosAutor: Anthony Collucci
Data: 04/02/2012
******************************************************************/
void setup(){
  /* O setup é uma estrutura obrigatória, ele é utilizado para definirmos a
função (i/o) dos pinos do Arduino, serve tambem para inicializarmos
algumas bibliotecas.   */
}
 
void loop(){
  /* O loop tambem e uma estrutura obrigatória, ele executa o codigo
entre {} em ciclos infinitos e repetitivos.  */
}

No exemplo acima utilizamos as duas estruturas básicas Setup() e Loop() que são duas funções como veremos mais adiante. O texto entre “/* */” é simplesmente um comentário ele não afeta em nada a execução do programa, é interessante que o comentário exista para facilitar a leitura e manutenção do código, mas deve -se evitar seu uso em excesso para não diminuir a legibilidade do código com muitas quebras. Isso aí e uma coisa que você vai adquirindo com o tempo!!!

Quando você compilar deve receber um resultado como esse:

Binary sketch size: 674 bytes (of a 126976 byte maximum)

Esse resultado indica qual o tamanho do arquivo e que ele foi compilado com sucesso.

Repare que se você utilizar o seguinte codigo:

void setup(){
}
void loop(){
}

O tamanho do arquivo gerado será o mesmo indicando que os comentários são ignorados após a compilação. Agora atente para o codigo abaixo digite-o e compile:

Void setup(){
}
Void loop(){
}
 

O seguinte erro será exibido:

sketch_feb04a:-1: error: ‘Void’ does not name a type
sketch_feb04a:0: error: ‘Void’ does not name a type
sketch_feb04a:1: error: ‘Void’ does not name a type
sketch_feb04a:5: error: ‘Void’ does not name a type

Isso indica que o “Void” não e um tipo válido para uma váriavel ou função, isso ocorre porque a linguagem usada no arduino e baseada no c/c++ que são linguagens case sensitive.

Começando a brincar com variáveis e comunicação serial

Em todo tutorial de Arduíno que encontram o primeiro exemplo é o do Led Blink, porém acho uma abordagem totalmente inútil, pois ela realmente não ensina nada… Vou começar por outro caminho. Vamos iniciar a comunicação serial e escrever o conteudo de uma váriavel na no console.

Digite esse codigo em sua IDE:

/*
Codigo Exemplo Numero 2

*****************************************************************
Aprenda a programar o Arduino – Primeiros Passos

Autor: Anthony Collucci
Data: 04/02/2012

*****************************************************************
*/
void setup(){
//Inicia a comunicação serial a 9600 bauds
Serial.begin(9600);

}

void loop(){
// Envia a string “Aprendendo a programar no arduino” para a console
Serial.print(“Aprendendo a programar no arduino”);
}

Agora acesse a serial monitor conforme a figura abaixo:

Arduino Serial Monitor
Abrindo o Serial Monitor- Opening the Serial Monitor

O resultado como se segue e uma sucessão de impressões da string “Aprendendo a programar no arduino”. Vimos que iniciamos a comunicação serial através do comando serial.begin(9600) que colocamos dentro do setup(){} . O  valor de 9600 pode variar dependendo da sua aplicação veja mais sobre velocidade da porta serial nesse post:

http://www.tech-faq.com/difference-between-bit-rate-and-baud-rate.html

O comando Serial.print(“string aqui”) que faz com que a informação seja impressa no serial monitor. Adiante veremos outros exemplos do uso do Serial.print, mas por ora quero que reparem que todo comando que não constroí um bloco (não tem “chaves” como o setup e o loop) ou então que não e uma diretiva de pré-processador (#include, #define que veremos adiante tambem)  termina com ponto e vírgula, isso indica o fim do comando.

Digite agora o código abaixo, e veremos um exemplo de uso de váriavel:

/*
Codigo Exemplo Numero 3

*****************************************************************
Aprenda a programar o Arduino – Primeiros Passos

Autor: Anthony Collucci
Data: 04/02/2012

*****************************************************************
*/

/* Podemos declarar uma variavel por linha */
int a;
int b;

/* Ou podemos declarar diversas variaveis por linha */
int c,d;

void setup(){
//Inicia a comunicação serial a 9600 bauds
Serial.begin(9600);
a = 2;
b = 3;
}

void loop(){
// Observe o \n ele e um escape de new line, ou seja muda a linha
Serial.print (“Aprendendo a programar no Arduino \n”);
/* Veja como e facil fazer operações com o arduino, as variaveis
c e d receberao os valores da soma e multiplicação de a e b.*/
c=a+b;
d=a*b;
/* depois de efetuado o calculo imprimimos o valor na console */
Serial.print (“O valor da soma de a e b é: “);
Serial.print (c);
Serial.print (“\n”);
Serial.print (“O valor da multiplicação de a e b é: “);
Serial.print (d);
Serial.print (“\n”);
delay (1000);
}

Agora começamos a complicar um pouquinho mais o nosso código =]. Mas o que fizemos e muito simples criamos 4 variaveis a,b,c,d que são do tipo int ou seja podem receber números inteiros. Depois dentro do setup iniciamos a comunicação serial e atribuimos valores para as variaveis a e b. Dentro do loop, nós realizamos a operação de soma de “a” e “b” e colocamos o resultado na variável “c” depois realizamos a operação de multiplicação da váriavel “a” e “b” e colocamos na variavel “d”, por ultimo usamos o Serial.print e imprimimos o resultado na console. O comando delay (1000) faz com que haja um espera de um segundo entre uma repetição e outra.

Boas práticas…

Vamos agora dar uma olhada em alguns trechos do código e torna-los mais “profissional”. Nesse post só vou tratar da diminuição do tamanho do programa realizando o tratamento de variáveis e tornando assim o codigo mais limpo rápido e menor.

No exemplo 3 a IDE nos retorna a seguinte mensagem:

Binary sketch size: 4326 bytes (of a 126976 byte maximum)

Agora vamos analisar alguns trechos do código e realizar alterações.

As seguintes linhas:

/* Podemos declarar uma variavel por linha */
int a;
int b;

/* Ou podemos declarar diversas variaveis por linha */
int c,d;

serão alteradas para

/* Declaração de constantes */

const unsigned int a = 2;
const unsigned int b = 3;

/* Declaração de variáveis. */

int c,d;

e as seguintes linhas serão deletadas:

a = 2;
b = 3;

Por quê realizamos essas alterações? Simples, você deve ter notado que os valores de “a” e “b” nesse código são constantes ou seja não se alteram durante a execução do programa, então não deixamos um espaço de memória alocada para uma variável do tipo int, simplesmente declaramos diretamente seu valor. O comando “const” declara ela como constante. E como no exemplo o sinal dos operadores não influencia ja que são ambos positivos, nos suprimimos ele com o “unsigned”.

Quando voce compilar vair obter o seguinte resultado:

Binary sketch size: 4274 bytes (of a 126976 byte maximum)

Economizamos 52 bytes  vamos prosseguir. No exemplo abaixo ja fazemos algumas alterações substanciais no código:

/*
Codigo Exemplo Numero 3.1

*****************************************************************
Aprenda a programar o Arduino – Primeiros Passos

Autor: Anthony Collucci
Data: 04/02/2012

*****************************************************************
*/

/* declaramos as constantes */
const unsigned int a = 2;
const unsigned int b = 3;

/*declarmos a variavel resultado*/
unsigned int res;

void setup(){
//Inicia a comunicação serial a 9600 bauds
Serial.begin(9600);

}

void loop(){
// Observe o \n ele e um escape de new line, ou seja muda a linha
Serial.print (“Aprendendo a programar no Arduino \n”);
/* Veja como e facil fazer operações com o arduino, as variaveis
c e d receberao os valores da soma e multiplicação de a e b.*/

//imprimimos primeiro o valor da soma
res=a+b;
Serial.print (“O valor da soma de a e b é: “);
Serial.print (res);
Serial.print (“\n”);
//depois o valor da multiplicação
res=a*b;
Serial.print (“O valor da multiplicação de a e b é: “);
Serial.print (res);
Serial.print (“\n”);
delay (1000);
}

Reduzir o numero de váriaveis não reduziu o código, mas aplicar o “unsigned” foi efetivo. A vantagem de diminuir as váriaveis e que seu codigo usa menos memória ram. Agora o resultado foi esse:

Binary sketch size: 4172 bytes (of a 126976 byte maximum)

Acabamos de economizar 154 bytes.

Por ultimo reduzindo o escopo das variaveis conseguimos reduzir ainda mais o tamanho do código:

Retiramos as linhas abaixo que estavam acima do setup(){}

/* declaramos as constantes */
const unsigned int a = 2;
const unsigned int b = 3;

/*declarmos a variavel resultado*/
unsigned int res;

E recolocamos dentro do loop:

void loop(){
/* declaramos as constantes */
const unsigned int a = 2;
const unsigned int b = 3;

/*declarmos a variavel resultado*/
unsigned int res;

O novo resultado foi:

Binary sketch size: 4140 bytes (of a 126976 byte maximum)

Ou seja conseguimos 182 bytes de redução no código. Essa técnica é bem criticada por muitos programadores, já houve um caso que quase fui crucificado aqui no blog, e o assunto foi tão polêmico que preferi retirar a matéria. Mas ela é uma técnica muito válida quando temos um projeto complexo a ser feito no Arduino, normalmente em projetos complexos temos de incluir várias bibliotecas, que por si só ja impactam o tamanho do programa, não precisamos então agravar isso criando programas ruins!

Bom em breve postarei a continuação desse post. Espero que ele tenha sido útil!

Att,
Anthony Collucci

22 ideias sobre “Aprenda a programar o Arduino – Parte I”

  1. Poxa.. Aqui a compilação fica Ok, tudo certinho.. Mas não aparece nada no serial monitor :/

    P.S.: Estou usando notebook, será que isso interfere?

  2. Boa noite
    a seguinte linha >> Serial.print(“Aprendendo a programar no arduino”);
    aqui no meu pc esta dando erro na hora de compilar. Estou usando win8
    tem noção do que poderia ser ?
    att

  3. Anthony Collucci, obrigado pelo site. Parabéns pelo trabalho.
    Veja, sou iniciante com arduíno.
    Estou estudando programação pelo seu site. Eu copiei o código (do ex2) e obtive a seguinte resposta da IDE após ela verificar: “stray ‘\’ in program”. O que isso quer dizer?

    Em outro código (semelhante ao ex2), ele verificou, mas não consegui ver a mensagem no Monitor serial do meu pc. Ele emitiu a seguinte mensagem de erro:

    “Serial Port ‘COM12’ not found. Did you selected

  4. Olá, parabéns pelo trabalho com site.
    Anthony Colluci, eu tentei rodar o seu ex2 e obtive a seguinte mensagem de erro:
    “stray ‘\’ in program bem na linha do códico “Serial.print(“Aprendendo a programar com arduino”);”. O que está errado? Como corrigir?

    Neste outro código, semelhante ao do ex2:
    void setup()
    {
    Serial.begin(9600);

    }

    void loop()
    {
    Serial.print(“Hello world!”);

    o compilador não acusa erro.
    Mas depois do upload o IDE acusa essa mensagem de erro: “Serial port ‘COM12’ not found. Did you selected the right one from the Tools > Serial Port menu?”
    Qual é o erro neste caso?
    Depois disso, quando eu aperto no Serial Menu para ver o resultado no meu pc, ele não aparece e o IDE acusa estes erros na sequência do passado:

    at processing.app.Serial.(Serial.java:191)
    at processing.app.Serial.(Serial.java:77)
    at processing.app.debug.Uploader.flushSerialBuffer(Uploader.java:77)
    at processing.app.debug.AvrdudeUploader.uploadViaBootloader(AvrdudeUploader.java:174)
    at processing.app.debug.AvrdudeUploader.uploadUsingPreferences(AvrdudeUploader.java:67)
    at processing.app.Sketch.upload(Sketch.java:1671)
    at processing.app.Sketch.exportApplet(Sketch.java:1627)
    at processing.app.Sketch.exportApplet(Sketch.java:1599)
    at processing.app.Editor$DefaultExportHandler.run(Editor.java:2380)
    at java.lang.Thread.run(Thread.java:619)

    O que está errado?
    Poderia me Ajudar?

    Agradeço desde já,
    Matheus Alvarenga.

  5. Esta dando varios erros na hora de abrir o serial monitor, e agor esse erro aqui “error: ‘u201c'” que não descobri o porque ainda.

    DigitalReadSerial:15: error: stray ‘\’ in program
    DigitalReadSerial:15: error: stray ‘\’ in program
    DigitalReadSerial.ino: In function ‘void loop()’:
    DigitalReadSerial:15: error: ‘u201c’ was not declared in this scope

    1. Você deve ter copiado e colado direto correto? Algumas vezes da um erro na ide e o caracter (“) é inserido como se fossem duas aspas simples. Substitua esse caracter por aspas duplas e tente novamente.

      att,

  6. Olá pessoal!!! Queria a ajuda de vcs, será que tenho como desligar meu arduino e fazer com que ele volte no local de onde parou, que dizer, se tiver saidas acionadas no momento, se tem como retornar com elas ligadas. Obrg.

  7. Desculpe a ignorância, mas sem o arduino é possível compilar aquele programinha que “printa” na tela a mensagem? Ou ele só funciona se for compilado lá dentro?

  8. Sabe me dizer como fazer o arduino receber uma palavara, por exemplo: desligaRele01…?
    Quando coloco String recebe; a IDE não compila…

  9. o que esta mal no codigo

    int led1 = 13;
    int botao1 = 3;
    int EstadoBotao1 = 0;
    int led2 = 12;
    int botao2 = 2;
    int EstadoBotao2 = 0;
    int led3 = 11;
    int botao3 = 1;
    int EstadoBotao3 = 0;

    void setup() {
    pinMode(led1, OUTPUT);
    pinMode(led2, OUTPUT);
    pinMode(led3, OUTPUT);
    pinMode(botao1, INPUT);
    pinMode(botao2, INPUT);
    pinMode(botao3, INPUT);
    }

    void loop() {
    EstadoBotao1 = digitalRead(botao1 );
    EstadoBotao2 = digitalRead(botao2 );
    EstadoBotao3 = digitalRead(botao3 );
    if(EstadoBotao1 == HIGH)digitalWrite(led1, HIGH);
    else { digitalWrite(led1, LOW);
    if(EstadoBotao2 == HIGH)digitalWrite(led2, HIGH);
    else { digitalWrite(led2, LOW);
    if(EstadoBotao3 == HIGH)digitalWrite(led3, HIGH);
    else { digitalWrite(led3, LOW);
    }
    if (botao2) LOW = (botao3) HIGH (botao1)HIGH)
    if (botao1) LOW = (botao3) HIGH (botao2) HIGH)
    if (botao1) LOW (botao2) LOW = (botao3) HIGH)

    me responda rapidinho

Deixe uma resposta

O seu endereço de e-mail não será publicado. Campos obrigatórios são marcados com *

Please type the characters of this captcha image in the input box

Por favor, digite os caracteres desta imagem na caixa de entrada