Arduino Hack Day • Evento promovido por entusiastas, universidades e empresas • Colaborativo e participativo • Informações técnicas e troca de experiências • Elétron Livre apoia a iniciativa emprestando materiais, cedendo direito de uso de slides e ajudando na preparação geral do evento • PROMOVA VOCÊ TAMBÉM UM ARDUINO HACK DAY! Sobre este Arduino Hack Day… • Javaneiros Edition • Organizado pelo Jeff - empresa Jera • Agradecimentos ao apoio da faculdade e prof. Bob Agenda Padrão • • • • Introdução a Arduino Controlando tomadas pela Internet Controle de motores com Arduino Introdução a robótica Introdução ao Arduino • Plataforma baseada em Atmel da AVR (ATMega168); • 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; Segway open-source Desenvolvimento de celulares customizados Instrumentos musicais Paredes interativas Instrumentação humana Circuit bending 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 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. Portas analógicas de 0 a 5 GND Reset Podem funcionar como digitais de 14 a 19 5 volts VIN 3.3 volts 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 0 e 1 na lógica binária. – Digital do 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 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 • As portas digitais permitem que dados sejam tranferidos 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 Bússula Bússola LCD Touch Shield LCD Touch screen SIM Reader SIM Reader Wave Shield XBee Lojas de componentes • • • • www.parallax.com www.sparkfun.com www.makershed.com www.liquidware.com www.ladyada.net www.adafruit.com Programando para Arduino • IDE pode ser baixada de www.arduino.cc • A IDE foi desenvolvida com Java, portanto precisaremos de um máquina virtual 1.5 ou 1.6 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 úma 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 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); } LDR no Arduino sem protoboard Exemplo “luz ambiente” void setup() { //Inicializando conexão com PC via FT232 - cabo Serial.begin(9600); } void loop() { int luz = analogRead(5); //LDR ligado na 5 //envia informações para o PC Serial.println(luz); delay(500); } DEMO • Apresentação básica do Arduino IDE: – – – – Compilação; Samples; Upload; Dicas Program-ME: Arduino turbinado nacional Ligando componentes • Com o mapa de portas documentado a seguir, conseguimos saber qual jumper habilita qual componente e em qual porta Jumpers são utilizados para ligar ou desligar os componentes on-board Se todos os jumpers forem retirados, todas as portas são liberadas deixando o Program-ME funcionando como um Arduino. Você pode escolher o que ligar! Mapa de portas Vs. componentes Código Porta Componente L1 14 (igual analógica 0) Led L2 Digital 1 Led L3 Digital 2 Led L4 Digital 3 Led L5 Digital 4 Led L6 Digital 5 Led L7 Digital 8 Led L8 Digital 6 Led L9 Digital 13 Led C1 Analógica 5 LDR Mapa de portas Vs. componentes Código Porta Componente Q2 Digital 7 Led Q3 Digital 6 Led Q4 Digital 18 Led Q5 Digital 17 Led Chv1 Digital 0 Chave microswitch / botão Spk Digital 12 Speaker Servo-1 Digital 10 Entrada servo-1 Servo-2 Digital 11 Entrada servo-2 JP7 Analógica 1 Entrada analógica / potenciômetro JP6 Analógica 2 Entrada analógica / potenciômetro Selecionando alimentação • O Program-ME possui um jumper para seleção de alimentação USB ou fonte externa • Toda vez que ligar componentes que possam consumir mais que 500ma, devemos alimentar com fonte externa! • Durante os laboratórios de motores e relés lembre-se de mudar este jumper e alimentar com fonte externa Selecionando alimentação Jumper Seleção Externo ou USB Lab 1: primeiro contato com Program-ME / Arduino • Ligar sua placa no cabo USB e no PC • Verificar o jumper de alimentação configurando para USB se necessário • Digitar o código a seguir no Arduino IDE • Clicar no botão de transferência de sketch Lab 1: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); } Lab 2 “luz ambiente” void setup() { //Inicializando conexão com PC via FT232 - cabo Serial.begin(9600); } void loop() { int luz = analogRead(5); //LDR ligado na 5 //envia informações para o PC Serial.println(luz); delay(500); } Lab 3: desafio - luz ambiente e leds Os leds de 1 a 9 Program-Me estão ligados nas portas 14,1,2,3,4,5,8,6,13. Crie um programa que quanto menor a luz do ambiente mais leds ele acende e apaga em sequencia. Lab 4: hummm... Ligue e desligue a porta 12 com diferentes intervalos de tempo... 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 Tomadas com Arduino Ligando uma tomada no Arduino, como? • Qualquer mínimo contato de um fio 110 no Arduino seria capaz de um show pirotécnico • Isso acontece porque as portas digitais do Arduino funcionam com 5v de conta continua e tomadas 110 e 220 trabalham com corrente alternada • Mas porque tomadas (e a energia de uma residencia) trabalha com corrente alternada e não contina? – A transmissão da energia com corrente continua para longa distancias é inviável! Relé como ponte entre Arduino e AC • O meio de conexão entre seu Arduino e uma tomada pode ser um relé • Um relé é um interruptor eletromagnético que quando conduzimos corrente o interruptor fecha um determinado contato • Esses contatos podem estar normalmente abertos (desconectados) ou normalmente fechados (conectados) • Siglas NO NC em ingles ou NA NF em portugues Como funciona um Relé Mas... Como ligar um relé no Arduino? • O Arduino (le-se Atmega) é um controlador de baixo consumo • Suas portas digitais não fornecem mais de 40ma de corrente • Para acionar o mecanismo eletromagnético da bobina do relé é necessário mais de 40ma de corrente • Por este motivo precisamos ligar um transistor entre o Arduino e o relé • Para ligar um Arduino no relé precisamos de um transistor, a menos que o relé seja muito pequeno E é só isso? • Um fenômeno físico acontece em todo mecanismo eletromagnético quando é desenergizado • É conhecido como tensão reversa • Assim que tiramos a energia de um algo eletromagnético recebemos de volta um “choque” • Com Arduino ligado em transistor que aciona o relé, o choque seria recebido pelo transistor • Isso poderia ser fatal para o transistor! • Usamos um diodo (componente que só deixa a corrente passar em um sentido) para proteger o transistor • O diodo deve ser colocado em paralelo com o mecanismo Placa Tomad@ R1 e R2 = resistor 1k – para os transistores R3 e R4 = resistor 330R – para os leds D1 e D2 = diodo IN4007 Led1 e Led2 = led on / off Fusível 1 e Fusível 2 = proteção T1 e T2 = transistor para acionar bobina do relê Relê 1 e Relê 2 Bornes para encaixe dos fios de acionamento da saída do contato do relê Conectando seu Program-Me na placa Tomad@ Hacking Class Ligando a placa na tomada Devemos romper o fio de uma das fases; Cortamos o fio e vamos ligar cada uma das pontas em um dos bornes da placa void setup() { pinMode(2, OUTPUT); pinMode(3, OUTPUT); } void loop() { digitalWrite(3, LOW); digitalWrite(2, HIGH); delay(1000); digitalWrite(2, LOW); digitalWrite(3, HIGH); delay(1000); } 1. Computador conectado na Web com servidor Java recebe request HTTP com solicitação para acionar a tomada 2. Este servidor web terá uma placa Arduino ligada permanentemente. O servlet (ou equiv) vai acionar a placa via comunicação serial RS-232. 3. Para controlar as tomadas, vamos ligar a placa Tomad@ no Arduino. Essa placa possui um par de relês que podem ser ligados em uma tomada e acionados on / off através de sinal digital 0 ou 1 4. Vamos ligar uma tomada no relê da nossa placa ou então um aparelho qualquer. void setup() { Serial.begin(9600); pinMode(2, OUTPUT); pinMode(3, OUTPUT); } void loop() { if(Serial.available() >0) { int incoming=Serial.read(); Serial.println("Recebendo dados"); Serial.println(incoming, DEC); acionarRele(incoming);// seu protocolo } } void acionarRele(int codigo) { if(codigo=65) { Serial.println("HIGH no rele 1"); digitalWrite(3, HIGH); } else if(codigo=66) { Serial.println("LOW no rele 1"); digitalWrite(3, LOW); } else if(codigo=67) { Serial.println("HIGH no rele 2"); digitalWrite(2, HIGH); } else if(codigo=68) { Serial.println("LOW no rele 2"); digitalWrite(2, LOW); } } response.setContentType("text/html;charset=UTF-8"); PrintWriter out = response.getWriter(); try { byte[] dados = new byte[1]; dados[0] = Byte.parseByte(request.getParameter("rele")); try { Arduino.enviar(dados); ... outputStream = serialPort.getOutputStream(); serialPort.setSerialPortParams(9600, SerialPort.DATABITS_8, SerialPort.STOPBITS_1, SerialPort.PARITY_NONE); serialPort.notifyOnOutputEmpty(true); outputStream.write(bytes); serialPort.close(); Vamos praticar? • Com base nos slides, conecte a placa tomada no ProgramME e escreva um programa para chavear o relé • Ao finalizar crie uma lógica com sensor de luz e relé • Opcional: criar um programa Web usando RXTX Motores com Arduino Tipos de motores • Podemos qualificar motores em: – Velocidade de rotação / RPM – Força – Precisão • Redutores são utilizados para transformar rotação em força • 3 principais tipos motores: – Motor DC / CC: velocidade – Servo-motor: precisão (e força!) – Motor de passo: precisão e força (+ difícil) Motor DC (com redução) Motor DC • Motor simples para comandar que pode ter alta velocidade ou torque (conforme redução) • Não tem precisão angular • Podemos controlar a potência com PWM • Assim como relé precisamos ligar em um transistor com diodo de proteção • Para inverter a direção da rotação temos que inverter a polaridade • DEMO: motor na bateria e direção Motor DC com Arduino em Protoboard Motor DC no Program-ME • Podemos usar o transistor Q3 (porta digital PWM 6) • Ligamos o + no 12v e o – no borne do transistor Motor DC no Program-ME Exemplo de código #define Q3 6 void setup() {} void loop() { for(int x=0;x<255;x++) { analogWrite(Q3, x); delay(20); } for(int x=255;x>0;x--) { analogWrite(Q3, x); delay(20); } } Vamos praticar? • Com base nos exemplos fornecidos e modelo de conexão, utilize o motor DC disponível com a placa controladora fornecida • Nunca faça conexões com a placa ligada! • Revise o circuito!! Servo • Motor com precisão angular • Fácil comando • É um motor + redução + driver! • Por padrão virar apenas de 0 a 180 graus • Podemos hackear ou comprar servos full-rotation • Conexão super simples: GND 5v sinal digital No Program-ME temos duas entradas Padrões de conexão dos Servos Outra diferença está na conexão mecânica do eixo do servo, que no Hitec tem 24 dentes e no Futaba 25. Program-ME & Servo Servo + LDR com Program-ME #include <Servo.h> Servo myservo; void setup() { myservo.attach(10); } void loop() { int val = map(analogRead(5),0,1023,0,179); myservo.write(val); delay(15); } Vamos praticar? • Ligar o servo na entada servo-1, o marrom (GND), deve estar para o lado do USB • Digitar o código apresentado anteriormente Robótica com Arduino A palavra robô vem de robot que foi utilizada em uma peça de teatro de 1920, chamada R.U.R. (Rossum's Universal Robots), do tcheco Karel Capek. Aparentemente a palavra descende de ROBOTA, que em checo significa trabalho servil ou trabalho pesado. Uma definição mais realista de robô, seria que ele é um manipulador reprogramável e multi-funcional projetado para mover materiais, partes, ferramentas ou dispositivos especializados através de movimentos variáveis programados para desempenhar uma variedade de tarefas. Podemos fazer um paralelo entre os robôs e os seres humanos baseados em 3 aspectos distintos: • Sentidos • Pensamentos • Ações Nos seres humanos, iniciando pelos seus sentidos, temos um caminho que passa pelo tratamento do pensamento e termina ou resulta em ações. Podemos usar essa mesma linha de análise para os robôs, porém, substituindo a nomenclatura por outra mais adequada: • Sentidos - > Sensores • Pensamentos - > Processamento • Ações - > Atuadores Dessa forma, um robô aciona seus atuadores, baseado em seu processamento que teve como entrada os dados vindos de seus sensores. Todos os robôs têm em comum a realização de algum tipo de movimento sendo que também podemos distinguir os robôs pela sua capacidade de processamento, sendo assim poderíamos classificar os robôs como: Robô “inteligente” pode se mover de forma autônoma e segura por um ambiente não preparado e atingir um objetivo ou efetivar uma tarefa. Robô não “inteligente” deve repetir de forma confiável a mesma tarefa para que foi programado, porém sem enfrentar variações no ambiente ou situações. Nesse caso, a definição fica mais próxima de automação e pode distinguir entre um robô e uma máquina de lavar. De uma forma geral temos os seguintes tipos de robôs: • Manipuladores ou braços robóticos; • Robôs móveis com rodas; • Robôs móveis com pernas; • Humanóides Manipuladores ou braço robótico • Atualmente, a maior aplicação de robôs é na área industrial, principalmente na produção de bens de consumo. • Nessa área, o tipo mais popularmente conhecido de robô é o braço robótico: Robô cartesiano ou gantry Robôs móveis com rodas Robôs móveis com pernas • Hexapod: robô baseado em insetos Robôs humanóides • Entre os robôs humanóides, o mais conhecido é o da Honda Exemplos de robôs com papelão e PCI Madeira Compensado / MDF: talvez o material mais fácil de trabalhar e muito acessível. É isolante, o que diminui a preocupação com a montagem. Pode ser colada e furada com facilidade. O inconveniente é a sua relação peso / resistência. Duratex: muito fácil de ser trabalhado, pode ser usado em alguns casos, porém, é muito flexível para ser usado como chassi de robôs maiores. Exemplos de robôs com madeira Exemplos de robôs com plástico Como controlar dois motores? • Utilizando um circuito integrado auxiliar podemos controlar 2 motores • O circuito proposto permite o controle de dois motores • O circuito permite a inversão de polaridade, que no caso de motor DC, nos permite avançar e retroceder • A solução pode ser feita com transistores em ponte H • Podemos usar um circuito de ponte H pronto Visão do circuito integrado Conexão motores Definindo portas #define #define #define #define #define #define MOTOR1_P 12 MOTOR1_N 11 MOTOR1_PWM 5 MOTOR2_P 8 MOTOR2_N 7 MOTOR2_PWM 6 Comando para avançar ou retroceder void andarFrente(int tempo, int intensidade) { sentido = 0; analogWrite(MOTOR1_PWM,intensidade*50); analogWrite(MOTOR2_PWM,intensidade*50); digitalWrite(MOTOR1_P,sentido); digitalWrite(MOTOR1_N,!sentido); digitalWrite(MOTOR2_P,sentido); digitalWrite(MOTOR2_N,!sentido); delay(tempo); } Vamos praticar? • DOJO? • Ponte H? • 3-shield?