Arduino

Arduino é uma plataforma flexível de código aberto (open-source) de projetos de eletrónica (hardware e software) de fácil utilização. É destinado a artistas, designers, hobbistas e qualquer pessoa interessada em criar objetos ou ambientes interativos.
Arduino verifica as condições externas ao receber a entrada de uma variedade de sensores e atua controlando luzes , motores e outros atuadores. O microcontrolador na placa é programado usando a linguagem de programação Arduino (baseada em Wiring) e o ambiente de desenvolvimento Arduino (baseada em processamento). Os projetos Arduino podem ser “stand-alone” ou podem comunicar com software processado em computador (por exemplo, Flash, Processing, MaxMSP). Em termos práticos, um Arduino é um pequeno computador que se pode programar para processar entradas e saídas entre o dispositivo e os componentes externos ligados. Pode ser interligado a LEDs, displays (mostradores) de matriz de pontos, botões, interruptores, motores, sensores de temperatura, sensores de pressão, sensores de distância, receptores GPS, módulos Ethernet ou qualquer outro dispositivo que emita dados ou possa ser controlado.

As placas podem ser construídas manualmente ou adquiridas pré-montadas; O software pode ser baixado gratuitamente. Os designs de referência do hardware (arquivos de CAD) estão disponíveis sob uma licença de código aberto, com permissão de adaptação às necessidades de cada um.

Arduino recebeu uma Menção Honrosa na seção Digital Communities section of the 2006 Ars Electronica Prix. Os fundadores do Arduino são:
Massimo Banzi, David Cuartielles, Tom Igoe, Gianluca Martino e David Mellis.
Página do projeto: Arduino
O Hardware pode ser adquirido num revendedor oficial e o software está disponível na página do arduino onde se pode fazer o download gratuitamente.

Placa Arduino

placa arduino
Placa Arduino UNO

A placa do Arduino é composta de um microprocessador Atmel AVR , um cristal ou oscilador (relógio simples que envia pulsos de tempo em uma frequência especificada, Arduino Básico 24 para permitir sua operação na velocidade correta) e um regulador linear de 5 volts. Dependendo do tipo de Arduino que utiliza, pode também ter uma saída USB,que permite conectá-lo a um PC ou Mac para upload ou recuperação dos dados. A placa expõe os pinos de entrada/saída do microcontrolador, para que exista a possibilidade de ligar a outros circuitos ou sensores.

A mais recente placa do Arduino, a Uno, difere das versões anteriores por não utilizar o chip FTDI, que converte o USB para a série. Em vez disso, utiliza um Atmega8U2, programado como um conversor USB para série. Isso confere à placa muitas vantagens quando comparada com a sua predecessora, a Duemilanove.
Primeiro, o chip Atmega é muito mais barato que o chip FTDI, diminuindo o preço das placas. Segundo, e mais importante, permite que o chip USB tenha seu firmware atualizado, para que o Arduino seja exibido em seu PC como outro dispositivo, tal como um mouse ou joystick de jogos. Isso abre uma série de novas possibilidades para o Arduino. Infelizmente, a mudança para o novo chip USB tornou muito mais difícil para fabricantes de clones criarem clones do Arduino Uno.
Pinos:

  • 14 pinos digitais de entrada ou saída (programáveis)
  • 6 pinos de entrada analógica ou entrada/saída digital (programáveis)
  • 5 pinos de alimentação (gnd, 5V, ref analógica)
  • 1 pino de reset
  • 2 pinos para ligar cristal oscilador

Hardware

arquitetura arduino
Arquitetura Arduino UNO

Fonte de alimentação

Recebe energia de alimentação externa, uma corrente de 300mA ou mais e uma tensão mínima de 7 Volts e máxima 35 Volts.
A fonte filtra e regula a tensão de entrada para duas saídas: 5 Volts e 3,3 Volts.

Microprocessador

Um microprocessador, basicamente, é constituído por um circuito integrado com a capacidade de executar instruções, sendo a sua velocidade de processamento determinada por um circuito que produz um determinado Clock (kHz, MHz ou GHz). O seu poder de processamento é afetado por características como Bits, quantidade de núcleos, arquitetura apresentada, tipo de instruções, entre outras. Como fator de grande importância tem-se ainda a existência de memória externa, onde estão armazenados os programas que serão executados.

Microcontrolador

Um microcontrolador, ao contrário de um microprocessador, é desenhado e construído 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.

Entradas/Saídas IN/OUT

Entrada (IN)

As entradas digitais podem ter o valor 1 (5V) ou 0 (0V).
As entradas analógicas possibilitam a verificação da tensão que está na porta, permitindo a leitura (0 a 5V) em 1024 níveis (1024 bits), com o valor máximo 1023 (4.955V) e o valor mínimo é 0 (0V).

Saída (OUT)

As saídas digitais podem ter uma tensão entre 0 e 1 (0=0V, 1=5V).

Funções Especiais

Porta Serie USART
Pino:0 recebe, Pino:1 envia

Podemos usar um pino para transmitir e um pino para receber dados no formato serie assíncrono (USART). Podemos ligar um módulo de transmissão de dados via bluetooth e comunicar com o Arduino remotamente.

PWM
Pinos: 3, 5, 6, 9, 10 e 11

Muitas vezes tratadas como saídas analógicas, na verdade são saídas digitais que vão gerar um sinal alternado (0 e 1) onde o tempo que o pino fica em nível 1 (ligado) é controlado. É usado para controlar velocidade de motores, ou gerar tensões com valores controlados pelo programa.

Comparador Analógico
Pinos: 6 e 7

Os dois pinos fazem a comparação entre as duas tensões externas sem a necessidade do programa para efetuar a leitura e comparação.

Porta SPI
Pinos: 10(SS), 11(MOSI), 12(MISO) e 13(SCK)

É um padrão de comunicação série síncrono mais rápido que o USART. Esta porta permite a ligação de cartões de memória (SD) para além de outros dispositivos.

Interrupção Externa
Pinos: 2 e 3

Existe a possibilidade de programar um pino para avisar o software sobre mudanças no seu estado. Podemos ligar um botão a esse pino, por exemplo, e cada vez que pressionado o programa a correr na placa é desviado para um bloco escolhido. É usado para detetar condições externas à placa.

Nível Lógico Arduino

nivel lógico
Nível Lógico Arduino

O valor de tensão para a leitura do nível lógico é:
Para placas de 5V, acima de 3V é nível ALTO;
Para placas de 3.3V acima de 3V é nível ALTO
Saída(OUTPUT): O nível 1 alto é, 3.3V para placas de 3.3, 5V para placas de 5V.
Entrada(INPUT): Quando a entrada não tem uma ligação, fica num estado de incerteza, para definir o estado alto ou baixo pode usar-se um resistor de 10K, forçando assim o estado para baixo ou alto se ligado à massa ou ao positivo no caso de não receber nenhum sinal.

Comparação Placas Arduino

Existem diversas placas arduino, a tabela seguinte permite uma rápida comparação entre elas.

