digitales Signal generieren

Hallo zusammen,

kurz zu mir, ich bin Elektroniker, mit der Programmierung von Microcontrollern hatte ich bisher allerdings nichts zu tun. Daher bitte um Rücksicht, da es mein allererstes Projekt hier ist und ich das Programmieren auch erst noch lernen muss.

Aufgabe: Es geht um meine HiFi-Anlage, bisher wurden die Endstufen per Daten-Bus-Signal von der Vorstufe eingeschaltet. Jetzt habe ich eine neue Vorstufe gekauft und die sendet ein anderes Signal auf den Bus, daher schalten sich die Endstufen nicht ein bzw. aus. Glücklicherweise gibt die neue Vorstufe aber auch ein 12V Signal aus das ich zum triggern nehmen kann.

Der Arduino muss mir also nur ein Signal einmalig ausgeben wenn das 12V Signal umspringt. Zusätzlich muss ein Ausgang (Relais) sofort eingeschaltet und mit Verzögerung ausgeschaltet werden.

Hierzu habe ich erstmal die beiden Signale aus der alten Vorstufe ausgelesen:

|500x230

Und dann habe ich mir mal den Code zusammen getextet:

int led2 = 12;      //Schalt-Ausgang
int led = 13; //Signal Ausgang
int inPin1 = 1; //Signal Eingang
int merker = 0;



void setup() {                


  pinMode(led2, OUTPUT); 
  pinMode(led, OUTPUT);  
  pinMode(inPin1, INPUT);
   
}



void loop() {

digitalWrite(led, LOW);   //LOW Signal am Ausgang definieren



// ON-Signal

if (digitalRead(inPin1)==HIGH)&&(merker==0){   //wenn Eingangssignal High und merker low (Gerät aus)
    

digitalwrite(led2, HIGH);   //Ausgangssignal einschalten

delay(1000); //Verzögerung bevor Signal gesendet wird


  digitalWrite(led, HIGH);   //kurzer Block
  delayMicroseconds900);                
  digitalWrite(led, LOW);    
  delayMicroseconds(900);               
  
  digitalWrite(led, HIGH);   //kurzer Block
  delayMicroseconds(900);                
  digitalWrite(led, LOW);    
  delayMicroseconds(900);  

  digitalWrite(led, HIGH);   //kurzer Block
  delayMicroseconds(900);                
  digitalWrite(led, LOW);    
  delayMicroseconds(900);  

  digitalWrite(led, HIGH);   //kurzer Block
  delayMicroseconds(900);                
  digitalWrite(led, LOW);    
  delayMicroseconds(900);  

  digitalWrite(led, HIGH);   //kurzer Block
  delayMicroseconds(900);                
  digitalWrite(led, LOW);    
  delayMicroseconds(900);  

  digitalWrite(led, HIGH);   //kurzer Block
  delayMicroseconds(900);                
  digitalWrite(led, LOW);    
  delayMicroseconds(900);  

  digitalWrite(led, HIGH);   //kurzer Block
  delayMicroseconds(900);                
  digitalWrite(led, LOW);    
  delayMicroseconds(900);  

  digitalWrite(led, HIGH);   //langer Block
  delayMicroseconds(1800);                
  digitalWrite(led, LOW);    
  delayMicroseconds(900);  

  digitalWrite(led, HIGH);   //kurzer Block
  delayMicroseconds(900);                
  digitalWrite(led, LOW);    //lange Pause
  delayMicroseconds(1800);  

  digitalWrite(led, HIGH);   //kurzer Block
  delayMicroseconds(900);                
  digitalWrite(led, LOW);    
  ddelayMicroseconds(900);  

  digitalWrite(led, HIGH);   //kurzer Block
  delayMicroseconds(900);                
  digitalWrite(led, LOW);    
  delayMicroseconds(900);  

  digitalWrite(led, HIGH);   //langer Block
  delayMicroseconds(1800);                
  digitalWrite(led, LOW);    
  delayMicroseconds(900);  

merker=1;      //Merker setzen, Gerät ist eingeschaltet

  }
  else {

  }





// OFF-Signal

