Nâng cấp Các Thiết bị Phòng thí nghiệm với Khả năng IoT Sử dụng AI Sinh sản

Ari Mahpour
|  Created: Tháng Tư 4, 2024  |  Updated: Tháng Bảy 1, 2024
Nâng cấp Thiết bị Phòng thí nghiệm với Khả năng IoT bằng AI Sinh sản

Trong bài viết Chuyển đổi Nguồn Điện Cũ của Bạn để Có Thể Kiểm Soát Qua Điện Thoại Thông Minh, chúng tôi đã thổi một làn gió mới vào một nguồn điện cũ bằng cách trang bị cho nó khả năng IoT. Trong bài viết này, chúng tôi sẽ xem xét một cách tiếp cận đơn giản hơn để mang khả năng IoT đến tất cả các thiết bị phòng thí nghiệm của bạn (cụ thể là những thiết bị được điều khiển bằng VISA). Thay vì tự xây dựng từ đầu, chúng tôi sẽ tận dụng AI Sinh học để thực hiện phần lớn công việc nặng nhọc. Sau khi đi qua hướng dẫn này, bạn nên có thể áp dụng những khái niệm này để xây dựng trình điều khiển web cho tất cả các thiết bị phòng thí nghiệm của mình và cũng tăng tốc độ phát triển tổng thể của bạn.

Cơ sở

Trong bài viết này, chúng tôi sẽ tập trung vào việc tổ chức dịch vụ web hoạt động như một trung gian giữa chính thiết bị và Internet. Dưới đây là một hình minh họa về kết nối từ đầu đến cuối giữa thiết bị và internet (tức là truy cập qua website). 

Sơ đồ khối

Hình 1: Giao tiếp từ đầu đến cuối giữa thiết bị và Internet

Trước khi thực hiện, điều quan trọng là phải nhận ra rằng không hoàn toàn cần thiết phải tự viết tất cả các trình điều khiển thiết bị. Chúng ta có thể tận dụng những gì đã được thực hiện trực tuyến từ các nhà sản xuất hoặc chúng ta có thể tận dụng các kho lưu trữ mã nguồn mở. Vì lý do ngắn gọn, tôi sẽ tận dụng những gì tôi đã tìm thấy trực tuyến nhưng sử dụng AI Sinh học để tổ chức một khung công việc mà tôi hài lòng. Tôi đang sử dụng nguồn điện DP832 và tải điện tử DL3021 từ Rigol. Sau một cuộc tìm kiếm nhanh trên GitHub, tôi đã tìm thấy thư viện Python cho nguồn điện DP832 chứa tất cả các lệnh SCPI cần thiết để bắt đầu. Một cách tiếp cận khác có thể là lấy một danh sách các lệnh SCPI từ hướng dẫn sử dụng DP832, gửi nó cho một mô hình ngôn ngữ lớn (LLM), ví dụ như ChatGPT hoặc Gemini, và yêu cầu nó tạo ra các chức năng cho tôi. Tôi hơi kén chọn nên tôi sẽ định nghĩa quy trình thiết lập PyVISA của riêng mình (được đóng gói trong một lớp riêng biệt): ``` class CommBase:    USBConnType = Literal["USBTMC", "VISA", "Socket"]     def __init__(self, usb_conn_type: USBConnType, vid: int = None, pid: int = None, visa_resource_prefix: str = None):         self.visa_resource_prefix = visa_resource_prefix         self.usb_conn_type = usb_conn_type         if usb_conn_type == "USBTMC":             self.configure_usbtmc(vid, pid)         elif usb_conn_type == "VISA": ```

            self.configure_visa(vid, pid)

        elif usb_conn_type == "Socket":

            pass

        else:

            raise ValueError(f"Loại kết nối USB không hợp lệ: {usb_conn_type}. Các loại hợp lệ là {self.VALID_USB_CONN_TYPES}")

 

    def configure_usbtmc(self, vid: int, pid: int):

        self.inst = usbtmc.Instrument(vid, pid)

 

    def configure_visa(self, vid: int, pid: int):

        self.rm = pyvisa.ResourceManager()

        danh_sách_thiết_bị = self.rm.list_resources()

        địa_chỉ_visa = self.find_visa_resource(vid, pid, danh_sách_thiết_bị, prefix=self.visa_resource_prefix)

        if địa_chỉ_visa is not None:

            self.inst = self.rm.open_resource(địa_chỉ_visa, read_termination="\n")

        else:

            raise IOError(f'Không tìm thấy thiết bị VISA nào sử dụng vid "{vid}" và pid "{pid}" nhưng các thiết bị VISA sau đã được tìm thấy: {danh_sách_thiết_bị}')

 

    @staticmethod

    def find_visa_resource(vid: int, pid: int, danh_sách_nguồn: list, prefix: str) -> str:

        hex_vid, hex_pid = f"0x{vid:X}", f"0x{pid:X}"

        dec_vid, dec_pid = str(vid), str(pid)

        for nguồn in danh_sách_nguồn:

            phần = nguồn.split("::")

            if len(phần) >= 4:

                serial_and_more = phần[3]

``` if (any(x in resource for x in (hex_vid, dec_vid)) and any(x in resource for x in (hex_pid, dec_pid)) and serial_and_more.startswith(prefix)): ``` ``` return resource ``` ``` return None ``` ``` ``` ``` def query_device(self, command: str) -> str: ``` ``` if self.usb_conn_type == "USBTMC": ``` ``` return self.inst.ask(command) ``` ``` elif self.usb_conn_type == "VISA": ``` ``` return self.inst.query(command) ``` ``` else: ``` ``` raise NotImplementedError(f"Phương thức truy vấn cho {self.usb_conn_type} không được tìm thấy.") ``` ``` ``` ``` def write_device(self, command: str): ``` ``` self.inst.write(command) ``` ``` ``` ``` def close(self): ``` ``` self.inst.close() ``` ``` if self.usb_conn_type == "VISA": ``` ``` self.rm.close() ``` ``` ``` ``` def id(self) -> dict: ``` ``` id_str = self.query_device("*IDN?").strip().split(",") ``` ``` return { ``` ``` "nhà sản xuất": id_str[0], ``` ``` "mô hình": id_str[1], ``` ``` "số sê-ri": id_str[2], ``` ``` "phiên bản": id_str[3], ``` ``` } ``` Tôi đã loại bỏ tất cả các bình luận, khoảng trắng thừa, và thậm chí một số chuỗi thiết lập (như ghi nhật ký) để ngắn gọn. Như bạn có thể thấy, tôi có một số hàm chung cũng như hỗ trợ cho cả PyVISA và USBTMC. Hầu hết các thư viện Python dựa trên SCPI mà bạn tìm thấy trực tuyến sẽ không có chức năng cơ bản này. Điều đó không sao vì tôi có thể mở rộng lớp này vào lớp mới của mình:

 

from base.CommBase import CommBase

class DP(CommBase):

    def channel_check(self, channel):

        assert NotImplementedError

 

    def get_output_mode(self, channel: int) -> str:

        self.channel_check(channel)

        return self.query_device(f":OUTP:MODE? CH{channel}").strip()

 

    # … Mã đã được loại bỏ để ngắn gọn

 

    def measure_current(self, channel):

        self.channel_check(channel)

        meas = self.query_device(f":MEAS:CURR? CH{channel}").strip()

        return float(meas)

 

    def measure_voltage(self, channel):

        self.channel_check(channel)

        meas = self.query_device(f":MEAS? CH{channel}").strip()

        return float(meas)

 

    def measure_all(self, channel):

        self.channel_check(channel)

        meas = self.query_device(f":MEAS:ALL? CH{channel}").strip().split(",")

        return {

            "voltage": float(meas[0]),

            "current": float(meas[1]),

            "power": float(meas[2]),

        }

 

class DP712(DP):

    def channel_check(self, channel):

        assert channel in [1, ""], f"Kênh đầu ra {channel} không được hỗ trợ"

 

class DP821(DP):

    def channel_check(self, channel):

        assert channel in [1, 2, ""], f"Kênh đầu ra {channel} không được hỗ trợ"

 

class DP832(DP):

    def channel_check(self, channel):

        assert channel in [1, 2, 3, ""], f"Kênh đầu ra {channel} không được hỗ trợ"

Tôi đã thử nghiệm một số ví dụ khác nhau trực tuyến và chuyển chúng vào ChatGPT. Tôi đã yêu cầu nó:

  1. Chuyển đổi tệp thành một lớp
  2. Thêm các khối bình luận kiểu docstring cho mỗi hàm
  3. Viết các bài kiểm tra để xác thực các hàm này (dưới dạng một lớp riêng biệt)

Sử dụng Trí tuệ Nhân tạo Sinh học cho nhiệm vụ này đã giảm thời gian công việc từ nhiều giờ xuống còn 60 giây. Tôi cũng có thể, rất nhanh chóng, xác thực các trình điều khiển tôi tìm thấy trực tuyến bằng cách chạy các bài kiểm tra tự động mà ChatGPT đã viết cho tôi. Ví dụ, tôi đã phát hiện, rất nhanh chóng, rằng một trong những lệnh SCPI cho DL3021 để thiết lập chế độ hoạt động của tải điện tử thực sự không chính xác. Khi xem các bài kiểm tra chạy trực tiếp, tôi nhận thấy rằng chế độ không thay đổi trên thiết bị của mình. Một cuộc tìm kiếm nhanh chóng trong sổ tay SCPI và tôi đã có thể sửa chữa nó.

Dịch Vụ Web

