Workshop Arduino

           Francisco Marcelino Almeida
 franciscomarcelinoalmeida@gmail.com

      Marcus Vinícius de Sousa Lemos
               marvinlemos@gmail.com
Apresentação
Sobre o professor:
Marcus Vinícius de Sousa Lemos
      Mestre em Informática Aplicada pela Universidade de Fortaleza – Unifor
      Professor da Universidade Estadual do Piauí – Uespi
      Pesquisador do Laboratório de Inteligência Computacional – Laic - Uespi
      Auditor Fiscal de Controle Externo (Informática) – TCE/PI


      Áreas de Interesse:
      Redes de Sensores, Inteligência Computacional, Robótica


marvinlemos@gmail.com
http://www.marvinlemos.net
@marvinlemos
Apresentação
Sobre o professor:
Francisco Marcelino Almeida de Araújo
      Mestrando em Biotecnologia pela Universidade Federal do Piauí - UFPI
      Professor do Instituto Federal do Piauí – IFPI


      Áreas de Interesse:
      Inteligência Computacional, Processamento de Imagens,
      Microeletrônica, Nanotecnologia


franciscomarcelinoalmeida@gmail.com
http://www.arduinopi.net
@keyjin
Arduino
Motivação
Convergência: tecnologia, criação e arte
Baixo custo de microcontroladores
Plataformas de hardware abertas sendo
criados
Febre Do It Yourself
Motivação
Diversas aplicações práticas
  Robôs
  Roupas eletrônicas
  Desenvolvimento de celulares customizados
  Instrumentos musicais
  Paredes interativas
  Redes de Sensores
Microcontrolador
Também conhecido como MCU (Microcontroller
Unit)
“Computador em um chip”
Programado para funções específicas
(geralmente para interagir com atuadores)
Geralmente embarcados em outros dispositivos
Microcontrolador




ATmega328
                          PIC 16F628A




            Basic Stamp
ATMega328P
Características 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, presença,
  etc.
  Displays: LCD, touchscreen
  Motores e servos
  GPS
  Comunicação sem fio: 802.15.4,
  Zigbee, Bluetooth
  Ethernet
Alimentação: Bateria de 9V ou por
meio da USB
Da página oficial (www.arduino.org):


Arduino  is  an  open­source  electronics  prototyping  platform  based  on 
flexible,  easy­to­use  hardware  and  software.  It’s  intended  for  artists, 
designers,  hobbyists,  and  anyone  interested  in  creating  interactive 
objects or environments.
Arduino can sense the environment by receiving input from a variety of 
sensors and can affect its surroundings by controlling lights, motors, 
and other actuators. The microcontroller on the board is programmed 
using the Arduino programming language (based on Wiring) and the 
Arduino development environment (based on Processing). Arduino 
projects can be stand­alone or they can communicate with software on 
running on a computer (e.g. Flash, Processing,MaxMSP). ”
Arduino é
Open-Source
Arduino com Protoboard
Arduino em Papel
Arduino
Criado na Itália (em 2005) pelo Mássimo Banzi, no
Interaction Design Ivrea
Baixo custo de produção e alta aplicabilidade
Computação física e redes de sensores
Permite que os programas (ou sketches) sejam
escritos em uma linguagem de alto nível chamada
Processing
Processing é um ambiente e linguagem de
programação para criar imagens, animação e
interação
http://processing.org/
Versões do Arduino
Arduino Uno
Versões do Arduino
Arduino Nano
Versões do Arduino
Arduino Mega
Versões do Arduino
Arduino Lilypad
Versões do Arduino
Arduino Romeo All-in-one
Características do Arduino Uno
Microcontrolador                         ATmega328P
Tensão Operacional                       5V
Tensão de Alimentação                    7-12 V
Pinos de I/O digitais                    14 (dos quais 6 podem ser saídas PWM)
Pinos de entrada analógica               6
Corrente contínua por pino de I/O        40 mA
Corrente contínua para o pino de 3.3 V   50 mA
Memória Flash                            2KB
EEPROM                                   1K
Frequência de clock                      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 versão é a 0022
O arquivo compactado deve ser extraído em
qualquer diretório do sistema
Será criado um diretório arduino-XXXX, onde
XXXX é a versão 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 recoheça 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 opção “Arduino Uno”
“Hello World”
O primeiro projeto será o equivalente “Hello
World” para dispositivos embarcados
Como não há um terminal, iremos fazer piscar
(blink) um LED.
A placa do Arduino vem com um LED embutido,
conectado ao pin digital 13
Esta conexão faz com que o pin 13 seja sempre
de saída, mas como o LED usa pouca corrente,
ainda é possível conectar outras coisas na saída
“Hello World”
Código:
  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 botão específico:
