Torna indietro   BaroneRosso.it - Forum Modellismo > Elettronica > Circuiti Elettronici


Rispondi
 
Strumenti discussione Visualizzazione
Vecchio 16 gennaio 16, 11:05   #1 (permalink)  Top
User
 
L'avatar di Robby Naish
 
Data registr.: 16-10-2002
Residenza: Roma
Messaggi: 1.297
Arduino Nano e lettura RX

Ciao,

stavo studiandomi un po di soluzioni per leggere da un Rx 2.4....

Ma ho trovato troppe soluzioni diverse

Ho trovato questa che va per Rx Orange....

https://github.com/jmparatte/CPPM

poi ci sarebbe questa altra versione un po piu complessa

https://forum.arduino.cc/index.php?topic=53707.0

Infine questa che da quanto ho capito però ha un po di limiti non utilizzando gli interrupt

Gioblu robotics | Da ricevente R/C ad arduino | Rightval, Ricevente, Leftval, Write, Motore

Voi come fate?
Al momento volevo fare dei test senza avere interesse per la proporzionalità, quindi On/off per poi passare ad intercettare anche la proporzionalità del segnale che andrebbero ai servo o esc

Grazie
Ale
Robby Naish non è collegato   Rispondi citando
Vecchio 16 gennaio 16, 18:10   #2 (permalink)  Top
Adv Moderator
 
L'avatar di romoloman
 
Data registr.: 15-08-2007
Residenza: sto a Massa ma sono molto Positivo
Messaggi: 12.069
Citazione:
Originalmente inviato da Robby Naish Visualizza messaggio
Ciao,

stavo studiandomi un po di soluzioni per leggere da un Rx 2.4....

Ma ho trovato troppe soluzioni diverse

Ho trovato questa che va per Rx Orange....

https://github.com/jmparatte/CPPM

poi ci sarebbe questa altra versione un po piu complessa

https://forum.arduino.cc/index.php?topic=53707.0

Infine questa che da quanto ho capito però ha un po di limiti non utilizzando gli interrupt

Gioblu robotics | Da ricevente R/C ad arduino | Rightval, Ricevente, Leftval, Write, Motore

Voi come fate?
Al momento volevo fare dei test senza avere interesse per la proporzionalità, quindi On/off per poi passare ad intercettare anche la proporzionalità del segnale che andrebbero ai servo o esc

Grazie
Ale
La prima o la seconda, tuttavia la scelta dipende dal fatto che tu abbia una ricevente CPPM (che sia orange o altro non cambia nulla) o una tradizionale.
__________________
Vivere in qeusto mondo e molto belo belo e vale la pena starci ma a volte in questa UNICA vita che ci apartiene posono succedere cose brute brute alora mi chiedo perche siete incazziati domani pole esere anche lultimo
Grazie "TRANQUILLO"
FAI 15766
romoloman non è collegato   Rispondi citando
Vecchio 16 gennaio 16, 19:48   #3 (permalink)  Top
User
 
L'avatar di Robby Naish
 
Data registr.: 16-10-2002
Residenza: Roma
Messaggi: 1.297
Ciao,

al momento oltre a qlc Rx a 35mhz, ho una Frsky D8R II plus (vecchia versione) che è ancora imballata, più un Eflite eflr310013 che non penso sia CPPM, oltre ad una Rx di un auto di marca sconosciuta

Quindi mi sa mi devo studiare la versione più complessa vero?

Grazie
Ale
Robby Naish non è collegato   Rispondi citando
Vecchio 16 gennaio 16, 22:29   #4 (permalink)  Top
Adv Moderator
 
L'avatar di romoloman
 
Data registr.: 15-08-2007
Residenza: sto a Massa ma sono molto Positivo
Messaggi: 12.069
Citazione:
Originalmente inviato da Robby Naish Visualizza messaggio
Ciao,

al momento oltre a qlc Rx a 35mhz, ho una Frsky D8R II plus (vecchia versione) che è ancora imballata, più un Eflite eflr310013 che non penso sia CPPM, oltre ad una Rx di un auto di marca sconosciuta

Quindi mi sa mi devo studiare la versione più complessa vero?

