Você está na página 1de 108

Workshop Arduino

Francisco Marcelino Almeida franciscomarcelinoalmeida@gmail.com Marcus Vincius de Sousa Lemos


marvinlemos@gmail.com

Apresentao
Sobre o professor: Marcus Vincius de Sousa Lemos
Mestre em Informtica Aplicada pela Universidade de Fortaleza Unifor Professor da Universidade Estadual do Piau Uespi Pesquisador do Laboratrio de Inteligncia Computacional Laic - Uespi Auditor Fiscal de Controle Externo (Informtica) TCE/PI

reas de Interesse: Redes de Sensores, Inteligncia Computacional, Robtica


marvinlemos@gmail.com http://www.marvinlemos.net @marvinlemos

Apresentao
Sobre o professor: Francisco Marcelino Almeida de Arajo
Mestrando em Biotecnologia pela Universidade Federal do Piau - UFPI Professor do Instituto Federal do Piau IFPI

reas de Interesse: Inteligncia Computacional, Processamento de Imagens, Microeletrnica, Nanotecnologia


franciscomarcelinoalmeida@gmail.com http://www.arduinopi.net @keyjin

Arduino

Motivao
Convergncia: tecnologia, criao e arte Baixo custo de microcontroladores Plataformas de hardware abertas sendo criados Febre DoItYourself

Motivao
Diversas aplicaes prticas
Robs Roupas eletrnicas Desenvolvimento de celulares customizados Instrumentos musicais Paredes interativas Redes de Sensores

Microcontrolador
Tambm conhecido como MCU (Microcontroller Unit) Computador em um chip Programado para funes especficas (geralmente para interagir com atuadores) Geralmente embarcados em outros dispositivos

Microcontrolador

ATmega328 PIC 16F628A

Basic Stamp

ATMega328P
Caractersticas do Atmega328:
RISC Processador: 8-bit Flash (Kbytes): 32 EEPROM (Bytes): 1K SRAM (Bytes): 2K PWM Channels: 6 Vcc (V): 1.8 5.5

ATMega328P

Arduino
Placa + Microcontrolador + USB + Sockets Pode ser conectado a uma grande variedade de dispositivos:
Sensores: Luz, temperatura, presena, etc. Displays: LCD, touchscreen Motores e servos GPS Comunicao sem fio: 802.15.4, Zigbee, Bluetooth Ethernet

Alimentao: Bateria de 9V ou por meio da USB

Da pgina oficial (www.arduino.org): Arduino is an opensource electronics prototyping platform based on flexible, easytouse hardware and software. Its intended for artists, designers, hobbyists, and anyone interested in creating interactive objectsorenvironments. Arduinocansensetheenvironmentbyreceivinginputfromavarietyof sensorsandcanaffectitssurroundingsbycontrollinglights,motors, andotheractuators.Themicrocontrollerontheboardisprogrammed usingtheArduinoprogramminglanguage(basedonWiring)andthe Arduinodevelopmentenvironment(basedonProcessing).Arduino projectscanbestandaloneortheycancommunicatewithsoftwareon runningonacomputer(e.g.Flash,Processing,MaxMSP).

Arduino Open-Source

Arduino com Protoboard

Arduino em Papel

Arduino
Criado na Itlia (em 2005) pelo Mssimo Banzi, no Interaction Design Ivrea Baixo custo de produo e alta aplicabilidade Computao fsica e redes de sensores Permite que os programas (ou sketches) sejam escritos em uma linguagem de alto nvel chamada Processing Processing um ambiente e linguagem de programao para criar imagens, animao e interao http://processing.org/

Verses do Arduino
Arduino Uno

Verses do Arduino
Arduino Nano

Verses do Arduino
Arduino Mega

Verses do Arduino
Arduino Lilypad

Verses do Arduino
Arduino Romeo All-in-one

Caractersticas do Arduino Uno


Microcontrolador Tenso Operacional Tenso de Alimentao Pinos de I/O digitais Pinos de entrada analgica Corrente contnua por pino de I/O Corrente contnua para o pino de 3.3 V Memria Flash EEPROM Frequncia de clock ATmega328P 5V 7-12 V 14 (dos quais 6 podem ser sadas PWM) 6 40 mA 50 mA 2KB 1K 16 MHz

