Raspberry Pi Pico Truyền thông I2C

Raspberry Pi Pico Truyền thông I2C

Trong hướng dẫn Raspberry Pi Pico này, chúng ta sẽ tìm hiểu về giao thức và các chân được giới thiệu trên bảng Pi Pico. Hơn nữa, chúng tôi sẽ giao diện Raspberry Pi Pico của mình với các cảm biến và thiết bị khác nhau giao tiếp qua giao thức I2C và lập trình bo mạch của chúng tôi để chạy máy quét I2C. Máy quét này sẽ xác định số lượng thiết bị I2C được kết nối với Raspberry Pi Pico.

Raspberry Pi Pico Truyền thông I2C

Raspberry Pi Pico cho thấy 26 chân GPIO đa chức năng từ tổng số 36 chân GPIO có sẵn trong vi điều khiển RP2040. Chip RP2040 có hai bộ điều khiển I2C (I2C0). Cả hai bộ điều khiển I2C đều có thể truy cập thông qua các chân GPIO của Raspberry Pi Pico.

Điều kiện tiên quyết

Trước khi chúng tôi bắt đầu bài học này, hãy đảm bảo rằng bạn đã quen thuộc và có phiên bản Python 3 mới nhất trong hệ thống của mình, đã thiết lập MicoPython trong Raspberry Pi Pico và có Môi trường phát triển tích hợp (IDE) đang chạy, trong đó chúng tôi sẽ thực hiện lập trình. Chúng tôi sẽ sử dụng cùng một Thonny IDE như chúng tôi đã làm trước đây khi chúng tôi học cách nhấp nháy và đuổi theo đèn LED trong micro-python. Nếu bạn chưa làm theo hướng dẫn trước của chúng tôi, bạn kiểm tra tại đây:

Nếu bạn đang sử dụng uPyCraft IDE, bạn có thể kiểm tra hướng dẫn bắt đầu này:

Giới thiệu I2C

I2C còn được gọi là mạch tích hợp liên hoặc IIC hoặc I vuông C. Nó là một giao thức truyền thông nối tiếp 2 dây cho các ứng dụng truyền dữ liệu tầm ngắn. Nó là một giao thức truyền thông nối tiếp nửa song công không đồng bộ. Hơn nữa, nó là một giao thức bus đa chủ chỉ yêu cầu hai dây để truyền dữ liệu nối tiếp là SCL và SDA.

  • SDA ( Đường dữ liệu hai chiều)

  • SCL ( Dòng đồng hồ hai chiều)

Đây là một giao thức truyền thông rất phổ biến được sử dụng trong các dự án nhúng để giao diện các cảm biến dựa trên, màn hình chữ số và mô-đun giao tiếp. Các thiết bị muốn giao tiếp với từng kết nối thông qua bus . Bus I2C hỗ trợ nhiều thiết bị nô lệ và nhiều thiết bị chính.

Dữ liệu được truyền từng chút một nối tiếp dọc theo một dây (đường SDA). Giống như SPI, I2C là đồng thời, đầu ra của các bit được đồng bộ hóa với việc kiểm tra các bit bằng tín hiệu đồng hồ được chia sẻ giữa chủ và nô lệ.

Nhiều Cảm biến sử dụng giao thức truyền thông nối tiếp này để truyền dữ liệu của chúng đến các bộ vi điều khiển hoặc thông qua giao thức này, các mạch phụ khác nhau có thể giao tiếp với các mạch chủ. Nó chỉ áp dụng cho việc truyền dữ liệu khoảng cách ngắn.

Chân I2C

Đặc điểm nổi bật của I2C so với SPI là nó chỉ sử dụng hai dây để thực hiện giao tiếp. Một dây là SCL (dòng đồng hồ nối tiếp) đồng bộ hóa việc truyền dữ liệu giữa các thiết bị và dây còn lại là SDA (dữ liệu nối tiếp) mang dữ liệu thực tế cần truyền. Các đường này là các đường thoát nước mở có nghĩa là chúng cần được kết nối để kéo điện trở lên nếu các thiết bị hoạt động ở mức thấp. Mỗi thiết bị phụ được kết nối với xe buýt sẽ có một địa chỉ 8-bit duy nhất.

