Forum

Einloggen | Registrieren | RSS  

Offroad GTI(R)

17.11.2025,
11:59
 

Arduino Programmierung "speciale" (Elektronik)

Ich habe da mal wider ein Programmierproblem.

Grindstone war mitte des Jahres ja schon so freundlich, mir ein Programm zu schreiben. Dieses Programm soll jetzt noch erweitert werden.
Das Hauptproblem besteht darin, dass die verschiedenen Betriebsmodi nur über zwei Digitalausgänge der übergeordneten SPS codiert werden können.

Hier erst mal eine verbale Beschreibung (ich weiß, ein Timing-Diagramm wäre besser und kann ich auch nachreichen).

1) Automatik-Betrieb
Zunächst mal soll über SPI ein BCD-Schalter ausgelesen werden (dafür habe ich schon ein Sketch, welches eingebunden werden kann) welcher die Anzahl der Impulse vorgibt.
Wenn über START ein kurzer Impuls kommt, sollen die entsprechende Anzahl an Impulsen (mit einem bestimmten ganzzahligen Faktor multipliziert) an den Schrittmotortreiber ausgegeben werden. Der Binärausgang für die Drehrichtung soll dabei auf 0 bleiben (ist nur eine willkürliche Festlegung). Nachdem alle Impulse ausgegeben wurden, soll über den Binärausgang ENDE ein kurzer Impuls an die SPS zurück gegeben werden.
Wenn über START zwei kurze Impulse kommen, soll auch die entsprechende Anzahl an Impulsen an den Schrittmotor ausgegeben werden. Der Binärausgang für die Drehrichtung soll dabei aber auf 1 für die andere Drehrichtung wechseln und es soll auch wieder eine Rückmeldung an die SPS erfolgen.

2) Hand-Betrieb
Der Digitaleingang HAND wird von der SPS auf 1 gesetzt und es kommt (mit kurzer Verzögerung) von START ein Impuls, soll der Digitalausgang für die Impulse zum Schrittmotor so lange 'laufen', wie HAND auf 1 steht. Wie im Automatik-Betrieb soll der Binärausgang für die Drehrichtung dabei auf 0 bleiben.
Wenn über START dann zwei kurze Impulse kommen soll das gleiche passieren, nur auch wieder in die andere Richtung.

Ich wüsste zumindest keine andere Variante, wie diese Funktionen sonst mit nur zwei Eingängen realisiert werden könnten.
Bei diesem Lastenheft wüsste ich schon gleich gar nicht, wie ich mit der Programmierung anfangen sollte... :lookaround:

Vielleicht kann der Kollege Schleifstein ja nochmal helfen (gerne auch gegen eine Aufwandsentschädigung) :-)
Gruß, Mathias

bigdie(R)

17.11.2025,
19:26

@ Offroad GTI

Arduino Programmierung "speciale"

Ohne das ich Ahnung vom Arduino habe, aber mit 2 SPS ausgängen kannst du seriell auch kBytes übertragen.
Nehmen wir mal an, du willst 1 Byte übertragen, dann gibt ein Ausgang den Start und der andere , das Byte. Weis nicht, wie schnell die Ausgänge können, aber angenommen die können 1/10 tel s. Dann dauert die Übertragung 0,8s Das 1. Bit gibt dann z.B. die Richtung vor und die anderen 7 dann die anzahl der Schritte von 0-128. Im Prinzip geht das auch mit einem Ausgang z.B. 0,3s H bedeitet Start und danach kommen in 0,1s Abstand die 8 Bits oder auch mehr

bastelix(R)

17.11.2025,
23:29

@ bigdie

Arduino Programmierung "speciale"

» Ohne das ich Ahnung vom Arduino habe, aber mit 2 SPS ausgängen kannst du
» seriell auch kBytes übertragen.
Wenn die SPS irgendwas fertiges wie I2C schon dabei hätte wäre es noch einfacher. Da gibt es für fast jedes Bus-System was fertiges für Arduino.

bigdie(R)

18.11.2025,
07:46

@ bastelix

Arduino Programmierung "speciale"

» » Ohne das ich Ahnung vom Arduino habe, aber mit 2 SPS ausgängen kannst
» du
» » seriell auch kBytes übertragen.
» Wenn die SPS irgendwas fertiges wie I2C schon dabei hätte wäre es noch
» einfacher. Da gibt es für fast jedes Bus-System was fertiges für Arduino.
Hab noch keine SPS mit I2C gesehen. Profibus, Modbus, Industrial Ethernet, Asibus, aber was will man mit I2C, der geht doch nur cm weit Einige können noch RS485 oder RS232.
Meine geliebte Logo kann nur Siemens Kommunikation und ModBus:-D

