Frage zu PWM Pin

Hallo zusammen,

im Sketch unten findet man eine kleine Lichtsteuerung mit IR Fernbedienung.
So, wie der Sketch dort geschrieben ist, funktioniert er auch.

Aber:
Meine PWM-Pins für R,G,B sind ie die Ausgänge 6, 9, und 10.

Im ersten entwurf hatte ich die Pins 9, 10, und 11 verwendet. An sonsten alles identisch, wie unten.

Ergebnis:

Aus Pin 11 kam kein PWM.

In einem anderen Sketch hatte ich ebenfalls Pin 11, und da lief er.
Ok, dachte ich, der Ard. Nano ist hin, aber dem war nicht so.

Hat einer eine Idee, warum bei dem Sketch unten B icht funktioniert, wenn es auf Pin 11 ausgegeben werden soll?

Gibt es dafür eine Erklärung?

#include <IRremote.h>



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

int active;
int velocity=50;
int brightness = 0;
int R = 10;
int G = 9;
int B = 6;
int Red;
int Green;
int Blue;
int angle = 0;
int circle = 1;
int dir = 1;
bool an = 0;
unsigned long lastCode;
unsigned char pwmtable[40] = {0, 0, 0, 1, 2, 3, 4, 6, 8, 10, 13, 16, 19, 23, 27, 31, 36, 41, 47, 52, 59, 65, 72, 80, 88, 96, 105, 114, 123, 133, 143, 154, 165, 177, 189, 201, 214, 227, 241, 255};
void setup()

{
  pinMode (R, OUTPUT);    // R
  pinMode (G, OUTPUT);    // G
  pinMode (B, OUTPUT);    // B
  pinMode (A1, INPUT);    //IR-in
  pinMode (13, OUTPUT);   //not necessary, just for Test purposes



  irrecv.enableIRIn();

  Serial.begin(115200);

}



void loop() {

  //Serial.println(an);
  digitalWrite (13, an);
  //Serial.println(brightness);
  //Serial.println(lastCode);
  if (an == 0) {
    analogWrite(R, 0);
    analogWrite(G, 0);
    analogWrite(B, 0);
  }

  if (irrecv.decode(&results)) {
    //Serial.print(results.value); Serial.print("  "); Serial.println(lastCode);

    if (results.value == 4294967295) {

      results.value = lastCode;
    }
    if (results.value == 16769565) { // ch+, an/aus

      an = !an;
      delay(50);
    }
    if ((results.value == 16754775)  && (an == 1))  //+, heller
    {
      lastCode = results.value;
      brightness -= 5;
      if (brightness <= 0)brightness = 0;
       delay(20);
    }
    if ((results.value == 16769055)  && (an == 1))  //-, dunkler
    {
      lastCode = results.value;
      brightness += 5;
      if (brightness >= 255)brightness = 255;
       delay(20);
    }
    irrecv.resume();
    //lastCode=results.value;
  }

  // Wiederholcode ist 4294967295





  if ((results.value == 16724175 || active==1) && (an == 1)) // 1, weiß
  {
    //Serial.println(" Es wurde taste 1 gedrückt");
    lastCode = results.value;
    active=1;
    analogWrite(R, 255 - brightness);
    analogWrite(G, 255 - brightness);
    analogWrite(B, 255 - brightness);


  }

  if ((results.value == 16718055 || active==2) && (an == 1)) // 2, blau
  {
  //  Serial.println(" Es wurde taste 2 gedrückt");
    lastCode = results.value;
    active=2;
    analogWrite(R, 0);
    analogWrite(G, 0);
    analogWrite(B, 255 - brightness);
  }
  if ((results.value == 16743045 || active==3) && (an == 1)) // 3, Cyan
  {
   // Serial.println(" Es wurde taste 3 gedrückt");
    lastCode = results.value;
    active=3;
    analogWrite(R, 0);
    analogWrite(G, 255 - brightness);
    analogWrite(B, 255 - brightness);
  }
  if ((results.value == 16716015 || active==4)  && (an == 1)) // 4, gelb
  {
   // Serial.println(" Es wurde taste 4 gedrückt");
    lastCode = results.value;
    active=4;
    analogWrite(R, 255 - brightness);
    analogWrite(G, 255 - brightness);
    analogWrite(B, 0);
  }
  if ((results.value == 16726215 || active==5)  && (an == 1)) // 5, grün
  {
   // Serial.println(" Es wurde taste 5 gedrückt");
    lastCode = results.value;
    active=5;
    analogWrite(R, 0);
    analogWrite(G, 255 - brightness);
    analogWrite(B, 0);
  }
  if ((results.value == 16734885 || active==6)  && (an == 1)) // 6, rot
  {
   // Serial.println(" Es wurde taste 6 gedrückt");
    lastCode = results.value;
    active=6;
    analogWrite(R, 255 - brightness);
    analogWrite(G, 0);
    analogWrite(B, 0);
  }
  if ((results.value == 16728765 || active==7)  && (an == 1)) // 7, magenta
  {
    //Serial.println(" Es wurde taste 7 gedrückt");
    lastCode = results.value;
    active=7;
    analogWrite(R, 255 - brightness);
    analogWrite(G, 0);
    analogWrite(B, 255 - brightness);
  }
  if ((results.value == 16730805 || active==8)  && (an == 1)) { // 8, Regenbogenschleife
    lastCode = results.value;
    active=8;
    angle = circle;
    if (circle >= 240){
      circle=240;
      dir=-dir;
    }
    if (circle<=0){
      circle=0;
      dir=-dir;
    }
    
      if (angle < 40)
      {
        Red = 0;
        Green = pwmtable[angle];
        Blue = 255;
      }
      else if (angle < 80)
      {
        angle -= 40;
        Red = 0;
        Green = 255;
        Blue = pwmtable[39 - angle];
      }
      else if (angle < 120)
      {
        angle -= 80;
        Red = pwmtable[angle];
        Green = 255;
        Blue = 0;
      }
      else if (angle < 160)
      {
        angle -= 120;
        Red = 255;
        Green = pwmtable[39 - angle];
        Blue = pwmtable[angle];
      }
      else if (angle < 200)
      {
        angle -= 160;
        Red = 255;
        Green = 0;
        Blue = pwmtable[39 - angle];
      }
      else if (angle < 240)
      {

        angle -= 200;
        Red = 255;
        Green = pwmtable[angle];
        Blue = pwmtable[angle];
      }



    analogWrite(R, Red);
    analogWrite(G, Green);
    analogWrite(B, Blue);
    circle = circle + dir;
    delay(velocity);
//Serial.print("Rot   =  ");Serial.println(Red);
//Serial.print("Grün  =  ");Serial.println(Green);
//Serial.print("Blau  =  ");Serial.println(Blue);

  }
Serial.print(brightness);Serial.print("  activ =   ");Serial.println(active);

// hier noch Resevefunktionen( schneller / langsamer soll die Variable velocty beeinflussen.
    //if (results.value == 16712445)  // >>|, schneller
    //if (results.value == 16720605)  // |<<, langsamer
    //if (results.value == 16736925)
    //if (results.value == 16736925)

    
  }

(deleted)

Wie schon gesagt, das gleiche, nein, dasselbe Modul arbeitet in einer anderen Schaltung mit einem anderen Sketch sehr gut mit PWM auf dem Pin.
Daran kann es also schon mal nicht liegen.

Kann es sein, dass die IRremote.h einen Timer für sich verwendet, und dieser darum nicht mehr für PWM bereit steht?

, nein, dasselbe Modul

Darf ich dich fragen, warum das Board geheim bleiben muss?

Ja, die IrRemote nutzt standardmäßig den Timer 2 auf den AVR Boards. Und danit fallen Pin 11 und 3 als PWM aus.

skyfox60:
Ok, dachte ich, der Ard. Nano ist hin, aber dem war nicht so.

Da gehe ich mal davon aus, dass es sich um einen Nano handelt.

Danke für die schnelle Hilfe.

Tricky, das ganze.

Man müsste, wenn man es doch so wollte, dann PWM künstlich erzeugen, das könnte noch gehen.
Gab es da nicht so eine dolle Funktion in der Library MobaTools? Oder war das PPM?

Die MobaTools erzeugen ein PWM-Signal per SW (Timer-Irq) für das weiche Auf- und Abblenden von Leds. Allerdings nur während der Ein- bzw. Ausschaltphasen. Ein dauerhaftes PWM-Signal ist da ( aus Performance-Gründen ) nicht vorgesehen.