INFO: Dieses Forum nutzt Cookies...
Cookies sind für den Betrieb des Forums unverzichtbar. Mit der Nutzung des Forums erklärst Du dich damit einverstanden, dass wir Cookies verwenden.

Es wird in jedem Fall ein Cookie gesetzt um diesen Hinweis nicht mehr zu erhalten. Desweiteren setzen wir Google Adsense und Google Analytics ein.

Antwort schreiben 
 
Themabewertung:
  • 0 Bewertungen - 0 im Durchschnitt
  • 1
  • 2
  • 3
  • 4
  • 5
Linearmotor Ansteuerung
28.01.2021, 16:02
Beitrag #1
Linearmotor Ansteuerung
Hallo ins Forum Smile

ich habe ein kleines Problem mit der Ansteuerung von einem Linearmotor mit Hilfe von 2 externen Endschaltern. Rauf / bzw. Runterfahrt wird über eine Relais Schaltung realisiert.

Jetzt habe ich folgendes Problem, dass es im ersten Durchlauf funktioniert, aber nachdem der Motor einmal raufgefahren ist, beim runterfahren der Endschalter ignoriert wird...

Hat hier jemand eine Idee, oder kann mich freundlicherweise auf meinen Fehler aufmerksam machen? Huh

Benutzt wird ein normaler Arduino UNO Smile

Code:
#include <Wire.h>
int relais1 = 11;  //13
int relais2 = 10;  //12

int schalteroben = 6;
int schalterunten = 7;
int mittelschalter = 2; //auf Interrupt pin setzten...
const int wendung = 4; //Hauptschalter Wendung Pullup nötig
bool wendungstaste;

bool obenstatus;  // Statusabfrage oben false
bool untenstatus; // Statusabfrage unten
bool mittelstatus; // Statusabfrage mittel
unsigned long currentMillis;
unsigned long previousMillis = 0;
const long Interval = 60000;  // Wendungsintervall

volatile bool ISR_FLAG_AUF = 0;     // Flag für INTERRUPT_TASTER_AUF
volatile bool ISR_FLAG_ZU = 0;      // Flag für INTERRUPT_TASTER_ZU

int obenflag;  // Flags als Merker
int untenflag;
int mittelflag;


void setup() {
  // put your setup code here, to run once:
// pinMode(kontakt, INPUT);
Serial.begin (9600);

  pinMode (relais1, OUTPUT);          // Relee 1 als Augang
  pinMode (relais2, OUTPUT);           // Relee 2 als Ausgang
  pinMode (schalteroben, INPUT);      // Schalter OBEN Einang
  pinMode (schalterunten, INPUT);     // Schalter UNTEN Eingang
  pinMode (wendung, INPUT_PULLUP);    // Hauptschalter Wendung
  pinMode (mittelschalter, INPUT);    // Schalter für Mittelstellung

  attachInterrupt (0, INTERRUPT_mittelschalter, LOW); // Interrupt für Taster_AUF

}

