Sei sulla pagina 1di 29

09/06/2013

Introduo ao Arduino
Bruno Silvrio Costa

Arduino O que ? (1)


um sistema embarcada de placa nica que,
juntamente com um conjunto de softwares e
frameworks, tornam fcil o desenvolvimento
de hardware;
Definido pelos criadores como Open Source
Electronics Prototyping Plataform, em
portugus Plataforma Open Source de
Prototipagem Eletrnica.
Prof. Bruno Silvrio Costa

09/06/2013

Arduino O que ? (2)


Plataforma possui os seguintes componentes
principais:
Placa base (microcontrolada);
IDE de desenvolvimento (juntamente com
mecanismos para upload de cdigo);
Framework Arduino;
Shields de expanso (que implementam funes
diversas controladas pela placa)

Prof. Bruno Silvrio Costa

Preparando o
computador
Primeiramente, necessrio obter a verso mais
recente do software, disponvel em
www.arduino.cc;
Instalar o software, seguindo as instrues
apresentadas em tela;
Plugar a placa Arduino no computador;
Caso o driver da placa no seja localizado
automaticamente pelo sistema, indicar ao plug
and play o caminho C:\Program Files
(x86)\Arduino\drivers (Para windows);
Prof. Bruno Silvrio Costa

09/06/2013

Testando a
comunicao
Abra o software Arduino (atalho disponvel 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 compilao e transferncia para a
placa;
Obs.: Pode ocorrer um erro caso a placa no
esteja instalada corretamente ou a porta serial
virtual escolhida seja invlida.
Prof. Bruno Silvrio Costa

Placa UNO rev 3


Pinos de I/O
uC megaU2
Comunicao USB 8-13: Digital
com o Computador 13: Led

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

Boto RESET
Conector USB
Programao ICP
(Chips externos
em circuito)
uC atmega328p
Conector de
alimentao
externa (0-30V)

Pinos de Alimentao
Reset / IOREF

Pinos de I/O
10-15: Digital/Analgico

Prof. Bruno Silvrio Costa

09/06/2013

Microcontroladores
AVR (1)
Chamados de Computadores de nico Chip, os
microcontroladores (C) so pequenos
computadores com seus respectivos
componentes necessrios embutidos no mesmo
chip;
Por exemplo, esto includos no chip
microcontrolador:

Memria RAM (voltil);


Memria EEPROM (persistente);
Unidades de I/O;
Controladores de Barramento;
Prof. Bruno Silvrio Costa

Microcontroladores
AVR (2)
Os C AVR seguem a
arquitetura de Harvard de
processadores, ou seja,
possuem memria de
dados distinta da
memria de programa;
Suas portas de I/O podem
ser programadas como
entrada ou sada
indistintamente;

09/06/2013

Microcontroladores
AVR (3)
Para utilizao de uma porta qualquer,
necessrio indicar qual a porta ser
trabalhada, qual a direo dos dados (entrada
ou sada), realizar um input ou output;
Exemplo:
Porta utilizada: Port B
Direo dos dados: DDRB = sada
Output: output(PortB, valor)
Prof. Bruno Silvrio Costa

Conhecendo o
Framework (1)
A programao do Arduino realizada em
linguagem C;
Existem trs sesses bsicas disponibilizadas pelo
framework no cdigo para a programao:
rea de incluses / declaraes: espao no cdigo
destinado a declaraes de variveis e include de
bibliotecas;
Funo de setup: ajuste das configuraes bsicas
antes da execuo propriamente dita:
Funo de loop: conjunto de cdigos que so
executados ininterruptamente.
Prof. Bruno Silvrio Costa

09/06/2013

Conhecendo o
Framework (2)
int led = 13;
void setup() {
pinMode(led, OUTPUT);
}
void loop() {
digitalWrite(led, HIGH);
delay(1000);
digitalWrite(led, LOW);
delay(1000);
}

rea de incluso/declarao

Funo de Setup

Funo de Loop

Prof. Bruno Silvrio Costa

Conhecendo o
Framework (3)

Compreendendo o cdigo

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


void setup() { //Funo de Setup
pinMode(led, OUTPUT);//Determiando que o pino 13
ser de sada (OUTPUT)
}
void loop() {//Funo 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 Silvrio Costa

09/06/2013

Comandos Arduino (1)


O cdigo feito em Arduino segue as diretrizes
do Framework, mas desenvolvido em
linguagem C;
Dessa forma, muitos dos comandos C so
vlidos para o desenvolvimento em Arduino;
A seguir sero apresentados os comandos
iniciais vlidos para o desenvolvimento;

Prof. Bruno Silvrio Costa

Comandos Arduino (2)


No se utiliza a estrutura de programa principal
do C. O prprio framework faz o preenchimento.
Comandos de seleo
If
Switch-case

Comandos de repetio
For
While
Do while
Prof. Bruno Silvrio Costa

09/06/2013

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 sada de dados


pinMode(pino, OUTPUT);
digitalWrite(pino, HIGH/LOW);
analogWrite(pino, VALOR[0-255]);
Prof. Bruno Silvrio Costa

Comandos Arduino (4)


Em alguns momentos, para viabilizao da
entrada de dados, necessrio configurar
resistores de pull-up ou pull-down ligados aos
pinos do microcontrolador;

Prof. Bruno Silvrio Costa

09/06/2013

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 Silvrio Costa

Comandos Arduino (6)


Comando de temporizao
delay(tempo_ms);//aguarda um determinado
tempo em ms
millis();// retorna o tempo em ms desde o inicio
do sistema

Prof. Bruno Silvrio Costa

09/06/2013

Comandos Arduino (7)


Comando de temporizao
delay(tempo_ms);//aguarda um determinado
tempo em ms
millis();// retorna o tempo em ms desde o inicio
do sistema

Prof. Bruno Silvrio Costa

Comandos Arduino (8)


Operaes aritmticas
Funcionam de forma anloga ao C

A = B + C;
A = B C;
A = B * C;
A = B / C;
A = B % C;

As precedncias inerentes s operaes


funcionam normalmente. possvel a
determinao externa atravs de parentizao;
Prof. Bruno Silvrio Costa

10

09/06/2013

Comandos Arduino (9)


Operaes aritmticas
Funcionam de forma anloga ao C

A = B + C;
A = B C;
A = B * C;
A = B / C;
A = B % C;

As precedncias inerentes s operaes


funcionam normalmente. possvel a
determinao externa atravs de parentizao;
Prof. Bruno Silvrio Costa

Exerccio 1
Modifique o cdigo do Projeto Blink para que
o led pisque de rpido a lento continuamente;
Obs.: adote o delay inicial de 10 ms;

Prof. Bruno Silvrio Costa

11

09/06/2013

Resposta Exerccio 1
int led = 13;
int count =0;
int delay2 = 10;
void setup() {
pinMode(led, OUTPUT);
}
void loop() {
for(int j=1;j<=15;j++)
for(int i=0;i<5;i++)
{
digitalWrite(led, HIGH);
delay(delay2*j);
digitalWrite(led, LOW);
delay(delay2*j);
}
Prof. Bruno Silvrio Costa
}

PWM (1)
PWM (Pulse With Modulation) uma tcnica
que permite a gerao de resultados
analgicos partindo de sinais digitais. A mdia
da potncia do sinal digital determina o sinal
analgico mdio;
Muito utilizado na alterao de brilho de
lmpadas e leds, bem como no controle de
motores CC;
Prof. Bruno Silvrio Costa

12

09/06/2013

PWM (2)
Utilizar uma sada digital para valores
analgicos, possibilita a converso do sinal
analgico em PWM;
Por exemplo, pode-se construir um cdigo
para o led L de maneira que ele fique com um
brilho pulsante. Para isso, basta gerar uma
onda senoidal lenta;
Esse cdigo visto a seguir:
Prof. Bruno Silvrio 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<180; x++){//varia de 0 a 180
sinVal=(sin(x*(3.14159/180)));//calcula valor do seno
ledVal=int(sinVal*255);//valor entre 0 e 255
analogWrite(ledPin, ledVal);//escreve na porta pwm
delay(20);//aguarda 20 ms
}
}
Prof. Bruno Silvrio Costa

13

09/06/2013

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 instncia do
mesmo para o tipo correto a ser trabalhado;
Utilizaremos o display MGD1602B;
Prof. Bruno Silvrio Costa

Display LCD (2)

Prof. Bruno Silvrio Costa

14

09/06/2013

Display LCD (3)


necessrio definir
inicialmente quais
sero os pinos
utilizados no
Arduino como
interface para o
display;

Prof. Bruno Silvrio Costa

Display LCD (4)


#include <LiquidCrystal.h>
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);//Nmero 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 Silvrio Costa

15

09/06/2013

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<=15;i++)//Preenche progressivamente a linha
inferior com "+"
{
lcd.setCursor(i, 1);//Aponta cursor para coluna 0 x linha 1
delay(100);//Aguarda 100 ms
lcd.print("*");//escreve no display
}
delay(1000);//Aguarda 1000 ms para recomear
}
Prof. Bruno Silvrio Costa

Comunicao Serial
Determinao da taxa de
transmisso/recepo
Serial.begin(9600);//valor em bps

Envio de dados
Seria.print(String);//envia uma string sem o
caracter de return
Serial.println(String); //envia uma string com o
caracter de return
Prof. Bruno Silvrio Costa

16

09/06/2013

Teclado Matricial(1)
Todo teclado funciona como uma grande
matriz, onde as teclas correspondem a
interseces entre linhas e colunas;