Việc giao tiếp giữa các thiết bị cụ thể sử dụng hai dây được thực hiện bởi thực tế là mỗi thiết bị có ID hoặc địa chỉ thiết bị duy nhất của riêng mình và sử dụng địa chỉ này; Master có thể chọn bất kỳ thiết bị cụ thể nào để giao tiếp.

Ví dụ: nếu chúng tôi định cấu hình Raspberry Pi Pico làm thiết bị chính, chúng tôi có thể kết nối nhiều thiết bị phụ với cùng một bus.

Sơ đồ I2C chủ và nô lệ

Bus I2C

Bus I2C bao gồm nhiều thiết bị như thiết bị slave và master slave. Mỗi thiết bị được kết nối với bus I2C có thể ở chế độ chính hoặc ở chế độ phụ. Nhưng chỉ có một thiết bị chính mới có thể bắt đầu quá trình truyền dữ liệu. Thông thường, có một chủ và một thiết bị phụ hoặc nhiều thiết bị phụ được kết nối với cùng một bus I2C thông qua các điện trở kéo lên. Mỗi địa chỉ salve có một địa chỉ duy nhất 7-bit.

Thiết bị phụ

Mỗi thiết bị phụ có một địa chỉ duy nhất được sử dụng để nhận dạng thiết bị trên bus. Nói cách khác, địa chỉ phụ giúp thiết bị chính gửi thông tin đến một
thiết bị phụ cụ thể trên bus.

Thiết bị chính

Các thiết bị chính có thể gửi và nhận thông tin. Nô lệ phản ứng với bất cứ điều gì một chủ nhân gửi. Khi gửi thông tin trên bus, chỉ cần một thiết bị duy nhất có thể gửi thông tin tại một thời điểm.

Tóm lại, chúng ta chỉ cần hai dây để truyền dữ liệu hoặc giao tiếp với các số lượng thiết bị khác nhau. I2C cho phép chúng tôi kết nối với nhiều thiết bị cùng một lúc. Tuy nhiên, bạn không thể sử dụng giao thức này để truyền dữ liệu đường dài.

Để biết thêm thông tin về Giao tiếp I2C, bạn có thể đọc bài đăng này:

Raspberry Pi Pico Chân I2C

Raspberry Pi Pico có hai bộ điều khiển. Cả hai bộ điều khiển I2C đều có thể truy cập thông qua các chân GPIO của Raspberry Pi Pico. Bảng sau đây cho thấy kết nối của các chân GPIO với cả hai bộ điều khiển I2C. Mỗi kết nối của bộ điều khiển có thể được cấu hình thông qua nhiều chân GPIO như trong hình. Nhưng trước khi sử dụng bộ điều khiển I2C, bạn nên định cấu hình trong phần mềm chân GPIO nào bạn muốn sử dụng với bộ điều khiển I2C cụ thể.

 

Bộ điều khiển I2C

Chân GPIO

I2C0 - SDA

GP0 / GP4 / GP8 / GP12 / GP16 / GP20

I2C0 - SCL

GP1 / GP5 / GP9 / GP13 / GP17 / GP21

I2C1 - SDA

GP2 / GP6 / GP10 / GP14 / GP18 / GP26

I2C1 - SCL

GP3 / GP7 / GP11 / GP15 / GP19 / GP27

Bộ điều khiển I2C của chip RP4020 hỗ trợ các tính năng sau:

  • Chế độ Master hoặc Slave ( Địa chỉ salve mặc định = 0x055)

  • Ba chế độ tốc độ như Tiêu chuẩn (m 0 đến 100 Kb / s), Nhanh (nhỏ hơn hoặc bằng 400 Kb / s) và chế độ Fast Plus (nhỏ hơn hoặc bằng 1000 Kb / s)

  • Truyền và nhận bộ đệm

  • Có thể được sử dụng ở chế độ ngắt và DMA