Explicando o código
Um sketch Arduino possui, no mínimo duas
funções:
  setup():
    Executada apenas uma vez, durante a inicialização
  loop():
    Função principal
Explicando o código
setup()
 pinMode(ledPin, OUTPUT);
   A função pinMode define o modo de operação do
   pino. Neste caso, definimos que o pino 13 (ledPin)
   será de saída
Explicando o código
loop()
   digitalWrite(ledPin, HIGH);
         Permite ligar (5V) ou desligar (0V) um pino digital
         Neste código especifico, estamos ligando (constante
         HIGH) o pino 13 (ledPin)
         Por meio da constante LOW, podemos desligar o pino
   delay(200)
         A função delay() faz com que o processado fique X
         milisegundos em espera
Revisando Componentes:
Breadboard, Resistor &
        LED
Breadboard (Protoboard)
Breadboard (ou protoboard ou Matriz de Contato)

Dispositivo que permite a
construção de circuitos sem
a necessidade de solda
Fácil prototipação
Na superfície há uma base
de plástico com vários
orifícios onde são
encaixados os componentes
Na parte inferior há contatos
metálicos que interligam os
componentes inseridos na
placa
Breadboard (Protoboard)
Breadboard (ou protoboard ou Matriz de Contato)




                                    Os furos das linhas verticais
                                    estão interligados
Resistor
Resistor:
  Componente projetado para gerar uma resistência
  à corrente elétrica e, consequentemente, diminuir a
  tensão entre os dois terminais
  Medido em Ohm e é representado pela letra grega
  Omega ( Ω )
  Os pinos digitais geram uma tensão de 5 V (DC) a
  40mA
  LEDs geralmente precisam de uma tensão de 2 V e
  corrente de 10mA (para brilhar razoavelmente bem)
Resistor
Resistor:
    Precisamos de um resistor capaz de reduzir a tensão
    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 = (Tensão fornecida – Tensão 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 direção
 Um LED é um diodo que emite luz
Projeto 001:
LED Flasher
LED Flasher
Componentes:
LED Flasher
Conexão:
LED Flasher
LED Flasher
Código:
          int ledPin = 10;

          void setup() {
            pinMode(ledPin, OUTPUT);
          }

          void loop() {
            digitalWrite(ledPin, HIGH);
            delay(1000);
            digitalWrite(ledPin, LOW);
            delay(1000);
          }
Revisando Componentes:
   Potenciômetro
Potenciômetro
O potenciômetro é simplesmente
um resistor cuja resistência pode
ser ajustada
Por exemplo: em um potenciômetro
de 4K7, a resistência pode variar
entre 0 e 4700 Ω
Possui três pernas:
  Conectando apenas duas, o potenciômetro
  transforma-se em um resistor variável
  Conectando 3 e aplicando uma tensão, o
  potenciômetro transforma-se em um divisor de
  tensão (voltage divider)
Projeto 002:
Interactive LED
  Chase Effect
Interactive LED Chase Effect
Componentes:
Interactive LED Chase Effect
Conexão:
Interactive LED Chase Effect
byte ledPin[] = {11,12,13};                    void changeLed(){
int ledDelay; //delay between changes
int direcao = 1;                                   for (int x = 0; x < 3; x++){
int currentLed = 0;                                  digitalWrite(ledPin[x], LOW);
unsigned long changeTime;                          }
int potPin = 2; //select the input pin for
the pot                                            digitalWrite(ledPin[currentLed], HIGH);

void setup() {                                     currentLed += direcao;
  for (int x = 0; x < 3; x++){
    pinMode(ledPin[x], OUTPUT);                    if (currentLed == 2) { direcao = -1; }
  }                                                if (currentLed == 0) { direcao = 1; }
  changeTime = millis();                       }

}

void loop(){

    ledDelay = analogRead(potPin);
    if ((millis() - changeTime) > ledDelay){
      changeLed();
      changeTime = millis();
    }
}
Interactive LED Chase Effect
Considerações:
  Inicialmente declaramos uma variável para o
  potenciômetro:
       int potPin = 2;

  O potenciômetro está conectado a uma porta analógica
  Para ler o valor de uma porta analógica, utilizamos a
  função analogRead
  Um Arduino possui 6 portas análogicas com um conversor
  analógico-digital de 10bits
  Uma porta análogica pode ler tensão entre 0V e 5V em
  valores inteiros entre 0 (0V) e 1023 (5V).
    Resolução 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
Além de controlar a corrente, funcionam como
ótimos dispositivos de entrada
  No próximo exemplo, vamos configurar a corrente
  em um pino para 5V ou terra e usar a função
  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
conexão 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 não pode alternar
  conexões




               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 solução é usar um switch que alterna
conexões, como o utilizado no diagrama
abaixo:




        Fonte: http://www.ladyada.net/learn/arduino/lesson5.html
Resistor Pull-down/Pull-up
Outra solução 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
Conexão:
Interactive LED Flasher
●    Código
    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);   // declare LED as output
      pinMode(inPin, INPUT);     // 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
      }
    }
Exercício
Criar um projeto semelhante ao demonstrado
no video:

Video 001
Projeto 004:
Temperature Sensor
LM35/LM36 – TPM35/TPM36
Sensor de temperatura
analógico
Estado-sólido (não usa
mércurio)
A medida que a
temperatura muda, a
tensão que atravessa um
diodo cresce a uma taxa
conhecida
Não precisa ser calibrado
Barato e fácil 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 tensão 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 saída do sensor
diretamente em uma porta analógica do
Arduino
A tensão de saída do sensor será de 0 a 1.75
(aproximadamente)
O tensão lida pelo Arduino é convertido em um
valor binário pelo Conversor Analógico Digital
Assim, para descobrirmos a temperatura,
devemos fazer uma conversão:
Lendo a Temperatura
Voltage at pin in milliVolts = (reading from ADC) *
(5000/1024)
  This formula converts the number 0-1023 from the ADC into 0-
  5000mV (= 5V)


Voltage at pin in milliVolts = (reading from ADC) *
(3300/1024)
  This formula converts the number 0-1023 from the ADC into 0-
  3300mV (= 3.3V)


Para converter a tensão em temperatura, basta utilizarmos
a fórmulas definidas anteriormente...
Lendo a Temperatura
int temperaturaPin = 0;
int ledPin = 12;                                //Converter tensao para temperatura
float vIn = 5.0; //Tensao de entrada            float temperaturaC = voltagem * 100.0;

void setup()                                    delay(1000);
{
  pinMode(ledPin, OUTPUT);                      Serial.print(temperaturaC);
  Serial.begin(9600);                           Serial.println(" graus em C");
}                                               Serial.println(" ");

void loop()                                     digitalWrite(ledPin, LOW);
{
  digitalWrite(ledPin, HIGH);                   delay(1000);
  //ler o valor do sensor
  float leitura = analogRead(temperaturaPin); }


  float voltagem = (leitura * vIn) / 1023.0;

  //Imprimir a tensão
  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 prática 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
resistência
  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;
                                       else{
int sensorPin = 1;
                                           digitalWrite(ledPin, HIGH);
int period = 400;
                                           Serial.println(rawValue);
                                           if (acesso != 0){
int limit = 1000;
                                             acesso = 0;
                                             Serial.println("apagado");
int acesso = 0;
                                           }
                                       }
void setup()
{
                                       delay(period);
  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");
     }
 }
Projeto 006:
 Enviando Informações
para o Arduino via Serial
Enviando Informações 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 Informações 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
Função Utilitária:
              Enviar E-Mail
import sys                             smtpserver =
import smtplib                         smtplib.SMTP("smtp.gmail.com",587)
from email.MIMEText import MIMEText    smtpserver.ehlo()
                                       smtpserver.starttls()
to = 'marvin.lemos@tce.pi.gov.br'      smtpserver.ehlo
user = 'marvinlemos@gmail.com'         smtpserver.login(user, password)
password = 'senhaaqui'
                                       try:
def mandar_email(mensagem):                smtpserver.sendmail(user,to,
    msg = MIMEText(mensagem)           msg.as_string())
                                           print "e-mail encaminhado"
   msg['Subject'] = 'Teste'            except:
   msg['From'] = "Marvin Lemos"            print "falha ao transmitir e-mail"
   msg['Reply-to'] = "Marvin Lemos "       print sys.exc_info()
   msg['To'] = to                          smtpserver.close()
Referências
Arduino Starter Kit Manual: A Complete
Beginners Guide To The Arduino
http://www.ladyada.net/learn/arduino/
http://blog.justen.eng.br/

Oficina Arduino

  • 1.
    Workshop Arduino Francisco Marcelino Almeida franciscomarcelinoalmeida@gmail.com Marcus Vinícius de Sousa Lemos marvinlemos@gmail.com
  • 2.
    Apresentação Sobre o professor: MarcusVinícius de Sousa Lemos Mestre em Informática Aplicada pela Universidade de Fortaleza – Unifor Professor da Universidade Estadual do Piauí – Uespi Pesquisador do Laboratório de Inteligência Computacional – Laic - Uespi Auditor Fiscal de Controle Externo (Informática) – TCE/PI Áreas de Interesse: Redes de Sensores, Inteligência Computacional, Robótica marvinlemos@gmail.com http://www.marvinlemos.net @marvinlemos
  • 3.
    Apresentação Sobre o professor: FranciscoMarcelino Almeida de Araújo Mestrando em Biotecnologia pela Universidade Federal do Piauí - UFPI Professor do Instituto Federal do Piauí – IFPI Áreas de Interesse: Inteligência Computacional, Processamento de Imagens, Microeletrônica, Nanotecnologia franciscomarcelinoalmeida@gmail.com http://www.arduinopi.net @keyjin
  • 4.
  • 5.
    Motivação Convergência: tecnologia, criaçãoe arte Baixo custo de microcontroladores Plataformas de hardware abertas sendo criados Febre Do It Yourself
  • 6.
    Motivação Diversas aplicações práticas Robôs Roupas eletrônicas Desenvolvimento de celulares customizados Instrumentos musicais Paredes interativas Redes de Sensores
  • 7.
    Microcontrolador Também conhecido comoMCU (Microcontroller Unit) “Computador em um chip” Programado para funções específicas (geralmente para interagir com atuadores) Geralmente embarcados em outros dispositivos
  • 8.
    Microcontrolador ATmega328 PIC 16F628A Basic Stamp
  • 9.
    ATMega328P Características do Atmega328: RISC Processador: 8-bit Flash (Kbytes): 32 EEPROM (Bytes): 1K SRAM (Bytes): 2K PWM Channels: 6 Vcc (V): 1.8 – 5.5
  • 10.
  • 11.
    Arduino Placa + Microcontrolador+ USB + Sockets Pode ser conectado a uma grande variedade de dispositivos: Sensores: Luz, temperatura, presença, etc. Displays: LCD, touchscreen Motores e servos GPS Comunicação sem fio: 802.15.4, Zigbee, Bluetooth Ethernet Alimentação: Bateria de 9V ou por meio da USB
  • 12.
    Da página oficial(www.arduino.org): Arduino  is  an  open­source  electronics  prototyping  platform  based  on  flexible,  easy­to­use  hardware  and  software.  It’s  intended  for  artists,  designers,  hobbyists,  and  anyone  interested  in  creating  interactive  objects or environments. Arduino can sense the environment by receiving input from a variety of  sensors and can affect its surroundings by controlling lights, motors,  and other actuators. The microcontroller on the board is programmed  using the Arduino programming language (based on Wiring) and the  Arduino development environment (based on Processing). Arduino  projects can be stand­alone or they can communicate with software on  running on a computer (e.g. Flash, Processing,MaxMSP). ”
  • 13.
  • 14.
  • 15.
  • 16.
    Arduino Criado na Itália(em 2005) pelo Mássimo Banzi, no Interaction Design Ivrea Baixo custo de produção e alta aplicabilidade Computação física e redes de sensores Permite que os programas (ou sketches) sejam escritos em uma linguagem de alto nível chamada Processing Processing é um ambiente e linguagem de programação para criar imagens, animação e interação http://processing.org/
  • 17.
  • 18.
  • 19.
  • 20.
  • 21.
  • 22.
    Características do ArduinoUno Microcontrolador ATmega328P Tensão Operacional 5V Tensão de Alimentação 7-12 V Pinos de I/O digitais 14 (dos quais 6 podem ser saídas PWM) Pinos de entrada analógica 6 Corrente contínua por pino de I/O 40 mA Corrente contínua para o pino de 3.3 V 50 mA Memória Flash 2KB EEPROM 1K Frequência de clock 16 MHz
  • 23.
  • 25.
    Ok... but first,let's go shopping
  • 26.
  • 27.
  • 28.
  • 29.
  • 30.
    Ambiente de Desenvolvimento Oambiente de desenvolvimento pode ser baixado em: ● http://arduino.cc/en/Main/Software ● A última versão é a 0022 O arquivo compactado deve ser extraído em qualquer diretório do sistema Será criado um diretório arduino-XXXX, onde XXXX é a versão baixado (por exemplo: arduino-0022).
  • 31.
  • 32.
  • 33.
    Configurando o Ambiente Linux Conecte o Arduino ao seu computador, por meio da porta USB e espere alguns segundos até que o sistema recoheça 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>
  • 34.
    Configurando o Ambiente Windows: http://arduino.cc/en/Guide/Windows Mac OSX: http://arduino.cc/en/Guide/MacOSX
  • 35.
    Configurando o Ambiente Configuraro ambiente de desenvolvimento para utilizar a porta detectado pelo sistema: “Tools” → “Serial Port” Configurar a placa utilizada: “Tools” → “Board” e escolher a opção “Arduino Uno”
  • 36.
    “Hello World” O primeiroprojeto será o equivalente “Hello World” para dispositivos embarcados Como não há um terminal, iremos fazer piscar (blink) um LED. A placa do Arduino vem com um LED embutido, conectado ao pin digital 13 Esta conexão faz com que o pin 13 seja sempre de saída, mas como o LED usa pouca corrente, ainda é possível conectar outras coisas na saída
  • 37.
    “Hello World” Código: 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 }
  • 38.
    “Hello World” Para fazero upload para a placa, deve-se clicar no botão específico:
  • 39.
    Explicando o código Umsketch Arduino possui, no mínimo duas funções: setup(): Executada apenas uma vez, durante a inicialização loop(): Função principal
  • 40.
    Explicando o código setup() pinMode(ledPin, OUTPUT); A função pinMode define o modo de operação do pino. Neste caso, definimos que o pino 13 (ledPin) será de saída
  • 41.
    Explicando o código loop() digitalWrite(ledPin, HIGH); Permite ligar (5V) ou desligar (0V) um pino digital Neste código especifico, estamos ligando (constante HIGH) o pino 13 (ledPin) Por meio da constante LOW, podemos desligar o pino delay(200) A função delay() faz com que o processado fique X milisegundos em espera
  • 42.
  • 43.
    Breadboard (Protoboard) Breadboard (ouprotoboard ou Matriz de Contato) Dispositivo que permite a construção de circuitos sem a necessidade de solda Fácil prototipação Na superfície há uma base de plástico com vários orifícios onde são encaixados os componentes Na parte inferior há contatos metálicos que interligam os componentes inseridos na placa
  • 44.
    Breadboard (Protoboard) Breadboard (ouprotoboard ou Matriz de Contato) Os furos das linhas verticais estão interligados
  • 45.
    Resistor Resistor: Componenteprojetado para gerar uma resistência à corrente elétrica e, consequentemente, diminuir a tensão entre os dois terminais Medido em Ohm e é representado pela letra grega Omega ( Ω ) Os pinos digitais geram uma tensão de 5 V (DC) a 40mA LEDs geralmente precisam de uma tensão de 2 V e corrente de 10mA (para brilhar razoavelmente bem)
  • 46.
    Resistor Resistor: Precisamos de um resistor capaz de reduzir a tensão 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 = (Tensão fornecida – Tensão apropriada) / I ● R = (5 – 2)/0.01 = 3/0.01 = 300 Ω
  • 47.
    Resistor Como ler osvalores dos resistores:
  • 48.
  • 49.
    LED LED: Light EmmitingDiode Diodo é um componente que permite que a corrente siga apenas uma direção Um LED é um diodo que emite luz
  • 50.
  • 51.
  • 52.
  • 53.
  • 54.
    LED Flasher Código: int ledPin = 10; void setup() { pinMode(ledPin, OUTPUT); } void loop() { digitalWrite(ledPin, HIGH); delay(1000); digitalWrite(ledPin, LOW); delay(1000); }
  • 55.
  • 56.
    Potenciômetro O potenciômetro ésimplesmente um resistor cuja resistência pode ser ajustada Por exemplo: em um potenciômetro de 4K7, a resistência pode variar entre 0 e 4700 Ω Possui três pernas: Conectando apenas duas, o potenciômetro transforma-se em um resistor variável Conectando 3 e aplicando uma tensão, o potenciômetro transforma-se em um divisor de tensão (voltage divider)
  • 57.
  • 58.
    Interactive LED ChaseEffect Componentes:
  • 59.
    Interactive LED ChaseEffect Conexão:
  • 60.
    Interactive LED ChaseEffect byte ledPin[] = {11,12,13}; void changeLed(){ int ledDelay; //delay between changes int direcao = 1; for (int x = 0; x < 3; x++){ int currentLed = 0; digitalWrite(ledPin[x], LOW); unsigned long changeTime; } int potPin = 2; //select the input pin for the pot digitalWrite(ledPin[currentLed], HIGH); void setup() { currentLed += direcao; for (int x = 0; x < 3; x++){ pinMode(ledPin[x], OUTPUT); if (currentLed == 2) { direcao = -1; } } if (currentLed == 0) { direcao = 1; } changeTime = millis(); } } void loop(){ ledDelay = analogRead(potPin); if ((millis() - changeTime) > ledDelay){ changeLed(); changeTime = millis(); } }
  • 61.
    Interactive LED ChaseEffect Considerações: Inicialmente declaramos uma variável para o potenciômetro: int potPin = 2; O potenciômetro está conectado a uma porta analógica Para ler o valor de uma porta analógica, utilizamos a função analogRead Um Arduino possui 6 portas análogicas com um conversor analógico-digital de 10bits Uma porta análogica pode ler tensão entre 0V e 5V em valores inteiros entre 0 (0V) e 1023 (5V). Resolução de: 5V / 1024 unidades ou 0.0049V (4.9mV) por unidade
  • 62.
  • 63.
  • 64.
  • 65.
    Tactile Switch Tactile Switch Fonte: http://www.ladyada.net/learn/arduino/lesson5.html
  • 66.
    Tactile Switch Além decontrolar a corrente, funcionam como ótimos dispositivos de entrada No próximo exemplo, vamos configurar a corrente em um pino para 5V ou terra e usar a função digitalRead para consultar o estado do pino: HIGH ou LOW
  • 67.
    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); }
  • 68.
    Tactile Switch Agora, vamosutilizar um fio para alternar a conexão do pino 2 entre 5V e o terra: Fonte: http://www.ladyada.net/learn/arduino/lesson5.html
  • 69.
    Tactile Switch Switch input tied LOW (ground) Switch input tied HIGH (5v)
  • 70.
  • 71.
  • 72.
    Floating high abovethe clouds Vamos substituir os fios pelo tactile switch O problema é que o switch só pode conectar e desconectar dois fios. Ele não pode alternar conexões Two alternative switch wiring possibilities
  • 73.
    Floating high abovethe 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!
  • 74.
    Resistor Pull-down/Pull-up Uma soluçãoé usar um switch que alterna conexões, como o utilizado no diagrama abaixo: Fonte: http://www.ladyada.net/learn/arduino/lesson5.html
  • 75.
    Resistor Pull-down/Pull-up Outra soluçãoseria 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
  • 76.
    Resistor Pull-down/Pull-up Quando oswitch 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
  • 77.
    Resistor Pull-down/Pull-up Fonte: http://www.ladyada.net/learn/arduino/lesson5.html
  • 78.
  • 79.
    Resistor Pull-down/Pull-up Resistor pull-up: Fonte: http://www.ladyada.net/learn/arduino/lesson5.html
  • 80.
  • 81.
  • 82.
  • 83.
  • 84.
    Interactive LED Flasher ● Código 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); // declare LED as output pinMode(inPin, INPUT); // 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 } }
  • 85.
    Exercício Criar um projetosemelhante ao demonstrado no video: Video 001
  • 86.
  • 87.
    LM35/LM36 – TPM35/TPM36 Sensorde temperatura analógico Estado-sólido (não usa mércurio) A medida que a temperatura muda, a tensão que atravessa um diodo cresce a uma taxa conhecida Não precisa ser calibrado Barato e fácil de usar
  • 88.
    LM35/LM36 – TPM35/TPM36 a) LM35 b) LM36 Fonte: http://www.ladyada.net/learn/sensors/tmp36.html
  • 89.
    LM35/LM36 – TPM35/TPM36 Paraconverter a tensão em temperatura: LM35: Temp in ºC: (V in mV) / 10 LM36: – Temp in ºC: [(V in mV - 500)] / 10
  • 90.
  • 91.
    Lendo a Temperatura Devemosconectar o pino do saída do sensor diretamente em uma porta analógica do Arduino A tensão de saída do sensor será de 0 a 1.75 (aproximadamente) O tensão lida pelo Arduino é convertido em um valor binário pelo Conversor Analógico Digital Assim, para descobrirmos a temperatura, devemos fazer uma conversão:
  • 92.
    Lendo a Temperatura Voltageat pin in milliVolts = (reading from ADC) * (5000/1024) This formula converts the number 0-1023 from the ADC into 0- 5000mV (= 5V) Voltage at pin in milliVolts = (reading from ADC) * (3300/1024) This formula converts the number 0-1023 from the ADC into 0- 3300mV (= 3.3V) Para converter a tensão em temperatura, basta utilizarmos a fórmulas definidas anteriormente...
  • 93.
    Lendo a Temperatura inttemperaturaPin = 0; int ledPin = 12; //Converter tensao para temperatura float vIn = 5.0; //Tensao de entrada float temperaturaC = voltagem * 100.0; void setup() delay(1000); { pinMode(ledPin, OUTPUT); Serial.print(temperaturaC); Serial.begin(9600); Serial.println(" graus em C"); } Serial.println(" "); void loop() digitalWrite(ledPin, LOW); { digitalWrite(ledPin, HIGH); delay(1000); //ler o valor do sensor float leitura = analogRead(temperaturaPin); } float voltagem = (leitura * vIn) / 1023.0; //Imprimir a tensão Serial.print(voltagem); Serial.println(" volts");
  • 94.
    Problems you mayencounter 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
  • 95.
  • 96.
    Sensing Light Uma formabastante prática 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 resistência 20MΩ = Ambiente “muito escuro” 20KΩ = Ambiente “muito iluminado”
  • 97.
  • 98.
    LDR as aVoltage 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
  • 99.
    LDR as aVoltage 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
  • 100.
    Sensing Light int ledPin= 13; else{ int sensorPin = 1; digitalWrite(ledPin, HIGH); int period = 400; Serial.println(rawValue); if (acesso != 0){ int limit = 1000; acesso = 0; Serial.println("apagado"); int acesso = 0; } } void setup() { delay(period); 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"); } }
  • 101.
    Projeto 006: EnviandoInformações para o Arduino via Serial
  • 102.
    Enviando Informações ViaSerial 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); }
  • 103.
  • 104.
    Projeto 007: PySerial
  • 105.
  • 106.
    PySerial from serial importSerial porta = '/dev/ttyACM1' ser=Serial(porta, 19200, timeout=10) ser.readline() #descartar a primeira leitura info=ser.readline() ser.close() print info
  • 107.
    Função Utilitária: Enviar E-Mail import sys smtpserver = import smtplib smtplib.SMTP("smtp.gmail.com",587) from email.MIMEText import MIMEText smtpserver.ehlo() smtpserver.starttls() to = 'marvin.lemos@tce.pi.gov.br' smtpserver.ehlo user = 'marvinlemos@gmail.com' smtpserver.login(user, password) password = 'senhaaqui' try: def mandar_email(mensagem): smtpserver.sendmail(user,to, msg = MIMEText(mensagem) msg.as_string()) print "e-mail encaminhado" msg['Subject'] = 'Teste' except: msg['From'] = "Marvin Lemos" print "falha ao transmitir e-mail" msg['Reply-to'] = "Marvin Lemos " print sys.exc_info() msg['To'] = to smtpserver.close()
  • 108.
    Referências Arduino Starter KitManual: A Complete Beginners Guide To The Arduino http://www.ladyada.net/learn/arduino/ http://blog.justen.eng.br/