Inhaltsverzeichnis:

Arduino UNO Logic Sniffer - Gunook
Arduino UNO Logic Sniffer - Gunook

Video: Arduino UNO Logic Sniffer - Gunook

Video: Arduino UNO Logic Sniffer - Gunook
Video: Windows Logic Sniffer 2024, Juli
Anonim
Arduino UNO Logic Sniffer
Arduino UNO Logic Sniffer

Dieses Projekt begann als einfaches Experiment. Bei meiner Recherche über das Datenblatt des ATMEGA328P für ein anderes Projekt bin ich auf etwas ziemlich Interessantes gestoßen. Die Timer1-Eingangserfassungseinheit. Es ermöglicht dem Mikrocontroller unseres Arduino UNO, eine Signalflanke zu erkennen, einen Zeitstempel zu speichern und einen Interrupt auszulösen, alles in Hardware.

Ich habe mich dann gefragt, in welcher Anwendung es nützlich sein könnte und wie man es testet. Da ich schon seit einiger Zeit einen Logikanalysator haben möchte, habe ich beschlossen, einen in meinem Arduino UNO-Board zu implementieren, nur um die Funktion zu testen und zu sehen, ob wir damit gute Ergebnisse erzielen können.

Ich bin nicht der einzige, der diese Idee hatte, und Sie werden viele davon finden, indem Sie einfach "Arduino Logic Analyzer" googeln. Zu Beginn des Projekts, da es nur als Experiment begann, war mir nicht einmal bewusst, dass die Leute es schon geschafft haben, und war beeindruckt von den guten Ergebnissen, die sie mit dieser kleinen Hardware erzielt haben. Ich konnte jedoch kein anderes Projekt mit der Input Capture Unit finden. Wenn Sie dies bereits gesehen haben, lassen Sie es mich wissen!

Zusammenfassend wird mein Logikanalysator:

  • Habe einen Kanal,
  • eine grafische Oberfläche haben,
  • Kommunikation mit der Schnittstelle über USB,
  • Auf einem Arduino UNO-Board ausführen.

Es wird endlich eine Speichertiefe von 800 Samples haben und war in der Lage, eine UART-Nachricht mit 115200 Baud erfolgreich zu erfassen (ich habe es nicht wirklich bei höheren Geschwindigkeiten getestet).

Dieses anweisbare enthält sowohl die Teile "wie es funktioniert" als auch "wie man es benutzt". Für diejenigen, die nicht an der technischen Seite interessiert sind, können Sie direkt zu Schritt 4 springen.

Lieferungen

Ich wollte den Analysator so einfach wie möglich halten, sodass er nur sehr wenig Hardware benötigt.

Du wirst brauchen:

  • Ein Arduino UNO-Board (oder gleichwertig, solange es auf der ATMEGA328P-MCU basiert),
  • Ein Computer,
  • Etwas zum Debuggen (ein anderes Arduino UNO-Board funktioniert gut, um einige Tests durchzuführen).

Den Code für Arduino UNO und Webinterface finden Sie hier. Sie benötigen außerdem die Software p5.serialcontrol und PulseView.

Schritt 1: Funktionsprinzip

Arbeitsprinzip
Arbeitsprinzip

Die Idee ist einfach. Sie wählen die Aufnahmeeinstellungen und klicken auf "Erfassen". Das Webinterface sendet sie an die Software p5.serialcontrol, die es uns ermöglicht, die serielle Schnittstelle von einem Browser aus zu verwenden, da dieser nicht direkt darauf zugreifen kann. Die p5.serialcontrol-Software leitet die Informationen dann an das Arduino UNO-Board weiter, das die Daten erfasst und über denselben Weg zurück an die Schnittstelle sendet.

Einfach! Nun… Da ich nicht wirklich gut in der Programmierung von Mensch/Maschine-Schnittstellen oder Webtechnologien bin, ist meine sicherlich ein bisschen hässlich und fehlerhaft. Aber es erlaubt mir, eine Aufnahme zu starten und meine Daten zurückzurufen, wofür es entwickelt wurde, also denke ich, dass es in Ordnung ist. Für ernsthaftere Analysearbeiten importiere ich meine Aufzeichnungen in PulseView, das einfach zu bedienen ist und eine gute Reihe von Funktionen und Protokolldecodern bietet, wie wir später sehen werden.

Die Input Capture Unit des Arduino UNO kann so konfiguriert werden, dass sie verschiedene Taktteilungen verwendet, wodurch die Auflösung reduziert, aber die Verzögerung vor dem Überlauf erhöht wird. Es kann auch bei steigenden, fallenden oder beiden Flanken triggern, um mit der Erfassung der Daten zu beginnen.

Schritt 2: Arduino UNO-Skizze

Arduino UNO-Skizze
Arduino UNO-Skizze