Arduino Diecimila/Uno

Ok... but first, let's go shopping

Kit Para Iniciante

Outros Componentes

Sensores

Hello World

Ambiente de Desenvolvimento
O ambiente de desenvolvimento pode ser baixado em:

http://arduino.cc/en/Main/Software A ltima verso a 0022

O arquivo compactado deve ser extrado em qualquer diretrio do sistema Ser criado um diretrio arduino-XXXX, onde XXXX a verso baixado (por exemplo: arduino-0022).

Ambiente de Desenvolvimento

Executar o arquivo 'arduino'

Ambiente de Desenvolvimento

Configurando o Ambiente
Linux
Conecte o Arduino ao seu computador, por meio da porta USB e espere alguns segundos at que o sistema recohea o dispositivo Para confirmar se o dispositivo foi reconhecido, abra um terminal e execute o comando abaixo: $ dmesg Procure, nas ltimas linhas, por uma linha mais ou menos parecida com a de baixo:
[56999.967291] usb 5-2: FTDI USB Serial Device converter now attached to ttyUSB0

Essa mensagem indica que o kernel reconheceu um novo dispositivo conectado na porta /dev/ttyUSB0. O sistema nem sempre reconhece como /dev/ttyUSB0, mas em geral /dev/tty<alguma_coisa>

Configurando o Ambiente
Windows:
http://arduino.cc/en/Guide/Windows

Mac OSX:
http://arduino.cc/en/Guide/MacOSX

Configurando o Ambiente
Configurar o ambiente de desenvolvimento para utilizar a porta detectado pelo sistema:
Tools Serial Port

Configurar a placa utilizada:


Tools Board e escolher a opo Arduino Uno

Hello World
O primeiro projeto ser o equivalente Hello World para dispositivos embarcados Como no h um terminal, iremos fazer piscar (blink) um LED. A placa do Arduino vem com um LED embutido, conectado ao pin digital 13 Esta conexo faz com que o pin 13 seja sempre de sada, mas como o LED usa pouca corrente, ainda possvel conectar outras coisas na sada

