210 likes | 399 Views
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
E N D
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 n = Serial.available(); Prof. Cláudio A. Fleury - Nov-2011
Comandos • Leitura da Porta Serial • Grava (escreve) na Porta Serial // lê byte da porta serial carac = Serial.read(); // grava byte(s) na porta serial Serial.print(carac); // idem, porém com CR ao final da gravação Serial.println(seq); Prof. Cláudio A. Fleury - Nov-2011
Exemplo • Comandar 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 Prof. Cláudio A. Fleury - Nov-2011
Exemplo • Comandar 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 interface LiquidCrystallcd(12, 11, 5, 4, 3, 2); constintpinoLed = 9; // o pino no qual o LED está ligado intpos = 0; // posição de armazenamento do caracterrxdo void setup() { Serial.begin(9600); // inicia a comunicação serial pinMode(pinoLed, OUTPUT); // inicia o ledPincomo 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; } Prof. Cláudio A. Fleury - Nov-2011
Exemplo • Comandar remotamente o acendimento proporcional de um LED ligado a uma porta de saída analógica void 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 } } Prof. Cláudio A. Fleury - Nov-2011
Comunicação Serial em Rede • Inter-IntegratedCircuit 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 Prof. Cláudio A. Fleury - Nov-2011 Video
Comunicação Serial em Rede • Inter-IntegratedCircuit Bus (I2C – pronounced as ‘aɪ-skwered-sɪ’) • fSCL: Standard até 100kHz, Fast até 400 kHz e HighSpeed 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, temperaturesensors, digital compasses, memory chips, FM radio circuits, I/O expanders, LCD controllers, amplifiers, ... Prof. Cláudio A. Fleury - Nov-2011 R --> resistor de pull-up, opcional, com valores entre 2 e 10 kOhm
Comunicação Serial em Rede • Bus Inter IntegratedCircuits (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 Prof. Cláudio A. Fleury - Nov-2011
Comunicação Serial em Rede • Bus Inter IntegratedCircuits (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 pulldown do SDA para que o Master saiba que o byte foi recebido Prof. Cláudio A. Fleury - Nov-2011
Comunicação Serial em Rede • Bus Inter IntegratedCircuits (I2C) • Exemplo • Seja um relógio de tempo real (RTC) DS1307 que possui 8 registradores para armazenar dados temporais Prof. Cláudio A. Fleury - Nov-2011 Para alterar um registrador todos os 8 registradores devem ser reescritos.
Comunicação Serial em Rede • Bus Inter IntegratedCircuits (I2C) • Exemplo DS1307 • Lendo dados em um DS1307: • Reset o registrador para a primeira posição, • 2. Requisite sete bytes de dados, • 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 binarycoded decimal byte decToBcd(byte val) { return ( (val/10*16) + (val%10) ); } // Convertbinarycoded decimal to normal decimal numbers byte bcdToDec(byte val) { return ( (val/16*10) + (val%16) ); } Prof. Cláudio A. Fleury - Nov-2011
Comunicação Serial em Rede • Bus Inter IntegratedCircuits (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 Prof. Cláudio A. Fleury - Nov-2011
Comunicação Serial em Rede • Bus Inter IntegratedCircuits (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 Prof. Cláudio A. Fleury - Nov-2011
Comunicação Serial em Rede • Bus Inter IntegratedCircuits (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) Prof. Cláudio A. Fleury - Nov-2011
Comunicação Serial em Rede • Bus Inter IntegratedCircuits (I2C) • Exemplo Prof. Cláudio A. Fleury - Nov-2011
Comunicação Serial em Rede • I2C e Arduino • Biblioteca Wire para comunicação com dispositivos I2C / TWI • SDA no Arduino é no pino A4, e SCL no pino A5 • Biblioteca 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(), byteavailable(), byteread(), 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 Prof. Cláudio A. Fleury - Nov-2011
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/ Prof. Cláudio A. Fleury - Nov-2011