Arduino / pinMode

Hallo,

zum einen weil es Pins Spart, wenn Eingänge mit feedback verwendet werden. So kann ich zum beispiel einen Taster zum einschalten einer Maschine mit einer Lampe koppeln die solange Leuchtet wie die Maschine läuft. Ich arbeite in der Lift Technik und dort ist das Standart.

LG Turgut

PS: Bei 30 Motoren macht das schon einen Unterschied ob ich 30 oder 60 Pins brauche.

Pins sparen braucht man bei µC im Gegensatz zu den meisten SPS nicht. Hier heißt es nicht, wenn 5 Eingänge mehr benötigt werden, einmal bitte 100€ für die nächste Karte.

Mittels Port Expander, Shiftregister hönnen die Ausgänge/ Eingänge fast beliebig erweitert werden.
Ich finde es sinnvoller Ausgänge von Eingängen zu trennen.
Grüße Uwe

temucin:
Wenn der Taster betätigt wird soll die Last für eine Zeit X vom Arduino gehalten werden.
Der knackpunkt ist ...... Galvanisch getrennt und über einen Pin.

Oh, oh. Das mit dem "nur über einen Pin" ist so gar nicht typisch für Mikrocontrollerschaltungen.

Denn Deine "Selbsthaltung", die Du mit dem Schalter programmieren möchtest, kann dann hinterher nicht mehr mit demselben Schalter wieder aufgehoben/ausgeschaltet werden. Das kann dann bei Deinem Vorhaben nur noch der Mikrocontroller von sich aus machen.

Vom Prinzip her müßte es aber ungefähr so möglich sein, wie Du es Dir vorstellst: Mit zwei Optokopplern.
Eine fertige Schaltung habe ich nicht für Dich, aber einige Anregungen. Im folgenden bezeichne ich den mit dem Schalter betätigten Optokoppler mal 24V-Optokoppler und den vom Mikrocontroller betätigten nenne ich 5V-Optokoppler.

  1. Da ein Optokoppler mit 24V und der andere mit 5V geschaltet wird, müßtest Du bei der Berechnung des Vorwiderstands eigentlich zwei verschiedene Widerstandswerte herausbekommen, so dass es an einer korrekt berechneten Schaltung nicht sein kann, dass sowohl am 24V Optokoppler als auch am 5V Optokoppler ein 2K Widerstand verwendet wird.

  2. Optokoppler können am Ausgang ein "Signal" abgeben, aber keine großen Leistungen schalten. Der 24V-Optokoppler kann dann zwar problemlos dem Mikrocontroller ein Signal senden, dass der Schalter betätigt wurde, aber mit dem 5V-Optokoppler kannst Du vermutlich nicht direkt den notwendigen Laststrom halten/schalten. Ich nehme mal an, Deine "Last" soll irgendwie ein Relais sein, dann würde der 5V-Optokoppler am Ausgang noch eine Transistorschaltstufe benötigen, um den Laststrom (= Relais-Spulenstrom) zu schalten.

  3. Im Schaltbild fällt mir auf, dass Du an den Optokopplerausgängen mal Plus oben und Minus unten und mal umgekehrt angeschlossen hast. Das ist an den meisten existierenden Optokopplern nicht erlaubt, sondern je nach Typ des Optokopplers muss der Ausgang richtig gepolt am Optokoppler angeschlossen sein. Nur bei ganz wenigen bipolaren Optokopplern ist es egal, wie herum die Polung am Ausgang angeschlossen ist.

Soweit meine Ideen dazu.

Hallo,

danke für deine Anregung. Der Optokoppler rechts, für das erkennen des Tastendruck ist ein gewöhnlicher PC817. Der Last Treiber links, ist ein AQV212 der Speziell in der Telefontechnik Verwendung findet. Mitlerweile habe ich das Problem eingrenzen können. Der Hinweis mit der Berechnung hat zwar den Ausschlag ..... aber nicht das ergebniss geliefert. Der Vorwiderstand für den Treiber hat nicht funktioniert. Egal welchen ich genommen habe. Erst die Leucht Diode bringt das ganze zum Funktionieren. Ich weis aber nicht warum. Fileicht kann mir ja jemand den Geistes Blitz vermitteln.

was auch noch wichtig war, ist das Delay 2 oder grösser und das vorherige Auf LOW setzen vor dem Umschalten.

/*
  Programm : I/O Verstärker
  Einen I/O als Eingang und als Ausgang
  verwenden.
  Code by Temucin LE at 2014
*/