Hello World
Cdigo:
int ledPin = 13; void setup() { // initialize the digital pin as an output. // Pin 13 has an LED connected on most Arduino boards: pinMode(ledPin, OUTPUT); } void loop() { digitalWrite(ledPin, HIGH); // set the LED on delay(1000); // wait for a second digitalWrite(ledPin, LOW); // set the LED off delay(1000); // wait for a second }

Hello World
Para fazer o upload para a placa, deve-se clicar no boto especfico:

Explicando o cdigo
Um sketch Arduino possui, no mnimo duas funes:
setup():
Executada apenas uma vez, durante a inicializao

loop():
Funo principal

Explicando o cdigo
setup()
pinMode(ledPin, OUTPUT); A funo pinMode define o modo de operao do pino. Neste caso, definimos que o pino 13 (ledPin) ser de sada

Explicando o cdigo
loop()
digitalWrite(ledPin, HIGH);
Permite ligar (5V) ou desligar (0V) um pino digital Neste cdigo especifico, estamos ligando (constante HIGH) o pino 13 (ledPin) Por meio da constante LOW, podemos desligar o pino

delay(200)
A funo delay() faz com que o processado fique X milisegundos em espera

Breadboard, Resistor & LED

Revisando Componentes:

Breadboard (Protoboard)
Breadboard (ou protoboard ou Matriz de Contato)
Dispositivo que permite a construo de circuitos sem a necessidade de solda Fcil prototipao Na superfcie h uma base de plstico com vrios orifcios onde so encaixados os componentes Na parte inferior h contatos metlicos que interligam os componentes inseridos na placa

Breadboard (Protoboard)
Breadboard (ou protoboard ou Matriz de Contato)

Os furos das linhas verticais esto interligados

Resistor
Resistor: Componente projetado para gerar uma resistncia corrente eltrica e, consequentemente, diminuir a tenso entre os dois terminais Medido em Ohm e representado pela letra grega Omega ( ) Os pinos digitais geram uma tenso de 5 V (DC) a 40mA LEDs geralmente precisam de uma tenso de 2 V e corrente de 10mA (para brilhar razoavelmente bem)

Resistor
Resistor:
Precisamos de um resistor capaz de reduzir a tenso de 5 para 2 (Voltage Drop) e a corrente de 40mA para 10mA Para descobrir o valor do resistor apropriado, vamos utilizar a Lei de Ohm:
I = V/R ou R = V/ I ou R = (Tenso fornecida Tenso apropriada) / I

R = (5 2)/0.01 = 3/0.01 = 300

Resistor
Como ler os valores dos resistores:

Resistor

LED
LED:
Light Emmiting Diode Diodo um componente que permite que a corrente siga apenas uma direo Um LED um diodo que emite luz

LED Flasher

Projeto 001:

LED Flasher
Componentes:

LED Flasher
Conexo:

LED Flasher

LED Flasher
Cdigo:
int ledPin = 10; void setup() { pinMode(ledPin, OUTPUT); } void loop() { digitalWrite(ledPin, HIGH); delay(1000); digitalWrite(ledPin, LOW); delay(1000); }

Revisando Componentes:

Potencimetro

Potencimetro
O potencimetro simplesmente um resistor cuja resistncia pode ser ajustada Por exemplo: em um potencimetro de 4K7, a resistncia pode variar entre 0 e 4700 Possui trs pernas:
Conectando apenas duas, o potencimetro transforma-se em um resistor varivel Conectando 3 e aplicando uma tenso, o potencimetro transforma-se em um divisor de tenso (voltage divider)

Interactive LED Chase Effect

Projeto 002:

Interactive LED Chase Effect


Componentes:

Interactive LED Chase Effect


Conexo:

Interactive LED Chase Effect


byte ledPin[] = {11,12,13}; int ledDelay; //delay between changes int direcao = 1; int currentLed = 0; unsigned long changeTime; int potPin = 2; //select the input pin for the pot void setup() { for (int x = 0; x < 3; x++){ pinMode(ledPin[x], OUTPUT); } changeTime = millis(); } void loop(){ ledDelay = analogRead(potPin); if ((millis() - changeTime) > ledDelay){ changeLed(); changeTime = millis(); } void changeLed(){ for (int x = 0; x < 3; x++){ digitalWrite(ledPin[x], LOW); } digitalWrite(ledPin[currentLed], HIGH); currentLed += direcao; if (currentLed == 2) { direcao = -1; } if (currentLed == 0) { direcao = 1; }

Interactive LED Chase Effect


Consideraes:
Inicialmente declaramos uma varivel para o potencimetro:
int potPin = 2;

O potencimetro est conectado a uma porta analgica Para ler o valor de uma porta analgica, utilizamos a funo analogRead Um Arduino possui 6 portas anlogicas com um conversor analgico-digital de 10bits Uma porta anlogica pode ler tenso entre 0V e 5V em valores inteiros entre 0 (0V) e 1023 (5V).
Resoluo de: 5V / 1024 unidades ou 0.0049V (4.9mV) por unidade

Revisando Componentes:

Tactile Switch

Tactile Switch
Tactile Switch

Tactile Switch
Tactile Switch

Tactile Switch
Tactile Switch

Fonte: http://www.ladyada.net/learn/arduino/lesson5.html

Tactile Switch
Alm de controlar a corrente, funcionam como timos dispositivos de entrada
No prximo exemplo, vamos configurar a corrente em um pino para 5V ou terra e usar a funo digitalRead para consultar o estado do pino: HIGH ou LOW

Tactile Switch
/* * Switch test program */ // Switch connected to digital pin 2 int switchPin = 2; void setup() { // set up Serial library at 9600 bps Serial.begin(9600); // sets the digital pin as input to read switch pinMode(switchPin, INPUT); } void loop() { Serial.print("Valor do Switch: "); // Read the pin and display the value Serial.println(digitalRead(switchPin)); delay(100); }

Tactile Switch
Agora, vamos utilizar um fio para alternar a conexo do pino 2 entre 5V e o terra:

Fonte: http://www.ladyada.net/learn/arduino/lesson5.html

Tactile Switch

Switch input tied LOW (ground) Switch input tied HIGH (5v)

Tactile Switch

Tactile Switch

Fonte: http://www.ladyada.net/learn/arduino/lesson5.html

Floating high above the clouds


Vamos substituir os fios pelo tactile switch
O problema que o switch s pode conectar e desconectar dois fios. Ele no pode alternar conexes

Two alternative switch wiring possibilities

Floating high above the clouds

For example, in these schematics we can connect and disconnect pin 2 to 5V, or we can connect and disconnect pin 2 to ground. In both cases, as long as the button is held down, the pin is connected to a valid input voltage. When the button is released, though, pin 2 is not connected to anything. This is called a floating input voltage. Basically, it's invalid input!

Resistor Pull-down/Pull-up
Uma soluo usar um switch que alterna conexes, como o utilizado no diagrama abaixo:

Fonte: http://www.ladyada.net/learn/arduino/lesson5.html

Resistor Pull-down/Pull-up
Outra soluo seria utilizar um recurso conhecido como resistor pull-down:
No esquema abaixo, o resistor pull-down est representado pelo resistor de 10Kohm

Fonte: http://www.ladyada.net/learn/arduino/lesson5.html

Resistor Pull-down/Pull-up
Quando o switch for pressionado, o resistor de 100 estar conectado diretamente ao 5V. Quando o switch for liberado, o resistor de 100 estar conectado ao resistor de 10K, o qual puxa-o (pull-down) para o terra

Resistor Pull-down/Pull-up

Fonte: http://www.ladyada.net/learn/arduino/lesson5.html

Resistor Pull-down/Pull-up

Resistor Pull-down/Pull-up
Resistor pull-up:

Fonte: http://www.ladyada.net/learn/arduino/lesson5.html

Resistor Pull-down/Pull-up

Projeto 003: Interactive LED Flasher

Interactive LED Flasher


Componentes:

Interactive LED Flasher


Conexo:

Interactive LED Flasher

Cdigo
int ledPin = 4; // choose the pin for the LED int inPin = 5; // choose the input pin (for a pushbutton) int val = 0; // variable for reading the pin status void setup() { pinMode(ledPin, OUTPUT); pinMode(inPin, INPUT); } // declare LED as output // declare pushbutton as input

void loop(){ val = digitalRead(inPin); // read input value if (val == HIGH) { // check if the input is HIGH digitalWrite(ledPin, LOW); // turn LED OFF } else { digitalWrite(ledPin, HIGH); // turn LED ON } }

Exerccio
Criar um projeto semelhante ao demonstrado no video:

Video 001

Projeto 004: Temperature Sensor

LM35/LM36 TPM35/TPM36
Sensor de temperatura analgico Estado-slido (no usa mrcurio) A medida que a temperatura muda, a tenso que atravessa um diodo cresce a uma taxa conhecida No precisa ser calibrado Barato e fcil de usar

LM35/LM36 TPM35/TPM36
a) LM35 b) LM36

