Etiquetas: , ,

En algunos proyectos, puede ser interesante establecer una comunicación I2C entre Raspberry Pi y Arduino. La potencia de computación y la funcionalidad inalámbrica del Raspberry Pi junto con la capacidad de entrada/salida del Arduino, da como resultado un sistema de control completo para impulsar cualquier proyecto. Si la tarjeta Raspberry Pi y la tarjeta de Arduino están muy cerca, el bus I2C es una buena elección de protocolo de comunicación. Esto también hace posible añadir varios dispositivos en el mismo autobús y multiplicar por diez las capacidades del Raspberry Pi.

Prerrequisitos: Comunicación de I2C con Arduino,Acceso remoto al Raspberry Pi con VNC

Hardware

  • Computadora
  • Arduino UNO x1
  • Raspberry Pi 3B+
  • Cables de arranque x3

Diagrama

Para establecer la comunicación I2C entre Raspberry Pi y Arduino, necesitamos conectar físicamente el bus que utiliza 3 pines. Una comunicación I2C se define por un bus de dos cables (a veces llamado TWI, Two Wire Interface) y una dirección. Los pines utilizados para la comunicación I2C suelen estar fijados para cada dispositivo. Una en la que se envían los datos (Línea de datos en serie SDA) y otra en la que se envía el reloj de sincronización (Línea de reloj en serie SLC). Los fundamentos de las dos cartas deben estar conectados para establecer una referencia potencial común.

  • SDA BCM2(RPI) <-> SDA A4(Arduino)
  • SCL BCM3(RPI) <-> SCL A5(Arduino)
  • GND (RPI) <-> GND(Arduino)

Configuración del Raspberry Pi

Para usar la interfaz I2C de Raspberry Pi, debe estar habilitada en el menú de configuración. Para ello, introduzca el siguiente comando en una terminal:

sudo raspi-config

En el menú, seleccione «5 – Opciones de interfaz» y luego «P5 I2C» y valide.

Una vez realizada la conexión, puede comprobar los dispositivos conectados al bus tecleando el comando en la terminal:

i2cdetect -y 1

El Raspberry Pi devuelve la lista de direcciones detectadas en el bus.

pi@raspberrypi:~ $ i2cdetect -y 1
     0  1  2  3  4  5  6  7  8  9  a  b  c  d  e  f
00:          -- -- -- -- -- -- -- -- 0b -- -- -- -- 
10: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 
20: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 
30: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 
40: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 
50: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 
60: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 
70: -- -- -- -- -- -- -- --  

Nous allons installer la librairie smbus2 qui permet de Vamos a instalar la biblioteca smbus2 que permite gestionar la comunicación I2C en el lado del Raspberry Pi

pip3 install smbus2

Código

Código Python Master

En este tutorial, usaremos el lenguaje Python por el Raspberry Pi. La biblioteca que se utiliza para gestionar la comunicación I2C es la biblioteca smbus2.

#!/usr/bin/env python
# -*- coding: utf-8 -*-
# Raspberry Pi to Arduino I2C Communication 
#i2cdetect -y 1

#library 
import sys
import smbus2 as smbus#,smbus2 
import time

# Slave Addresses
I2C_SLAVE_ADDRESS = 11 #0x0b ou 11 
I2C_SLAVE2_ADDRESS = 12 
I2C_SLAVE3_ADDRESS = 13
 
# This function converts a string to an array of bytes. 
def ConvertStringsToBytes(src): 
  converted = [] 
  for b in src: 
    converted.append(ord(b)) 
  return converted
  
def main(args):
 # Create the I2C bus 
 I2Cbus = smbus.SMBus(1) 
 with smbus.SMBus(1) as I2Cbus: 
 slaveSelect = input("Which Arduino (1-3): ") 
 cmd = input("Enter command: ") 
  
 if slaveSelect == "1": 
   slaveAddress = I2C_SLAVE_ADDRESS 
 elif slaveSelect == "2": 
   slaveAddress = I2C_SLAVE2_ADDRESS 
 elif slaveSelect == "3": 
   slaveAddress = I2C_SLAVE3_ADDRESS 
 else: 
   # quit if you messed up 
   print(aSelect== "1")
   print(type(aSelect))
   print("no slave selected")
   quit() 
  
 BytesToSend = ConvertStringsToBytes(bSelect) 
 print("Sent " + str(slaveAddress) + " the " + str(cmd) + " command.")
 print(BytesToSend )
 I2Cbus.write_i2c_block_data(slaveAddress, 0x00, BytesToSend) 
 time.sleep(0.5)
 
 while True:
 try:
 data=I2Cbus.read_i2c_block_data(SlaveAddress,0x00,16)
 print("recieve from slave:")
 print(data)
 except:
 print("remote i/o error")
 time.sleep(0.5)
 
 return 0

if __name__ == '__main__':
 try:
 main(sys.argv)
 except KeyboardInterrupt:
 print("program was stopped manually")
 input()
 #sys.exit(main(sys.argv))

Código Arduino Esclavo

La biblioteca utilizada para manejar la comunicación I2C en el lado de Arduino es la biblioteca Wire.h.

#include <Wire.h>

# define I2C_SLAVE_ADDRESS 11 // 12 pour l'esclave 2 et ainsi de suite

#define PAYLOAD_SIZE 2

void setup()
{
  Wire.begin(I2C_SLAVE_ADDRESS);
  Serial.begin(9600); 
  Serial.println("-------------------------------------I am Slave1");
  delay(1000);               
  Wire.onRequest(requestEvents);
  Wire.onReceive(receiveEvents);
}

void loop(){}

int n = 0;

void requestEvents()
{
  Serial.println(F("---> recieved request"));
  Serial.print(F("sending value : "));
  Serial.println(n);
  Wire.write(n);
}

void receiveEvents(int numBytes)
{  
  Serial.println(F("---> recieved events"));
  n = Wire.read();
  Serial.print(numBytes);
  Serial.println(F("bytes recieved"));
  Serial.print(F("recieved value : "));
  Serial.println(n);
}

Resultado

Le Raspberry Pi envía el comando «slave» al Arduino, y luego recibe una matriz de datos del Arduino.

L’Arduino réceptionne la commande «slave» puis envoie deux valeurs misEl Arduino recibe el comando «esclavo» y luego envía dos valores actualizados tan pronto como recibe una solicitud del Raspberry Pi

Aplicación

  • Reconnaissance visuel géré par Reconocimiento visual gestionado por el Raspberry Pi, actuadores y sensores gestionados por el Arduino

Fuentes

Encuentre otros tutoriales y ejemplos en el generador de código automático
Arquitecto de Código