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


Rispondi
 
Strumenti discussione Visualizzazione
Vecchio 27 novembre 13, 20:20   #1 (permalink)  Top
User
 
L'avatar di baccothe
 
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);

}
Qualche idea? Che ne dite? è un'idea folle? stupida? impraticabile?
baccothe non è collegato   Rispondi citando
Vecchio 27 novembre 13, 23:20   #2 (permalink)  Top
Adv Moderator
 
L'avatar di romoloman
 
Data registr.: 15-08-2007
Residenza: sto a Massa ma sono molto Positivo
Messaggi: 12.069
Citazione:
Originalmente inviato da baccothe Visualizza messaggio
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);

}
Qualche idea? Che ne dite? è un'idea folle? stupida? impraticabile?
difetto sostanziale del tuo codice..
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 
}
fra l'altro servo.write vuole un valore compreso fra 0 e 180 non quello in ms...
__________________
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 28 novembre 13, 11:41   #3 (permalink)  Top
User
 
L'avatar di baccothe
 
Data registr.: 10-12-2012
Residenza: roma
Messaggi: 430
Il delay l'avevo messo, comunque faccio un'altro test e posto i risultati.
baccothe non è collegato   Rispondi citando
Vecchio 28 novembre 13, 16:29   #4 (permalink)  Top
User
 
L'avatar di baccothe
 
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
baccothe non è collegato   Rispondi citando
Vecchio 28 novembre 13, 16:51   #5 (permalink)  Top
Adv Moderator
 
L'avatar di romoloman
 
Data registr.: 15-08-2007
Residenza: sto a Massa ma sono molto Positivo
Messaggi: 12.069
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
romoloman non è collegato   Rispondi citando
Vecchio 28 novembre 13, 17:26   #6 (permalink)  Top
User
 
L'avatar di baccothe
 
Data registr.: 10-12-2012
Residenza: roma
Messaggi: 430
Citazione:
Originalmente inviato da romoloman Visualizza messaggio
puoi postare qui il codice del tuo ?
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);
    }  
    
}
Non ho problemi a leggere il segnale del throttle e ad intercettare quando questo va a 0(tx spenta), il problema è che non riesco a "scrivere" sul canale aux
baccothe non è collegato   Rispondi citando
Vecchio 28 novembre 13, 17:35   #7 (permalink)  Top
User
 
Data registr.: 23-11-2011
Residenza: trento
Messaggi: 50
Hai abilitato l'uscita su quel pin dell'arduino? (forse dpmanda stupida ma capita)
dammuozz non è collegato   Rispondi citando
Vecchio 28 novembre 13, 17:35   #8 (permalink)  Top
User
 
L'avatar di baccothe
 
Data registr.: 10-12-2012
Residenza: roma
Messaggi: 430
Sempre in rete ho trovato questo, ma...non riesco a capirlo

Codice:
//this programm will put out a PPM signal

//////////////////////CONFIGURATION///////////////////////////////
#define chanel_number 1  //set the number of chanels
#define default_servo_value 1500  //set the default servo value
#define PPM_FrLen 22500  //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 10  //set PPM signal output pin on the arduino
//////////////////////////////////////////////////////////////////


/*this array holds the servo values for the ppm signal
 change theese values in your code (usually servo values move between 1000 and 2000)*/
int ppm[chanel_number];

void setup(){  
  //initiallize default ppm values
  for(int i=0; i<chanel_number; i++){
    ppm[i]= default_servo_value;
  }

  pinMode(sigPin, OUTPUT);
  digitalWrite(sigPin, !onState);  //set the PPM signal pin to the default state (off)
  
  cli();
  TCCR1A = 0; // set entire TCCR1 register to 0
  TCCR1B = 0;
  
  OCR1A = 100;  // compare match register, change this
  TCCR1B |= (1 << WGM12);  // turn on CTC mode
  TCCR1B |= (1 << CS11);  // 8 prescaler: 0,5 microseconds at 16mhz
  TIMSK1 |= (1 << OCIE1A); // enable timer compare interrupt
  sei();
}

void loop(){
  //put main code here
  static int val = 1;
  
  ppm[0] = ppm[0] + val;
  if(ppm[0] >= 2000){ val = -1; }
  if(ppm[0] <= 1000){ val = 1; }
  delay(10);
}

ISR(TIMER1_COMPA_vect){  //leave this alone
  static boolean state = true;
  
  TCNT1 = 0;
  
  if(state) {  //start pulse
    digitalWrite(sigPin, onState);
    OCR1A = PPM_PulseLen * 2;
    state = false;
  }
  else{  //end pulse and calculate when to start the next pulse
    static byte cur_chan_numb;
    static unsigned int calc_rest;
  
    digitalWrite(sigPin, !onState);
    state = true;

    if(cur_chan_numb >= chanel_number){
      cur_chan_numb = 0;
      calc_rest = calc_rest + PPM_PulseLen;// 
      OCR1A = (PPM_FrLen - calc_rest) * 2;
      calc_rest = 0;
    }
    else{
      OCR1A = (ppm[cur_chan_numb] - PPM_PulseLen) * 2;
      calc_rest = calc_rest + ppm[cur_chan_numb];
      cur_chan_numb++;
    }     
  }
}
baccothe non è collegato   Rispondi citando
Vecchio 29 novembre 13, 11:54   #9 (permalink)  Top
User
 
Data registr.: 23-11-2011
Residenza: trento
Messaggi: 50
aggiungi al codice di prima sotto

pinMode(throttleInput,INPUT);

ci va

int throttleOutputPin=0;
pinMode(throttleOutputPin,OUTPUT);
dammuozz non è collegato   Rispondi citando
Vecchio 29 novembre 13, 17:15   #10 (permalink)  Top
User
 
L'avatar di baccothe
 
Data registr.: 10-12-2012
Residenza: roma
Messaggi: 430
Citazione:
Originalmente inviato da dammuozz Visualizza messaggio
aggiungi al codice di prima sotto

pinMode(throttleInput,INPUT);

ci va

int throttleOutputPin=0;
pinMode(throttleOutputPin,OUTPUT);
A che mi serve un' output sul pin 0 ?

L'uscita l'ho messa sul pin 5, ed ho aggiunto pinMode(auxPin,OUTPUT);, ma niente da fare...la gui di multiwii non legge niente...
baccothe 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
aiuto con arduino e ppm alex-military Circuiti Elettronici 0 22 febbraio 13 13:52
Ricevitore di segnale PPM CarloRoma63 Radiocomandi 2 06 marzo 12 17:24
Installazione Frsky V8HT interno - Trovare il segnale ppm +e - sulla radio searchworlds Radiocomandi 4 22 maggio 11 22:18
GRAUPNER MX-16S 35 Mhz. PROBLEMI DI SEGNALE IN PPM rentwc Radiocomandi 2 29 marzo 10 23:41
trovare segnale ppm silviocross Radiocomandi 8 11 marzo 10 21:21



Tutti gli orari sono GMT +2. Adesso sono le 07:06.


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