Atmega328P 8Mhz mit IR-Empfänger LED steuern

Hallo Leute,

bin ein absoluter Neuling und somit Laie was Elektronik und Arduino betrifft und hoffe somit auf Eure tatkräftige Unterstützung der sozialen Schwarmintelligenz.
Habe jetzt mein allererstes Projekt gestartet und komme im Moment selbst nicht weiter, auch Google ist wenig hilfreich.

Nun als Hintergrundinfo zu meinem Projekt:
Ich habe mir ein Modell einer Harley Davidson Fat Boy gebaut und LEDs in die Blinker und Scheinwerfer eingebaut, die ich mit einer IR-Fernbedienung steuern möchte. Eigentlich ein relativ simples Projekt, wozu es schon viele Infos im Internet gibt. Die LED-Steuerung soll mit dem Atmega328 gehen, den ich als Standalone ohne den Quarzkristall mit 8 Mhz und mit einem 3,7V LiPo betreiben möchte.
Bei Youtube gibt es sehr viele Videos dazu, wo Leute Motorrad- und Automodelle mit IR-gesteuerten LEDs so funktionsfähig getuned haben.

Das Steuern der einzelnen LEDs funktioniert wunderbar mit einem normalen Arduino UNO mit der Fernbedienung und der Programmcode funktioniert wie ich es will. Die Prototypschaltung ist somit OK.

Die Prototypschaltung soll jetzt auf ein Minimum reduziert werden, sodass der Akku, mit dem später der Atmega328 betrieben werden soll, möglichst lange hält und alles kompakt in das Harleymodell passt (viel Platz ist da leider nicht für die Elektronikteile). Jetzt habe ich auf den Atmega328 einen Bootloader für 8 Mhz drauf gemacht laut dieser Anleitung:

Der Atmega328 läuft jetzt mit 8 Mhz problemlos mit dem Arduino als Stromquelle. Getestet habe ich ein Beispielsketch mit einer blinkenden LED.

Jetzt kommt das für mich nicht lösbare Problem:
Wenn ich den Standalone Atmega328 mit 8 Mhz an meine geplante und bereits getestete LED-Schaltung anschließe, dann funktioniert gar nichts mehr. Die IR-Fernbedienung gibt Signale aus aber keins der Signale kann die LEDs steuern.
Ich vermute dass mit dem internen 8 Mhz Takt der IR-Empfänger nicht mehr richtig arbeitet bzw. dass die Signale nicht mehr richtig verarbeitet werden. Irgendwie soll es wahrscheinlich mit der IR-Library zusammen hängen.

Ich wäre somit jedem von euch sehr dankbar, wenn mein Problem gelöst werden kann und mein erstes Projekt nicht gleich scheitert. Ich bin sicher dass es möglich ist, die LEDs mit dem IR-Empfänger auch mit dem 8 Mhz Atmega328 steuern zu können, denn ein Quarzkristall möchte ich aus Platz- und Energieeinspargründen nicht dran hängen.

Vielen Dank im Voraus für eure tatkräftige Unterstützung.

Schöne Grüße

Alex

Hi

Alex_Ander:
..., dann funktioniert gar nichts mehr. Die IR-Fernbedienung gibt Signale aus aber keins der Signale kann die LEDs steuern.
...

Wie erkennst Du, daß 'gar Nichts mehr' funktioniert?
Hast Du Mal einen Minimal-Sketch auf den nackten Chip gebrannt, Der Deine LED blinken lässt und bei IR-Erkennung 'was Anderes' macht?

Ein klein Wenig mehr als 'gar Nichts' muß Da nämlich schon funktionieren, damit wir hier zu einer Lösung kommen können.

MfG

postmaster-ino:
HiWie erkennst Du, daß 'gar Nichts mehr' funktioniert?
Hast Du Mal einen Minimal-Sketch auf den nackten Chip gebrannt, Der Deine LED blinken lässt und bei IR-Erkennung 'was Anderes' macht?

Ich habe auf den nackten Chip ein Beispielsketch geladen, der eine LED blinken lässt, jedoch ohne IR-Steuerung.
Der Beispielsketch funktioniert, da die LED blinkt.
Somit weiß ich, der nackte Chip mit dem internen 8 Mhz Quarz funktioniert. Das Brennen des Bootloaders für den internen Quarz laut der Internetanleitung hat also geklappt.

Nur wenn ich dann den nackten Chip an meine geplante LED-Schaltung mit dem IR-Empfänger schalte (mit dem geladenen Sketch dafür natürlich), dann lassen sich die LEDs nicht mehr mit der Fernbedienung steuern. Die schalten sich nicht einmal ein.
Da die geplante Schaltung ja auf dem Arduino Uno mit dem externen 16 Mhz Quarz funktionierte, kann es jetzt nur daran liegen, dass der IR-Empfänger nicht mehr mit dem internen 8 Mhz Quarz zurecht kommt.
Ich weiß nicht woran das liegt und wie ich den IR-Empfänger auf den internen 8 Mhz Quarz anpasse.

