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


Rispondi
 
Strumenti discussione Visualizzazione
Vecchio 14 febbraio 14, 01:57   #11 (permalink)  Top
User
 
L'avatar di faustog_2
 
Data registr.: 19-07-2008
Residenza: catania
Messaggi: 978
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 Visualizza messaggio
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...
faustog_2 non è collegato   Rispondi citando
Vecchio 14 febbraio 14, 09:13   #12 (permalink)  Top
Adv Moderator
 
L'avatar di romoloman
 
Data registr.: 15-08-2007
Residenza: sto a Massa ma sono molto Positivo
Messaggi: 12.071
Citazione:
Originalmente inviato da faustog_2 Visualizza messaggio
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.
__________________
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 14 febbraio 14, 12:40   #13 (permalink)  Top
User
 
L'avatar di faustog_2
 
Data registr.: 19-07-2008
Residenza: catania
Messaggi: 978
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 Visualizza messaggio
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 non è collegato   Rispondi citando
Vecchio 14 febbraio 14, 13:40   #14 (permalink)  Top
Adv Moderator
 
L'avatar di romoloman
 
Data registr.: 15-08-2007
Residenza: sto a Massa ma sono molto Positivo
Messaggi: 12.071
Citazione:
Originalmente inviato da faustog_2 Visualizza messaggio
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 ?
__________________
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 14 febbraio 14, 14:48   #15 (permalink)  Top
User
 
L'avatar di ElNonino
 
Data registr.: 06-05-2007
Residenza: Tre Ville (Preore)
Messaggi: 3.605
Invia un messaggio via MSN a ElNonino
@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.

Naturalmente con simpatia.

__________________
Peace & Love
Fate le cose nel modo più semplice possibile, ma senza semplificare. (A. Einstein)
ElNonino non è collegato   Rispondi citando
Vecchio 14 febbraio 14, 17:34   #16 (permalink)  Top
User
 
L'avatar di faustog_2
 
Data registr.: 19-07-2008
Residenza: catania
Messaggi: 978
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 Visualizza messaggio
@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.

Naturalmente con simpatia.

faustog_2 non è collegato   Rispondi citando
Vecchio 12 aprile 16, 19:03   #17 (permalink)  Top
User
 
Data registr.: 13-01-2016
Residenza: Città di Castello
Messaggi: 4
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.....
Rubex 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
Emulare con Arduino un segnale PPM baccothe Circuiti Elettronici 17 11 febbraio 14 20:10
aiuto con arduino e ppm alex-military Circuiti Elettronici 0 22 febbraio 13 14:52
Aiuto Miscelare canali con JR MX 22 saviothecnic Radiocomandi 16 17 novembre 08 18:33
Miscelare 2 servi per il profondità con Tx X3810 verio77 Aeromodellismo 1 07 agosto 07 11:18



Tutti gli orari sono GMT +2. Adesso sono le 00:51.


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