// Programm Spezifische Variablen

String PROGRAMM = "I/O Verstärker" ;

//-------------------------------

int IO_1 = 12;           
int IO_1_Status;
int IO_1_Mode;

long ser_timer;
long IO_1_timer;

int led = 13;
int led_t =0;
long timer = 0;

unsigned long mil_1 =0;
unsigned long mil_2 =0;
int timer_div =0;

int inByte = 0;
String comand ;
long wert = 0;
String pars ;
int par_count;
int parstep;
String param ;
byte par1;
byte par2;
byte par3;
byte par4;
byte par5;
byte par6;
int intstep;

// the setup routine runs once when you press reset:
void setup() {                
  
  // initialize the digital pin 
  
  Serial.begin(57600);
  
  pinMode(led, OUTPUT);
  
  pinMode(IO_1, INPUT); 
  digitalWrite(IO_1,HIGH);
  IO_1_Mode=0;
  
}

// the loop routine runs over and over again forever:
void loop() {
  
  // --------------------------------------------------------------------------  
  // millis() count und überlauf prüfung, in timer_div steht die anzahl verstrichener millis
  
  mil_2 = mil_1;
  mil_1 = millis(); // da sich der überlauf der millis auch innerhalb eines loops an einer zufälligen stelle ereignen kann, wird dieser zwischen gespeichert.  
  if (mil_1<mil_2) //  das neue mil ist kleiner wie das alte, dann muss ein überlauf stadt gefunden haben
  {
    timer_div=1;
  }
  else
  {
    timer_div=mil_1-mil_2;    
  }
  
  // --------------------------------------------------------------------------  
  // Lebenslicht Blinker 
  
  if (timer>0)
  {
    timer=timer-timer_div; 
    if (timer<0) timer=0; 
  }
  if (timer==0) // Lebenslicht des Programms
  {
    timer=1000;
    
    if (led_t==0)
    {
      led_t=1;
      digitalWrite(led, HIGH);   // turn the LED on (HIGH is the voltage level)
      //digitalWrite(IO_1, HIGH);
    }
    else
    {
      led_t=0;
      digitalWrite(led, LOW);    // turn the LED off by making the voltage LOW
      //digitalWrite(IO_1, LOW);
    }
  }
  // ---------------------------------------------------------------------------
  // Data to Ser
 
  if (ser_timer>0)
  {
    ser_timer=ser_timer-timer_div;
    if (ser_timer<0) ser_timer=0;
  } 
  if (ser_timer==0)
  {
    ser_timer=250;
    Serial.print("IO_1: ");
    Serial.println(digitalRead(IO_1));    
  } 
  // ---------------------------------------------------------------------------
  // IO Kontrolle
  
  if (IO_1_timer>0)
  {
    IO_1_timer=IO_1_timer-timer_div;
    if (IO_1_timer<0) IO_1_timer=0;
  }  
  if (IO_1_timer==0&&IO_1_Mode==1)
  {
    Serial.println("IO_1: Set In");
    digitalWrite(IO_1, LOW);
    delay (2);
    pinMode(IO_1, INPUT);
    digitalWrite(IO_1, HIGH);
    delay (2);
    IO_1_Mode=0;
  }
  else
  {
    IO_1_Status=digitalRead(IO_1);
    if(IO_1_Status==0 && IO_1_Mode==0){
      
     //Serial.println("IO_1 = LOW");    
     Serial.println("IO_1: Set Out");
     digitalWrite(IO_1, LOW);
     delay (2);     
     pinMode(IO_1, OUTPUT);
     digitalWrite(IO_1, HIGH);
     delay (2);
     IO_1_Mode=1;
     IO_1_timer=5000;
     
    }     
  }
  // ---------------------------------------------------------------------------
  // Serielle Komunikation
  
 
    // send data only when you receive data:
    if (Serial.available() > 0) {
      // read the incoming byte:
      comand="";
      wert=0;
      param="";
      pars="";
      inByte = Serial.read();
      
      if (inByte == 47)
      {
        delay (5);
                
        for (int x = 0 ; x<15 ; x++)
        {
          inByte = Serial.read();
          if (inByte>31 && inByte<128)
          {
            pars=pars+char(inByte);
          }
        }
        
        comand=pars;
        
        if (comand=="info")
        {
          Serial.print  ("PROGRAMM : ");
          Serial.println(PROGRAMM); 
          Serial.println("Temucin LE / SPS-12"); 
          Serial.println(""); 
           
        }
         
        if (comand=="set")
        {
          Serial.println("SET: "+param);
        }
      }
    }

}

Auf jeden Fall danke für die Hilfe.

You have two resistors of 10k inside the Arduino, but they are not there.
There is one internal pullup resistor of about 50k, but there is no pulldown resistor at all.

Hallo,

i have corrected the plan. Sorry my english are little bit.

Hallo,

ich denke es funktioniert mit einem Widerstand nicht. Weil dieser nur bis 7,5 K an dem AQV212 funktioniert. Und das würde aber im Umkehrschluss bedeuten das ich ein LOW auf den Pin lege.

Der letzte Plan hat immernoch fehler.
Die LED des AQV212 kann nicht ohne Vorwiderstand angesteuert werden.

Wenn Du den Taster drückst dann schaltet Relais K1 ein, Leuchtet die Lampe des Tasters und dreht der Motor. PC817 wird angesteuert und Pin 10 Arduino geht auf Masse. Jetzt hoffen wir daß Pin 10 nicht ein AUsang und auf HIGH war da ansonsten Arduino oder PC817 kaputt gegengen ist.

Was dann?
Du kannst Pin 10 nicht als Ausgang und High geben.
Wartest Du daß Taster losgelassen wird um Pin 10 als Ausgang und High zu machen? Dann machst Du Pin 10 wiederum kaputt weil das LED des AQV212 keine Strombegrenzungswiderstand hat.

Außerdem wenn Pin 10 High sein sollte ohne daß es kaputtgegengen ist macht ein weiteres Drücken von Taster es kaputt.

Du mußt Widerstände einfügen die die Ströme auf erklägliche Werte begrenzen.

Viele Grüße Uwe

Hallo,

deine Erläuterungen sind plausible. Und das mit dem Widerstand am PC817 habe ich eingefügt weil du natürlich recht hast. Theoretisch würde ich dann einen Kurzschluss machen sobald der Ausgang auf High gelegt wird. Was den Widerstand am AQV212 anbelangt so sollte eigentlich der Eingang bereits einen Vorwiderstand haben weil er als 5 Volt VCC angegeben ist. Ich habe jetzt mal versucht den Arduino zu zerstören...... er hat mir aber den Stinke Finger gezeigt.

Grus an alle die mit Infos nicht gegeizt haben. Sollte jemand eine Alternative Möglichkeit haben .... ich bin für alles offen.

Gruss Turgut

Laut Datenblatt ist das ein ganz normaler Opto-Eingang:

Siehe das Bild gleich oben links.

Lediglich der Ausgang ist etwas anders als ein typischer Optokoppler. Den kann man wohl Wechsler verwenden. Und die Freilauf-Dioden sind auch schon drin.

temucin:
Hallo,

deine Erläuterungen sind plausible. Und das mit dem Widerstand am PC817 habe ich eingefügt weil du natürlich recht hast. Theoretisch würde ich dann einen Kurzschluss machen sobald der Ausgang auf High gelegt wird. Was den Widerstand am AQV212 anbelangt so sollte eigentlich der Eingang bereits einen Vorwiderstand haben weil er als 5 Volt VCC angegeben ist. Ich habe jetzt mal versucht den Arduino zu zerstören...... er hat mir aber den Stinke Finger gezeigt.

Grus an alle die mit Infos nicht gegeizt haben. Sollte jemand eine Alternative Möglichkeit haben .... ich bin für alles offen.

Gruss Turgut

Da hast Du etwas falsch verstenden.
Laut datasheet AQV212 ist die maximale Spannung in Sperrichtung 5V. Die Spannung in Durchlaßrichtung ist im Diagramm 7 abzulesen und bei 10mA und 20°C ca 1,15V und 20mA ca 1,2V.

Wenn die notwendige Spannung 5V wäre, kannst Du sie aber auch nicht durch eine 2. LED um ca 1,5V reduzieren.

Eine kurzzeitige vermeindliche fehlerfreie Funktion läßt nicht darauf schließen, daß Du die Teile auch innerhalb der Hersteller-Spezifikationen betriebst.

Grüße Uwe

Hallo,
Du hast den Pin als Ausgang deklariert, nun schaltet der Arduino die Last.
Wenn die Last geschaltet ist, soll der gleiche Pin als Eingang dienen?
So verstehe ich das richtig?
Du könntest das mit einer Relais-Selbsthaltung machen. Pin auf High, Relais
zieht an, schaltet Last, Relais trennt Leitung zum Pin, Arduino schaltet Pin auf Eingang.
So etwas müßte man auch mit Transistoren oder Optokopplern hinbekommen.
Gruß und Spaß dabei
Andreas