Grazie
Ale
Esatto....
__________________
Vivere in qeusto mondo e molto belo belo e vale la pena starci ma a volte in questa UNICA vita che ci apartiene posono succedere cose brute brute alora mi chiedo perche siete incazziati domani pole esere anche lultimo
Grazie "TRANQUILLO"
FAI 15766
romoloman non è collegato   Rispondi citando
Vecchio 18 gennaio 16, 16:04   #5 (permalink)  Top
User
 
L'avatar di CarloRoma63
 
Data registr.: 08-08-2011
Residenza: Roma
Messaggi: 5.782
Citazione:
Originalmente inviato da Robby Naish Visualizza messaggio
Ciao,

stavo studiandomi un po di soluzioni per leggere da un Rx 2.4....

Ma ho trovato troppe soluzioni diverse

Ho trovato questa che va per Rx Orange....

https://github.com/jmparatte/CPPM

poi ci sarebbe questa altra versione un po piu complessa

https://forum.arduino.cc/index.php?topic=53707.0

Infine questa che da quanto ho capito però ha un po di limiti non utilizzando gli interrupt

Gioblu robotics | Da ricevente R/C ad arduino | Rightval, Ricevente, Leftval, Write, Motore

Voi come fate?
Al momento volevo fare dei test senza avere interesse per la proporzionalità, quindi On/off per poi passare ad intercettare anche la proporzionalità del segnale che andrebbero ai servo o esc

Grazie
Ale
Se non hai una uscita unica per il PPM sei costretto ad usare un ingresso di Arduino per ogni singolo canale da leggere.
In tal caso, visto che non hai bisogno di una grandissima precisione, l'utilizzo della funzione PulseIn è più che sufficiente.


Quello che segue è il codice che uso sul Titanic, che credo sia simile a quello che devi fare tu. Basta che segui le righe dedicate alle "luci di via" che ti ho evidenziato

Le varie righe vanno inserite all'interno delle rispettive funzioni dove le ho messe io
-inizializzazione (cioè prima della funzione setup() )
-setup()
-loop()

Carlo

/*
Programma di gestione del Titanic.
Gestisce l'argano salpa ancora, la sirena, il generatore di fumo ed il relativo ventilatore. misura le tensioni delle batterie, accende le luci di via e di sala.
In caso di problemi emette segnali acustici specifici.

*/



// ingressi analogici
byte sensorPin0 = A0; // Input per la misura della tensione della batteria motore
byte sensorPin1 = A1; // Input per la misura della tensione della batteria servizi
byte sensorPin2 = A2; // Input per la misura della tensione della corrente camini

// ingressi canali radio
byte pinCH1 = 2; // motore
byte pinCH2 = 4; // luci di via
byte pinCH3 = 12; // luci sala
byte pinCH4 = 7; // sirena
byte pinCH5 = 8; // salpa ancora
unsigned int durationCH1;
unsigned int durationCH2;
unsigned int durationCH3;
unsigned int durationCH4;
unsigned int durationCH5;

// Uscite pwm
byte pinVentola = 10; // Ventola
byte pinFumo = 11; // Generatore fumo
byte pinAncoraSu = 3; // Salpa ancora - polo positivo
byte pinAncoraGiu= 5; // Salpa ancora - polo negativo
byte pinBuzzer = 9; // altoparlantino

// Uscite digitali

byte pinSala = 6; // Luci di sala
byte pinVia = 13; // Luci di via

//

// Variabili e costanti
// sensori analogici
int sensorValue0 = 0; // tensione batteria motore
int sensorValue1 = 0; // tensione batteria servizi
int sensorValue2 = 0; // corrente camini
const float Trim0 = 0.78; //parametro di conversione tensione batteria motore
const float Trim1 = 1.19; //parametro di conversione tensione batteria servizi
const float Trim2 = 4.7; //parametro di conversione corrente camini.
const unsigned long massimo0 = 1000; // soglia massima della corrente assorbita dal generatore di fumo.
const unsigned long minimo0 = 600;// soglia minima della corrente assorbita dal generatore di fumo.
const unsigned long minimo1 = 900;// soglia di allarme per la tensione della batteria servizi
const unsigned long minimo2 = 600; // soglia di allarme per la tensione della batteria motore
// soglia di comando dei canali radio

