Problema con Robot Car (probabile errore di programmazione?)

Ciao a tutti, vi scrivo per sottoporre alla vostra attenzione due problemi che sto riscontrando con un progetto arduino.
Ho costruito un robot car utilizzando i seguenti componenti:
-scocca con 4 motori duttori completi di ruote gommate con diametro 65 mm.
-Telecomando ir con ricevitore VS1838..
-driver l298 per i motori delle ruote.
-Arduino 1 compatibile.
-scheda sensor shield per arduino.
-2 motori servo SG90 con supporto pan tilt.
-scheda sensore ad ultrasuoni HC-SR04
-modulo led rgb
-buzzer.

Il programma che ho scritto è composto sostanzialmente di 6 funzioni attivabili con il telecomando ir. Nello sketch vi sono altre funzioni utili al sensore ultrasuono che calcola la distanza ed un’altra relativa al ricevitore ir.
Con il telecomando posso mandare il robot avanti, indietro, a destra, a sinistra, posso fermare i motori, ed in fine posso attivare la guida autonoma in cui il robot naviga evitando gli ostacoli.
Nello sketch è presente una funzione chiamata Telecomandata dove sono presenti varie if che attivano le varie funzioni alla pressione dei tasti del telecomando. Qui troverete dei numeri lunghissimi che sono quelli restituiti sul monitor seriale dal ricevitore alla pressione dei singoli tasti. Ho mappato tutto il telecomando tasto per tasto, vedrete che ad ogni pulsante ho impostato nella sua relativa if due numeri lunghi, questo perchè in fase di mappatura dei pulsanti restituiva un doppio valore in modo alternato.
Nel loop richiamo la funzione Telecomandata.
Fatte tutte queste doverose premesse vengo ai due problemi riscontrati.
Faccio presente che non ho problemi di compilazione, il software viene digerito bene dall’ide.

Problema 1:
Se nel setup inserisco un suono di avvio con la seguente scrittura, quando premo i pulsanti del telecomando il robot non fa nulla.
“tone(buzzer,300,200); delay(400); tone(buzzer,300,200); delay(400); noTone(buzzer);”
Con questa scrittura il robot suona all’avvio facendo due beep alla fine dell’inizializzazione del setup, ma poi non riceve più comandi.
Non riesco a risolvere in nessun modo e non capisco dove possa esser il problema, stupidamente ho tentato anche di cambiare il pin del buzzer ma non è cambiato nulla, prinma era sul pin 2 ed ora l’ho messo sul pin 17 utilizzando un pin analogico come digitale.

Problema 2:
Non utilizzando il buzzer che crea l’anomalia, il robot funziona perfettamente tranne per una situazione specifica.
Come dicevo sopra, nel loop ho la funzione Telecomandata che mi permette di attivare i vari programmi. Bene essi funzionano tutti tranne la funzione di guida autonoma. Quando premo il pulsante 2, il robot entra in modalità guida autonoma accedendo alla funzione chiamata automatica.
Non appena rileva un ostacolo il sensore ruota a destra e sinistra per trovare la via di fuga ma invece di fare le manovre per evitare l’ostacolo esce dalla funzione e si blocca.
Attenzione, faccio presente che la funzione automatica è ben programmata, per testarla ho fatto questa prova:
Sono entrato nel loop ed ho rimosso la chiamata alla funzione Telecomandata ed ho chiamato la funzione Automatica, questo per bypassare il telecomando. Bene, ricaricando lo sketch su arduino, il robot gira per casa evitando tutti gli ostacoli e non si blocca mai.
Non riesco proprio a capire perchè entrando nella funzione con il telecomando si blocca al rilevamento ostacoli mentre direttamente funziona in maniera perfetta.
La questione del buzzer mi lascia anch’essa perplesso, il compilatore non da errore, che vi sia qualche conflitto software tra il ricevitore ir ed un semplicissimo altoparlantino?

