Hallo Zusammen,
Anfang Dezember wurde mir bei der Programmierung eines Zähler per Lichtschranke für eine Modelleisenbahn Brücke sehr weitergeholfen.
https://forum.arduino.cc/index.php?topic=651891.0
Diesen Code versuche ich gerade zu erweitern um damit einen DC-Motor anzusteuern.
Die Funktion soll so aussehen:
Öffnen der Brücke:
-Wenn Zähler 0, Taster Endlage (tend) gedrückt und Taster öffnen (toe) soll der Motor für eine gewisse Zeit in Geschwindigkeit 2 in Richtung 1 drehen, danach stehen bleiben.
Schließen der Brücke
-Wenn Taster Endlage (tend) nicht gedrückt ist und Taster Schließen betätigt wird soll der Motor eine Zeit in Geschwindigkeit 2 in Richtung 2 drehen und danach in Geschwindigkeit 1, bis Taster Endlage (tend) gedrückt wird.
Die Timerfunktion habe ich von nem Kumpel und angepasst, da vermute ich einen Fehler.
Mir wird der Fehler "Fehler beim Komplimieren für das Board Arduino/Genuino Mega or Mega 2560" angezeigt.
Ich, mit meinem Anfänger wissen, kann im Code den Fehler nicht finden.
Ich hoffe ihr könnt da was entdecken oder mir sagen auf welchem anderen/besseren Weg ich das programmieren kann.
In meinem ersten Versuch habe ich mit for schleifen und delays eine Rampe programmiert, aber während der Arduino in den Schleifen war hat er (logischer Weise) nicht die Endlage abgefragt. Also Versuche ich jetzt mit dem Timer zu arbeiten.
Schönen Abend noch
Nordlicht
//Lichtschranke
const int photo1 = A0; //Das Wort „photo1" steht jetzt für den Analogenport „A0"
const int photo2 = A1; //Das Wort „photo2" steht jetzt für den Analogenport „A1"
bool LS1Belegt = false; // = true, wenn die Einfahrt Lichtschranke belegt ist
bool LS2Belegt = false; // = true, wenn die Ausfahrt Lichtschranke belegt ist
int photoWert1 = 0; //Variable für den Photodiodenwert 1 mit 0 als Startwert
int photoWert2 = 0; //Variable für den Photodiodenwert 2 mit 0 als Startwert
bool lastLS1 = false; // Variable zum Merken des Zustandes der Lichtschranke 1
bool lastLS2 = false; // Variable zum Merken des Zustandes der Lichtschranke 2
int counter = 0; //Zug- und Wagenzähler
const int LED1 = 7; //Das Wort „LED1" steht jetzt für den Digitalpin 7
const int LED2 = 6; //Das Wort „LED2" steht jetzt für den Digitalpin 6
const int LED3 = 5; //Das Wort „LED3" steht jetzt für den Digitalpin 5
const int LED4 = 4; //Das Wort „LED3" steht jetzt für den Digitalpin 4
const int LED5 = 8; //Das Wort „LED3" steht jetzt für den Digitalpin 3
const int toe = 22; //Taster zum Öffnen auf DiPin 22
const int tsch = 23;// Taster zum Schließen auf DiPin 23
const int tend = 24; // Taster für Endlagenabfrage auf DiPin 10
bool tsoe = false; //Variable für Status tasterÖffnen=0
bool tssch = false; // Variable für Status tasterSchließen=0
bool tsend = false; // Variable für Status tasterendlage=0
//Motorsteuerung
int pwm_a = 3; //PWM control for motor outputs 1 and 2
int dir_a = 2; //direction control for motor outputs 1 and 2
int offnen=0;
int schlieszen=0;
int ges0 = 0; //Geschwindigkeit 0 U/min
int ges1 = 150; // Geschwindigkeit 100% 37 U/min
int ges2 = 60; // Geschwindigkeit 50% 20 U/min
//Stromversorgung Schiene
int relais =12;
// Zeit für Timer
int timer=0;
int starttimer=0;
int zeit= 10000; // 10sekunden
void setup()//Hier beginnt das Setup.
{
Serial.begin(9600); //Die Kommunikation mit dem seriellen Port wird gestartet.
while(!Serial);
pinMode (LED1, OUTPUT); //Der Pin mit der LED1 ist jetzt ein Ausgang
pinMode (LED2, OUTPUT); //Der Pin mit der LED2 ist jetzt ein Ausgang
pinMode (LED3, OUTPUT); //Der Pin mit der LED3 ist jetzt ein Ausgang
pinMode (LED4, OUTPUT); //Der Pin mit der LED4 ist jetzt ein Ausgang
pinMode (LED5, OUTPUT); //Der Pin mit der LED5 ist jetzt ein Ausgang
pinMode( toe, INPUT );
pinMode( tsch, INPUT );
//Die analogen Pin muss nicht definiert werden.
//Motorsteuerung
pinMode(toe, INPUT);
pinMode(tsch, INPUT);
//Motorsetups
pinMode(pwm_a, OUTPUT); //Set control pins to be outputs
pinMode(dir_a, OUTPUT);
analogWrite(pwm_a, ges0); //Startgeschwindigkeit
// Relais
pinMode(relais, OUTPUT);
pinMode(tsend, OUTPUT );
//TIMER KONFIGURATION
TCCR0A=(1<<WGM01); //Set the CTC mode
OCR0A=0xF9; //Value for ORC0A for 1ms
TIMSK0|=(1<<OCIE0A); //Set the interrupt request
sei(); //Enable interrupt
TCCR0B|=(1<<CS01); //Set the prescale 1/64 clock
TCCR0B|=(1<<CS00);
}
void loop()
//Lichtschranke mit Abfrage ob sich Zug auf der Brücke befindet
{ //Lichtschranke Auslesen
LS1Belegt = ( analogRead(photo1) < 40 );//Die Spannung an dem Fotowiderstand auslesen und Belegtzustand in der Variable „LS1Belegt" abspeichern.
LS2Belegt = ( analogRead(photo2) < 40 );//Die Spannung an dem Fotowiderstand auslesen und Belegtzustandunter der Variable „LS2Belegt" abspeichern.
//Zum kontrollieren der Sensorwerte bei Bedarf einblenden
/*photoWert1=analogRead(photo1);
photoWert2=analogRead(photo2);
Serial.print("Photo1: "); Serial.println (photoWert1);
Serial.print("Photo2: "); Serial.println (photoWert2);*/
// LED1 und LED2 entsprechend LS-Zustand schalten
digitalWrite(LED1, LS1Belegt);
digitalWrite(LED2, LS2Belegt);
if (LS1Belegt && !lastLS1) // Lichtschranke 1 wurde unterbrochen ( Flanke )
{
counter ++; // einen addieren
Serial.print("Diff. " ); Serial.println(counter); Serial.print("LS1Belegt=" ); Serial.println(LS1Belegt); Serial.print("LS2Belegt=" ); Serial.println(LS2Belegt);
}
lastLS1 = LS1Belegt; // aktuellen Zustand der LS merken
if (LS2Belegt && !lastLS2) // Lichtschranke 2 wurde unterbrochen ( Flanke )
{
counter --; // einen abziehen
Serial.print("Diff. " ); Serial.println(counter); Serial.print("LS1Belegt=" ); Serial.println(LS1Belegt); Serial.print("LS2Belegt=" ); Serial.println(LS2Belegt);
}
lastLS2 = LS2Belegt; // aktuellen Zustand der LS merken
digitalWrite(LED3, (counter != 0) ); //LED3 leuchtet,wenn Counter nicht 0 (Fehlermeldung)
//Motorsteuerung auslesen
tsoe = digitalRead(toe);
tssch = digitalRead(tsch);
tsend = digitalRead(tend);
//Bedienung der Brücke nur wenn counter auf 0 steht
if ( counter == 0 && tsend==HIGH && tsoe == HIGH) // Brücke öffnen
{
digitalWrite (offnen, HIGH);
}
if (tsend=LOW && tssch=HIGH) //Brücke schließen
{
digitalWrite (schlieszen,HIGH);
}
if(offnen == HIGH){
digitalWrite(dir_a, LOW);
if(tsend==HIGH){
if(timer>=zeit){
analogWrite(pwm_a,ges2);
starttimer = LOW;
}else{
analogWrite(pwm_a,ges0);
starttimer= HIGH;
}
}else{
analogWrite(pwm_a,ges0);
offnen=LOW;
}
}
if(schlieszen == HIGH){
digitalWrite(dir_a, HIGH);
if(tsend==LOW){
if(timer>=zeit){
analogWrite(pwm_a,ges2);
starttimer = LOW;
}else{
analogWrite(pwm_a,ges1);
starttimer= HIGH;
}
}else{
analogWrite(pwm_a,ges0);
schlieszen=LOW;
}
}
//Stromversorgung Schiene
tsend=digitalRead(tend);
if (tsend ==HIGH)
{
digitalWrite(relais, HIGH); //An dieser Stelle würde das Relais einsschalte
}
else
{
digitalWrite(relais,LOW);
}
delay (20); // zum entprellen;
}
//Timer
ISR(TIMER0_COMPA_vect){ //This is the interrupt request
if((tsoe == HIGH)||(tssch == HIGH)){
if(starttimer== HIGH){
timer++;
}
}else{
timer=0;
}
}