Ich habe die Skizze mit der Arduino IDE geschrieben und kompiliert. Ich habe zuerst damit begonnen, den Timer1 im "Normal"-Betriebsmodus einzurichten, indem ich in die Register TCCR1A und TCCR1B in setup() geschrieben habe. Ich habe dann einige Funktionen erstellt, um die Verwendung in Zukunft ein wenig zu erleichtern, wie die zum Einstellen der Taktteilung namens "setTim1PSC()". Ich habe auch Funktionen geschrieben, um die Timer1-Eingabeerfassungseinheit und Überlauf-Interrupts zu aktivieren und zu deaktivieren.

Ich habe das Array "Samples" hinzugefügt, das die erfassten Daten enthält. Es ist ein globales Array, das ich auf "volatile" gesetzt habe, um zu verhindern, dass der Compiler Optimierungen vornimmt und es in Flash legt, wie es bei meinen ersten Kompilierungen der Fall war. Ich habe es als "uint16_t"-Array definiert, da der Timer1 ebenfalls 16 Bit hat, mit einer Länge von 810. Wir hören auf, bei 800 Werten zu erfassen, aber da der Test aus offensichtlichen Geschwindigkeitsgründen außerhalb der Interrupts durchgeführt wird, habe ich mich dafür entschieden, 10. beizubehalten mehr Werte, um einen Überlauf zu verhindern. Mit ein paar zusätzlichen Variablen für den Rest des Codes verwendet der Sketch 1313 Byte (88%) des Speichers, was uns 235 Byte freien RAM lässt. Wir haben bereits eine hohe Speicherauslastung, und ich wollte nicht mehr Sample-Kapazität hinzufügen, da dies aufgrund zu wenig Speicherplatz zu seltsamen Verhaltensweisen führen könnte.

In meinem Bestreben, die Ausführungsgeschwindigkeit immer zu erhöhen, habe ich Funktionszeiger anstelle von if-Anweisungen innerhalb der Interrupts verwendet, um deren Ausführungszeit auf ein Minimum zu reduzieren. Der Capture-Pin ist immer die Arduino UNO-Nummer 8, da er der einzige ist, der mit der Eingangserfassungseinheit des Timer1 verbunden ist.

Der Aufnahmevorgang ist auf dem Bild oben dargestellt. Es beginnt, wenn das Arduino UNO einen gültigen UART-Datenrahmen empfängt, der die gewünschten Aufnahmeeinstellungen enthält. Wir verarbeiten diese Einstellungen dann, indem wir die richtigen Register konfigurieren, um die ausgewählte Flanke zu erfassen, und die richtige Taktteilung verwenden. Anschließend aktivieren wir den Interrupt PCINT0 (Pinwechsel), um die erste Signalflanke zu erkennen. Wenn wir es erhalten, setzen wir den Timer1-Wert zurück, deaktivieren den PCINT0-Interrupt und aktivieren den ICU-Interrupt (Input Capture Unit). Von diesem Moment an löst jede fallende/ansteigende Flanke des Signals (je nach gewählter Konfiguration) die Eingangserfassungseinheit aus, wodurch ein Zeitstempel dieses Ereignisses im ICR1-Register gespeichert und ein Interrupt ausgeführt wird. In diesem Interrupt setzen wir den ICR1-Registerwert in unser "Samples"-Array und inkrementieren den Index für die nächste Erfassung. Wenn der Timer1 oder das Array überläuft, deaktivieren wir den Capture-Interrupt und senden die Daten über UART an die Webschnittstelle zurück.

Ich habe mich entschieden, einen Pin-Change-Interrupt zu verwenden, um die Erfassung auszulösen, da die Eingangserfassungseinheit nur die Erfassung an der einen oder anderen Kante zulässt, nicht an beiden. Es verursacht auch ein Problem, wenn Sie beide Kanten erfassen möchten. Meine Lösung besteht dann darin, das Bit zu invertieren, das die Flankenauswahl im Eingangserfassungssteuerregister bei jedem abgerufenen Abtastwert steuert. Auf diese Weise verlieren wir an Ausführungsgeschwindigkeit, können aber weiterhin die Funktionen der Input Capture Unit nutzen.

Wie Sie vielleicht bemerkt haben, erfassen wir nicht wirklich jedes Sample in festen Zeitintervallen, sondern den Moment, in dem ein Signalübergang stattfindet. Hätten wir bei jedem Taktzyklus einen Abtastwert erfasst, selbst bei der höchsten Taktteilung, hätten wir den Puffer in ungefähr 0,1 s gefüllt, vorausgesetzt, wir verwenden den Typ uint8_t, den kleinsten im Speicher ohne die Verwendung von Structs.

Schritt 3: Webinterface und P5.js

Webinterface und P5.js
Webinterface und P5.js

