BaroneRosso.it - Forum Modellismo

BaroneRosso.it - Forum Modellismo (https://www.baronerosso.it/forum/)
-   Circuiti Elettronici (https://www.baronerosso.it/forum/circuiti-elettronici/)
-   -   Miscelare segnali PPM con arduino (https://www.baronerosso.it/forum/circuiti-elettronici/307533-miscelare-segnali-ppm-con-arduino.html)

faustog_2 14 febbraio 14 00:57

OK grazie romoloman
 
ciao Romoloman..
sei un grande! ..scusa ma te lo devo dire... seguendo i tuoi preziosi consigli, ho voluto osare di più.. dunque ho fatto la tua prova, e inoltre ho fatto la prova del 9, ovvero ho messo i servo! quindi nel caso dell'uso della pulseIn i servo tremano, troppo diciamo inutilizzabili. invece nel caso in cui uso l'interrupt i servo tremano molto meno... sono piu stabili e sicuramente utilizzabili.... nel caso di voler realizzare un drone o un sistema di miscelazione... la soluzione è ARDUINO LEONARDO e l'uso degli interrupt . di seguito il codice che legge dalla ricevente e invia ai servo senza un'elaborazione, diciamo che è il software di base. una riflessione.. secondo me occorre comunque aggiungere un circuito che porta i 4 canali in un unico bus.. dopo aver letto i 4 canali, il software può approfittare della lunga pausa di 20 mS per compiere tutte le elaborazioni e poi applicare eventuali modifiche ai segnali entranti.. per poi inviarli ai servo-

#include <Servo.h>

Servo myservo1, myservo2, myservo3, myservo4;


const int ch1 = 3; // interrupt 0
const int ch2 = 2; // interrupt 1
const int ch3 = 0; // interrupt 2
const int ch4 = 1; // interrupt 3
volatile unsigned long microseconds_1;
volatile unsigned long microseconds_2;
volatile unsigned long microseconds_3;
volatile unsigned long microseconds_4;
volatile byte index =0;
volatile unsigned long ch1_val;
volatile unsigned long ch2_val;
volatile unsigned long ch3_val;
volatile unsigned long ch4_val;

void setup()
{
pinMode(ch1, INPUT);
pinMode(ch2, INPUT);
pinMode(ch3, INPUT);
pinMode(ch4, INPUT);


myservo1.attach(9);
myservo2.attach(10);
myservo3.attach(11);
myservo4.attach(12);


Serial.begin(9600);

attachInterrupt(0, CH1_val, CHANGE); // questo sul pin3
attachInterrupt(1, CH2_val, CHANGE); // questo sul pin2
attachInterrupt(2, CH3_val, CHANGE); // questo sul pin0
attachInterrupt(3, CH4_val, CHANGE); // questo sul pin1
}
//__________________________________________________ ______________
void loop()
{


myservo1.write(map(ch1_val, 1000 ,2000, 0, 180));
myservo2.write(map(ch2_val, 1000 ,2000, 0, 180));
myservo3.write(map(ch3_val, 1000 ,2000, 0, 180));
myservo4.write(map(ch4_val, 1000 ,2000, 0, 180));

delay(15);

/*
Serial.println(ch1_val);
Serial.println(ch2_val);
Serial.println(ch3_val);
Serial.println(ch4_val);
Serial.println(".......");
delay(1);
*/
}
//__________________________________________________ _______
void CH1_val()
{
if(digitalRead(ch1) == HIGH)
microseconds_1 = micros();
else
ch1_val = micros() - microseconds_1;
}
//__________________________________________________ _______
void CH2_val()
{
if(digitalRead(ch2) == HIGH)
microseconds_2 = micros();
else
ch2_val = micros() - microseconds_2;
}

//__________________________________________________ _______
void CH3_val()
{
if(digitalRead(ch3) == HIGH)
microseconds_3 = micros();
else
ch3_val = micros() - microseconds_3;
}
//__________________________________________________ _______
void CH4_val()
{
if(digitalRead(ch4) == HIGH)
microseconds_4 = micros();
else
ch4_val = micros() - microseconds_4;
}







Citazione:

Originalmente inviato da romoloman (Messaggio 4152216)
Guarda che il problema sta proprio in queste 4 righe...
supponi l'ordine in cui cambiano i pin sia 4 3 2 1 o che cambino tutti assieme (caso comune in molte nuove riceventi)
il primo pulseIn aspetta fino a 25000us per pin1
ma quando arriva a leggere un segnale valido passa al secondo pulseIn che dovrà aspettare tutto il frame ppm lo stesso per il terzo e il 8 in totale si arriva a 4 frame = 88ms

Per fare una prova: memorizza millis() prima del primo pulseIn e sottrailo dal valore dopo l'ultimo, stampa i risultati e poi prova a cambiare l'ordine degli ingressi...


romoloman 14 febbraio 14 08:13

Citazione:

Originalmente inviato da faustog_2 (Messaggio 4152894)
ciao Romoloman..
sei un grande! ..scusa ma te lo devo dire... seguendo i tuoi preziosi consigli, ho voluto osare di più.. dunque ho fatto la tua prova, e inoltre ho fatto la prova del 9, ovvero ho messo i servo! quindi nel caso dell'uso della pulseIn i servo tremano, troppo diciamo inutilizzabili. invece nel caso in cui uso l'interrupt i servo tremano molto meno... sono piu stabili e sicuramente utilizzabili.... nel caso di voler realizzare un drone o un sistema di miscelazione... la soluzione è ARDUINO LEONARDO e l'uso degli interrupt . di seguito il codice che legge dalla ricevente e invia ai servo senza un'elaborazione, diciamo che è il software di base. una riflessione.. secondo me occorre comunque aggiungere un circuito che porta i 4 canali in un unico bus.. dopo aver letto i 4 canali, il software può approfittare della lunga pausa di 20 mS per compiere tutte le elaborazioni e poi applicare eventuali modifiche ai segnali entranti.. per poi inviarli ai servo-

void loop()
{


myservo1.write(map(ch1_val, 1000 ,2000, 0, 180));
myservo2.write(map(ch2_val, 1000 ,2000, 0, 180));
myservo3.write(map(ch3_val, 1000 ,2000, 0, 180));
myservo4.write(map(ch4_val, 1000 ,2000, 0, 180));

delay(15);

Ecco, permettimi pure di dirti che generare il PPM utilizzando myservo.write nel main loop non è comunque accettabile...
Anche la generazione del PPM verso i servi andrebbe fatta in un interrupt con una temporizzazione fissa, altrimenti il periodo complessivo dell'impulso ppm dipende troppo da quanto valgono i canali...
Con 4 canali ci sono 4ms che ballano.

faustog_2 14 febbraio 14 11:40

Ok
 
ok romoloman... ..ci tengo a sottolineare che è sempre un piacere scambiare opinioni e suggerimenti con te. Attraverso la funzione map ....

map( valore, range_min_in, range_max_in, 0, 180)

...posso smorzare l'effetto traballante.. agendo sui valori range_min_in e range_max_in loro realizzano una sorta di discretizzazione, ovvero se hai un valore che oscilla tra 1973uS 1970uS il sistema map lo discretizza comunque fermo a 1970 per questo ho dei servo piuttosto stabili, diciamo utilizzabili.

Tuttavia come suggerisci tu posso fare a meno della libreria Servo utilizzando la funzione DelayMicrosenconds, la libreria Servo utilizza Timer1, cosa che potrebbe essere utile

Per il momento voglio creare il sistema per convogliare i pin dei 4 canali della ricevente in un unico bus e farlo catturare ad Arduino in uno dei 5 pin predisposti con gli Interrupt come già visto negli esempi precedenti



Citazione:

Originalmente inviato da romoloman (Messaggio 4152936)
Ecco, permettimi pure di dirti che generare il PPM utilizzando myservo.write nel main loop non è comunque accettabile...
Anche la generazione del PPM verso i servi andrebbe fatta in un interrupt con una temporizzazione fissa, altrimenti il periodo complessivo dell'impulso ppm dipende troppo da quanto valgono i canali...
Con 4 canali ci sono 4ms che ballano.


romoloman 14 febbraio 14 12:40

Citazione:

Originalmente inviato da faustog_2 (Messaggio 4153146)
ok romoloman... ..ci tengo a sottolineare che è sempre un piacere scambiare opinioni e suggerimenti con te. Attraverso la funzione map ....

map( valore, range_min_in, range_max_in, 0, 180)

...posso smorzare l'effetto traballante.. agendo sui valori range_min_in e range_max_in loro realizzano una sorta di discretizzazione, ovvero se hai un valore che oscilla tra 1973uS 1970uS il sistema map lo discretizza comunque fermo a 1970 per questo ho dei servo piuttosto stabili, diciamo utilizzabili.

Tuttavia come suggerisci tu posso fare a meno della libreria Servo utilizzando la funzione DelayMicrosenconds, la libreria Servo utilizza Timer1, cosa che potrebbe essere utile

Per il momento voglio creare il sistema per convogliare i pin dei 4 canali della ricevente in un unico bus e farlo catturare ad Arduino in uno dei 5 pin predisposti con gli Interrupt come già visto negli esempi precedenti

Non fai prima a prendere una ricevente che abbia la funzione CPPM ?

ElNonino 14 febbraio 14 13:48

@faustog_2: se fai tutto a scopo didattico od arricchimento personale ok, anche se Arduino per certe cose non è il massimo, altrimenti diventi membro onorario del UCAS. :D

Naturalmente con simpatia.

:yeah:

faustog_2 14 febbraio 14 16:34

Ucas !!!!
 
Ufficio Complicazioni Affari Semplici !! hahhahah me lo ricordo... .me lo diceva il mio professore di costruzioni al geometra!
..si confermo tutto a scopo didattico... so che ci sono alternative pronte a costi piu bassi.. ne abbiamo già parlato.. il piacere è lavorarci e metterci le mani... ..per quello che concerne le miscelazioni, io nn ho tanto l'esigenza.. quando il discorso d prendere i segnali dalla ricevente poterli manomettere facendo interaggire con un accelerometro ,ggyro eccc..

Citazione:

Originalmente inviato da ElNonino (Messaggio 4153304)
@faustog_2: se fai tutto a scopo didattico od arricchimento personale ok, anche se Arduino per certe cose non è il massimo, altrimenti diventi membro onorario del UCAS. :D

Naturalmente con simpatia.

:yeah:


Rubex 12 aprile 16 18:03

salve a tutti, è stato portato avanti con successo il discorso qui trattato oppure è rimasto a limite teorico???
Sono interessato ma ancora non ho iniziato a metterci le mani, potrei anche leggere un solo canale in quanto ho la possibilità di montare anche 2 arduino , andranno montati su un rover tra un apm arducopter e la scheda motori in quanto per l'autopilota devo tenere conto di eventuali ostacoli e quindi interagire con sensori ultrasuoni e altro.....


Tutti gli orari sono GMT +2. Adesso sono le 20:59.

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