Fonte: http://www.ladyada.net/learn/sensors/tmp36.html

LM35/LM36 TPM35/TPM36
Para converter a tenso em temperatura:
LM35:
Temp in C: (V in mV) / 10

LM36:

Temp in C: [(V in mV - 500)] / 10

Lendo a Temperatura

Lendo a Temperatura
Devemos conectar o pino do sada do sensor diretamente em uma porta analgica do Arduino A tenso de sada do sensor ser de 0 a 1.75 (aproximadamente) O tenso lida pelo Arduino convertido em um valor binrio pelo Conversor Analgico Digital Assim, para descobrirmos a temperatura, devemos fazer uma converso:

Lendo a Temperatura
Voltage at pin in milliVolts = (reading from ADC) * (5000/1024)
This formula converts the number 0-1023 from the ADC into 05000mV (= 5V)

Voltage at pin in milliVolts = (reading from ADC) * (3300/1024)


This formula converts the number 0-1023 from the ADC into 03300mV (= 3.3V)

Para converter a tenso em temperatura, basta utilizarmos a frmulas definidas anteriormente...

Lendo a Temperatura
int temperaturaPin = 0; int ledPin = 12; float vIn = 5.0; //Tensao de entrada void setup() { pinMode(ledPin, OUTPUT); Serial.begin(9600); } delay(1000); Serial.print(temperaturaC); Serial.println(" graus em C"); Serial.println(" ");