void loop()
{
currentMillis = millis();                 // Einlesen der Kontake und Status
wendungstaste = digitalRead(wendung);
obenstatus = digitalRead(schalteroben);
untenstatus = digitalRead(schalterunten);
mittelstatus = digitalRead(mittelschalter);



// Start der Bedingung wenn Taster gedrück ist
// HIGH = Auf // LOW = ZU
//if (wendungstaste == HIGH){
//  Motor_stopp();

// Wendungstaster geschlossen, nach Unten/Rechts fahren Schalter oben und unten OFFEN.
if (wendungstaste == LOW && untenflag == false && obenflag == false){   //&& obenstatus == HIGH && untenstatus == HIGH) {
  
   while (untenstatus)
  {
  Motor_ab();
  Serial.println ("Motor faehrt nach Unten/rechts");
  untenstatus = digitalRead(schalterunten);     // Pruefung ob Untenstatus "offen"
  untenflag = true;
  }
  Motor_stopp();
  Serial.println ("Motor ist unten angekommen");
  Serial.println ("Untenflag:");
  Serial.println (untenflag);
  Serial.println ("Obenflag:");
  Serial.println (obenflag);
}

// Motor gestoppt Zeit Interval

if ( untenflag == true && (currentMillis - previousMillis>= Interval)){

  while (obenstatus)
  {
    Motor_auf();
    Serial.println ("Motor faehrt hoch");
    obenstatus = digitalRead(schalteroben);
    obenflag = true;
    untenflag = false;
  }
  Motor_stopp();
    Serial.println (" Motor vom Rauffahren gestoppt");
    previousMillis = currentMillis;
      Serial.println ("Untenflag:");
  Serial.println (untenflag);
  Serial.println ("Obenflag:");
  Serial.println (obenflag);
}
//else?
if (obenflag == true && (currentMillis - previousMillis>=Interval)){
  
    while (untenstatus)
    {    
      Motor_ab();
      Serial.println ("Motor faehrt runter");     // hier läuft das Programm nicht weiter:@
      untenstatus = digitalRead(schalterunten);
      untenstatus = true;
      obenflag = false;
    }
    Motor_stopp();
    Serial.println ("Motor vom runterfahren gestoppt");
    previousMillis = currentMillis;
      Serial.println ("Untenflag:");
  Serial.println (untenflag);
  Serial.println ("Obenflag:");
  Serial.println (obenflag);
  }
/*
  if (ISR_FLAG_ZU ==1 && wendungstaste== HIGH && untenstatus == true){
    Motor_auf();
    Serial.println ("Mitteltaste grdrückt, Motor auf");
    obenstatus = digitalRead(schalteroben);
  }
    else if (ISR_FLAG_ZU ==1 && wendungstaste == HIGH && obenstatus == true)
    {
      Motor_ab();
      Serial.println ("Mitteltaste gedrückt, Motor rauf");
      untenstatus = digitalRead(schalterunten);
  }
    //delay(1000); //Programm Durchlaufzeit?!
*/
}

//################################################
// einzelne Funktionen
//################################################

void INTERRUPT_mittelschalter()
{
  ISR_FLAG_ZU=1;
  Serial.println ("Mittelstellung gedrückt");
}
void Motor_ab()
{
  digitalWrite(relais1,HIGH);
  digitalWrite(relais2,LOW);
}

void Motor_auf()
{
  digitalWrite(relais1,LOW);
  digitalWrite(relais2,HIGH);
}

void Motor_stopp()
{
  digitalWrite(relais1,LOW);
  digitalWrite(relais2,LOW);
}
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
28.01.2021, 16:59 (Dieser Beitrag wurde zuletzt bearbeitet: 28.01.2021 17:00 von MicroBahner.)
Beitrag #2
RE: Linearmotor Ansteuerung
Code:
untenstatus = digitalRead(schalterunten);
untenstatus = true;
Da kannst Du lesen soviel Du willst, wenn Du den Status gleich wieder zu true setzt, kann der nie false werden ( und die while-Schleife wird auch nie beendet ).

Das mit dem Interrupt würde ich mir auch nochmal überlegen. Ich weis zwar nicht, wozu der 'Mittelschalter' ist, aber einen einfachen Schalter per Interrupt abzufragen ist nie eine gute Idee ( und auch nie notwendig ).

Gruß, Franz-Peter
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
28.01.2021, 18:33
Beitrag #3
RE: Linearmotor Ansteuerung
... Big Grin

ja manchmal sind doch viele Bäume im Wald, wenn man jetzt den richtigen Status/ Flag einsetzt klappt es auch sehr gut.

Vielen Dank !

Zurück zum Interrupt,

also gedacht ist wenn ich einen Schalter/ Taster drücke, dass der Motor entsprechend hoch/ runter fährt um in die Mittelstellung zu kommen.
Die Mittelstellung ist nötig, wird aber nur bei Bedarf ausgelöst, Problem ist das das Interval hinterher bei ca. 2h liegt, und ich daher an einen Interrupt gedacht.

Gibt es hier vielleicht doch noch eine elegantere Lösung?
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
28.01.2021, 21:15
Beitrag #4
RE: Linearmotor Ansteuerung
(28.01.2021 18:33)c0ntem schrieb:  Problem ist das das Interval hinterher bei ca. 2h liegt, und ich daher an einen Interrupt gedacht.
Interrupts sind genau für das Gegenteil gedacht: bei extrem kurzen Intervallen und wenn es extrem schnell gehen muss.
Bei langen Intervallen kann man das bequem im loop abfragen. Schalter prellen, und Interrupts sind so schnell, die lösen bei jedem einzelnen Prellen des Schalters aus.