Accetto suggerimenti d’ogni tipo.
Grazie mille…

lo sketch:

/*
    appunti assemblaggio:
    Il sensore ultrasuono è connesso con la porta  triger al pin a4 e la echo al pin a5, ma sto usando queste porte analogiche come digitali.
   I motori delle ruote sono collegati a coppia ai pin digitali pwm, rispettivamente  ai pin 11, 10 per le ruote di sinistra e,  6 e 5 per le ruote di destra.
  (attenzione! se aziono contemporaneamente motorPin1 e motorPin3 il robot va in avanti, se invece attivo motorPin2 e motorPin4 va indietro.  *
   Il motore servo che fa il movimento pan è connesso al pin digitale 9, mentre quelllo che fa il movimento tilt è al pin digitale 3.
    il ricevitore  ir del telecomando è un VS1838  ed è connesso al pin digitale 4. Il ricevitore l'ho connesso con una resistenza da 100 ohm sulla linea del positivo ed una resistenza di pull up da 10 kohm tra il pin dati e quello dell'alimentazione.
    (la libreria ir necessita di un pin pwm nel caso in cui il ricevitore dovesse trasmettere.  ).
*/

#include <IRremote.h>
//librerie ricevitore ir
#include <Servo.h>
//libreria servo motore


int triggerPort = 18;
int echoPort = 19;
// pin ai quali sono connessi il sensore ultrasuono.
int RECV_PIN = 4;
IRrecv irrecv(RECV_PIN);
decode_results results;
//pin  del sensore ir e variabili.
int ledblu = 13;
int ledred = 12;
int ledgreen = 8;
// modulo rgb

int velocitamotore = 255;
//assegno alla variabile velocitamotore il valore pwm delle ruote motrici che regoleranno appunto la velocità delle stesse.
Servo myservo;
// assegno il nome myservo al motore servo che fa il movimento pan.
Servo servotilt;
//  assegno il nome al motore servo che fa il movimento tilt.

const int motorPin1  = 11;
const int motorPin2  = 10;
//Ruote motrici di sinistra.
const int motorPin3  = 6;
const int motorPin4  = 5;
// Ruote motrici di destra.
int buzzer = 17;
void setup() {
  Serial.begin(9600);
  irrecv.enableIRIn();
  pinMode( triggerPort, OUTPUT );
  pinMode( echoPort, INPUT );
  pinMode(ledblu, OUTPUT);
  pinMode(ledred, OUTPUT);
  pinMode(ledgreen, OUTPUT);
  pinMode(buzzer, OUTPUT);

  // inizializzo la porta seriale a 9600 baud e avvio il ricevitore ir. Dichiaro la modalità dei pin.
  myservo.attach(9);
  myservo.write(99);
  // dichiaro il pin al quale è connesso il motore servo pan e lo posiziono a 99 grad che è la posizione centrale.
  servotilt.attach(3);
  servotilt.write(60);
  //  dichiaro il pin al quale è connesso il motore servo che fa il movimenti tilt e lo posiziono a 60 gradi che è la posizione in cui è dritto davanti perpendicolare alla linea di terra..

  rgbavviosetup();
  //richiamo la funzione rgb di avvio
} void loop() {
  if (irrecv.decode(&results))     {
    Serial.println(results.value, DEC);    dump(&results);
    irrecv.resume(); // Receive the next value
    delay(200);
  }

  /* richiamo la funzione telecomandata che permette di guidare il robot con le frecce direzionali e che fa fermare i motori con il tasto ok.  Se premo il tasto 2 passo alla modalità guida autonoma. */
  Telecomandata();
}
// creo la funzione che ferma le ruote motrici.
void Stop() {
  analogWrite(motorPin1, 0);
  analogWrite(motorPin2, 0);
  analogWrite(motorPin3, 0);
  analogWrite(motorPin4, 0);
}


