RS-485 có phải là lớp vật lý phù hợp cho chip Atmega trong tình huống giám sát tại nhà không?


7

Tôi đang có ý định xây dựng một số chip giám sát nhà dựa trên Atmega. Tôi muốn theo dõi nhiệt độ, độ ẩm và mức độ hiện tại. Giám sát mức hiện tại sẽ được thực hiện với một bộ thu quy nạp trên các dòng AC. Ngoài ra, tôi muốn có một số chân trên mỗi màn hình có thể được sử dụng như GPIO được điều khiển từ xa.

Kế hoạch của tôi là sử dụng chip Attiny84 để thực hiện điều này. Mỗi bảng sẽ được cho ăn với +15 VDC và +7 VDC. Tôi có thể điều chỉnh điều này với bộ điều chỉnh sê-ri 780x đến +5 VDC và +12 VDC để cấp nguồn cho chip và bất kỳ cảm biến hoặc rơle nào khác tôi muốn.

Cung cấp năng lượng sẽ sử dụng hai cặp trong cáp Cat5e. Các thiết bị sẽ được xích lại với nhau. Điều này để lại hai cặp trong cáp còn lại. Từ những gì tôi đã đọc, RS-485 có vẻ như là một giải pháp hấp dẫn cho dữ liệu và kiểm soát. Thiết bị cuối cùng cần một điện trở kết thúc được kết nối với nó, nhưng điều đó sẽ dễ dàng.

Nếu tôi hiểu chính xác, việc thêm chip vào mạch của tôi như MAX485 chỉ thêm khả năng vật lý cho tín hiệu RS-485. Tôi vẫn cần triển khai phần mềm để giao tiếp và hơn nữa và giao thức thực tế cho nhiều thiết bị để trao đổi dữ liệu. Tôi sẽ có tối đa 12 thiết bị được xâu chuỗi cùng với một chủ. Trong hệ thống RS-485 song công, xe buýt về cơ bản hoạt động giống như một nhóm bên.

Thiết bị chính sẽ thực hiện các chức năng sau theo thứ tự trong mỗi vòng giao tiếp.

  1. Gửi tín hiệu đồng bộ. Đây sẽ là một mẫu byte đã biết, theo sau là mã định danh và tổng kiểm tra. Mã định danh sẽ là một định danh duy nhất cho "vòng" giao tiếp này. Ngoài ra, chuỗi dữ liệu này sẽ bao gồm định danh của một thiết bị nô lệ được phép trong vòng này để gửi dữ liệu.

  2. Chờ đợi một thời gian ân sủng. Thời gian gia hạn này được sử dụng để cho phép bất kỳ thiết bị không xác định nào truyền đến chủ yêu cầu tham gia mạng.

  3. Nhận dữ liệu từ thiết bị nô lệ được chỉ định trong dữ liệu đồng bộ được gửi ở bước 1.

  4. Gửi lệnh điều khiển đến bất kỳ số lượng thiết bị nô lệ. Điều này bao gồm các lệnh GPIO và tham gia xác nhận mạng. Tất cả các lệnh điều khiển phải được thừa nhận sau đó bởi nô lệ trong quá trình truyền trở lại bản gốc.

Các thiết bị nô lệ sẽ ở một trong hai trạng thái

  1. Không được chấp nhận bởi chủ. Nó đồng bộ hóa trên tín hiệu đồng bộ và truyền trong thời gian ân hạn. Trong một tình huống lý tưởng, chủ sẽ truyền lại một xác nhận trong bước 4 của vòng giao tiếp tiếp theo. Nếu thiết bị không nhận được điều này, nó sẽ đợi một số vòng ngẫu nhiên trước khi thử lại. Điều này cho phép va chạm trong thời gian gia hạn do nhiều thiết bị cố gắng truyền tải để cuối cùng được giải quyết.

  2. Được chủ nhân thừa nhận. Thiết bị truyền dữ liệu cảm biến khi được chỉ báo bằng tín hiệu đồng bộ được gửi bởi chủ. Thiết bị cũng gửi lại xác nhận các lệnh điều khiển trong khoảng thời gian này. Nó bỏ qua các liên lạc đến và từ các nô lệ khác với chủ.

