Problema controllo remoto Robot 4WD

Buonasera,

Volevo chiederle un aiuto, se può e per quanto possibile, per gestire il controllo remoto dal robot che sto configurando, il quale è dotato di 4 motori (gestiti con la scheda di AdaFruit versione 1.0) e per il controllo in questione sto sfruttando un modulo TSOP4838 (IR).

Nei vari Sketch, e test a seguire, ho notato che la recezione dati avviene tranquillamente sfruttando un classico telecomando da TV ma, nel momento in cui mi accingo ad avviare il controllo remoto dal rispettivo codice, viene compromesso il regolare funzionamento dei motori e del servomotore per il Ping. La situazione torna alla normalità quando tolgo tutte le funzioni associate al controllo remoto.

Ho provato a modificare i timer della libreria, per eventuali conflitti, ma niente da fare. Quando avvio lo sketch del remoto, il sensore non riceve i dati dal telecomando e il funzionamento del robot si compromette come le ho evidenziato.

Allego i due Sketch, con e senza la sezione dedicata al Remoto, sperando che possiate darmi una mano, sempre se ne avete voglia e/o disponibilità.

Ho pensato inoltre di rimuovere l'IR ed inserire un modulo Bluetooth ma sorge un problema..la Shield copre tutti i pin digitali di Arduino e la situazione può essere risolta, credo, solo se viene inserito un adattatore bluetooth direttamente alla porta USB di Arduino per la seriale, anche se sul Web non trovo niente di simile.

Infine allego le librerie relative, lo Sketch per la configurazione dei dati recepiti dal sensore IR, lo Sketch completo con Remoto e senza.

Vi ringrazio in anticipo soprattutto per la disponibilità e mi scuso formalmente per il disturbo.

A presto e spero possiate aiutarmi...vi prego :confused:

Codici 4WD.zip (62.6 KB)

Normalmente quello significa che ci sono conflitti tra una libreria ed un altra come, ad esempio, uso delle stesse risorse ... timer, interrupts, etc.

Se le cose stanno così e NON ci sono nelle librerie opzioni per poter cambiare le risorse usate ... le due cose sono "incompatibili" e non si possono usare o, si possono usare, studiandosi bene il codice e risolvendo le incompatibilità (... riscrivendo parte del codice). Quindi ... verifica attentamente NON solo la parte timer, ma la parte PWM (ogni timer controlla alcuni pin PWM) ed interrupt.

Quanto alla secodnda parte della domanda, una shield passante ha sempre TUTTI i pin, ma NON è detto che li usi tutti veramente. Devi andare sulla descrizione della scheda motore che usi e trovare QUALI pin esattamente usa. Gli altri ci sono porprio per "impilarci" sopra qualche altra cosa che non sia in conflitto con i soli pin usati dalla scheda di sotto :wink:

Guglielmo

Ho ritrovato la tabella con l'associazione **Timers --> Utilizzo ** ... può esserti sempre utile ...

.
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
Usato per il PWM sui pin 4 e 13
fast hardware pwm

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

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

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

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

Timer5
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

I Timers possono essere a 8 o a 16 bit e sono controllati tramite alcuni registri :

TCCRnA - Timer Counter Control Register A
determina il modo operativo

TCCRnB - Timer Counter Control register B
determina il valore del prescaler

TCNTn - Timer Counter Register
contiente il contatore del timer

OCRnA - Output Compare Register A
comparatore utilizzabile per attivare un interrupt

OCRnB - Output Compare Register B
comparatore utilizzabile per attivare un interrupt

TIMSKn - Timer/Counter Interrupt Mask Register
imposta le condizioni per cui viene attivato un interrupt

TIFRn - Timer Interrupt Flag Register
indica se la condizione impostata si è avverata

Valori dei bit per il prescaler :

/1 : 0b001
/8 : 0b010
/64 : 0b011 - default
/256 : 0b100
/1024 : 0b101
: 0b110 - clock esterno, fronte di discesa
: 0b111 - clock esterno, fronte di salita

Guglielmo

Innanzitutto ti ringrazio per la tua risposta seria ed efficace.

Sto procedendo nell'analisi delle librerie e riporto velocemente alcune cose, di seguito:

Disponendo della scheda Arduino UNO e della piattaforma 4WD il timer 0 e 2 vengono usati rispettivamente per la gestione, PWM, dei motori 3-4 e 1-2. Il timer 1 in teoria viene utilizzato sia dalla libreria servo (che non utilizzo nei codici come consultabile, e scrivere il codice senza includere tale libreria credo che sia l'unica opzione, credo...) che dal controllo IR.

In particolar modo i pin I/O digitali 3,5,6,11 sono utilizzati per il PWM dei quattro motori, il pin digitale 2 è libero, il pin 10 è associato al sensore di distanza, il 13 al LED incorporato della scheda, il pin 9 dal servomotore ed infine, i restanti, per il controllo dei motori.

Allego la documentazione relativa alla scheda di Adafruit, in particolar modo la sezione che evidenzia i pin utilizzati dalla stessa...

Pin AF V1.0.JPG

Come vedi nelle prima riga, ti dice chiaramente che tutti e 6 i pin analogici sono liberi ... e su Arduino UNO tutti i pin analogici sono usabili anche come pin digitali esattamente come quelli solo digitali, quindi ... puoi tranquillamente usarli.

Guglielmo

Tale fatto è molto interessante, ciononostante se volessi usare un modulo bluetooth (es HC-06) mi occorrerebbero i pin 2 e 3 digitali, RX e TX, non replicabili con quelli analogici.

Il problema del controllo remoto persiste, è possibile che non ci sia un modo per sanarlo?

Mi scuso formalmente per il disturbo...

Prima che mi dimentichi..sui pin analogici A0-A2 vi sono tre sensori di riflessione a inflarossi (QTR-1A), mentre sul pin A3 il sensore IR in questione.

non vorrei sbagliare in quanto non l'ho mai fatto, ma penso che anche sui pin analogici puoi usare la softserial per utilizzare il modulo BT

matteo2033:
Tale fatto è molto interessante, ciononostante se volessi usare un modulo bluetooth (es HC-06) mi occorrerebbero i pin 2 e 3 digitali, RX e TX, non replicabili con quelli analogici.

E perché ? La SoftwareSerial, sulla UNO (... non è così sulla MEGA e su altre schede, ma è chiaramente specificato nel reference della SoftwareSerial), la puoi usare sui pin che vuoi ... definisci tu quale è RX e quale è TX.

Guglielmo

Ottimo...ne ho sentito parlare ma difatti mai sperimentato...grazie veramente a tutti.

Il problema con l'IR, comunque, sembra che l'ho risolto..a mia insaputa erano rimaste delle librerie da qualche parte nella cartella documenti e, nello specifico, nella sottosezione "libraries" che entrava in conflitto con la cartella omonima nei file installazione dell'IDE..

Insomma...si preannunciava un problemone >:(

Resta il fatto che la SoftwareSerial è decisamente interessante e, ciononostante, l'impiego di un modulo BT rimane più versatile di quello IR dalle esperienze che ho consultato nel forum e da quelle riscontrate personalmente. Nel mio caso ho praticamente giocato tutti i Timer e credo proprio che siano una delle risorse più importanti nella gestione, in senso lato, di Arduino.

Grazie veramente a tutti per il supporto e per le nuove info apprese... :slight_smile: :slight_smile: :slight_smile: