Arduino / pinMode

Peter_n:
I don't understand the drawing (schaltbild) at all.
Is there an Arduino in there ?

I'm in your opinion. No Arduino.

Bitte poste ein richtiges Schaltbild.

Hallo,

Ich möchte den Pin des Arduino in beiden Richtungen Galvanisch trennen. Das ist der Kern der Bemühung. Aber ich denke ich habe da ein grundsätzliches Verständniss Problem.

nu kommt schon .... so schlecht ist das Schaltbild nu auch wider nicht. Unten der Blaue Rahmen Representirt den Arduino Pin wo die PullUp and Down Widerstände zugeschaltet werden können.

Wenn der Taster betätigt wird, wird die Last geschaltet und der Optokoppler zieht den Pin auf LOW. Durch den PullUp ist er normalerweise High.

das erkennen des Tasters funktioniert.

Erkennt der Sketsh das der Eingang auf low herunter gezogen wird. Dann wechselt er den Pin Mode und schaltet diesen auf HIGH.
Nun Sollte der Linke Optokoppler die Last übernehmen da er ja jetzt direkt das High vom Pin und nicht über den PullUp bekommt. Macht er aber nicht.

Gruss Turgut

PS: Jeder hat mal klein angefangen :slight_smile:

Wenn ich jede Richtung separat teste funktioniert es .... aber zusammen ist der Wurm drin.

temucin:
nu kommt schon .... so schlecht ist das Schaltbild nu auch wider nicht. Unten der Blaue Rahmen Representirt den Arduino Pin wo die PullUp and Down Widerstände zugeschaltet werden können.

Ein Arduino hat zwar einen schaltbaren eingebauten PullUp-Widerstand.

Aber es gibt keinen schaltbaren PullDown-Widerstand.
PullDown-Widerstände können nur "extern" fest verbaut werden.
Ein mit pinMode INPUT geschalteter Eingang ist immer "schwebend", d.h. dieser Eingang kann wahlweise zwischen HIGH und LOW hin und her pegeln, je nachdem, welche zufälligen Störungen er auffängt.

temucin:
Ich möchte den Pin des Arduino in beiden Richtungen Galvanisch trennen. Das ist der Kern der Bemühung. Aber ich denke ich habe da ein grundsätzliches Verständniss Problem.

Aber was soll das werden, wo soll geschaltet werden und wo sollen Signale ankommen?

Möchtest Du die "Last" manuell am "Schalter" ein und aus schalten und der Arduino soll ein Signal am Eingang erhalten, ob die Last ein- oder ausgeschaltet ist?

Oder möchtest Du mit einen "Schalter" einen Arduino-Eingang HIGH/LOW setzen und der Arduino soll daraufhin eine "Last" schalten?

Hallo,

ich habe hier einige Bücher die was anderes erzählen. Wenn dem so ist, erklärt das natürlich einiges.

Wie oben schon angedeutet soll die Schaltung folgendes machen.

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.

LG Turgut

PS : alle anderen Varianten kenne ich schon.

Warum muss es ein Pin sein?

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