O documento apresenta dois professores: Marcus Vinícius de Sousa Lemos e Francisco Marcelino Almeida. Ambos são pesquisadores interessados em inteligência computacional e desenvolvimento com Arduino. O texto também fornece uma introdução sobre a plataforma Arduino, incluindo suas características, versões e aplicações possíveis.
2. AApprreesseennttaaççããoo
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
3. AApprreesseennttaaççããoo
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
6. MMoottiivvaaççããoo
Diversas aplicações práticas
Robôs
Roupas eletrônicas
Desenvolvimento de celulares customizados
Instrumentos musicais
Paredes interativas
Redes de Sensores
7. MMiiccrrooccoonnttrroollaaddoorr
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
11. AArrdduuiinnoo
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 opensource
electronics prototyping platform based on
flexible, easytouse
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 standalone
or they can communicate with software on
running on a computer (e.g. Flash, Processing,MaxMSP). ”
16. AArrdduuiinnoo
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/
22. CCaarraacctteerrííssttiiccaass ddoo AArrdduuiinnoo UUnnoo
Microcontrolador ATmega328P
Tensão Operacional 5 V
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
30. AAmmbbiieennttee ddee DDeesseennvvoollvviimmeennttoo
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).
33. CCoonnffiigguurraannddoo oo AAmmbbiieennttee
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>
35. CCoonnffiigguurraannddoo oo AAmmbbiieennttee
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”
36. ““HHeelllloo WWoorrlldd””
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
37. ““HHeelllloo WWoorrlldd””
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
}
39. EExxpplliiccaannddoo oo ccóóddiiggoo
Um sketch Arduino possui, no mínimo duas
funções:
setup():
Executada apenas uma vez, durante a inicialização
loop():
Função principal
40. EExxpplliiccaannddoo oo ccóóddiiggoo
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. EExxpplliiccaannddoo oo ccóóddiiggoo
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
43. BBrreeaaddbbooaarrdd ((PPrroottoobbooaarrdd))
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
45. RReessiissttoorr
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)
46. RReessiissttoorr
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 Ω
56. PPootteenncciiôômmeettrroo
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)
60. IInntteerraaccttiivvee LLEEDD CChhaassee EEffffeecctt
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; }
}
61. IInntteerraaccttiivvee LLEEDD CChhaassee EEffffeecctt
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
66. TTaaccttiillee SSwwiittcchh
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
67. TTaaccttiillee SSwwiittcchh
/*
* 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. TTaaccttiillee SSwwiittcchh
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
72. FFllooaattiinngg hhiigghh aabboovvee tthhee cclloouuddss
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. FFllooaattiinngg hhiigghh aabboovvee tthhee cclloouuddss
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!
75. RReessiissttoorr PPuullll--ddoowwnn//PPuullll--uupp
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
76. RReessiissttoorr PPuullll--ddoowwnn//PPuullll--uupp
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
84. IInntteerraaccttiivvee LLEEDD FFllaasshheerr
● 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
}
}
87. LLMM3355//LLMM3366 –– TTPPMM3355//TTPPMM3366
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
91. LLeennddoo aa TTeemmppeerraattuurraa
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:
92. LLeennddoo aa TTeemmppeerraattuurraa
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...
93. LLeennddoo aa TTeemmppeerraattuurraa
int temperaturaPin = 0;
int ledPin = 12;
float vIn = 5.0; //Tensao de entrada
void setup()
{
pinMode(ledPin, OUTPUT);
Serial.begin(9600);
}
void loop()
{
digitalWrite(ledPin, HIGH);
//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");
//Converter tensao para temperatura
float temperaturaC = voltagem * 100.0;
delay(1000);
Serial.print(temperaturaC);
Serial.println(" graus em C");
Serial.println(" ");
digitalWrite(ledPin, LOW);
delay(1000);
}
94. PPrroobblleemmss yyoouu mmaayy eennccoouunntteerr
wwiitthh mmuullttiippllee sseennssoorrss......
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
96. SSeennssiinngg LLiigghhtt
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”
98. LLDDRR aass aa VVoollttaaggee DDiivviiddeerr
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:
V =V cc∗
R2
R1+ R2
99. LLDDRR aass aa VVoollttaaggee DDiivviiddeerr
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.
V =V cc∗
R2
R1+ R2
100. SSeennssiinngg LLiigghhtt
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);
}
106. PPyySSeerriiaall
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
108. RReeffeerrêênncciiaass
Arduino Starter Kit Manual: A Complete
Beginners Guide To The Arduino
http://www.ladyada.net/learn/arduino/
http://blog.justen.eng.br/