if (digitalRead(inPin1)==LOW)&&(merker==1){   //wenn Eingangssignal low und Merker high
   


  digitalWrite(led, HIGH);   //kurzer Block
  delayMicroseconds(900);                
  digitalWrite(led, LOW);    
  delayMicroseconds(900);               
  
  digitalWrite(led, HIGH);   //kurzer Block
  delayMicroseconds(900);                
  digitalWrite(led, LOW);    
  delayMicroseconds(900);  

  digitalWrite(led, HIGH);   //kurzer Block
  delayMicroseconds(900);                
  digitalWrite(led, LOW);    
  delayMicroseconds(900);  

  digitalWrite(led, HIGH);   //kurzer Block
  delayMicroseconds(900);                
  digitalWrite(led, LOW);    
  delayMicroseconds(900);  

  digitalWrite(led, HIGH);   //kurzer Block
  delayMicroseconds(900);                
  digitalWrite(led, LOW);    
  delayMicroseconds(900);  

  digitalWrite(led, HIGH);   //kurzer Block
  delayMicroseconds(900);                
  digitalWrite(led, LOW);    
  delayMicroseconds(900);  

  digitalWrite(led, HIGH);   //kurzer Block
  delayMicroseconds(900);                
  digitalWrite(led, LOW);    
  delayMicroseconds(900);  

  digitalWrite(led, HIGH);   //langer Block
  delayMicroseconds(1800);                
  digitalWrite(led, LOW);    
  delayMicroseconds(900);  

  digitalWrite(led, HIGH);   //kurzer Block
  delayMicroseconds(900);                
  digitalWrite(led, LOW);    //lange Pause
  delayMicroseconds(1800);  

  digitalWrite(led, HIGH);   //kurzer Block
  delayMicroseconds(900);                
  digitalWrite(led, LOW);    
  delayMicroseconds(900);  

  digitalWrite(led, HIGH);   //langer Block
  delayMicroseconds(1800);                
  digitalWrite(led, LOW);    
  delayMicroseconds(900);  

  digitalWrite(led, HIGH);   //kurzer Block
  delayMicroseconds(900);                
  digitalWrite(led, LOW);    
  delayMicroseconds(900);  

merker=0;      //Merker setzen, Gerät ist ausgeschaltet
delay(3000);    //Zeitverzögerung bevor Ausgang abgeschaltet wird
digitalwrite(led2, LOW);    //Ausgangssignal ausschalten

  }
  else {

  }

}

Jetzt wollte ich nur mal, dass sich das jemand ansieht der sich mit sowas auch auskennt. Das "else" könnte man noch weglassen, klar. Aber sonst, hab ich was vergessen, oder irgendwo was falsch gemacht? Ich will jetzt keinen super schlanken Code, weil ich als Anfänger muss ja noch durchblicken und mit einfachen Kommandos arbeiten.

zuendler:
Daher bitte um Rücksicht, …

Wer sich vorab schon entschuldigt, wird besonders hart rangenommen :smiling_imp:

Programmcode bitte in Code-Tags, im Editor der Button </>.

zuendler:
… keinen super schlanken Code …

Aber conpilieren sollte er schon, sonst … siehe oben :smiling_imp:

zuendler:
Jetzt wollte ich nur mal, dass sich das jemand ansieht …

Mein Scope kennt sich aus:
Endstufe.png

Sieht also ganz gut aus, wobei mein Resonator erst bei delayMicroseconds(1000); auf 1 ms kommt. Der ist wohl etwas lahm.

Damit besonders herzlich willkommen im Forum :grin:

Danke, daß ich das Teufelchen mal wieder verwenden durfte, die meisten sind sie so nett …

Danke für die Anwort, ich habe meinen ersten Beitrag korrigiert.

Ich habe zwar auf dem Zettel geschrieben 1ms, gemessen habe ich allerdings ca. 0,9ms. Daher habe ich den Wert auf 900 Microsekunden angepasst. Ein Freund der aus der Ecke kommt hat gemeint das könnte durchaus eine Rolle spielen wenn man es nicht 100% einhält.

