Conceitos do Projeto Arduino
Por Antônio Cruvinel
O que é arduino?
É uma plataforma de hardware e softwares livres que torna acessível a prototipagem de projetos de eletrônica. O hardware é um computador completo com microprocessador, memórias e entradas/saídas analógicas/digitais com o qual podemos controlar LEDs, motores, capturar dados de sensores, dentre outras coisas! A linguagem é baseada em C/C++ e sua biblioteca padrão é bastante completa.
Meu Primeiro Tutorial de Arduino.
Para entendermos um pouco mais!
Arduino é um computador físico baseado numa simples plataforma código livre de hardware, projetada com um microcontrolador de placa única, com suporte de I/O embutido e uma linguagem de programação padrão, na qual tem origem em Wiring e é essencialmente C/C++ (Com várias pequenas modificações antes de ser transformada em avrgcc)
Uma plataforma eletrônica opensource ideal para quem quer receber dados do ambiente como sensores de temperatura, luz e atuar pequenos motores criando interação.
Toda programação é baseada em uma linguagem recentemente nova também, chamada processing. Todavia pode ser utilizado outras linguagens como Max/MSP, Pure Data, SuperCollider, ActionScript e Java.
No ambiente de desenvolvimento existe também várias funções que facilitam o desenvolvimento de qualquer programa, do mais simples ao complexo, alem também de bibliotecas prontas para facilitar o interfaceamento com outros hardwares.
O objetivo do projeto é a criação de sistemas de controle que permitam o manuseio por pessoas sem a necessidade de entendimento de procedimentos complexos. Uma típica placa Arduino é composta por um controlador, linhas de I/O digital e analógica, além de uma interface serial ou USB para interligarse ao hospedeiro, que é usado para programálo e interagilo.
Os módulos de Arduino (Shield) possibilitam acoplamento de funcionalidades como interface de rede, buffers para ligação de motores, relés, sensores e demais possibilidades.
O Hardware é montado normalmente por um microcontrolador Atmel AVR e pode ser extendido por outros componentes ou ferramentas. Desta forma permite a interligação de vários projetos em paralelo.
Inicado na Itália em 2005, o projeto Arduino visava que cada usuário montasse sua própria placa. Atualmente é facilmente encontrado projetos prontos que facilitam muito a vida dos usuários iniciantes.
O sucesso do projeto Arduino foi sinalizado com o recebimento de uma menção honrosa na categoria Comunidades Digitais em 2006, pela Prix Ars Electronica, além da marca de mais de 50.000 placas vendidas até outubro de 2008.
Alguns conceitos de programação
Para começarmos o primeiro projeto precisamos de ter uma pequena noção de programação.
Função Void
Em inglês, void quer dizer vazio e é isto mesmo que o void é. Este tipo de função permite permite fazer funções que não retornam nada e funções que não têm parâmetros. Desta forma podese criar estruturas que não necessitam de dar retorno a si mesmo ou a outras funções. void nome_da_função (declaração_de_parâmetros); Numa função, como a acima, não temos valor de retorno na declaração return. Podemos, também, fazer funções que não têm parâmetros: tipo_de_retorno nome_da_função (void); ou, ainda, que não tem parâmetros e não retornam nada: void nome_da_função (void); Um exemplo de funções que usam o tipo void: #include <stdio.h> void Mensagem (void); int main () { Mensagem(); printf ("\tDiga de novo:\n"); Mensagem(); return 0; } void Mensagem (void) { printf ("Ola! Eu estou vivo.\n"); }
Se quisermos que a função retorne algo, devemos usar a declaração return. Se não quisermos, basta declarar a função como tendo tipoderetorno void. Devemos lembrar agora que a função main() é uma função e como tal devemos tratála. O compilador acha que a função main() deve retornar um inteiro. Isto pode ser interessante se quisermos que o sistema operacional receba um valor de retorno da função main(). Se assim o quisermos, devemos nos lembrar da seguinte convenção: se o programa retornar zero, significa que ele terminou normalmente, e, se o programa retornar um valor diferente de zero, significa que o programa teve um término anormal. Se não estivermos interessados neste tipo de coisa, basta declarar a função main como retornando void. As duas funções main() abaixo são válidas: main (void) { .... return 0; } void main (void) { .... }
A função Void Setup
void setup() { // Escreva o código que será executado apenas uma vez. }Função Void loop
Void loop() { // Escreva o código que será executado infinitas vezes }Função setup()
Para a execução de uma função no código que permita execução do código uma única vez quando o microcontrolador for energizado ou no momento em que este seja reiniciado.
Esta função deve ser utilizada para: o Iniciar variáveis.
o O modo como os pinos devem operar: entrada(INPUT) ou saída(OUTPUT) o Bibliotecas. o Cabeçalhos
Função loop()
Esta função tem o propósito fundamental de repetir infinitamente o que está escrito. Seu prinicpal propósito é que a repetição indefinida dos comando que estão dentro desta função. Desta forma a função loop() repetirá indefinidamente o comando. A função setup() determinará o que seu sistema suporta.Comentários
Para fazer comentários no código utilizamos // (duas barras invertidas). O objetivo desta boa prática de programação é permitir o entendimento do código em futuras manutenções pelo próprio desenvolvedorr ou por outros desenvolvedores. Todos os comentários são descartados no momento da compilação do sistema.Aula 1 – Piscando um LED
Para este projeto será preciso um LED , um resistor e fios e uma matriz de contatos:
De quais componentes precisaremos:
O LED:
LED é a sigla em inglês para Light Emitting Diode, ou Diodo Emissor de Luz.O LED é um diodo semicondutor (junção PN) que quando energizado emite luz visível. A luz normalmente é monocromática e é produzida pelas interações energéticas dos elétrons. O processo de emissão de luz pela aplicação de uma fonte elétrica de energia é chamado eletroluminescência. Em qualquer junção PN polarizada diretamente, dentro da estrutura, próximo à junção, ocorrem recombinações de lacunas e elétrons. Essa recombinação exige que a energia possuída por esse elétron, que até então era livre, seja liberada, o que ocorre na forma de calor ou fótons de luz.
que o polo positivo possui uma perna maior. Alguns Leds apresentam o polo negativo com um chanfro(parte ligeiramente plana) no seu encapsulamento. No Arduino temos os pinos: VCC(+) GND ou Ground como (). Por ser um diodo, um LED funcionará corretamente apenas se ligarmos ele da forma correta.
O RESISTOR:
Resistores são componentes que tem por finalidade oferecer uma oposição à passagem da corrente elétrica, através de seu material. A essa oposição damos o nome de resistência elétrica, que possui como unidade o Ohm (Ω). Os resistores são classificados em dois tipos: fixos e variáveis. Os resistores fixos são aqueles cuja resistência não pode ser alterada, enquanto as variáveis têm a sua resistência modificada dentro de uma faixa de valores por meio de um cursor móvel
As faixas de cores determina quanto é maior essa resistência.
A MATRIZ DE CONTATOS
A matriz de contatos possui apenas pontos interligados num sentido vertical. O que permite combinar e interligar os componentes rapidamente.
Veja na imagem abaixo duas fileiras independentes("A" e "B") com seus respectivos pontos interligados.
Os
fios
Para este projeto utilizaremos um modelo de fiação já previamente preparada que permite fácil conexão e que permite ligações seguras e com rapidez.
A Montagem
Vamos montar o circuito:
Para fazermos o nosso projeto funcionar corretamente devemos desenvolver o código para que possamos inserilo no hardware. Assim devemos abrir a interface do arduino para desenvolvimento do código: Em seguida devemos escrever o código: /*Programa pisca led */ void setup() {
pinMode(12, OUTPUT); //Declara que o pino 12 do arduino é de Saída. Assim ele será energizado.
}
void loop() {
digitalWrite(12, HIGH); // Energiza o pino 12 do arduino. Logo LED estará ligado delay(1000); // Espera por 1s
digitalWrite(12, LOW); // Desenergiza o pino 12 do arduino está . Logo o LED desligará. delay(1000); // Espera por 1s }
Comentários sobre o código:
Comentando o código: digitalWrite(12,HIGH); diz que o pino 12 é o polo + que alimenta o LED. Logo há um polo(+) e outro () e o Led liga pois é possível fluir a energia. digitalWrite(12,LOW); diz que o pino 12 é o pólo logo não há fluxo de energia com dois polos() e o LED fica desligado. delay(1000); No arduino trabalhamos com milésimo de segundos assim 1000 quer dizer 1 segundo. Altere o parâmetro de delay para 100 e depois para 5000 para ver qual a diferença.Utilizando o comando Random
/*Programa pisca led */ void setup() {pinMode(12, OUTPUT); //Declara que o pino 12 do arduino é de Saída. Assim ele será energizado.
}
void loop() {
delay(random(100)); // Espera por 1s
digitalWrite(12, LOW); // Desenergiza o pino 12 do arduino está . Logo o LED desligará. delay(random(100)); // Espera por 1s } o comando random() gera números aleatórios. Mas ao inserir um valor como 100 em random() estamos informando que o número deve variar entre 0 e 99 Desta forma temos um comportamento inesperado no piscar do LED, o que gera um efeito interessante.
Aula 2 – Exercícios com LED
Montar na a matriz de contatos conforme orientação abaixo:
Atenção é importante notar que os LEDs devem estar ligados um paralelo com o outro e com polos opostos.
O resistor pode ser de outro valor como 330R ou 470R, a modificação altera no brilho do LED.
O código do programa:
/* teste com LEDs */ int ledPin1 =11; int ledPin2 =10; void setup() { pinMode(ledPin1, OUTPUT); pinMode(ledPin2, OUTPUT); } void loop() { digitalWrite(ledPin1, HIGH); digitalWrite(ledPin2, LOW); delay(1000); }Sobre o Software:
Como temos o LedPin1 em estado HIGH(LIGADO, 5V) e o LedPin2 no estado LOW(Baixo, 0V) temos um fluxo de elétrons em um sentido. Como o LED é um
diodo e como tal permite apenas a passagem de corrente em um sentido(LED é polarizado) temos apenas um Led ligado.
Modificando o Software:
/* teste com LEDs */ int ledPin1 =11; int ledPin2 =10; void setup() { pinMode(ledPin1, OUTPUT); pinMode(ledPin2, OUTPUT); } void loop() { digitalWrite(ledPin1, LOW); digitalWrite(ledPin2, HIGH); delay(1000); }Sobre o Software modificado:
Com a Mudança do HIGH para o LOW no LedPin1 e LedPin2 temos o outro Led ligado.
/* teste com LEDs */ int ledPin1 =11; int ledPin2 =10; void setup() { pinMode(ledPin1, OUTPUT); pinMode(ledPin2, OUTPUT); } void loop() { digitalWrite(ledPin1, HIGH); digitalWrite(ledPin2, LOW); delay(1000); digitalWrite(ledPin1, LOW); digitalWrite(ledPin2, HIGH); delay(1000); } Comentário deste código:
Temos agora um pisca LED do tipo que tem em estacionamentos de carro. Em determinado tempo temos um fluxo de energia num sentido que liga um LED e em outro momento temos um fluxo em sentido contrário que liga o outro LED.
Acrescentando um botão
Adicionar um botão e um resistor 220k. Clicar na imagem para ampliar.Modificando novamente Software:
/* teste com LEDs */ int ledPin1 = 11; int ledPin2 = 10; int Botao1 = 7; int val=0; void setup() { pinMode(ledPin1, OUTPUT); pinMode(ledPin2, OUTPUT); pinMode(Botao1, INPUT); } void loop() { val = digitalRead(Botao1); if(val==LOW) { digitalWrite(ledPin1, HIGH); digitalWrite(ledPin2, LOW); } else{ digitalWrite(ledPin1, LOW); digitalWrite(ledPin2, HIGH); } } Comentário deste novo código: É feita a leitura do botão e uma condição é criada: 1° Caso o botão não esteja pressionado o LedPin1 deve estar ligado.
2° Caso contrário o LedPin2 deve ficar ligado. Então quando não pressionamos o botão o LED Vermelho indica que está desligado e quando pressionamos o LED Verde indica que está ligado. Tratase então de uma chave que indica quando o seu aparelho está sendo usado ou não.
Aula 3 – Comunicação
Nesta etapa vamos aprender como fazer a comunicação do computador com o sistema microcontrolado. Assim vamos montar o seguinte circuito para entendermos o que vamos realizar. O programa a seguir apresenta a novidade de um monitor para controle de ações no microcontrolador. O material necessário será o Arduino, um led, um resistor, fios, e a matriz de contatos
O código do programa:
/* controlando um led */ int ledPin = 13; void setup() { Serial.begin(9600); // inicializa a porta serial para possibilitar a comunicação entre o computador e o Arduino pinMode(ledPin, OUTPUT); //informa que a variável ledPin é do tipo saída }void loop() { char tecla; //cria a variável de nome tecla do tipo char chamada tecla tecla = Serial.read(); // armazena na variável "tecla" o retorno da função read(). Leitura do que foi escrito na porta serial if(tecla == 'l') //verifica se a o que foi digitado é igual a letra l. Se for igual entra na condição e liga o led { digitalWrite(ledPin, HIGH); //liga o LED } else // se não if(tecla == 'd') //verfica se a tecla digitada é igual a letra d. Se for igual entra na condição. { digitalWrite(ledPin, LOW); //desliga o led } delay(1000); // aguarda 1 segundo } Após compilar e fazer o upload, clicar no ícone – Serial Monitor Aparecerá a seguinte tela:
Na primeira linha você irá digitar o comando e clicar no ícone enviar (send). Exemplo 2:
O código do programa:
/* Monitora botoeira*/ int BotaoPino = 7; // pino a ser lido int val= 0; // cria e inicializa a variável Val com o valo zero int i=0; // cria e inicializa a variável i com o valor zeroint i2=0; // cria e inicializa a variável i2 com o valor zero void setup() { pinMode(BotaoPino, INPUT); // define que BotaoPino é uma variável de entrada Serial.begin(9600); // inicializa a porta serial } void loop() { val= digitalRead(BotaoPino); //a variável Val recebe o valor de BotaoPino delay(1000); //Aguarda 100 milesegundos if(val!=0) //Condicional – se o valor de Val for diferente de zero { Serial.print(i++); //porta serial recebe o valor da variável i mais 1 Serial.print(" A botoeira esta solta Valor:"); // a porta serial recebe o texto “Valor:” Serial.println(val); // a porta serial recebe o valor da variável val } else { Serial.print(i2++); //porta serial recebe o valor da variável i mais 1 Serial.print(" A botoeira foi apertada Valor:"); // a porta serial recebe o texto “ Valor:” Serial.println(val); // a porta serial recebe o valor da variável val } }
Comentário sobre o Programa e o Circuito:
O programa faz a leitura constantemente do botão e exibe se detectou nível lógico alto (1) ou baixo(0) o seu valor na tela informando que detectou a alteração do estado. Os Resistores são para manter o nível lógico alto sem permitir quando a botoeira é apertada.
Exemplo 3
Controlando Leds pelo Teclado Arduino Neste passo devese analisar como os dados são lidos pelo arduino e como controlar LEDs pelas teclas do computador. Montar o seguinte circuito:O código do programa:
/* Controle de Led no teclado */ int n; int pin7 = 7; int pin8 = 8; void setup() { Serial.begin(9600); //inicia a porta serial pinMode(pin7, OUTPUT); //define o pino 7 como saída pinMode(pin8, OUTPUT); //define o pino 7 como saída Serial.println("Automacao na Engenharia Agricola"); //título inicial Serial.println("Digite:\n 2Vermelho \n 3Verde \n 4Vermelho e Verde \n 5Apagar Todos"); //Orientacao inicial para o usuário }void loop() { if (Serial.available() >0) // recebendo dado do teclado { n = Serial.read(); // Armazena na variável n o valor digitado Serial.print("Voce digitou: \n"); Serial.println(n, BYTE); // Imprime na tela o valor do teclado em BYTE //testes condicionais if( n==50 ){ // 2vermelho digitalWrite(pin7,HIGH); //acender o led vermelho digitalWrite(pin8,LOW); //apaga o led verde } if(n==51){ // 3Verde digitalWrite(pin8,HIGH); //acender o led verde digitalWrite(pin7,LOW); //apaga o led vermelho } if(n==52){ // 4vermelho e Verde digitalWrite(pin8,HIGH); //acender o led verde digitalWrite(pin7,HIGH); //acender o led vermelho }
if(n==53){ // 5desliga LEDs digitalWrite(pin8,LOW); //apaga o led verde digitalWrite(pin7,LOW); //apaga o led vermelho } } }
Comentário sobre o Programa e o Circuito:
O programa inicia trazendo informações para o usuário. Faz a leitura constantemente da tecla no teclado, exibe o que o foi digitado e executa o comando correspondente.