Ý tưởng đằng sau điều này là việc triển khai RS-485 trong bộ điều khiển Atmega sẽ chỉ là phần mềm. Thiết bị rõ ràng không thể truyền và nhận dữ liệu mọi lúc hoặc nó sẽ không hữu ích như một thiết bị cảm biến. Độ dài của một vòng trong thế giới thực cần đủ lớn để sai số trong các chip được tạo trong bộ tạo dao động là không đáng kể. Theo cách này, đồng bộ hóa dựa trên tín hiệu từ tổng thể có thể được giữ trong nhiều vòng mà không thực sự cần phải nhận hoặc truyền dữ liệu.

Trong giai đoạn tham gia, điều này cho phép đồng bộ hóa cho phép nô lệ xác định chính xác khoảng thời gian để truyền yêu cầu tham gia.

Khi nô lệ ở trên mạng, nó cho phép thiết bị biết khi nào cần nghe sự cho phép để truyền và nhận dữ liệu. Điều đó cũng có nghĩa là thiết bị có tùy chọn "bỏ qua" một vòng hoặc vòng liên lạc để thực hiện các phép đo cảm biến, ra lệnh GPIO hoặc bất cứ điều gì tôi cần. Lý thuyết là nếu thiết bị chỉ được phép gửi dữ liệu cảm biến thì nó sẽ không được yêu cầu cho phép lại ngay lập tức, và nó thực sự không có bất kỳ dữ liệu mới nào.

Vấn đề với điều này là do một nô lệ thực sự rơi ra khỏi lớp truyền thông trong ít nhất một vòng, tất cả các lệnh cho nô lệ phải được thừa nhận với một thông điệp gửi lại cho chủ. Điều này cho phép chủ chỉ đơn giản là truyền lại các lệnh cho đến khi được thừa nhận. Điều này cũng có nghĩa là các lệnh nên được mô tả về trạng thái, không phải thay đổi trạng thái. Có một cơ hội rất thực tế một nô lệ sẽ thực thi một lệnh nhiều lần. Tôi không biết chính xác các xác nhận sẽ hoạt động như thế nào, nhưng có lẽ nó sẽ chỉ là một tin nhắn bao gồm một số nhận dạng và tổng kiểm tra.

Bất cứ tổng kiểm tra nào tôi sử dụng trong hệ thống này đều phải rẻ để tính toán vì tôi sẽ thực hiện trên các chip chỉ có tốc độ xung nhịp 8 Mhz hoặc hơn và là máy tính 8 bit.

Hạn chế lớn nhất đối với hệ thống này mà tôi có thể thấy là nếu các nô lệ đều có sức mạnh đạp xe vì một lý do nào đó thì tất cả sẽ va chạm khi cố gắng tham gia mạng lưới trong thời gian ân hạn. Điều này có nghĩa là có thể mất một thời gian rất dài cho đến khi tất cả họ tham gia lại mạng.

Tôi có thiếu điều gì đáng kể với điều này không? Có bất kỳ quyết định lớn nào tôi cần phải thực hiện mà tôi đã hoàn toàn bỏ qua? Sự hiểu biết của tôi về RS-485 là dòng đảng lớn có chính xác không?


Điều đó có vẻ hết sức phức tạp. Làm thế nào để nô lệ biết định danh (địa chỉ) của họ?
kkrambo

1
Nô lệ @kkrambo ban đầu không có địa chỉ đầu tiên bật nguồn. Họ nhận được một từ chủ và sau đó viết địa chỉ và tổng kiểm tra vào một địa chỉ vào bên trong EEPROM. Ngoài ra, tôi có thể làm điều này trên bàn làm việc của mình nếu tôi cần một thiết bị cụ thể để có một số địa chỉ cụ thể.
Eric Urban

