| | #11 (permalink) Top |
| Adv Moderator Data registr.: 15-08-2007 Residenza: sto a Massa ma sono molto Positivo
Messaggi: 12.071
|
Il tuo codice lo vedo molto critico dal punto di vista del segnale generato, cerco di spiegarti il perché: Codice: void setup(){
pinMode(throttleInput,INPUT);
auxServo.attach(auxOutput);
auxServo.write(0); //inizializzo il valore del canale aux su BASSO
} Codice: pinMode(auxOutput,OUTPUT); Codice: void setup(){
pinMode(throttleInput,INPUT);
pinMode(auxOutput,OUTPUT);
auxServo.attach(auxOutput);
auxServo.write(0); //inizializzo il valore del canale aux su BASSO
} continuando.... il seguente codice: Codice: //Acquisisco il valore del throttle throttleVal = pulseIn(throttleInput,HIGH,25000); ovvero il segnale di uscita non verrà generato fino a che, o l'impulso viene rilevato, o avviene un timeout. Andiamo avanti con l'analisi degli orrori Codice: //controllo il valore del throttle
if(throttleVal <= 0){ //se il valore del throttle è andato a zero attivo il "failsafe" comunque questo non inficia il funzionamento ma è solo un questione di pulizia del codice. Tuttavia non confronterei mai con 0, stai aspettando un segnale che deve avere un ampiezza compresa fra 1000 e 2000us.... perché rischiare di prendere delle spurie da pochi uSec come segnale valido ? Codice: auxServo.write(179); //"invio" un segnale ALTO
delay(15);
} Codice: auxServo.write(179); //"invio" un segnale ALTO
} else {
auxServo.write(0); //"invio" un segnale BASSO
} pulseIn aspetta 25ms... ritorna 0.. auxServo.write() genera un impulso di 2ms delay aspetta 15ms in totale il tuo impulso viene generato ogni 42 ms...secondo me sono un po' troppi. forse allora togliendo il delay almeno lo avresti generato ogni 27ms e le cose andrebbero meglio. Nel caso l'impulso sia presente con il tuo codice (tolto il delay e inserito l'else) invece avverrebbe la cosa seguente: chiamiamo Ton il tempo in cui l'impulso di ingresso va alto: Tduty la larghezza dell'impulso in ingresso Ttot il periodo del ppm in ingresso (tipicamente 18ms) servoin aspetta l'impulso T0=Ton al tempo Ton+Tduty (variabile e dipendente dall'impulso in ingresso) auxServo.write() genera un impulso di larghezza 1000uSec e ritorna al ciclo successivo di pulseIn A questo punto pulseIn aspetterà Ttot-1000usec-Tduty che si ripresenti l'impulso successivo. essendo Tduty variabile è evidente che l'impulso generato da auxServo.write() avrà un jitter dipendente dalle variazioni dell'ingresso... E' vero che all'elettronica che legge l'impulso probabilmente non gliene frega nulla, ma è concettualmente sbagliato. La generazione del PPM deve essere fatta in un interrupt che setta l'uscita, regola il timer per la chiamata successiva dopo i ms di ampiezza dell'impulso, la chiamata successiva resetta l'uscita e imposta il timeout dell'interrupt successivo a 22.5-(larghezza impulso) ms (quello che correttamente viene fatto nella ISR(TIMER1_COMPA_vect) del codice da te postato. nel tuo caso andrebbe fatto per un solo canale e non per tutti quelli dello stream PPM: Spero di essere stato sufficientemente chiaro, cordiali saluti
__________________ 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 Ultima modifica di romoloman : 01 dicembre 13 alle ore 16:35 |
| | |
| | #12 (permalink) Top | |
| User Data registr.: 19-07-2008 Residenza: catania
Messaggi: 978
| ???
sarà l'età.. o forse mi sono un pò arruginito ! o force troppi Acronimi FC, RX, AUX1 ecc vorrei capire meglio.. ..dunque la scheda MultiWii dotata d acellerometri e giroscopi.. dunque è in grado di rilevare ogni movimento possibile.. con una sensibilità dignitosa.. per quello che ho capito ..tu vorresti in un canale della tua ricevente.. attivare o meno il controllo della MultiWii.. ..dunque essa provvederà a stabilizzare il modello attraverso arduino, che leggendo i valori digitali dell'orizzonte e delle sbandate... riesce a correggere attraverso un opportuno movimento dei servi... ovviamente i servo si muoveranno sempre attraverso i tuoi comandi.. ma nel caso non muovessi gli stick.. , quindi se non rileva variazioni dalla RX montata sul velivolo e inoltre il ch 6 è in modalità fail save... allora solo in questo caso intraprende le azioni che impartisce arduino.. ..dimmi se ho capito bene intanto oppure non ho capito una mazza! Citazione:
| |
| | |
| | #13 (permalink) Top | |||
| User Data registr.: 10-12-2012 Residenza: roma
Messaggi: 430
|
Innanzi tutto grazie romoloman per essere stato così meticoloso ![]() Alcuni punti mi sono chiari, altri un pò meno: Citazione:
Citazione:
Quello che però non capisco è perché tu non confronteresti con 0, mi spiego, banalmente quello che ho fatto è stato leggere il valore dalla ricevente e con la trasmittente accesa leggo un valore compreso tra 1000 e 2000, che ovviamente si muove a seconda del movimento dello stick. Nel momento in cui ho spento la trasmittente,simulando una perdita di segnale, questo valore è andato a 0. In che altro modo posso intercettare un'assenza di segnale? se non confrontando questo valore con 0 ? Per tutti gli altri punti che mi hai segnalato credo d'aver capito, grazie per la spiegazione. Per quanto riguarda il fatto di usare le interrupt e il Timer credo di aver più o meno capito concettualmente quello che si va a fare, con le mie competenze attuali non sono in grado di implementare qualcosa,devo vedermi meglio come funzionano i Timer e i vari registri. Se però il codice che ho postato è fatto bene perché non mi funziona? Ho modificato così le define: Codice: //this programm will put out a PPM signal //////////////////////CONFIGURATION/////////////////////////////// #define chanel_number 1 //set the number of chanels ->ho bisogno di controllare 1 solo canale #define default_servo_value 1500 //set the default servo value #define PPM_FrLen 1500 //set the PPM frame length in microseconds (1ms = 1000µs) #define PPM_PulseLen 300 //set the pulse length #define onState 1 //set polarity of the pulses: 1 is positive, 0 is negative #define sigPin 6 //set PPM signal output pin on the arduino ->vorrei l'uscita ppm sul pin 6 ////////////////////////////////////////////////////////////////// L'unica cosa che ho notato, smanettando un po "a buffo", è che modificando il parametro #define onState e portandolo da 1 a 0, quello che succede è che il valore del canale su multiwii inizia a oscillare, arriva "lentamente" al massimo, e poi torna indietro,al minimo e così via. Cosa mi manca ? ![]() Citazione:
Ho trovato in rete un software Multiwii modificato, che implementa questo genere di failsafe, ma andiamo OT, se riesco volevo proseguire con la mia idea. | |||
| | |
| | #15 (permalink) Top | |
| Adv Moderator Data registr.: 15-08-2007 Residenza: sto a Massa ma sono molto Positivo
Messaggi: 12.071
| Citazione:
300 è un valore abbastanza standard, ma magari l'interfaccia multiwii lo vuole più lungo (400+uSec) tuttavia non ho capito ma ora ti funziona oppure no ?
__________________ 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 Ultima modifica di romoloman : 04 dicembre 13 alle ore 22:52 | |
| | |
| | #16 (permalink) Top | |
| User Data registr.: 10-12-2012 Residenza: roma
Messaggi: 430
| Citazione:
Impostando quel valore tra 1000 e 2000 multiwii lo legge tranquillamente...non so il perché ma è così ![]() A quanto pare funziona, ora non sono al pc,domani posto il codice | |
| | |
| | #17 (permalink) Top |
| User Data registr.: 23-03-2013 Residenza: Roma
Messaggi: 456
|
ciao a tutti baccothe scusa l'intromissione, scrivo qui perchè sempre di ppm si parla. ho provato a cercare sul forum e anche su internet, ma non sono riuscito a trovare una funzione, sotto forma di libreria o anche codice scritto, che mi permetta di leggere un segnale ppm prelevato da una rx (FrSky Delta 8) e che mi restituisca i valori divisi canale per canale. esiste? tevere p.s. ho provato anche a guardare i software per multirotori, ma, a causa delle mie poche conoscenze in quest'ambito, non sono riuscito ad estrapolare nulla
__________________ vola...vola...volaaaaaaaaaaaaaaaaaaaaaaaaaa ![]() |
| | |
| | #18 (permalink) Top | |
| User Data registr.: 19-07-2008 Residenza: catania
Messaggi: 978
| Non è una cosa complicata!
tutto sommato non è complicato.... abbiamo il Timer1 che cresce a ritmo di mezzo microsecondo.. (prescaler 8) ovvero 500 nS (nano secondi) quando raggiunge il valore del periodo, si verifica un interrupt.... che viene catturato dalla funzione ISR( ecc...) ..dentro questa funzione viene azzerato il timer... viene eseguito il fronte di salita sul pin in causa... Adesso il compare dovrà osservare non più il periodo ma un altro registro l'OCR1A appena il Timer1 raggiunge questo valore avviene dinuovo un interrupt ma stavolta esegue il fronte di discesa STOP! fine della storia.. ovviamente i registri Citazione:
| |
| | |
![]() |
| Bookmarks |
| |
Discussioni simili | ||||
| Discussione | Autore discussione | Forum | Commenti | Ultimo Commento |
| aiuto con arduino e ppm | alex-military | Circuiti Elettronici | 0 | 22 febbraio 13 14:52 |
| Ricevitore di segnale PPM | CarloRoma63 | Radiocomandi | 2 | 06 marzo 12 18:24 |
| Installazione Frsky V8HT interno - Trovare il segnale ppm +e - sulla radio | searchworlds | Radiocomandi | 4 | 22 maggio 11 23:18 |
| GRAUPNER MX-16S 35 Mhz. PROBLEMI DI SEGNALE IN PPM | rentwc | Radiocomandi | 2 | 30 marzo 10 00:41 |
| trovare segnale ppm | silviocross | Radiocomandi | 8 | 11 marzo 10 22:21 |