const unsigned long sogliaCH2 = 1500;
const unsigned long sogliaCH3 = 1500;
const unsigned long sogliaCH4 = 1500;
const unsigned long sogliaCH5a = 1700; // salpa ancora in salita
const unsigned long sogliaCH5b = 1200; // salpa ancora in discesa

// variabili di appoggio generatore di fumo
int valFumo = 0;
int valFumoAtteso = 0;
int valVentola = 0;
int valMotore = 0;
int valMassimo = 220;
// variabile per contenere la velocità di funzionamento del salpa ancora.
int valAncora = 0;


void setup() {
// definisco i canai di input dalla radio
pinMode(pinCH1, INPUT); // clone del motore, usato per il generatore di fumo
pinMode(pinCH2, INPUT); // Luci di via
pinMode(pinCH3, INPUT); // luci saloni
pinMode(pinCH4, INPUT); // sirena
pinMode(pinCH5, INPUT); // salpa ancora

// stappo i condotti dell'aria azionando per tre secondi la ventola alla massima velocità.
analogWrite(pinVentola, 255);
analogWrite(pinFumo, 220); // regolare il valore per la corrente massima sopportata dai camini
delay (3000);
analogWrite(pinVentola, 0);
analogWrite(pinFumo, 0);
tone(pinBuzzer,500,100);
delay (100);
tone(pinBuzzer,600,100);
delay (100);
tone(pinBuzzer,700,100);
delay (100);
tone(pinBuzzer,800,100);
delay (100);
tone(pinBuzzer,900,100);
delay (100);
// inizializzo la seriale
Serial.begin(9600);
Serial.println("Sistema avviato.");

}

