Einen 12V DC-Motor der links- und rechtslauf kann und durch eine Lichtschranke die Drehrichtung geändert wird

Hallo Zusammen,

Ich habe da eine Frage.

Wir bauen in unserer Firma zurzeit ein fahrbares Gerät was von einem 12V DC-Motor in Links und Rechtslauf fahren soll. Die Drehrichtung soll durch eine Lichtschranke (TCST 2103) bestimmt werden.

Ich schaffe es des Rechts und Linkslauf umzustellen schaffe es aber nicht die Lichtschranke richtig ins Programm einzuarbeiten, und ich weiß auch nicht, ob die Pin-Belegung richtig ist da ich noch nie eine Lichtschranke im Arduino Programm hinzugefügt habe.

Danke schonmal für eure Hilfe.

Verwendete Bauteile zum Testaufbau:

MDR-20-12 Netzteil 12V/1.67A

Arduino UNO R3

Arduino Motor Shield

Lichtschranke 2x TCST 2103

Modelcraft RB350100-0A101R Getriebemotor 12V

Wie schon gesagt das ist nur ein Testaufbau ob es so funktioniert deswegen ist auch die Verdrahtung und alles noch nicht ordentlich.



  • du könntest das Datenblatt von der Gabellichtschranke verlinken
  • du könntest einen Schaltplan posten, weil am Foto sind die Anschlüsse nicht erkennbar und 3 blaue Kabel gehen undefiniert irgendwo hin
  • du könntest den Code in Code Tags posten so wie im Forum How To beschrieben, weil die meisten Grafikprogramme können keinen Code auf den Arduino laden.

digitalRead(LichtschrankenPin);
liefert true oder false, je nachdem ob die Lichtschranke offen oder verschlossen ist.

Der Schaltplan der Lichtschranke:

Das Datenblatt der Lichtschranke:

tcst2103.pdf (vishay.com)

Der Code:

void setup() {

//Setup Channel A
pinMode(12, OUTPUT); //Initiates Motor Channel A pin
pinMode(9, OUTPUT); //Initiates Brake Channel A pin

pinMode(2, INPUT); //Lichtschranke Input

}

void loop(){

//Motor A forward @ full speed
digitalWrite(12, HIGH); //Establishes forward direction of Channel A
digitalWrite(9, LOW); //Disengage the Brake for Channel A
analogWrite(3, 255); //Spins the motor on Channel A at full speed

delay(3000);

digitalWrite(9, HIGH); //Engage the Brake for Channel A

delay(1000);

//Motor A forward @ full speed
digitalWrite(12, LOW); //Establishes backward direction of Channel A
digitalWrite(9, LOW); //Disengage the Brake for Channel A
analogWrite(3, 123); //Spins the motor on Channel A at half speed

delay(30000);

digitalWrite(9, HIGH); //Engage the Brake for Channel A

delay(1000);
}

Soll der Motor auch gelegentlich gar nicht laufen?
Je nach Motor ist es auch gut, beim Umschalten zwischen L und R eine Pause einzufügen.

Das Bild des Sketch hab ich nur grob angeschaut und befürchte, da kann noch was verbessert werden. Aber auf jeden Fall sollte die Aufgabenstellung klarer sein.
Bzw. von einem funktionierenden einfachen Beispiel ausgehend die gewünschte Funktionsänderung beschreiben und den Realisierungsversuch zeigen.

Ansonsten ist eine Lichtschranke genauso (oder eher einfacher) zu behandeln wie ein Taster/Schalter.

Der Motor soll sobald die Maschine läuft auch mitlaufen deswegen haben wir ein extra 12V Netzteil für den Arduino eingebaut.
Ja eine kurze Pause dazwischen muss ich noch einbauen.

Jetzt zurzeit ist es ja einfach so das die Drehrichtung sich ändert nach den paar Sekunden das muss ich jetzt nur umbauen damit die Drehrichtung sich durch Betätigung einer der beiden Lichtschranken ändert.
Deswegen schreibe ich hier in dieses Forum weil ich davon echt keine Ahnung habe. :sweat_smile:

Du darfst keine 12V auf einen Arduino Pin geben.

Ja.
Am einfachsten ist es, den Emitter der Lichtschranke (D in deinem Plan) auf Arduino-GND zu legen, und den Kollektor (+ darunter) mit einem INPUT_PULLUP - Pin zu verbinden.
Wenn die Lichtschranke offen ist, sollte dieser Pin LOW liefern, wenn etwas die Schranke unterbricht HIGH.

180 Ohm bei 12V an der LED ist ein bisschen klein: 60 mA an der LED der TCST2103 ist absolutes Maximum. ( 560 Ohm sollte ca 20 mA LED Strom liefern, 1k geht sicher auch )

  • Wofür sind zwei TCST2103 in deiner "Stückliste" ?

Hallo,
du benötigst einen Hilfsmerker der für die eine Richtung HIGH ist und für die andere Richtung LOW. Eingeschaltet wird er mit der einen Lichtschranke und aus mit der anderen.

sowas in der Art

