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

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

Comunicação Serial com o Arduino

Apresentações semelhantes


Apresentação em tema: "Comunicação Serial com o Arduino"— Transcrição da apresentação:

1 Comunicação Serial com o Arduino
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-2011

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

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

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

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

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

8 Comunicação Serial em Rede
Inter-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, ... Prof. Cláudio A. Fleury - Nov-2011 R --> resistor de pull-up, opcional, com valores entre 2 e 10 kOhm

9 Comunicação Serial em Rede
Bus Inter Integrated Circuits (I2C) Protocolo e Formato dos Comandos Data is transferred in sequences of 8 bits. The bits are placed on the SDA line starting with the MSB (Most Significant Bit). The SCL line is then pulsed high, then low. Remember that the chip cannot really drive the line high, it simply "lets go" of it and the resistor actually pulls it high. For every 8 bits transferred, the device receiving the data sends back an acknowledge bit, so there are actually 9 SCL clock pulses to transfer each 8 bit byte of data. If the receiving device sends back a low ACK bit, then it has received the data and is ready to accept another byte. If it sends back a high then it is indicating it cannot accept any further data and the master should terminate the transfer by sending a stop sequence.  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

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 clock stretching = Se o slave não puder responder ao comando do Master de imediato, ele pode fazer um alongamento no SCL (que é gerado pelo Master) mantendo o sinal em nível baixo (LOW) até que esteja pronto para responder ao Master. Prof. Cláudio A. Fleury - Nov-2011

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 Para alterar um registrador todos os 8 registradores devem ser reescritos. Prof. Cláudio A. Fleury - Nov-2011

12 Comunicação Serial em Rede
Bus Inter Integrated Circuits (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 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) ); Prof. Cláudio A. Fleury - Nov-2011

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 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 g Prof. Cláudio A. Fleury - Nov-2011

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

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

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

17 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(), 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 Prof. Cláudio A. Fleury - Nov-2011

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, DS1307 example, Prof. Cláudio A. Fleury - Nov-2011

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; SDA = 0; SCL = 0; } void i2c_stop(void) { SDA = 0; // i2c stop bit sequence SDA = 1; Prof. Cláudio A. Fleury - Nov-2011

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

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

22 Prof. Cláudio A. Fleury - Nov-2011
HMC6352 bússola digital com Arduino Diecimila 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. Prof. Cláudio A. Fleury - Nov-2011


Carregar ppt "Comunicação Serial com o Arduino"

Apresentações semelhantes


Anúncios Google