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(slaveSelect== "1") print(type(slaveSelect)) print("no slave selected") quit() BytesToSend = ConvertStringsToBytes(cmd) 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()
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
no podías pensar en un código mas complicado para demostrar la comunicación con I2C?????????
estuve media hora viendo como mandar un hola mundo de una raspberry a un arduino y casi me da una embolia
este tutorial muestra cómo configurar la comunicación I2C entre Raspberry Pi y Arduino. lo complejo que es?
I2Cbus.write_i2c_block_data(slaveAddress, 0x00, ConvertStringsToBytes(«Hello World»)) no funciona?
Como se configura la señal de reloj para que envie la informacion, o en que parte del codigo viene eso
Hola, la señal de reloj se gestiona en un código de bajo nivel específico para la comunicación i2c en smbus o wire.h