Problema radiocomando/ricevente/arduino

Ciao a tutti sto cercando di far funzionare il mio radiocomando con arduino.
in rete non sono riuscito a trovare tanto, quello che ho trovato e' su un sito che spiega benino sia la parte software che hardware e ho cercato di seguire i suggerimenti pero' non riesco a farla funzionare.
per ora sono arrivato a collegare tre canali della ricevente (1,2 e 3) prendendo solo i cavi del segnale e portandoli su arduino nei pin digitali 5,6 e 7 poi ho preso dalla ricevente il gnd e vcc e portati rispettivamente ad arduino su pin gnd e +5v
ho caricato lo sketch consigliato sul sito e cosi facendo aprendo il monitor seriale dovrei vedere i valori dei tre comandi quando muovo gli stick della radio.
non e' cosi non si muove nulla.
il sito sarebbe questo RC Hobby Controllers and Arduino - SparkFun Electronics
non so se le info riportate li sopra sono valide o sbaglio io, chiedevo se gentilmente qualcuno poteva darmi una mano anche con dei link per riuscire ad accoppiare la mia radio ad arduino che poi mi servirebbero solo 3ch su 10 comandati tramite arduino.
se puo'essere utile la mia radio e' una futaba fc28 con modulo 2.4ghz
spero come primo post. di non aver fatto errori di sezioni e di essermi spiegato bene
grazie

Ciao, non sono esperto, ma provo ad aiutarti se posso

in linea teorica, se il circuito è alimentato a 5 v e il cablaggio è corretto dovresti leggere dei valori compresi tra 0 e 1023 essendo le levette dello stick in prima approssimazione dei potenziometri.
Se i valori non si muovono devi rivedere il cablaggio. Cerca col tester seguendo le piste dei contatti fino a che trovi i pin alimentati che variano valore al variare della levetta... Mi dispiace non saperne di più

Come stai alimentando il tutto?

È Arduino che alimenta la ricevente o è la ricevente che alimenta Arduino?

Cosa vedi sul Monitor seriale? Solo sequenze di zeri?

Ciao,
P.

Ciao, allora dopo aver trafficato coi vari canali sono arrivato a far funzionare i valori sul monitor seriale. Ho collegato i segnali della ricevente1,5 e 7 con i pin di arduino 5,7 e 8 e ora sul monitor seriale mi trovo i 3 valori che sono

1:2086

5:1900

7:2091

Ovviamente se muovo i potenziometri della radio cambiano tutti i valori

Al momento sto usando un arduino nano perché credevo che uno avesse dei problemi (invece no) e lo sto alimentando dal pc ed è arduino che alimenta la ricevente

Dovresti postare i valori che ottieni con i comandi tutto-da-un-lato e tutto-dall'altro di ciascun potenziometro della radio e verificare se i valori restano costanti nel tempo con il potenziometro fermo su un valore massimo o minimo.

Ciao,
P.

I valori che leggi sono i tempi di “ON” del segnale PWM di ogni canale e possono variare da c.ca 700 a c.ca 2200 microsecondi.
Le radio da modellismo, infatti, trasmettono la posizione degli stick attraverso un impulso di lunghezza variabile, i cui estremi sono quelli che ti ho indicato. Il valore di “centro” è universalmente definito per 1.500 microsecondi.
Nello standard universale, gli impulsi dei vari canali vengono sommati in un unico segnale, con codifica PPM (pulse position modulation), che prevede un ciclo completo ogni 20 millisecondi (50 cicli al secondo).

Maggiori dettagli li trovi qui RC radio control protocols explained: PWM, PPM, PCM, SBUS, IBUS DSMX, DSM2 - Guides - DroneTrest