Ở thời điểm này, chúng ta đã có một nền tảng tốt cho thư viện Python của mình để điều khiển các thiết bị của mình. Mục tiêu bây giờ là đặt một dịch vụ web phía trước thư viện thiết bị, cho phép chúng ta điều khiển chúng qua web. Giả sử tôi không biết gì về các khuôn khổ web, tôi có thể đơn giản hỏi ChatGPT (hoặc bất kỳ LLM nào) để thực hiện toàn bộ chức năng cho tôi. Đây là lời nhắc mà tôi đã sử dụng để bắt đầu:

Tôi cần tạo một dịch vụ web sẽ điều khiển thiết bị của tôi sử dụng các url cơ bản (qua trình duyệt web). Tôi không biết nhiều về dịch vụ web hoặc các khuôn khổ nhưng tôi quen với Python. Viết toàn bộ mã Python để thực hiện nhiệm vụ này.

Đây là lớp điều khiển thiết bị của tôi:

<pre><code>```

{mã từ trên}

```

</code></pre>

Và phản hồi (một phần):

Phản hồi từ lời nhắc ChatGPT

Hình 2: Phản hồi từ lời nhắc ChatGPT

Phần tôi yêu thích nhất về các LLM (Large Language Models) trả phí phức tạp là chúng thực sự phân tích nhiệm vụ cho bạn, giáo dục bạn, và cung cấp một giải pháp khá tốt ngay từ lần đầu tiên. Trong Gemini so với ChatGPT: Ai Viết Mã Tốt Hơn? tôi đã so sánh hai LLM với nhau và (cảnh báo spoiler) phát hiện ra rằng phiên bản mới nhất, tiên tiến nhất của Gemini của Google thực sự khá tốt (nếu không muốn nói là ngang hàng với ChatGPT 4). Sử dụng bất kỳ LLM nào trong số này sẽ mang lại kết quả tương tự như hình trên.

Nếu tôi muốn đưa điều này vào một lớp học hoặc định dạng lại, tôi chỉ cần phản hồi lại cuộc trò chuyện và đưa ra yêu cầu của mình. Muốn mã của bạn được bình luận? Không vấn đề gì, chỉ cần hỏi!

Lời nhắc: Thêm khối bình luận kiểu docstring vào mỗi hàm. Viết lại toàn bộ lớp học kết quả để tôi có thể sao chép và dán trở lại trình soạn thảo mã của mình.

Lời nhắc ChatGPT

Hình 3: Phản hồi tiếp theo từ lời nhắc ChatGPT

Kiểm thử

Bây giờ, sau khi chúng ta đã có AI sinh ra mô-đun Python, chúng ta có thể yêu cầu nó viết các bài kiểm thử cho chúng ta hoặc chỉ cho chúng ta cách kiểm thử thủ công:

URL Kiểm thử

Hình 4: URL kiểm thử thủ công từ ChatGPT

Kiểm thử Tự động

 Hình 5: Kiểm thử tự động được viết bởi ChatGPT

Sau khi chạy (hoặc chỉnh sửa rồi chạy) những bài kiểm thử này, chúng ta nên có thể xác nhận mô-đun Python mới của mình, là cầu nối giữa web và thiết bị đo của chúng ta. 

Kết luận

Trong bài viết này, chúng tôi đã kết hợp một module Python điều khiển thiết bị của mình bằng cách tận dụng mã nguồn có sẵn trên web và Trí tuệ nhân tạo sinh học. Sau khi LLM của chúng tôi hoàn thành module, chúng tôi sau đó giới thiệu một module mới hoạt động như một trung gian giữa Internet và chính thiết bị (thông qua một dịch vụ web). Chúng tôi cũng nhanh chóng xem xét cách Trí tuệ nhân tạo sinh học có thể hướng dẫn chúng tôi qua toàn bộ quá trình bao gồm kiểm tra thủ công hoặc tự động. Điều tốt nhất về bài tập này là, nếu thực hiện đúng cách, bạn nên mất rất ít thời gian để hoàn thành. Lần đầu tiên có thể yêu cầu một chút nỗ lực bổ sung nhưng lặp lại quá trình này cho nhiều thiết bị nên rất dễ dàng (và tốn rất ít thời gian phát triển). Rõ ràng, Trí tuệ nhân tạo sinh học đã hoàn toàn thay đổi bối cảnh cho tất cả chúng ta và bài viết này thực sự chứng minh điều đó. Hy vọng bạn sẽ được truyền cảm hứng để tạo ra bộ thư viện thiết bị tiếp theo tận dụng Trí tuệ nhân tạo sinh học và đóng góp chúng trở lại cho cộng đồng.

Tất cả mã nguồn được sử dụng trong dự án này có thể được tìm thấy tại: https://gitlab.com/ai-examples/instrument-controllables.

About Author

About Author

Ari is an engineer with broad experience in designing, manufacturing, testing, and integrating electrical, mechanical, and software systems. He is passionate about bringing design, verification, and test engineers together to work as a cohesive unit.

Related Resources

Tài liệu kỹ thuật liên quan

Back to Home
Thank you, you are now subscribed to updates.