Prof. Bruno Silvrio Costa

Teclado Matricial(2)
De forma anloga ao display, tambm existe
um driver a ser utilizado com o teclado
disponvel no Arduino;
Como o driver genrico, tambm precisa ser
configurado para trabalhar corretamente;
So utilizados 7 pinos, dos quais, trs
correspondem s colunas e 4 s linhas;

Prof. Bruno Silvrio Costa

17

09/06/2013

Teclado Matricial(3)
#include <Keypad.h>
const byte ROWS = 4; //quatro linhas
const byte COLS = 3; //trs colunas
char keys[ROWS][COLS] = { //Define a aparncia 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 Silvrio Costa

Teclado Matricial(4)
Keypad keypad = Keypad( makeKeymap(keys), rowPins, colPins, ROWS, COLS
);//criando instncia do teclado
void setup(){
Serial.begin(9600);//Ajustando taxa de comunicao 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 Silvrio Costa

18

09/06/2013

SHIELDs
Placas de expanso/interface disponibilizadas
para Arduino;

Prof. Bruno Silvrio Costa

Sensores (1)
Os sensores, de maneira geral, so componentes
eletrnicos sensveis a eventos da natureza;
Existem sensores para uma grande gama de aplicaes.
Destacam-se:
Sensores de luminosidade (LDRs, Fototransistores);
Sensores de som (capsulas de eletreto);
Sensores de obstculos e presena (IR, reflexivos, ultrasnicos,
reed NA);
Sensores de temperatura (RDT);
Sensores de umidade;
Sensores de posio (bssola eletrnica, GPS);
Sensores de movimento (IR, acelermetro, rel de mercrio);

Prof. Bruno Silvrio Costa

19

09/06/2013

Sensores (2)
Todos os sensores apontados podem ser
utilizados com o Arduino;
Alguns depende de um conhecimento mais
aprofundado de eletrnica;
Existe uma grande quantidade de sensores
disponvel em SHIELDs Arduino;

Prof. Bruno Silvrio Costa

Sensores (3)
Sensor IR reflexivo
Identifica obstculos que reflitam a radiao IR;
Muito utilizado para dar ao Arduino uma capacidade
limitada de viso, j que possvel perceber o objeto,
sem toc-lo (pode-se utilizar ultrasom tambm);

Prof. Bruno Silvrio Costa

20

09/06/2013

Sensores (4)
O sensor oferece uma sada digital, possibilitando
seu tratamento facilitado no Arduino, conforme
cdigo 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
Prof. Bruno Silvrio Costa

Servo motores (1)


Motores CC com circuitos associados,
permitindo o controle da movimentao
angular do mesmo, alm do ganho em torque;
Servo motores podem ser adaptados para
permitir apenas a indicao de sentido
(horrio, anti-horrio) e o estado parado;

Prof. Bruno Silvrio Costa

21

09/06/2013

Servo motores (2)


Para manipulao de servo motores no Arduino, preciso apenas
de um cdigo bastante simples, alm da utilizao da biblioteca
apropriada;
#include <Servo.h>
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 Silvrio 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 indstria;

Prof. Bruno Silvrio Costa

22

09/06/2013

Rob seguidor de linha


(2)
Interligaes:

Prof. Bruno Silvrio Costa

Rob seguidor de linha


(3)
Sensor IR reflexivo

Comum
(-)
Alimentao (+)
Led IR

Sada FT

Prof. Bruno Silvrio Costa

23

09/06/2013

Rob seguidor de linha


(4)
#include <Servo.h>
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 mudana de
status
int status_sensor_dir=0;//monitor de mudana de
status
//Variveis para acumulao dos valores dos sensores
int s_esq=1, s_dir=1;
//Servo-motores
Servo motorDir;
Servo motorEsq;
Prof. Bruno Silvrio 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<1;i++){
digitalWrite(buzzer, HIGH);
delay(10);
digitalWrite(buzzer, LOW);
}
}
Prof. Bruno Silvrio Costa

24

09/06/2013

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 Silvrio 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 Silvrio Costa

25

09/06/2013

Rob seguidor de linha


(7)
void setup() {
// Inicializando a comunicao 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 Silvrio Costa

Shield de rede (1)


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

Prof. Bruno Silvrio Costa

26

09/06/2013

Shield de rede (2)


#include <SPI.h>
#include <Ethernet.h>
// 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 Silvrio 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 Silvrio Costa

27

09/06/2013

Shield de rede (4)


client.println("Refresh: 5"); // refresh the page
automatically every 5 sec
client.println();
client.println("<!DOCTYPE HTML>");
client.println("<html>");
// 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("<br />");
}
client.println("</html>");
break;
}

Prof. Bruno Silvrio 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 Silvrio Costa

28

09/06/2013

Prof. Bruno Silvrio Costa

29

Potrebbero piacerti anche