Gần đây tôi đã xây dựng một hệ thống theo dõi thời tiết với nhiều cảm biến tương tự được phân phối trong toàn bộ tài sản của tôi. Tôi đã chọn CANbus chứ không phải Modbus, vì các chip rất phong phú và rẻ tiền trên eBay và cho phép khoảng cách lớn (500m-1km) giữa các nút!
Tom O'Connor

Câu trả lời:


4

Hạn chế lớn nhất đối với hệ thống này mà tôi có thể thấy là nếu các nô lệ đều có sức mạnh đạp xe vì một lý do nào đó thì tất cả sẽ va chạm khi cố gắng tham gia mạng lưới trong thời gian ân hạn. Điều này có nghĩa là có thể mất một thời gian rất dài cho đến khi tất cả họ tham gia lại mạng.

Nếu bạn có số lượng địa chỉ tiềm năng hạn chế (giả sử là 256), chủ luôn có thể thăm dò địa chỉ nô lệ hiện chưa được kết nối để xem liệu địa chỉ đó có xuất hiện hay không. Vì vậy, nếu bạn có 20 kích hoạt nô lệ, thì chủ nhân sẽ bỏ phiếu cho một nô lệ thứ 23 mỗi "vòng" và tăng số lượng unconnected_slave_address cho "vòng" tiếp theo. Sẽ chỉ mất vài giây để thực hiện đủ số vòng để tìm một nô lệ mới và sau đó công việc đã hoàn thành.

Không cần phải có một thời gian ân hạn; chỉ cần thêm một khe nô lệ sẽ thực hiện thủ thuật và khi tìm thấy một nô lệ mới (hoặc nô lệ sai lầm), nó sẽ được liệt kê là "hoạt động".

Và vâng, RS485 là một lớp vật lý phù hợp cho việc này.

Kế hoạch của tôi là sử dụng chip Attiny84 để thực hiện điều này. Mỗi bảng sẽ được cho ăn với +15 VDC và +7 VDC. Tôi có thể điều chỉnh điều này với bộ điều chỉnh sê-ri 780x đến +5 VDC và +12 VDC để cấp nguồn cho chip và bất kỳ cảm biến hoặc rơle nào khác tôi muốn.

Tôi sẽ sử dụng các bộ điều chỉnh thả ra thấp và tôi sẽ cung cấp cho điện áp giảm thêm một chút khoảng trống - có thể sẽ có một cảm ứng volt từ hệ thống dây điện xoay chiều tại nhà của bạn và điều này có nghĩa là các bộ điều chỉnh cần thêm một chút không gian để điều chỉnh đúng.

Tôi cũng sẽ xem xét sử dụng mã hóa Manchester để bạn có thể vượt qua bộ lọc dữ liệu nhận được mà không sợ tham nhũng. Xu hướng 100 kohm sau tụ điện sẽ ổn cho dù bạn có bao nhiêu nô lệ, nghĩa là nó sẽ không phá hủy kết hợp trở kháng từ đầu đến cuối cáp. Tôi không biết tốc độ dữ liệu bạn dự định chạy ở mức nào nhưng hoạt động ở mức hoặc trên 9600 Baud có vẻ hợp lý để giúp bộ lọc thông cao chặn mọi chuyển động AC. Có tôi biết RS485 là một vòng lặp hiện tại nhưng nếu bạn có thể tăng cường bảo mật phần cứng hơn một chút ở giai đoạn thiết kế thì nó sẽ trả cổ tức.

Thiết kế cho mã hóa Manchester cũng cung cấp cho bạn cơ hội tốt hơn để triển khai các liên kết RF nếu cần trong tương lai.

Chỉ cần một vài suy nghĩ về việc này nếu viết giao thức của riêng bạn.


Cảm ơn bạn đã trả lời của bạn. Bạn có thể cung cấp một mạch ví dụ về lọc thông cao với dữ liệu tốc độ 9600 baud không?
Eric Urban

