80095094 Workshop Arduino
-
Upload
ernandofranco -
Category
Documents
-
view
16 -
download
3
Transcript of 80095094 Workshop Arduino
![Page 1: 80095094 Workshop Arduino](https://reader030.fdocuments.in/reader030/viewer/2022032801/55cf9710550346d0338f8e6a/html5/thumbnails/1.jpg)
Workshop de Arduino
(C) 2008, Filipe Valpereiro,http://www.inmotion.pt
![Page 2: 80095094 Workshop Arduino](https://reader030.fdocuments.in/reader030/viewer/2022032801/55cf9710550346d0338f8e6a/html5/thumbnails/2.jpg)
Características
• 16kB de memória Flash
• 1kB de RAM
• 16MHz (Apple II: 1MHz)
• 13 portas de I/O digital
• 6 portas de entrada analógica
• RS232, PWM, I2C, SPI
(C) 2008, Filipe Valpereiro,http://www.inmotion.pt
![Page 3: 80095094 Workshop Arduino](https://reader030.fdocuments.in/reader030/viewer/2022032801/55cf9710550346d0338f8e6a/html5/thumbnails/3.jpg)
(C) 2008, Filipe Valpereiro,http://www.inmotion.pt
![Page 4: 80095094 Workshop Arduino](https://reader030.fdocuments.in/reader030/viewer/2022032801/55cf9710550346d0338f8e6a/html5/thumbnails/4.jpg)
(C) 2008, Filipe Valpereiro,http://www.inmotion.pt
![Page 5: 80095094 Workshop Arduino](https://reader030.fdocuments.in/reader030/viewer/2022032801/55cf9710550346d0338f8e6a/html5/thumbnails/5.jpg)
Compilação de código
Para a tarefa corrente
Novo Sketch
Abrir Sketch
Guardar Sketch
Enviar código para o Arduino
Monitor de porta série
Criar nova Tab
Ambiente de Desenvolvimento
(C) 2008, Filipe Valpereiro,http://www.inmotion.pt
![Page 6: 80095094 Workshop Arduino](https://reader030.fdocuments.in/reader030/viewer/2022032801/55cf9710550346d0338f8e6a/html5/thumbnails/6.jpg)
1 2 34
Monitorização
1 - Velocidade da porta série
2, 3 - Envio de mensagens para o Arduino.
4 - Consola de output
(C) 2008, Filipe Valpereiro,http://www.inmotion.pt
![Page 7: 80095094 Workshop Arduino](https://reader030.fdocuments.in/reader030/viewer/2022032801/55cf9710550346d0338f8e6a/html5/thumbnails/7.jpg)
Exemplo 1int ledPin = 13; int count = 0;
void setup() { pinMode(ledPin, OUTPUT); Serial.begin(38400); }
void loop() { count = 0; while(Serial.available() > 0) { Serial.read(); digitalWrite(ledPin, HIGH); delay(250); digitalWrite(ledPin, LOW); delay(250); count++; } if(count) Serial.println(count); delay(100); }
(C) 2008, Filipe Valpereiro,http://www.inmotion.pt
![Page 8: 80095094 Workshop Arduino](https://reader030.fdocuments.in/reader030/viewer/2022032801/55cf9710550346d0338f8e6a/html5/thumbnails/8.jpg)
Arduino API
• Inspirada na linguagem Processing
• Abstrações simples do hardware
• Reutilização de código (Wiring, AVR, ...)
• Escrita em C/C++
(C) 2008, Filipe Valpereiro,http://www.inmotion.pt
![Page 9: 80095094 Workshop Arduino](https://reader030.fdocuments.in/reader030/viewer/2022032801/55cf9710550346d0338f8e6a/html5/thumbnails/9.jpg)
Estrutura de um programa
• Header
• Variáveis globais
• Setup
• Loop
(C) 2008, Filipe Valpereiro,http://www.inmotion.pt
![Page 10: 80095094 Workshop Arduino](https://reader030.fdocuments.in/reader030/viewer/2022032801/55cf9710550346d0338f8e6a/html5/thumbnails/10.jpg)
Tipos de dados básicos• boolean, char, byte
• int, unsigned int
• long, unsigned long
• float, double
• string, arrayO Arduino é um microcontrolador
de 8 bits!!! O GCC transforma alguns dos tipos de dados em código RISC do ATMEGA168
(C) 2008, Filipe Valpereiro,http://www.inmotion.pt
![Page 11: 80095094 Workshop Arduino](https://reader030.fdocuments.in/reader030/viewer/2022032801/55cf9710550346d0338f8e6a/html5/thumbnails/11.jpg)
Arduino APIConstantes utilizadas e modo de definição
HIGH | LOW INPUT | OUTPUT true | false
Notação decimal 123 | 123U | 123L | 123UL
Notação octal 0137
Notação hexadecimal 0x9F
(C) 2008, Filipe Valpereiro,http://www.inmotion.pt
![Page 12: 80095094 Workshop Arduino](https://reader030.fdocuments.in/reader030/viewer/2022032801/55cf9710550346d0338f8e6a/html5/thumbnails/12.jpg)
HIGHEm modo INPUT um pino HIGH quando lido com a função digitalRead tem um valor TRUE quando a tensão no pino é igual ou superior a 3V
Em modo OUTPUT um pino HIGH apresenta uma tensão de saída de 5V (source) até 50mA
(C) 2008, Filipe Valpereiro,http://www.inmotion.pt
![Page 13: 80095094 Workshop Arduino](https://reader030.fdocuments.in/reader030/viewer/2022032801/55cf9710550346d0338f8e6a/html5/thumbnails/13.jpg)
LOWEm modo INPUT um pino LOW quando lido com a função digitalRead tem um valor FALSE quando a tensão no pino é igual ou inferior a 2V
Em modo OUTPUT um pino LOW é colocado a 0V. Desta forma ele pode absorver (sink) até 40mA de corrente.
(C) 2008, Filipe Valpereiro,http://www.inmotion.pt
![Page 14: 80095094 Workshop Arduino](https://reader030.fdocuments.in/reader030/viewer/2022032801/55cf9710550346d0338f8e6a/html5/thumbnails/14.jpg)
ExtrasPROGMEMIndica ao compilador que deve guardar os dados de uma variável na memória flash em vez de utilizar a memória RAM. Especificado em: <avr/pgmspace.h>
dataType varName[] PROGMEM = {d0, ..., dn};
Ex: char message[] = “Hello World”; // 12 bytes em RAMchar message[] PROGMEM = “Hello World”; // 12 bytes em FLASH
Desvantagens:Os dados guardados na memória FLASH devem ser lidos com utilização de uma API específica (pgm_read_word, pgm_read_word_near, ...)
(C) 2008, Filipe Valpereiro,http://www.inmotion.pt
![Page 15: 80095094 Workshop Arduino](https://reader030.fdocuments.in/reader030/viewer/2022032801/55cf9710550346d0338f8e6a/html5/thumbnails/15.jpg)
Registos especiais IExistem três portas especiais no Arduino, que permitem a leitura simultânea de várias entradas digitais, aumentando a eficiência das operações de I/O.
PORTB (pinos 8 a 13)
PORTC (pinos de input analógico)PORTD (pinos 0 a 7)
Cada porta dispõem dos seguintes registos:DDRD - Data Direction Register (para a porta D)PORTD - O registo da porta D PIND - Registo de input dos pinos da porta D (read-only)
(C) 2008, Filipe Valpereiro,http://www.inmotion.pt
![Page 16: 80095094 Workshop Arduino](https://reader030.fdocuments.in/reader030/viewer/2022032801/55cf9710550346d0338f8e6a/html5/thumbnails/16.jpg)
Registos especiais IIExemplo de leitura da PORTAD (pinos 0 a 7)
// pinos 2 a 7 para output, pinos 0 e 1 inalteradosDDRD = DDRD | B11111100;
// coloca os pinos 3, 5 e 7 a HIGHPORTD = B10101000;
// lê os pinos 2 a 7byte data = PIND & B11111100;
A utilização destas portas torna o código mais difícil de depurar.
(C) 2008, Filipe Valpereiro,http://www.inmotion.pt
![Page 17: 80095094 Workshop Arduino](https://reader030.fdocuments.in/reader030/viewer/2022032801/55cf9710550346d0338f8e6a/html5/thumbnails/17.jpg)
HAL
(C) 2008, Filipe Valpereiro,http://www.inmotion.pt
![Page 18: 80095094 Workshop Arduino](https://reader030.fdocuments.in/reader030/viewer/2022032801/55cf9710550346d0338f8e6a/html5/thumbnails/18.jpg)
Abstrações de Hardware I
• Digital I/O
• Analog I/O
• Advanced I/O
• Temporizadores
• Comunicação série
(C) 2008, Filipe Valpereiro,http://www.inmotion.pt
![Page 19: 80095094 Workshop Arduino](https://reader030.fdocuments.in/reader030/viewer/2022032801/55cf9710550346d0338f8e6a/html5/thumbnails/19.jpg)
Digital I/OpinMode(pin, mode)Define os modos dos pinos 0 a 13, sendo que o pino 0 e o pino 1 estão geralmente reservados para a porta série (RX/TX). Os pinos de entrada analógicos (0 a 5) também podem ser utilizados como pinos de entrada digital (14 a 19)
digitalWrite(pin, value)Escreve o valor TRUE ou FALSE no pino.
digitalRead(pin)Lê o valor de um pino (TRUE ou FALSE). Se o pino não estiver ligado a leitura poderá oscilar.
(C) 2008, Filipe Valpereiro,http://www.inmotion.pt
![Page 20: 80095094 Workshop Arduino](https://reader030.fdocuments.in/reader030/viewer/2022032801/55cf9710550346d0338f8e6a/html5/thumbnails/20.jpg)
Analog I/OanalogRead(pin)Lê um valor analógico (0 a 5V) nos pinos 0 a 5. A resolução do ADC é de 10bits, permitindo mapear tensões de entrada em valores inteiros até 1023 com uma resolução de 4.9mV por valor. O tempo de conversão e leitura é de 100uS (10ks amostras por segundo)
analogWrite(pin)Escreve um valor analógico (PWM) com uma frequência de 490Hz. Esta função só está disponível nos pinos 3, 5, 6, 9, 10 e 11
(C) 2008, Filipe Valpereiro,http://www.inmotion.pt
![Page 21: 80095094 Workshop Arduino](https://reader030.fdocuments.in/reader030/viewer/2022032801/55cf9710550346d0338f8e6a/html5/thumbnails/21.jpg)
PWM vs Sinal Analógico
(C) 2008, Filipe Valpereiro,http://www.inmotion.pt
![Page 22: 80095094 Workshop Arduino](https://reader030.fdocuments.in/reader030/viewer/2022032801/55cf9710550346d0338f8e6a/html5/thumbnails/22.jpg)
Sinal PWMoutput = (on_time / off_time) * max_voltage
(C) 2008, Filipe Valpereiro,http://www.inmotion.pt
![Page 23: 80095094 Workshop Arduino](https://reader030.fdocuments.in/reader030/viewer/2022032801/55cf9710550346d0338f8e6a/html5/thumbnails/23.jpg)
Características do sinal PWMLarguro do impulso numa gama de valores mínimo e máximo
Período do impulso = 1 / impulsos por segundo
Tensão do impulso em valores bem definidos ex: 0 a 5V
(C) 2008, Filipe Valpereiro,http://www.inmotion.pt
![Page 24: 80095094 Workshop Arduino](https://reader030.fdocuments.in/reader030/viewer/2022032801/55cf9710550346d0338f8e6a/html5/thumbnails/24.jpg)
Aplicações do sinal PWM IInterface de dados para sensores ou circuitos externos. O valor a enviar é proporcional ao período do impulso.
(C) 2008, Filipe Valpereiro,http://www.inmotion.pt
![Page 25: 80095094 Workshop Arduino](https://reader030.fdocuments.in/reader030/viewer/2022032801/55cf9710550346d0338f8e6a/html5/thumbnails/25.jpg)
Aplicações do sinal PWM II
Frequencia PWM de 50HzImpulsos desde 1 a 2 milisegundo
1 milisec = posição a 0º2 milisec = posição a 180º
(C) 2008, Filipe Valpereiro,http://www.inmotion.pt
![Page 26: 80095094 Workshop Arduino](https://reader030.fdocuments.in/reader030/viewer/2022032801/55cf9710550346d0338f8e6a/html5/thumbnails/26.jpg)
Aplicações do sinal PWM III
(C) 2008, Filipe Valpereiro,http://www.inmotion.pt
![Page 27: 80095094 Workshop Arduino](https://reader030.fdocuments.in/reader030/viewer/2022032801/55cf9710550346d0338f8e6a/html5/thumbnails/27.jpg)
Advanced I/OshiftOut(dataPin, clockPin, bitOrder, value)Envia um conjunto de 8 bits um a um pela ordem indicada (MSBFIRST, LSBFIRST). Quando o bit é escrito, o pino do clock é activado dando indicação de que o valor já está disponível. Este modo de comunicação é conhecido por SPI (Synchronous Protocol Interface). Os dois dispositivos estão sempre sincronizados e comunicam perto do limite de velocidade máxima.
unsigned long pulseIn(pin, value)unsigned long pulseIn(pin, value, timeout)Lê um valor PWM de um pino de I/O digital. A leitura do impulso digital é sincronizada no valor indicado (HIGH ou LOW) sendo medido o tempo decorrido até que o valor de entrada mude de estado. Retorna valores de leitura fiáveis para impulso entre 10uS e 3 minutos.
(C) 2008, Filipe Valpereiro,http://www.inmotion.pt
![Page 28: 80095094 Workshop Arduino](https://reader030.fdocuments.in/reader030/viewer/2022032801/55cf9710550346d0338f8e6a/html5/thumbnails/28.jpg)
shiftOut(dPin, cPin, order, value)
![Page 29: 80095094 Workshop Arduino](https://reader030.fdocuments.in/reader030/viewer/2022032801/55cf9710550346d0338f8e6a/html5/thumbnails/29.jpg)
Temporizadoresunsigned long millis()Número de millisegundos decorridos desde o início de execução do programa.
delay(ms)Esta função gasta ciclos de relógio até ter decorrido o tempo indicado em milisegundos. Quando se utiliza um valor inteiro superior a 32726 deve-se utilizar o prefixo UL.
delayMicroseconds(us)Esta função gasta ciclos de relógio até ter decorrido o tempo indicado em microsegundos. A actual implementação desta função garante resultados até um valor de 16383 uS.
(C) 2008, Filipe Valpereiro,http://www.inmotion.pt
![Page 30: 80095094 Workshop Arduino](https://reader030.fdocuments.in/reader030/viewer/2022032801/55cf9710550346d0338f8e6a/html5/thumbnails/30.jpg)
(C) 2008, Filipe Valpereiro,http://www.inmotion.pt
Comunicação Série
![Page 31: 80095094 Workshop Arduino](https://reader030.fdocuments.in/reader030/viewer/2022032801/55cf9710550346d0338f8e6a/html5/thumbnails/31.jpg)
Comunicação Série ISerial.begin(speed)Configura a porta série (pinos 0 e 1) para comunicar com a velocidade indicada.
int Serial.available()Número de bytes (caracteres) disponíveis na porta série.
int Serial.read()Lê um byte da porta série.
Serial.flush()Limpa os dados da porta série, isto é: qualquer chamada a Serial.available() ou Serial.read() retornam os dados mais recentes depois da última chamada a esta função.
(C) 2008, Filipe Valpereiro,http://www.inmotion.pt
![Page 32: 80095094 Workshop Arduino](https://reader030.fdocuments.in/reader030/viewer/2022032801/55cf9710550346d0338f8e6a/html5/thumbnails/32.jpg)
Comunicação Série IISerial.print(b)Envia pela porta série qualquer tipo de valor inteiro em formato ASCII
Serial.print(b, fmt)Envia pela porta série qualquer tipo de valor inteiro em formato ASCII de acordo com um dos seguintes formatos: DEC, HEX, OCT, BIN, BYTE
Serial.print(str)Envia pela porta série uma string ASCII.
(C) 2008, Filipe Valpereiro,http://www.inmotion.pt
![Page 33: 80095094 Workshop Arduino](https://reader030.fdocuments.in/reader030/viewer/2022032801/55cf9710550346d0338f8e6a/html5/thumbnails/33.jpg)
Comunicação Série IIISerial.println()Envia pela porta série os caracteres ASCII 13 ‘\r’ e ASCII 10 ‘\n’
Serial.println(b)Serial.println(b, fmt)Serial.println(str)Ver família de funções Serial.print(). Estas funções colocam os dados na porta série juntamente com os caracteres ASCII 13 e 10
(C) 2008, Filipe Valpereiro,http://www.inmotion.pt
![Page 34: 80095094 Workshop Arduino](https://reader030.fdocuments.in/reader030/viewer/2022032801/55cf9710550346d0338f8e6a/html5/thumbnails/34.jpg)
Abstrações de Hardware II
• Interrupts
• Interrupts externos
(C) 2008, Filipe Valpereiro,http://www.inmotion.pt
![Page 35: 80095094 Workshop Arduino](https://reader030.fdocuments.in/reader030/viewer/2022032801/55cf9710550346d0338f8e6a/html5/thumbnails/35.jpg)
Interruptsinterrupts()Activa o modo de interrupt depois deste ter sido desactivo pela função noInterrupts(). Os interrupts permitem a execução de tarefas em background. Por omissão, o Arduino executa sempre com este modo activo.
noInterrupts()Desactiva o modo de interrupts. Algumas funções podem produzir resultados inesperados se este modo estiver desactivo, em especial funções de tempo e comunicação de dados com o exterior. Contudo, em secções críticas de código é conveniente desligar os interrupts.
(C) 2008, Filipe Valpereiro,http://www.inmotion.pt
![Page 36: 80095094 Workshop Arduino](https://reader030.fdocuments.in/reader030/viewer/2022032801/55cf9710550346d0338f8e6a/html5/thumbnails/36.jpg)
Interrupts ExternosattachInterrupt(interrupt, function, mode)Activa um interrupt externo (0, 1 nos pinos 2, 3) e associa a função indicada ao interrupt. A função será executada quando o modo indicado for detectado na porta correspondente. Os modos de activação são: LOW, CHANGE, RISING, FALLINGQualquer variável modificada pela função associada deve ser declarada como volatil
detachInterrupt(interrupt)Desliga um interrupt externo.
(C) 2008, Filipe Valpereiro,http://www.inmotion.pt
![Page 37: 80095094 Workshop Arduino](https://reader030.fdocuments.in/reader030/viewer/2022032801/55cf9710550346d0338f8e6a/html5/thumbnails/37.jpg)
Bibliotecas Básicas
• Math
• Trigonometria
• Números aleatórios
(C) 2008, Filipe Valpereiro,http://www.inmotion.pt
![Page 38: 80095094 Workshop Arduino](https://reader030.fdocuments.in/reader030/viewer/2022032801/55cf9710550346d0338f8e6a/html5/thumbnails/38.jpg)
Mathabs(x)min(x, y)max(x, y)
constrain(x, a, b)Restringe um número x à gama de valores [a, b] para todos os tipos de dados.
map(value, fromLow, fromHigh, toLow, toHigh)Mapeia um valor da gama [fromLow, fromHigh] para a gama [toLow, toHigh].
pow(base, exponent)Calcula a potência da base. Esta função permite a utilização de frações, úteis para gerar mapeamentos exponenciais de valores ou curvas (ex: curva de comportamento de um sensor)
(C) 2008, Filipe Valpereiro,http://www.inmotion.pt
![Page 39: 80095094 Workshop Arduino](https://reader030.fdocuments.in/reader030/viewer/2022032801/55cf9710550346d0338f8e6a/html5/thumbnails/39.jpg)
GP2D12/GP2D15
Fig.5 Analog Output Voltage vs. Surface
Illuminance of Reflective Object
Fig.4 Distance Characteristics
Fig.6 Analog Output Voltage vs.Distance to
Reflective Object
0 5 10 15 20 25 30 35 40 45 50 55 60 65 70 75 80
L H
H L
Hystersis width
Distance to reflective object L (cm)
(Non detection)
(Detection)
Outp
ut (V
)
Output H
Output L
Output switching point distanceL=24±3cm
GP2D15
An
alo
g o
utp
ut
vo
ltag
e V
O (
V)
Surface illuminance of reflective object (lx)
0
3.0
2.8
2.4
2.0
1.6
1.2
0.8
0.4
0 1400012000100004000 80002000 6000
Light source equivalent to sun light
GP2D12
Reflective objectKodak Co., Ltd. gray cards R-27(reflective ratio : 90%)
L=10cm
L=30cm
L=60cm
GP2D12
illuminance meter
Draft Reflectivity
White 90%
Gray 18%
Distance to reflective object L (cm)
An
alo
g o
utp
ut
vo
ltag
e V
O (
V)
0 50 8060 70403020100
3.0
2.8
2.4
2.0
1.6
1.2
0.8
0.4
White
Gray
GP2D12
Fig.7 Analog Output Voltage vs.Ambient
Temperature
Fig.8 Analog Output Voltage vs.Detection
Distance
An
alo
g o
utp
ut
vo
ltag
e V
O (
V)
30 9040 7050 60 800!10 10!20 200
3.0
2.8
2.4
2.0
1.6
1.2
0.8
0.4
Ambient temperature Ta (°C)
L=10cm
L=15cm
L=20cm
L=50cm L=40cm L=30cm
L=60cm L=70cm L=80cm
GP2D12
An
alo
g o
utp
ut
vo
ltag
e V
O (
V)
!3 52 3!1 40!4 1!5 !20
3.0
2.8
2.4
2.0
1.6
1.2
0.8
0.4
Detection distance X (cm)
L(Distance toreflective object)
Kodak Co., Ltd. gray cards R-27(reflective ratio : 90%)
SensorGP2D12
X(Detection distance)
!X(Detection distance)
L=10cm
L=20cm
L=30cm L=40cm
L=80cm
GP2D12
Curva de comportamento do sensor Sharp GP2D12
(C) 2008, Filipe Valpereiro,http://www.inmotion.pt
Exemplo da função POW
![Page 40: 80095094 Workshop Arduino](https://reader030.fdocuments.in/reader030/viewer/2022032801/55cf9710550346d0338f8e6a/html5/thumbnails/40.jpg)
TrigonometriaAs seguintes funções estão disponíveis:
sin(angle)cos(angle)tan(angle)
(C) 2008, Filipe Valpereiro,http://www.inmotion.pt
![Page 41: 80095094 Workshop Arduino](https://reader030.fdocuments.in/reader030/viewer/2022032801/55cf9710550346d0338f8e6a/html5/thumbnails/41.jpg)
Números aleatóriosrandomSeed(seed)long random(max)long random(min, max)
A função random utiliza o seu valor de seed se este não for especeficado.
(C) 2008, Filipe Valpereiro,http://www.inmotion.pt
![Page 42: 80095094 Workshop Arduino](https://reader030.fdocuments.in/reader030/viewer/2022032801/55cf9710550346d0338f8e6a/html5/thumbnails/42.jpg)
Bibliotecas avançadas I
• EEPROM interna, 512 bytes
• SoftwareSerial
• Wire
(C) 2008, Filipe Valpereiro,http://www.inmotion.pt
![Page 43: 80095094 Workshop Arduino](https://reader030.fdocuments.in/reader030/viewer/2022032801/55cf9710550346d0338f8e6a/html5/thumbnails/43.jpg)
EEPROM interna O Arduino tem 512 bytes de memória permanente (EEPROM) interna (ATMEGA168) com capacidade para 100000 ciclos de escrita.
byte EEPROM.read(address)EEPROM.write(address, value)Leitura/escrita da EEPROM. Gama de endereços de 0 a 511.
(C) 2008, Filipe Valpereiro,http://www.inmotion.pt
![Page 44: 80095094 Workshop Arduino](https://reader030.fdocuments.in/reader030/viewer/2022032801/55cf9710550346d0338f8e6a/html5/thumbnails/44.jpg)
SoftwareSerialO Arduino tem suporte nativo para comunicação e dados através da porta série (pinos 0 e 1), sendo que pode receber até 64 bytes na UART. Esta biblioteca implementa uma porta série por software com as seguintes limitações:
• Velocidade até 9600 BAUD
• A função Serial.available() não está disponível
• Serial.read() só retorna depois de receber dados
• Só recebe dados durante a execução da função Serial.read()
(C) 2008, Filipe Valpereiro,http://www.inmotion.pt
![Page 45: 80095094 Workshop Arduino](https://reader030.fdocuments.in/reader030/viewer/2022032801/55cf9710550346d0338f8e6a/html5/thumbnails/45.jpg)
Barramento I2CDesenvolvido pela Philips em 1992 permite a conexão de 112 dispositivos num barramento de duas linhas digitais até alguns metros de extensão. Suporta as seguintes velocidades de transferência de dados:
• low-speed (10kbits/s)
• standard mode (100kbits/s)
• fast mode (400kbits/s)
• fast mode plus (1Mbit/s)
• high speed mode (3.4 Mbits/s)
(C) 2008, Filipe Valpereiro,http://www.inmotion.pt
![Page 46: 80095094 Workshop Arduino](https://reader030.fdocuments.in/reader030/viewer/2022032801/55cf9710550346d0338f8e6a/html5/thumbnails/46.jpg)
Diagrama temporal I2C
(C) 2008, Filipe Valpereiro,http://www.inmotion.pt
![Page 47: 80095094 Workshop Arduino](https://reader030.fdocuments.in/reader030/viewer/2022032801/55cf9710550346d0338f8e6a/html5/thumbnails/47.jpg)
WireA biblioteca Wire permite a comunicação com dispositivos I2C ou TWI. No Arduino as linhas SDA (Serial Data Line) e SDL (Serial Data Clock) estão disponíveis nos pinos 4 e 5 (geralmente configurados como entradas analógicas)
(C) 2008, Filipe Valpereiro,http://www.inmotion.pt
![Page 48: 80095094 Workshop Arduino](https://reader030.fdocuments.in/reader030/viewer/2022032801/55cf9710550346d0338f8e6a/html5/thumbnails/48.jpg)
Wire API Ibegin()begin(address)Liga o Arduino ao barramento I2C como master ou slave, indicando o endereço.
requestFrom(address, quantity)Envia um pedido de dados a um dispositivo. O barramento irá devolver n bytes que passam a estar disponíveis para leitura com as funções Wire.available() e Wire.receive()
beginTransmission(address)Inicia a transmissão de dados para o dispositivo indicado. Os pedidos de envio seguintes via send() serão guardados numa queue e enviados quando é executada a função endTransmission()
(C) 2008, Filipe Valpereiro,http://www.inmotion.pt
![Page 49: 80095094 Workshop Arduino](https://reader030.fdocuments.in/reader030/viewer/2022032801/55cf9710550346d0338f8e6a/html5/thumbnails/49.jpg)
Wire API IIendTransmission()Envia os dado da queue para o dispositivo indicado anteriormente.
send(value)send(string)send(data, quantity)Envia dados ao de um dispositivo slave em resposta a um pedido do master ou guarda dados na queue para envio posterior (de master para slave) durante o intervalo entre uma chamada a beginTransmission() e endTransmission()
(C) 2008, Filipe Valpereiro,http://www.inmotion.pt
![Page 50: 80095094 Workshop Arduino](https://reader030.fdocuments.in/reader030/viewer/2022032801/55cf9710550346d0338f8e6a/html5/thumbnails/50.jpg)
Wire API IIIbyte available()Retorna o número de bytes disponíveis para leitura: função receive() Esta função deve ser chamada num dispositivo master depois da chamada à função requestFrom() ou dentro da função onReceive() no cado de dispositivos slave
byte receive()Lê um byte de dados de um master/slave
onReceive(handler)Regista uma função que é chamada quando um dispositivo slave recebe uma transmissão de dados de um master.
onRequest(handler)Regista uma função que é chamada quando um dispositivo master pede uma transmissão de dados um slave.
(C) 2008, Filipe Valpereiro,http://www.inmotion.pt
![Page 51: 80095094 Workshop Arduino](https://reader030.fdocuments.in/reader030/viewer/2022032801/55cf9710550346d0338f8e6a/html5/thumbnails/51.jpg)
Bibliotecas avançadas II
• Metro
• MsTimer2
• Firmata
• SimpleMessageSystem
(C) 2008, Filipe Valpereiro,http://www.inmotion.pt
![Page 52: 80095094 Workshop Arduino](https://reader030.fdocuments.in/reader030/viewer/2022032801/55cf9710550346d0338f8e6a/html5/thumbnails/52.jpg)
Eventos periódicos
• Surgem sempre que temos mais que uma tarefa recorrentes
• Podem ser modelados com tabelas de periodicidade ou com a biblioteca Metro
(C) 2008, Filipe Valpereiro,http://www.inmotion.pt
![Page 53: 80095094 Workshop Arduino](https://reader030.fdocuments.in/reader030/viewer/2022032801/55cf9710550346d0338f8e6a/html5/thumbnails/53.jpg)
Eventos periódicosÉ possível programar um Arduino para pulsar dois LEDS com períodos diferentes? E para três? e para N?
Uma solução:Metro led_1 = Metro(100);Metro led_2 = Metro(250);
if(led_1.check() == 1)digitalWrite(LED1, HIGH);
...
(C) 2008, Filipe Valpereiro,http://www.inmotion.pt
![Page 54: 80095094 Workshop Arduino](https://reader030.fdocuments.in/reader030/viewer/2022032801/55cf9710550346d0338f8e6a/html5/thumbnails/54.jpg)
MetroEsta biblioteca facilita a implementação de eventos.
Metro(ms)Constrói um objecto metro com um período de ms milisegundos.
check()Verifica o estado do período de tempo. Devolve 1 se já passou o intervalo definido ou 0 caso contrário.
interval(ms)Altera o valor actual do perído do evento a associado.
(C) 2008, Filipe Valpereiro,http://www.inmotion.pt
![Page 55: 80095094 Workshop Arduino](https://reader030.fdocuments.in/reader030/viewer/2022032801/55cf9710550346d0338f8e6a/html5/thumbnails/55.jpg)
MsTimer2Esta biblioteca facilita a utilização do Timer2 com uma resolução de 1milisegundo
MsTimer2::set(ms, task)Permite a execução da tarefa indicada com um período mínimo de ms milisegundos.
MsTimer::start()Inicializa o Timer2.
MsTimer::stop()Termina o Timer2.
(C) 2008, Filipe Valpereiro,http://www.inmotion.pt
![Page 56: 80095094 Workshop Arduino](https://reader030.fdocuments.in/reader030/viewer/2022032801/55cf9710550346d0338f8e6a/html5/thumbnails/56.jpg)
FirmataEsta biblioteca permite a implementação de firmware’s simples, expondo o hardware do Arduino através de comandos enviados pela porta série.
O protocolo de transmissão de dados é controlado pela biblioteca, permitindo que todo o trabalho necessário se concentre na lógica de controlo.
(C) 2008, Filipe Valpereiro,http://www.inmotion.pt
![Page 57: 80095094 Workshop Arduino](https://reader030.fdocuments.in/reader030/viewer/2022032801/55cf9710550346d0338f8e6a/html5/thumbnails/57.jpg)
SimpleMessageSystemEsta biblioteca permite a troca de mensagens de e para o Arduino. É possível com esta biblioteca controlar directamente os valores de cada uma das portas digitais bem como ler valores analógicos.
(C) 2008, Filipe Valpereiro,http://www.inmotion.pt
![Page 58: 80095094 Workshop Arduino](https://reader030.fdocuments.in/reader030/viewer/2022032801/55cf9710550346d0338f8e6a/html5/thumbnails/58.jpg)
SPI InterfaceManipulação directa do barramento SPI por registos
SPCRSPI Control Register, utilizado para configurar o barramento SPI
SPSRSPI Status Register, utilizado pelo ATMEGA para indicar o estado de uma comunicação.
SPDRSPI Data Register, utilizado para enviar dados pelo barramento SPI.
![Page 59: 80095094 Workshop Arduino](https://reader030.fdocuments.in/reader030/viewer/2022032801/55cf9710550346d0338f8e6a/html5/thumbnails/59.jpg)
Ligação de um dispositivo SPISLCKSerial clock
MOSIMaster Output Slave Input
MISOMaster Input, Slave Output
SSSlave Select
![Page 60: 80095094 Workshop Arduino](https://reader030.fdocuments.in/reader030/viewer/2022032801/55cf9710550346d0338f8e6a/html5/thumbnails/60.jpg)
(C) 2008, Filipe Valpereiro,http://www.inmotion.pt
Diagrama Temporal, SPI
![Page 61: 80095094 Workshop Arduino](https://reader030.fdocuments.in/reader030/viewer/2022032801/55cf9710550346d0338f8e6a/html5/thumbnails/61.jpg)
Alguns Links Úteis
(C) 2008, Filipe Valpereiro,http://www.inmotion.pt
http://arduino.cc/en/Tutorial/HomePage
http://arduino.cc/en/Reference/HomePage
http://en.wikipedia.org/wiki/Serial_Peripheral_Interface_Bus
http://en.wikipedia.org/wiki/I2c
Alguns manuais em PDF e exemploshttp://todbot.com/blog/bionicarduino/