//Converter tensao para temperatura float temperaturaC = voltagem * 100.0;

digitalWrite(ledPin, LOW); void loop() { delay(1000); digitalWrite(ledPin, HIGH); //ler o valor do sensor float leitura = analogRead(temperaturaPin); } float voltagem = (leitura * vIn) / 1023.0; //Imprimir a tenso Serial.print(voltagem); Serial.println(" volts");

Problems you may encounter with multiple sensors...


If, when adding more sensors, you find that the temperature is inconsistant, this indicates that the sensors are interfering with each other when switching the analog reading circuit from one pin to the other. You can fix this by doing two delayed readings and tossing out the first one

Projeto 005: Sensing Light

Sensing Light
Uma forma bastante prtica de medir a intensidade da luz usando um LDR LDR = Light-Dependent Resistor Podem ser chamados de Photoresistores Quanto maior a intensidade da luz, menor a resistncia
20M = Ambiente muito escuro

20K = Ambiente muito iluminado

Sensing Light

LDR as a Voltage Divider


A voltage divider is just two resistors in series connected between a voltage supply and ground. If R1 is connected to the voltage supply and R2 is connected to ground then the voltage at the junction between the two resistors is:
R2 V =V cc R1 + R 2

LDR as a Voltage Divider

If R1 is the photoresistor, the voltage will increase with increasing light intensity. If R2 is the photoresistor, the voltage will decrease with increasing light intensity.
R2 V =V cc R1 + R 2

Sensing Light
int ledPin = 13; int sensorPin = 1; int period = 400; int limit = 1000; int acesso = 0; void setup() { pinMode(ledPin, OUTPUT); Serial.begin(9600); } void loop() { int rawValue = analogRead(sensorPin); if (rawValue < limit){ digitalWrite(ledPin, LOW); if (acesso != 1){ acesso = 1; Serial.println("ligado"); } } else{ digitalWrite(ledPin, HIGH); Serial.println(rawValue); if (acesso != 0){ acesso = 0; Serial.println("apagado"); } } } delay(period);

Projeto 006: Enviando Informaes para o Arduino via Serial

Enviando Informaes Via Serial


int ledPin = 13; int tempoEspera = 500; void setup(){ pinMode(ledPin, OUTPUT); Serial.begin(9600); } void loop(){ char ch; if (Serial.available()){ ch = Serial.read(); if (ch == '0'){ digitalWrite(ledPin, LOW); }else{ digitalWrite(ledPin, HIGH); } } delay(tempoEspera); }

Enviando Informaes Via Serial

Projeto 007: PySerial

apt-get install python-serial -y

PySerial
from serial import Serial porta = '/dev/ttyACM1' ser=Serial(porta, 19200, timeout=10) ser.readline() #descartar a primeira leitura info=ser.readline() ser.close() print info

Funo Utilitria: Enviar E-Mail


import sys import smtplib from email.MIMEText import MIMEText to = 'marvin.lemos@tce.pi.gov.br' user = 'marvinlemos@gmail.com' password = 'senhaaqui' def mandar_email(mensagem): msg = MIMEText(mensagem) msg['Subject'] = 'Teste' msg['From'] = "Marvin Lemos" msg['Reply-to'] = "Marvin Lemos " msg['To'] = to smtpserver = smtplib.SMTP("smtp.gmail.com",587) smtpserver.ehlo() smtpserver.starttls() smtpserver.ehlo smtpserver.login(user, password) try: smtpserver.sendmail(user,to, msg.as_string()) print "e-mail encaminhado" except: print "falha ao transmitir e-mail" print sys.exc_info() smtpserver.close()

Referncias
Arduino Starter Kit Manual: A Complete Beginners Guide To The Arduino http://www.ladyada.net/learn/arduino/ http://blog.justen.eng.br/