Il codice che hai implementato funziona bene, la funzione pulsein() legge appunto la durata in microsecondi dell’impulso presente sul pin di ingresso e te ne restituisce il valore. Il problema è che, dovendo eseguire tre pulsein() di seguito, ogni ciclo di lettura dura tre cicli di trasmissione della radio, quindi 60 millisecondi. Tienine conto se l’applicazione che devi realizzare è critica per i tempi.
Una soluzione più efficiente prevede l’utilizzo diretto del segnale PPM, spesso disponibile sulla ricevente, che viene letto da Arduino tramite l’utilizzo di funzioni specifiche che utilizzano gli Interrupt. In questo caso, risparmieresti anche sul cablaggio e sui pin di Arduino, non avendo la necessità di collegare un filo per ogni canale da utilizzare.

Carlo

Il problema sta in pulseIn, che è una di quelle funzioni quasi da bannare, infatti blocca tutto finché non arriva e termina un impulso o finché non è trascorso il tempo impostato.

Per evitare il problema, devi rilevare in continuazione, velocissimamente, con PIN, se arriva un segnale sui tre ingressi; se arriva, vai subito a vedere quale è e scrivi millis() micros() in una variabile. Quando uno torna giù, fai la stessa cosa.

Per il rilevamento puoi anche usare l'interrupt sulla porta intera (Pin Change Interrupt); quando arriva, vai subito a vedere dove è arrivato. Per rilevare quando torna giù, fai in modo simile.

Datman:
Il problema sta in pulseIn, che è una di quelle funzioni quasi da bannare, infatti blocca tutto finché non arriva e termina un impulso o finché non è trascorso il tempo impostato.

Per evitare il problema, devi rilevare in continuazione, velocissimamente, con PIN, se arriva un segnale sui tre ingressi; se arriva, vai subito a vedere quale è e scrivi millis() in una variabile. Quando uno torna giù, fai la stessa cosa.

Per il rilevamento puoi anche usare l'interrupt sulla porta intera (Pin Change Interrupt); quando arriva, vai subito a vedere dove è arrivato. Per rilevare quando torna giù, fai in modo simile.

Con la millis() non ci fai niente, devi usare la micros().....

Rimanendo l'analisi del PPM la soluzione migliore, se non puoi accedervi devi crearti qualcosa di analogo. Colleghi tre diodi alle tre uscite della radio, polarizzati in modo che siano in conduzione quando il segnale in uscita è alto. Gli altri terminali dei tre diodi lo colleghi tutti assieme ad un pin di Arduino che supporti gli Interrupt, mettendo una resistenza da 220 Ohm tra il pin e massa. Devi poi implementare una routine sull'interrupt, che scatti sia un RISE che in FALL. Nella routine devi leggerti velocemente gli stati delle tre porte collegate ai canali e, fuori dalla interrupt, gestirti i cambi di stato e le relative tempistiche per ogni canale.

Dovrebbe anche esserci una funzione, che adesso non ricordo, che ti permette di memorizzare in una unica variabile di tipo Byte lo stato di più pin di ingresso, rendendo quindi molto veloce l'esecuzione dell'Interrupt ed anche più efficiente la successiva elaborazione del dato.

Carlo

carloroma63:
Con la millis() non ci fai niente, devi usare la micros()...

Sì, certo. Ho sbagliato.

Datman:
Sì, certo. Ho sbagliato.

:slight_smile:

Grazie a tutti delle risposte, sto ancora provando con i vostri consigli, non ci sono ancora riuscito ma volevo vedere se riuscivo ad arrivarci da solo, mi sto documentando con internet e facendo varie prove perché comunque vedo che la mia radio non sembra essere stabile, i 1500 al centro non li ho mai. Domani un mio amico mi presta una sua radio per vedere di fare delle prove con la sua così forse riesco già a risolvere il primo problema di base

Il valore di 1500 è indicativo. Il valore esatto dipende dalla radio, dalla posizione dei trim e dalla eventuale programmazione del canale della radio. La sua stabilità dipende dalla precisione della meccanica e dei potenziometri, quindi non aspettarti di avere un valore preciso a 1500 e stabile.

Carlo

Leggi il messaggio #4 di pochi giorni fa