void loop() {
// Leggo i valori dei sensori:
sensorValue0 = analogRead(sensorPin0);
sensorValue0=sensorValue0*Trim0;
sensorValue1 = analogRead(sensorPin1);
sensorValue1=sensorValue1*Trim1;
sensorValue2 = analogRead(sensorPin2);
sensorValue2=sensorValue2*Trim2;

// verifico le tensioni di batteria

// Batteria motore: carica a 8,4V e scarica a 6,0V
if ( sensorValue0<600){
// beep per Batteria motore scarica
tone(pinBuzzer,1000,100);
delay(100);
Serial.println("Batteria motore scarica!");
}

// batteria servizi, carica a 12,6V e scarica a 9,0V
if ( sensorValue1<900){
// beep per Batteria servizi scarica
tone(pinBuzzer,1500,100);
delay(100);
Serial.println("Batteria servizi scarica!");

}

// leggo i canali radio
durationCH1 = pulseIn(pinCH1, HIGH);
if ( durationCH1>0){ // verifico che la radio sia accesa.
durationCH2 = pulseIn(pinCH2, HIGH);
durationCH3 = pulseIn(pinCH3, HIGH);
durationCH4 = pulseIn(pinCH4, HIGH);
durationCH5 = pulseIn(pinCH5, HIGH);


// Potenza del generatore di fumo
// Riceve il canale del motore (ch1, clone del ch8 se abilitato dallo switch ELE, altrimenti fisso a -100) e lo usa per regolare la potenza erogata
// riceve il segnale della corrente assorbita (sensore 2)
// comanda sia il generatore che la ventola
if ( durationCH1>1000){ // verifico che il fumo sia abilitato

/* if (valFumo>0 and sensorValue2<50){ // verifico se il generatore di fumo assorbe corrente. In caso negativo emetto segnale acustico come allarme.
tone(pinBuzzer,2500,100);
Serial.println("Generatore di fumo guasto!");
delay(100);
}
*/
if (valFumo>0 and sensorValue2>massimo0){ // verifico se il generatore di fumo assorbe troppa corrente. In caso positivo abbasso il valore massimo del pwm.
valMassimo=valMassimo-1;
}
valMotore = durationCH1 - 1455;
valFumoAtteso = abs(valMotore);
valVentola = map(valFumoAtteso,0,100,100,250); // verificare valori delle formule in base ai dati reali
if (valVentola > 255) { valVentola=255; }
valFumo = map(valFumoAtteso,0,100,70,valMassimo); //sostituire con la riga precedente quando verrà attivato il sensore di corrente.
if (valFumo > valMassimo) { valFumo=valMassimo; }

analogWrite(pinVentola, valVentola);
analogWrite(pinFumo, valFumo);

}else{ // Interrutto ELE in OFF, fumo spento.

analogWrite(pinVentola, 0);
analogWrite(pinFumo, 0);
}



// Salpa ancora. E' pilotato dal CH5, confrontato con le due soglie sogliaCH5a e sogliaCH5b

// imposto a OFF entrambi i canali del ponte ad H
analogWrite(pinAncoraSu, 0);
analogWrite(pinAncoraGiu, 0);

// calcolo la velocità di rotazione dell'argano in funzione del valore proveniente dalla radio.
// in questo modo posso regolare la velocità senza dover ricompilare lo sketch
valAncora = durationCH5 - 1455;

// eseguo la comparazione ed attivo il corrispondente canale del ponte ad H
if (durationCH5>sogliaCH5a) { // Ancora su.
analogWrite(pinAncoraSu, abs(valAncora)/10);
Serial.println("Ancora SU!");
};
if (durationCH5<sogliaCH5b) { // Ancora giù.
analogWrite(pinAncoraGiu, abs(valAncora)/10);
Serial.println("Ancora GIU!");
};



// sirena
if (durationCH4>sogliaCH4) { // Sirena.
tone(pinBuzzer,300);
}else{
noTone(pinBuzzer);
};


// luci di via
if (durationCH2>sogliaCH2) { // luci di via.
analogWrite(pinVia, 255);
}else{
analogWrite(pinVia, 0);
};


// luci di sala
if (durationCH3>sogliaCH3) { // luci di sala.
analogWrite(pinSala, 255);
}else{
analogWrite(pinSala, 0);
};

}else{
// beep per radio spenta
tone(pinBuzzer,2000,10);
// spengo tutti i dispositivi eventualmente accesi.
analogWrite(pinSala, 0);
analogWrite(pinVia, 0);
analogWrite(pinAncoraSu, 0);
analogWrite(pinAncoraGiu, 0);
analogWrite(pinVentola, 0);
analogWrite(pinFumo, 0);
delay(1000);
Serial.println("Radio spenta!");
}

// Serial monitor
if (false) {
Serial.print("Batteria Motore: ");
Serial.println(sensorValue0);
Serial.print("Batteria Servizi: ");
Serial.println(sensorValue1);
Serial.print("Corrente camini: ");
Serial.println(sensorValue2);
Serial.print("Ch1: ");
Serial.println(durationCH1);
Serial.print("Ch2: ");
Serial.println(durationCH2);
Serial.print("Ch3: ");
Serial.println(durationCH3);
Serial.print("Ch4: ");
Serial.println(durationCH4);
Serial.print("Ch5: ");
Serial.println(durationCH5);
Serial.print("valVentola: ");
Serial.println(valVentola);
Serial.print("valFumoAtteso: ");
Serial.println(valFumoAtteso);
Serial.print("valFumo: ");
Serial.println(valFumo);
}
delay(100);
}

__________________
Dai un pesce ad un uomo e lo avrai sfamato per un giorno, insegnagli a pescare e lo avrai sfamato per sempre. (Confucio)
I miei modelli: http://www.youtube.com/results?search_query=carloroma63
CarloRoma63 non è collegato   Rispondi citando
Vecchio 18 gennaio 16, 17:32   #6 (permalink)  Top
User
 
L'avatar di Robby Naish
 
Data registr.: 16-10-2002
Residenza: Roma
Messaggi: 1.297
Carlo, hai di nuovo MP piena...

Mi mandi tua email? ;)

ciao
Robby Naish non è collegato   Rispondi citando
Vecchio 19 gennaio 16, 10:43   #7 (permalink)  Top
User
 
L'avatar di CarloRoma63
 
Data registr.: 08-08-2011
Residenza: Roma
Messaggi: 5.782
Citazione:
Originalmente inviato da Robby Naish Visualizza messaggio
Carlo, hai di nuovo MP piena...

Mi mandi tua email? ;)

ciao
Lo so, dovrò decidermi a fare una pulizia bella profonda....
nel frattempo puoi scrivere quì.