Wo kommt das Signal von dir her? Ist das ein bekanntes Signal oder hast du das aus meinem Code erzeugt? Mein Arduino Board ist noch nicht da, ich kann es selbst noch nicht ausprobieren. Meiner Erfahrung nach haben meine anderen Prgrammierkünste jedoch immer noch Korrekturen bedürft, daher ging ich sehr davon aus, dass hier auch was nicht funktionieren wird.

Der Befehl digitalWrite() braucht selber auch ein paar Mikrosekunden, evtl verhaut dir das dein Timing. Du könntest die Delaypausen als int speichern, zb:

int delaykurz = 900; int delaylang = 1800;

und nachher in die Delays einsetzen, zB:

delayMicroseconds(delaykurz);

Dadurch hast du den Vorteil, dass du nur 2 Werte verändern musst, falls du das Timing anpassen musst.

lg

Danke, das ist mal gut zu wissen. Falls es nicht funktioniert muss ich mir eh erst am Oszi anschauen was da für ein Signal heraus kommt und dann korrigieren. (Ist nur etwas kompliziert, da ich daheim kein eigenes Oszi habe)

Aber der restliche Code ist jetzt erstmal so ok?

Die elses weglassen, den letzten digitalwrite in digitalWrite ändern, dann klick mal auf Überprüfen, dürfte grob überflogen passen.

Oszi ist für dieses Projekt kaum nötig, falls es nicht auf Anhieb klappt, einfach die Delays variieren.

Alternativ gibt es mehrere Libraries für diese Zwecke zum Download, die haben meist Demosketches fürs Senden und Empfangen dabei (Library einbinden über Sketch - Bibliothek einbinden - Zip. Bibliothek hinzufügen), die dann unter Datei - Beispiele zu finden sind.

Lg

Aber schon mal gut dass du Zugang zu einem Oszi hast und damit umgehen kannst.

Evtl. musst du später den Sketch mit einem Programmer hochladen und somit den Bootloader umgehen, um die Startverzögerung vom Arduino zu umgehen.

zuendler: Danke für die Anwort, ich habe meinen ersten Beitrag korrigiert.

Danke und Du scheinst auch Spaß zu verstehen :)

zuendler: Ich habe zwar auf dem Zettel geschrieben 1ms, gemessen habe ich allerdings ca. 0,9ms. Daher habe ich den Wert auf 900 Microsekunden angepasst. Ein Freund der aus der Ecke kommt hat gemeint das könnte durchaus eine Rolle spielen wenn man es nicht 100% einhält.

Die Arduinos sind beim Timing nicht so super genau und digitalWrite() braucht, wie schon erwähnt, auch noch Zeit.

zuendler: Falls es nicht funktioniert muss ich mir eh erst am Oszi anschauen was da für ein Signal heraus kommt und dann korrigieren.

Gute Idee! Ein Scope für den Läppi gibt es beim Chinesen für 8€, sollte man in der Werkstatt haben, wenn man sich mit solchen Themen befaßt.

zuendler: Wo kommt das Signal von dir her?

Das ist Dein Programm nach ein paar Korrekturen, angesehen mit BitScope (kann auch analog).

zuendler: Mein Arduino Board ist noch nicht da, ich kann es selbst noch nicht ausprobieren.

Die IDE könntest Du aber schon mal installieren und uns dann mit Code erfreuen, der auch compiliert. Beispielsweise muß digitalWrite zweimal korrigiert werden.

Welchen Arduino willst Du nutzen?

Danke, jetzt läuft mein Code schon anderswo bevor ich überhaupt das Programm gestartet habe. :D Das Feedback hier ist übrigens super, muss ich schon sagen. Spass, ja verstehe ich. Wenn ich gut drauf bin lache ich auch schonmal ausserhalb vom Keller.

Das zweite digitalWrite habe ich gefunden, thx. Was ich an der Software schade finde ist, dass es keine grafische Darstellung der Eingänge und Ausgänge gibt. Man könnte das Board ja schön emulieren und es dann am PC testen noch bevor man was mit der Hardware macht.

Ich habe mir den Uno bestellt. Ist schon toll was man alles damit machen kann, und das zu einem Spottpreis verglichen mit einer SPS (daran habe ich noch gelernt...früher...). Da werde ich zukünftig sicherlich noch einige Anwendungen haben.

