Buscar

Workshop_ Arduino

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes
Você viu 3, do total de 61 páginas

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes
Você viu 6, do total de 61 páginas

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes
Você viu 9, do total de 61 páginas

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes

Prévia do material em texto

Workshop de Arduino
(C) 2008, Filipe Valpereiro,
http://www.inmotion.pt
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
(C) 2008, Filipe Valpereiro,
http://www.inmotion.pt
(C) 2008, Filipe Valpereiro,
http://www.inmotion.pt
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
1 2 3
4
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
Exemplo 1
int 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
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
Estrutura de um programa
• Header
• Variáveis globais
• Setup
• Loop
(C) 2008, Filipe Valpereiro,
http://www.inmotion.pt
Tipos de dados básicos
• boolean, char, byte
• int, unsigned int
• long, unsigned long
• float, double
• string, array
O 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
Arduino API
Constantes 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
HIGH
Em 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
LOW
Em 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
Extras
PROGMEM
Indica 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 RAM
char 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
Registos especiais I
Existem 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
Registos especiais II
Exemplo de leitura da PORTAD (pinos 0 a 7)
// pinos 2 a 7 para output, pinos 0 e 1 inalterados
DDRD = DDRD | B11111100; 
// coloca os pinos 3, 5 e 7 a HIGH
PORTD = B10101000; 
// lê os pinos 2 a 7
byte 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
HAL
(C) 2008, Filipe Valpereiro,
http://www.inmotion.pt
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
Digital I/O
pinMode(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
Analog I/O
analogRead(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
PWM vs Sinal Analógico
(C) 2008, Filipe Valpereiro,
http://www.inmotion.pt
Sinal PWM
output = (on_time / off_time) * max_voltage
(C) 2008, Filipe Valpereiro,
http://www.inmotion.pt
Características do sinal PWM
Larguro 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
Aplicações do sinal PWM I
Interface 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
Aplicações do sinal PWM II
Frequencia PWM de 50Hz
Impulsos 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
Aplicações do sinal PWM III
(C) 2008, Filipe Valpereiro,
http://www.inmotion.pt
Advanced I/O
shiftOut(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
shiftOut(dPin, cPin, order, value)
Temporizadores
unsigned 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
(C) 2008, Filipe Valpereiro,
http://www.inmotion.pt
Comunicação Série
Comunicação Série I
Serial.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 portasé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
Comunicação Série II
Serial.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
Comunicação Série III
Serial.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
Abstrações de Hardware II
• Interrupts
• Interrupts externos
(C) 2008, Filipe Valpereiro,
http://www.inmotion.pt
Interrupts
interrupts()
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
Interrupts Externos
attachInterrupt(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, FALLING
Qualquer 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
Bibliotecas Básicas
• Math
• Trigonometria
• Números aleatórios
(C) 2008, Filipe Valpereiro,
http://www.inmotion.pt
Math
abs(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
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)
O
u
tp
u
t 
(V
)
Output H
Output L
Output switching point distance
L=24±3cm
GP2D15
A
n
al
o
g
 o
u
tp
u
t 
v
o
lt
ag
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 object
Kodak 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)
A
n
al
o
g
 o
u
tp
u
t 
v
o
lt
ag
e 
V
O
 (
V
)
0 50 8060 7040302010
0
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
A
n
al
o
g
 o
u
tp
u
t 
v
o
lt
ag
e 
V
O
 (
V
)
30 9040 7050 60 800!10 10!20 20
0
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
A
n
al
o
g
 o
u
tp
u
t 
v
o
lt
ag
e 
V
O
 (
V
)
!3 52 3!1 40!4 1!5 !2
0
3.0
2.8
2.4
2.0
1.6
1.2
0.8
0.4
Detection distance X (cm)
L(Distance to
reflective object)
Kodak Co., Ltd. gray cards R-27
(reflective ratio : 90%)
Sensor
GP2D12
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
Trigonometria
As seguintes funções estão disponíveis:
sin(angle)
cos(angle)
tan(angle)
(C) 2008, Filipe Valpereiro,
http://www.inmotion.pt
Números aleatórios
randomSeed(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
Bibliotecas avançadas I
• EEPROM interna, 512 bytes
• SoftwareSerial
• Wire
(C) 2008, Filipe Valpereiro,
http://www.inmotion.pt
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
SoftwareSerial
O 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
Barramento I2C
Desenvolvido 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
Diagrama temporal I2C
(C) 2008, Filipe Valpereiro,
http://www.inmotion.pt
Wire
A 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
Wire API I
begin()
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
Wire API II
endTransmission()
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
Wire API III
byte 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 dispositivoslave 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
Bibliotecas avançadas II
• Metro
• MsTimer2
• Firmata
• SimpleMessageSystem
(C) 2008, Filipe Valpereiro,
http://www.inmotion.pt
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
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
Metro
Esta 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
MsTimer2
Esta 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
Firmata
Esta 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
SimpleMessageSystem
Esta 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
SPI Interface
Manipulação directa do barramento SPI por registos
SPCR
SPI Control Register, utilizado para configurar o barramento SPI
SPSR
SPI Status Register, utilizado pelo ATMEGA para indicar o estado de uma comunicação.
SPDR
SPI Data Register, utilizado para enviar dados pelo barramento SPI.
Ligação de um dispositivo SPI
SLCK
Serial clock 
MOSI
Master Output Slave Input
MISO
Master Input, Slave Output
SS
Slave Select
(C) 2008, Filipe Valpereiro,
http://www.inmotion.pt
Diagrama Temporal, SPI
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 exemplos
http://todbot.com/blog/bionicarduino/

Outros materiais