DesignaçãoProcessadorTensão Alim.(V)
Input (V)
Velocidade
CPU
Analog
In/Out
Digital
IO/PWM
EEPROM
[KB]
SRAM
[KB]
Flash
[KB]
USBUART
Uno ATmega328 5 V/7-12 V 16 Mhz 6/0 14/6 1 2 32 Regular 1
Due AT91SAM3X8E 3.3 V/7-12 V 84 Mhz 12/2 54/12 - 96 512 2 Micro 4
Leonardo ATmega32u4 5 V/7-12 V 16 Mhz 12/0 20/7 1 2.5 32 Micro 1
Mega 2560 ATmega2560 5 V/7-12 V 16 Mhz 16/0 54/15 4 8 256 Regular 4
Mega ADK ATmega2560 5 V/7-12 V 16 Mhz 16/0 54/15 4 8 256 Regular 4
Micro ATmega32u4 5 V/7-12 V 16 Mhz 12/0 20/7 1 2.5 32 Micro 1
Mini ATmega328 5 V/7-9 V 16 Mhz 8/0 14/6 1 2 32 - -
Nano ATmega168 ATmega328 5 V/7-9 V 16 Mhz 8/0 14/6 0.5121 12 1632 Mini-B 1
Ethernet ATmega328 5 V/7-12 V 16 Mhz 6/0 14/4 1 2 32 Regular -
Esplora ATmega32u4 5 V/7-12 V 16 Mhz - - 1 2.5 32 Micro -
ArduinoBT ATmega328 5 V/2.5-12 V 16 Mhz 6/0 14/6 1 2 32 - 1
Fio ATmega328P 3.3 V/3.7-7 V 8 Mhz 8/0 14/6 1 2 32 Mini 1
Pro (168) ATmega168 3.3 V/3.35-12 V 8 Mhz 6/0 14/6 0.512 1 16 - 1
Pro (328) ATmega328 5 V/5-12 V 16 Mhz 6/0 14/6 1 2 32 - 1
Pro Mini ATmega168 3.3 V/3.35-12 V5 V/5-12 V 8 Mhz16Mhz 6/0 14/6 0.512 1 16 - 1
LilyPad ATmega168V ATmega328V 2.7-5.5 V/2.7-5.5 V 8 Mhz 6/0 14/6 0.512 1 16 - -
LilyPad USB ATmega32u4 3.3 V/3.8-5V 8 Mhz 4/0 9/4 1 2.5 32 Micro -
LilyPadSimple ATmega328 2.7-5.5 V/2.7-5.5 V 8 Mhz 4/0 9/4 1 2 32 - -
LilyPadSimpleSnap ATmega328 2.7-5.5 V/2.7-5.5 V 8 Mhz 4/0 9/4 1 2 32 - -

Programar o Arduino

Para programar o Arduino utiliza-se o IDE do Arduino, um software livre no qual se escreve o código na linguagem que o Arduino compreende (baseada na linguagem C). O IDE permite que escreva um programa de computador, que é um conjunto de instruções passo a passo, das quais se faz o upload para o Arduino. O Arduino poderá assim executar as instruções, Interagindo com o que estiver interligado. Na comunidade do Arduino, os programas são conhecidos como sketches(rascunho, ou esboço).

As duas principais partes (funções)de um programa desenvolvido para o Arduino são:

  • setup() Executa uma única vez. Neste bloco devem ser definidas algumas das configurações iniciais.
  • loop() Executa um ciclo indefinidamente. Função principal do programa.

O código deve ser inserido entre as "chavetas" com a seguinte estrutura
void setup()
{
O código é inserido aqui
}
void loop()
{
O código é inserido aqui
}

Todos os programas para arduino têm de incluir estas duas funções.

Limites do ARDUINO

Ao navegar pela internet com exemplos e aplicações, verifico que muitas delas estão acima dos limites tolerados pelos componentes. Basicamente, alguns circuitos podem funcionar uns minutos, umas horas ou até alguns dias até o arduino queimar. Existem limitações que devem ser respeitadas e é muito simples fazer o mesmo circuito mas deixar a operação dentro dos parâmetros normais. Deve-se ter atenção ao débito ou consumo colocado em cada pino, se a corrente exceder os limites vai dar problemas ao fim de algum tempo.
Os limites de corrente para o arduino são:

Máximos Absolutos:
Corrente DC por pino I/O: 40.0 mA
Corrente DC pinos VCC e GND: 200.0 mA

Limites Corrente entrada (Pin SOURCE Current Limitations)

Nota: Cada I/O pode receber mais do que as condições de teste (20mA a 5V) ou (10mA a 3V) em condições estáveis (non-transient), em funcionamento devem ser respeitados os seguintes limites

  • A soma de todas as correntes IOH, para as portas C0-C5, D0-D4, ADC7, RESET não pode exceder os 150mA
  • A soma de todas as correntes IOH, para as portas B0-B5, D5-D7, ADC6, XTAL1, XTAL2 não pode exceder os 150mA

Se as condições forem ultrapassadas não existe uma garantia de funcionamento nem de duração

Limites Corrente Saída SINK (Pin SINK Current Limitations)

  • A soma de todas as correntes IOL, para as portas C0-C5, ADC6, ADC7 não pode exceder os 100mA
  • A soma de todas as correntes IOL, para as portas B0-B5, D5-D7, ADC6, XTAL1, XTAL2 não pode exceder os 100mA
  • A soma de todas as correntes IOL, para as portas D0-D4, RESET não pode exceder os 100mA