// creo la funzione che manda avanti le ruote motrici.
void Avanti() {


  analogWrite(motorPin1, velocitamotore);
  analogWrite(motorPin2, 0);
  analogWrite(motorPin3, velocitamotore);
  analogWrite(motorPin4, 0);

}

// creo la funzione che manda le ruote motrici indietro.
void Indietro() {
  analogWrite(motorPin1, 0);
  analogWrite(motorPin2, velocitamotore);
  analogWrite(motorPin3, 0);
  analogWrite(motorPin4, velocitamotore);
}

// creo la funzione che fa girare il robot a destra quando è in modalità guida autonoma.
void Destra() {
  analogWrite(motorPin1, velocitamotore);
  analogWrite(motorPin2, 0);
  analogWrite(motorPin3, 0);
  analogWrite(motorPin4, velocitamotore);
  delay(300);
  Avanti();
}

// creo la funzione che fa girare il robot a sinistra quando è in modalità guida autonoma.
void Sinistra() {
  analogWrite(motorPin1, 0);
  analogWrite(motorPin2, velocitamotore);
  analogWrite(motorPin3, velocitamotore);
  analogWrite(motorPin4, 0);
  delay(300);
  Avanti();
}

// creo la funzione che fa girare il robot a destra in modalità telecomandata.
void Destratelecomandata() {
  analogWrite(motorPin1, velocitamotore);
  analogWrite(motorPin2, 0);
  analogWrite(motorPin3, 0);
  analogWrite(motorPin4, velocitamotore);
}

// creo la funzione che fa girare il robot a sinistra in modalità telecomandata.
void Sinistratelecomandata() {
  analogWrite(motorPin1, 0);
  analogWrite(motorPin2, velocitamotore);
  analogWrite(motorPin3, velocitamotore);
  analogWrite(motorPin4, 0);
}

//Creo la funzione che manda avanti il robot in maniera che se rileva un ostacolo nella guida manuale ferma automaticamente i  motori
void Avantiprotetta() {
  myservo.write(99);
  digitalWrite( triggerPort, LOW );
  //invia un impulso di 10microsec su trigger
  digitalWrite( triggerPort, HIGH );
  delayMicroseconds( 10 );
  digitalWrite( triggerPort, LOW );
  long duration = pulseIn( echoPort, HIGH );
  long r = 0.034 * duration / 2;
  if (r <= 30) {
    Stop();
  }
  else Avanti();
}

// creo la funzione misura che rileva la distanza dell'ostacolo.
int misura() {
  digitalWrite( triggerPort, LOW );
  //invia un impulso di 10microsec su trigger
  digitalWrite( triggerPort, HIGH );
  delayMicroseconds( 10 );
  digitalWrite( triggerPort, LOW );
  long duration = pulseIn( echoPort, HIGH );
  long r = 0.034 * duration / 2;
}


// creo la funzione che fa ruotare verso destra il motore servo pan e misura la distanza dell'eventuale ostacolo restituendo il valore della misurazione.
int guardadestra()
{
  myservo.write(30);
  delay(200);
  int distanza = misura();
  delay(100);
  myservo.write(99);
  return distanza;
}

// creo la funzione che fa ruotare verso sinistra  il motore servo pan e misura la distanza dell'eventuale ostacolo restituendo il valore della misurazione.

int guardasinistra()
{
  myservo.write(150);
  delay(200);
  int distanza = misura();
  delay(100);
  myservo.write(99);
  return distanza;
  delay(100);
}