Wie der Titel schon sagt, wurde das Webinterface mit Hilfe von p5.js erstellt. Für diejenigen, die es noch nicht kennen, empfehle ich Ihnen dringend, die Website zu besuchen, da es sich um eine wirklich gute Bibliothek handelt. Es basiert auf Processing, ist einfach zu bedienen, ermöglicht es Ihnen, sehr schnell gute Ergebnisse zu erzielen, und ist gut dokumentiert. Aus all diesen Gründen habe ich mich für diese Bibliothek entschieden. Ich habe auch die quicksettings.js-Bibliothek für die Menüs verwendet, die grafica.js-Bibliothek zum Plotten meiner Daten und die p5.serialport-Bibliothek, um mit dem Arduino UNO zu kommunizieren.

Ich werde nicht zu viel Zeit mit der Benutzeroberfläche verbringen, da ich sie nur für die Datenvorschau und die Kontrolle der Einstellungen entworfen habe und auch, weil sie überhaupt nicht Gegenstand meines Experiments war. Ich werde jedoch in den folgenden Teilen die verschiedenen Schritte zur Verwendung des gesamten Systems erklären und somit die verschiedenen verfügbaren Bedienelemente erklären.

Schritt 4: Systemeinrichtung

Als erstes müssen Sie den Arduino UNO und den Schnittstellencode hier herunterladen, falls noch nicht geschehen. Anschließend können Sie Ihr Arduino UNO-Board mit der Skizze "UNO_LS.ino" über die Arduino IDE neu programmieren.

Sie sollten die p5.serialcontrol-Software aus ihrem Github-Repository heruntergeladen haben. Sie müssen die zu Ihrem Betriebssystem passende Zip-Datei besorgen (ich habe sie nur unter Windows getestet). Entpacken Sie die ZIP-Datei in einen Ordner, starten Sie die darin gefundene ausführbare Datei und lassen Sie sie so. Versuchen Sie nicht, eine Verbindung zu einem seriellen Port herzustellen, lassen Sie ihn einfach im Hintergrund laufen, er wird als Relais verwendet.

Öffnen Sie den Ordner "Schnittstelle". Sie sollten eine Datei namens "index.html" finden. Öffnen Sie es in Ihrem Browser, es ist das Webinterface.

Und das ist es! Sie müssen keine zusätzlichen Bibliotheken herunterladen, alles sollte in dem von mir bereitgestellten Paket enthalten sein.

Schritt 5: Verbindung, Konfiguration und Erfassung

Anschluss, Konfiguration und Erfassung
Anschluss, Konfiguration und Erfassung

Um die Schnittstelle mit dem Arduino UNO Board zu verbinden, wählen Sie einfach den entsprechenden Port in der Liste aus und klicken Sie auf die Schaltfläche "Öffnen". Wenn der Vorgang erfolgreich war, sollte die "State"-Meldung etwa "COMX geöffnet" anzeigen.

Sie können nun Ihre Aufnahmeoptionen auswählen. Zuerst ist die Kantenauswahl. Ich empfehle Ihnen, immer "Beide" zu verwenden, da Sie damit die beste Darstellung des echten Signals erhalten. Wenn die Einstellung "Beide" das Signal nicht erfasst (z. B. wenn die Signalfrequenz zu hoch ist), können Sie je nach Signal, das Sie sehen möchten, entweder die Einstellung "Ansteigende" oder "Fallende" Flanke versuchen.

Die zweite Einstellung ist die Taktteilung. Es gibt Ihnen die Auflösung, mit der Sie das Signal erfassen können. Sie können den Teilungsfaktor entweder auf "8", "64", "256" und "1024" einstellen. Das Arduino UNO-Board verwendet einen 16-MHz-Quarz, um den Mikrocontroller zu takten, sodass die Abtastfrequenz "16 MHz / Teilungsfaktor" beträgt. Seien Sie vorsichtig mit dieser Einstellung, da sie auch bestimmt, wie lange Sie ein Signal erfassen können. Da der Timer1 ein 16-Bit-Timer ist, beträgt die zulässige Aufnahmezeit vor dem Überlauf "(2^16)*(Teilungsfaktor)/16MHz". Je nach gewählter Einstellung liegt sie zwischen ~33ms und 4,2s. Behalten Sie Ihre Wahl im Hinterkopf, Sie werden sie später brauchen.

Die letzte Einstellung ist der Noise Canceller. Ich habe nicht viele Tests damit durchgeführt und Sie werden es in 99% der Fälle nicht benötigen, also lassen Sie es einfach unmarkiert. Für diejenigen, die noch neugierig sind, können Sie im Abschnitt Timer/Counter1 des Datenblatts des ATMEGA328P nach dem Noise Canceller suchen.

