RC-Carduino - Mein erster Sketch und ein paar Fragen

Nabend alle zusammen! Ich habe mir in den Kopf gesetzt einige Zusatzfunktionen meines RC-Cars per Arduino mittels Infrarot-FB zu steuern. Zum einen möchte ich die Scheinwerfer mehrstufig schalten (Taste 1 = Standlicht, Taste 2 = Abblendlich,Taste 3 = Fernlicht, Taste 4 = Lichthupe) Den Sketch zu den Tasten 1-3 habe ich hoffentlich hinbekommen. Zumindest kein Gemecker mehr beim kompilieren. Mit dem Sketch sollte ich durch drücken der jeweiligen Taste auch zwischen den Zuständen springen können. Fällt da jemanden etwas negativ auf? Wäre euch für Hilfe sehr dankbar.

#include 

int RECV_PIN = 11;
IRrecv irrecv(RECV_PIN);
decode_results results;

int ledpin = 1;
int ledpinstatus = 0;
void setup() {

  Serial.begin(9600);
  irrecv.enableIRIn();
  pinMode(1, OUTPUT);
}

void loop() {

  if (irrecv.decode(&results)) {
    Serial.println(results.value, DEC);
    switch (results.value) {
      case (00000001) :
        if (ledpinstatus != 70) {
          analogWrite(ledpin, 70);
          ledpinstatus++;
        }
        else {
          analogWrite(ledpin, 0);
          ledpinstatus--;
        }
        delay(1); break;

        switch (results.value) {
          case (000000002) :
            if (ledpinstatus != 150) {
              analogWrite(ledpin, 150);
              ledpinstatus++;
            }
            else {
              analogWrite(ledpin, 0);
              ledpinstatus--;
            }
            delay(1); break;

            switch (results.value) {
              case (0000000003) :
                if (ledpinstatus != 255) {
                  analogWrite(ledpin, 255);
                  ledpinstatus++;
                }
                else {
                  analogWrite(ledpin, 0);
                  ledpinstatus--;
                }
                delay(1); break;
            }
        }
    }
  }
}

Jetzt zur Lichthupe: Da hänge ich gerade richtig... Wi implementiere ich da jetzt die Funktion Lichthupe an, während Taste 4 gedrückt wird, danach zurück zu vorherigem Zustand?

if (0000004 == HIGH) {
    analogWrite(ledPin, 255);
  } else {
    analogWrite(ledPin, 0);
  }

Bin mir nicht sicher ob die Zeile in Verbindung mit dem Rest so funktioniert, weiterhin will ich ja auf den vorherigen Status zurück und nicht auf 0. Also müsste ich den vorherigen Status speichern und wieder abrufen, aber da bin ich mit meinem Anfängerlatein völlig am Ende. Könntet ihr mir da weiterhelfen?

Da du für den Sketch keine Code-Tags verwendest, ist dieser schwer lesbar.

Setze den bitte in Code-Tags, Schaltfläche oben links im Editorfenster.

Die Anweisung "switch(results.value)" ist nur einmal (erste) notwendig.

Mehr, wenn der Sketch besser lesbar ist.

Hi

Du musst Deine Anweisungen auch durcharbeiten, wenn keine Taste erkannt wird.

Wenn Taste==4 && Lichthupe==0 --> Altzustand=Zustand_aktuell Zustand_aktuell=Fernlicht Lichthupe=1

Wenn keine_Taste && Lichthupe==1 --> Zustand_aktuell=Altzustand Lichthupe=0

Separat prüfst Du den Zustand und schaltest die entsprechende(n) LED(s) an/aus. Wenn DU millis() mit ins Boot holst, kannst Du von Null auf Fernlicht auch die einzelnen Zustände (Standlicht, Abblendlicht, Fernlicht) in jeweils 200ms Abstand 'durchschalten'.

Denke mir Das ungefähr so: WunschZustand=IR-Taste Wenn millis()-StartWartezeit>200 --> Wenn Zustand_aktuell < WunschZustand --> Zustand_aktuell++ StartWartezeit=millis()

Verständlich?

PS: Du kannst den Code auch 'Formatieren' lassen - dann kommt die Einrückung besser raus und man sieht, was womit zusammen gehört.

Du kannst den Arduino auch die Kontrolle über die Servos(Lenkung)/den Motorsteller geben - sind Beides auch nur Aktoren, Die mit einem Servo-Signal angesteuert werden - und Das kann der Arduino auch selber - vll. nicht im höchsten Gang und vor der Treppe probieren ;)

MfG

PS: Das mit dem 'Lesbar' hatte ich ja auch ...

roninsupreme: Fällt da jemanden etwas negativ auf?

Führende Nullen leiten oktale Zahlen ein, was Du vermutlich nicht willst. Siehe Integer Constants.

Scheint eine komische Fernbedienung zu sein, meine gibt gänzlich andere Werte aus. Oder ist das nur theoretisch?

Willst Du Umschalten oder Dimmen? Wenn der Simulator in meinem Kopf richtig arbeitet, dürfte keines funktionieren. Das hängt auch davon ab, was Deine Fernbedienung sendet, wenn ein Knopf gedrückt bleibt. Manchmal wird der Code wiederholt, manchmal gibt es einen Wiederholungscode.

Die IDE bietet mittels Strg+t eine schöne Formatierungsmöglichkeit und dieses Forum mit einen Knopf zur Anzeige von Programmzeilen. Die Nutzung wird empfohlen!

Damit willkommen im Forum :)

PS.: Wieso fühle ich mich gerade wie eine Schnecke?

Sorry folks, die Codefunktion habe ich vorhin irgendwie nicht gefunden. Asche über mein Haupt.

Die Zahlen sind Platzhalter für die Codes der Fernbedienung, die ist noch auf dem Weg. Ich möchte je nach gedrückter Taste die Helligkeit umschalten können und dabei auch nicht dimmen sondern stumpf von Standlicht auf Fernlicht oder Abblendlicht oder sonstwie umschalten.

Taste 1 einmal drücken = Standlicht an. Nochmaliges Drücken = Standlicht aus. Alternativ Taste 3 anstatt nochmals Taste 1= umschalten von Standlicht auf Fernlicht. So als Beispiel...

Hi

Dann ist's ja noch weniger ein Problem. Bei den normalen Funktionen prüfst Du, ob die gewünschte Szene bereits anliegt, wenn nicht einschalten, wenn doch ausschalten. Die aktuelle Szene wirst Du Dir dabei merken müssen - auch ein AUS muß man sich da merken! Bei der Lichthupe merkst Du Dir die 'alte Szene' - kann ja auch AUS sein - und stellst auf Diese zurück, wenn die Taste nicht mehr erkannt wird.

Für bessere Rundumsicht wirst Du wohl mehrere Empfänger verbauen müssen - im häuslichen Bereich kommen Dir Wände und Möbel entgegen - Diese reflektieren das IR-Licht, bis Es zum Fernseher gefunden hat. Vor der Tür sind die Entfernungen nicht nur größer, so eine Tanne dürfte auch mehr von dem IR-Licht verschlucken. Und Licht muß man Sehen - auch der Arduino - braucht also eine Sicht-Verbindung. Man könnte probieren, ob eine einfache Parallelschaltung der Photo-Dioden (denke was in der Richtung TSOP, oder?) funktioniert - VORHER das Datenblatt danach überprüfen - wäre ja blöd, wenn die Empfänger sich gegenseitig abschießen.

MfG

roninsupreme: ... sondern stumpf von Standlicht auf Fernlicht oder Abblendlicht ...

Dann frage ich mich, was ledpinstatus++ und ledpinstatus-- bewirken soll, geht einfacher:

            if (ledpinstatus != 150) {
              ledpinstatus = 150;
            }
            else {
              ledpinstatus = 0;
            }
...
            analogWrite(ledpin, ledpinstatus);

Analog auch für 70 und 255.

Huiuiui, 33 Jahre IT-Muffeligkeit rächen sich gerade :o

Kurz zur Erklärung meines wilden Sketches. Habe mich gestern etwas eingelesen und mich dann an vorhandenen Tutorials entlanggehangelt und daraus versucht etwas für mich zu basteln.

switch (results.value) {
      case (00000001) :
        if (ledpinstatus != 70) {
          analogWrite(ledpin, 70);
        }
        else {
          analogWrite(ledpin, 0);
          delay(1); break;

Switch (results.value) habe ich jetzt nur noch beim ersten drin und ledpinstatus++ ist auch raus . Blöde Frage: Wofür brauche ich denn an Schluss Delay(1); break; ?

break beendet den aktuellen if-Loop, hab ich verstanden. Aber das delay bringt da doch genau nichts, oder?

roninsupreme: Wofür brauche ich denn an Schluss Delay(1); ?

Um einen µC unnötig auszugremsen. Keine blöde Frage!

roninsupreme: break beendet den aktuellen if-Loop, ...

Nö, case wird beendet, siehe switchCase.

roninsupreme: Huiuiui, 33 Jahre IT-Muffeligkeit rächen sich gerade :o

Da sind Dir aber 33 Jahre Spaß mit Kreativität entgangen ;D

Dann hab ich das mit dem delay ja richtig gerafft

void Erfolgerlebnismodus()

Da ich mein Grundkurs nerdisch noch nicht beendet habe, hab ich mich natürlich komplett falsch ausgedrückt. Ich meinte bzgl. Break aber das gleiche ;-)

roninsupreme: Ich meinte bzgl. Break aber das gleiche ;-)

Ja ja, "4" schreiben, "5" sagen und "6" wäre richtig :grin:

Jetzt warten wir auf Deine Fernbedienung, was die im Wiederholungsfall macht.

agmue: Jetzt warten wir auf Deine Fernbedienung, was die im Wiederholungsfall macht.

Ein kleiner Überblick was das sein könnte gibt es hier: ein paar IR-Protokolle

So, da bin ich wieder… Da Manche Ebay-Händler eher entschleunigt unterwegs sind, ist mittlerweile alles da, außer dem Nano. Also den ollen Franzis-Uno rausgekramt, den ich mal geschenkt bekommen habe und los gehts. Zumindest theoretisch.

Und schon brauche ich eure Hilfe. Korrigiert mich, wenn ich was falsch gemacht habe, aber irgendwie kriege ich keinen Sketch auf den Uno.

Die IDE samt Treiber (amd-64) installiert, den Uno angeschlossen, unter Werkzeuge Uno und Com4 ausgewählt, Programmer AVRISP MKII. Sollte also klappen. Ich bekomme allerdings immer folgende Fehlermeldung:

avrdude: stk500_recv(): programmer is not responding
avrdude: stk500_getsync() attempt 10 of 10: not in sync: resp=0x67

Die orangene LED blinkt beim aufspielen vier mal und blitzt dann nur noch sporadisch auf.

Im Gerätemanager (Win10) wird mir der Arduino auch nur als USB-Device und nicht als Arduino angezeigt, hat jemand ne zündende Idee?

roninsupreme:
So, da bin ich wieder… Da Manche Ebay-Händler eher entschleunigt unterwegs sind, ist mittlerweile alles da, außer dem Nano. Also den ollen Franzis-Uno rausgekramt, den ich mal geschenkt bekommen habe und los gehts. Zumindest theoretisch.

Ist das ein originaler Uno ?

Wenn ja, sollte der als Uno angezeigt werden.
Welchen Treiber musstest du denn Installieren ?
Windows erkennt den doch automatisch und installiert den selbstständig.

Der Programmer ist hier mal egal.

Er wird von Franzis als Uno verkauft. Aber ich kann hier gleich mal die Lösung aufzeigen.

Der Kleine hat eine gespaltene Persönlichkeit, er hält sich für einen Duemilanove. Kurz vor seinem wohlverdienten Freiflug hat mich der ATMega168 Chip stutzig gemacht, auf Due und AT168 umgestellt und nun läufts^^

#include                      //IR-Bibliothek

int RECV_PIN = 11;
IRrecv irrecv(RECV_PIN);
decode_results results;

int ledpin = 3;                           //LED auf PWM-Pin 3
int ledpinstatus = 0;                    

void setup() {

  Serial.begin(9600);                     // Serielle Schnittstelle starten
  irrecv.enableIRIn();                    // IR starten
  pinMode(3, OUTPUT);                     // Pin 3 als Output starten
}

void loop() {

  if (irrecv.decode(&results)) {
    Serial.println(results.value, DEC);

    if(16753245 && ledpinstatus != 200) {       //16753245 = Taste 1
      analogWrite(ledpin, 200);
      delay(1000);
      analogWrite(ledpin, 0);
    }}}
 Helft mir bitte mal. Wenn ich Taste 1 drücke, sollte die LED angehen und nach 1Sek wieder erlöschen. Sie flackert aber einmal pro Sekunde und leuchtet dann weiter. Nach meinem DAU-Verständnis sollte der analogWrite(ledpin, 200) doch nur so lange aktiviert sein, wie die Taste 1 auch wirklich gedrückt sein. Anscheinend nimmt der Arduino sie aber dauerhaft, sobald einmal gedrückt wurde. *kopfkratz*
  if(16753245 && ledpinstatus != 200)

liefert immer  true, weil 16753245 nicht null ist und ledpinstatus nicht 200.

roninsupreme: Er wird von Franzis als Uno verkauft. Aber ich kann hier gleich mal die Lösung aufzeigen.

Der Kleine hat eine gespaltene Persönlichkeit, er hält sich für einen Duemilanove. Kurz vor seinem wohlverdienten Freiflug hat mich der ATMega168 Chip stutzig gemacht, auf Due und AT168 umgestellt und nun läufts

Sehr erstaunlich, dass Franzis noch immer Duemilanove mit ATmega168 verkauft. Genau so einer war mein allererster Arduino (im Lernpaket von Franzis). Ich denke den habe ich Anfang 2010 gekauft, da gab es den UNO noch gar nicht und es wurden noch überall Duemilanoves (allerdings mit 328er) verkauft. Dieser Arduino von Franzis war eigentlich schon damals irgendwie eine "Mogelpackung" weil eben nur der "kleinere" Chip drauf war (168 und nicht 328) und noch dazu in SMD-Ausführung, also keine Möglichkeit zum Tausch wenn "abgebrannt". Aber das erkennt man als Anfänger natürlich nicht. Erst als dann plötzlich der Speicher nicht mehr reichte für ein (umfangreicheres) Beispiel von der Arduino-Website, wurde mir klar, das ist nicht "der richtige" Arduino. ;)

Dieses Board von Franzis läuft übrigens noch immer. :) Grade vorige Woche verwendet bei einer "Videoinstallation". Steuerte ein Relaisbord für ein rotes "Aufnahme-läuft-Licht" und hat über serielle Komandos die Eingänge eines Monitors umgeschalten.

So, das war jetzt wohl ein wenig OT :)

#include 

int RECV_PIN = 11; // the pin where you connect the output pin of TSOP4838
int led1 = 3;
int itsONled[] = {0, 0};
int statusval = 0;
int statusvalold = 0;

#define code1  16753245 // code received from button A
#define code2  16736925 // code received from button B
#define code3  16769565 // code received from button C
#define code4  16720605
#define code5  16712445
#define code6  16761405
IRrecv irrecv(RECV_PIN);

decode_results results;

long redonda = 500;
long blanca = redonda / 2;
long negra = blanca / 2;
long corchea = negra / 2;
long semicorchea = corchea / 2;
long C = 261;
long D = 293;
long E = 329;
long F = 349;
long G = 391;
long A = 440;
long B = 493;
int PIN = 8;

void setup()
{
  Serial.begin(9600);   // you can comment this line
  irrecv.enableIRIn();  // Start the receiver
  pinMode(led1, OUTPUT);
  pinMode(PIN, OUTPUT);

}

void loop() {
  if (irrecv.decode(&results)) {
    unsigned int value = results.value;
    switch (value) {
      case code1:
        light(5);
        break;
      case code2:
        light(90);
        break;
      case code3:
        light(255);
        break;
      case code4:
        analogWrite(led1, 255);
        delay(300);
        statusvalold = statusval;
        statusval = 0;
        light(statusvalold);
        break;
      case code5:
        tone(8, 300, 500);

        break;
      case code6:
        for (int X = 1; X <= 3; X++) {
          tone(PIN, C, negra);
          delay(200);
        }

        tone(PIN, F, blanca);
        delay(400);
        tone(PIN, A, blanca);
        delay(400);

        for (int X = 1; X <= 3; X++) {
          tone(PIN, C, negra);
          delay(200);
        }


        tone(PIN, F, blanca);
        delay(400);
        tone(PIN, A, blanca);
        delay(500);

        for (int X = 1; X < 3; X++) {
          tone(PIN, F, negra);
          delay(200);
        }

        for (int X = 1; X < 3; X++) {
          tone(PIN, E, negra);
          delay(200);
        }

        for (int X = 1; X < 3; X++) {
          tone(PIN, D, negra);
          delay(200);
        }

        tone(PIN, C, blanca);
        delay(800);

        break;
    }
  
  Serial.println(value); // you can comment this line
  irrecv.resume(); // Receive the next value
}
}

void light(int val) {
  if (val == statusval) {
    analogWrite(led1, 0);
    statusval = 0;
  } else {
    analogWrite(led1, val);
    statusval = val;
  }
}

So, dank der Hilfe eines Kollegen läufts soweit. Bei einer Kleinigkeit brauche ich aber nochmal eure Hilfe. Und zwar im case code5... Ist das Licht aus, hupts einfach wie es soll. Ist das Licht auf Code1-3, springt es nach Betätigen der Hupe auf Code 2, also light(90). Ich finde allerdings den Bug nicht. Habt ihr eine zündende Idee?

Weiterhin würdemich mal interessieren, ob ihr schon mal mit dem NodeMCU gearbeitet habt. Die Steuerung der Funktionen per Webinterface übers Handy wäre schon sehr nett.