Wie geschrieben, ich vermute, dass die IR-Signale bei einem 8 Mhz Takt anders verarbeitet werden und dass es vielleicht mit der IR-Library zusammen hängt.

Helft mir bitte, dies wieder hinzubiegen.

Wie sollen wir helfen, wenn dein Sketch geheim bleibt.

Hast du den Sketch denn mal auf einem Uno mit 16 MHz getestet ?
Ich weiß, das IR-Fernbedienung auch mit 8 MHz funktioniert, also an dem Empfänger liegt es nicht, evtl. an der Library, aber auch die ist geheim.

Den folgenden Code habe ich aus einem anderen Forumbeitrag und an mein Projekt angepasst, da ich kein Pro im Programmieren bin:

// LED AN und AUS

#include <IRremote.h>

int RECV_PIN = 11;                     // Pin mit IR-Sensor
int led1_Vorderlicht = 2;              // Pins mit einzelnen LEDs
int led2_Hinterlicht = 3;
int led7_Armaturenbrett = 8;
int led8_Bremslicht = 9;
int led9_Fernlicht = 10;
int itsONled[] = {0,0,0,0,0,0,0,0,0,0,0};

#define code2  16718055                // code der Taste 2 Licht
#define code4  16726215                // code der Taste 5 Fernlicht 
#define code5  16730805                // code der Taste 8 Bremslicht

IRrecv irrecv(RECV_PIN);
decode_results results;

// LED Blinkt
int led3_Blinker_links_vorne = 4;
int led4_Blinker_links_hinten = 5;
int led5_Blinker_rechts_vorne = 6;
int led6_Blinker_rechts_hinten = 7;

unsigned long previousMillis = 0;
const long interval = 700;
#define code1  16724175                // code der Taste 1 Linksblinker
#define code3  16743045                // code der Taste 3 Rechtsblinker

unsigned long currentMillis;
uint8_t ledState = LOW;
uint8_t BlinkStatus;

void setup()
{
  Serial.begin(9600);
  irrecv.enableIRIn();
  pinMode(led1_Vorderlicht, OUTPUT);         // LED AN und AUS
  pinMode(led2_Hinterlicht, OUTPUT);         // LED AN und AUS
  pinMode(led7_Armaturenbrett, OUTPUT);      // LED AN und AUS
  pinMode(led8_Bremslicht, OUTPUT);          // LED AN und AUS
  pinMode(led9_Fernlicht, OUTPUT);           // LED AN und AUS
  pinMode(led3_Blinker_links_vorne, OUTPUT);        // LED Blinkt
  pinMode(led4_Blinker_links_hinten, OUTPUT);       // LED Blinkt
  pinMode(led5_Blinker_rechts_vorne, OUTPUT);       // LED Blinkt
  pinMode(led6_Blinker_rechts_hinten, OUTPUT);      // LED Blinkt
}


void loop() 
{
  currentMillis = millis();
  if (currentMillis - previousMillis >= interval) 
  {
    previousMillis = currentMillis;
    if (ledState == LOW)
      ledState = HIGH;
    else
      ledState = LOW;
  }

  if (itsONled[4] == 1 && itsONled[5] == 1) 
  {
    digitalWrite(led3_Blinker_links_vorne, ledState);
    digitalWrite(led4_Blinker_links_hinten, ledState);
  }

  if (itsONled[6] == 1 && itsONled[7] == 1) 
  {
    digitalWrite(led5_Blinker_rechts_vorne, ledState);
    digitalWrite(led6_Blinker_rechts_hinten, ledState);
  }



  if (irrecv.decode(&results))
  {
    unsigned long value = results.value;
    Serial.println(value);
    switch (value) 
    {
      case code1:
        Muster1();
        break;
      case code2:
        Muster2();
        break;
      case code3:
        Muster3();
        break;
      case code4:
        Muster4();
        break;
      case code5:
        Muster5();
        break;
    }
    irrecv.resume();
  }
}

void Muster1 () 
{
  if (itsONled[4] == 1 && itsONled[5] == 1) 
  {
    itsONled[4] = 0;
    digitalWrite(led3_Blinker_links_vorne, LOW);
    itsONled[5] = 0;
    digitalWrite(led4_Blinker_links_hinten, LOW);
  }
  else 
  {
    itsONled[4] = 1;
    itsONled[5] = 1;
  }
}

