Bei Signal Eingang, eine LED für 2 Sekunden Leuchten lassen

Moin zusammen,
Ich habe ein Problem, und zwar kenne ich mch komplett 0 aus mit dem schreiben von Sketchen, und brauche auf die schnelle hilfe um ein Project umzusetzen.
Es geht darum, Ich habe ein Arduino an dem unter snderem ein Servo angeschlossen ist.
Nun möchte ich gerne das signal vom Servo Abzweigen und zu einem anderen Arduino schicken. Wenn dieser das Signal bekommt, soll für 1 bis 2 Sekunden eine LED Leuchten.
Sprich, kommt ein signal rein, lass die LED kurz leuchten und dann wieder aus.
Ist das so umzusetzen? Wenn ja, wie würde der Sketch in etwa aussehen?
Liebe Grüße, Uwe.

Poste mal den Sketch der den Servo ansteuert in Code-Tags - wie im Forum How to beschrieben.

Versuche doch einfach mal dein sog. Projekt besser zu beschreiben.
Was sind das für Arduinos ?
Welches Signal willst du übertragen ?
Wie willst du das Signal übertragen ?
Was funktioniert in deinem Projekt bisher ?

Zeige den bisherigen Sketch damit wir uns das vorstellen können.

Und ja, mit der richtigen Programmierung wird auch dein Vorhaben funktionieren.

Hallo,
ich vermute jetzt mal der zweite Arduino bekommt das Signal über einen Digitalen Eingang und die LED soll an einem digitalen Ausgang angeschlossene werden. Der erste Arduino , der mit dem Motor muss dazu eine digitalen Ausgang kurz einschalten wenn sich der Servo bewegt. MIt Servo.read() kannst du die aktuelle Position abfragen.

Also ein Ausgang des ersten ist mit einen Eingang des zweiten verbunden, und der steuert einen LED für 2sekunden an. ??
Und wozu soll das gut sein, Du kannst die LED für die Anzeige doch direkt an den ersten Arduino anschließen.

schau dir die Beispiele in der Arduino IDE an da wird gezeigt wie man Digitale Ausgäge schaltet und digitale Eingänge abfragt. Du kannst die 2s erst mal mit delay() machen, letztlich solltest Du die aber die Verwendung von millis() anschauen

Also es geht darum, das ich eine Elektrische Zigarettenstopfmaschiene habe, welche über ein Arduino Uno R3 Gesteuert wird. Da auf diesem Arduino schon alle ausgänge belegt sind, wollte ich ein Zweiten Arduino (ein Arduino Nano) einbauen und ein Signal vom Uno Abgreifen, damit er einen kleinen Vibromotor für 2 Sekunden Ansteuert damit die Hülsen besser Nachrutschen. Das mit der LED habe ich zum Verständnis hingeschrieben, da es wohl kein unterschied macht ob ich da eine LED oder Ein Vibromotor dran habe. Den Sketch für die Stopfmaschiene habe ich im Netz runter geladen, und hätte auch da keine ahnung wie ich da was umschreiben könnte das dies funktioniert, daher bin ich auf diese Idee gekommen.
Wie ich schon erwähnt habe, habe ich absolut keine Ahnung von Arduino Programieren, da ich sonst nie was mit Arduino mache. Wenn es einfacher ist, könnte ich auch ein Signal von einem IR Sensor abzweigen oder von einem Hallsensor. Aber wie schon gesagt, ich habe 0 Ahnung von der Matherie und brauche eigendlich nur ein Sketch der bei signal eingang, ein 2 Sekunden signal wieder ausgibt.

Bei einem UNO R3 kanst auch alle Analog Pins als Digitale nutzen, oder einen Portexpander nehmen, so was ist beser als zweiter Ardunio, gerade für Anfänger

1 Like

Dann zeig den doch einfach mal :face_with_diagonal_mouth:

Nicht immer, je nach dem was für Strom der braucht, normaler weise sollte man keine induktive lasten direkt auf die Pins klemmen, sonst ist der Pin, unter umständen auch Arduino sehr schnell defekt

Warum ein zweiter Arduino, nur um eine LED leuchten zu lassen?

Ok alle Ausgänge belegt. Was hängt denn da alles dran?

