Industrielle Fertigung
Industrielles Internet der Dinge | Industrielle Materialien | Gerätewartung und Reparatur | Industrielle Programmierung |
home  MfgRobots >> Industrielle Fertigung >  >> Manufacturing Technology >> Herstellungsprozess

Zeichnen Sie alles auf Ihrem Oszilloskop

Komponenten und Verbrauchsmaterialien

Widerstand 1k Ohm
Jeder Widerstandswert ist akzeptabel, solange Sie die Verhältnisse des DAC korrekt halten brauchen 50, wenn Sie 2k-Widerstände haben. Oder das Doppelte des Wertes Ihres gewählten Widerstands.
× 50
Arduino UNO
Oder STM32 "blaue Pille" oder "schwarze Pille".
× 1

Apps und Onlinedienste

Arduino-IDE

Über dieses Projekt

Der R-2R DAC

Eine der einfachsten Implementierungen eines Digital-Analog-Umsetzers kann durch den Entwurf eines R-2R-Leiter-DAC erreicht werden. Dieser DAC-Typ benötigt nur Widerstände, um zu funktionieren, was ihn zu einem sehr anfängerfreundlichen DAC macht.

Das Grundprinzip dieser Art von DAC besteht darin, dass Sie nur zwei Werte für Widerstände benötigen. R und 2R. Dann können Sie sie wie im Schema unten gezeigt einrichten.

R kann alles sein, solange jedes Vorkommen von R im Schaltplan denselben Wert hat.

Wenn wir zum Beispiel R =1k wählen, dann wäre 2R nur der doppelte Betrag. In diesem Fall 2R =2k. Sie könnten also nur 1k- und 2k-Widerstände verwenden.

Wenn Sie R=3.3K verwendet haben, dann 2R =6.6k und so weiter. Wenn Sie nur den gleichen Widerstandswert für alles verwenden möchten, müssen Sie nur zwei Widerstände in Reihe schalten, um 2R zu erhalten, und dies würde Ihre Komponentenzahl erhöhen.

Die Anzahl der Bits hängt davon ab, wie viele Zweige von 2R herausragen. In diesem Projekt verwenden wir einen 8-Bit-R-2R und einen 6-Bit-R-2R für den Arduino Uno oder Nano. Wenn Sie einen anderen Mikrocontroller verwenden, von dem Sie wissen, dass er eine vollständige Port-Manipulation von mindestens 8 Bit unterstützt, wie z. B. die STM32 "blue pill" und "black pill", dann können Sie einfach zwei 8-Bit-DACs verwenden.

Nebenbemerkung zu DAC-ICs:

Dieses Projekt konzentriert sich auf die Verwendung eines R-2R-DAC, Sie können jedoch auch einen DAC-IC verwenden, um etwas Ähnliches zu erreichen. Wenn Sie einen DAC-IC verwenden, empfehle ich einen, der ein schnelles Kommunikationsprotokoll wie SPI unterstützt, da I2C zu langsam ist, um ein detailliertes Bild zu zeichnen. Ich werde in diesem Beitrag nicht auf die Verwendung eines DAC-IC eingehen, aber vielleicht in einem zukünftigen. Die R-2R immer noch meine bevorzugte Methode, da Bilder mit mehr Details ausgegeben werden können.

Port-Manipulation

Wir werden die Parallelport-Manipulation unseres Mikrocontrollers verwenden. Der Grund dafür ist, dass es eine schnellere Ausgabegeschwindigkeit ermöglicht und auch den Code einfach hält. Weitere Informationen zu den Portregistern für Arduino finden Sie in diesem Link.

Arduino Uno und Nano verfügen über den Mikrocontroller ATmega328p. Dieser Mikrocontroller teilt das gleiche Pin-Mapping mit dem Atmega168:

Die Port-Pins und -Bits werden durch ihr Label PXN gekennzeichnet, wobei X der Port-Buchstabe und N die Bit-Nummer ist.

Beispiel:PB1 ist für PORT B ​​Bit 1. Ähnlich ist PC5 für PORT C Bit 5.

Wenn wir die Pins untersuchen, sehen wir, dass der Mikrocontroller die Ports B, C und D hat. Wenn wir zur Arduino-Referenz zurückkehren, können wir sehen, welche Ports geschrieben oder gelesen werden können oder beides. In unserer Bewerbung kümmern wir uns nur um das Schreiben.

In der Dokumentation steht, dass PORTD lesen/schreiben ist und den digitalen Pins 0 bis 7 zugeordnet ist. Dies gibt uns volle 8-Bits der Ports zum Schreiben.

Als nächstes haben wir PORTB, die wie angegeben auf die digitalen Pins 8-13 abgebildet sind. Es wird eine zusätzliche Aussage gemacht, die besagt, dass 6&7, die die vollen 8-Bits vervollständigen würden, nicht zugänglich sind. Dieser Port kann nur zum Schreiben von 6-Bit verwendet werden.

Das gleiche gilt für PORTC. Es ist den analogen Pins 0-5 zugeordnet, aber zwei Pins sind ebenfalls reserviert, sodass wir nur 6-Bit schreiben können.

Aufgrund dieser Einschränkungen müssen wir eine Kombination aus einem 8-Bit-DAC für PORTD und einem 6-Bit-DAC für entweder PORTC oder PORTB verwenden.

Wir werden PORTD und PORTB verwenden und können jetzt damit beginnen, die DACs mit den Pins zu verdrahten.

Wenn Sie eine visuelle Hilfe beim Zusammenbau benötigen, habe ich beide R-2Rs im Steckbrett so zusammengebaut. Beachten Sie, dass ich zwei R-2Rs verwendet habe, seit ich es auf meiner STM32 "schwarzen Pille" getestet habe. Ich habe zwei Überbrückungsdrähte herausragen lassen, damit ich meine Oszilloskop-Sonden daran anschließen konnte und auch ein Erdungskabel an der Seite. Ich habe alle 10k-Widerstände verwendet, also habe ich für meinen 2R zwei 10k-Widerstände in Reihe geschaltet.

Hier ist ein saubereres Steckbrett-Setup mit Tinkercad. Ich habe die Ausgänge mit X und Y markiert, da an diese unsere Oszilloskop-Tastköpfe angeschlossen sind. Wenn Sie weitere Informationen zum Setup benötigen, stelle ich Ihnen Schaltpläne zur Verfügung, die die R-2R-Leitern zeigen, die aus allen mit denselben Widerstandswerten und einer anderen mit zwei Werten bestehen.

Überprüfen Sie unbedingt Ihr Gelände! Jedes Mal, wenn ich dieses Setup zusammenbaue, neige ich dazu, es zu vergessen. Überprüfen Sie auch, ob Sie keine Lücken ohne Verbindungen hinterlassen haben.

ArduinoCode

Jetzt ist es Zeit für die Arduino-Skizze.

Zuerst müssen wir unsere Ports als Ausgänge einrichten. Aus der Arduino-Referenz zur Port-Manipulation. Wir können sehen, wie die Ports eingestellt werden:

Grundsätzlich wird ein Wert von 1 für das Bit als Ausgang und ein Wert von 0 als Eingang festgelegt. Für PORTD können wir direkt schreiben, da auf alle Bits zugegriffen werden kann. Denken Sie bei PORTB daran, dass die Bits 6 und 7 nicht verwendbar sind, da sie auf den Quarz abgebildet werden. Es empfiehlt sich, bitweise ODER mit dem Wert 0 zu verwenden, um zu vermeiden, dass Bits geändert werden, die nicht gesetzt werden.

In unserer Setup-Schleife ist dies der Code:

Der Code wird zum Download angehängt, also machen Sie sich keine Sorgen, ihn von Hand einzugeben.

Die for-Schleife unterhalb der Konfigurationen ordnet einfach die Werte für den 6-Bit-Port neu zu. Diese Werte stammen aus einer Liste mit Werten im 8-Bit-Bereich. Um auf 6 Bits neu zuzuordnen, ist unser maximaler Wert 2^6-1, was 63 ist. Wir bilden einen Bereich von 0 bis 2^8-1 ab, was 255 ist. Der Grund, warum wir im Arduino-Code neu zuordnen, ist, dass unser Das Handplotter-Tool gibt die x- und y-Punkte in 8-Bit aus. Wir können es in beiden Codes ändern, aber es ist besser, es auf dem verwendeten Mikrocontroller zu ändern.

Grundsätzlich brauchen wir je nach Oszilloskop eine gewisse Verzögerung. Ich fand, dass für meine 1 in Ordnung ist. Tatsächlich ist es auch in Ordnung, die Verzögerung vollständig wegzulassen. Für Punkte wird es automatisch von unserem Handplotter-Tool generiert, sodass Sie die Zahl einfach kopieren und einfügen können, aber im Grunde sind dies die Anzahl der Punkte, die gezeichnet werden müssen, damit die iterierende Variable sie durchlaufen kann. Wie auch immer, hier ist der vollständige Code:

Die x_points- und y_points-Arrays sind für Sie jedes Mal anders, wenn Sie etwas zeichnen, und werden automatisch mit unserem Tool generiert.

Nebenbemerkung zu schneller PWM:

Wenn Sie ein fortgeschrittener Benutzer von Mikrocontrollern sind, werden Sie vielleicht feststellen, dass, wenn Sie sich um Geschwindigkeit sorgen, vielleicht dasselbe kann durch schnelles PWM und Modifizieren von Taktregistern erreicht werden. Anschließend werden die PWM-Ausgänge einem Tiefpassfilter zugeführt, um eine analoge Spannung zu erhalten, die die Pinanzahl reduzieren würde. Ich habe beide Methoden ausprobiert, und dies führt immer noch zu einer besseren Unterstützung für Bilder mit mehr Details. Zumindest im Arduino Uno

Zeichenwerkzeug

Ich habe dieses Tool in Python 3 mit tkinter erstellt. Wenn Sie tkinter nicht installiert haben, installieren Sie es mit pip.

pip install tk 

Der Code wird nur angehängt, aber im Grunde zeichnet er die Koordinate in dem Fenster auf, auf das Ihr Cursor geklickt wurde. Versuchen Sie nicht, die Größe des Fensters zu ändern, da dies die Auflösung ändert. Wenn Sie genauer sein möchten, verwenden Sie das Lupenwerkzeug in Windows. Das Fenster basiert auf 255x255, da dies die Maximalwerte unserer Bitbereiche sind. Natürlich wird eine der Dimensionen auf 6-Bit abgebildet, wenn Sie ein Arduino UNO verwenden.

Um das Tool aufzurufen, verwenden Sie einfach dieses Format

python drawlog.py> arduino_list.txt 

Dadurch wird eine .txt-Datei namens arduino_list.txt mit der Arduino-Liste für x_points, y_points und NUM_POINTS erstellt, die für Sie generiert wurde und die Sie kopieren und in Ihren Code einfügen können.

Als Beispiel sieht die .txt-Datei so aus, wenn Sie sie öffnen. Sie müssen nur diese Zeilen im Code ersetzen.

Hier ist es, wie es aussieht, wenn es geöffnet ist. Von dort aus kannst du alles zeichnen.

Ich habe das folgende Bild gezeichnet, um es auszuprobieren. Der Code wird beim Schließen des Fensters generiert.

Und nach dem Hochladen des Codes auf dem Arduino sah es im X-Y-Modus so aus.

WICHTIG:

Wenn Sie einen Kompilierungsfehler im Zusammenhang mit Speicher erhalten, liegt dies am geringen verfügbaren Speicher des Arduino UNO. Das bedeutet, dass Sie ein weniger detailliertes Bild zeichnen sollten. Ich denke, die maximale Punktzahl lag bei etwa 400, aber es könnten auch mehr sein. Wenn Sie eine STM32 "Blaue Pille" oder "Schwarze Pille" verwenden, liegt diese Zahl über 4.000.

Oszilloskop-X-Y-Modus

Das Oszilloskop muss auf den x-y-Modus eingestellt sein. Der 8-Bit-R-2R-DAC-Ausgang (PORTD) wird mit Kanal 1 verbunden und der 6-Bit-R-2R-DAC (PORTB) wird mit Kanal 2 verbunden. Von dort aus können Sie ihn mit den Drehreglern einstellen, bis Sie ein Bild sehen.

Das ist es! Wenn Sie Fragen haben, können Sie diese gerne stellen. Wenn Sie es außerdem mit einer blauen oder schwarzen Pille ausprobieren möchten, finden Sie hier den Link zu meiner GitHub-Seite mit einigen Beispielcodes

Hier sind nun einige Bilder, die ich geplottet habe.

Fühlen Sie sich frei, Ihre zu teilen!!!

Bearbeiten:

Wichtige Details zur Speicherverwaltung

Wie Tim in den Kommentaren erwähnte

  • In Ihrem Arduino-Code ist Ihr Iterator über die Punkte, t, ein "Byte" -Typ, unterstützt also nur bis zu 255 Punkte. Warum nicht ein "int" machen?
  • Ihr Plottercode gibt "const unsigned long" für x_points und y_points aus - das wird nicht funktionieren, wenn Sie später y-Punkte ändern. Warum nicht einfach "Byte" verwenden, um Speicher zu sparen?

Beachten Sie die von Ihnen verwendeten Hardwarebeschränkungen. Für Arduino Uno ist es besser, Byte zu verwenden. Wenn Sie jedoch einen STM32 oder sogar ESP32 verwenden, stehen mehr Punkte zum Plotten zur Verfügung. Vielen Dank für Ihr Feedback.


Timster :

Ich habe einen Weg gefunden, die Anzahl der auf einer UNO unterstützten Punkte massiv zu erhöhen - verschiebe sie in den Programmspeicherplatz. Sie können dies mit dem PROGMEM . tun Modifikator. Auf diese Weise können Sie rund 15.000 Punkte speichern!

Deklarieren Sie die Arrays also wie folgt:

const int NUM_POINTS =...
const byte x_points[NUM_POINTS] PROGMEM ={...
const byte y_points[NUM_POINTS] PROGMEM ={...

Nehmen Sie die Änderung an den y_points in der Setup-Funktion nicht vor (d. h. entfernen Sie das für Schleife dort). Führen Sie stattdessen eine Bitverschiebung in der Schleifenfunktion durch.

Außerdem benötigen Sie einen speziellen Befehl, um Daten aus dem Programmspeicher zu lesen (pgm_read_byte_near). Also die for-Schleife in der void loop() sieht aus wie:

for (int t=0; t  { 
PORTD =pgm_read_byte_near(x_points + t);
PORTB =pgm_read_byte_near( y_points + t)>> 2;
delayMicroseconds(FIGURE_DELAY);
}

Dann ist es möglich, ein hochauflösendes Bild oder mehrere kleinere Bilder zu speichern und zwischen ihnen zu wechseln 😃

Code

  • Arduino-Code
  • Plotting-Tool
Arduino-CodeArduino
Arduino-Skizze zur Verwendung in einem Arduino Uno- oder Nano-Board
const byte FIGURE_DELAY =1; // Trace-Verzögerung in den USA. bei Bedarf anpassenconst int NUM_POINTS =87; // Anzahl der XY-Punkte in der Figur // x- und y-Koordinaten zum Plotten von Byte x_points[NUM_POINTS] ={106,106,105,104,103,102,101,100,99,98,97,96,95,94,93,92,91 , 90,90,89,88,87,87,87,86,86,86,86,87,89,90,91,93,95,97,99,101,102,102,104,104,105,105,106,106,106,106,106,106,108,109,110,112,113,115,117,119,121,122,123,123,124,124,124,124,124,123,122,121,120,119,118,117,116,115,114,113,112,111,110,110,109,109,109,108,107,107}; byte y_points [NUM_POINTS] ={78,80 , 81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,96,98,99,100,101,103,105,106,108,110,112,113,113,114,115,115,115,115,115,115,114,112,112,110,109,107,106,106,108,110,112,114,114,115,116,116,117,117,117,117,117,116,115,113,112,110,108,106,104,103,102,100,99,98,97,96,95,94,93 ,92,91,90,89,87,86,84,82,81,80,78};void setup () { // Port D und B zum Schreiben von DDRD initialisieren =B11111111; DDRB =B00111111; Byte-t; for (t=0; t  
Plotting-ToolPython
Zeichenwerkzeug zum Exportieren von Punkten zum Plot
importieren von tkinter als tkX =[]Y =[]lastx, lasty =0, 0# xy und addLine dienen nur grafischen Zwecken# on_move_press ist derjenige, der den Eintrag in die Liste protokolliert und behebt Ydef xy(event):# protokolliert Koordinaten beim Mausklick global lastx, lasty lastx, lasty =event.x, event.ydef addLine(event):# zeichnet Linie vom alten Punkt zum neuen Punkt global lastx, lasty canvas.create_line ((lastx, lasty, event.x, event.y)) # dies macht den neuen Startpunkt der Zeichnung lastx, lasty =event.x, event.y# protokolliert angeklickte Koordinate auf listdef on_move_press( event):curX, curY =(event.x, event.y) curY=255-curY # da tkinter andere Koordinaten verwendet X.append(str(curX)) Y.append(str(curY))# Einrichtung für Windowroot =tk.Tk( )root.geometry("255x255")root.columnconfigure(0, weight=1)root.rowconfigure(0, weight=1)canvas =tk.Canvas(root)canvas.grid(column=0, row=0, sticky =(tk.N, tk.W, tk.E, tk.S))# bind Linksklick und auf Funktionen ziehen und loopcanvas.bind("", xy)canvas.bind("", addLine)root.bind("",on_move_press)root.mainloop()# lösche jeden 2. Eintrag um Punkte zu reduzieren und Trace Refresh for i in range(1,int(len(X)/2) erhöhen):X.pop(i) Y.pop(i)print("const int NUM_POINTS =%s;" % str(len(X) ))print("const unsigned long x_points[NUM_POINTS] ={%s};" % ','.join(X))print("const unsigned long y_points[NUM_POINTS] ={%s};" % ',' .join(Y))#call python drawlog.py> arduino_list.txt

Schaltpläne


Herstellungsprozess

  1. Widerstände
  2. Aufbau eines drahtlosen Sensornetzwerks in Ihrem Zuhause
  3. Überwachen Sie Ihre Haustemperatur mit Ihrem Raspberry Pi
  4. Das beste Zubehör für Ihren Raspberry Pi
  5. Erstellen Sie Ihr eigenes Google Voice HAT
  6. Messen Sie Ihre Reaktionszeit
  7. Ihr Leitfaden zu dynamischen Widerständen
  8. Ihre Auswahlhilfe für Bandsägen
  9. So reparieren Sie Ihren Autotürgriff
  10. Wie kann man Rost an seinem Auto reparieren?