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?
Download

PDF - Samuel Cavalcante