Contents

Thêm ADC vào Raspberry Pi của bạn: Những điều bạn cần biết

Bài học chính

Raspberry Pi không thể xử lý tín hiệu analog trực tiếp; tuy nhiên, nó có thể được trang bị Bộ chuyển đổi Tương tự sang Kỹ thuật số (ADC) bên ngoài để chuyển đổi các giá trị điện áp vật lý thành định dạng kỹ thuật số phù hợp cho việc lưu trữ, thao tác và quản lý dữ liệu.

Các lựa chọn Bộ chuyển đổi Tương tự sang Kỹ thuật số (ADC) phổ biến bao gồm MCP3004/MCP3008, cung cấp sự cân bằng giữa tốc độ và độ chính xác, cũng như ADS111x, cung cấp độ phân giải 16 bit ở tần số lấy mẫu thấp hơn.

ADS1115, có sẵn thông qua Adafruit, là một giải pháp tinh tế có Bộ khuếch đại khuếch đại có thể lập trình (PGA), cho phép phát hiện sự chênh lệch điện áp nhỏ đồng thời tạo điều kiện điều chỉnh mức tăng động trong quá trình vận hành. Việc tích hợp với Raspberry Pi thông qua I2C không có bất kỳ thách thức nào.

Sự thiếu sót ban đầu của Raspberry Pi trong việc cung cấp đầu vào tương tự khiến nó khác biệt với các nền tảng định hướng vi điều khiển như Arduino, điều này có thể hạn chế khả năng của nó khi so sánh với các nền tảng thay thế đó.

Mặc dù điều này có vẻ khó khăn nhưng vẫn có nhiều lựa chọn thay thế khác nhau để khám phá. Bạn có thể bắt đầu bằng cách sử dụng Raspberry Pi cùng với Bộ chuyển đổi tương tự sang kỹ thuật số (ADC) bên ngoài để hoạt động liền mạch.

Tại sao phải thêm đầu vào?

Trong thế giới tự nhiên, tồn tại rất nhiều hiện tượng có thể được gói gọn một cách thuận tiện thông qua việc sử dụng các điện thế. Bằng cách chuyển đổi các điện thế này thành các giá trị nhị phân tương đương, chúng có thể được lưu trữ, thao tác và sử dụng làm phương tiện để điều chỉnh các yếu tố bổ sung và kích hoạt các cơ chế tiếp theo.

Người ta có thể muốn giám sát độ ẩm của trái đất, độ ấm của nhà kính hoặc sức nặng của loài gặm nhấm của họ. Người ta có thể tìm cách kết hợp bộ điều chỉnh mức trên Raspberry Pi của họ, xây dựng toàn bộ dãy thanh trượt hoặc chế tạo một cần điều khiển mới. Các ứng dụng tiềm năng phần lớn rất phong phú và đa dạng.

Tùy chọn cho ADC

Vậy ADC nào tốt nhất cho người mới bắt đầu?

Trong số các tùy chọn phổ biến và đơn giản nhất là MCP3004 (và MCP3008 ) chip của Microchip. Bạn sẽ nhận được bốn (hoặc tám) kênh, mỗi kênh 10 bit, có thể đọc tới 200 kSPS. Mặt khác, có các thiết bị ADS111x của Texas Instruments, đọc 16 bit ở 860 SPS. Vì vậy, có sự cân bằng giữa tốc độ và độ chính xác (và tất nhiên là cả giá cả).

Một số bộ vi điều khiển được trang bị Bộ chuyển đổi tương tự sang số (ADC) tích hợp. Ví dụ: ATMega được sử dụng rộng rãi trong hầu hết Arduinos cung cấp nhiều kênh có độ phân giải 10 bit cùng với các chức năng khác. Khả năng này cho phép nền tảng Arduino hỗ trợ các tín hiệu đầu vào tương tự vượt qua các giới hạn về khả năng của Raspberry Pi. Trong trường hợp Arduino hiện có được tích hợp trong một dự án và độ phân giải 10 bit đủ cho độ chính xác cần thiết, sử dụng giải pháp Arduino sẵn có có thể là cách hành động đơn giản nhất.

Thật vậy, để đơn giản, chúng tôi sẽ sử dụng ADS1115 do Adaf nhung cung cấp trong trường hợp này.

