| |
| | #1 (permalink) Top |
| User Data registr.: 10-12-2012 Residenza: roma
Messaggi: 430
| Emulare con Arduino un segnale PPM
Dunque, ho un arduino nano e stavo pensando di utilizzarlo per implementare una procedura di failsafe. L'idea è questa: 1)collego un canale aux della rx(Turnigy 8ch) ad un pin di arduino, supponiamo il pin 6. 2)collego un pin di arduino,supponiamo il pin 7 al canale (per esempio)AUX1 della FC, in questo caso una MultiWii. 3)Sulla MultiWii abbino l' RTH al canale AUX1, supponiamo RTH ON su un valore ALTO, RTH OFF su un valore BASSO. 4)vado a leggere tramite la funzione pulseIn() il valore della rx sul pin 6, ed eseguo un controllo: 4.1)se il valore è > 0, invio sul pin 7 un valore BASSO 4.2)altrimenti attivo il FailSafe, e invio un valore ALTO sul pin 7, attivando l' RTH. Il problema è che non riesco ad inviare i valori ALTO/BASSO sul pin 7, ho provato importando la libreria servo.h e utilizzare la funzione servo.write(val) ma nisba... Un piccolo pezzo del codice che ho utilizzato e che non funziona, ovvero quello per inviare un segnale da arduino alla MultiWii: Codice: #include <Servo.h>
Servo myservo;
int auxPinOut = 7;
void setup()
{
myservo.attach(auxPinOut);
}
void loop() {
myservo.write(1900);
} |
| | |
| | #2 (permalink) Top | |
| Adv Moderator Data registr.: 15-08-2007 Residenza: sto a Massa ma sono molto Positivo
Messaggi: 12.071
| Citazione:
chiamare servo.write(1900) nel main loop senza metterci almeno un pause di 15/16ms dall'esempio della libreria servo: Codice: // Controlling a servo position using a potentiometer (variable resistor)
// by Michal Rinott <http://people.interaction-ivrea.it/m.rinott>
#include <Servo.h>
Servo myservo; // create servo object to control a servo
int potpin = 0; // analog pin used to connect the potentiometer
int val; // variable to read the value from the analog pin
void setup()
{
myservo.attach(9); // attaches the servo on pin 9 to the servo object
}
void loop()
{
val = analogRead(potpin); // reads the value of the potentiometer (value between 0 and 1023)
val = map(val, 0, 1023, 0, 179); // scale it to use it with the servo (value between 0 and 180)
myservo.write(val); // sets the servo position according to the scaled value
delay(15); // waits for the servo to get there
}
__________________ 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 | |
| | |
| | #4 (permalink) Top |
| User Data registr.: 10-12-2012 Residenza: roma
Messaggi: 430
|
Niente non và, ho trovato in rete esempi tipo questo: Arduino PPM encoder - RC Groups ma non riesco a capire il codice |
| | |
| | #5 (permalink) Top |
| Adv Moderator Data registr.: 15-08-2007 Residenza: sto a Massa ma sono molto Positivo
Messaggi: 12.071
|
puoi postare qui il codice del tuo ?
__________________ 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 |
| | |
| | #6 (permalink) Top |
| User Data registr.: 10-12-2012 Residenza: roma
Messaggi: 430
| Certo Codice: #include <Servo.h>
int throttleInput = 6; //acquisisco il segnale del throttle dal pin 6
int auxOutput = 5; //invio il segnale del canale aux sul pin 7
int throttleVal;
Servo auxServo;
void setup(){
pinMode(throttleInput,INPUT);
auxServo.attach(auxOutput);
auxServo.write(0); //inizializzo il valore del canale aux su BASSO
}
void loop(){
//Acquisico il valore del throttle
throttleVal = pulseIn(throttleInput,HIGH,25000);
//controllo il valore del throttle
if(throttleVal <= 0){ //se il valore del throttle è andato a zero attivo il "failsafe"
auxServo.write(179); //"invio" un segnale ALTO
delay(15);
}
} |
| | |
| | #8 (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:
| |
| | |
| | #9 (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. | |||
| | |
![]() |
| 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 |