Mục lục:

Arduino UNO Logic Sniffer: 8 bước (có hình ảnh)
Arduino UNO Logic Sniffer: 8 bước (có hình ảnh)

Video: Arduino UNO Logic Sniffer: 8 bước (có hình ảnh)

Video: Arduino UNO Logic Sniffer: 8 bước (có hình ảnh)
Video: LabVIEW Arduino| #8 Cài đặt các công cụ xử lý ảnh trong LabVIEW và kết nối Webcam - điện thoại 2024, Tháng bảy
Anonim
Arduino UNO Logic Sniffer
Arduino UNO Logic Sniffer

Dự án này bắt đầu như một thử nghiệm đơn giản. Trong quá trình nghiên cứu biểu dữ liệu của ATMEGA328P cho một dự án khác, tôi đã tìm thấy một điều khá thú vị. Bộ thu tín hiệu đầu vào Timer1. Nó cho phép bộ vi điều khiển Arduino UNO của chúng tôi phát hiện cạnh tín hiệu, lưu trữ dấu thời gian và kích hoạt ngắt, tất cả đều nằm trong phần cứng.

Sau đó, tôi tự hỏi nó có thể hữu ích trong ứng dụng nào và làm thế nào để kiểm tra nó. Vì tôi muốn có một bộ phân tích logic trong một thời gian, nên tôi đã quyết định thử triển khai một bộ phân tích logic trong bảng Arduino UNO của mình, chỉ để kiểm tra tính năng và xem liệu chúng tôi có thể nhận được kết quả tốt từ nó hay không.

Tôi không phải là người duy nhất có ý tưởng này, và bạn sẽ tìm thấy rất nhiều trong số đó bằng cách truy cập vào "Arduino Logic Analyzer". Khi bắt đầu dự án, vì nó chỉ mới bắt đầu như một thử nghiệm, tôi thậm chí còn không biết rằng mọi người đã làm được nó, và bị ấn tượng bởi kết quả tốt mà họ đạt được với phần cứng nhỏ này. Tuy nhiên, tôi không thể tìm thấy một dự án khác bằng cách sử dụng đơn vị chụp đầu vào, vì vậy nếu bạn đã thấy điều này, hãy cho tôi biết!

Tóm lại, trình phân tích logic của tôi sẽ:

  • Có một kênh,
  • Có giao diện đồ họa,
  • Giao tiếp với giao diện thông qua USB,
  • Chạy trên bảng Arduino UNO.

Cuối cùng nó sẽ có độ sâu bộ nhớ 800 mẫu và có thể ghi lại thành công thông báo UART 115200 bauds (tôi đã không thực sự thử nghiệm nó ở tốc độ cao hơn).

Hướng dẫn này chứa cả phần "cách hoạt động" và "cách sử dụng" của dự án này, vì vậy đối với những người không quan tâm đến phía kỹ thuật, bạn có thể trực tiếp chuyển sang bước 4.

Quân nhu

Tôi muốn giữ cho bộ phân tích càng đơn giản càng tốt, vì vậy yêu cầu rất ít phần cứng.

Bạn sẽ cần:

  • Bo mạch Arduino UNO (hoặc tương đương miễn là nó phụ thuộc vào MCU ATMEGA328P),
  • Một máy tính,
  • Một cái gì đó để gỡ lỗi (một bảng Arduino UNO khác hoạt động tốt để thực hiện một số thử nghiệm).

Bạn có thể tìm thấy mã cho cả Arduino UNO và giao diện web tại đây. Bạn cũng sẽ cần phần mềm p5.serialcontrol và PulseView.

Bước 1: Nguyên tắc làm việc

Nguyên tắc làm việc
Nguyên tắc làm việc

Ý tưởng là đơn giản. Bạn chọn cài đặt chụp và nhấp vào "mua". Giao diện web sẽ gửi chúng đến phần mềm p5.serialcontrol, phần mềm này cho phép chúng tôi sử dụng giao diện nối tiếp từ trình duyệt, vì nó không thể truy cập trực tiếp. Sau đó, phần mềm điều khiển p5.serialcontrol sẽ chuyển tiếp thông tin đến bảng Arduino UNO, bảng này sẽ thu thập dữ liệu và gửi chúng trở lại giao diện thông qua cùng một đường dẫn.

