Sử dụng cảm biến I²C với mọi Linux qua USB và IIO

I2C (nghĩa là SMBus) là một trong những giao diện có nhiều khả năng được sử dụng trên bo mạch chính của PC cũng như các thiết bị ngoại vi, do đó, trong khi kết nối các cảm biến I2C thường được kết hợp với các bộ vi điều khiển và SBC, thì rất đơn giản để sử dụng các cảm biến I2C đó từ . Do đó, việc vận hành các thiết bị của chúng ta, chẳng hạn như cảm biến nhiệt độ, áp suất và độ ẩm BME280 nổi tiếng hoặc cảm biến ánh sáng Si1145, sẽ trở nên đơn giản

Cốt lõi của nó là MCU dựa trên AVR ATtiny85, cung cấp giao diện USB tích hợp, chạy chương trình cơ sở I2C-Tiny-USB và [Peter Molnar] mô tả chi tiết cách kết nối bộ điều hợp vật lý để thêm kết nối USB

Chìa khóa ở đây là MCU xuất hiện với nhân Linux dưới dạng thiết bị i2c, yêu cầu tải trình điều khiển _________. Sau này, thiết bị I2C được kết nối với bus I2C của bộ điều hợp có thể được sử dụng thông qua lệnh gọi API của mô-đun Linux, trực tiếp hoặc thông qua trình điều khiển hiện có. Chẳng hạn, [Peter] phát hiện ra rằng trình điều khiển BMP280 được bao gồm trong Debian Sid

Kết nối các cảm biến I2C là thứ thường được kết hợp với các bộ vi điều khiển và SBC, nhưng về cơ bản, rất dễ sử dụng các cảm biến I2C như vậy từ bất kỳ hệ thống nào chạy Linux. Xét cho cùng, I2C (tức là SMBus) là một trong những giao diện có khả năng cao được sử dụng trên bo mạch chính PC của bạn cũng như các thiết bị ngoại vi. Điều này có nghĩa là việc chạy các thiết bị của riêng chúng tôi như cảm biến nhiệt độ, áp suất và độ ẩm BME280 nổi tiếng hoặc cảm biến ánh sáng Si1145 sẽ rất dễ dàng

Trong một bài đăng trên blog cách đây vài năm, [Peter Molnar] giải thích chi tiết cách kết nối bộ điều hợp vật lý để thêm giao diện I2C được kết nối USB vào hệ thống. Cốt lõi của nó là MCU dựa trên AVR ATtiny85, cung cấp giao diện USB tích hợp, chạy chương trình cơ sở I2C-Tiny-USB

Phần thiết yếu ở đây là MCU hiển thị nhân Linux dưới dạng thiết bị i2c, yêu cầu trình điều khiển

micronucleus --run --dump-progress --type intel-hex main.hex
1 được tải. Sau đó, thiết bị I2C được kết nối với bus I2C của bộ điều hợp có thể được sử dụng thông qua lệnh gọi API của mô-đun Linux, trực tiếp hoặc thông qua trình điều khiển hiện có. [Peter] thấy rằng trình điều khiển BMP280 đi kèm với Debian Sid chẳng hạn

ghi chú. không có bảo hành. Đây là phần cứng, vì vậy nó có thể gây ra sự cố với hệ thống của bạn, đặc biệt nếu bạn làm đoản mạch thứ gì đó hoặc - như tôi đã làm một lần, nhiều mặt trăng trước đây - hàn nhanh tại sao thứ đó vẫn được kết nối với cổng USB. đừng làm thế

Sử dụng cảm biến I²C với mọi Linux qua USB và IIO
Quá trình lắp ráp nguyên mẫu Digispark ATTiny85, Adaf nhung BME280 và Adaf nhung SI1145 PENTAX K-5 II s, 85. 0 mm, f/5. 6, 1/60 giây, ISO 800 ⋅ HD PENTAX-DA 16-85mm F3. 5-5. 6 ED DC WR ⋅ CC-BY-NC-ND-4. 0

Bộ chuyển đổi USB I²C