void Muster2()
{
  if (itsONled[2] == 1 && itsONled[3] == 1 && itsONled[8] == 1 ) 
  {
    digitalWrite(led1_Vorderlicht, LOW);
    itsONled[2] = 0;
    digitalWrite(led2_Hinterlicht, LOW);
    itsONled[3] = 0;
    digitalWrite(led7_Armaturenbrett, LOW);
    itsONled[8] = 0;
  } else 
  {
    digitalWrite(led1_Vorderlicht, HIGH);
    itsONled[2] = 1;
    digitalWrite(led2_Hinterlicht, HIGH);
    itsONled[3] = 1;
    digitalWrite(led7_Armaturenbrett, HIGH);
    itsONled[8] = 1;
  }
}

void Muster3 () 
{
  if (itsONled[6] == 1 && itsONled[7] == 1) 
  {
    itsONled[6] = 0;
    digitalWrite(led5_Blinker_rechts_vorne, LOW);
    itsONled[7] = 0;
    digitalWrite(led6_Blinker_rechts_hinten, LOW);
  }
  else 
  {
    itsONled[6] = 1;
    itsONled[7] = 1;
  }
}

void Muster4()
{
  if (itsONled[10] == 1) 
  {
    digitalWrite(led9_Fernlicht, LOW);
    itsONled[10] = 0;
    
  } else 
  {
    digitalWrite(led9_Fernlicht, HIGH);
    itsONled[10] = 1;
   
  }
}

void Muster5()
{
  if (itsONled[9] == 1) 
  {
    digitalWrite(led8_Bremslicht, LOW);
    itsONled[9] = 0;
    
  } else 
  {
    digitalWrite(led8_Bremslicht, HIGH);
    itsONled[9] = 1;
   
  }
}

Ok, habe jetzt ert gelesen, dass es mit einem Uno funktioniert.
Evtl. ist da noch ein anderer Fehler.

Und setze den Sketch in Code-Tags, damit man den vernünftig lesen kann.

Warum postest du keinen Link deiner Library ?

Setze doch in die einzelnen Routine serielle debug-Ausgaben rein, damit du erkennen kannst, wo es hakt.

Diese Library benutze ich:

http://z3t0.github.io/Arduino-IRremote/

Ist die gängige, die von vielen im Internet empfohlen wird.

Ideen was bei mir nicht funktioniert???

Wie gesagt, mit dem UNO geht alles aber bei dem nackten Atmega328 mit dem internen 8Mhz Quarz leider nicht mehr.

Hallo,

teste deinen nackten 328 mit einem Blinksketch im Sekundentakt.
Stimmt der optische Takt?
Oder ist er zu langsam? Wenn ja, um wieviel geschätzt zu langsam?
Ich tippe auf falsche Fuseeinstellungen und/oder der Sketch weiß nicht das er mit halben Takt läuft.
Nachdem Test wissen wir mehr woran an liegen mag.

Doc_Arduino:
Hallo,

teste deinen nackten 328 mit einem Blinksketch im Sekundentakt.
Stimmt der optische Takt?
Oder ist er zu langsam? Wenn ja, um wieviel geschätzt zu langsam?
Ich tippe auf falsche Fuseeinstellungen und/oder der Sketch weiß nicht das er mit halben Takt läuft.
Nachdem Test wissen wir mehr woran an liegen mag.

Habe jetzt den Blinksketch nochmals getestet mit programmiertem 1 Sekundentakt.
Die LED leuchtet jedoch genau im 2 Sekundentakt.....habe eine Stoppuhr benutzt.

Der optische Takt stimmt also nicht.

Dann wurde der Bootloader falsch installiert.
Der muss auch mit 8 MHz installiert werden.

Hallo,

es gab 2 Möglichkeiten.
a) 1/8 Fuse gesetzt, dann würde er mit 1 MHz laufen
b) der Sketch weiß noch nicht das er mit 8MHz laufen soll, dass wird im Bootloader über die IDE mit übertragen

b ist derzeit die Antwort.

Aber Moment mal. Wenn du einen nackten 328 hast, da ist gar kein Bootloader drauf.
Wie überträgst du derzeit die Sketche? Mit einem Programmer am ISP?

Doc_Arduino:
Aber Moment mal. Wenn du einen nackten 328 hast, da ist gar kein Bootloader drauf.

Im Ausgangspost wird folgendes erwähnt:

Jetzt habe ich auf den Atmega328 einen Bootloader für 8 Mhz drauf gemacht laut dieser Anleitung:
Gammon Forum : Electronics : Microprocessors : How to make an Arduino-compatible minimal board

Das wäre dann wohl Methode "Arduino as ISP".

Doc_Arduino:
Hallo,

es gab 2 Möglichkeiten.
a) 1/8 Fuse gesetzt, dann würde er mit 1 MHz laufen
b) der Sketch weiß noch nicht das er mit 8MHz laufen soll, dass wird im Bootloader über die IDE mit übertragen

b ist derzeit die Antwort.

