Auswahl des richtigen Arduino Boards

Hallo Leute :),

mein Name ist Jannis und im Moment schreibe ich in einem Betrieb meine Bachelorarbeit. Ziel meiner Arbeit ist dabei der Aufbau einer Sprühdüsenvorrichtung. Zur Verdüsung ist bereits eine Zweistoffdüse der Firma Schlick vorhanden gewesen, welche für den Versuch auch verwendet werden soll. Da diese den Kernpunkt des Projekterfolges wiederspiegelt, möchte ich diese kurz näher erläutern.

Eine Zweistoffdüse hat die Funktion eine Flüssigkeit mittels eines zweiten Mediums (meist Luft) zu zerstäuben/ zerkleinern. Dazu wird die Flüssigkeit beim Entstehen von leichtem Unterdruck in der Düse, in den Düsenkörper gesaugt und anschließend zusammen mit der Prozessluft aus der Düse herausgefördert und zerstäubt.
Der angesprochene Unterdruck entsteht durch die magnetisch gesteuerte Öffnung des Düsenventils, sowie der Förderung des Prozessluftstromes.

Was heißt das für mein Projekt? In meiner Arbeit soll ein maximales Volumen von 1,5ml verdüst werden, was eine sehr kurze Öffnungszeit des Öffnungsventils und des Luftstromventils erfordert. [Fließdiagramm im Anhang]
Um dies zu erfüllen, habe ich 2 Magnetventile mit einer Öffnungszeit von ca. 8-12 ms gekauft, die die kurze Schließaufgabe regeln sollen.

Nun habe ich mich gefragt, ob es möglich ist, diese sehr kurzen, zeitgesteuerten Öffnungen der Ventile mit einem Arduino Board zu erreichen und würde mich auch über eine Produktempfehlung freuen :slight_smile:

Da ich leider kaum Erfahrung in der Schalttechnik und Programmierung habe, wollte ich mich an dieses Forum wenden, von daher schonmal vielen Dank im Voraus für die Hilfe.

Freundliche Grüße,

Jannis

Fließbild 25.04.18.pdf (187 KB)

ob es möglich ist, diese sehr kurzen, zeitgesteuerten Öffnungen der Ventile mit einem Arduino Board zu erreichen

Es besteht Hoffnung.

https://www.arduino.cc/reference/en/language/functions/time/micros/

Hallo
Zu Deinen Ventilen noch eine Bemerkung 8-12ms Öffnungszeit heist ja nur das sie diese Zeit zum öffnen benötigen, das sagt ja noch nichts darüber aus wie lange sie dann geöffnet bleiben.

aber Du hast schon recht 1,5ml ist recht wenig. Wenn man das mal überschlägt, ich mache jetzt mal einen Ansatz den ich mir gerade so vorstelle.

Sprühpistole ca. 500ml/ min ist da schon recht viel also ehr weiniger daraus folgt etwa 200ms für 1,5ml.

Keine Mengen, die dazu auch noch genau sein sollen werden ehr verdüst , siehe Einspritz-Düse Motoren.

Heinz

combie:
Es besteht Hoffnung.

micros() - Arduino Reference

vielen Dank dir :slight_smile: das wird mir auf jeden Fall weiterhelfen bei der Programmierung. Aber bin derzeit erstmal auf der Suche nach dem richtigen Mikrocontroller-Board. Gibt es da irgendwelche Unterschiede zwischen Schaltzeiten etc.?

Rentner:
Hallo
Zu Deinen Ventilen noch eine Bemerkung 8-12ms Öffnungszeit heist ja nur das sie diese Zeit zum öffnen benötigen, das sagt ja noch nichts darüber aus wie lange sie dann geöffnet bleiben.

aber Du hast schon recht 1,5ml ist recht wenig. Wenn man das mal überschlägt, ich mache jetzt mal einen Ansatz den ich mir gerade so vorstelle.

Sprühpistole ca. 500ml/ min ist da schon recht viel also ehr weiniger daraus folgt etwa 200ms für 1,5ml.