Vergessen Sie nicht, den Pin 8 der Arduino UNO-Platine mit Ihrem Signal zu verbinden und die Masse zusammenzuschließen, um die gleiche Spannungsreferenz für die Testschaltung und den Logikanalysator zu haben. Wenn Sie eine Erdungsisolierung benötigen oder Signale mit anderen Pegeln als 5 V messen müssen, müssen Sie Ihrer Schaltung wahrscheinlich einen Opto-Isolator hinzufügen.

Wenn alles richtig konfiguriert ist, können Sie auf die Schaltfläche "Erfassen" klicken.

Schritt 6: Ergebnisse erfassen und CSV-Datenexport

Ergebnisse erfassen und CSV-Datenexport
Ergebnisse erfassen und CSV-Datenexport

Sobald Ihr Arduino UNO eine Aufnahme abgeschlossen hat, sendet es die Daten automatisch an die Weboberfläche zurück, die sie grafisch darstellt. Sie können mit dem rechten Schieberegler hinein- oder herauszoomen und mit dem unteren durch die Samples navigieren.

Das Diagramm bietet Ihnen nur eine Vorschau und enthält keine Datenanalysetools. Um eine weitere Analyse Ihrer Daten durchzuführen, müssen Sie diese daher in PulseView importieren.

Der erste Schritt besteht darin, eine CSV-Datei zu exportieren, die alle Ihre Daten enthält. Dazu müssen Sie nur auf die Schaltfläche "Exportieren" im Webinterface klicken. Speichern Sie Ihre Datei an einem bekannten Speicherort, wenn Sie dazu aufgefordert werden.

Öffnen Sie nun PulseView. Klicken Sie in der oberen Menüleiste auf „Öffnen“(Ordnersymbol) und wählen Sie „Kommagetrennte Werte importieren…“. Wählen Sie die zuvor generierte CSV-Datei mit Ihren Daten aus.

Es erscheint ein kleines Fenster. Lassen Sie alles so, wie es ist, Sie müssen nur die Einstellung "Samplerate" entsprechend dem für die Aufnahme ausgewählten Taktteilungsfaktor ändern. Ihre Abtastfrequenz ist "16MHz/(Teilungsfaktor)". Klicken Sie dann auf "Ok", Ihr Signal sollte auf dem Bildschirm erscheinen.

Schritt 7: PulseView-Signalanalyse

PulseView-Signalanalyse
PulseView-Signalanalyse

PulseView verfügt über viele Protokolldecoder. Um darauf zuzugreifen, klicken Sie in der oberen Menüleiste (ganz rechts) auf "Protokolldecoder hinzufügen". Für mein Experiment habe ich gerade eine einfache UART-Nachricht mit 9600 Baud gesendet, also habe ich nach "UART" gesucht.

Es wird einen Kanal mit einem Tag auf der linken Seite hinzufügen (genau wie das für Ihre Daten). Durch Klicken auf das Tag können Sie die Einstellungen des Decoders ändern. Nachdem ich die richtigen ausgewählt hatte, konnte ich dieselbe Nachricht abrufen, die von meinem Testgerät gesendet wurde. Dies zeigt, dass das gesamte System wie erwartet funktioniert.

Schritt 8: Fazit

Abschluss
Abschluss

Auch wenn das Projekt am Anfang ein Experiment war, bin ich mit den Ergebnissen zufrieden. Ich konnte UART-Signale problemlos mit bis zu 115200 Baud im Edge-Modus "Both" abtasten, und ich schaffte es sogar, im Edge-Modus "Falling" bis zu 230400 Baud zu erreichen. Auf dem Bild oben seht ihr meinen Testaufbau.

Meine Implementierung hat mehrere Nachteile, angefangen bei der Tatsache, dass sie nur ein Signal gleichzeitig erfassen kann, da nur der Pin 8 des Arduino UNO "input capturefähig" ist. Wenn Sie nach einem Arduino-Logikanalysator mit mehr Kanälen suchen, schauen Sie sich den von Catoblepas an.

Sie können nicht erwarten, dass ein Arduino UNO Signale mit hohen Frequenzen (einige MHz) erfassen kann, da er nur mit 16 MHz getaktet wird (wenn es jemand getan hat, wäre ich daran interessiert, seine Methode zu sehen). Ich bin jedoch immer noch beeindruckt von den Ergebnissen, die wir mit diesem ATMEGA328P-Mikrocontroller erzielen können.

Ich glaube nicht, dass ich viel am Code arbeiten werde. Ich führte meine Experimente durch und erhielt die Ergebnisse, nach denen ich suchte. Aber wenn jemand dazu beitragen möchte, kann er gerne den gesamten oder einen Teil meines Codes ändern und weiterverteilen.

Das war mein erstes Instructable, und ein langes, denke ich. Ich hoffe, es war eine interessante Lektüre für Sie.

Lassen Sie es mich wissen, wenn Sie Fehler finden oder Fragen haben!

Empfohlen: