Einen oder besser mehrere Arduino benutzen?

Hallo zusammen,

ich habe folgende Frage:
Für meinen Test - 2 Bänder schieben Pakete - benötige ich da einen Arduino oder geht das nur mit zweien?

Der Code - ist nur ein Entwurf - noch nicht mal eine korrekte Sprache - einfach nur damit Ihr wisst worum es geht.

Zur Verfügung haben ich einen UNO und einen MEGA 2560

//Sicherheitsabdeckungssignal auch im Code abfragen!!!
if (Sicherheitsabdeckungssignal == 1)
{
//Ultraschallsensor-Abtastung 
if (sensorende =! 1)
{
transportband1 = an	
}
else
{
transportband1 = aus
delay (1000);
scanner = runter
delay(1000);
scanner= rauf;
delay(2000);
				
				while (paketband2 =! frei)
					
{
delay(50);							
}
kipper = hoch;
delay(3000);
kipper = runter;
delay(3000);
transportband2 = 1;
				
}
}

Der Code war schön eingerückt. Irgendwie hat mir das Forum das zerschossen :slight_smile:

Jetzt z.B. die While Schleife in der geschaut wird, ob das zweite Band leer ist.
Wäre es hier besser einen zweiter Arduino ein Signal an den ersten schicken zu lassen?
Und wie bekomme ich es hin - die Sicherheitsabdeckung im kompletten Betrieb zu überwachen?
Das zu jeder Zeit wenn die Abdeckung hoch geht das komplette System stoppt. Oder mit einem Notschalter.

Wie gesagt - dies ist ein Pseudocode :wink:

Hi qiwi,

kannst du bitte ein oder zwei Informationen mehr geben. Wird der Scanner über den Arduino ausgelesen?

Hallo,

also grundsätzlich würde einer reichen. Allerdings wage ich zu bezweifeln das der Code so Funktioniert wie du dir das vorstellet.

Gruss Temucin

Ergänzend zu #1: Du möchtest eine Ablaufsteuerung programmieren, auch endlicher Automat oder Finite State Machine genannt.

Es gibt tatsächlich Gründe, mehrere Arduinos einzusetzen, die ich aber bei Deiner Aufgabenstellung nicht erkennen kann.

Schwierig dürfte für Dich der Schritt von der Datenverarbeitung zur Prozessautomation zu werden. Aber das haben andere auch geschafft, ich beispielsweise :slight_smile:

Ok - ich versuche mal das Projekt besser zu erklären.
Vorab - dies ist ein DEMO-Projekt um mir selbst klar zu machen was möglich ist mit dieser Elektronik.
Ich möchte für diesen Test zwei virtuelle Transportbänder steuern.

Auf Band 1 laufen die Pakete bis zum Ende. Hier soll evtl. ein Ultraschall oder eine Lichtschranke (Diese habe ich noch nicht gefunden) das Signal geben, damit das Band gestoppt wird.
Wenn das Band gestoppt worden ist, dann soll ein Scanner einen Barcode lesen (Also auch erst einmal virtuell)
Hier reicht es, wenn ein Arm nachdem er das Signal bekommen hat - runter und wieder hoch fährt.
Nachdem der Arm wieder hochgefahren ist, wird das Band evtl. durch Hydraulik gekippt und das eben gescannte Paket rutscht auf das andere Band (Welches eigentlich nur eine Ablage ist).
Sobald das Paket auf dieser Ablage ankommt, wird durch einen Sensor wieder (Lichtschranke oder Ultraschall) ein Hydraulikarm das Paket von der Ablage in einen Korb schieben.

Wenn dies alles nur ein Vorgang wäre, dann wäre das selbst für mich - der lediglich eine Ampel auf dem Breadboard und gesketcht hat ein Leichtes. Jedoch soll z.B. wenn das Paket von Band 1 auf die Ablage gekippt worden ist schon Band 1 das nächste Paket transportieren bis zum Ende von Band 1 und gleichzeitig schiebt auf der Ablage die Hydraulik das Paket in den Korb. Außer dem darf das ganze nur laufen, wenn eine Sicherheitsklappe heruntergeklappt ist (weiterer Sensor).
Die Abfrage wegen dem Sicherheitssensor ist ja beim Start nicht das Problem - wie in meinem "Pseudocode" zu sehen ist - aber wie frage ich das Hochklappen während dem Betrieb ab - oder baue einen NOTSTOP ein, der auch sofort reagiert.

All diese Fragen haben mich dazu veranlasst hier diese Frage zu stellen, weil ich mir nicht vorstellen kann, dies alles mit nur einer LOOP zu steuern.

Vielen Dank für Eure Hilfe.

Hi

Indem Du IMMER prüfst, ob die Gegebenheiten für den aktuellen Schritt noch zulässig sind.
Schaue Dir dafür das Beispiel Blink_without_delay in der IDE an und/oder die Nachtwächtererklärung hier aus dem Forum.
Für jede nacheinander ablaufende Aktion erstellst Du eine State-Maschine, in den verschiedenen Status prüfst Du, ob dieser Status noch gültig ist, Du zum Nächsten gehen kannst oder z.B. ein Not-Aus-Status angesprungen werden soll.

So ganz habe ich Deine Abfolge nicht verstanden.

MfG

qiwi:
Ich möchte ...

Ich habe den Thread bislang nur quergelesen. Was ich dabei aufgeschnappt habe, lässt mich aber wieder einmal an einen endlichen Automaten denken. Mit dem passenden Strickmuster kannst Du (wie ich das gerade sehe) alle Aufgaben lösen und benötigst dafür nur einen einzigen Arduino. Was mir zu endlichen Automaten eingefallen ist, habe ich hier ins Netz gekippt.

Und die Dinge, mit denen Du zu tun hast, lassen sich (wie gesagt, soweit ich das gerade sehe) prima mit Klassen erschlagen. Falls Du noch nie mit Klassen zu tun hattest: Freu' Dich drauf. Macht irre Spaß :slight_smile:

Gruß

Gregor

Wenn das zur Automatisierung einer kleinen Anlage ist würde ich eher "trotz des Arduino Ansatz" eher zu einer kleinen Steuerung ala Siemens LOGO oder Eaton Easy raten.
Da hast du weniger Probleme gute Sensorik zu finden und die Dinger laufen extrem zuverlässig und die Anbindung zu einer Übergeordneten Steuerung ist wesentlich einfacher. Stichwort Modbus / Profinet etc.
Gruß
DerDani

qiwi:
... weil ich mir nicht vorstellen kann, dies alles mit nur einer LOOP zu steuern.

Eine quasi parallele Verarbeitung ist schon möglich. Nimm Dir das IDE-Beispiel blinkwithoutdelay und lasse zwei LEDs mit unterschiedlicher Frequenz blinken. Dann hast Du zwei fast unabhängige Prozesse. Natürlich ist die Geschwindigkeit begrenzt, die LEDs kannst Du nicht mit beliebig hoher Frequenz blinken lassen.

Der Arduino ist für künstlerische Projekte konzipiert, die IDE bremst mit Komfortfunktionen. Für ein Lehrmodell kann ich mir den Arduino gut vorstellen, in der industriellen Produktion halte ich ihn für die falsche Wahl, ganz unabhängig von Vorschriften.

agmue:
Für ein Lehrmodell kann ich mir den Arduino gut vorstellen, in der industriellen Produktion halte ich ihn für die falsche Wahl, ganz unabhängig von Vorschriften.

Das kann man so pauschal nicht sagen. Es spricht ja nichts dagegen, Arduino Hardware auch ohne "Komfort-Unterstützung durch die IDE" zu programmieren :wink: Genauso wie anders herum auch nichts dagegen spricht, selbst gebaute Hardware mit der IDE zu programmieren (so lange sie durch die Bibliotheken unterstützt wird). Wofür welcher Ansatz taugt, hängt vom Einzelfall ab. Grundsätzlich ist die Hardware aber meist nicht schlecht - und vernünftig programmiert (ohne Bibliotheks-Funktionen), kann ich sie mir durchaus im industriellen Einsatz vorstellen (auch wenn ich es selbst wohl nicht machen würde).

das Problem ist nicht die IDE per se sondern die verwendeten Komfort-Bibliotheken. Ein digitalWrite zum Beispiel verursacht im BIN (das sich deshalb tatsächlich stark unterscheiden wird) einen extremen Overhead. In der Industrie-Programmierung würde man sowas wohl immer durch einen Zugriff direkt auf die Port-Register machen (was natürlich auch in der IDE geht ... nur eben nicht durch digitalWrite) und damit deutlich Rechenzeit sparen - was am Ende dazu führt, dass man eine weniger leistungsstarke und damit kostengünstigere Hardware einsetzen kann. Es ist also sehr wohl auch eine Frage der Software. Schlechte / unperformante Programmierung durch (zusätzliche) Hardware-Power zu kompensieren war noch nie eine wirklich gute Idee im Industrie-Bereich.

PS: ich hatte in einem anderen Post mal einen Größenvergleich gemacht, um zu zeigen, wie sehr die Größe des BIN (und in gewissem Maße damit die Performance des Codes) von der Verwendung der "Komfort-Funktionen" abhängt: Speicher wird knapp, Optimierungen gesucht - #25 by mgcss - Deutsch - Arduino Forum Da sieht man, dass man eine identische Funktionalität entweder mit 710, 450 oder 140 Byte umsetzen kann ... abhängig davon, ob man digitalWrite verwendet oder nicht und in welcher IDE man das kompiliert.

TimeToMarket ist wesentlich wichtiger als das Optimum an Speicherplatz und Geschwindigkeit zu erzielen.
Wenn Speicherplatz und Geschwindigkeit gut ausreicht, darf man sich als Ingenieur nicht beim weiteren "Optimieren" erwischen lassen.

Allerdings spielt im Anlagenbau der Preis der Software und der verwendeten Komponenten nicht dieselbe Rolle wie im Hobby-Bereich. Und OpenSource Software ist gelegentlich eher ein Hindernis.

beim TimeToMarket gebe ich Dir recht. Aber ein

digitalWrite(0, HIGH);

tipped sich auch nicht schneller als ein

PORTB |= (1<<PB0);

und für einen erfahrenen Programmierer ist beides gleich gut lesbar. Also vor dem Hintergrund von TimeToMarket sehe ich bei den Komfort-Funktionen nicht zwingend einen Vorteil. Ok … jeder C Programmierer wird auch seine eigenen Bibliotheksfunktionen nutzen. Für den AD Wandler zum Beispiel tippe ich die Funktionen zum Initialisieren und Auslesen auch nicht immer neu … aber diese Funktionen sind halt auch auf Performance und Einfachheit hin optimiert und nicht auf Komfort.

mgcss:
… Aber ein

digitalWrite(0, HIGH);

tipped sich auch nicht schneller als ein

PORTB |= (1<<PB0);

Nicht für mich. Aber das ist mir total wurscht. Ich bin Zehn-Finger-Tipper.

Gruß

Gregor

Hallo zusammen,

ich habe mir das "BlinkwithoutDelay" angeschaut. Ich denke, dass millis nicht das richtige für mich ist da
hier die Zeit seit dem Start vom Controller abgefragt wird.

Ich möchte hier nicht auf einen festgelegten Zeitpunkt reagieren - sondern auf ein Signal, welches die Bereitschaft von Band 2 ausgibt.

Also Band 1 und Band 2 sollen "effizient" zusammen arbeiten.

Ich komme nicht auf eine andere Lösung, als mit zwei Controllern zu arbeiten.

Controller 1
Band 1 startet Transport -> stoppt Transport wenn Paket am Ende angekommen ist -> Scannt ->
Prüft mit Lichtschranke ob Band 2 leer ist (delay bis Band 2 leer (while schleife))->schiebt Paket auf Band 2 -> Sendet Signal an Controller zwei und fängt wieder von vorne an.

Controller 2
Empfängt Signal von Controller 1 und schiebt Paket in einen Korb und wartet auf das nächste Paket / Signal.

Da auf Band 1 die Pakete zu unterschiedlichen Zeiten am Ende des Bandes ankommen können und werden - dachte ich, dass ich hier nicht mit festgelegten Zeiten arbeiten kann und zwei Controller benötige damit ich beide Bänder gleichzeitig nutzen kann - aber trotzdem in Abhängigkeit. Habe ich hier was falsch verstanden und geht das trotzdem mit millies??!?!?

Ansonsten werde ich zwei Nanos nehmen. Wie bekomme ich das Signal von einem Controller zum anderen? Interrupts?

Danke

Hi

Du kannst auch mehrere µC benutzen - es geht aber wohl auch mit nur Einem.

millis() gibt Dir die vergangene Zeit seit Start in Millisekunden zurück.
Deine Armbanduhr die Zeit in Stunden/Minuten/Sekunden seit Mitternacht.
Trotzdem kannst Du mit Deiner Armbanduhr 'in einer viertel Stunde' erst mit etwas anfangen.

Genau so funktioniert millis() - bzw. die Abfrage damit.

Da der µC alle Millisekunde durch die loop() rennt, kann Er auch alle Millisekunde nachschauen, ob bei Band 1 'mal wieder' etwas liegt.
Auch kann Er veranlassen, daß 'in 5000ms' das Paket von Band 1 nach Band 2 geschoben wird - der Schieber muß halt 'von jetzt in 5000ms' starten.
Wenn der Schieber fertig ist, kann das Band 2 auch in 3 Sekunden anlaufen.
Gleichzeitig (quasi) wird Band 1 bereits schon wieder bestromt, weil ja 'Hinten' Nichts mehr rum liegt.

Verständlich?

MfG

qiwi:
ich habe mir das "BlinkwithoutDelay" angeschaut. Ich denke, dass millis nicht das richtige für mich ist da
hier die Zeit seit dem Start vom Controller abgefragt wird.

Ich möchte hier nicht auf einen festgelegten Zeitpunkt reagieren - sondern auf ein Signal, welches die Bereitschaft von Band 2 ausgibt.

Deine Vorstellung:
Nano 1 kümmert sich um Band 1, Nano 2 kümmert sich um Band 2, beide tauschen Informationen aus. Richtig?

Alternative mit einem Prozessor:
Prozess 1 kümmert sich um Band 1, Prozess 2 kümmert sich um Band 2. Der Arduino kennt aber keine Prozessverwaltung, weshalb Du das quasi parallel realisieren mußt.

Dazu wollte ich Dir eine Hilfestellung geben, die mit den Bändern nichts zu tun hat, nur eine Vorübung sozusagen.

Übungsaufgabe: Lasse zwei LEDs unabhängig voneinander blinken.
Ziel der Übungsaufgabe: Dich gedanklich auf den richtigen Weg bringen.

Deine Vorstellung:
Nano 1 kümmert sich um LED 1, Nano 2 kümmert sich um LED 2.

Alternative mit einem Prozessor:
Prozess 1 kümmert sich um LED 1, Prozess 2 kümmert sich um LED 2. Weil blinkende LEDs eine Zeit benötigen, brauchst Du millis().

Wenn Du die Übungsaufgabe in den Griff bekommst, klappt es auch mit den Bändern :slight_smile:

Tja dann muss ich das noch einmal verinnerlichen bis es Klick macht - das hat es noch nicht.

Danke :slight_smile:

qiwi:
Wie bekomme ich das Signal von einem Controller zum anderen?

Wenn die beiden Nanos nebeneinander werkeln, kannst Du I2C verwenden, ist schon vorhanden. Bei größerem Abstand kannst Du die serielle TTL-Schnittstelle zu RS485 aufrüsten. Das hängt auch von den vorhandenen elektromegmnetischen Störungen ab. Manche Arduinos haben auch CAN-BUS auf der Platine, da fehlen mir aber praktische Erfahrungen.

qiwi:
Tja dann muss ich das noch einmal verinnerlichen bis es Klick macht - das hat es noch nicht.

Also ohne die Abläufe genau zu kennen, meine ich, dass Dein Vorhaben ganz bestimmt mit nur einem Arduino umgesetzt werden kann.

Wenn Du die Dinge, mit denen Du zu tun hast (Förderbänder, Sensoren, Aktoren, ...) in Form von Klassen formulierst, kannst Du Dich in loop() darauf beschränken, jedem Ding zu sagen, dass es seinen gerade anliegenden Job erledigen (oder mit dem nächsten Schritt fortfahren) soll. Wenn Du das immer wieder tust (wozu loop() schließlich da ist), und das saumäßig schnell geschieht, sieht es so aus, als würden mehrere Dinge gleichzeitig passieren.

Male Deinen Algorithmus bzw. Deine Algorithmen am besten als Programmablaufplan auf und sortiere, welche Aufgabe von welchem Ding erledigt wird (und wann das passiert). Die Teilaufgaben der beteiligten Dinge sind dann Methoden bzw. Funktionen der Klassen.

Gruß

Gregor

PS: Als Beispiel für eine sehr einfache Klasse kannst Du Dir mal meine Piepliothek angucken.