// creo la funzione che fa andare in automatico il robot.
void Automatica ( ) {
  // creo due variabili per la distanza di ostacoli a destra ed a sinistra assegnando temporaneamente il valore 0.
  int distanzadestra = 0;
  int distanzasinistra =  0;

  //porta bassa l'uscita del trigger
  digitalWrite( triggerPort, LOW );
  //invia un impulso di 10microsec su trigger
  digitalWrite( triggerPort, HIGH );
  delayMicroseconds( 10 );
  digitalWrite( triggerPort, LOW );
  long duration = pulseIn( echoPort, HIGH );
  long r = 0.034 * duration / 2;
  // calcoli per rilevare la distanza con il sensore ultrasuoni hcsr04.
  if (r <= 30)
  {
    Stop();
    delay(100);
    Indietro();
    delay(300);
    Stop();
    delay(200);
    distanzadestra = guardadestra();
    delay(200);
    distanzasinistra = guardasinistra();
    delay(200);
    // Ho assegnato alle due variabili le rispoettive funzioni che fanno rilevare gli ostacoli a destra ed a sinistra.
    if (distanzadestra >= distanzasinistra)
    {
      Destra();
      Stop();
    }
    else
    {
      Sinistra();
      Stop();
    }
  } else
  {
    Avanti();
  }

}


//creo la funzione che permette di telecomandare il robot.
void Telecomandata ( ) {
  int debauncingtelecomando = 200;
  if (results.value == 16718055  or results.value == 1033561079) {
    Avantiprotetta();
    delay(debauncingtelecomando);
  }
  else if (results.value == 1217346747 or results.value == 16726215) {
    Stop();
    delay(debauncingtelecomando);
  }
  else if (results.value == 71952287 or results.value == 16734885) {
    Destratelecomandata();
    delay(debauncingtelecomando);
  }
  else if (results.value == 3431610115 or results.value == 16716015) {
    Sinistratelecomandata();
    delay(debauncingtelecomando);
  }
  else if (results.value == 465573243 or results.value == 16730805) {
    Indietro();
    delay(debauncingtelecomando);
  }
  // se premo il tasto 2 del telecomando attiva la funzione automatica.
  else if (results.value == 16736925 or results.value == 5316027) {
    Automatica();
    delay(debauncingtelecomando);
  }
}

void rgbavviosetup () {
  digitalWrite(ledblu, HIGH); delay(1000);  digitalWrite(ledblu, LOW);
  digitalWrite(ledred, HIGH); delay(1000); digitalWrite(ledred, LOW);
  digitalWrite(ledgreen, HIGH); delay(1000); digitalWrite(ledgreen, LOW); delay(1000);
}


// funzione ricevitore ir
//Dumps the result and prints the numeric received dada and type of remote
void dump(decode_results *results) {
  // Dumps out the decode_results structure.
  // Call this after IRrecv::decode()
  int count = results->rawlen;
  if (results->decode_type == UNKNOWN) {
    Serial.print("Unknown encoding: ");
  }
  else if (results->decode_type == NEC) {
    Serial.print("Decoded NEC: ");
  }
  else if (results->decode_type == SONY) {
    Serial.print("Decoded SONY: ");
  }
  else if (results->decode_type == RC5) {
    Serial.print("Decoded RC5: ");
  }
  else if (results->decode_type == RC6) {
    Serial.print("Decoded RC6: ");
  }
  else if (results->decode_type == PANASONIC) {
    Serial.print("Decoded PANASONIC - Address: ");
    Serial.print(results->address, HEX);
    Serial.print(" Value: ");
  }
  else if (results->decode_type == LG) {
    Serial.print("Decoded LG: ");
  }
  else if (results->decode_type == JVC) {
    Serial.print("Decoded JVC: ");
  }
  else if (results->decode_type == WHYNTER) {
    Serial.print("Decoded Whynter: ");
  }
  Serial.print(results->value, HEX);
  Serial.print(" (");
  Serial.print(results->bits, DEC);
  Serial.println(" bits)");
  Serial.print("Raw (");
  Serial.print(count, DEC);
  Serial.print("): ");

  for (int i = 1; i < count; i++) {
    if (i & 1) {
      Serial.print(results->rawbuf[i]*USECPERTICK, DEC);
    }
    else {
      Serial.write('-');
      Serial.print((unsigned long) results->rawbuf[i]*USECPERTICK, DEC);
    }
    Serial.print(" ");
  }
  Serial.println();
}

... quasi sicuramente è un problema di conflitto sui Timers usati.

Ci sono librerie alternative per la tone(), come la New Tone che utilizza un altro Timer (Timer1) o librerie che NON usano alcun Timer, come la TimerFreeTone che però è bloccante durante l'emissione del tono.

Guglielmo

Ciao e grazie! intanto ti dico che con la libreria NewTone solo inserita nello sketch senza la riga di comando che fa suonare il buzzer, mi da questo errore in fase di compilazione:
Arduino:1.8.16 (Mac OS X), Scheda:"Arduino Uno"

libraries/Servo/avr/Servo.cpp.o (symbol from plugin): In function ServoCount': (.text+0x0): multiple definition of __vector_11'
libraries/NewTone/NewTone.cpp.o (symbol from plugin):(.text+0x0): first defined here
collect2: error: ld returned 1 exit status
exit status 1
Errore durante la compilazione per la scheda Arduino Uno.Questo report potrebbe essere più ricco di informazioni abilitando l'opzione
"Mostra un output dettagliato durante la compilazione"
in "File -> Impostazioni", , 15:17

  1. ma QUALE Arduino ? Uno ? Mega ? Date sempre le info complete, grazie
  2. questo errore di solito significa che ci sono librerie che usano lo stesso timer
    QUI in inglese elenco timer e come sono occupati da varie librerie

Su Arduino Uno i timer sono solo 3: 0 usato internamente (delay/millis), 1 da servo e 2 da tone
Anche la IR usa un timer. Di default il timer 2 (IR_USE_AVR_TIMER2) su Arduino Uno
Lo puoi cambiare... ma... se hai solo 2 timer (1 e 2) ma 3 librerie che devono usare i timer...

P.S. meglio se scrivi const byte ledblu=13; ed anche const byte motorPin1 = 11;

... ehhh, va beh, tra lettura del telecomando e servo ho la vaga idea che ti sei giocato tutti i timers della UNO e la tone() NON la puoi usare.

Se ti va bene la versione che non usa timers, ma quando suona ferma il programma, puoi provare l'altra.

Guglielmo

... a leggere il messaggio che riporta è una UNO:

... e quindi i Timers se li è giocati tutti.

Guglielmo

È un arduino 1. l'ho specificato nella lista dei componenti utilizzati.. Puoi darmi qualche indicazione su come devo fare per cambiare i timer delle librerie? Scusa la domanda ma non sono addentrato in merito. Dunque se ho 3 timer diversi forse qualche libreria di quelle utilizzate usa lo stesso timer come suggerisci tu. Se volessi modificarne uno come devo fare? Per favore mi spieghi meglio il concetto? è possibile utilizzare massimo 3 timer e quindi non ho soluzione al problema oppure i timer possono esser aumentati e cambiare quelli che vanno in conflitto tra loro in modo che ognuna libreria utilizzi il suo non condividendolo con altre? Grazie mille.

Non puoi, ti ho detto, ciascuno è usato per UNA cosa e tu li stai già usando tutti.

O usi la tone bloccante che ti ho indicato o NON usi la tone, ti compri un buzzer attivo, lo colleghi ad un pin e lo piloti con esso.

Guglielmo

Dunque scusa se ricapitolo e traggo le mie conclusioni. Correggimi se sbaglio. Il timer 0 è utilizzato generalmente per delay e millis, il timer 1 è utilizzato per il servo ed il 3 per il tone, dunque deduco dal malfunzionamento che il timer 3 è usato anche dalla libreria irremote e va in conflitto con tone. Se è così mi è tutto chiaro.

A memoria non ricordo ... basta però che apri i sorgenti delle librerie e verifichi :wink:

Comunque il principio è quello e, ti dirò di più, se usi il PWM la situazione peggiora ancora ...