Im Internet gibt es ja kaum etwas, was es nicht gibt: Arduino Simulator

Damit habe ich aber noch nicht gearbeitet, der Arduino selbst ist mein Simulator. Ein Brotbrett, LEDs und ein Scope zeigen, was passiert.

Ein UNO als Einstieg ist prima! Nicht unproblematisch, daher eine Möglichkeit, aber keine Empfehlung. Oder sowas. Oder ein kleiner ProMini. UNO, Nano und ProMini haben den ATmega328 als µC, also gleiche Pinbelegung usw. Ich entwickle auf dem UNO, um das Programm dann auf den Kleinen laufen zu lassen.

Simulatoren sind immer nur so gut wie sie die Wirklichkeit darstellen können. Es nützt Dir nichts daß der Sketch im Emulator läuft aber dann nicht aufn Arduino.
Grüße Uwe

Heute ist mein UNO gekommen (Lustigerweise hatte ich mit 18 auch einen, aber der war von Fiat…)
Jedenfalls erstmal den Blinker draufgeladen zwecks Funktionstest: geht
Dann mein Progrämmchen abgeändert so dass es ohne input immer on und off sendet.
Angeklemmt und: es tut sich nix.
Dann habe ich ne ganze Weile mit den Zeiten experimentieren müssen und plötzlich gings.
Die Endstufen sind da recht wählerisch was die genaue Taktung angeht muss ich sagen.
0,9ms sind zu lang, 0,84ms schon zu kurz. Leider habe ich ja kein Oszi daheim um genau zu sehen
was da heraus kommt.
Jedenfalls nochmal vielen Dank an alle, mit dem Rest komme ich alleine klar.

Danke für die Rückmeldung und viel Spaß!

hi,

na gut, dann werd' ich mal eine sprinkleranlage hier im forum installieren, den zuendler sehen wir wohl noch öfter...

gruß stefan

PS.: wenn Du mal sehen willst, was bei den pins so rauskommt, nimm Dir einen Saleae Logic 8. aber halt nicht das original um 200, sondern einen nachbau bei ebay und konsorten um 6 euro. software vom original. wenn's Dich juckt auch einen von den größeren mit analog. elektronik allgemein. immer erst bei ebay, banggood und aliexpress suchen, wenn's nicht eilig ist.

herzlich willkommen und viel spaß...

Hallo,

wenn deine Timings so verdammt eng sind, kommste nicht drum herum auf die Arduino Komfortbefehle zu verzichten. Du mußt den Pin direkt ansprechen, klassische Programmierung, leider.

UNO Pinout

void setup() {
  pinMode(13, OUTPUT);

}

void loop() {

  PORTB |= (1 << PB5);    // Port.B Bit.5 setzen 
  delayMicroseconds(900);                
  PORTB &= ~(1 << PB5);   // Port.B Bit.5 löschen 
  delayMicroseconds(900);  
}

Danke, ist mal gut zu wissen, dass man da noch mehr rausholen kann wenns nötig ist.

Ich habe aber einfach die Grenzen ausgelotet die der Empfänger noch frisst und das Intervall genau in die Mitte gelegt :wink: Das lasse ich jetzt einfach so. Ich habe mir nur noch ein paar Funktionen dazu gebastelt.

Wie gesagt bin ich ja Anfänger und wir wollen die Lernkurve hat nicht zu steil stellen gell :slight_smile:

Grundsätzlich finde ich den Arduino aber schon eine super Sache! Wenn ihr wüsstet was ich mir in der Vergangenheit für Steuerungsboards gebastelt habe nur um Timingfunktionen und und-Verknüpfungen etc. zu realisieren. Und jetzt ist das mit ein paar Zeilen Code erledigt auf nem fertig gekauften Board für ein paar Euro. Und obendrauf kann man sich noch La-Paloma spielen lassen lol. Also mir gefällts!

Hallo,

wenn das Timing mit digitalWrite usw. okay ist, dann ist das okay. Falls es noch enger werden sollte, behälste das im Hinterkopf. Kein Problem. Viel Spass weiterhin.