2
Vâng, bạn sử dụng các tụ điện để kết nối mỗi nô lệ với đường dây chung và bạn có các điện trở phân cực ở các đầu A và B của phía phụ giao diện 485 của các tụ đó. Nếu Manchester mã hóa ở tốc độ 9600 bps, tần số thấp nhất là 9,6 kHz, vì vậy nếu sử dụng kéo lên 100 k và kéo xuống trên mỗi dòng A và B, bạn cần chọn giá trị tụ tạo ra điểm 3 dB cao ở khoảng 1 kHz. Âm thanh như 3n3 phù hợp với khớp nối AC - nó tạo thành mức cắt RC 964 Hz và sẽ chặn 60 Hz khá tốt.
Andy aka

3

Trên cấp dây RS-485 là một "dòng bên". RS-485 dễ thực hiện khi có một chủ duy nhất. Nếu thiết bị của bạn không yêu cầu kết nối "P2P" (ví dụ: cảm biến hiện tại không quan tâm độ ẩm là gì) thì Modbus là một giải pháp đơn giản và đã được chứng minh. Đừng phát minh lại bánh xe.

Tôi đã sử dụng FreeMODBUS với nhiều AVR để thực hiện nô lệ (nó khá cồng kềnh, nhưng bộ nhớ thì rẻ). Bạn có thể mua bộ chuyển đổi USB <-> RS485 và chạy phần mềm như qModMaster để kiểm tra cảm biến của bạn hoặc sử dụng libmodbus để viết chương trình của riêng bạn.

Nếu bạn cần "đa chủ" thì RS-485 là một lựa chọn rất tồi và kiểm soát truy cập trung bình của bạn sẽ phức tạp (đã có, thực hiện điều đó). Trong trường hợp đó CAN sẽ là sự lựa chọn thông thường.

Khi kết nối nhiều thiết bị với một bus, đảm bảo không vượt quá tải đơn vị tối đa của các bộ thu phát của bạn.


Tôi sẽ chạy một chủ duy nhất. Tôi sẽ xem xét FreeMODBUS. Mối quan tâm của tôi với modbus là nó dường như được thiết kế để làm mọi thứ mặc dù trường hợp sử dụng của tôi bị hạn chế.
Eric Urban

1
Bạn không phải thực hiện mọi thứ. Về cơ bản bạn cần mã chức năng "đọc thanh ghi" và "ghi thanh ghi".
filo

2
Tôi đã sử dụng Modbus trên cả RS485 và Ethernet. Bản thân giao thức này được chuẩn hóa và hoạt động miễn là bạn đi thẳng dây (đối với RS485 - Ethernet thì không đau) và có một bản gốc duy nhất. Những gì các thanh ghi thực sự có nghĩa là thay đổi rất nhiều và không có tiêu chuẩn ở đó. Tôi đã tìm thấy mọi sự kết hợp có thể của hướng byte, định dạng dấu phẩy động, v.v. Một số triển khai "mở rộng" Modbus bằng cách sử dụng một giá trị trong một thanh ghi để thay đổi việc sử dụng một thanh ghi khác hoặc làm những việc kỳ quặc khác. Bạn có thể tạo "tiêu chuẩn" của riêng mình và nó sẽ chuẩn như Modbus của bất kỳ ai khác.
manassehkatz-Di chuyển 2 Codidact

1
  1. Tôi sẽ xem xét lại nền tảng phần cứng. Sử dụng một cái gì đó rẻ và hiện đại như chip stm32f0 hoặc F1. Bạn sẽ có tất cả phần cứng không cần thiết (bao gồm cả có thể)
  2. Đừng quá phức tạp các nhiệm vụ đơn giản. Ý tưởng của bạn là một ví dụ hoàn hảo về "làm thế nào không thực hiện giao tiếp".
  3. Sử dụng một cái gì đó hiện có và tiêu chuẩn như modbus. Bạn sẽ có thể kết nối các thiết bị khác là tốt.
  4. Hệ thống Multimaster quá phức tạp đối với hệ thống tự động hóa gia đình.
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.