OK, ich bin ein Stück weiter.
Mit dem Logik-Analysator zeigt sich, dass pyvisa das *IDN? Kommando absendet.
Nutzt man das Terminal-Programm in der Arduino-IDE, ist das Terminierungszeichen "0x0A" und der Arduino antwortet mit dem korrekten Identifikaitonstring.
Nimmt man hingegen das pyvisa script unten, sind die Terminierungszeichen "0x0d, 0x0a" was den Arduino zu verwirren scheint. Wie kann man die Terminierung in pyvisa umstellen?
1
#!/usr/bin/env python3
2
3
importpyvisa
4
5
# Define the serial resource address (update this with your actual device port)
6
instrument_address='ASRL/dev/ttyUSB0::INSTR'
7
8
# Create a PyVISA resource manager
9
rm=pyvisa.ResourceManager()
10
11
# Open the serial instrument with correct parameters
12
instrument=rm.open_resource(
13
instrument_address,
14
baud_rate=115200,# Match your instrument's baud rate
Danke. Mittlerweile läuft es. Allerdings war es ein Doppelfehler, die bekanntlich besonders schwer zu finden sind: Einerseits das Problem mit den Endzeichen und zweitens braucht der Arduino-Nano etwas Zeit um zu starten, wenn man die serielle Schnittstelle neu öffnet. Deshalb muss unbedingt eine Wartezeit vor der Anfrage "*IDN?" eingebaut werden.
Here you go:
1
#!/usr/bin/env python3
2
3
# test USB SCPI Commands with an Arduino as Instrument
Im Prinzip geht das durchaus. Ich bastele gerade an einem solchen Projekt und habe hier ein paar Wavgat UNO (Arduino Klone) rumliegen, die einen LGT8F328P haben - der kommt sogar mit einem DAC. Im Moment benutze ich den Vrekrer SCPI Parser, will das aber noch umstellen und dann weitere Befehle ergänzen.
Wavgat UNO (Arduino Klone) rumliegen, die einen LGT8F328P haben
Dein Code ist gut lesbar geschrieben. Gefällt mir gut.
Ich wusste gar nicht, dass es Arduino328-artige mit DAC gibt. Vermutlich ein chinesischer Clone. Den Hersteller konnte ich nicht finden.
Im Moment benutze ich den Vrekrer SCPI Parser, will das aber noch umstellen und dann weitere Befehle ergänzen.
Wie möchtest du umstellen? Vielleicht lässt sich das Projekt so machen, dass man die Codebasis teilen kann.
Bezüglich der Peripherie sind auch die STM32L432KC nicht schlecht. Die haben 2x12 Bit DAC und sind vermutlich analog-technisch besser.
Beim großen China-Markt gibt es die Boards schon um die 2,50€.
Wie möchtest du umstellen? Vielleicht lässt sich das Projekt so machen,
dass man die Codebasis teilen kann.
Ja, wäre eine Idee, ich will das Projekt bei Gelegenheit auf Github laden. Ich würde gerne eine eigene möglichst kompakte (wenig Flash, wenig RAM) C++ SCPI-Bibliothek schreiben (bin auch schon dabei), die sich möglichst am Standard orientiert (z.B. lange und kurze Form von Kommandos, keine Unterscheidung von Groß- und Kleinschreibung).
Bezüglich der Peripherie sind auch die STM32L432KC nicht schlecht. Die
haben 2x12 Bit DAC und sind vermutlich analog-technisch besser.
Ich habe mir ein STM32F429I Discovery Board genau für diesen Zweck besorgt :)
Ja, das stimmt. Aber vielleicht lässt es sich als STM32F429ZI Generic
Board ansprechen,
Das sollte gehen. Wenn es das Generic-Board gibt, kann man auf jeden Fall mit dem Arduino-Framework compilieren und laufen lassen. Es fehlen dann nur die Definitionen für die Peripherie das Discovery-Boards (z.B. die ON-Board LED ist dann nicht als LED_BUILTIN vorhanden, Display usw. )
Um den vollen Comfort zu erhalten, müssten im wesentlichen für das Discovery-Board nur die Dateien platform.txt und boards.txt angepasst werden.
Etwas unschön ist beim STM32F429ZI Generic Board im Arduino-Framework ist, dass der Treiber für das Display fehlt. Deshalb wäre die Discovery-Board Auswahl nützlich. Es könnte sein, dass sich noch keiner erbarmt hat den Treiber einzupflegen und das Display ist ja eine der Hauptatraktionen des Discovery Boards.
Vielen Dank. Sieht interessant aus.
Beim ersten drüber schauen fällt mir das Python-Beispiel auf der PC-Seite auf: Bei den Beispielen ist es immer gut, wenn es sehr einfache und dann die etwas anwenderfreunlichen, komplizierten Beispiele gibt. Das einfache Beispiel sollte aus nicht mehr als 10 Zeilen bestehen, bei dem die grundlegende Funktion sichtbar wird. Also z.B. lesen eines Wertes vom ADC und dann print. Viele Ersteller von Github-Repostitories neigen dazu, möglichst die gesamte Funktionalität mit allen API-Funktionen in ein Beispiel zu stecken. Das führt dann dazu, dass man das wesentliche Prinzip der Bibliothek nicht auf einen Blick erkennen kann.
Das sollte gehen. Wenn es das Generic-Board gibt, kann man auf jeden
Fall mit dem Arduino-Framework compilieren und laufen lassen. Es fehlen
dann nur die Definitionen für die Peripherie das Discovery-Boards (z.B.
die ON-Board LED ist dann nicht als LED_BUILTIN vorhanden, Display usw.
)
Um den vollen Comfort zu erhalten, müssten im wesentlichen für das
Discovery-Board nur die Dateien platform.txt und boards.txt angepasst
werden.
Ja, das stimmt, wobei sich damit zumindest für's erste wohl leben lässt.
Leider ist der Teil "Define a specific board" ganz unten noch Baustelle :D Aber das Board einzupflegen wäre sicher nicht schlecht.
Etwas unschön ist beim STM32F429ZI Generic Board im Arduino-Framework
ist, dass der Treiber für das Display fehlt. Deshalb wäre die
Discovery-Board Auswahl nützlich. Es könnte sein, dass sich noch keiner
erbarmt hat den Treiber einzupflegen und das Display ist ja eine der
Hauptatraktionen des Discovery Boards.
Ja, das ist schon hübsch. Ich hatte mir auch überlegt, das Display als Live-Anzeige für die gemessenen bzw. ausgegebenen Daten zu benutzen.
Beim ersten drüber schauen fällt mir das Python-Beispiel auf der
PC-Seite auf: ...
Ja, da hast du natürlich vollkommen Recht. Den Skript hatte ich erst einmal nur für mich selbst geschrieben, um zu testen, ob die gemessenen Daten überhaupt Sinn ergeben. Die "richtigen" Anwenderbeispiele, komplett mit Kommentaren, sollen noch folgen :)
Gerade habe ich noch mal etwas genauer über SCPI gelesen.
Es gibt wohl eine Art Standard-Kommandos, die alle Geräte implemtiert haben sollten. *IDN? ist auf jeden Fall eines davon.
Ja, richtig. Darüber, was diese Standard-Kommandos tun (sollen), schweigt sich der 800 Seiten lange SCPI Standard aber aus - und verweist auf IEEE 488.2 / IEC 60488-2, wo diese Kommandos definiert sind. Generell basiert SCPI auf IEEE 488.2 und viele Grundlagen sind stattdessen dort definiert, darunter Dinge wie Zeichensatz, Befehlsformat, Datenformate, Einheiten für Messgrößen...
Das ist auch ein Grund, warum ich statt Vrekrer lieber eine eigene SCPI-Bibliothek implementieren möchte, die bereits alle notwendigen Standard-Kommandos behandelt, und außerdem einen Parser für die IEEE 488.2 Datenformate und Einheiten enthält, den man direkt einbinden kann, statt im Sketch mit Zeichenketten zu arbeiten.