introdução ao arduino -...

29
09/06/2013 1 Introdução ao Arduino Bruno Silvério Costa Arduino O que é? (1) É um sistema embarcada de placa única que, juntamente com um conjunto de softwares e frameworks, tornam fácil o desenvolvimento de hardware; Definido pelos criadores como “Open Source Electronics Prototyping Plataform”, em português “Plataforma Open Source de Prototipagem Eletrônica”. Prof. Bruno Silvério Costa

Upload: others

Post on 02-Feb-2021

10 views

Category:

Documents


0 download

TRANSCRIPT

  • 09/06/2013

    1

    Introdução ao Arduino

    Bruno Silvério Costa

    Arduino – O que é? (1)

    • É um sistema embarcada de placa única que, juntamente com um conjunto de softwares e frameworks, tornam fácil o desenvolvimento de hardware;

    • Definido pelos criadores como “Open Source Electronics Prototyping Plataform”, em português “Plataforma Open Source de Prototipagem Eletrônica”.

    Prof. Bruno Silvério Costa

  • 09/06/2013

    2

    Arduino – O que é? (2)

    • Plataforma possui os seguintes componentes principais:

    – Placa base (microcontrolada);

    – IDE de desenvolvimento (juntamente com mecanismos para upload de código);

    – Framework Arduino;

    – Shields de expansão (que implementam funções diversas controladas pela placa)

    Prof. Bruno Silvério Costa

    Preparando o computador

    • Primeiramente, é necessário obter a versão mais recente do software, disponível em www.arduino.cc;

    • Instalar o software, seguindo as instruções apresentadas em tela;

    • Plugar a placa Arduino no computador;

    • Caso o driver da placa não seja localizado automaticamente pelo sistema, indicar ao plug and play o caminho C:\Program Files (x86)\Arduino\drivers (Para windows);

    Prof. Bruno Silvério Costa

    http://www.arduino.cc/

  • 09/06/2013

    3

    Testando a comunicação

    • Abra o software Arduino (atalho disponível no desktop);

    • Vá ao Menu File->Examples->1.Basics e escolha o projeto Blink;

    • Vá até o menu File->Upload para iniciar o processo de compilação e transferência para a placa;

    • Obs.: Pode ocorrer um erro caso a placa não esteja instalada corretamente ou a porta serial virtual escolhida seja inválida.

    Prof. Bruno Silvério Costa

    Placa UNO rev 3

    Prof. Bruno Silvério Costa

    Pinos de I/O 0-1: Porta Serial 2-7: Digital/PWM

    Pinos de I/O 8-13: Digital 13: Led

    Programação ICP (Chips externos em circuito)

    uC atmega328p

    uC megaU2 Comunicação USB com o Computador

    Botão RESET

    Conector USB

    Conector de alimentação externa (0-30V)

    Pinos de I/O 10-15: Digital/Analógico

    Pinos de Alimentação Reset / IOREF

  • 09/06/2013

    4

    Microcontroladores AVR (1)

    • Chamados de Computadores de Único Chip, os microcontroladores (C) são pequenos computadores com seus respectivos componentes necessários embutidos no mesmo chip;

    • Por exemplo, estão incluídos no chip microcontrolador: – Memória RAM (volátil); – Memória EEPROM (persistente); – Unidades de I/O; – Controladores de Barramento;

    Prof. Bruno Silvério Costa

    Microcontroladores AVR (2)

    • Os C AVR seguem a arquitetura de Harvard de processadores, ou seja, possuem memória de dados distinta da memória de programa;

    • Suas portas de I/O podem ser programadas como entrada ou saída indistintamente;

  • 09/06/2013

    5

    Microcontroladores AVR (3)

    • Para utilização de uma porta qualquer, é necessário indicar qual a porta será trabalhada, qual a direção dos dados (entrada ou saída), realizar um input ou output;

    • Exemplo:

    – Porta utilizada: Port B

    – Direção dos dados: DDRB = saída

    – Output: output(PortB, valor)

    Prof. Bruno Silvério Costa

    Conhecendo o Framework (1)

    • A programação do Arduino é realizada em linguagem C;

    • Existem três sessões básicas disponibilizadas pelo framework no código para a programação: – Área de inclusões / declarações: espaço no código

    destinado a declarações de variáveis e include de bibliotecas;

    – Função de setup: ajuste das configurações básicas antes da execução propriamente dita:

    – Função de loop: conjunto de códigos que são executados ininterruptamente.

    Prof. Bruno Silvério Costa

  • 09/06/2013

    6

    Conhecendo o Framework (2)

    int led = 13;

    void setup() {

    pinMode(led, OUTPUT);

    }

    void loop() {

    digitalWrite(led, HIGH);

    delay(1000);

    digitalWrite(led, LOW);

    delay(1000);

    }

    Prof. Bruno Silvério Costa

    Área de inclusão/declaração

    Função de Setup

    Função de Loop

    Conhecendo o Framework (3)

    • Compreendendo o código

    int led = 13;//det. qual pino será usado

    void setup() { //Função de Setup

    pinMode(led, OUTPUT);//Determiando que o pino 13 será de saída (OUTPUT)

    }

    void loop() {//Função de loop

    digitalWrite(led, HIGH);//Escrevendo o valor digital HIGH (1) no pino 13

    delay(1000);//Aguardando 1000 ms

    digitalWrite(led, LOW); //Escrevendo o valor digital LOW (0) no pino 13

    delay(1000); //Aguardando 1000 ms

    }//retorna para loop

    Prof. Bruno Silvério Costa

  • 09/06/2013

    7

    Comandos Arduino (1)

    • O código feito em Arduino segue as diretrizes do Framework, mas é desenvolvido em linguagem C;

    • Dessa forma, muitos dos comandos C são válidos para o desenvolvimento em Arduino;

    • A seguir serão apresentados os comandos iniciais válidos para o desenvolvimento;

    Prof. Bruno Silvério Costa

    Comandos Arduino (2)

    • Não se utiliza a estrutura de programa principal do C. O próprio framework faz o preenchimento.

    • Comandos de seleção

    – If

    – Switch-case

    • Comandos de repetição

    – For

    – While

    – Do while

    Prof. Bruno Silvério Costa

  • 09/06/2013

    8

    Comandos Arduino (3)

    • Os pinos podem ser: de 1 a 13 e de A0 a A5, conforme apresenta a placa Arduino UNO;

    • Comandos de entrada de dados – pinMode(pino, INPUT); – variavel=digitalRead(pino); – variavel=analogRead(pino);

    • Comandos de saída de dados – pinMode(pino, OUTPUT); – digitalWrite(pino, HIGH/LOW); – analogWrite(pino, VALOR[0-255]);

    Prof. Bruno Silvério Costa

    Comandos Arduino (4)

    • Em alguns momentos, para viabilização da entrada de dados, é necessário configurar resistores de pull-up ou pull-down ligados aos pinos do microcontrolador;

    Prof. Bruno Silvério Costa

  • 09/06/2013

    9

    Comandos Arduino (5)

    • Para os microcontroladores AVR, isso pode ser feito diretamente em software;

    • O pull-up pode ser feito com o comando:

    – digitalWrite(pino, HIGH);

    • O pull-down pode ser feito com o comando:

    – digitalWrite(pino, LOW);

    Prof. Bruno Silvério Costa

    Comandos Arduino (6)

    • Comando de temporização

    – delay(tempo_ms);//aguarda um determinado tempo em ms

    – millis();// retorna o tempo em ms desde o inicio do sistema

    Prof. Bruno Silvério Costa

  • 09/06/2013

    10

    Comandos Arduino (7)

    • Comando de temporização

    – delay(tempo_ms);//aguarda um determinado tempo em ms

    – millis();// retorna o tempo em ms desde o inicio do sistema

    Prof. Bruno Silvério Costa

    Comandos Arduino (8)

    • Operações aritméticas – Funcionam de forma análoga ao C

    • A = B + C;

    • A = B – C;

    • A = B * C;

    • A = B / C;

    • A = B % C;

    – As precedências inerentes às operações funcionam normalmente. É possível a determinação externa através de parentização;

    Prof. Bruno Silvério Costa

  • 09/06/2013

    11

    Comandos Arduino (9)

    • Operações aritméticas – Funcionam de forma análoga ao C

    • A = B + C;

    • A = B – C;

    • A = B * C;

    • A = B / C;

    • A = B % C;

    – As precedências inerentes às operações funcionam normalmente. É possível a determinação externa através de parentização;

    Prof. Bruno Silvério Costa

    Exercício 1

    • Modifique o código do Projeto Blink para que o led pisque de rápido a lento continuamente;

    • Obs.: adote o delay inicial de 10 ms;

    Prof. Bruno Silvério Costa

  • 09/06/2013

    12

    Resposta Exercício 1

    int led = 13;

    int count =0;

    int delay2 = 10;

    void setup() {

    pinMode(led, OUTPUT);

    }

    void loop() {

    for(int j=1;j

  • 09/06/2013

    13

    PWM (2)

    • Utilizar uma saída digital para valores analógicos, possibilita a conversão do sinal analógico em PWM;

    • Por exemplo, pode-se construir um código para o led L de maneira que ele fique com um brilho pulsante. Para isso, basta gerar uma onda senoidal lenta;

    • Esse código é visto a seguir:

    Prof. Bruno Silvério Costa

    PWM (3)

    int ledPin = 11;//led a pulsar

    float sinVal;//valor do seno

    int ledVal;//valor a ser escrito no pino 11

    void setup(){

    pinMode(ledPin, OUTPUT);///pino 11 como saida

    }

    void loop(){

    for(int x=0; x

  • 09/06/2013

    14

    Display LCD (1)

    • Existem diversos displays LCDs comercializados. Dentre eles o mais comum é o 1602 (16 colunas x 2 linhas);

    • O Arduino possui um driver apropriado para tramalhar com uma grande quantidade de displays, bastando configurar a instância do mesmo para o tipo correto a ser trabalhado;

    • Utilizaremos o display MGD1602B;

    Prof. Bruno Silvério Costa

    Display LCD (2)

    Prof. Bruno Silvério Costa

  • 09/06/2013

    15

    Display LCD (3)

    • É necessário definir inicialmente quais serão os pinos utilizados no Arduino como interface para o display;

    Prof. Bruno Silvério Costa

    Display LCD (4)

    #include

    LiquidCrystal lcd(12, 11, 5, 4, 3, 2);//pinos a serem usados pelo display no Arduino

    int posicao=15;

    void setup() {

    lcd.begin(16, 2);//Número de colunas x linhas do display

    }

    void loop() {

    lcd.setCursor(0, 0);//Aponta cursor para coluna 0 x linha 0

    lcd.print(" ");//Apaga linha

    lcd.setCursor(0, 1);//Aponta cursor para coluna 0 x linha 1

    lcd.print(" ");//Apaga linha

    Prof. Bruno Silvério Costa

  • 09/06/2013

    16

    Display LCD (5)

    for(int i=15;i>=0;i--)//Desliza a string "Display LCD" da direita

    para a esquerda no display

    {

    lcd.setCursor(i, 0);//Aponta cursor para coluna 0 x linha 1

    delay(300);//Aguarda 300 ms

    lcd.print("Display LCD ");//escreve no display

    }

    for(int i=0;i

  • 09/06/2013

    17

    Teclado Matricial(1)

    • Todo teclado funciona como uma grande matriz, onde as teclas correspondem a intersecções entre linhas e colunas;

    Prof. Bruno Silvério Costa

    Teclado Matricial(2)

    • De forma análoga ao display, também existe um driver a ser utilizado com o teclado disponível no Arduino;

    • Como o driver é genérico, também precisa ser configurado para trabalhar corretamente;

    • São utilizados 7 pinos, dos quais, três correspondem às colunas e 4 às linhas;

    Prof. Bruno Silvério Costa

  • 09/06/2013

    18

    Teclado Matricial(3)

    #include const byte ROWS = 4; //quatro linhas const byte COLS = 3; //três colunas char keys[ROWS][COLS] = { //Define a aparência do teclado {'1','2','3'}, {'4','5','6'}, {'7','8','9'}, {'#','0','*'} }; byte rowPins[ROWS] = {A0, A1, A2, A3}; //conectar aos pinos das linhas do

    teclado byte colPins[COLS] = {8, 7, 6}; //conectar aos pinos das colunas do teclado

    Prof. Bruno Silvério Costa

    Teclado Matricial(4)

    Keypad keypad = Keypad( makeKeymap(keys), rowPins, colPins, ROWS, COLS );//criando instância do teclado

    void setup(){ Serial.begin(9600);//Ajustando taxa de comunicação serial } void loop(){ char key = keypad.getKey();//lendo uma tecla if (key != NO_KEY){//caso alguma tecla tenha sido apertada Serial.println(key);//envie qual foi a tecla para o computador } }

    Prof. Bruno Silvério Costa

  • 09/06/2013

    19

    SHIELDs

    • Placas de expansão/interface disponibilizadas para Arduino;

    Prof. Bruno Silvério Costa

    Sensores (1)

    • Os sensores, de maneira geral, são componentes eletrônicos sensíveis a eventos da natureza;

    • Existem sensores para uma grande gama de aplicações. Destacam-se: – Sensores de luminosidade (LDRs, Fototransistores); – Sensores de som (capsulas de eletreto); – Sensores de obstáculos e presença (IR, reflexivos, ultrasônicos,

    reed NA); – Sensores de temperatura (RDT); – Sensores de umidade; – Sensores de posição (bússola eletrônica, GPS); – Sensores de movimento (IR, acelerômetro, relè de mercúrio);

    Prof. Bruno Silvério Costa

  • 09/06/2013

    20

    Sensores (2)

    • Todos os sensores apontados podem ser utilizados com o Arduino;

    • Alguns depende de um conhecimento mais aprofundado de eletrônica;

    • Existe uma grande quantidade de sensores disponível em SHIELDs Arduino;

    Prof. Bruno Silvério Costa

    Sensores (3)

    • Sensor IR reflexivo

    – Identifica obstáculos que reflitam a radiação IR;

    – Muito utilizado para dar ao Arduino uma capacidade limitada de “visão”, já que é possível perceber o objeto, sem tocá-lo (pode-se utilizar ultrasom também);

    Prof. Bruno Silvério Costa

  • 09/06/2013

    21

    Sensores (4)

    Prof. Bruno Silvério Costa

    • O sensor oferece uma saída digital, possibilitando seu tratamento facilitado no Arduino, conforme código a seguir: int sensor=2;

    digitalWrite(sensor, HIGH); //pull-up

    para sensor

    pinMode(sensor, INPUT);//pino 2 como

    entrada

    valor_sensor =

    digitalRead(sensor);//leitura do

    valor do pino

    Servo motores (1)

    • Motores CC com circuitos associados, permitindo o controle da movimentação angular do mesmo, além do ganho em torque;

    • Servo motores podem ser adaptados para permitir apenas a indicação de sentido (horário, anti-horário) e o estado parado;

    Prof. Bruno Silvério Costa

  • 09/06/2013

    22

    Servo motores (2)

    • Para manipulação de servo motores no Arduino, é preciso apenas de um código bastante simples, além da utilização da biblioteca apropriada; #include

    const int parado=90; const int horario=0; const int antihorario=180;

    const int pino=2;

    Servo motor;

    motor.attach(pino);

    motor.write(horario);

    delay(5000);

    motor.write(horario);

    delay(5000);

    motor.write(parado);

    delay(5000);

    Prof. Bruno Silvério Costa

    Robô seguidor de linha (1)

    • Desloca-se sobre uma linha preta no solo, convergindo o centro do robô para cima da linha. Muito utilizado na indústria;

    Prof. Bruno Silvério Costa

  • 09/06/2013

    23

    Robô seguidor de linha (2)

    • Interligações:

    Prof. Bruno Silvério Costa

    Robô seguidor de linha (3)

    • Sensor IR reflexivo

    Prof. Bruno Silvério Costa

    Comum (-)

    Saída FT Alimentação (+) Led IR

  • 09/06/2013

    24

    Robô seguidor de linha (4)

    #include

    const int sensor_dir = 7; // sensor esquerdo

    const int sensor_esq = 8; // sensor esquerdo

    const int mDir=6;

    const int mEsq=5;

    const int buzzer=3;

    int status_sensor_esq=0;//monitor de mudança de status

    int status_sensor_dir=0;//monitor de mudança de status

    //Variáveis para acumulação dos valores dos sensores

    int s_esq=1, s_dir=1;

    //Servo-motores

    Servo motorDir;

    Servo motorEsq;

    Prof. Bruno Silvério Costa

    Robô seguidor de linha (5)

    int posDir=0;

    int posEsq=0;

    const int paradoE=86;

    const int paradoD=89;

    const int frenteE=0;

    const int frenteD=179;

    const int atrasE=180;

    const int atrasD=0;

    void aviso_som(){

    for (int i=0;i

  • 09/06/2013

    25

    Robô seguidor de linha (6)

    int status(){

    // Verificando resultado pela porta serial

    s_esq = digitalRead(sensor_esq);

    s_dir = digitalRead(sensor_dir);

    if(status_sensor_esq!=s_esq){

    Serial.print("\nSensor Esquerdo=" );

    Serial.print(s_esq);

    status_sensor_esq=s_esq;

    aviso_som();

    return 1;

    }

    if(status_sensor_dir!=s_dir){

    Serial.print("\nSensor Direito=" );

    Serial.print(s_dir);

    status_sensor_dir=s_dir;

    aviso_som();

    return 1;

    }

    return 0;

    }

    Prof. Bruno Silvério Costa

    Robô seguidor de linha (7)

    void agente_reativo_simples(Servo motor_dir, Servo motor_esq, int sEsq, int sDir){

    int sE = digitalRead(sEsq);

    int sD = digitalRead(sDir);

    int temp=status();

    if ((sE==1)&&(sD==1)){

    motor_dir.write(paradoD);

    motor_esq.write(paradoE);

    }else if ((sE==0)&&(sD==0)){

    motor_dir.write(frenteD);

    motor_esq.write(frenteE);

    }else if((sE==0)&&(sD==1)){

    motor_dir.write(frenteD);

    motor_esq.write(paradoE);

    }else if((sE==1)&&(sD==0)){

    motor_dir.write(paradoD);

    motor_esq.write(frenteE);

    }

    Prof. Bruno Silvério Costa

  • 09/06/2013

    26

    Robô seguidor de linha (7)

    void setup() {

    // Inicializando a comunicação serial em 9600 bps:

    Serial.begin(9600);

    digitalWrite(sensor_dir, HIGH); //pull-up para sensor direito

    digitalWrite(sensor_esq, HIGH); //pull-up para sensor esquerdo

    motorDir.attach(mDir);

    motorEsq.attach(mEsq);

    }

    void loop() {

    agente_reativo_simples(motorDir, motorEsq, sensor_esq, sensor_dir);

    status();

    }

    Prof. Bruno Silvério Costa

    Shield de rede (1)

    • Permite a comunicação entre o Arduino e um computador, utilizando para isso o protocolo Ethernet. O Arduino implementa a pilha TCP/IP;

    Prof. Bruno Silvério Costa

  • 09/06/2013

    27

    Shield de rede (2)

    #include

    #include

    // Enter a MAC address and IP address for your controller below.

    // The IP address will be dependent on your local network:

    byte mac[] = {

    0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED };

    IPAddress ip(192,168,1,177);

    EthernetServer server(80);

    void setup() {

    // Open serial communications and wait for port to open:

    Serial.begin(9600);

    while (!Serial) {

    ; // wait for serial port to connect. Needed for Leonardo only

    }

    // start the Ethernet connection and the server:

    Ethernet.begin(mac, ip);

    server.begin();

    Serial.print("server is at ");

    Serial.println(Ethernet.localIP());

    }

    Prof. Bruno Silvério Costa

    Shield de rede (3)

    void loop() {

    // listen for incoming clients

    EthernetClient client = server.available();

    if (client) {

    Serial.println("new client");

    // an http request ends with a blank line

    boolean currentLineIsBlank = true;

    while (client.connected()) {

    if (client.available()) {

    char c = client.read();

    Serial.write(c);

    // if you've gotten to the end of the line (received a newline

    // character) and the line is blank, the http request has ended,

    // so you can send a reply

    if (c == '\n' && currentLineIsBlank) {

    // send a standard http response header

    client.println("HTTP/1.1 200 OK");

    client.println("Content-Type: text/html");

    client.println("Connection: close"); // the connection will be closed after completion of the response

    Prof. Bruno Silvério Costa

  • 09/06/2013

    28

    Shield de rede (4)

    client.println("Refresh: 5"); // refresh the page automatically every 5 sec

    client.println();

    client.println("");

    client.println("");

    // output the value of each analog input pin

    for (int analogChannel = 0; analogChannel < 6; analogChannel++) {

    int sensorReading = analogRead(analogChannel);

    client.print("analog input ");

    client.print(analogChannel);

    client.print(" is ");

    client.print(sensorReading);

    client.println("
    ");

    }

    client.println("");

    break;

    }

    Prof. Bruno Silvério Costa

    Shield de rede (5)

    if (c == '\n') {

    currentLineIsBlank = true; // you're starting a new line

    }

    else if (c != '\r') {

    // you've gotten a character on the current line

    currentLineIsBlank = false;

    }

    }

    }

    delay(1); // give the web browser time to receive the data

    client.stop(); // close the connection:

    Serial.println("client disonnected");

    }

    }

    Prof. Bruno Silvério Costa

  • 09/06/2013

    29

    Prof. Bruno Silvério Costa