Sobre este Minicurso Viabilizado pela Organização do ERI MS; Apoiado pelo grupo ArduinoMS; Agradecimentos especiais ao do SENAC e UCDB. Sobre o Ministrante: Samuel Cavalcante Engenheiro de Computação (UNIDERP)- CREA-MS: 12873D Pós Graduado em Eng. De Sistemas (ESAB) Analista em Educação profissional no SENAC/MS Professor UNIDERP e UNAES II Pai, Esposo, Professor, Empresário, Consultor, participante de comunidades, conselheiro entre outros.
O que veremos Introdução ao Arduino Código Pisca LED Configurando a IDE para transferir o Código Acionamento de LED com Botão Pisca Led com Sensor LDR Obs.: Ao decorrer da oficina serão tratados assuntos sobre eletrônica e eletricidade básica.
Microcontrolador X Microprocessadorr Qual a principal diferença entre eles?
Introdução ao Arduino Plataforma baseada em Atmel da AVR (ATMega168; ATMega 328); Oferece um IDE e bibliotecas de programação de alto nível; Open-source hardware e software Ampla comunidade Programado em C/C++ Transferência de firmware via USB MCU com bootloader
Histórico do Arduino Projeto criado na Itália pelo Mássimo Banzi no Interaction Design Institute Ivrea; Nasceu para complementar o aprendizado de programação, computação física e gráfica; Nasceu do Processing e Wiring; Processing é um ambiente e linguagem de programação para criar imagens, animação e interação;
Simplicidade no circuito:
Muitas aplicações práticas Robôs Roupas eletrônicas Máquinas de corte e modelagem 3D de baixo custo; Desenvolvimento de celulares customizados Instrumentos musicais Paredes interativas Instrumentação humana
Vários tipos, vários fabricantes... Mega Lilypad Nano Uno Pro Arduino BT Freeduino Severino Program-ME
Atmega168 / Atmega328: coração Características do ATmega 168: RISC Reduced Instruction Set Computer 20 MIPS (20 Milhões de instruções por segundo) 16Kb Flash / 512 b EEPROM / 1Kb RAM Estática 10.000 ciclos na Flash e 100.000 na EEPROM 2 contadores / temporizadores de 8bits 1 contador / temporizador de 16bits 1 temporizador de tempo real com clock a parte 14 portas digitais 6 portas analógicas
Características técnicas 6 canais PWM 6 conversores analógico/digital de 10 bits 1 serial programável (USART) 1 interface SPI (Serial Peripheral Interface) 1 interface serial a 2 fios (I2C) 1 watch dog timer programável 1 comparador analógico no chip Interrupção ou wake-up na alteração de estado dos pinos
Resumo das conexões da placa
FT232RL Conversor USB-Serial Conector USB Regular 7085: Recebe até 12 volts e regula para 5 volts Alimentação externa: Até 12 volts
Botão de reset ICSP Para gravar bootloader ou programas/firmware AtMega328 /168/8
AREF Referência analógica Padrão 5 volts GND Portas digitais 0 a 13 0 RX 1 TX = usada durante transferência de sketch e comunicação serial com placa 2,4,7,8,12,13 = portas digitais convêncionais 3,5,6,9,10,11 = portas PWM
Portas analógicas 4 e 5 São as portas utilizadas para conexões via I2C / TWI. GND Portas analógicas de 0 a 5 5 volts Podem funcionar como digitais de 14 a 19 3.3 volts VIN Alimentação de entrada sem regulagem
Shields: arquitetura modular inteligente Arduino estabeleceu um padrão de pinagem que é respeitado por diversas placas shield:
Por dentro do MCU
Porta Digital Vs. Analógica Digital: trabalha com lógica binária, 0 e 1. No Arduino segue padrão TTL onde: 0 a 0,8 volts = 0 2 a 5 volts = 1 Analógica: valor lido é análogo a tensão. Referência de analogia é 5 volts 0 volts = 0 2.5 volts= 512 5 volts = 1023 Conversor A/D de 10 bits: 0 a 1023 0000000001 2 = 1 10 = 0,005v 0000000010 2 = 2 10 = 0,010v 0000000011 2 = 2 10 = 0,015v 1000000000 2 = 512 10 = 2,50v...
Porta Digital Vs. Analógica Portas analógicas expressam valores de 0 a 1023 mas não são utilizadas para transferência de informações precisas Neste caso o dispositivo recebe um valor analógico de 0v à 5v, que será convertido em um número binário de 10 bits. Cada bits somado ao circuito equivale a 0,005v. Portas digitais permitem que dados sejam transferidos em sequencia através de uma lógica ou protocolo binário Portas digitais não conseguem comandar potência
Porta PWM Uma porta híbrida: digital porém com modularização de zeros e uns de forma que consegue expressar uma idéia de potência;
Na prática Ligamos componentes em portas digitais (comuns, PWM) ou analógica Fazemos leitura e escrita nestas portas afim de obter um dado ou um determinado comportamento Processamos os dados no microcontrolador Alguns exemplos de componentes...
Ping Sensor de distância ultrasonico
LCD Touch Shield LCD Touch screen
SIM Reader
Lojas de componentes www.parallax.com www.sparkfun.com www.makershed.com www.liquidware.com www.ladyada.net www.adafruit.com www.rlrobotics.ind.br/ - BRASIL www.empretecnet.com.br/do/home - BRASIL
Programando para Arduino IDE pode ser baixada de www.arduino.cc A IDE foi desenvolvida com Java, portanto precisaremos de um máquina virtual instalada. Funciona em Windows. Mac OS X e Linux (em alguns windows e mac pode ser necessário colocar driver) Utiliza GCC + GCC Avr para compilação (você pode também programar diretamente com GCC!) A transferência para a placa é feita via USB pelo IDE; (mas também pode ser feita com gravadores ICSP!)
Partes básicas do programa Arduino Temos que obrigatoriamente programar dois métodos: void setup() { void loop() { O setup é executado uma só vez assim que a placa for ligada e o loop terá o código de execução infinita
Portas digitais e analógicas Na prática ligamos componentes em portas digitais e analógicas e através do código Arduino, manipulamos as portas: pinmode(<porta>, <modo>): configura uma porta digital para ser lida ou para enviarmos dados; digitalwrite(<porta>, 0 ou 1): envia 0 ou 1 para porta digital digitalread(<porta>): retorna um 0 ou 1 lido da porta analogread(<porta>): retorna de 0 a 1023 com o valor da porta analógica analogwrite(<porta>, <valor>): escreve em uma porta PWM um valor de 0 a 255
Protoboard ou Matriz de contato É um dispositivo usado para construir circuitos sem a necessidade de solda. Na parte central de todos os pinos alinhados sob um número estiver conectado, enquanto os nas bordas superior e inferior - normalmente marcado com linhas pretas e vermelhas - são conectados na horizontal.
Primeiro contato com Arduino Ligar sua placa no cabo USB e no PC Realizar a instalação do Driver com a ajuda do facilitador Verificar o jumper de alimentação configurando para USB se necessário Digitar o código, a ser passado, no Arduino IDE Selecionar no software a versão do Arduino e a porta serial de comunicação. Clicar no botão de transferência de sketch
Exemplo pisca led com Arduino Esta conexão é bem simples somente para efeito de teste para piscar o led. O correto é ligar um resistor usando uma protoboard.
Exemplo pisca led void setup() { pinmode(13, OUTPUT); //porta 13 em output void loop() { digitalwrite(13, HIGH); //HIGH = 1 = TRUE delay(500); digitalwrite(13, LOW); //LOW = 0 = FALSE delay(500);
Configurando a IDE para transferir o Código
Configurando a IDE para transferir o Código
Procurando erros no código
Fazendo o Upload do Código para o Arduino
Entrada Digital: Fazendo leitura de um botão Os pinos do Arduino são extremamente sensíveis, permitindo a leitura de ruído elétrico do ambiente. O próximo teste utilizaremos o pino 7 como leitura de dados externos, como é uma porta digital será lido HIGH ou LOW (1 ou 0). Essa leitura é realizada pelo comando digitalread(port). Conecte três fios à placa Arduino. O primeiro de uma perna do botão através de um resistor de pull-up (aqui 10K Ω) para o fornecimento de 5 volts. A segunda vai da perna correspondente do botão ao GND. O terceiro se conecta a um pino digital I/O (pino 7) que lê o estado do botão.
Montando o Circuito
Código Aciona LED com botão int val = 0; // variável para ler o status do pino void setup() { pinmode(13, OUTPUT); // declare LED como output pinmode(7, INPUT); // declare pushbutton como input void loop(){ val = digitalread(7); // ler a entrada de valor if (val == HIGH) {// verificar se a entrada é alta digitalwrite(13, LOW); // LED OFF else { digitalwrite(13, HIGH); // LED ON
Tempo entre acende e apaga LED usando sensor LDR Use o mesmo circuito como antes, mudando o botão com o sensor de luz e trocando a ligação do pino digital 7 para o pino analógico 2. A função permite enviar um valor numérico para o computador. Variando números digitais no intervalo de 0-1024 (resolução de 1 Bit). Nesta função usamos a comunicação serial, com isso abra o monitor serial para ler dados do sensor. Após o código ser copiado no Arduino.
Montando o Circuito
Código int val = 0; // variável para armazenar o valor vindo do sensor void setup() { pinmode(13, OUTPUT); // declara o ledpin como uma saída Serial.begin(9600); // usar a porta serial para comunicação void loop() { val = analogread(2); // lê o valor do sensor Serial.println(val); // imprime o valor para a porta serial digitalwrite(13, HIGH); // ligar o LED delay(val); // parar o programa por algum tempo digitalwrite(13, LOW); // desligar o LED delay(val); // tempo antes do proximo ciclo
Vetor de LEDs Monte na matriz de contato 5 leds, cada perna maior do LED (VCC) será ligada a uma perna do resistor, a outra perna do resistor será ligada em cada um dos seguinte pinos Digital, 12, 11, 10, 9 e 8. A perna menor dos LEDs, no GND (0v). A atividade é fazer esses LEDs acenderem em sequencia, acendendo um LED de cada vez, com intervalos de 50 milisegundos por led, após todos acessos aguardar 1000 milisegundos e começar a apagar os leds, com o mesmo intervalor de tempo.
Vetor de LEDs Montando o circuito
Vetor de LEDs Código int i; void setup() { pinmode(13, OUTPUT); pinmode(12, OUTPUT); pinmode(11, OUTPUT); pinmode(10, OUTPUT); pinmode(9, OUTPUT); void loop() { for(i=13;i>=8;i--){ digitalwrite(i, HIGH); delay(50); delay(1000); for(i=8;i<=13;i++){ digitalwrite(i, LOW); delay(50); delay(1000);
Vetor de LEDs com potenciômetro
Vetor de LEDs com potenciômetro int i, port, potenc; float tensao=0; void setup() { pinmode(13, OUTPUT); pinmode(12, OUTPUT); pinmode(11, OUTPUT); pinmode(10, OUTPUT); pinmode(9, OUTPUT); Serial.begin(9600); void loop() { potenc=analogread(2); port=13; for(i=1;i<=5;i++){ if(potenc>((i*2-1)*100)){ digitalwrite(port, HIGH); else{ digitalwrite(port, LOW); port--; Serial.print("Valor decimal = "); Serial.print(potenc); tensao=potenc*0.004883; Serial.print(" - Tensao = "); Serial.print(tensao); Serial.println(" V"); delay(500);
Motor de Passo com controle de velocidade
P1 - Código - Motor de Passo com controle de velocidade // Motor de passo Controlado por botã o /* - Declarando cariaveis globais - */ int motorpin1 = 8; int motorpin2 = 9; int motorpin3 = 10; int motorpin4 = 11; int botaomotord = 2; //motor direita int botaomotore = 3; //motor esquerda int botaoveloca = 4; int botaovelocd = 5; int delaytime = 200; int movimentomotora[] = {1,0,0,0; int movimentomotor[] = {0,0,0,0; /* Configuracao dos pinos*/ void setup() { pinmode(motorpin1, OUTPUT); pinmode(motorpin2, OUTPUT); pinmode(motorpin3, OUTPUT); pinmode(motorpin4, OUTPUT); pinmode(botaomotord, INPUT); pinmode(botaomotore, INPUT); pinmode(botaoveloca, INPUT); pinmode(botaovelocd, INPUT); Serial.begin(9600); botaoesquerda(); void loop() { int i, motord, motore, veloca, velocd; motord = digitalread(botaomotord); //le o valor do pino2 motore = digitalread(botaomotore); //le o valor do pino3 veloca = digitalread(botaoveloca); //le o valor do pino4 velocd = digitalread(botaovelocd); //le o valor do pino5 if (motord==high){ botaodireita(); Serial.println(" - rotaciona - Direita"); if (motore==high){ botaoesquerda(); Serial.println(" - rotaciona - Esquerda"); //Teste para rotaciona por vetor automã tico
P2 - Código - Motor de Passo com controle de velocidade if (veloca==high){ if(delaytime<500) delaytime=delaytime+50; Serial.print("O time esta em: "); Serial.println(delayTime); if (velocd==high){ if(delaytime>50) delaytime=delaytime-50; Serial.print("O time esta em: "); Serial.println(delayTime); delay(delaytime); //-- Rotaciona motor para a Direita void botaodireita(){ int k; for (k=0;k<4;k++){ if(k<3) movimentomotor[k+1] = movimentomotora[k]; else movimentomotor[0] = movimentomotora[k]; for (k=0;k<4;k++){ movimentomotora[k] = movimentomotor[k]; digitalwrite(k+8, movimentomotor[k]); Serial.print(movimentoMotor[k]); //-- Rotaciona motor para a esquerda void botaoesquerda(){ int k; for (k=0;k<4;k++){ if(k>0) movimentomotor[k-1] = movimentomotora[k]; else movimentomotor[3] = movimentomotora[k]; //Transcreve o vetor para o Vertor de Apoio. imprime o resultado. for (k=0;k<4;k++){ movimentomotora[k] = movimentomotor[k]; digitalwrite(k+8, movimentomotor[k]); Serial.print(movimentoMotor[k]);
Resumindo... Arduino é um projeto simples, popular e acessível Eletrônica e programação embarcada alto nível Na prática ligamos componentes nas portas analógicas e digitais e escrevemos programas que usam as portas Existem diversas bibliotecas que encapsulam a lógica de comunicação digital ou analógica: servo, motor de passo, Android, display LCD Ter portas digitais analógicas e pmw é um grande valor do microcontrolador utilizado A transfêrencia via USB e a ferramenta / IDE para programação funcionam em múltiplas plataformas Open-source Hardware e Open-source software
É isso ai pessoal, agora é só queimar alguns componentes. Contatos: samuel@ms.senac.br samuelmbc@gmail.com Twitter: @samuelmbc Sites: www.samuelcavalcante.com (blog Pessoal) www.ms.senac.br (onde trabalho) www.e-camisa.com (sócio)