Carlo
__________________
Dai un pesce ad un uomo e lo avrai sfamato per un giorno, insegnagli a pescare e lo avrai sfamato per sempre. (Confucio)
I miei modelli: http://www.youtube.com/results?search_query=carloroma63
CarloRoma63 non è collegato   Rispondi citando
Vecchio 19 gennaio 16, 14:06   #8 (permalink)  Top
Adv Moderator
 
L'avatar di romoloman
 
Data registr.: 15-08-2007
Residenza: sto a Massa ma sono molto Positivo
Messaggi: 12.069
Carlo c'è un grosso errore nel tuo codice....
Usando la pulsein come la usi tu se il canale 2 è molto attaccato (temporalmente) al canale 1 lo leggerai al ciclo successivo... con 4 canali riduci la frequenza di lettura dei canali a 5hz... lo stesso dicasi se dalla ricevente i canali non escono in ordine... (caso tipico futaba)

Il metodo migliore è l'interrupt come nell'esempio riportato da robby naish.
__________________
Vivere in qeusto mondo e molto belo belo e vale la pena starci ma a volte in questa UNICA vita che ci apartiene posono succedere cose brute brute alora mi chiedo perche siete incazziati domani pole esere anche lultimo
Grazie "TRANQUILLO"
FAI 15766
romoloman non è collegato   Rispondi citando
Vecchio 19 gennaio 16, 15:31   #9 (permalink)  Top
User
 
L'avatar di CarloRoma63
 
Data registr.: 08-08-2011
Residenza: Roma
Messaggi: 5.782
Citazione:
Originalmente inviato da romoloman Visualizza messaggio
Carlo c'è un grosso errore nel tuo codice....
Usando la pulsein come la usi tu se il canale 2 è molto attaccato (temporalmente) al canale 1 lo leggerai al ciclo successivo... con 4 canali riduci la frequenza di lettura dei canali a 5hz... lo stesso dicasi se dalla ricevente i canali non escono in ordine... (caso tipico futaba)

Il metodo migliore è l'interrupt come nell'esempio riportato da robby naish.
Si, è probabile. Nel mio caso non ha alcun impatto, visto l'utilizzo.....
Certo che se dovessi fare qualcosa di più critico mi appellerò agli interrupt, che sono più efficienti ma un pelino più complessi da gestire.

Comunque grazie per la segnalazione, non ci avevo pensato...

Carlo
__________________
Dai un pesce ad un uomo e lo avrai sfamato per un giorno, insegnagli a pescare e lo avrai sfamato per sempre. (Confucio)
I miei modelli: http://www.youtube.com/results?search_query=carloroma63
CarloRoma63 non è collegato   Rispondi citando
Vecchio 19 gennaio 16, 17:22   #10 (permalink)  Top
User
 
L'avatar di Robby Naish
 
Data registr.: 16-10-2002
Residenza: Roma
Messaggi: 1.297
Qui ci sono 2 progetti. Per leggere e per generare un PPM

Read_any_PPM_V0.3.zip - read-any-ppm - third release - Read any ppm signal - Google Project Hosting

Generate_PPM_signal_V0.2.zip - generate-ppm-signal - second version - An Arduino code to generate a customizable ppm signal - Google Project Hosting

Che ne pensate voi geniacci?

Grazie
Ale
Robby Naish non è collegato   Rispondi citando
Rispondi

Bookmarks




Regole di scrittura
Non puoi creare nuove discussioni
Non puoi rispondere alle discussioni
Non puoi inserire allegati
Non puoi modificare i tuoi messaggi

BB code è Attivato
Le faccine sono Attivato
Il codice [IMG] è Attivato
Il codice HTML è Disattivato
Trackbacks è Disattivato
Pingbacks è Disattivato
Refbacks è Disattivato


Discussioni simili
Discussione Autore discussione Forum Commenti Ultimo Commento
arduino nano v3 hurricane01 Compro 0 15 agosto 11 21:31



Tutti gli orari sono GMT +2. Adesso sono le 23:03.


Basato su: vBulletin versione 3.8.11
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
E' vietata la riproduzione, anche solo in parte, di contenuti e grafica. Copyright 1998/2019 - K-Bits P.I. 09395831002