Guten Morgen.
Ich habe einen Arduino Mega (Controllino Maxi). Dieser steuert einen Schrottmotor von Trinamic und ein Rollo an.
Das ist u.a. auch über das Netzwerk möglich -> TCP.
Als Software für den Netzwerktest nutze ich Hercules Setup Utility.
Jetzt ist es so dass wenn ich einen Befehl sende dieser auch problemlos an den Schrottmotor weitergesendet wird wie z.B. "Fahre nach links". Dann passiert das bis der Endschalter erreicht wurde. Wurde allerdings der Endschalter Links erreicht und ich sende erneut den Befehl für "Fahre nach links" passiert nichts ABER wenn ich danach sage "Fahre nach rechts" fährt er bis zum Endschalter nach rechts und fährt dann sofort wieder nach links weil irgendwo anscheinend noch das "Fahre nach links" zwischengespeichert ist.
Ich gebe auch via Netzwerk aktuelle Meldungen auch zurück.
-Taste nach Links gedrückt
-Motor fährt nach links
-Motor ist links
Bin ich ganz links und drücke die Taste für nach links bekomme ich auch die richtige Meldung zurück und eigentlich müsste es ja dann damit getan sein. Ich leere auch den Befehlt-Puffer aber irgendwie merkt der sich das alles noch so lange bis auch der Motor den Befehl bekommen kann
Das gleiche passiert bei dem Rollo auch.
Wenn ich den Motor im "Handbetrieb" also per Tastendruck nach links fahre, bis zum Endschalter, dann wieder nach links drücke (passiert nichts), dann wieder bis zum Endschalter nach rechts fahre passiert es nicht das der Motor automatisch nach links fährt sondern nur beim Netzwerkbetrieb.
Das ist mein Netzwerkcode:
#include <SPI.h>
#include <Ethernet.h>
// Arduino Server MAC Addresse
byte mac[] = {
0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED }; // Selbst erstellte Arduino MAC Adresse
IPAddress ip(169,254,230, 5); // Selbst erstellte Arduino IP Adresse
// Arduino server port
const int port = 23;
EthernetServer server(port);
String commandStr; // Zum Speichern des Befehls vom Client
SETUP
Serial.begin(baudrate1); //Serielle Kommunikatiob beginnen
Serial2.begin(baudrate2);
Ethernet.begin(mac, ip); // Initialisierung des Ethernet-Servers
server.begin();
Serial.print("Server IP: "); // Ausgabe der IP-Adresse des Arduino-Servers am seriellen Monitor
Serial.println(Ethernet.localIP());
LOOP
EthernetClient client = server.available();
if (client.available()) {
char c = client.read(); // Zeichen bis zum Zeilenvorschub lesen
if (c != '\n') {
commandStr += c; // Erhaltenes Zeichen zu String-Variablen hinzufügen
} else {
Serial.println("Command: " + commandStr); // Den empfangenen Befehl am seriellen Monitor ausgeben
processCommand_FERN(commandStr); // Verarbeiten des empfangenen Befehls - NETZWERKBETRIEB
commandStr = ""; // Variable fuer den naechsten Befehl loeschen
}
}
Beispiel für die Ansteuerung im LOOP
if ((digitalRead(ESRO) == LOW) && (digitalRead(MORR) == LOW))
{ // Wenn Taster hoch gedrueckt und Endschalter oben nicht erreicht und Taster runter nicht gedrueckt und Endschalter Box zu erreicht und Motor Rollo hoch nicht aktive
if (Fern_TARH == 1)
{
digitalWrite(MORH, HIGH); // Motor AN
digitalWrite(TLRH, HIGH); // Taster-LED AN
server.println("Rollo faehrt hoch");
Merker_Rollo = 1;
Fern_TARH = 0;
}
}
else
{
if ((digitalRead(SSPN) == LOW) || (digitalRead(SSPV) == LOW) || (digitalRead(ESRO) == HIGH))
{ // Wenn Modus gewaechelt, Endschalter erreicht
digitalWrite(MORH, LOW); // Motor AUS
digitalWrite(TLRH, LOW); // Taster-LED AUS
Meldung_Netzwerk = 1;
}
}
if ((digitalRead(ESBA) == LOW) && (digitalRead(ESRO) == HIGH) && (digitalRead(MOBZ) == LOW))
{ // Wenn Taster rechts betaetigt und Endschalter Box auf nicht erreicht und Taster links nicht betaetigt und Endschalter Rollo oben erreicht und Motor Box zu nicht aktiviert
if ((vorlauf == 0) || (vorlauf == 2))
{ // Wenn Endschalterfehler
if (Fern_TABA == 1)
{
digitalWrite(MOBA, HIGH); // Motor AN
Motor(2 , 2, 0, 0, 150); // RECHTS AUF motor,befehl,typ,bank,wert - MOTOR 2 da an COM 2
server.println("Box faehrt auf");
Merker_Box = 2;
digitalWrite(TLBA, HIGH); // Taster-LED AN
Fern_TABA = 0;
}
}
}
else
{
if ((digitalRead(SSPN) == LOW) || (digitalRead(SSPV) == LOW) || (digitalRead(ESBA) == HIGH) || (digitalRead(ESRO) == LOW))
{ // Wenn nicht im Normal-Modus oder nicht im Vorort-Modus oder Endschalter Box auf erreicht oder Endschalter Rollo oben nicht erreicht
if (digitalRead(MOBA) == HIGH) // Wenn Motor Box Zu AN
{
digitalWrite(MOBA, LOW); // Motor AUS
Motor(2 , 3, 0, 0, 0); // STOP motor,befehl,typ,bank,wert - MOTOR 2 da an COM 2
//server.println("Box angehalten");
digitalWrite(TLBA, LOW); // Taster-LED AUS
}
}
}
AUSSERHALB (processCommand ist doppelt da ich einmal MIT und OHNE Netzwerkzugriff befehle zurück geben will)
// NETZWERKBEFEHLE UMWANDELN
void processCommand_FERN(String cmd) // TCP Befehle umsetzten
{
if (cmd == "RH") // Befehl Taste RH gedrueckt
{
char c = "";
Fern_TARH = 1;
server.println("Taste >Rollo hoch< gedrueckt");
}
if (cmd == "RR") // Befehl Taste RR gedrueckt
{
char c = "";
Fern_TARR = 1;
server.println("Taste >Rollo runter< gedrueckt");
}
if (cmd == "BA") // Befehl Taste BA gedrueckt
{
char c = "";
Fern_TABA = 1;
server.println("Taste >Box auf< gedrueckt");
}
if (cmd == "BZ") // Befehl Taste BZ gedrueckt
{
char c = "";
Fern_TABZ = 1;
server.println("Taste >Box zu< gedrueckt");
}
}
void processCommand(String cmd) // TCP Befehle umsetzten
{
if (cmd != "") // Befehl Taste RH gedrueckt
{
server.println("Aktuell kein Netzwerkzugriff moeglich");
}
}
Ich hoffe mir kann jemand weiterhelfen.
Ich dachte zuerst liegt es am Schrittmotor der via RS232 angesprochen wird aber auch das Rollo welches direkt angesprochen wird hat das gleiche Problem.
Es handelt sich hierbei um ein Projekt auf einem Steckbrett also es gibt kein Rollo sondern eine LED die AN oder AUS geht.
Den Motor gibt es allerdings und ist auch am Brett bzw. Arduino dran.
Danke vorab.