Pages: [1]   Go Down
Author Topic: Problema con i pin di uscita analogica PWM  (Read 920 times)
0 Members and 1 Guest are viewing this topic.
Offline Offline
Newbie
*
Karma: 0
Posts: 30
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Code:
#include <IRremote.h> // use the library
#define BLU   9
#define VERDE 10
#define ROSSO 11
int receiver = 12; // pin 1 of IR receiver to Arduino digital pin 11
boolean stateblu;
boolean stateverde;
boolean staterosso;
boolean statemeno;
boolean statepiu;
byte brightness;
IRrecv irrecv(receiver);
decode_results results;
void setup()
{
  pinMode(BLU, OUTPUT);
  pinMode(VERDE, OUTPUT);
  pinMode(ROSSO, OUTPUT);
  irrecv.enableIRIn(); // Start the receiver
  brightness = 255;
}
void loop()
{  
  if (irrecv.decode(&results)) //controllo se il ricevitore IR ha rilevato un segnale
  {  
    if (results.value == 16724175) //numero 1
    {
      statemeno = 0; //se ho premuto un tasto differente da più o meno l'hold dei tasti viene disattivato
      statepiu = 0;
      stateblu = 1 - stateblu;
    }
    if (results.value == 16718055) //numero 2
    {
      statemeno = 0;
      statepiu = 0;
      stateverde = 1 - stateverde;
    }
    if (results.value == 16743045) //numero 3
    {
      statemeno = 0;
      statepiu = 0;
      staterosso = 1 - staterosso;
    }
    if (results.value == 16748655) //tasto più
    {
      statemeno = 0;
      statepiu = 1;
      if (brightness < 251)
      {
        brightness = brightness + 4;
      }else{
        brightness = 255;
      }
    }
    if (results.value == 16754775) //tasto meno
    {
      statemeno = 1;
      statepiu = 0;
      if (brightness > 4)
      {
        brightness = brightness - 4;
      }else{
        brightness = 0;
      }
    }
    if (results.value == 4294967295) //quando un qualsiasi tasto è tenuto premuto
    {
      if (statepiu == 1) //se il tasto più è tenuto premuto
      {
        if (brightness < 251)
        {
          brightness = brightness + 4;  //aumento la luminosità
        }else{
          brightness = 255;
        }
      }
      if (statemeno == 1)  //se il tasto meno è tenuto premuto
      {
        if (brightness > 4)
        {
          brightness = brightness - 4;   //diminuisco la lumiosità
        }else{
          brightness = 0;
        }
      }
    }
    irrecv.resume();// receive the next value
  }
  if (stateblu == 1)
  {
    analogWrite(BLU, brightness);
  }else{
    analogWrite(BLU, 0);
  }
    
  if (staterosso == 1)
  {
    analogWrite(ROSSO, brightness);
  }else{
    analogWrite(ROSSO, 0);
  }
  if (stateverde == 1)
  {
    analogWrite(VERDE, brightness);
  }else{
    analogWrite(VERDE, 0);
  }
}

ho scritto questo semplice programma spero si possa capire, tramite un telecomando IR comando 3 led collegati ai pin PWM 9-10-11, che corrispondono ai tasti 1-2-3 del telecomando, con i tasti - e + vario la luminosità dei led, aumentando o diminuendo la modulazione di impulso (PWM).
Il problema si riscontra quando vado ad accendere il led collegato al pin 10 con la modulazione di impulso variata (cioè che nn corrisponde a quella prestabilita nel setup, che è di 255), se l'accendo con la luminosità gia variata la scheda nn risponde piùe i led accesi rimangono tali, se invece vario la luminosita con solo il led collecato al pin 10 il led si spegne, ho provato a cambiare i pin dei led e il problema si riscontra solo con il 10 e il 3.
Dimenticavo ho un scheda arduino uno e uso un lede rgb.
Mi sapreste spiegare la motivazione di questa anomalia
« Last Edit: January 30, 2013, 02:12:10 pm by SteZ » Logged

Cagliari, Italy
Online Online
Tesla Member
***
Karma: 110
Posts: 6974
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Ciao,
potresti modificare il post e includere il listato all'interno dei tag CODE?
Li trovi premendo il tasto # che è sopra le faccine, nell'editor.

Credo che la libreria IR usi lo stesso timer che tu modifichi per i led.
« Last Edit: January 30, 2013, 02:10:10 pm by PaoloP » Logged

Code fast. Code easy. Codebender --> http://codebender.cc/?referrer=PaoloP

Global Moderator
Italy
Offline Offline
Brattain Member
*****
Karma: 325
Posts: 22498
Logic is my way
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

 La lib IRremote usa il timer 2, quindi non si può usare il PWM sul pin 11. Inoltre usa il pin 3 come pin di trasmissione.
Se puoi, sposta i led sugli altri 4 pin PWM collegati ai timer 0 e 1.

Esiste un file, IRremoteInt.h, dove puoi cambiare il timer usato dalla lib e spostarla sul timer 1.
Però così poi perdi il PWM sul pin 9 ed inoltre il pin 10 diventa il TX della lib.
Logged


Offline Offline
Newbie
*
Karma: 0
Posts: 30
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Grazie di aver risposto in modo così rapido al mio problema, mi avete dato una spiegazione più che soddisfacente.
Se posso vorrei chiedere inoltre se siete a conoscenza ed eventualmente postarmi qualche guida o spiegazione delle funzioni delle librerie utilizzate in arduino, preferibilmente in italiano   ( ammetto di non essere una cima in inglese  smiley-cry   )
Logged

Cagliari, Italy
Online Online
Tesla Member
***
Karma: 110
Posts: 6974
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Nel reference del sito ci sono tutte le spiegazioni (in inglese).
Per l'italiano mi pare ci sia qualcosa nel secondo libro "LIBRO ARDUINO - PROGRAMMAZIONE AVANZATA
e Librerie di sistema" di FuturaElettronica; ma non l'ho ho e non l'ho mai letto. Quindi prendi il suggerimento per quello che vale.
--> http://www.futurashop.it/
Logged

Code fast. Code easy. Codebender --> http://codebender.cc/?referrer=PaoloP

Pages: [1]   Go Up
Jump to: