Riesen Problem mit Arduino (Rundumlicht)

Hallo zusammen,

leichtgläubig wie ich bin habe ich auf Empfehlung von Franzis mir das Paket Arduino im RC Modellbau gekauft. Leider ist das ganze für mich als Anfänger doch recht unübersichtlich und verwirrend. Leider bin ich auch der Englischen Sprache nicht so mächtig. Vorab vielleicht mal die Erklärung meines Vorhabens. Bislang habe ich mir mit einem Schaltplan eine eigene Rundumlicht Logik für ein großes Feuerwehrschiff gebastelt. Kurz mit einem NE555 und einem IC4017. Angeschlossen habe ich hier 9 SMD LEDs in blau. Der Effekt des Rundumlichtes war mir aber noch nicht realistisch genug. Es sollte später ähnlich den neuen Blaulichtern die ja auch auf LED gebaut sind entsprechen. Also Rundumlicht mit Blitzeffekt. Der Sketch der dafür dort herunter zu laden war zeigt auch nur Fehler. Fehlercode kommt zum Schluss. Ich habe also weder einen Plan wie ich das richtig Programmiere noch wie ich nachher schalten muss. Ich hatte gestern ein schönes Tut gefunden wo eine einfache Schaltung geliefert wurde mit Skatch. Dort 2 LEDs die abwechselnd blinken. Das hat dann auch wunderbar funktioniert. So nun aber mal der Fehlercode:

Leuchtturm.ino: In function 'void setup()':
Leuchtturm:49: error: 'SoftPWMBegin' was not declared in this scope
Leuchtturm:53: error: 'SoftPWMSet' was not declared in this scope
Leuchtturm:58: error: 'ALL' was not declared in this scope
Leuchtturm:58: error: 'SoftPWMSetFadeTime' was not declared in this scope
Leuchtturm.ino: In function 'void loop()':
Leuchtturm:65: error: 'SoftPWMSet' was not declared in this scope
Leuchtturm:70: error: 'SoftPWMSet' was not declared in this scope

Sieht danach aus als ob du die Library nicht oder nicht korrekt installiert hast.

Du musst diese ins libraries Verzeichnis der Arduino IDE kopieren und danach mit #include einbinden

Hallo!
Du musst auch noch die SoftPWM Library installieren.
Das “Heft” ist doch in Deutsch, die HP vom Autor auch ?

mfg Martin

Huh. Vielen lieben Dank für die schnelle Rückantwort. In der Tat ist es so das die Dateien gesondert im Sketch Ordner waren. Ich habe die library jetzt in die IDE library kopiert. Aber wie bitte bekomme ich die per #include drauf ? Wenn ich das mache mit:

#include "SoftPWM.h"
#include "SoftPWM_timer.h"

Dann bekomme ich leider Fehler beim Kompilieren:

core.a(main.cpp.o): In function `main':
C:\Program Files (x86)\Arduino\hardware\arduino\cores\arduino/main.cpp:11: undefined reference to `setup'
C:\Program Files (x86)\Arduino\hardware\arduino\cores\arduino/main.cpp:14: undefined reference to `loop'

main()? Hast du da reinen AVR Code? Eine main() Methode wie in Standard C gibt es auf dem Arduino nicht. Es gibt nur loop() und setup()

Poste mal deinen ganzen Sketch.

Serenifly: main()? Hast du da reinen AVR Code? Eine main() Methode wie in Standard C gibt es auf dem Arduino nicht. Es gibt nur loop() und setup()

Poste mal deinen ganzen Sketch.

Eine main() Funktion gibt es in jedem C-Programm. Bei Arduino gibt es sie auch und ist irgendwo in einer Bibliothek versteckt. Die main() Funktion ruft setup() und loop() auf. Eine zweite main() Funktion im Sketch produziert Fehler. Grüße Uwe

Das ist mir schon klar. Aber die Funktion ist nicht sichtbar und sollte eben nicht per Hand geschrieben werden

Also ich kopiere mal zum Schluss den eigentlichen Sketch.
Jetzt aber erstmal kann ich zumindest einen Teilerfolg verkünden.
Ich habe die Blinklicht Methode mit 2 LED einfach erweitert so das ich jetzt 4 LEDs dran habe.
Er macht also jetzt mit delay 200 eine Lauflicht Logik. Wobei das Feintuning mit delay kein Problem sein sollte. Also eigentlich nichts anderes wie bei dem bereits von mir gelöteten Lauflicht mit NE555 und IC4017 über Poti. Jetzt will ich sozusagen noch ein blitzen mit rein bekommen. Ähnlich diesem Video LEDPROFISHOP Rundumlicht D=30 mm GELB für RC Modelle - YouTube
Mein Sketch sieht jetzt so aus:

/*Einfaches LED Blinklicht*/
/*Pin’s für die LED’s definieren*/
int led1 = 0;
int led2 = 1;
int led3 = 2;
int led4 = 3;
/*Den Modus (Eingang oder Ausgang) der Pin’s definieren*/
void setup(){
pinMode(led1, OUTPUT);
pinMode(led2, OUTPUT);
pinMode(led3, OUTPUT);
pinMode(led4, OUTPUT);
}
/*Das eigentliche blinken der LED’s*/
void loop(){
digitalWrite(led1, HIGH); /*LED 1 an*/
digitalWrite(led2, LOW);  /*LED 2 aus*/
digitalWrite(led3, LOW);  /*LED 3 aus*/
digitalWrite(led4, LOW);  /*LED 4 aus*/
delay(200);   /*warte 500 ms*/
digitalWrite(led1, LOW); /*LED 1 aus*/
digitalWrite(led2, HIGH);  /*LED 2 an*/
digitalWrite(led3, LOW);  /*LED 3 aus*/
digitalWrite(led4, LOW);  /*LED 4 aus*/
delay(200);  /*warte 500ms*/
digitalWrite(led1, LOW); /*LED 1 aus*/
digitalWrite(led2, LOW);  /*LED 2 aus*/
digitalWrite(led3, HIGH);  /*LED 3 an*/
digitalWrite(led4, LOW);  /*LED 4 aus*/
delay(200);  /*warte 500ms*/
digitalWrite(led1, LOW); /*LED 1 aus*/
digitalWrite(led2, LOW);  /*LED 2 aus*/
digitalWrite(led3, LOW);  /*LED 3 aus*/
digitalWrite(led4, HIGH);  /*LED 4 an*/
delay(200);  /*warte 500ms*/
}

So nun noch der Sketch der von Franzis bzw. rcarduino.tk der die Fehler bringt. Hab mal das Copyright usw. weg gelassen um Platz zu sparen. Auch werde ich wohl keinen Schalter brauchen wie hier geschrieben.:

#include <SoftPWM.h>
#include <SoftPWM_timer.h>
/*
  leuchtturm.ino - Rundumlichtsteuerung  - Version 0.1
Leuchtturm mit 12 LED's an den Ausgängen D0..D11. Alle LED werden mit SoftPWM angesteuert,
 so kann man das Nachleuchten schön simulieren.  
 1 Taster zum Einschalten an D12. 
 Über das Array kann die Leuchtfolge bestimmt werden.
*/

// Anzahl der LED's
const byte MAX_LED = 12;
// Zeit für einen Umlauf
const int UMLAUFZEIT = 2000;
// Leuchtfolge
byte leuchtfolge[] = {
  0, 0, 0, 0, 0, 128, 255, 128, 0, 0, 0, 0};
// Schalter zum Einschalten
const byte SCHALTER = 12;

// ab hier kommen die Programmvariablen
int zeit = UMLAUFZEIT / MAX_LED;

void setup() {
  // Schalter ist Eingang mit Pullup
  pinMode(SCHALTER, INPUT_PULLUP);
  
  // Start der SoftwarePWM-Bibliothek
  SoftPWMBegin();

  // Alle LED's als OUTPUT Pins und erstmal aussschalten 
  for (int i = 0; i < MAX_LED; i++) {
    SoftPWMSet(i, 0);
  }

  // Hier kann man Zeiten definieren, damit die LED's nicht nur einfach an und aus gehen,
  // sondern schön faden.
  SoftPWMSetFadeTime(ALL, 100, 100);

}

void loop() {
 if (digitalRead(SCHALTER) == 0) {
    for (int i = 0; i < MAX_LED; i++) {
      SoftPWMSet(i, 0);
    }
  } 
  else {
    for (int i = 0; i < MAX_LED; i++) {
      SoftPWMSet(i, leuchtfolge[i]);
    }

    byte temp = leuchtfolge[0];
    for (int i = 1; i < MAX_LED; i++) {
      leuchtfolge[i-1] = leuchtfolge[i];
    }
    leuchtfolge[MAX_LED - 1] =  temp;
  }
  delay(zeit);
}

Hallo! Sollte eigentlich laufen. ..gibts an der IDE unter Datei/Beispiele einen Eintrag "SoftPWM" ? Wenn nicht, wurde die Lib in einen gleichnamigen Ordner kopiert ?

mfg Martin

Hallo,

ja wie gesagt das was ich jetzt von dem Beispiel was ich gesehen hatte erweitert habe funktionierte ja einwandfrei. Nur das 2. Beispiel ging nicht. Also Leuchttonne bzw. Blaulicht.
Also im Programm unter Beispiele ist eine SoftPWM vorhanden. Rufe ich mir das Beispiel SoftPWM_Arduino_LED_Blink auf dann steht da auch was. Da ist sogar #include mit eingebunden. Beim Überprüfen zeigt er hier keine Fehler an.
Nur ist mir nicht klar wo ich da was anschließen muss irgendwie. Auch hier mal der Code villeicht könnt ihr mir sagen was da eingebunden ist und wo angeschlossen werden muss. Dann könnte ich mal nen Test starten.

#include <SoftPWM.h>

void setup()
{
  SoftPWMBegin();
  
  SoftPWMSet(13, 0);

  SoftPWMSetFadeTime(13, 1000, 1000);
}

void loop()
{
  SoftPWMSet(13, 255);
  delay(1000);
  SoftPWMSet(13, 0);
  delay(1000);
}

Nur ist mir nicht klar wo ich da was anschließen muss irgendwie

Na so komplex ist das Beispiel ja nicht. Ich tippe mal, Pin13 soll eine LED sein ( da ist jedenfalls auf dem Uno Board schon eine ). Brauchst du also gar nix anschliessen, nur gucken ;)

Serenifly: Das ist mir schon klar. Aber die Funktion ist nicht sichtbar und sollte eben nicht per Hand geschrieben werden

Wieso sollte die "int main(void)" nicht von hand geschrieben werden? Hab setup() und loop() in den Sketchen überhaupt nicht mehr drin. Es wird nicht gemeckert-

michael_x:

Nur ist mir nicht klar wo ich da was anschließen muss irgendwie

Na so komplex ist das Beispiel ja nicht. Ich tippe mal, Pin13 soll eine LED sein ( da ist jedenfalls auf dem Uno Board schon eine ). Brauchst du also gar nix anschliessen, nur gucken ;)

Hast recht. Hab es ausprobiert. Naja glaube das Faden passt nicht so gut zu einem Rundumlicht. Wie gesagt mit dem was ich nach dem Blinklicht weiter geschrieben habe geht es ja. Das Prinzip ist mir hier jetzt auch soweit klar. Um so mehr SMD ich anschließen will um so weiter muss ich es erweitern. Aber wie gesagt dieses Rundumlicht gefällt mir so einfach nicht. Es macht nichts anderes als wenn ich mir eine Platine mit NE555 und IC4017 löte. Und die ist kleiner als der Arduino ^^ Mir fehlt jetzt einfach der Blitzeffekt wie in dem Video gezeigt. Wäre super wenn jemand mir hier weiter helfen kann.

Natürlich kann man mit mehr oder weniger Aufwand manche Software auch mit Hardware simulieren ;)

Ob die SoftPWM library überhaupt das ist, was du willst, oder ob du nur mit

SoftPWMSetFadeTime(13, 1000, 1000);

eine Funktion verwendest, die du eigentlich gar nicht willst, weiss ich nicht.

Ein beliebig kurzer Lichtblitz ist aber eigentlich kein Problem Für einen Rundum-Effekt brauchst du aber min. 3 oder mehr LED. Ob bei 5 LED Faden via PWM überhaupt was bringt, ist die Frage. Schalte sie erstmal im Kreis ein/aus, so dass immer 2/5 an sind.

sschultewolter:

Serenifly: Das ist mir schon klar. Aber die Funktion ist nicht sichtbar und sollte eben nicht per Hand geschrieben werden

Wieso sollte die "int main(void)" nicht von hand geschrieben werden? Hab setup() und loop() in den Sketchen überhaupt nicht mehr drin. Es wird nicht gemeckert-

Der Originale Blink Sketch : Binäre Sketchgröße: 1.084 Bytes (von einem Maximum von 32.256 Bytes)

/*
  Blink
  Turns on an LED on for one second, then off for one second, repeatedly.

  This example code is in the public domain.
 */

// Pin 13 has an LED connected on most Arduino boards.
// give it a name:
int led = 13;

// the setup routine runs once when you press reset:
void setup() {                
  // initialize the digital pin as an output.
  pinMode(led, OUTPUT);     
}

// the loop routine runs over and over again forever:
void loop() {
  digitalWrite(led, HIGH);   // turn the LED on (HIGH is the voltage level)
  delay(1000);               // wait for a second
  digitalWrite(led, LOW);    // turn the LED off by making the voltage LOW
  delay(1000);               // wait for a second
}

Binäre Sketchgröße: 548 Bytes (von einem Maximum von 32.256 Bytes)

/*
  Blink
  Turns on an LED on for one second, then off for one second, repeatedly.

  This example code is in the public domain.
 */

// Pin 13 has an LED connected on most Arduino boards.
// give it a name:
int led = 13;

// the setup routine runs once when you press reset:
int main(void) {                
  // initialize the digital pin as an output.
  pinMode(led, OUTPUT);  
  
}

// the loop routine runs over and over again forever:
void loop() {
  digitalWrite(led, HIGH);   // turn the LED on (HIGH is the voltage level)
  delay(1000);               // wait for a second
  digitalWrite(led, LOW);    // turn the LED off by making the voltage LOW
  delay(1000);               // wait for a second
}

Nur blinkt die LED nicht :roll_eyes:

Nur blinkt die LED nicht

Warum auch ? loop() wird ja auch nicht aufgerufen in deinem main

füge dieseZeile in main ein:

while(true) loop();

Übrigens schon erstaunlich, dass das Arduino-eigene main() nicht zwangsweise hinzugefügt wird ( und einen Fehler verursacht )

Binäre Sketchgröße: 940 Bytes (von einem Maximum von 32.256 Bytes)

// the setup routine runs once when you press reset:
int main() {                
  // initialize the digital pin as an output.
  pinMode(led, OUTPUT);  
  while(true) loop();
}

Auch so blinkt nix

Also ich hab auch noch mal rumgetestet. Ich habe tatsächlich diese Lichttonne ans laufen bekommen. Nur wie ich mir schon dachte ist das Faden irgendwie nicht so toll da es ja doch ehr den Leuchtturm Effekt hat als den Blaulicht Effekt.
Zur Information. Vorgesehen sind 9 SMD LEDs die bereits eine Kreisform haben. Ich habe hierzu die Cathoden an einen Lötpunkt gelötet. So nun muss ich das ganze halt so hinbekommen das der normale Rundumlicht Effekt entsteht mit Blitzlicht sozusagen. Also so wie es bei den Modernen mit LED ausgestatteten Fahrzeugen ist. Aber wie gesagt wüsste nicht wie ich das hinbekommen kann. Kenne mich halt nicht so gut aus ;(

Schreibe doch erst einmal einen Sketch für ein normales Lauflicht.

Den hab ich ja schon bis zur 4. LED geschrieben. 5. Kabel ist angelötet aber noch nicht verdrahtet. Vielleicht bekomme ich heute noch welche gelötet ;) Wie gesagt habe den eigentlichen Sketch nur erweitert.

/*Einfaches LED Blinklicht*/
/*Präsentiert von http://elektonik-experimente.sebastian-hehn.de*/
/*Pin’s für die LED’s definieren*/
int led1 = 0;
int led2 = 1;
int led3 = 2;
int led4 = 3;
/*Den Modus (Eingang oder Ausgang) der Pin’s definieren*/
void setup(){
pinMode(led1, OUTPUT);
pinMode(led2, OUTPUT);
pinMode(led3, OUTPUT);
pinMode(led4, OUTPUT);
}
/*Das eigentliche blinken der LED’s*/
void loop(){
digitalWrite(led1, HIGH); /*LED 1 an*/
digitalWrite(led2, LOW);  /*LED 2 aus*/
digitalWrite(led3, LOW);  /*LED 3 aus*/
digitalWrite(led4, LOW);  /*LED 4 aus*/
delay(120);   /*warte 500 ms*/
digitalWrite(led1, LOW); /*LED 1 aus*/
digitalWrite(led2, HIGH);  /*LED 2 an*/
digitalWrite(led3, LOW);  /*LED 3 aus*/
digitalWrite(led4, LOW);  /*LED 4 aus*/
delay(120);  /*warte 500ms*/
digitalWrite(led1, LOW); /*LED 1 aus*/
digitalWrite(led2, LOW);  /*LED 2 aus*/
digitalWrite(led3, HIGH);  /*LED 3 an*/
digitalWrite(led4, LOW);  /*LED 4 aus*/
delay(120);  /*warte 500ms*/
digitalWrite(led1, LOW); /*LED 1 aus*/
digitalWrite(led2, LOW);  /*LED 2 aus*/
digitalWrite(led3, LOW);  /*LED 3 aus*/
digitalWrite(led4, HIGH);  /*LED 4 an*/
delay(120);  /*warte 500ms*/
}