Exemplo de sketche (Pisca com led)

exemplo programa para arduino
Circuito com Arduino

O código seguinte permite que um led pisque a cada segundo.
No programa abaixo, a primeira coisa a fazer é inicializar o pino 13 como um pino de saída com a linha
pinMode (13, OUTPUT);
No circuito principal, o LED liga com a linha:
digitalWrite (13, HIGH);
A linha de código fornece 5 volts ao pino 13. Isto cria uma diferença de potencial(tensão) entre os pinos do LED e este acende-se. Para desligar usa-se a linha:
digitalWrite (13, LOW);
O comando coloca o pino 13 com 0 volts apagando o LED.

Pretende-se, no entanto, que o díodo emissor de luz(LED) fique ligado o tempo suficiente para se visualizar a mudança aceso/apagado (on/off), necessitamos de dizer ao arduino para não fazer nada durante 1 segundo(1000mS) usando o comando delay().
Aqui fica o exemplo :

Nota: as linhas entre /* são comentários.
as começadas com // são comentários


/* 
Pisca
Liga um led durante um Segundo e desliga-o 1 segundo repetindo  
Este exemplo de código é de domínio público.
 */
// Pino 13 tem um led ligado na maior parte dos arduinos.
int led = 13; // Atribuir-lhe um nome:
// A rotina corre uma vez ao pressionar o reset:
void setup() {                
pinMode(led, OUTPUT); // iniciar o pino como saída(output) digital.     
}
// O ciclo(loop) repete-se indefinitivamente:
void loop() {
digitalWrite(led, HIGH);  // Liga o LED (HIGH é o nível de tensão ALTO)
delay(1000);              // espera um segundo
digitalWrite(led, LOW);   // Desliga o LED colocando a tensão low (BAIXA)
delay(1000);              // espera um segundo       
}

É muito importante que os leds tenham uma resistência(resistor) que limite a tensão individual quando em paralelo ou em circuitos diferentes, embora o circuito funcione sem o resistor(muito comum em alguns vídeos um pouco por toda a internet), a sua não utilização fará com que o circuito, mais tarde ou mais cedo, se degrade, como calcular o resistor limitador led ?

Eletrónica e Programação

O arduino exige conhecimento de eletrónica e de programação, no entanto, a sua utilização básica e avançada, na maioria dos casos, não exige um conhecimento profundo de ambas as áreas. Para quem se está a iniciar, sendo um conhecedor profundo de uma das áreas, pode ser frustrante o pouco conhecimento da outra área.

Existem alguns trabalhos que permitem esta aquisição de conhecimentos de uma forma gradual, lembre-se sempre que, pode ser o melhor técnico do mundo e conhecer áreas de eletrónica e desconhecer as bases de programação ou o melhor programador do mundo e desconhecer a base dos circuitos elétricos e eletrónicos. Esta aprendizagem gradual pode ser frustrante quando se conhece a outra área muito bem, mas não tem de ser. Alguns trabalhos conjugam as duas áreas, neste capítulo, saliento o trabalho desenvolvido pela LARM(Laboratório de automação e robótica móvel) da UFSC (Universidade Federal de Santa Catarina) pela oficina de robótica . Com a permissão do Prof. Anderson Perez foi disponibilizado e enviado por Renan Darós um excelente tutorial que abrange as duas áreas. Disponível em:

Tutorial Arduino, Eletrônica Básica
Progamação Arduino

Sequenciador de leds

sequenciador leds
Sequenciador leds com Arduino

Pretende-se que vários leds funcionem em sequência, neste caso, vamos definir e dar nome a cada um deles. Definir cada um dos pinos como saída e criar o ciclo como entendermos.

No circuito, se apenas for construído para gerador uma sequência com um único led aceso, pode ser usada um único resistor ligado à massa (-), no entanto, se pretendermos alterar a "programação" para que simultâneamente fiquem acesos diversos leds, a sua luminosidade e parâmetros de funcionamento ficam fora dos valores normais danificando o circuito mais tarde ou mais cedo.

Podem ser usados mais leds em série ou nas restantes saídas do arduino, é muito importante não utilizar leds em paralelo sem resistor na mesma saída



