2

Cách dễ nhất để kết nối bo mạch Arduino của chúng tôi với Raspberry Pi  là sử dụng cáp USB, nhưng đôi khi giao tiếp này là một cơn ác mộng, đặc biệt là vì không có tín hiệu đồng hồ nào để đồng bộ hóa thiết bị của chúng tôi và chúng tôi phải dựa vào bitrate. Có nhiều cách khác nhau để kết nối Arduino và Raspberry Pi của chúng tôi, chẳng hạn như I2C, SPI và nối tiếp qua GPIO. Hôm nay, chúng ta sẽ nói về I2C, đặc biệt là vì nó khá đơn giản nếu chúng ta quan tâm đến một vài điều. Hãy bắt đầu.

I2C sử dụng hai dòng -  SDA (dữ liệu) và SCL (đồng hồ) - ngoài GND (mặt đất). SDA là hai chiều, vì vậy chúng tôi cần đảm bảo cách này hay cách khác đang gửi dữ liệu (chủ hoặc nô lệ). Với I2C, chỉ chủ mới có thể bắt đầu liên lạc. Các chủ cũng kiểm soát tín hiệu đồng hồ. Mỗi thiết bị có hướng 7 bit, vì vậy chúng tôi có thể kết nối 128 thiết bị với cùng một xe buýt.

Nếu chúng ta muốn kết nối một bo mạch Arduino và Raspberry Pi, chúng ta phải đảm bảo rằng Raspberry Pi là chủ. Đó là bởi vì Arduino hoạt động với 5V trong khi Raspberry Pi hoạt động với 3,3V. Điều đó có nghĩa là chúng ta cần sử dụng điện trở kéo lên nếu chúng ta không muốn phá hủy Raspberry Pi. Nhưng Raspberry Pi có điện trở 1k8 ohms với đường ray điện 3,3 volt, vì vậy chúng tôi có thể kết nối cả hai thiết bị (nếu chúng tôi kết nối các thiết bị I2C khác với xe buýt, chúng phải loại bỏ điện trở kéo lên)

Đó là tất cả những gì chúng ta cần để kết nối Raspberry Pi với bảng Arduino của chúng tôi.

  • RPi SDA sang Arduino tương tự 4
  • RPi SCL sang Arduino analog 5
  • RPi GND sang Arduino GND

Bây giờ chúng tôi sẽ xây dựng một nguyên mẫu đơn giản. Raspberry Pi sẽ nhấp nháy một đèn LED (GPIO17) mỗi giây đồng thời gửi tin nhắn (qua I2C) tới Arduino để nháy đèn LED khác. Đó là phần Python:

import RPi.GPIO as gpio
import smbus
import time
import sys

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

def main():
    gpio.setmode(gpio.BCM)
    gpio.setup(17, gpio.OUT)
    status = False
    while 1:
        gpio.output(17, status)
        status = not status
        bus.write_byte(address, 1 if status else 0)
        print "Arduino answer to RPI:", bus.read_byte(address)
        time.sleep(1)


if __name__ == '__main__':
    try:
        main()
    except KeyboardInterrupt:
        print 'Interrupted'
        gpio.cleanup()
        sys.exit(0)


Và cuối cùng là chương trình Arduino. Arduino cũng trả lời cho Raspberry Pi với giá trị mà nó đã được gửi và Raspberry Pi sẽ ghi lại câu trả lời trong bảng điều khiển.

#include <Wire.h>

#define SLAVE_ADDRESS 0x04
#define LED  13

int number = 0;

void setup() {
  pinMode(LED, OUTPUT);
  Serial.begin(9600);
  Wire.begin(SLAVE_ADDRESS);
  Wire.onReceive(receiveData);
  Wire.onRequest(sendData);

  Serial.println("Ready!");
}

void loop() {
  delay(100);
}

void receiveData(int byteCount) {
  Serial.print("receiveData");
  while (Wire.available()) {
    number = Wire.read();
    Serial.print("data received: ");
    Serial.println(number);

    if (number == 1) {
      Serial.println(" LED ON");
      digitalWrite(LED, HIGH);
    } else {
      Serial.println(" LED OFF");
      digitalWrite(LED, LOW);
    }
  }
}

void sendData() {
  Wire.write(number);
}


Phần cứng:

  • Arduino UNO
  • Quả mâm xôi
  • Hai đèn LED và hai điện trở


Mã có sẵn trên GitHub của tôi .

|