Offroad GTI(R)

18.11.2025,
08:33

@ bigdie

Arduino Programmierung "speciale"

» Meine geliebte Logo
Genau so eine ist es und noch nicht mal eine neue. Sie SPS zu nennen ist schon fast zuviel der Ehre :-D
Insofern sind die bisherigen Vorschläge leider nicht umzusetzen und würden die ganze Sache nur noch weiter verkomplizieren.

grindstone(R)

E-Mail

Ruhrpott,
18.11.2025,
12:20
(editiert von grindstone
am 18.11.2025 um 12:36)


@ Offroad GTI

Arduino Programmierung "speciale"

» Vielleicht kann der Kollege Schleifstein ja nochmal helfen (gerne auch
» gegen eine Aufwandsentschädigung) :-)

Gerne. (Und ohne Aufwandsentschädigung, ich mache das rein aus Spaß an der Freude :-) ).
Wenn du mir zur Gedächtnisauffrischung vielleicht den Namen des damaligen Threads nennen könntest (oder noch besser einen Link darauf setzen)?

EDIT: OK, hat sich erledigt. Ich habe den Thread wiedergefunden.
https://www.elektronik-kompendium.de/forum/board_entry.php?id=327275&da=ASC&page=0&category=all&order=last_answer&descasc=desc&be_page=0

--
Es ist unter der Würde eines Technikers, die Gebrauchsanweisung zu lesen!

Offroad GTI(R)

18.11.2025,
13:17

@ grindstone

Arduino Programmierung "speciale"

» » Vielleicht kann der Kollege Schleifstein ja nochmal helfen (gerne auch
» » gegen eine Aufwandsentschädigung) :-)
»
» Gerne. (Und ohne Aufwandsentschädigung, ich mache das rein aus Spaß an
» der Freude :-) ).

Da kann ich ja gar nicht genug danken :ok:

Dies ist der Code für den BCD-Schalter (wird über einen Parallel-SPI-Wandler MCP23017 ausgelesen)

#include "Wire.h"
byte GPIOA, GPIOB, dig1, dig2, dig3, dig4;

void setup()
{
Wire.begin(); // start up I2C bus
}
void loop()
{
// Bank A auslesen
Wire.beginTransmission(0x20);
Wire.write(0x12);
Wire.endTransmission();
Wire.requestFrom(0x20, 1);
GPIOA=Wire.read();
// Bank B auslesen
Wire.beginTransmission(0x20);
Wire.write(0x13);
Wire.endTransmission();
Wire.requestFrom(0x20, 1);
GPIOB=Wire.read();
//einzelne Digits 'bit-shiften'
dig4=GPIOB >> 4;
dig3=GPIOB & B00001111;
dig2=GPIOA >> 4;
dig1=GPIOA & B00001111;
}

Hier noch das Timing-Diagramm. Ein START-Impuls wird bestimmt 100ms lang sein (da die LOGO nicht die Schnellste ist)

grindstone(R)

E-Mail

Ruhrpott,
18.11.2025,
14:19

@ Offroad GTI

Arduino Programmierung "speciale"

