Innanzi tutto grazie romoloman per essere stato così meticoloso
Alcuni punti mi sono chiari, altri un pò meno:
Citazione:
Codice: Codice:
//Acquisisco il valore del throttle
throttleVal = pulseIn(throttleInput,HIGH,25000); Aspetta fino a 25000 microsecondi (25 ms) in attesa di trovare un segnale valido, se non lo trova ritorna 0. Il problema è che ciò rende instabile la generazione del segnale successivo, ma soprattutto rende la generazione del fronte di salita dell'uscita dipendente dal segnale in ingresso.
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 :
|
Aspettare un segnale valido in input e, nel caso questo non arrivi(perdita di segnale??)dopo tot tempo ritornare 0, non è proprio quello che dobbiamo fare? Mi stai consigliando di diminuire il tempo di timeout ? o di utilizzare un'altro sistema per leggere il segnale del throttle ?
Citazione:
Codice: Codice:
//controllo il valore del throttle
if(throttleVal <= 0){ //se il valore del throttle è andato a zero attivo il "failsafe" minore o uguale di 0 ??? La condizione < 0 non sarà mai vera.... al massimo == 0
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 ?
|
Non ha alcun senso fare un confronto del tipo <= 0, d' accordissimo, poco elegante e inutile.
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
//////////////////////////////////////////////////////////////////
Ma comunque continua a non funzionare, il valore che leggo sulla GUI di multiwii resta fisso, come se non ci fosse attaccato nulla.
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:
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!
|
Quello che vorrei fare è molto più "semplice", non voglio controllare la stabilita del mozzo, voglio soltanto intercettare un'eventuale perdita di segnale della radio, e in questo caso inviare un segnale alla scheda di controllo che mi attivi una modalità di volo, per esempio un ritorno a casa.
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.