Aber Moment mal. Wenn du einen nackten 328 hast, da ist gar kein Bootloader drauf.
Wie überträgst du derzeit die Sketche? Mit einem Programmer am ISP?

Ich glaube irgendwie auch dass Möglichkeit b eher zutrifft. Ich habe ja laut dem Internetlink einen 8Mhz Bootloader draufgebrannt. Über die Eingaben in dem Serialmonitor wird alles automatisch gemacht und ist genial. Schau dir den Link an.

Die Sketche übertrage ich mit dem Arduino UNO als ISP Programmer. Du sagst Möglichkeit b wäre für dich zutreffend. Da fällt mir was auf bei meinen WERKZEUGE Einstellungen im IDE:

Beim Übertragen der Sketche wähle ich aus:

  • Board: Arduino Uno
  • Programmer: Arduino as ISP

Kann es sein dass vielleicht hier der Fehler ist, dass der Sketch nicht weiß, dass er mit 8Mhz laufen soll???
Wenn ja.....was muss ich dann auswählen für die Übertragung der Sketche?
Arduino Uno mit 8 Mhz habe ich beim Board leider nicht als Auswahl.

Verzeiht mir meine Unwissenheit. Wie gesagt, ist mein erstes Projekt mit Elektronik und Arduino und ich kenn mich da noch nicht so gut aus, sondern bin am lernen und ständiger Recherche. Das geht dann nach dem Prinzip "learning by doing" und "try and error".
Muss mir leider komplett alles selbst beibringen.

Alex_Ander:
Arduino Uno mit 8 Mhz habe ich beim Board leider nicht als Auswahl.

Du könntest zum Beispiel als Board
LilyPad Arduino
auswählen. Dieses Board hat einen ATmega328 und läuft mit 8 MHz.

Oder schau dir die MiniCore an.

uxomm:
Du könntest zum Beispiel als Board
LilyPad Arduino
auswählen. Dieses Board hat einen ATmega328 und läuft mit 8 MHz.

Laut Schaltbild aber mit einem Quarz/Resonator, nicht mit internen 8 MHz. Oder habe ich was falsch verstanden?

MiniCore ist der m.E bessere Vorschlag.

MiniCore_Mega328.png

Mußt dann wegen 328 oder 328P schauen.

MiniCore_Mega328.png

agmue:
Laut Schaltbild aber mit einem Quarz/Resonator, nicht mit internen 8 MHz. Oder habe ich was falsch verstanden?

Ja, den Bootloader würde mit dieser Einstellung nicht brennen (wenn es keinen Quarz gibt).
Aber wenn es darum geht, dass der Sketch mit 8 MHz läuft und die Timings stimmen, dann geht das schon.
Außerdem wäre es einfach mal einen Versuch wert, den Blink-Sketch draufzuspielen und zu schauen wie die Zeiten sind.

Hallo,

richtig, Alex nutzt die internen 8MHz. Da hatte ich mich verlesen. Man oh man.
Jetzt gehts in die richtige Richtung.
Die board.txt findest du unter: C:\Program Files (x86)\Arduino\hardware\arduino\avr
Da ich kein Backup gemacht hatte sind meine Einträge alle weg seit der Installation der neuen IDE Version. :confused:

Die Auswahl ob intern oder extern 8MHz ist schon wichtig. Wenn "extern" fused und kein Quarz dran, läuft nix.
Lieber nochmal genauer hinschauen.
f_cpu=8000000L muss auch eingetragen sein

Leute.....

die Lösung kann so einfach sein und wenn man drauf kommt, dann ärgert man sich, weil es dann einem wirklich wie ein Anfängerfehler vorkommt.
Es lag einfach an den Einstellungen bei der Boardauswahl wie ihr mir zum Schluss geholfen habt.

Jetzt läuft alles ohne Probleme. Ich kann den Atmega328 mit dem internen 8 Mhz Oszilator mit der IR-Fernbedienung steuern. Alle LEDs gehen an wie sie sollen und blinken in der richtigen Frequenz.

Lösung:

  • bei Boardauswahl auf Arduino Pro Mini gehen
  • dann bei Prozessor Atmega328p (8Mhz) auswählen
  • Programmer bleibt bei Arduino as ISP

Schon lässt sich der Sketch adäquat übertragen auf den nackten Standalone Atmega328p.

Ich ärgere mich jetzt über mich selbst, weil die Lösung so einfach sein kann, wenn man sich auskennt und Erfahrung hat.

Ich danke euch allen sehr und wünsche euch noch ein schönes Gelingen bei euren Projekten.

Schöne Grüße

Alex

Das ist als Notlösung zu sehen.
Es gibt eine IDE-Erweiterung, die es ermöglicht den Atmega328 als Standalone mit 4, 8 oder 16 MHz als intern, also ohne Quarz bzw. Resonator zu flashen.