Dễ! Chà… Vì tôi không thực sự giỏi về lập trình giao diện Người / Máy hoặc công nghệ web, nên chắc chắn là tôi hơi xấu và có lỗi. Nhưng nó cho phép tôi bắt đầu chụp và lấy lại dữ liệu của mình, đó là những gì nó được thiết kế cho, vì vậy tôi nghĩ nó ổn. Đối với công việc phân tích nghiêm túc hơn, tôi nhập các bản ghi của mình vào PulseView, dễ sử dụng và cung cấp một bộ tính năng và bộ giải mã giao thức tốt, như chúng ta sẽ thấy ở phần sau.

Đơn vị bắt đầu vào của Arduino UNO có thể được cấu hình để sử dụng các phân chia xung nhịp khác nhau, do đó làm giảm độ phân giải, nhưng tăng độ trễ trước khi tràn. Nó cũng có thể kích hoạt tăng, giảm hoặc cả hai cạnh để bắt đầu chụp dữ liệu.

Bước 2: Phác thảo Arduino UNO

Phác thảo Arduino UNO
Phác thảo Arduino UNO

Tôi đã viết và biên dịch bản phác thảo bằng Arduino IDE. Đầu tiên tôi bắt đầu bằng cách thiết lập Timer1 ở chế độ hoạt động "Bình thường" bằng cách ghi vào thanh ghi TCCR1A và TCCR1B của nó trong thiết lập (). Sau đó, tôi đã thực hiện một số hàm để giảm bớt một chút việc sử dụng nó trong tương lai, chẳng hạn như hàm để đặt phân chia đồng hồ có tên "setTim1PSC ()". Tôi cũng đã viết các chức năng để kích hoạt và hủy kích hoạt đơn vị bắt đầu vào Timer1 và ngắt tràn.

Tôi đã thêm mảng "mẫu", mảng này sẽ chứa dữ liệu thu được. Đó là một mảng toàn cầu mà tôi đặt thành "dễ bay hơi" để ngăn trình biên dịch thực hiện tối ưu hóa và đưa nó vào flash, như cách nó đã làm trong lần biên dịch đầu tiên của tôi. Tôi đã định nghĩa nó là một mảng "uint16_t", vì Timer1 cũng là 16bit, với độ dài 810. Chúng tôi ngừng ghi lại ở 800 giá trị, nhưng khi kiểm tra được thực hiện bên ngoài các ngắt vì lý do tốc độ rõ ràng, tôi đã chọn giữ lại 10 nhiều giá trị hơn để ngăn chặn tràn. Với một vài biến bổ sung cho phần còn lại của mã, bản phác thảo đang sử dụng 1313 byte (88%) bộ nhớ, để lại cho chúng ta 235 byte RAM trống. Chúng tôi đã sử dụng bộ nhớ cao và tôi không muốn thêm nhiều dung lượng mẫu hơn, vì nó có thể gây ra các hành vi kỳ lạ do quá ít không gian bộ nhớ.

Trong nhiệm vụ của mình là luôn tăng tốc độ thực thi, tôi đã sử dụng con trỏ hàm thay vì các câu lệnh if bên trong các ngắt, để giảm thời gian thực thi của chúng xuống mức tối thiểu. Chân chụp sẽ luôn là số 8 của Arduino UNO, vì nó là chân duy nhất được kết nối với đơn vị thu đầu vào của Timer1.