Guglielmo

Perfetto, ho risolto usando la libreria TimerFreeTone che anche se bloccante per ora non mi interessa in quanto deve emettere solo due beep nel setup. Per il resto implementerò un buzzer attivo e lo comanderò con digitalWrite. Ora mi rimane di risolvere il secondo problema che non è da poco, non capisco perchè mi esce dalla funzione Automatica appena rileva un ostacolo.. Che sia la libreria servo a dare problemi? Si blocca dopo che il servo ruota a destra e sinistra. Strano però perchè come già detto, se isolo la funzione va tutto correttamente.

Ciao Guglielmo, perdonami una domanda. Mi hai detto che la libreria TimerFreeTone è bloccante, da questo ne deduco che quando suona il buzzer il programma si blocca fino a che non smette di suonare e poi riprende. Dunque io tramite la riga di comando TimerFreeTone(buzzer,300,500); delay(100); ripetuto due volte, l'ho fatto suonare mezzo secondo con pausa di un secondo ripetuto.. Questo l'ho inserito nella funzione indietro che fa fare la retromarcia al robot. Mi sarei aspettato un comportamento del tipo che quando suona il motore è fermo e quando non suona si muove. Dunque essendo bloccante il TimerFreeTone i motori duttori dovevano funzionare ad intermittenza ma non è così. Da cosa può dipendere? Questo non è un problema per me anzi è un vantaggio, ma mi interesserebbe capire il funzionamento Grazie.

Io ho riportato quanto l'autore, in un post, dice (... e non ho motivo di dubitarne), per il resto ... come detto, tocca che ti studi i sorgenti.

Comunque, la prova descrivi (... e che NON ho verificato come fai), non dimostra molto ... anche la delay() è sicuramente bloccante, ma se tu dici che il movimento continua è probabilmente perché, una volta che hai definito una direzione, fino quando non la cambi/fermi tu, va avanti da sola.

Funzione bloccante significa che, per la sua durata, il programma non fa altro, ripeto, come nel caso di delay(), ma non significa che, se hai messo un pin HIGH per accendere un qualche cosa, questa di spenga ... :roll_eyes:

Guglielmo

Perfetto grazie mille sei stato molto chiaro. sto imparando perciò perdona delle domande che sembrano ovvie. Intanto sto combattendo per risolvere il secondo problema. ho trovato un post di una persona che afferma Che nei modelli diversi da Arduino mega, la libreria servo blocca o crea delle anomalie nei Pin pwm 9 e 10. Non so se questo corrisponde a verità ma se fosse potrebbe essere la causa del mio problema. solo che se fosse così non so come fare perché ho finito i Pin pwm. Al 3 ed al 9 ho connesso i due servo, al 5 e al 6 le ruote di destra ed al 10 e 11 le ruote di sinistra. questa ipotesi di cui ho letto mi sembra strana ma dato che non comprendo il motivo del malfunzionamento non lo escludo. Buona giornata

Ovvio che Servo e PWM, se usati sui pin che entrambi coinvolgono vanno in conflitto ... TUTTO ciò che usa dei Timers va usato per fare una certa cosa e, solo in casi specifici, è possibile usarlo per più cose.

Ecco la tabella riepilogativa dei Timers e dei pin coinvolti:

Arduino UNO Timers (ATmega328P)

Timer0
Usato da millis() e delay() e per il PWM sui pin 5 e 6
fast hardware pwm
(default 976.5625 Hz)
Pin 5 è anche usato per il “pulse counting
Pin 8 è usato per il “input capture

Timer1
Usato dalla libreria Servo e per il PWM sui pin 9 e 10. Libreria e PWM mutuamente esclusivi.
8-bit phase correct pwm mode
(default 488.28125 Hz)

Timer2
Usato per il PWM sui pin 3 e 11
8-bit phase correct pwm mode
(default 488.28125 Hz)