/vi/images/ads1115_photo.png

Bộ khuếch đại khuếch đại có thể lập trình là gì?

Mạch tích hợp tự hào có một số khả năng hấp dẫn, đáng chú ý là Bộ khuếch đại khuếch đại có thể lập trình (PGA) tích hợp, cho phép cài đặt kỹ thuật số phổ biên độ ưa thích. PGA cho phép đặc tả dải điện áp xuống đến phần nhỏ của volt, cho phép phát hiện các biến thể nhỏ như vài microvolt do có rất nhiều giá trị được biểu thị bằng độ phân giải 16 bit.

Một trong những lợi ích của con chip đặc biệt này là nó cho phép điều chỉnh mức tăng trong quá trình hoạt động. Ngược lại, một số thiết bị khác như MCP3004 sử dụng chiến lược thay thế bằng cách kết hợp một chân bổ sung để có thể áp dụng điện áp tham chiếu.

Còn việc ghép kênh thì sao?

Bộ ghép kênh, còn được gọi là mux, đóng vai trò như một thiết bị chuyển mạch cho phép sử dụng bộ chuyển đổi tương tự sang số (ADC) duy nhất để lấy mẫu dữ liệu từ nhiều nguồn. Trong trường hợp mạch tích hợp ADC có vô số đầu vào đầu vào, rõ ràng là quá trình ghép kênh nội tại diễn ra bên trong. Ví dụ: ADS1115 kết hợp thành phần mux với khả năng chứa tối đa bốn tín hiệu đầu vào riêng biệt, có thể được chọn lọc thông qua thao tác cấu hình thanh ghi vốn có của nó.

Xử lý các thanh ghi

ADS1115 cung cấp một loạt các chức năng có thể dễ dàng truy cập thông qua thao tác trên một số cài đặt điều khiển. Chúng bao gồm khả năng quản lý đa

Cơ chế kích hoạt cho từng tính năng riêng lẻ được giấu trong giới hạn bao bì của sản phẩm, biểu hiện dưới dạng kho lưu trữ dữ liệu cực nhỏ được gọi là “sổ đăng ký”. Để kích hoạt một chức năng cụ thể, người ta chỉ cần thay đổi thanh ghi thích hợp từ trạng thái mặc định bằng 0 thành giá trị bằng 1.

Nhìn vào bảng dữ liệu ADS111x , bạn sẽ thấy rằng các mẫu này có bốn thanh ghi, bao gồm cả các thanh ghi cấu hình chi phối thiết bị hành vi của.

/vi/images/as1115_config_register.jpg

Trong bối cảnh này, các bit từ 14 đến 12 được sử dụng để điều khiển hoạt động của bộ ghép kênh. Bằng cách sử dụng ba chữ số nhị phân này, người ta có thể chọn trong số tám cấu hình riêng biệt. Đáng chú ý, cấu hình mong muốn trong trường hợp này là “100”, vì nó xác định tín hiệu vi sai giữa kênh đầu vào 0 và mặt đất. Ngược lại, các bit từ 7 đến 5 chịu trách nhiệm điều chỉnh tần số lấy mẫu. Để đạt được tốc độ lấy mẫu cao nhất có thể là 860 mẫu mỗi giây, việc đặt các bit này thành “111” là lý tưởng.

Khi bạn đã xác định được các cài đặt thích hợp sẽ được áp dụng, bạn sẽ có quyền truy cập vào tổng cộng hai bit có thể được truyền tới Bộ chuyển đổi Tương tự sang Kỹ thuật số. Trong trường hợp sau đó bạn muốn sửa đổi các bit riêng lẻ, bạn có thể làm như vậy bằng cách sử dụng các thao tác theo bit một cách riêng biệt.

Việc biểu diễn các trạng thái chuyển đổi riêng lẻ trong hệ thống nhị phân có thể gây ra một số nhầm lẫn. Mặc dù bản thân mã nhị phân không biểu thị trực tiếp một giá trị số cụ thể nhưng nó có thể được sử dụng để biểu thị trạng thái của từng công tắc riêng lẻ. Thông tin này có thể được thể hiện dưới nhiều định dạng khác nhau như ký hiệu thập phân hoặc thập lục phân; tuy nhiên, để dễ hiểu và ngăn ngừa những rắc rối tiềm ẩn, tốt hơn hết là duy trì việc sử dụng định dạng nhị phân.