Gruß, Franz-Peter
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
29.01.2021, 10:21
Beitrag #5
RE: Linearmotor Ansteuerung
ah okay, vielen Dank für den Hinweis.

So wie ich die Suche hier im Forum und Google verstanden habe, läuft Millis eh normal weiter, daher würde die Mögichkeit bestehen den Taster ganz normal im Loop abzufragen, auch wenn grade ein "Warteintervall" läuft?!
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
29.01.2021, 10:36
Beitrag #6
RE: Linearmotor Ansteuerung
Ja den Taster kann man immer im loop() abfragen.
Ganz grundsätzlich sollte man 'blockadefrei' programmieren, also den loop nie anhalten, auch während Warteintervallen nicht ( also keine längeren while-Schleifen oder delay() im loop ). Dann kann man jederzeit auf externe Ereignisse reagieren.

Gruß, Franz-Peter
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
29.01.2021, 10:42 (Dieser Beitrag wurde zuletzt bearbeitet: 29.01.2021 10:45 von Franz54.)
Beitrag #7
RE: Linearmotor Ansteuerung
"auch wenn grade ein "Warteintervall" läuft?! "

Was ist ein Warteintervall ? Ich nehme mal an, das ist das, was es bei brauchbarer Programmierung nicht gibt?

Franz

https://www.youtube.com/watch?v=Fnzn85oWM_Q
Hier was zum Thema Deutsche Politik Angry
Und hier zum Thema richtige Politik Big Grin
Webseite des Benutzers besuchen Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
29.01.2021, 17:08
Beitrag #8
RE: Linearmotor Ansteuerung
Die While Schleife, habe ich bisher nur für das Verfahren des Linearmotors genuzt, danach wäre ja die IF Abfrage über die Millis die der UNO hochzählt.

Zitat:"auch wenn grade ein "Warteintervall" läuft?! "

Was ist ein Warteintervall ? Ich nehme mal an, das ist das, was es bei brauchbarer Programmierung nicht gibt?

Ja das ist wohl so Big Grin Da hab ich mich etwas schlecht Ausgedrückt, das ist mein Zeitlicher Ablauf im Programm.. Also:

Motor verfährt, Endpunkt erreicht -> (Warteinvervall = in meinem Fall 2h) -> Motor in andere Richtung bis Endpunkt, wieder Warten usw. Wink

Und das ganze über einen Taster unterbrechen, damit man Manuel den Motor/rauf/runterfahren kann...


Schon mal vielen Dank für diese Einblicke, ich versuch jetzt nochmal die Tasterabfrage zu ändern Smile
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
Antwort schreiben 


Möglicherweise verwandte Themen...
Thema: Verfasser Antworten: Ansichten: Letzter Beitrag
  Ansteuerung Nema 17 mit Arduino Uno juergen001 21 2.808 21.06.2020 16:52
Letzter Beitrag: MicroBahner
  Servo ansteuerung TheDnator 6 2.112 28.09.2019 09:02
Letzter Beitrag: MicroBahner
  Schulprojekt Roboterarm - Ansteuerung Servomotoren in Grundstellung H3noch 5 1.642 02.06.2019 16:00
Letzter Beitrag: Tommy56
  Serielle Ansteuerung einer I2C LCD, Darstellung von Zahlen Peter05 7 2.190 21.05.2019 21:06
Letzter Beitrag: Bitklopfer
  Stepper Motor (Ansteuerung) pm96 6 3.097 30.06.2018 20:29
Letzter Beitrag: pm96
  Servo Ansteuerung SOFTHARD 23 11.276 17.10.2017 10:56
Letzter Beitrag: SOFTHARD
  Servo-Ansteuerung über einen Push-Button Aubergine83 1 1.986 16.02.2017 19:49
Letzter Beitrag: georg01
  I2C Ansteuerung einer MSM3 (elv mp3 Box) Voreifel 2 2.119 09.04.2016 17:56
Letzter Beitrag: Voreifel
  Ansteuerung von einem Relais mit einem PS2 Controller minigarage 2 2.391 11.03.2016 15:31
Letzter Beitrag: minigarage
  LCD 1602 mit PCF 8574T Ansteuerung (I2C) RCudino 25 10.486 20.01.2016 19:49
Letzter Beitrag: RCudino

Gehe zu:


Benutzer, die gerade dieses Thema anschauen: 1 Gast/Gäste