Sử dụng Raspberry Pi Pico với thiết bị I2C

Trong phần này, trước tiên chúng ta sẽ kết nối ba thiết bị I2C khác nhau với bảng Raspberry Pi Pico bằng các chân I2C. Sau đó, chúng tôi sẽ lập trình bảng của mình để chạy máy quét I2C.

Các thành phần cần thiết

  1. Raspberry Pi Pico

  2. Màn hình OLED SSD1306

  3. Cảm biến BME280

  4. Cảm biến MPU6050

  5. Breadboard

  6. Dây kết nối

Trước tiên, hãy để chúng tôi giới thiệu ngắn gọn về ba thiết bị I2C mà chúng tôi sẽ sử dụng trong hướng dẫn này: SSD1306 OLED, BME280 và MPU6050.

Màn hình OLED SSD1306 0,96inch

Mặc dù có một số loại màn hình OLED có sẵn trên thị trường, nhưng loại màn hình mà chúng tôi sẽ sử dụng là màn hình OLED 1306.0 inch SSD96. Thành phần chính của tất cả các loại màn hình OLED khác nhau là bộ điều khiển SSD1306 sử dụng giao thức I2C hoặc SPI để giao tiếp với các bộ vi điều khiển. Màn hình OLED có thể khác nhau về kích thước, màu sắc và hình dạng nhưng chủ yếu được lập trình theo cách tương tự.

Hãy để chúng tôi xem xét màn hình OLED mà chúng tôi sẽ sử dụng trong bài viết này. Nó được gọi là SSD 1306 Màn hình OLED 0.96 inch có 128×64 pixel và chỉ giao tiếp qua giao thức I2C với bo mạch Pi Pico. Nó rẻ và có sẵn trên thị trường.

Sơ đồ sơ đồ chân OLED

BME280 

Cảm biến BME280 được sử dụng để đo các chỉ số liên quan đến nhiệt độ môi trường, áp suất khí quyển và độ ẩm tương đối. Nó chủ yếu được sử dụng trong các ứng dụng web và di động, nơi tiêu thụ điện năng thấp là chìa khóa. Cảm biến này sử dụng hoặc để giao tiếp dữ liệu với các bộ điều khiển vi mô. Mặc dù có một số phiên bản BME280 khác nhau có sẵn trên thị trường, nhưng phiên bản chúng tôi sẽ nghiên cứu sử dụng giao thức truyền thông I2C.

Sơ đồ sơ đồ chân BME280

Raspberry Pi Pico giao tiếp với cảm biến BME280 thông qua giao thức I2C để cung cấp các chỉ số về nhiệt độ, áp suất khí quyển và độ ẩm tương đối.

Mô-đun cảm biến MPU6050

Mô-đun cảm biến MPU6050 là mô-đun MEMS (Hệ thống cơ điện tử) có chứa mạch tích hợp MPU6050 IC. Con chip này chứa con quay hồi chuyển ba trục, gia tốc kế ba trục và bộ xử lý điều khiển chuyển động kỹ thuật số trong một gói IC duy nhất. Trên hết, nó cũng chứa một cảm biến nhiệt độ tích hợp.

MPU6050 cung cấp dữ liệu đầu ra trên bus. Do đó, chúng ta có thể sử dụng giao diện bus I2C của MPU6050 để chuyển gia tốc kế 3 trục và các giá trị con quay hồi chuyển 3 trục sang Raspberry Pi Pico. Nói cách khác, chúng ta có thể sử dụng bất kỳ bộ vi điều khiển nào có cổng I2C để đọc dữ liệu đầu ra của cảm biến. Có một địa chỉ chuyên dụng cụ thể được gán cho từng giá trị tham số trong giao diện MPU6050 I2C. Chúng tôi có thể sử dụng các địa chỉ này để nhận các giá trị cụ thể từ cảm biến như gia tốc, con quay hồi chuyển và nhiệt độ.

