A apresentação está carregando. Por favor, espere

A apresentação está carregando. Por favor, espere

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.

Apresentações semelhantes


Apresentação em tema: "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."— Transcrição da apresentação:

1 Prof. Cláudio Nov-2011

2 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

3 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

4 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

5 Exemplo Comandar remotamente o acendimento proporcional de um LED ligado a uma porta de saída analógica #include // inicia LCD com os números dos pinos da interface LiquidCrystal lcd(12, 11, 5, 4, 3, 2); const int pinoLed = 9; // o pino no qual o LED está ligado int 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 "); Serial.println("Aguardando Comando Remoto (999 ): "); } int decodifica(char *s) { int soma, i; for(soma=i=0; (s[i]!=0) && (i

6 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 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

7 Comunicação Serial em Rede Inter-Integrated Circuit Bus (I 2 C – pronounced as a ɪ -skwered-s ɪ ) Barramento com dois fios para conexão de CIs (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 Video

8 Comunicação Serial em Rede Inter-Integrated Circuit Bus (I 2 C – pronounced as a ɪ -skwered-s ɪ ) f SCL : 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 Prof. Cláudio A. Fleury - Nov

9 Comunicação Serial em Rede Bus 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 Prof. Cláudio A. Fleury - Nov

10 Comunicação Serial em Rede Bus 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 Prof. Cláudio A. Fleury - Nov

11 Comunicação Serial em Rede Bus Inter Integrated Circuits (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 Para alterar um registrador todos os 8 registradores devem ser reescritos.

12 Comunicação Serial em Rede Bus Inter Integrated Circuits (I2C) Exemplo DS1307 Prof. Cláudio A. Fleury - Nov 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 decimal byte decToBcd(byte val) { return ( (val/10*16) + (val%10) ); } // Convert binary coded decimal to normal decimal numbers byte bcdToDec(byte val) { return ( (val/16*10) + (val%16) ); }

13 Comunicação Serial em Rede Bus 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 I 2 C 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 g Prof. Cláudio A. Fleury - Nov

14 Comunicação Serial em Rede Bus 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 I 2 C 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

15 Comunicação Serial em Rede Bus 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 I 2 C 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

16 Comunicação Serial em Rede Bus Inter Integrated Circuits (I2C) Exemplo Prof. Cláudio A. Fleury - Nov

17 Comunicação Serial em Rede I2C e Arduino Biblioteca Wire para comunicação com dispositivos I 2 C / 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(), byte available(), byte read(), onReceive(handler), onRequest(handler) Versões de I 2 C 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

18 Fontes lusorobotica.com/index.php/topic,33.0.html Using the I2C Bus, HMC6352 bússola digital + Arduino Diecimila, Como conectar microcontroladores múltiplos de Arduino com o I2C, i2c/pt/ DS1307 example, the-i2c-bus/ Prof. Cláudio A. Fleury - Nov

19 Exemplo de código para PIC #define SCL TRISB4 // I2C bus #define SDA TRISB1 // #define SCL_IN RB4 // #define SDA_IN RB1 // // To initialize the ports set the output resisters to 0 and the tristate registers to 1 which //disables the outputs and allows them to be pulled high by the resistors. SDA = SCL = 1; SCL_IN = SDA_IN = 0; // We use a small delay routine between SDA and SCL changes to give a clear sequence on the I2C // bus. This is nothing more than a subroutine call and return. void i2c_dly(void) { } The following 4 functions provide the primitive start, stop, read and write sequences. All I2C transactions can be built up from these. void i2c_start(void) { SDA = 1; // i2c start bit sequence i2c_dly(); SCL = 1; i2c_dly(); SDA = 0; i2c_dly(); SCL = 0; i2c_dly(); } void i2c_stop(void) { SDA = 0; // i2c stop bit sequence i2c_dly(); SCL = 1; i2c_dly(); SDA = 1; i2c_dly(); } Prof. Cláudio A. Fleury - Nov

20 Exemplo de código para PIC unsigned char i2c_rx(char ack) { char x, d=0; SDA = 1; for(x=0; x<8; x++) { d <<= 1; do { SCL = 1; } while(SCL_IN==0); // wait for any SCL clock stretching i2c_dly(); if(SDA_IN) d |= 1; SCL = 0; } if(ack) SDA = 0; else SDA = 1; SCL = 1; i2c_dly(); // send (N)ACK bit SCL = 0; SDA = 1; return d; } bit i2c_tx(unsigned char d) { char x; static bit b; for(x=8; x; x--) { if(d&0x80) SDA = 1; else SDA = 0; SCL = 1; d <<= 1; SCL = 0; } SDA = 1; SCL = 1; i2c_dly(); b = SDA_IN; // possible ACK bit SCL = 0; return b; } Prof. Cláudio A. Fleury - Nov

21 Exemplo de código para PIC // example to start an SRF08 ranging in cm: i2c_start(); // send start sequence i2c_tx(0xE0); // SRF08 I2C address with R/W bit clear i2c_tx(0x00); // SRF08 command register address i2c_tx(0x51); // command to start ranging in cm i2c_stop(); // send stop sequence // Now after waiting 65mS for the ranging to complete (I've left that to you) the following // example shows how to read the light sensor value from register 1 and the range result from // registers 2 & 3. i2c_start(); // send start sequence i2c_tx(0xE0); // SRF08 I2C address with R/W bit clear i2c_tx(0x01); // SRF08 light sensor register address i2c_start(); // send a restart sequence i2c_tx(0xE1); // SRF08 I2C address with R/W bit set lightsensor = i2c_rx(1); // get light sensor and send acknowledge. Internal register address // will increment automatically. rangehigh = i2c_rx(1); // get the high byte of the range and send acknowledge. rangelow = i2c_rx(0); // get low byte of the range. Note we don't acknowledge the last byte. i2c_stop(); // send stop sequence Prof. Cláudio A. Fleury - Nov

22 HMC6352 bússola digital com Arduino Diecimila HMC6352 Datasheet HMC6352 Datasheet Código Fonte Comprar HMC6352 O HMC6352 é bastante conhecido e utilizado no mundo da robótica, devido não só ao seu baixo custo, como a sua boa precisão, e fácil utilização. Principalmente por utilizar o protocolo I2C e poder ser posto ou retirado sem grandes alterações de software, e quase nenhumas de hardware, estes componentes são ideais para aplicações expansíveis onde se pretende ir aumentando ou diminuindo o número de módulos, quer sensores, quer actuadores. Assim, hoje eu vou exemplificar como colocar este sensor em funcionamento, e fazer leituras do mesmo com 4 fios (2 de alimentação, 2 de bus I2C) e um Arduino Diecimila. Primeiro passo, ligar GND e VCC do arduino ao sensor, (podemos optar pelos 5V ou pelos 3,3V se quisermos meter num bus que já tem outros componentes a 3,3V, pois este sensor adapta-se a qualquer uma das tensões.) assim como o SCL e o SDA aos pins 5 e 4 analógicos do arduino respectivamente. Porque raio é que tenho que gastar o pin 4 e 5 do analógico se estes sinais são digitais, e o Arduino Diecimila dispõe de mais pins digitais? Pois bem, o Atmega 168 de que é feito o Arduino, só implementa o protocolo I2C nestes pins, e a biblioteca wire.h que vamos utilizar não implementa I2C por software, mas sim faz a bridge para a implementação do Atmega. Com isto podemos ou não utilizar umas resistências de pull up pois é aconselhado neste protocolo, mas eu testei sem elas e funciona perfeitamente. Assim com o exemplo de código anexado serão feitas leituras de segundo em segundo e mostradas na consola do Arduino, podendo assim vocês sabendo como receber valores da bússola, utiliza-la para manipulação de software, ou orientação de um robot. Atenção que esta deve de ser colocada o mais afastada possível de interferências magnéticas, tal como motores, e outras fontes de campos, a fim de se poder obter valores correctos.I2C Prof. Cláudio A. Fleury - Nov


Carregar ppt "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."

Apresentações semelhantes


Anúncios Google