Mục lục:
2025 Tác giả: John Day | [email protected]. Sửa đổi lần cuối: 2025-01-13 06:58
Hướng dẫn này là một trong số nhiều hướng dẫn khi sử dụng Raspberry Pi để điều khiển các thiết bị không dây xung quanh nhà. Giống như nhiều người khác, nó sẽ hướng dẫn bạn cách sử dụng một cặp máy phát / máy thu giá rẻ được kết nối với Pi của bạn để tương tác với các thiết bị hoạt động trên dải tần số vô tuyến 433MHz thường được sử dụng. Nó sẽ chỉ cho bạn cách bật hoặc tắt bất kỳ thiết bị điện nào bằng cách sử dụng Pi của bạn bằng cách truyền lệnh tới một bộ ổ cắm điện điều khiển từ xa 433MHz.
Tại sao tôi lại tạo hướng dẫn này nếu đã có rất nhiều hướng dẫn? Chủ yếu là vì hầu hết các hướng dẫn khác mà tôi đã xem qua dường như phức tạp quá mức, đặc biệt là về mặt phần mềm. Tôi nhận thấy rằng họ chủ yếu dựa vào thư viện, tập lệnh hoặc đoạn mã của bên thứ ba để thực hiện tất cả công việc. Nhiều người thậm chí sẽ không giải thích mã cơ bản đang làm gì - họ sẽ chỉ yêu cầu bạn cài đặt hai hoặc ba phần mềm trên Pi của bạn và thực hiện một loạt lệnh, không có câu hỏi nào. Tôi thực sự muốn thử sử dụng Pi của mình để bật và tắt các thiết bị điện xung quanh nhà bằng một bộ ổ cắm điều khiển từ xa 433MHz, nhưng tôi muốn tạo phiên bản hệ thống của riêng mình mà tôi có thể hiểu được, hy vọng loại bỏ nhu cầu sử dụng thư viện hoặc tập lệnh của người khác.
Đó là những gì hướng dẫn này là về. Mặt phần mềm của hệ thống này bao gồm hai tập lệnh Python rất đơn giản - một để nhận và ghi lại các tín hiệu và một để truyền các tín hiệu này trở lại các ổ cắm điện không dây. Việc nhận / truyền tín hiệu thực tế chỉ dựa vào thư viện RPi. GPIO dễ sử dụng, ít nhất là đối với tôi, được cài đặt sẵn với Raspbian. Thư viện này cũng có thể được nhập trực tiếp vào Python.
Đối với dự án này, bạn sẽ cần:
Một Raspberry Pi. Bất kỳ mô hình nào cũng nên hoạt động, tôi đã sử dụng bộ khởi động tất cả trong một, nhưng có lẽ bạn chỉ cần thiết bị trung tâm
Một cặp máy phát / máy thu 433MHz. Những thứ thường được sử dụng nhất trong loại dự án này dường như là những thứ này. Mua một gói năm chiếc giống như gói được liên kết đảm bảo rằng bạn có một vài phụ tùng
Một bộ ổ cắm điện điều khiển từ xa 433MHz. Tôi đã sử dụng những thứ này mà tôi rất muốn giới thiệu, nhưng có vô số mẫu có sẵn. Chỉ cần đảm bảo rằng chúng hoạt động trên tần số này
Một số phụ kiện xây dựng mạch. Tôi khuyên bạn nên sử dụng breadboard và một số cáp jumper để làm cho quá trình xây dựng mạch dễ dàng nhất có thể.
[Nếu bạn quyết định mua bất kỳ sản phẩm nào trong số này, tôi sẽ đánh giá rất cao nếu bạn truy cập danh sách bằng các liên kết trên - bằng cách đó, tôi nhận được một phần nhỏ lợi nhuận mà không phải trả thêm phí cho bạn!]
Bước 1: Thiết lập Bộ thu
Trước khi có thể sử dụng Pi để gửi lệnh đến các ổ cắm được điều khiển từ xa, bạn cần biết chúng phản hồi lại những tín hiệu cụ thể nào. Hầu hết các ổ cắm được điều khiển từ xa đều đi kèm với một thiết bị cầm tay có thể được sử dụng để bật hoặc tắt các thiết bị cụ thể. Trong trường hợp của những cái tôi đã mua, chiếc điện thoại này có bốn hàng nút BẬT / TẮT được ghép nối, mỗi hàng sẽ gửi tín hiệu BẬT hoặc TẮT đến một bộ phận ổ cắm cụ thể.
Điều này đưa ra một câu hỏi - làm thế nào để chúng ta biết các nút nào tương ứng với ổ cắm nào? Điều này thực sự phụ thuộc vào mô hình bạn có. Một trong những lý do chính mà tôi chọn kiểu ổ cắm cụ thể của mình (được liên kết trong phần giới thiệu) là các thiết bị có thể được cấu hình bằng một công tắc vật lý để làm cho một ổ cắm cụ thể phản ứng với một bộ nút BẬT / TẮT cụ thể trên thiết bị cầm tay. Điều này cũng có nghĩa là bạn có thể rút phích cắm và di chuyển các ổ cắm xung quanh nhà khi biết rằng mỗi thiết bị sẽ luôn phản ứng với các tín hiệu BẬT / TẮT giống nhau.
Khi bạn đã tìm ra cách các ổ cắm của mình tương tác với thiết bị cầm tay, bạn sẽ cần sử dụng bộ thu 433MHz (hình trên) để 'đánh hơi' các mã được gửi bởi thiết bị cầm tay. Khi bạn đã ghi lại các dạng sóng của các mã này, bạn có thể sao chép chúng bằng Python và gửi chúng ra ngoài bằng đơn vị phát.
Điều đầu tiên cần làm ở đây là đấu dây các chân trên bộ thu của bạn vào đúng các chân GPIO trên Pi. Bộ thu có bốn chân, nhưng chỉ cần ba chân trong số đó. Tôi nghĩ rằng cả hai chân trung tâm đều cho cùng một đầu ra, vì vậy bạn chỉ cần kết nối với một trong số chúng (trừ khi bạn muốn truyền tín hiệu nhận được đến hai chân GPIO riêng biệt).
Hình ảnh trên tóm tắt khá nhiều về hệ thống dây điện. Mỗi chân trên bộ thu có thể được nối trực tiếp với chân tương ứng trên Pi. Tôi sử dụng breadboard và cáp jumper để làm cho quá trình thanh lịch hơn một chút. Lưu ý rằng bạn có thể chọn bất kỳ chân dữ liệu GPIO nào để kết nối với một trong các chân thu trung tâm. Tôi đã sử dụng ghim được đánh dấu là '23' trên tiêu đề Pi của mình.
QUAN TRỌNG: Nếu bạn kết nối chân được đánh dấu '3v3' trong hình trên với chân điện áp cao hơn trên Pi (ví dụ: 5v), bạn có thể sẽ làm hỏng Pi vì các chân GPIO không thể chịu được điện áp trên 3v3. Ngoài ra, bạn có thể cấp nguồn cho nó với 5v và thiết lập bộ chia điện áp để gửi điện áp an toàn đến chân DATA.
Phạm vi của máy thu sẽ không rất lớn ở điện áp này, đặc biệt nếu một ăng-ten không được kết nối. Tuy nhiên, bạn không cần một phạm vi dài ở đây - miễn là người nhận có thể nhận tín hiệu từ thiết bị cầm tay khi chúng được giữ ngay cạnh nhau, đó là tất cả những gì chúng ta cần.
Bước 2: Đánh hơi mã thiết bị cầm tay
Bây giờ bộ thu của bạn đã được kết nối với Pi, bạn có thể bắt đầu giai đoạn thú vị đầu tiên của dự án này - đó là hít. Điều này liên quan đến việc sử dụng tập lệnh Python đính kèm để ghi lại tín hiệu được truyền bởi thiết bị cầm tay khi mỗi nút được nhấn. Tập lệnh rất đơn giản và tôi thực sự khuyên bạn nên xem qua nó trước khi chạy - sau cùng, điểm của dự án này là bạn sẽ không chỉ chạy mã của người khác một cách mù quáng!
Trước khi bắt đầu quá trình này, bạn cần đảm bảo rằng mình có các thư viện Python cần thiết để chạy tập lệnh trình thám thính. Chúng được liệt kê ở đầu tập lệnh:
từ datetime nhập datetime
nhập matplotlib.pyplot dưới dạng pyplot nhập RPi. GPIO dưới dạng GPIO
Thư viện RPi. GPIO và datetime được bao gồm trong bản phân phối Raspbian của tôi, nhưng tôi phải cài đặt thư viện matplotlib như sau:
sudo apt-get install python-matplotlib
Thư viện này là một thư viện vẽ đồ thị thường được sử dụng rất hữu ích ngay cả bên ngoài dự án này, vì vậy việc cài đặt nó chắc chắn không thể tránh khỏi! Khi thư viện của bạn được cập nhật, bạn đã sẵn sàng để bắt đầu ghi dữ liệu. Đây là cách tập lệnh hoạt động:
Khi nó được chạy (sử dụng lệnh 'python acceptRF.py'), nó sẽ định cấu hình chân GPIO đã xác định làm đầu vào dữ liệu (pin 23 theo mặc định). Sau đó, nó sẽ liên tục lấy mẫu mã pin và ghi lại xem nó đang nhận số 1 hay số 0. Việc này tiếp tục trong một khoảng thời gian đã đặt (mặc định là 5 giây). Khi đạt đến giới hạn thời gian này, tập lệnh sẽ ngừng ghi dữ liệu và sẽ đóng đầu vào GPIO. Sau đó, nó thực hiện một chút xử lý hậu kỳ và vẽ biểu đồ giá trị đầu vào nhận được theo thời gian. Một lần nữa, nếu bạn có thắc mắc về những gì script đang làm, bạn có thể tự trả lời chúng sau khi xem cách thức hoạt động của nó. Tôi đã cố gắng làm cho mã dễ đọc và đơn giản nhất có thể.
Những gì bạn cần làm là để ý khi script cho biết rằng nó đã ** Bắt đầu ghi **. Khi thông báo này xuất hiện, bạn nên nhấn và giữ một trong các nút trên điện thoại trong khoảng một giây. Đảm bảo giữ thiết bị gần đầu thu. Sau khi ghi xong tập lệnh, nó sẽ sử dụng matplotlib để vẽ biểu đồ dạng sóng đồ họa của tín hiệu mà nó đã nhận được trong khoảng thời gian ghi. Xin lưu ý, nếu bạn được kết nối với Pi bằng ứng dụng SSH như PuTTY, bạn cũng sẽ cần mở ứng dụng X11 để cho phép hiển thị dạng sóng. Tôi sử dụng xMing cho việc này (và cho những thứ khác như điều khiển máy tính từ xa vào Pi của tôi). Để cho phép hiển thị cốt truyện, bạn chỉ cần khởi động xMing trước khi chạy tập lệnh và đợi kết quả xuất hiện.
Khi cửa sổ matplotlib của bạn xuất hiện, khu vực quan tâm trong cốt truyện sẽ khá rõ ràng. Bạn có thể sử dụng các nút điều khiển ở cuối cửa sổ để phóng to cho đến khi bạn có thể chọn ra mức cao và thấp của tín hiệu do điện thoại truyền đi trong khi nhấn nút. Xem hình ảnh trên để biết ví dụ về mã hoàn chỉnh. Tín hiệu có thể sẽ bao gồm các xung rất ngắn cách nhau khoảng thời gian tương tự mà không có tín hiệu nào được nhận. Khối xung ngắn này có thể sẽ được theo sau bởi một khoảng thời gian dài hơn mà không nhận được gì, sau đó mô hình sẽ lặp lại. Khi bạn đã xác định được mẫu thuộc về một trường hợp mã duy nhất, hãy chụp ảnh màn hình như vậy ở đầu trang này và tiếp tục bước tiếp theo để diễn giải nó.
Bước 3: Phiên mã tín hiệu kết quả
Bây giờ bạn đã xác định được khối các mức cao và thấp định kỳ tương ứng với tín hiệu của một nút cụ thể, bạn sẽ cần một cách lưu trữ và giải thích nó. Trong ví dụ về tín hiệu ở trên, bạn sẽ nhận thấy rằng chỉ có hai mẫu duy nhất tạo nên toàn bộ khối tín hiệu. Đôi khi bạn thấy mức cao ngắn theo sau là mức thấp dài và đôi khi ngược lại - mức cao dài theo sau là mức thấp ngắn. Khi tôi đang sao chép các tín hiệu của mình, tôi quyết định sử dụng quy ước đặt tên sau:
1 = short_on + long_off0 = long_on + short_off
Hãy nhìn lại dạng sóng được gắn nhãn, và bạn sẽ thấy ý tôi muốn nói. Khi bạn đã xác định được các mẫu tương đương trong tín hiệu của mình, tất cả những gì bạn phải làm là đếm số 1 và số 0 để xây dựng chuỗi. Khi phiên mã, tín hiệu trên có thể được viết như sau:
1111111111111010101011101
Bây giờ bạn chỉ cần lặp lại quá trình này để ghi lại và phiên mã các tín hiệu tương ứng với các nút khác trên thiết bị cầm tay của bạn, và bạn đã hoàn thành phần đầu tiên của quá trình!
Trước khi bạn có thể gửi lại tín hiệu bằng bộ phát, bạn còn phải làm thêm một số việc. Thời gian giữa các mức cao và mức thấp tương ứng với 1 hoặc 0 là rất quan trọng và bạn cần đảm bảo rằng bạn biết 'short_on' hoặc 'long_off' thực sự kéo dài trong bao lâu. Đối với mã của tôi, có ba phần thông tin thời gian tôi cần trích xuất để tái tạo các tín hiệu:
- Khoảng thời gian của một khoảng thời gian 'ngắn', tức là đầu số 1 hoặc cuối số 0.
- Khoảng thời gian của một khoảng thời gian 'dài', tức là khi kết thúc số 1 hoặc đầu số 0.
- Khoảng thời gian 'kéo dài'. Tôi nhận thấy rằng khi tôi nhấn giữ một nút trên thiết bị cầm tay, có một khoảng thời gian 'Extended_off' giữa mỗi phiên bản lặp lại của khối tín hiệu. Độ trễ này được sử dụng để đồng bộ hóa và có thời lượng cố định.
Để xác định các giá trị thời gian này, bạn có thể sử dụng chức năng thu phóng trên cửa sổ matplotlib để phóng to và đặt con trỏ qua các phần có liên quan của tín hiệu. Vị trí con trỏ đọc ở cuối cửa sổ sẽ cho phép bạn xác định độ rộng của từng phần của tín hiệu tương ứng với khoảng thời gian dài, ngắn hoặc kéo dài. Lưu ý rằng trục x của biểu đồ biểu thị thời gian và thành phần x của lần đọc con trỏ tính bằng đơn vị giây. Đối với tôi, chiều rộng như sau (tính bằng giây):
- short_delay = 0,00045
- long_delay = 0,00090 (dài gấp đôi "short")
- Extended_delay = 0,0096
Bước 4: Thiết lập Bộ phát
Khi bạn đã thu thập được mã và dữ liệu thời gian, bạn có thể ngắt kết nối thiết bị thu của mình vì bạn sẽ không cần đến nó nữa. Sau đó, bạn có thể đấu dây trực tiếp bộ phát tới các chân GPIO Pi có liên quan như trong hình trên. Tôi nhận thấy rằng các chân trên bộ phát được gắn nhãn, điều này làm cho quá trình dễ dàng hơn.
Trong trường hợp này, có thể cấp nguồn cho thiết bị bằng nguồn 5v từ Pi vì chân DATA sẽ không gửi tín hiệu đến Pi mà chỉ nhận chúng. Ngoài ra, nguồn điện 5v sẽ cung cấp nhiều phạm vi truyền hơn so với việc sử dụng nguồn 3v3. Một lần nữa, bạn có thể kết nối chân DATA với bất kỳ chân thích hợp nào trên Pi. Tôi đã sử dụng chân 23 (giống như cho đầu thu).
Một điều khác mà tôi khuyên bạn nên làm là thêm một ăng-ten vào lỗ nhỏ ở trên cùng bên phải của máy phát. Tôi đã dùng một đoạn dây thẳng dài 17cm. Một số nguồn khuyến nghị một dây cuộn có chiều dài tương tự. Tôi không chắc loại nào tốt hơn, nhưng dây thẳng cung cấp đủ phạm vi để tôi bật / tắt ổ cắm từ bất kỳ vị trí nào trong căn hộ nhỏ của tôi. Tốt nhất là hàn ăng-ten, nhưng tôi chỉ lấy một số nhựa ra khỏi dây và quấn đồng qua lỗ.
Sau khi bộ phát được kết nối, đó là tất cả các thiết lập phần cứng đã hoàn tất! Điều duy nhất còn lại cần làm bây giờ là đặt các ổ cắm của bạn xung quanh nhà và xem chương trình phát.
Bước 5: Truyền tín hiệu bằng Pi
Đây là lúc tập lệnh Python thứ hai xuất hiện. Nó được thiết kế để đơn giản như tập lệnh đầu tiên, nếu không muốn nói là hơn thế. Một lần nữa, vui lòng tải xuống và xem qua mã. Bạn sẽ cần phải chỉnh sửa tập lệnh để truyền tín hiệu chính xác theo dữ liệu bạn đã ghi ở bước 3, vì vậy, bây giờ là thời điểm tốt để xem nhanh nó.
Các thư viện cần thiết để chạy tập lệnh này đều đã được cài đặt sẵn trên Pi của tôi, vì vậy không cần cài đặt thêm. Chúng được liệt kê ở đầu tập lệnh:
thời gian nhập khẩu
nhập hệ thống nhập RPi. GPIO dưới dạng GPIO
Bên dưới phần nhập thư viện là thông tin bạn sẽ phải chỉnh sửa. Đây là giao diện của nó theo mặc định (đây là thông tin tương ứng với các ổ cắm của tôi như được xác định bằng cách sử dụng bước 3):
a_on = '1111111111111010101011101'
a_off = '1111111111111010101010111' b_on = '1111111111101110101011101' b_off = '1111111111101110101010111' c_on = '1111111111101011101011101' c_off = '1111111111101011101010111' d_on = '1111111111101010111011101' d_off = '1111111111101010111010111' short_delay = 0,00045 long_delay = 0,00090 extended_delay = 0,0096
Ở đây chúng tôi có tám chuỗi mã (hai chuỗi cho mỗi cặp nút bật / tắt trên thiết bị cầm tay của tôi - bạn có thể có nhiều hoặc ít mã hơn) tiếp theo là ba phần thông tin thời gian cũng được xác định trong bước 3. Hãy dành thời gian để đảm bảo rằng bạn có đã nhập thông tin này một cách chính xác.
Khi bạn hài lòng với các mã / độ trễ bạn đã nhập vào tập lệnh (bạn có thể đổi tên các biến chuỗi mã nếu muốn), bạn đã sẵn sàng rất nhiều để dùng thử hệ thống! Trước khi thực hiện, hãy xem qua hàm truyền_code () trong tập lệnh. Đây là nơi xảy ra tương tác thực tế với máy phát. Hàm này mong đợi một trong các chuỗi mã được gửi dưới dạng đối số. Sau đó, nó mở ra chân được xác định như một đầu ra GPIO và lặp qua mọi ký tự trong chuỗi mã. Sau đó, nó sẽ bật hoặc tắt máy phát theo thông tin thời gian bạn đã nhập để tạo ra một dạng sóng khớp với chuỗi mã. Nó gửi mỗi mã nhiều lần (theo mặc định là 10) để giảm nguy cơ bị bỏ sót và để lại thời hạn_dễ_thời gian kéo dài giữa mỗi khối mã, giống như thiết bị cầm tay.
Để chạy tập lệnh, bạn có thể sử dụng cú pháp lệnh sau:
python TransmitRF.py mã_1 mã_2…
Bạn có thể truyền nhiều chuỗi mã chỉ với một lần chạy tập lệnh. Ví dụ: để bật các socket (a) và (b) và tắt socket (c), hãy chạy script bằng lệnh sau:
python TransmitRF.py a_on b_on c_off
Bước 6: Lưu ý về độ chính xác của thời gian
Như đã nói, thời gian giữa các xung bật / tắt được truyền là khá quan trọng. Tập lệnh TransmitRF.py sử dụng hàm time.sleep () của python để xây dựng các dạng sóng với các khoảng xung chính xác, nhưng cần lưu ý rằng hàm này không hoàn toàn chính xác. Độ dài mà nó khiến tập lệnh chờ trước khi thực hiện thao tác tiếp theo có thể phụ thuộc vào tải của bộ xử lý tại thời điểm nhất định. Đó là một lý do khác tại sao TransmitRF.py gửi mỗi mã nhiều lần - chỉ trong trường hợp hàm time.sleep () không thể tạo đúng một phiên bản nhất định của mã.
Cá nhân tôi chưa bao giờ gặp vấn đề với time.sleep () khi nói đến việc gửi mã. Tuy nhiên, tôi biết rằng time.sleep () của tôi có xu hướng có lỗi khoảng 0,1ms. Tôi đã xác định điều này bằng cách sử dụng tập lệnh SleepTest.py đính kèm có thể được sử dụng để đưa ra ước tính về mức độ chính xác của hàm Pi's time.sleep (). Đối với các ổ cắm được điều khiển từ xa cụ thể của tôi, độ trễ ngắn nhất mà tôi cần triển khai là 0,45ms. Như tôi đã nói, tôi chưa gặp vấn đề với các ổ cắm không phản hồi, vì vậy có vẻ như 0,45 ± 0,1ms là đủ tốt.
Có những phương pháp khác để đảm bảo rằng độ trễ chính xác hơn; ví dụ: bạn có thể sử dụng chip PIC chuyên dụng để tạo mã, nhưng những thứ như vậy nằm ngoài phạm vi của hướng dẫn này.
Bước 7: Kết luận
Dự án này đã trình bày một phương pháp điều khiển bất kỳ thiết bị điện nào bằng Raspberry Pi và một bộ ổ cắm điều khiển từ xa 433MHz, tập trung vào sự đơn giản và minh bạch. Đây là dự án thú vị và linh hoạt nhất mà tôi đã sử dụng Pi của mình, và có vô số ứng dụng dành cho nó. Đây là một số điều tôi có thể làm bây giờ nhờ Pi của tôi:
- Bật lò sưởi điện bên cạnh giường của tôi nửa giờ trước khi chuông báo thức của tôi vang lên.
- Tắt lò sưởi một giờ sau khi tôi đi ngủ.
- Bật đèn đầu giường khi chuông báo thức kêu để tôi không ngủ lại.
- và nhiều thứ khác nữa…
Đối với hầu hết các tác vụ này, tôi sử dụng hàm crontab trong Linux. Điều này cho phép bạn thiết lập các tác vụ được lập lịch tự động để chạy tập lệnh TransmitRF.py vào những thời điểm cụ thể. Bạn cũng có thể sử dụng lệnh Linux at để chạy các tác vụ một lần (đối với tôi, cần được cài đặt riêng bằng cách sử dụng 'sudo apt-get install at'). Ví dụ: để bật máy sưởi nửa giờ trước khi báo thức reo vào sáng hôm sau, tất cả những gì tôi cần làm là nhập:
lúc 05:30
python TransmitRF.py c_on
Bạn cũng có thể sử dụng dự án này kết hợp với hệ thống giám sát nhà Dropbox của tôi để kiểm soát các thiết bị qua internet! Cảm ơn bạn đã đọc, và nếu bạn muốn làm rõ điều gì đó hoặc chia sẻ ý kiến của mình, vui lòng gửi bình luận!