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.
Valeu cara!! Mais uma postagem sua que me ajuda bastante
ResponderExcluirPoxa cara, é muito legal ler algo assim!! Vlws pela força! Gostaria de me dedicar mais a esse blog!!!
ResponderExcluir