Das dein Vergleich hinkt, wurde dir ja schon geschrieben. Zudem brauchst du für einen Motor eine Freilaufdiode.
Und wenn der eine Uno zu wenig Pins hat, kannst du auch eine Erweiterung mit einem I2C-Portexpander anbauen. Dann bekommst du weitere (8-16) Pins zur Nutzung. Da muss es nicht unbedingt ein weiterer Arduino sein, auch wegen evtl. Platzmangel.

Ich Poste mal den Code, der Diesbezüglich schon mal geändert worden ist, allerdings sobald ich diesen aufspiele, dreht mein Stepper motor total durch. daher wollte ich den Original Code wieder verwenden da der Super funktioniert, nur halt ohne Vibro motor. Die änderungen sind in Zeile 84 bis 96

/*Note:
V2.4
- fix Errorhandling: 2. Check auf Hülse nach 100ms, falls nach 20ms noch keine da ist. Dann erst Errorhandling. (Michaels Hülsensensor macht scheinbar Probleme)

V2.3
- fix Errorhandling: 
  Variable Huelsedrauf nicht false gesetzt wenn Errorhandling

V2.2
- fix Errorhandling:
  Einfahren des Füllstabs nach Errorhandling durch PM3 nur dann, wenn Endschalter aus ist, damit die PM3 im Fehlerfall nicht gestartet wird.

V2.1
- fix Errorhandling:
  Zum Einfahren des Füllstabs wird jetzt die PM3 gestartet, die dann das Einfahren übernimmt. Bei mehrmaligen Fehlern kam es vor, dass der Stab bei Zeitsteuerung nicht mehr 
  an den Ausgangszustand zurückgekehrt ist, sondern knapp daneben und somit der Endschalter der PM3 aus war.

V2.0
- Errorhandling eingabaut. Variablen ErrorEjectTime (550) und MaxErrors (3) definieren das Verhalten im Fehlerfall (wenn also keine Hülse erkannt wurde)

V1.1
- Aus- und Einfahren des Füllstabs nach dem Stopfen. Variable EjectTime definiert, wie lange der Stab bewegt wird


*/
#include <Servo.h>
#include "Arduino.h"
#include "Trommel.h"
#include "LED.h"

//Trommel-------------------------------------------------------------------------
//Wieviele schritte der motor braucht für eine komplette umdrehung
//mit einem Schrittmotor der 200(1.8 Grad pro schritt) schritte braucht für eine umdrehung:
//200 ohne microstepping, 400 mit 1/2 microstepping, 800 mit 1/4 microstepping usw.
#define StepperStepsPR 800
//drehrichtung vom motor. 0 = gegen uhrzeigersinn, 1 = mit uhrzeigersinn
#define StepperDir 1
//Wie schnell der motor drehen soll
//kleinerer wert = schneller(min. 100), höher = langsamer
#define StepperSpeed 2000
//falls die position der Trommel nicht ganz stimmt
//Dann macht der motor soviele Schritte mehr, es sind auch negative zahlen erlaubt
//Dreht sie nicht weit genug positive zahl, dreht sie zu weit negative zahl
#define TrommelPosKorrektur 4

//Servo Laden-------------------------------------------------------------------------
//Die Servo anfangs position und end position in Grad
//min. 0, max. 180.   7-8 Grad entsprechen etwa 1mm.
#define ServoLadenAnfangPos 1
#define ServoLadenEndPos 180
//Wie schnell der Servo drehen soll
//2 = min. um so höher die zahl um so langsamer, 10 ist schon ziemlich langsam
#define ServoLadenSpeed 3

//Servo Start-------------------------------------------------------------------------
//gibt an ob ein Servo für start drücken an der PM verwendet wird oder
//der PowerMatic start knopf angeklemmt wurde
//0 = ohne servo, 1 = mit servo
#define ServoStartEnable 0
//Die Servo anfangs position und end position in Grad
//min. 0, max. 180
#define ServoStartAnfangPos 2
#define ServoStartEndPos 45
//Wie schnell der Servo drehen soll
//2 = min. um so höher die zahl um so langsamer, 10 ist schon ziemlich langsam
#define ServoStartSpeed 2

