Comunicação Serial com o Arduino

Slides:



Advertisements
Apresentações semelhantes
Contadores e Registradores
Advertisements

Programação em Java Prof. Maurício Braga
Arquitetura e organização de computadores
Entrada e Saída Introdução.
Técnicas para operações E/S
Meu primeiro programa em ARDUINO
Porta Paralela Prof.Almir.
Modelos de Troca de Dados em Nível Elétrico
Arquitetura dos Microprocessadores 8086 e 8088
Configuração de Periféricos
MC542 Organização de Computadores Teoria e Prática
MC542 Organização de Computadores Teoria e Prática
Streams Java.
Maria Aparecida Castro Livi
Maria Aparecida Castro Livi
Maria Aparecida Castro Livi
Introdução à Informática
Microcontroladores e Sistemas Embarcados
Aluno: Guilherme Guindani
SMART CARD Nomes: Hugo Heidtmann, Rafael Brito.
Bruno Souza de Oliveira e Rodrigo Nardi
Jonas Cella, Vinicius Dal Bó Abella
Tamires Maciel Vitor Barbosa
Vinicius Pessil Bohrer Programação de Periféricos
Sensor de Temperatura Digital TMP75
Programação de Periféricos I²C
I²C Bus Inter Integrated Circuits Bus
Plataforma RENESAS, I2C, Smart Card
Sistemas Operacionais
Estruturas de Dados II Prof.: Sergio Pacheco Prof.: Sergio Pacheco 1 1.
Organização da Memória Principal
Professor Victor Sotero
Professor Victor Sotero
Tratamento de Ficheiros
FEUPDEECRedes de Computadores, 4º Ano de EEC, ramo de ACI Sockets Abril, 98Isidro Vila Verde 1 Formato das estruturas de dados Estrutura.
Teclado PS/2 Este tipo de teclados são baratos e muito populares devido à sua utilização em PCs. O seu preço é comparável ao de um mini-teclado de 16 teclas;
Revisão da Linguagem C.
Capítulo 10 Strings & File I/O. Strings Strings são um conjunto de Caracteres ASCII. No Controle de Instrumentação pode-se converter valores numéricos.
Fundamentos de Eletrônica Digital
Introdução à Programação
Módulo MSSP Jadsonlee da Silva Sá
Universidade Federal do Vale do São Francisco - UNIVASF Colegiado de Engenharia da Computação – CECOMP PIC16F877A - Parte III Jadsonlee da Silva Sá
PIC16F877A - Parte II Jadsonlee da Silva Sá
Engenharia de Software para Computação Embarcada
Sistemas Operacionais
Introdução aos Sistemas Microcontrolados
Barramento AVALON Adelmario Douglas Francisco Dantas Millena Almeida
Entrada e Saída (E/S ou I/O)
CEFET-PBProf. José B. Menezes Filho1 MICROCONTROLADORES Prof. José Bezerra de Menezes Filho CENTRO FEDERAL DE EDUCAÇÃO TECNOLÓGICA DA PARAÍBA DA PARAÍBA.
Capítulo 5 Entrada/Saída 5.1 Princípios do hardware de E/S
Montagem e Manutenção de Computador I Curso Técnico em Rede de Computadores Aula 05.
Projetos Grandes MO801/MC912. Roteiro Componentes Configurações Instanciação múltipla Instanciação condicional Atenção: Os exemplos são cumulativos.
Escolha da Placa. Porta Serial / COM Port Partes do Código.
Entrada e Saída (E/S).
Organização e Arquitetura de Computadores 2ºSemestre Aula 11 – Parte 2 Prof. Carlos Vinícius SERVIÇO NACIONAL DE APRENDIZAGEM COMERCIAL.
Exemplos de programação IDE
Carlos Roberto da Silva Filho, M. Eng.
Gustavo Ribeiro P. Esteves
Arquitetura de Computadores
A Embest Board.
Sistemas Microcontrolados e Programação em C Aula 12 – IO + I2C PICmicro Prof Afonso Ferreira Miguel.
Rede de Computadores MAT164 – Redes de Computadores I Universidade Federal da Bahia Instituto de Matemática Departamento de Ciência da Computação.
Informática Industrial N8INF
Aula 03: Efeito de iluminação sequencial com LED e Efeito interativo de iluminação com LED
Aula 04: Aprendendo sobre o PWM do arduíno e Ponte H
Aula 05: Sensores do robô e Bibliotecas. Aula 05: Sensores do robô  O que vamos aprender? 1.Funcionamento e aplicações dos sensores 2.Utilidade das Bibliotecas.
Projeto Física Experimental II Por: Diego M. Pinho, Eduardo Damasceno, Hugo Hennies, Rafael M. Lopes.
Clique para editar o título Arduino seu primeiro microcontrolador PMR
Prof. Ricardo Teixeira Tecnologia em Mecatrônica Industrial SENAI
DsPIC – Aula 3 Prof. Ricardo Teixeira Especialização em Sistemas Embarcados POLI – UPE.
Transcrição da apresentação:

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

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

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

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

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

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

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

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

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

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

Comunicação Serial em Rede Bus Inter Integrated Circuits (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(), 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

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

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

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

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

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