Keine Mengen, die dazu auch noch genau sein sollen werden ehr verdüst , siehe Einspritz-Düse Motoren.

Heinz

Hallo Heinz, danke dir für deinen Tipp. Habe mir auch schon das Diesel-Einspritz System angeschaut und will es eigentlich genau gleich regeln, jedoch mit einem deutlichen regulierten Druck. Denn wenn die Tropfengeschwindigkeit zu hoch ist, kommt es vermehrt zu Rückstrahleffekten und das beeinflusst das Ergebnis höchstwahrscheinlich eher negativ.
Von daher wäre es fast perfekt, wenn man wirklich nur eine ganz kurze Zeit das Öffnungsventil aufmacht.

Wie ist das denn mit der Auswahl des richtigen Mikrocontroller-Boards? ich muss gestehen, dass ich da echt nicht so viel Ahnung hab, inwieweit sich die untereinander unterscheiden, also zwecks Schaltzeit oder Ein-Ausgangssignaleingänge.

Die Arduino 5V AVR Boards arbeiten alle mit 16MHz
Sind also alle gleich schnell

Hier habe ich denn Nachweis geführt, dass man einen Pin, mit 2,66MHz toggeln kann.

combie:
Die Arduino 5V AVR Boards arbeiten alle mit 16MHz
Sind also alle gleich schnell

Hier habe ich denn Nachweis geführt, dass man einen Pin, mit 2,66MHz toggeln kann.

Super vielen Dank dir :slight_smile:

Hallo,

Wir wissen ja nicht genau was Du mit Deinem Arduino so vorhast. Es geht hier ja eigendlich um die Reaktionszeit des Controllers. Dazu muß man die Zykluszeit messen. D.h wie lange dauert ein Umlauf im Loop. Diese Umlaufzeit wird natürlich mit jeder Anweisung grösser und hängt auch von der Art der Anweisung ab. Eine Integer Berechnung dauert nur den Bruchteil einer Float Berechnung. Damit ergibt sich dann je nach Programm die Zeit zwischen einer Aktion und Reaktion das Ergebniss bezeichnet man dann als Reaktionszeit des Controllers, zum Beispiel:

-Tasterpegel erkennen

  • Programm verarbeiten ein Zyklus
  • Led schalten.

Bei der Reaktionszeit kann man von 3 mal Zykluszeit ausgehen, es gibt aber auch andere Modelle. Alles natürlich ohne besondere Maßnahmen wie z.B Interupt´s. Der Tasterzustand (Aktion) kann sich ja ändern wenn der Prozesor gerade an der Abfrage vorbei gekommen ist, und das dann erst wieder im nächsten Zyklus erkannt wird. Ähnliches kann bei der Ausgabe auch passieren. Dazu kommen natürlich noch die Schaltzeiten von Schutzbeschaltung, Sensoren , Relais, Schützen, und in Deinem Fall die Schaltzeit der Ventile.

Ich hab das jetzt mal was gemacht um ein Gefühl dafür zu bekommen. Eigendlich wird nur ein Taster eingelesen und davon abhängig eine LED geschaltet.Damit man dann auch was messen kann mach ich das in einer Schleife 1000 mal und zeige die Zeit an die dafür benötigt wurde.

Ergebniss : <8 us je Umlauf.

wer will kann ja jetzt noch zus. eine Interger oder Float Berechnung mit einbauen oder 1000 mal den Sinus berechnen :wink:

Heinz

unsigned long alt_t;
int maxschleife = 1000;

float zyk;// Messzeit 

const int taster = 2;
const int LED = 13;  // interne LED pin 13

void setup() {
  // put your setup code here, to run once:
  Serial.begin(9600);
  pinMode(taster, INPUT_PULLUP);
  pinMode(LED, OUTPUT);
}

void loop() {
alt_t = micros();
  for (int i = 0; i <= maxschleife; i++) {
    if (digitalRead(taster)) {
      digitalWrite(LED, HIGH);
    }
    else {
      digitalWrite(LED, LOW);
    }
  }
  zyk = micros() - alt_t;
  Serial.print("Zeit für "); Serial.print(maxschleife);
  Serial.print(" mal Taster lesen und LED setzen ");
  Serial.print(zyk / 1000); Serial.println("ms");
 

}