//IR TCRT5000-----------------------------------------------------------------
//0 = ohne IR sensor, 1 = mit IR sensor
#define IREnable 1


//LED-------------------------------------------------------------------------
//0 = aus(min.),  255 = Hell(max.)
#define LEDHelligkeit 20








// Änderung Daniel
#define pinAuswurf 3
#define pinEinzug 10 // Pin 10 und 11 getauscht! Hier war vorher PIN11!!!!!!!
#define EjectTime 470
#define ErrorEjectTime 550
#define MaxErrors 3
#define VibrationTime 2000 // Timer für Vibrationsmodule, hier 1000 = 1 Sekunden
#define VibrationPin 11 // Geht nur, wenn kein Start-Servo verwendet wird! (Hier war vorher PIN10!!!!!)
#define VibSpeed 100 // Vibrationsgeschwindigkeit
uint8_t ErrorCounter = 0; 
// int VibrationRunsSince = 0; >> Original, geänderte Zeile mit "long"
long VibrationRunsSince = 0;
// Änderung Ende







//..............Servo..............
Servo servoLaden;
Servo servoStart;
#define pinServoLaden 9
#define pinServoStart 10
//..............Schrittmotor..............
#define pinStepperDir 13
#define pinStepperStep 12
//..............Taster..............
#define pinTasterStop 6
#define pinTasterStart 7
//..............NeoPixel LED..............
#define pinNeoPixel 1
//..............PowerMatic..............
#define pinEndschalter 2
#define pinPMStart 5
//..............Trommel Schalter..............
#define pinTrommelEndschalter 8
//..............IR sensor..............
#define pinIRd 4



clsLED LED(pinNeoPixel, LEDHelligkeit);
clsTrommel Trommel(pinStepperDir, pinStepperStep, pinTrommelEndschalter, StepperStepsPR, 
                   StepperSpeed, StepperDir, TrommelPosKorrektur);

bool ServoLadenAnfangPosOK = false;  //hat nur true wenn der servo an der anfangs position ist
bool ServoStartAnfangPosOK = false;  //hat nur true wenn der servo an der anfangs position ist


void setup() 
{
  //Serial.begin(9600);
  pinMode(pinTasterStart, INPUT_PULLUP);
  pinMode(pinTasterStop, INPUT_PULLUP);

  pinMode(pinEndschalter, INPUT);
  if(IREnable) pinMode(pinIRd, INPUT);

//Änderung Daniel
  pinMode(pinAuswurf,OUTPUT); 
  pinMode(pinEinzug,OUTPUT); 
  pinMode(VibrationPin,OUTPUT); 
  digitalWrite(pinAuswurf, LOW);
  digitalWrite(pinEinzug, LOW);
//Änderung Ende

  if(ServoStartEnable)
  {
    servoStart.attach(pinServoStart);
    while(!runStartServo(ServoStartAnfangPos)){} //sicher stellen das der servo in der richtigen pos. ist
  }else{
    ServoStartAnfangPosOK = true;
    pinMode(pinPMStart, OUTPUT);
  }

  servoLaden.attach(pinServoLaden);
  while(!runLadenServo(ServoLadenAnfangPos)){} //sicher stellen das der servo in der richtigen pos. ist

  Trommel.begin();
  LED.begin();

  delay(10);
 // VibrationStart();
 digitalWrite(VibrationPin, LOW);
}

