Try   HackMD

Here's a practical example of interfacing a Raspberry Pi with an Arduino using I²C, one of the simplest and most flexible methods for communication between a Pi and a microcontroller.

Image Not Showing Possible Reasons
  • The image was uploaded to a note which you don't have access to
  • The note which the image was originally uploaded to has been deleted
Learn More →

Project: Raspberry Pi (Master) ↔ Arduino (Slave) over I²C
Goal:

  • Raspberry Pi sends a command to Arduino
  • Arduino replies with a sensor value or a message

1. Wiring

Image Not Showing Possible Reasons
  • The image was uploaded to a note which you don't have access to
  • The note which the image was originally uploaded to has been deleted
Learn More →

Optional: Add 4.7kΩ pull-up resistors from SDA and SCL to 3.3V

2. Arduino Code (I²C Slave)

cpp

#include <Wire.h>

void setup() {
  Wire.begin(0x08); // I2C address
  Wire.onReceive(receiveEvent);
  Wire.onRequest(requestEvent);
  Serial.begin(9600);
}

volatile byte x = 0;

void loop() {
  delay(100);
}

void receiveEvent(int howMany) {
  while (Wire.available()) {
    x = Wire.read();
    Serial.print("Received: ");
    Serial.println(x);
  }
}

void requestEvent() {
  Wire.write("Hi Pi!"); // Respond with this string
}

Upload this code to your Arduino using the Arduino IDE.

3. Raspberry Pi Code (Python I²C Master)
Setup:

bash

sudo raspi-config        # Enable I2C under "Interface Options"
sudo apt install python3-smbus i2c-tools

Python Script:

python

import smbus
import time

bus = smbus.SMBus(1)
address = 0x08

def writeByte(val):
    bus.write_byte(address, val)

def readResponse():
    data = bus.read_i2c_block_data(address, 0, 8)
    response = ''.join([chr(b) for b in data if b != 255])
    print("Arduino says:", response)

while True:
    writeByte(42)      # Send a command to Arduino
    time.sleep(0.1)    # Wait for Arduino to respond
    readResponse()
    time.sleep(1)

Expected Output on Raspberry Pi:

yaml

Arduino says: Hi Pi!

And on the Arduino Serial Monitor:

makefile

Received: 42

Extend It!
You can:

  • Modify Arduino to return sensor readings (e.g., temperature)
  • Send structured commands (e.g., control a motor)
  • Use SPI or UART for higher speed or bi-directional streaming