Ergebniss : <8 us je Umlauf

.
Mit einem analogRead werden es eher > 100 us. Es ist hilfreich , neben Ergebnissen auch ein Gefühl für die Zeiten zu entwickeln.
Ob nach tausend oder schon nach ein paar Dutzend loop Durchläufen das Magnetventil sich bewegt hat, ist eigentlich eher egal. Aber dass so etwas, oder die Frage float oder int Berechnung, sich auswirken könnte, sollte man doch im Hinterkopf behalten.

Rentner:
Hallo,

Wir wissen ja nicht genau was Du mit Deinem Arduino so vorhast. Es geht hier ja eigendlich um die Reaktionszeit des Controllers. Dazu muß man die Zykluszeit messen. D.h wie lange dauert ein Umlauf im Loop. Diese Umlaufzeit wird natürlich mit jeder Anweisung grösser und hängt auch von der Art der Anweisung ab. Eine Integer Berechnung dauert nur den Bruchteil einer Float Berechnung. Damit ergibt sich dann je nach Programm die Zeit zwischen einer Aktion und Reaktion das Ergebniss bezeichnet man dann als Reaktionszeit des Controllers, zum Beispiel:

-Tasterpegel erkennen

  • Programm verarbeiten ein Zyklus
  • Led schalten.

Bei der Reaktionszeit kann man von 3 mal Zykluszeit ausgehen, es gibt aber auch andere Modelle. Alles natürlich ohne besondere Maßnahmen wie z.B Interupt´s. Der Tasterzustand (Aktion) kann sich ja ändern wenn der Prozesor gerade an der Abfrage vorbei gekommen ist, und das dann erst wieder im nächsten Zyklus erkannt wird. Ähnliches kann bei der Ausgabe auch passieren. Dazu kommen natürlich noch die Schaltzeiten von Schutzbeschaltung, Sensoren , Relais, Schützen, und in Deinem Fall die Schaltzeit der Ventile.

Ich hab das jetzt mal was gemacht um ein Gefühl dafür zu bekommen. Eigendlich wird nur ein Taster eingelesen und davon abhängig eine LED geschaltet.Damit man dann auch was messen kann mach ich das in einer Schleife 1000 mal und zeige die Zeit an die dafür benötigt wurde.

Ergebniss : <8 us je Umlauf.

wer will kann ja jetzt noch zus. eine Interger oder Float Berechnung mit einbauen oder 1000 mal den Sinus berechnen :wink:

Heinz

unsigned long alt_t;

int maxschleife = 1000;

float zyk;// Messzeit

const int taster = 2;
const int LED = 13;  // interne LED pin 13

void setup() {
  // put your setup code here, to run once:
  Serial.begin(9600);
  pinMode(taster, INPUT_PULLUP);
  pinMode(LED, OUTPUT);
}

void loop() {
alt_t = micros();
  for (int i = 0; i <= maxschleife; i++) {
    if (digitalRead(taster)) {
      digitalWrite(LED, HIGH);
    }
    else {
      digitalWrite(LED, LOW);
    }
  }
  zyk = micros() - alt_t;
  Serial.print("Zeit für “); Serial.print(maxschleife);
  Serial.print(” mal Taster lesen und LED setzen ");
  Serial.print(zyk / 1000); Serial.println(“ms”);

}

Ahh okay so ist das, ich wusste nicht, dass die reine Schaltzeit, bezogen auf das Arduino nur von der Zykluslaufzeit bestimmt wird.
In meinem Fall soll eben die Öffnung der Magnetventile so schnell wie möglich erfolgen. Aber das wären ja gerade mal 2 Befehle, die das Arduino ablaufen müsste, von daher bin ich da positiv gestimmt, dass das klappt!

Ahh okay so ist das, ich wusste nicht, dass die reine Schaltzeit, bezogen auf das Arduino nur von der Zykluslaufzeit bestimmt wird.

tja, dann wollen wir mal hoffen, dass du jetzt nicht das falsche gelernt hast.

Denn, um mit (kleinen) Zeiten zu dealen, wurden die Timer erfunden.
Und die laufen unabhängig vom Hauptprogramm. In eigener Hardware.

Tipp:
Datenblatt zum gewünschten µC lesen.
Da werden sie erwähnt.

jaschey:
Ahh okay so ist das, ich wusste nicht, dass die reine Schaltzeit, bezogen auf das Arduino nur von der Zykluslaufzeit bestimmt wird.
In meinem Fall soll eben die Öffnung der Magnetventile so schnell wie möglich erfolgen. Aber das wären ja gerade mal 2 Befehle, die das Arduino ablaufen müsste, von daher bin ich da positiv gestimmt, dass das klappt!

Über die Geschwindigkeit des Arduinos brauchst du dir eigentlich keine großen Gedanken machen, solange du ihn einigermaßen geschickt programmierst (kein blockierender Code) und nicht großen Firlefanz wie grafisches Display mit Touchscreenbedienung einbaust. Der beschränkende Faktor sind deine mechanischen Komponenten. 8-12ms sind eine halbe Ewigkeit für den Arduino. Der Arduino könnte mit Portzugriffe dir das Ventil um den Faktor 60.000-100.000(!) schneller ein und aus schalten als die 8-12ms, die dir die Mechanik vorgibt.

In meinem Fall soll eben die Öffnung der Magnetventile so schnell wie möglich erfolgen. Aber das wären ja gerade mal 2 Befehle, die das Arduino ablaufen müsste, von daher bin ich da positiv gestimmt, dass das klappt!

Aus Arduino-Sicht musst du langsam genug schalten, damit das Magnet-Ventil überhaupt reagiert.

Der Arduino könnte mit Portzugriffe dir das Ventil um den Faktor 60.000-100.000(!) schneller ein und aus schalten als die 8-12ms, die dir die Mechanik vorgibt.

Auch ohne Port-Zugriff ist der Arduino viel zu schnell:

void loop() {
  digitalWrite(LED, HIGH);
  digitalWrite(LED, LOW);
  delay ( 1000 );
}

Du wirst die LED nicht aufblitzen sehen, und wenn du ein Ventil, egal ob über Relais oder Transistor, ansteuerst, wird es sich nicht mucksen. Und das ist bei weitem nicht die schnellste Art, einen Arduino-Pin anzusteuern.

Theseus:
Über die Geschwindigkeit des Arduinos brauchst du dir eigentlich keine großen Gedanken machen, solange du ihn einigermaßen geschickt programmierst (kein blockierender Code) und nicht großen Firlefanz wie grafisches Display mit Touchscreenbedienung einbaust. Der beschränkende Faktor sind deine mechanischen Komponenten. 8-12ms sind eine halbe Ewigkeit für den Arduino. Der Arduino könnte mit Portzugriffe dir das Ventil um den Faktor 60.000-100.000(!) schneller ein und aus schalten als die 8-12ms, die dir die Mechanik vorgibt.

Was genau ist denn ein direkter Portzugriff? Direkt vom Board das Ventil ansteuern?

jaschey:
Was genau ist denn ein direkter Portzugriff? Direkt vom Board das Ventil ansteuern?

Das ist wenn man ein Pin ansteuert ohne zB digitalWrite()/digitalRead() zu nehmen. Der direkte Portzugriff ist schneller weil bei digitalWrite()/digitalRead() einiges drumherum gemacht wird.
Ein Port sind die Speicherzellen (= Register) die die Ausgangstransistoren des Pins ansteuert bzw den zustand des Pin ausliest. Die Ports und Register haben Namen mit denen man sie ansteuern kann ohne die Adresse der Speicherstelle kennen zu müssen.

Grüße Uwe

uwefed:
Das ist wenn man ein Pin ansteuert ohne zB digitalWrite()/digitalRead() zu nehmen. Der direkte Portzugriff ist schneller weil bei digitalWrite()/digitalRead() einiges drumherum gemacht wird.
Ein Port sind die Speicherzellen (= Register) die die Ausgangstransistoren des Pins ansteuert bzw den zustand des Pin ausliest. Die Ports und Register haben Namen mit denen man sie ansteuern kann ohne die Adresse der Speicherstelle kennen zu müssen.

Grüße Uwe

Vielen Dank dir! Das werd ich direkt mal ausprobieren, wenn die ganzen Teilkomponenten da sind :slight_smile:

jaschey:
Vielen Dank dir! Das werd ich direkt mal ausprobieren, wenn die ganzen Teilkomponenten da sind :slight_smile:

Habe ich dir doch extra, in Posting #5, einen Link zu geschickt...

Aber ist nicht schlimm, wenn du das übersehen hast...
Denn die wirklich wichtigen Dinge (über)sehe ich auch oft.

uwefed:
Das ist wenn man ein Pin ansteuert ohne zB digitalWrite()/digitalRead() zu nehmen. Der direkte Portzugriff ist schneller weil bei digitalWrite()/digitalRead() einiges drumherum gemacht wird.
Ein Port sind die Speicherzellen (= Register) die die Ausgangstransistoren des Pins ansteuert bzw den zustand des Pin ausliest. Die Ports und Register haben Namen mit denen man sie ansteuern kann ohne die Adresse der Speicherstelle kennen zu müssen.

Grüße Uwe

uwefed:
Das ist wenn man ein Pin ansteuert ohne zB digitalWrite()/digitalRead() zu nehmen. Der direkte Portzugriff ist schneller weil bei digitalWrite()/digitalRead() einiges drumherum gemacht wird.
Ein Port sind die Speicherzellen (= Register) die die Ausgangstransistoren des Pins ansteuert bzw den zustand des Pin ausliest. Die Ports und Register haben Namen mit denen man sie ansteuern kann ohne die Adresse der Speicherstelle kennen zu müssen.

Grüße Uwe

Danke dir Uwe, ich werd mich da mal reinfuchsen :slight_smile: kann sein, dass eventuell nochmal eine Frage dazu kommt :wink:
Gruß,
Jannis

combie:
Habe ich dir doch extra, in Posting #5, einen Link zu geschickt...

Aber ist nicht schlimm, wenn du das übersehen hast...
Denn die wirklich wichtigen Dinge (über)sehe ich auch oft.

Oh das tut mir leid, habe das übersehen :frowning:
Ich muss mir aber leider echt zugestehen, dass ich gar keine Erfahrung mit der Programiersprache und auch mit Arduino habe, deswegen ist das manchmal ein wenig schwer, wenn mit Fachbegriffen um sich geworfen wird :slight_smile:
Aber habe einen Informatiker in der Firma, der zwar nur 2 mal in der Woche kommt, den ich aber dann an den 2 Tagen zumindest um Hilfe bitten kann. Ich werde ihm deinen Beitrag morgen mal zeigen!

Aber habe einen Informatiker in der Firma ...

Von Berufs wegen muss einem Informatiker das Ganze nicht unbedingt was sagen.
Der kann dir eventuell nur bestätigen, dass man mit 2 kB Gesamt-RAM nicht weit kommen kann. :wink:

Und combies Link ist für deine Aufgabe, ehrlich gesagt, ziemlich irrelevant.
Dass man Schaltzeiten von weit unter 1 µs erreichen kann (2,66 MHz = 187.5 ns aus und 187.5 ns an) ist zwar extrem toll, insbesondere bei einem Prozessortakt von nur 16 MHz = 62.5 ns. (Nanosekunden)

Aber für dein superschnelles Magnetventil mit 8 .. 12 ms Schaltzeit musst dein Arduino nur langsam genug sein.
Öffnungszeiten mit einer Auflösung in 0,004 ms Schritten ist vermutlich weit über deinen Anforderungen. Und dafür reichen Standard - Arduino-Funktionen allemal.