Một trong những lợi thế của việc sử dụng giao diện I2C của cảm biến này là chúng ta có thể giao tiếp nhiều mô-đun MPU5060 bằng một bộ vi điều khiển duy nhất.

Mô-đun cảm biến MPU6050 Gia tốc kế Cảm biến nhiệt độ con quay hồi chuyển

Giao diện Raspberry Pi Pico với OLED, BME280 và MPU6050

Hãy để chúng tôi xem cách kết nối Raspberry Pi Pico với mô-đun OLED, BME280 và MPU6050 với nhau. Chúng tôi sẽ sử dụng một đường dây I2C chung để kết nối tất cả các thiết bị. Raspberry Pi Pico sẽ hoạt động như một bậc thầy và cảm biến BME280, cảm biến MPU6050 và OLED sẽ hoạt động như nô lệ.

Các kết nối giữa bốn thiết bị mà chúng tôi đang sử dụng có thể được nhìn thấy trong bảng dưới đây.

Raspberry Pi Picon

Màn hình OLED SSD1306

BME280 ·

Mpu6050 ·

3.3V

VCC

VCC

VCC

GP0 (I2C0 SDA)

SDA

SDA

SDA

GP1 (I2C0 SCL)

SCL

SCL

SCL

GND ·

GND ·

GND ·

GND ·

Chúng tôi đã sử dụng các kết nối tương tự như được chỉ định trong bảng trên. Tuy nhiên, bạn cũng có thể sử dụng các kết hợp khác của chân Raspberry Pi Pico SDA / SCL.

Raspberry Pi Pico với sơ đồ kết nối OLED, BME280 và MPU6050Raspberry Pi Pico với OLED, BME280 và MPU6050

Máy quét I2C MicroPython

Mỗi thiết bị I2C đều có một địa chỉ được liên kết với nó. Đối với nhiều thiết bị của I2C LCD, địa chỉ mặc định được 0x27 trong đó 0x hiển thị định dạng hex của các số. Nhưng địa chỉ có thể khác nhau trong một số trường hợp. Địa chỉ này phụ thuộc vào vị trí của miếng đệm A0, A1 và A2 trên bộ điều khiển I2C trên thiết bị này.

Bây giờ sao chép mã này và tải lên bảng của bạn với tất cả các thiết bị I2C đã được kết nối với nó.

Mã này sẽ quét tìm bất kỳ thiết bị I2C nào được kết nối với Raspberry Pi Pico và sẽ chỉ định số lượng thiết bị có địa chỉ trong bảng điều khiển shell.

import machine

 

sdaPIN=machine.Pin(0)  

sclPIN=machine.Pin(1)

 

i2c=machine.I2C(0,sda=sdaPIN, scl=sclPIN, freq=400000)   

 

devices = i2c.scan()

if len(devices) == 0:

 print("No i2c device !")

else:

 print('i2c devices found:',len(devices))

for device in devices:

 print("At address: ",hex(device))

Raspberry Pi Pico I2C máy quét Thonny shell terminal

Máy quét I2C đã xác định được 3 thiết bị được kết nối với giao diện I2C. Địa chỉ I2C của màn hình OLED là 0x3C, MPU6050 là 0x68, BME280 là 0x76.

Bài viết cùng chuyên mục

NHANH

NHANH

Vì Đổi mới liên tục nên Nhanh hơn

ĐÚNG

ĐÚNG

Coi trọng và ưu tiên việc làm Đúng

ĐỦ

ĐỦ

Tìm và mua Đủ Đơn hàng hơn

KỊP THỜI

KỊP THỜI

Hiệu suất tối ưu bởi Kịp Thời hơn