Genau umgekehrt. Der Pin ist erstmal als Eingang Deklariert. Wird der Eingang auf Low runter gezogen. Wechselt der PinMode auf Ausgang und hält die Last bis zeit X abgelaufen ist und schaltet die Last aus und den Pin wider auf Eingang. Das lässt sich auch mit einer selbst halte Schaltung realisieren. Aber ich finde das so Flexibler.

Du hast einiges nicht bedach:
[0] Wenn DU die LED des AQV212 und eine (im besten Fall) rote LED in Reihe schaltest dann hatd Du mit einem 470 Ohm Widerstand bei 5V Versorgung nicht 10mA sondern ca (5V-(1,1V+1,4V)) /470 Ohm = 5,3mA.

[0]Ein Pin von Arduino kann 40mA bringen aber mehrere nicht.
Einige Gruppen von Pins können max 100 /150 mA geben. (genaue angaben siehe Datenblatt)
Alle Pins gemeinsam max 200mA.
Bei 12mA pro Pin sind das gerande mal 16 der möglichen 20 Pins. Beim Arduino MEGA ist das nicht viel anders. Auch dort kommst du auch nicht viele mehr Ausgänge die gleichzeitig aktiv sein dürfen.

Du brauchst einen Transistor zum ansteuern des Optokopplers. Das fängt an kpmpliziert zu werden. Wäre es dann nicht besser 2 Pins zu verwenden (ein Eingang und einen Ausgang) und Portexpander mit Treibern um die Relais anzusteuern? So hast Du auch eine Potentialtrwennung ohne Optokoppler??

Grüße Uwe

Hallo,

danke für deine Erläuterung. Ist es denn dann nicht so das 5,3 + 2 =7,5 mA*14 Pins=105 mA machen. Da wäre ich ja noch locker unter den 200 mA. Der AQV benötigt soweit mir bekannt 1,25 mA um sicher zu schalten. Ich könnte also die Ströme auf beiden Seiten noch reduzieren. Ist bei der Begrenzung der Pins die Wärme Entwicklung das Problem? Oder gehen die Treiber einfach nur kaputt. Ansonsten wäre es ja möglich einen ULN2003A zu verwenden (Transistor Array). Das würde den Aufbau nicht sonderlich vergrößern.
Es geht bei der Konzeption nicht um Einfachheit. Die Optokoppler sind gesockelt. Sie können einzeln oder auch zusammen verwendet werden. Da muss die Sache halt auch funktionieren. Da die Umgebung stark gestört sein kann. Ist eine Optische Trennung unerlässlich.

Gruss Turgut

Hallo,

da mich das Thema nicht los lässt. Habe ich mir mal 3 Amperemeter besorgt und mal live gemessen was denn an Strom
gezogen wird. Und siehe da ..... selbst mit einem 470 Ohm widerstand komme ich nur auf 3.87 mA die gesamthaft vom Pin gezogen werden. Als Eingang fließen lediglich 0.06 mA. Das reicht zwar um die Diode zum glimmen zu bringen. Aber mehr auch nicht. Dagegen verbraucht die Leuchtdiode die auf dem Arduino mini pro drauf ist ganze 9 mA, dann die Power LED ..... im stand verbraucht der Arduino 16 mA. Also ist ja schon ein gehöriger teil der 200 mA weg ohne das was ordentliches passiert.

Gruss Turgut

Hallo,
ich denke die Schaltung wird jetzt mal so bleiben. Als nächstes werde ich den PC817 gegen einen mit Schmittrigger austauschen.

Gruss Turgut

temucin:
Es geht bei der Konzeption nicht um Einfachheit. Die Optokoppler sind gesockelt. Sie können einzeln oder auch zusammen verwendet werden. Da muss die Sache halt auch funktionieren. Da die Umgebung stark gestört sein kann. Ist eine Optische Trennung unerlässlich.

Gruss Turgut

Eine optische Isolierung hilft nicht unbedingt gegen Stark gestörte Umgebung. Da müssen zusätzlich andere Maßnahmen ergriffen werden.

Das Relais garantiert bereits eine elektrische Isolierung. Wenn dei Spannung des Steuerteils von der Versorgungsspannung der Motore isoliert ist, braucht es gar keine Optokoppler.

Grüße Uwe