Arduino Leonardo Timers (ATmega32U4)

Timer0
#bits = 8
Clock speed = 16 MHz (system clock speed)
Default prescale = 64
Pins D3 & D11

Timers 1 and 3
#bits = 16
Clock speed = 16 MHz (system clock speed)
Default prescale = 64
Pins D5, D9 & D10
Pin D11 can also be set to use timer 1 output (OC1C), but the Arduino library uses it for timer 0 (8-bit). To use it on timer 1, it must be done by setting the appropriate registers.

Timer 4
#bits = 10
Clock speed = 64 MHz
Default prescale = 64
Pins D6, D13
Pin D10 (PB6) also has a timer 4 output (OC4B), but the Arduino library uses it for timer 1 (16-bit). To use it on timer 4, it must with the registers.


Arduino Mega2560 Timers (ATmega2560)

Timer0
8 bit
Usato per il PWM sui pin 4 e 13
fast hardware pwm

Timer1
16 bit
Usato per il PWM sui pin 11 e 12
8-bit phase correct pwm mode

Timer2
8 bit
Usato per il PWM sui pin 9 e 10
8-bit phase correct pwm mode

Timer3
16 bit
Usato per il PWM sui pin 2, 3 e 5
8-bit phase correct pwm mode

Timer4
16 bit
Usato per il PWM sui pin 6, 7 e 8
8-bit phase correct pwm mode

Timer5
16 bit
usato per il PWM sui pin 45 e 46
8-bit phase correct pwm mode
Pin 47 è usato per il “pulse counting
Pin 48 è usato per il “input capture

Così hai più chiaro i pin che, di base, il "core" di Arduino coinvolge, a questo devi aggiungere i conflitti che possono creare le varie librerie.

Guglielmo

Perfetto grazie, ora comincio ad avere una idea più chiara.. Io sono un autodidatta e sto imparando piano piano anche grazie ai vostri preziosi aiuti, ovviamente prima di sollevare una problematica cerco una soluzione ma non è sempre semplice. Per imparare bene devo capire delle cose e vorrei fare una domanda ancora e scusate se è basilare.. Prendo ad esempio il timer 1 usato dalla libreria servo ed usato dalla gestione dei segnali pwm sui pin 9 e 10. Vorrei capire questo: Nel mio progetto posso collegare fisicamente due motori servo ai pin 9 e 10 anche se questi pin sono usati dal timer 1 e quindi dalla libreria? Allo stesso modo se ho la libreria irremote che utilizza il timer 2 coinvolgendo i pin 3 e 11, posso fisicamente connettere il ricevitore ir o al pin 3 o al pin 11?? Voglio dire, i pin coinvolti possono esser utilizzati o devono esser lasciati liberi? I motori servo non vengono pilotati con segnali pwm mentre il ricevitore ir non so. Io deduco che posso usare i pin coinvolti a patto che non debbano pilotare in pwm altrimenti si genera conflitto.. Questa è una mia ipotesi però. Grazie per la pazienza.

Sintetizzo e formulo meglio la mia domanda: se ad esempio prendo in considerazione il timer uno che è usato da arduino per gestire i Pin pwm 9 e 10, se carico nello sketch la libreria servo che utilizza anche essa il timer uno, io posso connettere sui Pin 9 e 10 dei dispositivi hardware A patto che essi non richiedano il pilotaggio tramite pwm? In questo caso questi Pin devono essere lasciati liberi o sono utilizzabili per dispositivi non pwm come ad esempio motori servo? Grazie

Esattamente cosi: visto che il Timer1 è impegnato per altre funzionalità non sarai più in grado di generare segnali PWM su quei due pin, ma che potranno comunque essere usati come GPIO generici per altre cose.

l'uso della libreria disabilita la funzionalità analogWrite() (PWM) sui pin 9 e 10, indipendentemente dal fatto che ci sia o meno un Servo su quei pin.