Vài tháng trước, tôi đã viết về việc sử dụng Raspberry Pi với một số cảm biến I²C để thu thập dữ liệu cho Collectd. Mặc dù nó hoạt động tốt, nhưng nó khiến tôi nhận ra rằng để RPi chạy một hệ điều hành chính thức có nghĩa là tôi cần áp dụng các bản vá bảo mật cho một máy khác và đó không phải là điều tôi muốn giải quyết. Tôi cũng có một máy tính xách tay cũ, chạy dưới dạng NAS dựa trên ZFS, vậy tại sao không sử dụng nó?

Sau khi mạo hiểm thử nghiệm không có kết quả để sử dụng cổng I²C trong đầu nối VGA, tôi đã xác minh rằng thực sự, như đã kết luận trong hướng dẫn, nó không hoạt động với đồ họa Intel nhúng trên linux

Tôi bắt đầu xem xét bộ điều hợp USB I²C, nhưng chúng đắt tiền. Tuy nhiên, có một dự án trông rất hứa hẹn và nó cũng không yêu cầu Arduino chính thức. Cho đến I²C-Tiny-USB của Harbaum

Nó sử dụng bo mạch ATtiny85 - đúng như tên gọi, nó rất nhỏ và hóa ra là một bộ chuyển đổi USB sang I²C hoàn toàn tốt. Bạn có thể mua một cái ở đây. https. //amzn. đến/2ubPs6I

Ghi chú. có một Adaf nhung FT232H, theo lý thuyết, có khả năng làm điều tương tự. Tôi đã không kiểm tra nó

Phần sụn I2C-Tiny-USB

Kho lưu trữ git đã chứa tệp

micronucleus --run --dump-progress --type intel-hex main.hex
3 được tạo sẵn, nhưng trong trường hợp có bất kỳ sửa đổi nào cần thực hiện, đây là cách thực hiện

sudo -i
apt install gcc-avr avr-libc
cd /usr/src
git clone https://github.com/harbaum/I2C-Tiny-USB
cd I2C-Tiny-USB/digispark
make hex

Đảm bảo rằng

micronucleus --run --dump-progress --type intel-hex main.hex
4 không bị ghi chú;

tiện ích flash micronucleus

Để flash tệp hex, bạn sẽ cần

micronucleus --run --dump-progress --type intel-hex main.hex
5, một tiện ích flasher nhỏ

sudo -i
apt install libusb-dev
cd /usr/src
git clone https://github.com/micronucleus/micronucleus
cd micronucleus/commandline
make CONFIG=t85_default
make install

Chạy

micronucleus --run --dump-progress --type intel-hex main.hex

sau đó kết nối thiết bị qua cổng USB và đợi kết thúc quá trình flash

I²C trên linux

Đáng ngạc nhiên là Debian đã không hiển thị các trung tâm I²C trong

micronucleus --run --dump-progress --type intel-hex main.hex
6 - rõ ràng là mô-đun hạt nhân cho điều này chưa được tải, vì vậy hãy tải nó và thực hiện tải đó vĩnh viễn

sudo -i
modprobe i2c-dev
echo "i2c-dev" >> /etc/modules

Kết nối Attiny85

Thông thường, PC đã có một số lượng lớn bộ điều hợp I²C. Do đó, thiết bị mới sẽ hiển thị thêm một số thiết bị, số này khá quan trọng. Nhật ký hạt nhân có thể giúp xác định rằng

________số 8

Để chỉ đọc số thiết bị

i2cdev=$(dmesg | grep 'connected i2c-tiny-usb device' | head -n1 | sed -r 's/.*\s+i2c-([0-9]+).*/\1/')

Ghi chú. số thiết bị có thể thay đổi sau khi khởi động lại. Đối với tôi, đó là

micronucleus --run --dump-progress --type intel-hex main.hex
7 khi chỉ cần cắm vào và
micronucleus --run --dump-progress --type intel-hex main.hex
8 nếu nó được kết nối trong khi khởi động lại

Phát hiện thiết bị I2C

micronucleus --run --dump-progress --type intel-hex main.hex
9 là một chương trình kết xuất tất cả các thiết bị phản hồi trên bộ điều hợp I²C. Trang web Adaf nhung có một bộ sưu tập các cảm biến của họ.
micronucleus --run --dump-progress --type intel-hex main.hex
8 sau
sudo -i
modprobe i2c-dev
echo "i2c-dev" >> /etc/modules
1 là số thiết bị được xác định ở bước trước và cho biết tôi có 2 thiết bị

sudo -i
apt install gcc-avr avr-libc
cd /usr/src
git clone https://github.com/harbaum/I2C-Tiny-USB
cd I2C-Tiny-USB/digispark
make hex
5

I²C 0x77. Cảm biến nhiệt độ, áp suất, độ ẩm BME280

Đây là nơi mọi thứ trở nên thú vị. Thông thường, khi một cảm biến

sudo -i
modprobe i2c-dev
echo "i2c-dev" >> /etc/modules
2 hoạt động, mọi hướng dẫn sẽ bắt đầu sử dụng Python để thực hiện nhiệm vụ, với điều kiện là hầu hết các thư viện Adaf nhung đều bằng Python

Đừng hiểu sai ý tôi, đó là những lib tuyệt vời và các giải pháp Python rất tốt, nhưng thực hiện

sudo -i
modprobe i2c-dev
echo "i2c-dev" >> /etc/modules
3 đã dẫn đến điều này

sudo -i
apt install gcc-avr avr-libc
cd /usr/src
git clone https://github.com/harbaum/I2C-Tiny-USB
cd I2C-Tiny-USB/digispark
make hex
8

Cái nào để sử dụng?

Vì vậy, tôi bắt đầu tìm hiểu trên internet, github và các nguồn khác, và bằng cách nào đó tôi nhận ra có một mô-đun hạt nhân, tên là

sudo -i
modprobe i2c-dev
echo "i2c-dev" >> /etc/modules
4.
sudo -i
modprobe i2c-dev
echo "i2c-dev" >> /etc/modules
5 là anh em của
sudo -i
modprobe i2c-dev
echo "i2c-dev" >> /etc/modules
2 - nó không có cảm biến độ ẩm. Vì vậy, các câu hỏi là.
sudo -i
modprobe i2c-dev
echo "i2c-dev" >> /etc/modules
7 là gì trên thế giới và tôi có thể sử dụng nó như thế nào?

Hóa ra, ngoài

sudo -i
modprobe i2c-dev
echo "i2c-dev" >> /etc/modules
8, còn có một lớp thư viện cảm biến khác trong nhân linux, được gọi là Industrial I/O - iio. Nó đã được thêm tên này vào đâu đó vào năm 2012, khoảng 3. 15, và mục đích của nó là cung cấp một cảm biến tốc độ nhanh cho hệ thống con. Mặc dù tốc độ nhanh không phải là vấn đề đối với tôi vào thời điểm này, nhưng tôi tin tưởng vào chất lượng mã hạt nhân

Điều ngạc nhiên lớn nhất của tôi là mô-đun

sudo -i
modprobe i2c-dev
echo "i2c-dev" >> /etc/modules
5 thậm chí còn được bao gồm trong nhân Debian Sid như một mô-đun, và việc thêm nó chỉ là một

micronucleus --run --dump-progress --type intel-hex main.hex
5

Để thực sự kích hoạt thiết bị, bus i2c phải được thông báo về sự tồn tại của cảm biến

micronucleus --run --dump-progress --type intel-hex main.hex
6

Nhật ký

dmesg | grep i2c-tiny-usb
[    3.721200] usb 5-2: Product: i2c-tiny-usb
[    3.725693] i2c-tiny-usb 5-2:1.0: version 2.01 found at bus 005 address 003
[    3.736109] i2c i2c-1: connected i2c-tiny-usb device
[    3.736584] usbcore: registered new interface driver i2c-tiny-usb
0 sẽ hiển thị một cái gì đó như thế này

sudo -i
apt install libusb-dev
cd /usr/src
git clone https://github.com/micronucleus/micronucleus
cd micronucleus/commandline
make CONFIG=t85_default
make install
0

Xác minh thiết bị đang hoạt động

