quinta-feira, 22 de janeiro de 2015

Arduino e RPi: Comunicação I2C

    O Raspberry Pi tem apenas 8 GPIO, por isso seria muito útil ter entradas e saídas adicionais, combinando o Raspberry Pi e Arduino. Para isso podemos usar a conexão I2C
Há muitas maneiras de ligar a eles, como usando o cabo USB e conexão Serial.Mas por que optar por usar I2C? Uma razão pode ser por nao usar o USB do Pi. Dado o fato de que há apenas 2 portas USB, este é definitivamente uma grande vantagem. Em segundo lugar, a flexibilidade. Você pode facilmente conectar até 128 escravos com o Pi. 
    Este artigo tem como objetivo ensianr como configurar os dispositivos e a configuração do RPi como mestre e o Arduino como escravo para usar a comunicação I2C.

   
    O Raspberry Pi está executando a 3,3 volts, enquanto o Arduino não está funcionando em 5 Volts. Há tutoriais que sugerem o uso de um conversor de tensão para a comunicação I2C. Isso não é necessário se o Raspberry Pi está sendo executado como "mestre" e o Arduino está sendo executado como "escravo".
    A razão pela qual ele funciona é porque o Arduino não possui resistências instaladas, mas o  Raspberry Pi tem um resistor de  1K8 ohms  ao 3.3 volts. Os dados são transmitidos, puxando as linhas de 0v, por um sinal lógico "alto". Por sinal lógico "baixo", ele é puxado até o nível de tensãode alimentação. Porque não há resistores pull-up no Arduino e porque 3.3 volts está dentro da faixa de "baixo" nível lógico para o Arduino tudo funciona como deveria.
     Abaixo são as imagens que mostram onde os pinos I2C estão no Raspberry Pi e Arduino. Note-se que os resistores pull-up internos são apenas disponível nos pinos do Pi I2C (pinos 3 ( SDA ) e 5 ( SCL ), ou seja, o GPIO0 e GPIO1 em uma placa Rev. 1, GPIO2 eGPIOP3 em um Rev. 2 board:



Instalando o I2C no RPi:

    

Remover I2C de Blacklist:

  $ Cat /etc/modprobe.d/raspi-blacklist.conf
 # Lista negra spi e i2c por padrão (muitos usuários não precisam deles)
 blacklist spi-bcm2708
 #blacklist i2c-bcm2708 

Carga i2c.dev no arquivo de módulo

Adicione isso ao final do / etc / modules
  i2c-dev 

Instalar ferramentas I2C

  $ Sudo apt-get install I2C-tools 

Permitir Pi usuário para acessar dispositivos I2C

  $ Sudo adduser pi i2c 

Agora reinicie o RP I . Depois que você deve ver os dispositivos I2C:
  pi @ raspberrypi ~ $ ll /dev/i2c*
 CRW-rw --- T 1 i2c raiz 89, 0 25 mai 11:56 / dev / i2c-0
 CRW-rw --- T 1 i2c raiz 89, 1 25 de maio 11:56 / dev / i2c-1 
Agora vamos executar um teste simples, varrer o barramento i2c:
  pi @ raspberrypi ~ $ i2cdetect -y 1 
 0 1 2 3 4 5 6 7 8 9 a b c d e f
 00: - - - - - - - - - - - - - 
 10: - - - - - - - - - - - - - - - - 
 20: - - - - - - - - - - - - - - - - 
 30: - - - - - - - - - - - - - - - - 
 40: - - - - - - - - - - - - - - - - 
 50: - - - - - - - - - - - - - - - - 
 60: - - - - - - - - - - - - - - - - 
 70: - - - - - - - - 
Dica: se você estiver usando a primeira revisão do conselho RPI, use "-y 0" como parâmetro. O endereço do barramento I2C mudou entre essas duas revisões.

Instale Python-SMBus

Isso fornece suporte I2C para Python, a documentação pode ser encontrada aqui .Alternativamente, Quck2Wire também está disponível.
  sudo apt-get install python-smbus 

Configure o Arduino como escravo:

    Carregue este sketch no Arduino. Basicamente foi definido um endereço para o escravo (neste caso, 4) e as funções de chamada de retorno para o envio de dados e receber dados. Quando recebemos um dígito, nós reconhecemos, enviando-o de volta. Se o dígito passa a ser '1', que liga o motor.

 #include <Wire.h>  
 #define SLAVE_ADDRESS 0x04  
 int number = 0;  
 int state = 0;  
 void setup() {  
   pinMode(13, OUTPUT);  
   Serial.begin(9600);       
   // inicializa i2c como escravo  
   Wire.begin(SLAVE_ADDRESS);  
   // comunicação i2c  
   Wire.onReceive(receiveData);  
   Wire.onRequest(sendData);  
   Serial.println("OK!");  
 }  
 void loop() {  
   delay(100);  
 }  
 // callback para recebimento de dados  
 void receiveData(int byteCount){  
   while(Wire.available()) {  
     number = Wire.read();  
     Serial.print("dado recebido: ");  
     Serial.println(number);  
     if (number == 1){  
       if (state == 0){  
         digitalWrite(8, HIGH); //liga o motor  
         state = 1;  
       }  
       else{  
         digitalWrite(8, LOW); // desliga o motor  
         state = 0;  
       }  
      }  
    }  
 }  
 // callback para envio de dado  
 void sendData(){  
   Wire.write(number);  
 }  



Configure o RPi como mestre:

    Como o Arduino esta como escravo, precisamos agora de um mestre I2C.  O programa python abaixo faz: o Raspberry Pi pedir para introduzir um dígito e envia para o Arduino, o Arduino reconhece os dados recebidos por enviar o mesmo número exato de volta.

 import smbus  
 import time  
 bus = smbus.SMBus(1)  
 # Endereço escravo do arduino   
 address = 0x04  
 def writeNumber(value):  
   bus.write_byte(address, value)  
   return -1  
 def readNumber():  
   number = bus.read_byte(address)  
   return number  
 while True:  
   var = input("Entre 1 - 9: ")  
   if not var:  
     continue  
   writeNumber(var)  
   print "RPI: enviou ao arduino o valor ", var  
   # sleep one second  
   time.sleep(1)  
   number = readNumber()  
   print "Arduino: recebeu o valor ", number  
   print  

Conecte seu Arduino com RPi:


Finalmente, é preciso conectar o Raspberry Pi e Arduino no barramento I2C. 




Fonte: http://translate.google.com.br/translate?sl=en&tl=pt&js=n&prev=_t&hl=pt-BR&ie=UTF-8&u=http%3A%2F%2Fblog.oscarliang.net%2Fraspberry-pi-arduino-connected-i2c%2F

2 comentários:

  1. Valeu cara!! Mais uma postagem sua que me ajuda bastante

    ResponderExcluir
  2. Poxa cara, é muito legal ler algo assim!! Vlws pela força! Gostaria de me dedicar mais a esse blog!!!

    ResponderExcluir