» wird über einen
» Parallel-SPI-Wandler MCP23017 ausgelesen
MCP23017 oder MCP23S17?
SPI wäre der MCP23S17. Der MCP23017 hat eine I²C-Schnittstelle (siehe https://www.alldatasheet.com/datasheet-pdf/view/195324/MICROCHIP/MCP23017.html ).

--
Es ist unter der Würde eines Technikers, die Gebrauchsanweisung zu lesen!

Offroad GTI(R)

18.11.2025,
14:55

@ grindstone

Arduino Programmierung "speciale"

» Der MCP23017 hat eine I²C-Schnittstelle
Richtig, hatte ich verwechselt.

grindstone(R)

E-Mail

Ruhrpott,
18.11.2025,
14:57

@ Offroad GTI

Arduino Programmierung "speciale"

» » Der MCP23017 hat eine I²C-Schnittstelle
» Richtig, hatte ich verwechselt.
Und welcher von den Beiden ist es jetzt?

--
Es ist unter der Würde eines Technikers, die Gebrauchsanweisung zu lesen!

Offroad GTI(R)

18.11.2025,
15:10

@ grindstone

Arduino Programmierung "speciale"

» » » Der MCP23017 hat eine I²C-Schnittstelle
» » Richtig, hatte ich verwechselt.
» Und welcher von den Beiden ist es jetzt?
Der MCP23017. Das angehängte Sketch funktioniert auch schon.

grindstone(R)

E-Mail

Ruhrpott,
18.11.2025,
17:18

@ Offroad GTI

Arduino Programmierung "speciale"

» Das angehängte Sketch funktioniert auch schon.
Den Sinn des bit-shiftens verstehe ich allerdings nicht. Du isolierst von beiden Banks jeweils die hochwertigen Nibbles und teilst sie durch 16. Ich gehe mal davon aus, dass das mit dem verwendeten BCD-Schalter zusammenhängt.

--
Es ist unter der Würde eines Technikers, die Gebrauchsanweisung zu lesen!

Offroad GTI(R)

18.11.2025,
18:35

@ grindstone

Arduino Programmierung "speciale"

» gehe mal davon aus, dass das mit dem verwendeten BCD-Schalter
» zusammenhängt.
Das ist ein ganz klassischer BCD-Schalter (genau genommen drei Stück). Es wird mit dem Bit-Shiften nur der Wert des jeweiligen Schalters extrahiert, daher auch die Umwandlung in eine Dezimalzahl. Der Teil des Codes war hauptsächlich für die serielle Ausgabe zu Kontrollzwecken vorgesehen (welche ich hier aber schon entfernt habe um es übersichtlicher zu bekommen).

bastelix(R)

18.11.2025,
22:14

@ bigdie

Arduino Programmierung "speciale"

» Hab noch keine SPS mit I2C gesehen.
Ok, gibt es wenn die SPS ein Raspberry PI ist und die restlichen Suchtreffer drehen sich darum wie man einen ModBus-I2C-Adapter baut. :-D

» Meine geliebte Logo kann nur Siemens Kommunikation und ModBus:-D
Da gibt es was fertiges: https://github.com/arduino-libraries/ArduinoModbus
Benötigt aber noch etwas extra Hardware für den Arduino.

bastelix(R)

18.11.2025,
22:30

@ Offroad GTI

Arduino Programmierung "speciale"

» Insofern sind die bisherigen Vorschläge leider nicht umzusetzen und
» würden die ganze Sache nur noch weiter verkomplizieren.

Also du hast zwei Leitungen zwischen Arduino und SPS.
Die BCD-Schalter und der Schrittmotortreiber hängen am Arduino.

Leitung 1 Logo -> Arduino
Leitung 2 Logo <- Arduino

Du hast folgende Befehle zum Arduino:

Schalter auslesen und Motor ansteuern, Drehrichtung 0
Schalter auslesen und Motor ansteuern, Drehrichtung 1
Dauerbetrieb Schalter auslesen und Motor ansteuern, Drehrichtung 0
Dauerbetrieb Schalter auslesen und Motor ansteuern, Drehrichtung 1
Dauerbetrieb Ende

Und dann die Rückmeldung zur Logo:

Fertig

Ich würde so codieren wie bigdie vorschlägt, über eine Leitung. Wenn das Timing für die Logo zu schnell ist kannst du das ja auch beliebig ausdehnen. Also statt 0,3s HIGH auf 1s HIGH gehen oder so. Der Rückkanal zur SPS ist dann einfach kurz HIGH für "Fertig". Verstehe nicht was gegen den Ansatz sprechen sollte.

grindstone(R)

E-Mail

Ruhrpott,
19.11.2025,
09:30
(editiert von grindstone
am 19.11.2025 um 09:54)


@ Offroad GTI

Arduino Programmierung "speciale"

» Das ist ein ganz klassischer BCD-Schalter (genau genommen drei Stück).
Also drei Schalter mit je 4 Ausgängen und 10 Stellungen (von 0 bis 9), je einer für Hunderter / Zehner / Einer, so wie ich es verstehe.
Übertragungstechnisch braucht man für die Drehrichtung nicht unbedingt eine extra Leitung. Man kann das auch so lösen, dass man für die eine Drehrichtung positive Werte sendet und für die andere Drehrichtung negative (=höchstwertiges Bit gesetzt).

@Offroad GTI: Mir ist ehrlich gesagt nicht ganz klar, wie die Komponenten verdrahtet sind. Könntest du eine Skizze hochladen?

--
Es ist unter der Würde eines Technikers, die Gebrauchsanweisung zu lesen!