void loop()
{
  static enum {AUS, EIN, AUSRICHTEN, STEPPER, LADEN, STOPFEN, FEHLER} zustand = AUS;
  static bool OneCycle = false;
  static bool HuelseDrauf = false;
  uint8_t tmpTasterPressed = 0;
  VibrationTimeCheck();

  tmpTasterPressed = checkTaster(true);

  switch(zustand)
  {
    case AUS:
      VibrationTimeCheck();
      switch(tmpTasterPressed)
      {
        case pinTasterStop:  
          Trommel.trommelPosOK(true);
          zustand = AUSRICHTEN;  
          break;
        case pinTasterStart:
          if(Trommel.trommelPosOK(false) && ServoLadenAnfangPosOK && ServoStartAnfangPosOK) 
            {zustand = EIN;}
          break;
        default: 
          if(Trommel.trommelPosOK(false) && ServoLadenAnfangPosOK && ServoStartAnfangPosOK)
            {LED.setFarbe(clsLED::ROT);}
          else
            {LED.blink(250, clsLED::ROT);}
      }
      break;
    case EIN:
      zustand = STEPPER;
      break;
    case AUSRICHTEN:     
      LED.setFarbe(clsLED::BLAU);
      if(ServoStartEnable)
      { 
        if(!runStartServo(ServoStartAnfangPos)) break;
      }

      if(runLadenServo(ServoLadenAnfangPos))
      {
        if(!Trommel.trommelPosOK(false))
        {
          if(Trommel.move45Grad()) zustand = AUS;
        }else{
          zustand = AUS;
        }
      }
      break;
    case STEPPER:
      VibrationTimeCheck();
      if(Trommel.move45Grad())  //Schrittmotor 45Grad drehen
      {
        if(Trommel.trommelPosOK(false))   //prüfen ob pos. erreicht wurde
        {
          zustand = LADEN;
        }else{
          zustand = FEHLER;
        }
      }
      break;
    case LADEN:
        if(!HuelseDrauf)
        {
          if(runLadenServo(ServoLadenEndPos))   //Zigihülse ganz reinstecken
          {
            HuelseDrauf = true;
            if(!IREnable) break;

            delay(20);

            if(digitalRead(pinIRd) == HIGH) //Daniel: Hülse nicht drauf
            {
			        delay(100);
			        if(digitalRead(pinIRd) == HIGH)
			        { //nochmal warten und erneuter Hülsencheck
				        HuelseDrauf=false;
				        if (ErrorCounter<MaxErrors-1)
				        {
					        while(ServoLadenAnfangPosOK == false)  // warte bis der Servo wieder am Anfang ist
					        {
						        runLadenServo(ServoLadenAnfangPos); //Erstmal den Servo zurück auf Anfang!
					        }
					        digitalWrite(pinAuswurf, HIGH);   // Eventuell zerquetschte Hülse abwerfen
					        delay(ErrorEjectTime);
					        digitalWrite(pinAuswurf, LOW);
					        delay(20);
					        if (!checkEndschalter())              
					        {
						        digitalWrite(pinPMStart, HIGH);   //Wenn der Stab so weit rausfährt, kann es sein, dass der Endschalter nicht an ist
						                                  //wenn es über timing zurückgeht. Daher überlassen wir das einfach der PM3 und starten sie
						        delay(20);                        //damit sie den Stab selbst zurückholt.
						        digitalWrite(pinPMStart, LOW);
					        }
 
					        while (!checkEndschalter())
					        { // Warten, bis die PM3 wieder bereit ist
					        }  
					        zustand = STEPPER;
					        ErrorCounter++; // Fehlercounter erhöhen
				        }
				        else
				        {
					        HuelseDrauf = false;
					        zustand = FEHLER;
				        }
			        }
			      }
    		  } 
        }
        else
        {
          if(runLadenServo(ServoLadenAnfangPos))   //servo in ausgangs pos. zurückdrehen
          {
            ErrorCounter=0;
            HuelseDrauf = false;
            zustand = STOPFEN;
            VibrationStart();
          }
        }
      break;
    case STOPFEN:
      VibrationTimeCheck();
      switch(StopfMaschine(false, tmpTasterPressed))
      {
        case 0:
          zustand = FEHLER;
          break;
        case 2:
          if(OneCycle)
          {
				    // Änderung Daniel:
				    delay(300);
				    Auswurf();
				    zustand = AUS;
			    }
          else
          {
				    // Änderung Daniel:
				    delay(300);
				    Auswurf();
				    zustand = STEPPER; // Nächste zigi machen
			    }
          break;
      }
      break;
    case FEHLER:
    VibrationTimeCheck();
		LED.blink(250, clsLED::ROT);
		if(tmpTasterPressed == pinTasterStop)
		{	
			StopfMaschine(true, tmpTasterPressed);
			HuelseDrauf = false;
			ErrorCounter=0;
			zustand = AUSRICHTEN;
		}
      break;
  }

  if(zustand != AUS && zustand != AUSRICHTEN && zustand != FEHLER)
  {
    switch(tmpTasterPressed)
    {
      case pinTasterStop:
        if(OneCycle && zustand != STOPFEN) 
        {
          zustand = FEHLER;
        }else{ 
          OneCycle = true;
          LED.setFarbe(clsLED::ORANGE);
        }
        break;
      case pinTasterStart:
        OneCycle = false;
        LED.setFarbe(clsLED::GRUEN);
    }
  }
}


//rückgabe wert: 0 = fehler,  1 = noch nicht fertig, 2 = fertig
uint8_t StopfMaschine(bool resetZustand, uint8_t &tmpTasterPressed) 
{
  static enum { AUS, EIN, START, STOPFEN, FEHLER } zustand = AUS;
  static bool ServoEndPosOk = false;

  if(resetZustand)
  {
    zustand = AUS;
    ServoEndPosOk = false;
    return 2;
  }

  if(!ServoStartEnable)
  {
    if(zustand == START || zustand == STOPFEN)
    {
      //falls die PM die HOPPER meldung hat oder die PM pausieren will
      if(tmpTasterPressed == pinTasterStart)  
      {
        digitalWrite(pinPMStart, HIGH);   //Signal an die PM senden
        delay(20);
        digitalWrite(pinPMStart, LOW);

        tmpTasterPressed = 0; //Löschen damit in der loop nix passiert
      }
    } 
  }

  switch (zustand) 
  {
  case AUS:
    if (checkEndschalter()) 
      {zustand = EIN;}
    else 
      {zustand = FEHLER;}
    break;
  case EIN:
    if(ServoStartEnable)
    {
      if(!ServoEndPosOk)
      {
        if(runStartServo(ServoStartEndPos)) ServoEndPosOk = true;
      }else{
        if(runStartServo(ServoStartAnfangPos)) 
        {
          ServoEndPosOk = false;
          zustand = START;
        }
      }
    }else{
      digitalWrite(pinPMStart, HIGH);   //Signal an die PM senden zum Starten
      delay(20);
      digitalWrite(pinPMStart, LOW);
      zustand = START;
    }
    break;
  case START:
    if (!checkEndschalter()) zustand = STOPFEN;
    break;
  case STOPFEN:
    if (checkEndschalter()) 
    {
      zustand = AUS;
      return 2;
    }
    break;
  case FEHLER:
    zustand = AUS;
    return 0;
  }
  return 1;
}




bool runLadenServo(uint8_t endWinkel)
{
  static unsigned long prevMillis = 0;
  static uint8_t istWinkel = 0;
 
  if(millis() - prevMillis >= ServoLadenSpeed)
  {
    prevMillis = millis();
    if(istWinkel == endWinkel) 
    {
      if(istWinkel == ServoLadenAnfangPos)
        {ServoLadenAnfangPosOK = true;}
      else
        {ServoLadenAnfangPosOK = false;}

      return true;
    }else{
      if(istWinkel < endWinkel)
        {istWinkel += 1;}
      else
        {istWinkel -= 1;}
      
      ServoLadenAnfangPosOK = false;
      servoLaden.write(istWinkel);
    }
  }
  return false;
}

bool runStartServo(uint8_t endWinkel)
{
  static unsigned long prevMillis = 0;
  static uint8_t istWinkel = 0;
 
  if(millis() - prevMillis >= ServoStartSpeed)
  {
    prevMillis = millis();
    if(istWinkel == endWinkel) 
    {
      if(istWinkel == ServoStartAnfangPos)
        {ServoStartAnfangPosOK = true;}
      else
        {ServoStartAnfangPosOK = false;}

      return true;
    }else{
      if(istWinkel < endWinkel)
        {istWinkel += 1;}
      else
        {istWinkel -= 1;}
      
      ServoStartAnfangPosOK = false;
      servoStart.write(istWinkel);
    }
  }
  return false;
}


uint8_t checkTaster(bool delayEin)
{ 
  static unsigned long prevMillis = 0;
  static bool isTasterPressed = false;

  //Tasten überprüfung alle 50 millisek.  20x die sek.
  if(millis() - prevMillis >= 50 || !delayEin)
  {
    prevMillis = millis();

    if(digitalRead(pinTasterStart) == LOW)
    {
      if(isTasterPressed && delayEin) return 0;
      isTasterPressed = true; 
      return pinTasterStart;
    }else if(digitalRead(pinTasterStop) == LOW)
    {
      if(isTasterPressed && delayEin) return 0; 
      isTasterPressed = true; 
      return pinTasterStop;
    }else{
      isTasterPressed = false;
      prevMillis += 50;
    }
  }
  return 0;
}


bool checkEndschalter()
{
  static unsigned long prevMillis = 0;
  static bool lastState = false; 
  
  if(millis() - prevMillis >= 50)
  {
    prevMillis = millis();
    if(digitalRead(pinEndschalter) == HIGH)
      {lastState = true;}
    else
      {lastState = false;}
  }
  return lastState;
}

//Änderung Daniel
void Auswurf()
{
	digitalWrite(pinAuswurf, HIGH);   //Signal an die PM senden zum Starten
    delay(EjectTime);
    digitalWrite(pinAuswurf, LOW);
    delay(20);
    digitalWrite(pinEinzug, HIGH);   //Signal an die PM senden zum Starten
    delay(EjectTime);
    digitalWrite(pinEinzug, LOW);
    delay(20);
}

void VibrationStart()
{
  if (VibrationRunsSince == 0)
  {
    VibrationRunsSince = millis();
//    digitalWrite(VibrationPin, HIGH);
    analogWrite(VibrationPin, VibSpeed); //Test mit reduzierter Geschwindigkeit des Vib Motors
  }
}

void VibrationTimeCheck()
{
  if (millis() > VibrationRunsSince+VibrationTime)
  {
  digitalWrite(VibrationPin, LOW);
  VibrationRunsSince = 0;
  }
}

Wie ich es sehe, hast du Pin 10 doppelt belegt.
Und du hast die analogen Pins ungenutzt.
Die kannst du auch als digitale Pins verwenden. Wurde dir auch schon geschrieben.

Ich sagte ja, ich kenne mich kein bischen aus mit der Materie, wiso ist Pin 10, 2 mal belegt?
Könnte es sein das Pin 10 für einen zweiten Servo vorgesehen ist, den man allerdings ausschalten kann? Könnte das dass problem sein das bei mir der Stepper spinnt?

Weil lt. deiner Beschreibung, das von dir so belegt wurde. Ob das dein Problem mit dem Stepper ist, kann ich nicht sagen.
Das muss man tiefer einsteigen.

Weiterhin ist Pin 1 belegt, was ebenso zu Problemen führen kann, da dieser Pin vom USB-Baustein belegt ist uns so deinen Upload stören kann.

Wie du siehst, viele Probleme. Somit solltest es lernen, wenn du im Projekt voran kommen möchtest. Oder du wartest, bis dir einer alles repariert.

#define pinEinzug 10 // Pin 10 und 11 getauscht! Hier war vorher PIN11!!!!!!!
#define pinServoStart 10

Ja!
Wie oben habe geschrieben wen du ein UNO hast kannst Analoge Pins als Digital

Wie könnte ich das denn jetzt am sinnvollsten anstellen das ich den Pin 10 frei bekomme?denn da ist ja wenn nur ein Servo definiert der aber nicht aktiviert ist. Das wird wohn nicht so einfach sein wenn ich das richtig sehe :frowning:

in dem du zB

#define pinAuswurf 3

zu

#define pinAuswurf  A0 // oder 14 

machst.

Schreibe mall was alles an den Pins hängt, gehe nach der Verkabelung und mach eine Liste, sonst kommst alleine nicht drauf was und wo hängt.
Das ganze ist ziemlich unübersichtlich noch dazu die großen Pausen im Sketch, es ist kaum zum lesen.

Doch, dir wurde schon alles dazu geschrieben. Du musst dir nur ein wenig Mühe geben.
Schreibe dir mal auf, welche Pins belegt sind und womit.
Dan n wird es auch für dich übersichtlicher.

Wichtig, zeige mal link zum Vibrator, was für einer das ist.
Es scheint auszusehen das es so ein Projekt irgend wo gibt, und Du hast das nur übernommen, wen ja dann bitte Link