int led = 6;
int leda = 2;
int ledb = 3;
int ledc = 4;
int ledd = 5;

void setup() {

pinMode(led, OUTPUT);
pinMode(leda, OUTPUT);
pinMode(ledb, OUTPUT);
pinMode(ledc, OUTPUT); 
pinMode(ledd, OUTPUT);
}
void loop() {
// o led fica aceso durante o tempo de delay e apaga
digitalWrite(leda, HIGH);   
delay(100);             
digitalWrite(leda, LOW);   
digitalWrite(ledb, HIGH);   
delay(100);             
digitalWrite(ledb, LOW);   
digitalWrite(ledc, HIGH);   
delay(100);             
digitalWrite(ledc, LOW);   
digitalWrite(ledd, HIGH);   
delay(100);             
digitalWrite(ledd, LOW);   
digitalWrite(led, HIGH);  
delay(100);              
digitalWrite(led, LOW); 
digitalWrite(ledd, HIGH);   
delay(100);             
digitalWrite(ledd, LOW);   
digitalWrite(ledc, HIGH);   
delay(100);             
digitalWrite(ledc, LOW);   
digitalWrite(ledb, HIGH);   
delay(100);             
digitalWrite(ledb, LOW);   
digitalWrite(leda, HIGH);   
delay(100);             
digitalWrite(leda, LOW);   
}

Se o objetivo é apenas usar uma sequência o código pode ser melhorado


void setup() {                
  pinMode(2, OUTPUT);    
  pinMode(3, OUTPUT);   
  pinMode(4, OUTPUT);  
  pinMode(5, OUTPUT);      
  pinMode(6, OUTPUT);  
}

void loop() 
{
  int x,status; 
// delay define o tempo em que o led está aceso em milisegundos
// um ciclo no sentido de 2 a 6 
 for (x=2; x<=6; x++)
  {
    digitalWrite(x, HIGH);   
    delay(100);              
    digitalWrite(x, LOW);    
  }
// um ciclo no sentido de 6 a 2 
// pode ser anulado se pretendermos apenas um sentido  
 for (x=6; x>=2; x--)
  {
    digitalWrite(x, HIGH);  
    delay(100);              
    digitalWrite(x, LOW);   
  }
}

Variar a velocidade da sequência

variar velocidade
Variar Velocidade

O arduino pode ler a tensão na entrada analógica(A0 por exemplo), se variarmos essa tensão e definirmos o delay para o valor da leitura, a velocidade da sequência varia. Para isso, basta colocarmos um potenciómetro entre +5V e o GND, o pino intermédio irá ligar à entrada A0.
No entanto, quando o valor é muito baixo, o delay será muito baixo ficando todos os leds a piscar a uma velocidade muito elevada não se percebendo a sequência. Se o objetivo é ter apenas a sequência, pode ser inserida uma resistência (R1) que, quanto maior o valor, menor será a velocidade.

Vamos alterar o loop para que o delay varie em função da leitura da entrada analógica.


void loop() 
{
int sensorValue = analogRead(A0);
// como o valor é elevado 0-1023
// evita-se velocidades muito lentas 
// .12 deve ser ajustado em função do potenciómetro
float voltage = sensorValue * .12; 

  int x,status;
 
  for (x=2; x<=6; x++)
  {
    digitalWrite(x, HIGH);   
    delay(voltage);              
    digitalWrite(x, LOW);    
 
  }
 for (x=6; x>=2; x--)
  {
    digitalWrite(x, HIGH);  
    delay(voltage);              
    digitalWrite(x, LOW);   
 
  }

}

Criar saídas em 220 ou 110V

triac saida
Saída com triac

O circuito atua sobre um led, mas se o objetivo é ligar lâmpadas convencionais teremos de usar um circuito que seja ativado pelo pulso de saída e atue sobre a tensão do setor(220 ou 110), neste caso, pode ser usado um Triac e um acoplador ótico(protege o arduino da tensão elevada de 220 ou 110).
R1 - 180R
R2 - 56R
R3 - 330R
IC1-MOC3041
Triac - BT136
F1 - 5A


Artigos Relacionados