Quá trình chụp được hiển thị trên hình trên. Nó bắt đầu khi Arduino UNO nhận được khung dữ liệu UART hợp lệ, chứa các cài đặt chụp mong muốn. Sau đó, chúng tôi xử lý các cài đặt đó bằng cách định cấu hình các thanh ghi phù hợp để nắm bắt trên cạnh đã chọn và sử dụng phân chia đồng hồ phù hợp. Sau đó, chúng tôi kích hoạt ngắt PCINT0 (thay đổi chân) để phát hiện cạnh tín hiệu đầu tiên. Khi chúng tôi nhận được nó, chúng tôi đặt lại giá trị Timer1, vô hiệu hóa ngắt PCINT0 và bật ngắt ICU (Đầu vào Capture Unit). Từ thời điểm đó, bất kỳ cạnh giảm / tăng nào trên tín hiệu (tùy thuộc vào cấu hình được chọn), sẽ kích hoạt bộ thu tín hiệu đầu vào, do đó lưu dấu thời gian của sự kiện này vào thanh ghi ICR1 và thực hiện ngắt. Trong lần ngắt này, chúng tôi đặt giá trị thanh ghi ICR1 vào mảng "mẫu" của chúng tôi và tăng chỉ số cho lần chụp tiếp theo. Khi Timer1 hoặc mảng bị tràn, chúng tôi vô hiệu hóa ngắt chụp và gửi dữ liệu trở lại giao diện web thông qua UART.

Tôi quyết định sử dụng ngắt thay đổi chân để kích hoạt chụp, vì thiết bị chụp đầu vào chỉ cho phép chụp ở cạnh này hoặc cạnh kia, không phải cả hai. Nó cũng gây ra vấn đề khi bạn muốn chụp cả hai cạnh. Giải pháp của tôi sau đó là đảo ngược bit điều khiển lựa chọn cạnh trong thanh ghi điều khiển chụp đầu vào tại mỗi mẫu được truy xuất. Bằng cách đó, chúng tôi giảm tốc độ thực thi, nhưng chúng tôi vẫn có thể sử dụng các chức năng của đơn vị thu thập đầu vào.

Vì vậy, như bạn có thể nhận thấy, chúng tôi không thực sự chụp từng mẫu vào những khoảng thời gian cố định, nhưng chúng tôi ghi lại khoảnh khắc xảy ra quá trình chuyển đổi tín hiệu. Nếu chúng tôi đã chụp một mẫu ở mỗi chu kỳ đồng hồ, ngay cả với mức phân chia xung nhịp cao nhất, chúng tôi sẽ lấp đầy bộ đệm trong khoảng 0,1 giây, giả sử rằng chúng tôi đang sử dụng loại uint8_t, loại nhỏ nhất trong bộ nhớ mà không sử dụng cấu trúc.

Bước 3: Giao diện web và P5.js

Giao diện Web và P5.js
Giao diện Web và P5.js

Như tiêu đề của nó, giao diện web được tạo với sự trợ giúp của p5.js. Đối với những người chưa biết về nó, tôi khuyên bạn nên truy cập và kiểm tra trang web, vì nó là một thư viện thực sự tốt. Nó dựa trên quá trình Xử lý, dễ sử dụng, cho phép bạn đạt được kết quả tốt rất nhanh và được ghi chép đầy đủ. Đó là vì tất cả những lý do mà tôi đã chọn thư viện này. Tôi cũng đã sử dụng thư viện quicksettings.js cho các menu, một grafica.js để vẽ dữ liệu của tôi và thư viện p5.serialport để giao tiếp với Arduino UNO.

Tôi sẽ không dành quá nhiều thời gian cho giao diện, vì tôi chỉ thiết kế nó để xem trước dữ liệu và kiểm soát cài đặt, và cũng vì nó không phải là chủ đề của thử nghiệm của tôi. Tuy nhiên, tôi sẽ giải thích trong các phần sau các bước khác nhau để sử dụng toàn bộ hệ thống, do đó giải thích các điều khiển khác nhau có sẵn.

Bước 4: Thiết lập hệ thống

Điều đầu tiên là tải xuống Arduino UNO và mã giao diện tại đây nếu chưa thực hiện. Sau đó, bạn có thể lập trình lại bảng Arduino UNO của mình bằng bản phác thảo "UNO_LS.ino" thông qua Arduino IDE.

Bạn nên tải xuống phần mềm p5.serialcontrol từ kho lưu trữ github của nó. Bạn phải lấy tệp zip phù hợp với hệ điều hành của mình (tôi chỉ thử nghiệm nó trên Windows). Giải nén tệp nén trong một thư mục, khởi động tệp thực thi được tìm thấy trong đó và để nguyên như vậy. Đừng cố kết nối với bất kỳ cổng nối tiếp nào, chỉ cần để nó chạy ở chế độ nền, nó sẽ được sử dụng như một rơ le.