void loop(){
digitalWrite(9,LOW);  //Disengage the Brake for Channel A
if( digitalRead(lichtschranke1)== HIGH) merker=HIGH;
if (digitalRead(lichtschranke2)== HIGH) merker =LOW;

digitalWrite(pinReverse,merker); // Richtung schalten 
if(merker) analogWrite(3,255); full Speed
else analogWrite(3,128) slow Speed
}

Auch solltest Du auf das delay() verzichten, der Prozessor macht dabei eine Pause und du kannst die Eingänge der Lichtschranken nicht vernünftig abfragen.

Wenn Du das mit kleinen Pausein den Wendepunkten machen willst dann solltest Du über den Einsatz einer Schrittkette oder Ablablaufsteuerung nachdenken. Eventuell noch mit Ein/aus Funktion z.B hier stop immer rechts.

warten auf Start
fahren links
warten pause
fahren rechts
warten pause

Die beiden TCST2103 in meiner Stückliste werden eins links und eins rechts angebracht.


je nachdem welches dann betätigt wird soll sich die Drehrichtung ändern.

So ich habe nun meine Lichtschranke so angeschlossen.

Wie schreibe ich das nun im Programm das sobald die Lichtschranke aktiviert ist der Motor die Drehrichtung ändern soll? :sweat_smile:

schreib erst mal nur ein kleines Programm das dir den Status der Gabellichtschranke auf der Seriellen Schnittstelle ausgibt.

Poste den Code - so wie im Forum beschrieben ! (!!!) - in code Tags.

Du möchtest einen endlichen Automaten bauen.
Eine Ablaufsteuerung, Statemachine, oder ....

Es gibt rund ein Dutzend Wege das zu erledigen.
Viele davon sind hier im Forum schon mehrfach durchgekaut worden.

Mal eine andere Frage:

Welchen Zweck soll das Gerät denn eigentlich erfüllen, wenn es einmal fertig ist?

1 Like

Die Angaben der Motorparamenter zB in https://www.conrad.de/de/p/modelcraft-rb350100-0a101r-getriebemotor-12-v-1-100-227560.html sind irreführend.

Ich interpretiere:
Leerlaufstrom 80mA (Ohne Getriebe)
Nennstrom 300mA
Kurzschlußstrom 2,1A

Somit ist der Treiber auf dem Shield unterdimensioniert.
Der muß den Kurzschlußstrom aushalten können.

Grüße Uwe

Weil mir gerade/Gestern so langweilig war....

#include <Streaming.h> // die Lib findest du selber ;-)
Print &cout = Serial; // cout Emulation für "Arme"



const byte motorEnableA {12};
const byte motorBrakeA  { 9};
const byte motorSpeedA  { 3};

const byte lichtschankeLinks  { 2};
const byte lichtschankeRechts { 3};

void linkslauf()
{
  digitalWrite(motorEnableA, HIGH); //Establishes forward direction of Channel A
  digitalWrite(motorBrakeA,  LOW); //Disengage the Brake for Channel A
  analogWrite(motorSpeedA,   255); //Spins the motor on Channel A
  cout << F("linkslauf") << endl;
}

void rechtslauf()
{
  digitalWrite(motorEnableA, LOW); //Establishes backward direction of Channel A
  digitalWrite(motorBrakeA,  LOW); //Disengage the Brake for Channel A
  analogWrite(motorSpeedA,   123); //Spins the motor on Channel A
  cout << F("rechtslauf") << endl;
}

void halt()
{
  digitalWrite(motorBrakeA,  HIGH); // Brake for Channel A
//  analogWrite(motorSpeedA,   0);    //Spins the motor on Channel A
  cout << F("halt") << endl;
}

void automat()
{
  linkslauf();
  while (!digitalRead(lichtschankeLinks)){yield();}
  halt();
  delay(3000);
  rechtslauf();
  while (!digitalRead(lichtschankeRechts)){yield();}
  halt();
  delay(3000);
}

void error()
{
  halt(); // motor Halt
  cout << F("Error: Beide Lichtschranken belegt") << endl;
  while(1) {} // system Halt
}

void setup()
{
  Serial.begin(9600);
  cout << F("Start: ") << F(__FILE__) << endl;

  //Setup Channel A
  pinMode(motorEnableA, OUTPUT); //Initiates Motor Channel A pin
  pinMode(motorBrakeA,  OUTPUT); //Initiates Brake Channel A pin

  pinMode(lichtschankeLinks,  INPUT_PULLUP); //Lichtschranke Input
  pinMode(lichtschankeRechts, INPUT_PULLUP); //Lichtschranke Input
}

void yield()
{
  if(digitalRead(lichtschankeLinks)&&digitalRead(lichtschankeRechts))
  {
    error();
  }
}

void loop()
{
  automat();
}
1 Like

Moin @combie,
kannst Du mir erklären, warum Du mit dem Komplement des Portpins abfragst?

Nach meiner Vorstellung müsste das Ausrufezeichen etwas weiter nach links rutschen:
!digitalRead(lichtschankeLinks)

Gut aufgepasst!

Schon längst korrigiert.

Das war eine unerklärbare Dummheit.
Quasi ein Tippfehler beim Einbau der Invertierung

1 Like

Sehr vielen Dank dafür du hast mir sehr geholfen.

Muss jetzt aber trotzdem fragen welche Lib ich nehmen muss dafür xD.

Welche möchtest du denn?

1 Like