Que tal juntar o melhor dos dois mundos e fazer uma comunicação Arduino e Raspberry Pi? Neste post vamos mostrar como pode fazer isso usando a interface I2C, presente nas duas placas.
Quando utilizar a comunicação Arduino e Raspberry Pi
Conectando o Arduino e o Raspberry
Habilitando a interface I2C no Raspberry Pi
Antes de tudo, vamos usar os comandos abaixo para atualizar o sistema operacional do Raspberry Pi. Abra uma janela de terminal e digite:
| sudo apt-get update |
| sudo apt-get upgrade |
Finalizada a atualização, digite o comando sudo raspi-config para entrar na janela de configuração do sistema. Selecione a opção 5 – Interfacing Options:
| sudo apt-get install i2c-tools |
| sudo apt-get install python-smbus |
Configurando o Arduino no modo I2C escravo
#include
char str[15];
int valor;
void setup()
{
Serial.begin(9600);
Wire.begin(0x18);
Wire.onRequest(requestEvent);
}
void requestEvent()
{
valor = analogRead(A0);
Serial.println("Requisicao recebida!");
sprintf(str, "Valor: %4d\n", valor);
Wire.write(str);
}
void loop()
{
delay(50);
}
O programa utiliza a biblioteca Wire para realizar a comunicação, e aguarda uma requisição no barramento para enviar os dados. Quando essa requisição chegar, será executada a rotina requestEvent(), que vai ler o valor da porta analógica A0 onde está ligado o potenciômetro, e vai enviar esses dados para o Raspberry (linha 21).
Pode acompanhar no serial monitor da IDE do Arduino a mensagem de “Requisição recebida!” (linha 19) assim que a requisição de dados for enviada pelo Raspberry.
Testando a comunicação I2C
| i2cdetect -y 1 |
Obtendo Dados do Arduino
| sudo nano comunicai2c.py |
Dentro do editor, digite ou copie o programa abaixo, que utiliza a biblioteca smbus que instalamos anteriormente.
Na linha 9, configuramos o endereço I2C do Arduino que estamos usando no barramento (0x18). A cada 5 segundos, a rotina RequisitaDadosArduino é executada, enviando uma requisição para o Arduino e mostrando na tela (linha 19) os dados recebidos:
#!/usr/bin/python
import time
import smbus
slaveAddress = 0x18
i2c = smbus.SMBus(1)
def RequisitaDadosArduino():
global msg_recebida
dados_recebidos_Arduino = i2c.read_i2c_block_data(slaveAddress, 0,11)
for i in range(len(dados_recebidos_Arduino)):
msg_recebida += chr(dados_recebidos_Arduino[i])
print(msg_recebida)
dados_recebidos_Arduino =""
msg_recebida = ""
msg_recebida = ""
while 1:
RequisitaDadosArduino()
time.sleep(5)
Salve o programa no editor, e execute-o com o comando
| sudo python3 comunicai2c.py |
Todos os produtos utilizados neste artigo podem ser encontrados na Loja de Eletrónica e Robótica – ElectroFun.
Gostaram deste artigo? Deixem o vosso comentário no formulário a baixo e partilhem com os vossos amigos.
Não se esqueçam de fazer like na nossa Página no Facebook.
Podem ainda colocar as vossas dúvidas no nosso Forum da Comunidade Arduino em Portugal ou no nosso Grupo no Facebook Arduino Portugal – Qual o teu projeto? “
Comments
Comentários