Nối dây

Thiết bị này có thể được kết nối thuận tiện với bảng mạch bánh mì. Phạm vi đầu vào điện áp dương của nó trải dài từ 2 đến 5,5 volt, đảm bảo khả năng tương thích với nguồn điện 3,3 volt của Raspberry Pi.

Để bắt đầu hoạt động, hãy kết nối các chân SDA và SCL từ MCP3008 với các cổng tương ứng trên Raspberry Pi đồng thời kết nối đất và kết nối 3,3V. Ngoài ra, hãy lắp một chiết áp nối tiếp giữa đường dây nối đất và đường dây điện áp, sau đó gắn một đầu dây dẫn giữa của chiết áp vào đầu vào đầu tiên của Bộ chuyển đổi Tương tự sang Kỹ thuật số (ADC). Sau khi hoàn tất các bước này, thiết lập của bạn đã sẵn sàng để sử dụng.

Xử lý I2C

Bộ chuyển đổi tương tự sang số (ADC) đa dạng sử dụng các giao thức truyền thông khác nhau để hoạt động. Ví dụ: trong ngữ cảnh ADS1115 của chúng tôi, chúng tôi sẽ sử dụng một giao diện cụ thể được gọi là Mạch tích hợp liên kết (I2C) cho mục đích liên lạc và truyền dữ liệu.

Để sử dụng Python khi giao tiếp với Bộ chuyển đổi tương tự sang số (ADC) trên Raspberry Pi, phải đáp ứng một số điều kiện tiên quyết nhất định. May mắn thay, các phiên bản gần đây của Hệ điều hành (OS) Raspberry Pi đã hợp lý hóa quy trình này một cách đáng kể. Để bắt đầu quy trình thiết lập, hãy điều hướng đến “Tùy chọn” trong menu hệ thống và chọn “Cấu hình Raspberry Pi”. Từ đó, chuyển đến tab “Giao diện” và kích hoạt tùy chọn “I2C”.

/vi/images/i2c_enable.jpg

Để đảm bảo rằng tất cả các thành phần đều hoạt động chính xác, vui lòng khởi chạy giao diện dòng lệnh bằng cách mở cửa sổ terminal và thực hiện lệnh sau:

 sudo i2cdetect -y 1 

Văn bản được cung cấp mô tả một tình huống trong đó việc thực thi một lệnh cụ thể sẽ tạo ra một đầu ra trên lưới, chứa thông tin liên quan đến địa chỉ của Bộ chuyển đổi Tương tự sang Kỹ thuật số (ADC). Tác giả nhấn mạnh rằng giá trị thập lục phân này phải được bắt đầu bằng “0x” trước khi được sử dụng trong mã tiếp theo. Trong trường hợp này, giá trị được biểu thị là 0x48.

/vi/images/20231108_18h24m38s_grim.jpg

Bằng cách sử dụng địa chỉ thu được, người ta có thể sử dụng thư viện SMBus để truyền các lệnh I2C bằng cách sử dụng hai quy trình riêng biệt. Một trong những phương pháp này liên quan đến việc sử dụng hàm write\_word\_data(), yêu cầu ba đầu vào là địa chỉ thiết bị, thanh ghi cụ thể được ghi vào và giá trị dữ liệu mong muốn sẽ được ghi vào vị trí nói trên.

Hàm read\_word\_data() lấy đầu vào là địa chỉ thiết bị và một thanh ghi, đồng thời khiến Bộ chuyển đổi tương tự sang số (ADC) liên tục lấy mẫu và lưu trữ các giá trị điện áp trong thanh ghi đã chỉ định. Điều này cho phép truy xuất dữ liệu được lưu trữ sau đó từ sổ đăng ký.

Người ta có thể chọn nâng cao khả năng trình bày trực quan của đầu ra và sau đó hiển thị nó. Trước khi bắt đầu lại chu trình lặp lại, có thể thực hiện tạm dừng hoặc trì hoãn một thời gian ngắn. Cách tiếp cận như vậy giúp ngăn chặn tình trạng quá tải thông tin.

 from smbus import SMBus
import time
addr = 0x48
bus = SMBus(1)

# set the registers for reading
CONFIGREG = 1
CONVERSIONREG = 0