sudo -i
apt install libusb-dev
cd /usr/src
git clone https://github.com/micronucleus/micronucleus
cd micronucleus/commandline
make CONFIG=t85_default
make install
1

Và đó là nó.

sudo -i
modprobe i2c-dev
echo "i2c-dev" >> /etc/modules
2 đã sẵn sàng để sử dụng

sudo -i
apt install libusb-dev
cd /usr/src
git clone https://github.com/micronucleus/micronucleus
cd micronucleus/commandline
make CONFIG=t85_default
make install
2

Theo bảng dữ liệu

sudo -i
modprobe i2c-dev
echo "i2c-dev" >> /etc/modules
2, dưới các chế độ hoạt động được đề xuất (3. 5. 1 Theo dõi thời tiết), tỷ lệ lấy mẫu quá mức cho mỗi cảm biến phải là 1, vì vậy

sudo -i
apt install libusb-dev
cd /usr/src
git clone https://github.com/micronucleus/micronucleus
cd micronucleus/commandline
make CONFIG=t85_default
make install
3

I²C 0x60. SI1145 Chỉ số UV, ánh sáng, cảm biến hồng ngoại

Không giống như BME280, SI1145 không có mô-đun hạt nhân tích hợp sẵn trong Debian Sid - nhưng nó tồn tại dưới dạng mô-đun hạt nhân, đơn giản là nó không được bao gồm trong Nhân Debian. Tôi cũng đã học được rằng cảm biến này là một đối thủ hạng nặng và lẽ ra tôi nên mua thứ gì đó đơn giản hơn để chỉ đo ánh sáng;

Nhưng tôi không sẵn sàng từ bỏ SI1145, là một cảm biến đắt tiền, vì vậy để có nó trong nhân, tôi phải biên dịch mô-đun nhân. Trước khi bắt đầu đảm bảo

  • hệ thống của bạn được cập nhật
  • bạn đã khởi động lại kể từ lần cập nhật kernel cuối cùng

Khi hai điều đó là đúng, hãy xác định phiên bản kernel

sudo -i
apt install libusb-dev
cd /usr/src
git clone https://github.com/micronucleus/micronucleus
cd micronucleus/commandline
make CONFIG=t85_default
make install
4

Đầu ra chứa

dmesg | grep i2c-tiny-usb
[    3.721200] usb 5-2: Product: i2c-tiny-usb
[    3.725693] i2c-tiny-usb 5-2:1.0: version 2.01 found at bus 005 address 003
[    3.736109] i2c i2c-1: connected i2c-tiny-usb device
[    3.736584] usbcore: registered new interface driver i2c-tiny-usb
3 - đó là phiên bản hạt nhân thực tế, không phải
dmesg | grep i2c-tiny-usb
[    3.721200] usb 5-2: Product: i2c-tiny-usb
[    3.725693] i2c-tiny-usb 5-2:1.0: version 2.01 found at bus 005 address 003
[    3.736109] i2c i2c-1: connected i2c-tiny-usb device
[    3.736584] usbcore: registered new interface driver i2c-tiny-usb
4 là tên Debian

Lấy nhân;

sudo -i
apt install libusb-dev
cd /usr/src
git clone https://github.com/micronucleus/micronucleus
cd micronucleus/commandline
make CONFIG=t85_default
make install
5

Khi đã xong và không có thông báo lỗi nào, hãy bật thiết bị

sudo -i
apt install libusb-dev
cd /usr/src
git clone https://github.com/micronucleus/micronucleus
cd micronucleus/commandline
make CONFIG=t85_default
make install
6

________ 80 dài sẽ hiển thị một cái gì đó như thế này

sudo -i
apt install libusb-dev
cd /usr/src
git clone https://github.com/micronucleus/micronucleus
cd micronucleus/commandline
make CONFIG=t85_default
make install
7

Xác minh thiết bị đang hoạt động

sudo -i
apt install libusb-dev
cd /usr/src
git clone https://github.com/micronucleus/micronucleus
cd micronucleus/commandline
make CONFIG=t85_default
make install
8

