comunicação serial com o arduino
DESCRIPTION
Comunicação Serial com o Arduino. Prof. Cláudio Nov-2011. Comandos. Comunicação Ponto a Ponto ( Peer-to-Peer = P2P) Configuração da Porta Serial Informação (bytes) disponível para leitura. // inicia a comunicação serial: Serial. begin (9600);. // bytes disponíveis - PowerPoint PPT PresentationTRANSCRIPT
Comunicação Serial com o ArduinoProf. Cláudio
Nov-2011
Pro
f. C
láu
dio
A.
Fle
ury
-
N
ov
-20
11
2
ComandosComunicação Ponto a Ponto (Peer-to-Peer =
P2P)Configuração da Porta Serial
Informação (bytes) disponível para leitura
// inicia a comunicação serial: Serial.begin(9600);
// bytes disponíveisn = Serial.available();
Pro
f. C
láu
dio
A.
Fle
ury
-
N
ov
-20
11
3
ComandosLeitura da Porta Serial
Grava (escreve) na Porta Serial
// lê byte da porta serialcarac = Serial.read();
// grava byte(s) na porta serialSerial.print(carac);// idem, porém com CR ao final da gravaçãoSerial.println(seq);
Pro
f. C
láu
dio
A.
Fle
ury
-
N
ov
-20
11
4
ExemploComandar remotamente o acendimento proporcional de um
LED ligado a uma porta de saída analógica Usuário remoto envia comando numérico (0 a 255) para
controlar o nível de iluminamento de um LED conectado a uma porta analógica do Arduino
Pro
f. C
láu
dio
A.
Fle
ury
-
N
ov
-20
11
5
ExemploComandar remotamente o acendimento proporcional de um
LED ligado a uma porta de saída analógica#include <LiquidCrystal.h>// inicia LCD com os números dos pinos da interfaceLiquidCrystal lcd(12, 11, 5, 4, 3, 2);const int pinoLed = 9; // o pino no qual o LED está ligadoint pos = 0; // posição de armazenamento do caracter rxdo
void setup() { Serial.begin(9600); // inicia a comunicação serial pinMode(pinoLed, OUTPUT); // inicia o ledPin como saída pinMode(10, OUTPUT); lcd.begin(16, 2); // número de linhas e colunas do LCD: 16 x 2 lcd.println("Aguardando CMD: "); lcd.print("999<ENTER>"); Serial.println("Aguardando Comando Remoto (999<ENTER>): ");}
int decodifica(char *s) { int soma, i; for(soma=i=0; (s[i]!=0) && (i<pos); i++) soma = soma*10 + (s[i]-48); return soma;}
Pro
f. C
láu
dio
A.
Fle
ury
-
N
ov
-20
11
6
ExemploComandar remotamente o acendimento proporcional de um
LED ligado a uma porta de saída analógicavoid loop() { char j, n, carac, seq[20]; int brilho;
n = Serial.available(); // qtde de dados enviados pelo remoto for(j=0; j<n; j++) { carac = Serial.read(); if(carac == 13 || pos > 2) // lê bytes até encontrar CR (0x0D): break; seq[pos++] = carac; } if((carac == 13) || (pos > 2)) { seq[pos] = '\0'; Serial.print(" - "); Serial.println(seq); brilho = decodifica(seq); if(brilho > 255) brilho = 255; if(brilho < 0) brilho = 0; pos = 0; lcd.setCursor(0, 1); lcd.print(" "); lcd.setCursor(0, 1); lcd.print(brilho); analogWrite(pinoLed, (byte)brilho); // ajusta o brilho do LED }}
Pro
f. C
láu
dio
A.
Fle
ury
-
N
ov
-20
11
7
Comunicação Serial em RedeInter-Integrated Circuit Bus (I2C – pronounced as ‘aɪ-
skwered-sɪ’) Barramento com dois fios para conexão de CI’s (dispositivos)
Linha Serial DAta (SDA) - para dados Linha Serial CLock (SCL) - para clock
Desenvolvido pela Philips Semiconductor (hoje, NXP) em 1996
Video
Pro
f. C
láu
dio
A.
Fle
ury
-
N
ov
-20
11
8
Comunicação Serial em RedeInter-Integrated Circuit Bus (I2C – pronounced as ‘aɪ-
skwered-sɪ’) fSCL: Standard até 100kHz, Fast até 400 kHz e High Speed até
3,4 MHz Protocolo Master(s)-Slave(s) com até 112 dispositivos em cada
barramento Comprimento máximo do barramento = 100m Dispositivos (podem ser Master ou Slave a qualquer
momento) real-time clocks, digital potentiometers, temperature sensors, digital
compasses, memory chips, FM radio circuits, I/O expanders, LCD controllers, amplifiers, ...
R --> resistor de pull-up, opcional, com valores entre 2 e 10 kOhm
Pro
f. C
láu
dio
A.
Fle
ury
-
N
ov
-20
11
9
Comunicação Serial em RedeBus Inter Integrated Circuits (I2C)
Protocolo e Formato dos Comandos
Start bit é gerado pelo Master 7 bits de endereço são dados pelo Master para dizer com que Slave pretende comunicar 1 bit indica se existe intenção de escrita ou de leitura no dispositivo endereçado Slave identificado com o endereço diz que tomou conhecimento via bit ACK 1 byte de dados é mandado para o Slave ou pelo Slave, dependendo do bit R/W anterior (0
para Write e 1 para Read) após cada byte de dados um bit ACK é enviado pelo dispositivo endereçado para dizer que
recebeu o byte a tarefa se repete até que um STOP bit seja enviado pelo Mestre, encerrando a comunicação
Pro
f. C
láu
dio
A.
Fle
ury
-
N
ov
-20
11
10
Comunicação Serial em RedeBus Inter Integrated Circuits (I2C)
Protocolo e Formato dos Comandos Linha de dados inativa = nível alto (HIGH) SDA só pode variar com SCL em LOW, e quando SCL subir SDA tem que se
manter estável até que SCL desça novamente Violações da regra anterior: qualquer variação de SDA enquanto SCL esta a
HIGH será interpretado como um START ou STOP bit O dispositivo endereçado deve responder com um bit ACK após cada byte
transmitido (9 pulsos de clock para cada byte transmitido). O Master gerará um ciclo extra na linha SCL após cada byte, ao qual o Slave deverá fazer pull down do SDA para que o Master saiba que o byte foi recebido
Pro
f. C
láu
dio
A.
Fle
ury
-
N
ov
-20
11
11
Comunicação Serial em RedeBus Inter Integrated Circuits (I2C)
Exemplo Seja um relógio de tempo real (RTC) DS1307 que
possui 8 registradores para armazenar dados temporais
Para alterar um registrador todos os 8 registradores devem ser reescritos.
Pro
f. C
láu
dio
A.
Fle
ury
-
N
ov
-20
11
12
Comunicação Serial em RedeBus Inter Integrated Circuits (I2C)
Exemplo DS1307
Lendo dados em um DS1307: 1. Reset o registrador para a primeira posição, 2. Requisite sete bytes de dados,3. Receba-os em sete variáveis. O endereço do dispositivo DS1307 é 0×68.
Exemplo de código C:
#define DS1307_I2C_ADDRESS 0x68 // each I2C object has a unique bus address // the DS1307 address is 0x68
Wire.beginTransmission(0x68);Wire.send(0);Wire.endTransmission();Wire.requestFrom(DS1307_I2C_ADDRESS, 7);*second = bcdToDec(Wire.receive();*minute = bcdToDec(Wire.receive();*hour = bcdToDec(Wire.receive();*dayOfWeek = bcdToDec(Wire.receive());*dayOfMonth = bcdToDec(Wire.receive());*month = bcdToDec(Wire.receive());*year = bcdToDec(Wire.receive());
// Convert normal decimal numbers to binary coded decimalbyte decToBcd(byte val) { return ( (val/10*16) + (val%10) );}
// Convert binary coded decimal to normal decimal numbersbyte bcdToDec(byte val) { return ( (val/16*10) + (val%16) );}
Pro
f. C
láu
dio
A.
Fle
ury
-
N
ov
-20
11
13
Comunicação Serial em RedeBus Inter Integrated Circuits (I2C)
Exemplo SRF02 - Ultrasonic Range Finder
Range – 16 cm to 6 m Power - 5v, 4 mA Typ. Frequency – 40 kHz Size - 24mm x 20mm x 17mm height Analogue Gain - Automatic 64 step gain control Connection Modes
Standard I2C Bus. Serial Bus - connects up to 16 devices to any uP or UART serial
port Full Automatic Tuning - No calibration, just power up and go Timing - Fully timed echo, freeing host controller of task Units - Range reported in μs, cm or inches Light Weight - 4.6 g
Pro
f. C
láu
dio
A.
Fle
ury
-
N
ov
-20
11
14
Comunicação Serial em RedeBus Inter Integrated Circuits (I2C)
Exemplo SRF08 - Ultrasonic Range Finder
Voltage - 5v Current - 15mA Typ. 3mA Standby Frequency - 40KHz Range - 3 cm to 6 m. Max Analogue Gain - Variable 94 to 1025 in 32 steps Connection - Standard I2C Bus Light Sensor - Front Facing light sensor Timing - Fully timed echo, freeing host controller of task Echo - Multiple echo - keeps looking after first echo Units - Range reported in μs, cm or inches Small Size - 43mm x 20mm x 17mm height
Pro
f. C
láu
dio
A.
Fle
ury
-
N
ov
-20
11
15
Comunicação Serial em RedeBus Inter Integrated Circuits (I2C)
Exemplo Seja um SRF08 com endereço padrão de fábrica em
0xE0. Para iniciar o SRF08 escreva 0x51 no registrador de
comandos na posição 0x00 dele: Envie uma sequência de início (start bit) Envie o byte 0xE0 (endereço I2C do SRF08 com o
bit R/W low (gravação) Envie 0x00 (endereço interno do registrador de
comandos) Envie 0x51 (comando para iniciar o SRF08) Envie sequência de parada (stop bit)
Pro
f. C
láu
dio
A.
Fle
ury
-
N
ov
-20
11
16
Comunicação Serial em RedeBus Inter Integrated Circuits (I2C)
Exemplo
Pro
f. C
láu
dio
A.
Fle
ury
-
N
ov
-20
11
17
Comunicação Serial em RedeI2C e Arduino
Biblioteca Wire para comunicação com dispositivos I2C / TWI SDA no Arduino é no pino A4, e SCL no pino A5Biblioteca Wire herda características das funções de fluxos de
bits (Stream), compatível com outras bibliotecas de leitura e escrita.funções send() e receive() foram trocadas por read() e write()
+funções : begin(), begin(address), requestFrom(address, count), beginTransmission(address), endTransmission(), write(), byte available(), byte read(), onReceive(handler), onRequest(handler)
Versões de I2C com endereços de 7 e 8 bits (oitavo bit na versão de 7 bits determina a operação: leitura ou escrita).
A biblioteca Wire usa 7 bits para endereçamento. Se o seu dispositivo utiliza 8 bits então voce deverá desprezar o bit LSB, produzindo um endereço entre 0 e 127
Pro
f. C
láu
dio
A.
Fle
ury
-
N
ov
-20
11
18
Fontes lusorobotica.com/index.php/topic,33.0.html Using the I2C Bus, www.robot-electronics.co.uk/acatalog/I2C_Tutorial.html HMC6352 bússola digital + Arduino Diecimila,
http://lusorobotica.com/index.php/topic,36.0.html Como conectar microcontroladores múltiplos de Arduino com o I2C,
http://hacknmod.com/hack/how-to-connect-multiple-arduino-microcontrollers-using-i2c/pt/
DS1307 example, http://tronixstuff.wordpress.com/2010/10/20/tutorial-arduino-and-the-i2c-bus/