# set the address register to point to the config register
# write to the config registers
bus.write_word_data(addr, CONFIGREG, (0b00000100 << 8 | 0b10000010))

 # define the top of the range
TOP = 26300

while True:
    # read the register
    b = bus.read_word_data(addr, CONVERSIONREG)

    # swap the two bytes
    b = ((b & 0xFF) << 8) | ((b >> 8) & 0xFF)
    
    # subtract half the range to set ground to zero
    b -= 0x8000

    # divide the result by the range to give us a value between zero and one
    b /= TOP

    # cap at one
    b = min(b, 1)

    # bottom is zero
    b = max(b, 0)

    # two decimal places
    b = round(b, 2)
    print(b)
    time.sleep(.01)

Sau khi bạn đã chuyển đổi kiểu dữ liệu của biến để phù hợp với định dạng ưu tiên, điều cần thiết là phải ánh xạ các giá trị kết quả tới các giá trị tương ứng của chúng theo thang đo ban đầu. Điều này cho phép so sánh có ý nghĩa giữa hai bộ giá trị. Sau đó, bạn có thể chọn loại bỏ bất kỳ chữ số thừa nào bằng cách đặt số vị trí thập phân thích hợp. Để chỉ hiển thị các kết quả được cập nhật, hãy sửa đổi chức năng in để chỉ hiển thị các giá trị mới nếu chúng khác với các giá trị được hiển thị trước đó. Để biết thêm thông tin về max, min và round, hãy tham khảo phần tổng hợp của chúng tôi về 20 hàm Python quan trọng hàng đầu.

Xử lý tiếng ồn

Trong trường hợp môi trường của một người thiếu tính tổ chức và trật tự cao, có thể thấy rõ rằng có một số yếu tố không mong muốn nhất định xuất hiện trong dữ liệu được thu thập. Hiện tượng này có thể là do việc sử dụng phạm vi giá trị nhỏ hơn, chẳng hạn như độ phân giải 16 bit thay vì 10 bit, dẫn đến tăng khả năng gặp phải những nhiễu loạn hoặc “nhiễu” này.

Khi kết nối đầu vào một với mặt đất và cài đặt thiết bị để so sánh đầu vào một và hai, kết quả đọc sẽ đạt được độ ổn định cao hơn. Ngoài ra, cáp nhảy ngắn hơn có cải tiến về điện dung có thể được sử dụng thay vì các phiên bản dài hơn, ồn ào hơn. Hơn nữa, việc điều chỉnh mức điện trở của chiết áp cũng có thể ảnh hưởng đến hiệu suất.

Ngoài ra, người ta có thể sử dụng các giải pháp phần mềm để quản lý biến động dữ liệu. Một cách tiếp cận khả thi bao gồm việc tính toán đường trung bình động hoặc loại bỏ hoàn toàn những thay đổi nhỏ. Tuy nhiên, quá trình hành động này đi kèm với một gánh nặng tính toán bổ sung. Khi làm việc với các ngôn ngữ lập trình cấp cao như Python và xử lý nhiều mẫu mỗi giây, những chi phí này có thể tích lũy với tốc độ ngày càng nhanh.

Tiến xa hơn với nhiều bước tiếp theo khả thi

Việc sử dụng I2C cho mục đích đọc là một quá trình tương đối đơn giản, tương tự như trường hợp của các phương pháp thay thế như SPI. Bất chấp sự khác biệt rõ ràng giữa các lựa chọn thay thế ADC khác nhau, thực tế là khi một người đã thực hiện thành công bất kỳ lựa chọn nào trong số này, chuyên môn có được có thể dễ dàng áp dụng cho những lựa chọn còn lại.

Tại sao không đẩy xa hơn nữa ranh giới của bộ điều khiển chiết áp mới được chế tạo của bạn? Bằng cách kết nối nhiều chiết áp nối tiếp hoặc cố gắng đo các biến số như ánh sáng, âm thanh hoặc nhiệt độ, người ta có thể khám phá những khả năng tương tác mới với hệ thống Raspberry Pi của mình. Bắt tay vào một hành trình thú vị bằng cách mở rộng khả năng của dự án hiện tại của bạn và tạo ra trải nghiệm tương tác hoàn toàn thông qua thử nghiệm thực hành.