Ghi chú. Tôi đã thử, những người khác đã thử, nhưng mặc dù về lý thuyết, có một cảm biến nhiệt độ trên SI1145, nhưng nó không hoạt động. Có vẻ như nó đọc giá trị khi khởi động, và thế là xong

tập lệnh CLI

Để có chế độ xem nhanh, không thu thập hoặc các phụ thuộc khác, một tập lệnh như thế này là quá đủ

sudo -i
apt install libusb-dev
cd /usr/src
git clone https://github.com/micronucleus/micronucleus
cd micronucleus/commandline
make CONFIG=t85_default
make install
9

Đầu ra

micronucleus --run --dump-progress --type intel-hex main.hex
0

Ghi chú. Tôi không hoàn toàn chắc chắn rằng đơn vị ánh sáng thực sự tính bằng lumen;

thu thập

Bước tiếp theo là thực sự thu thập các chỉ số cảm biến từ các cảm biến. Tôi vẫn đang sử dụng

dmesg | grep i2c-tiny-usb
[    3.721200] usb 5-2: Product: i2c-tiny-usb
[    3.725693] i2c-tiny-usb 5-2:1.0: version 2.01 found at bus 005 address 003
[    3.736109] i2c i2c-1: connected i2c-tiny-usb device
[    3.736584] usbcore: registered new interface driver i2c-tiny-usb
7, một hệ thống thu thập số liệu nhỏ, cổ xưa nhưng ổn định và rất tốt, bởi vì nó là đủ. Nó ghi các tệp
dmesg | grep i2c-tiny-usb
[    3.721200] usb 5-2: Product: i2c-tiny-usb
[    3.725693] i2c-tiny-usb 5-2:1.0: version 2.01 found at bus 005 address 003
[    3.736109] i2c i2c-1: connected i2c-tiny-usb device
[    3.736584] usbcore: registered new interface driver i2c-tiny-usb
8 thông thường, có thể được vẽ thành biểu đồ bằng các công cụ như Collectd Graph Panel

Thật không may, vẫn chưa có plugin iio cho colld (hoặc tôi chưa thể tìm thấy nó và nếu bạn đã tìm thấy, vui lòng cho tôi biết), vì vậy tôi phải thêm một tập lệnh shell cực kỳ đơn giản làm plugin exec cho colld

dmesg | grep i2c-tiny-usb
[    3.721200] usb 5-2: Product: i2c-tiny-usb
[    3.725693] i2c-tiny-usb 5-2:1.0: version 2.01 found at bus 005 address 003
[    3.736109] i2c i2c-1: connected i2c-tiny-usb device
[    3.736584] usbcore: registered new interface driver i2c-tiny-usb
9

micronucleus --run --dump-progress --type intel-hex main.hex
1

i2cdev=$(dmesg | grep 'connected i2c-tiny-usb device' | head -n1 | sed -r 's/.*\s+i2c-([0-9]+).*/\1/')
0

micronucleus --run --dump-progress --type intel-hex main.hex
2

Kết quả là

Sử dụng cảm biến I²C với mọi Linux qua USB và IIO
Biểu đồ nhiệt độ BME280 trong Bảng đồ thị đã thu thập
Sử dụng cảm biến I²C với mọi Linux qua USB và IIO
Đo ánh sáng thô SI1145 trong Bảng đồ thị đã thu thập

kết luận

Tầng I/O công nghiệp là thứ tôi mới nghe lần đầu, nhưng nó cực kỳ hứa hẹn. mã rõ ràng, nó đã hỗ trợ rất nhiều cảm biến và dường như có thể mở rộng tương đối dễ dàng

Thật không may, đó là tài liệu ngắn gọn và tôi vẫn chưa tìm thấy bất kỳ công cụ thu thập số liệu nào hỗ trợ ngay lập tức, nhưng điều đó không có nghĩa là sẽ không có sớm

Hiện tại tôi rất hài lòng với giải pháp USB I2C ngân sách của mình - việc không phải chạy Raspberry Pi để thu thập số liệu đơn giản chắc chắn là thắng và việc sử dụng các cảm biến trực tiếp từ nhân cũng có vẻ rất tốt