Mở thư mục "Giao diện". Bạn sẽ tìm thấy một tệp có tên "index.html". Mở nó trong trình duyệt của bạn, nó là giao diện web.

Và đó là nó! Bạn không cần tải thêm thư viện, mọi thứ nên được bao gồm trong gói mà tôi đã cung cấp.

Bước 5: Kết nối, cấu hình và mua lại

Kết nối, cấu hình và chuyển đổi
Kết nối, cấu hình và chuyển đổi

Để kết nối giao diện với bảng Arduino UNO, chỉ cần chọn cổng tương ứng trong danh sách và nhấn nút "Mở". Nếu hoạt động thành công, thông báo "trạng thái" sẽ hiển thị một cái gì đó như "COMX đã mở".

Bây giờ bạn có thể chọn các tùy chọn chụp của mình. Đầu tiên là lựa chọn cạnh. Tôi khuyên bạn nên luôn sử dụng "Cả hai", vì nó sẽ cung cấp cho bạn sự thể hiện tốt nhất của tín hiệu thực. Nếu cài đặt "Cả hai" không thu được tín hiệu (ví dụ: nếu tần số tín hiệu quá cao), bạn có thể thử với cài đặt cạnh "Tăng" hoặc "Giảm", tùy thuộc vào tín hiệu mà bạn cố gắng xem.

Thiết lập thứ hai là phân chia đồng hồ. Nó sẽ cung cấp cho bạn độ phân giải mà bạn sẽ có thể bắt được tín hiệu. Bạn có thể chọn đặt hệ số chia cho "8", "64", "256" và "1024". Bo mạch Arduino UNO sử dụng thạch anh 16MHz để tạo xung nhịp cho vi điều khiển, do đó tần số lấy mẫu sẽ là "16MHz / hệ số chia". Hãy cẩn thận với cài đặt này, vì nó cũng sẽ xác định bạn có thể bắt được tín hiệu trong bao lâu. Vì Timer1 là bộ định thời 16 bit, thời gian chụp được phép trước khi tràn sẽ là "(2 ^ 16) * (hệ số chia) / 16MHz". Tùy thuộc vào cài đặt bạn đã chọn, nó sẽ nằm trong khoảng từ ~ 33ms đến 4.2 giây. Giữ sự lựa chọn của bạn trong tâm trí của bạn, bạn sẽ cần nó sau này.

Cài đặt cuối cùng là bộ khử tiếng ồn. Tôi đã không tiến hành nhiều thử nghiệm về nó và bạn sẽ không cần nó trong 99% trường hợp, vì vậy chỉ cần bỏ chọn nó. Đối với những ai vẫn còn tò mò về nó, bạn có thể tìm kiếm bộ khử tiếng ồn trong phần Timer / Counter1 của biểu dữ liệu của ATMEGA328P.

Đừng quên kết nối chân 8 của bảng Arduino UNO với tín hiệu của bạn và đấu dây các mặt đất với nhau để có cùng một tham chiếu điện áp cho cả mạch thử nghiệm và bộ phân tích logic. Nếu bạn cần cách ly nối đất hoặc cần đo tín hiệu với các mức khác nhau từ 5V, bạn có thể sẽ cần thêm một bộ cách ly quang vào mạch của mình.

Khi mọi thứ đã được định cấu hình chính xác, bạn có thể nhấn nút "Mua".

Bước 6: Thu thập kết quả và xuất dữ liệu CSV

Thu thập kết quả và xuất dữ liệu CSV
Thu thập kết quả và xuất dữ liệu CSV

Sau khi Arduino UNO của bạn hoàn thành quá trình chụp, nó sẽ tự động gửi dữ liệu trở lại giao diện web, giao diện này sẽ vẽ biểu đồ của chúng. Bạn có thể phóng to hoặc thu nhỏ bằng thanh trượt bên phải và di chuyển qua các mẫu bằng thanh trượt dưới cùng.

Cốt truyện chỉ cung cấp cho bạn bản xem trước và không có bất kỳ công cụ phân tích dữ liệu nào. Do đó, để tiến hành phân tích sâu hơn về dữ liệu của mình, bạn sẽ phải nhập dữ liệu đó vào PulseView.

Bước đầu tiên là xuất tệp csv chứa tất cả dữ liệu của bạn. Để thực hiện, bạn chỉ cần nhấp vào nút "Xuất" từ giao diện web. Lưu tệp của bạn ở một vị trí đã biết khi được nhắc.

Bây giờ hãy mở PulseView. Trên thanh menu trên cùng, nhấp vào "Mở" (biểu tượng thư mục) và chọn "Nhập giá trị được phân tách bằng dấu phẩy…". Chọn tệp csv đã tạo trước đó chứa dữ liệu của bạn.

Một cửa sổ nhỏ sẽ xuất hiện. Để nguyên mọi thứ, bạn chỉ cần sửa đổi cài đặt "Tốc độ lấy mẫu" theo hệ số phân chia đồng hồ đã chọn để chụp. Tần số tốc độ lấy mẫu của bạn sẽ là "16MHz / (hệ số phân chia)". Sau đó nhấp vào "Ok", tín hiệu của bạn sẽ xuất hiện trên màn hình.

Bước 7: Phân tích tín hiệu PulseView

Phân tích tín hiệu PulseView
Phân tích tín hiệu PulseView

PulseView có rất nhiều bộ giải mã giao thức. Để truy cập chúng, hãy nhấp vào "Thêm bộ giải mã giao thức" ở thanh menu trên cùng (công cụ bên phải nhất). Đối với thử nghiệm của mình, tôi chỉ gửi một tin nhắn UART đơn giản với tốc độ 9600 bauds, vì vậy tôi đã tìm kiếm "UART".

Nó sẽ thêm một kênh có thẻ ở bên trái (giống như thẻ cho dữ liệu của bạn). Bằng cách nhấp vào thẻ, bạn có thể thay đổi cài đặt của trình giải mã. Sau khi chọn những tin nhắn phù hợp, tôi có thể lấy lại tin nhắn giống như tin nhắn được gửi bởi thiết bị thử nghiệm của tôi. Điều này cho thấy toàn bộ hệ thống hoạt động như mong đợi.

Bước 8: Kết luận

Phần kết luận
Phần kết luận

Ngay cả khi dự án ban đầu là một thử nghiệm, tôi vẫn hài lòng với kết quả mà tôi nhận được. Tôi đã có thể lấy mẫu tín hiệu UART ở mức lên đến 115200 baud ở chế độ cạnh "Cả hai" mà không gặp bất kỳ vấn đề gì và thậm chí tôi đã quản lý để tăng lên đến 230400 baud ở chế độ cạnh "Rơi". Bạn có thể xem thiết lập thử nghiệm của tôi trên hình trên.

Việc triển khai của tôi có một số hạn chế, bắt đầu bởi thực tế là nó chỉ có thể bắt một tín hiệu tại một thời điểm, vì chỉ có chân 8 của Arduino UNO là "có khả năng bắt đầu vào". Nếu bạn đang tìm kiếm một bộ phân tích logic Arduino với nhiều kênh hơn, hãy xem Catoblepas 'một.

Bạn không thể mong đợi Arduino UNO có thể bắt tín hiệu với tần số cao (một số MHz), vì nó chỉ có tốc độ 16MHz (nếu ai đã làm điều đó, tôi sẽ muốn xem phương pháp của nó). Tuy nhiên, tôi vẫn bị ấn tượng bởi kết quả mà chúng tôi có thể nhận được từ vi điều khiển ATMEGA328P này.

Tôi không nghĩ rằng tôi sẽ làm nhiều việc trên mã. Tôi đã tiến hành các thí nghiệm của mình và nhận được kết quả mà tôi đang tìm kiếm. Nhưng nếu ai đó muốn đóng góp, vui lòng sửa đổi và phân phối lại tất cả hoặc một phần mã của tôi.

Đó là cuốn sách có thể hướng dẫn đầu tiên của tôi và tôi nghĩ là một cuốn sách dài. Tôi hy vọng rằng nó đã được một bài đọc thú vị cho bạn.

Hãy cho tôi biết nếu bạn tìm thấy lỗi hoặc nếu bạn có bất kỳ câu hỏi nào!

Đề xuất: