Show Posts
Pages: 1 [2] 3 4
16  International / Software / Re: Leggere da sensore PWM on: October 25, 2013, 05:49:50 am
Giusto. Per rendere più chiaro il discorso, guarda questa immagine:



sempre considerando che il segnale va calcolato come già detto, ovvero

PWM1 = T1/T
PWM2 = T2/T
PWM3 = T3/T

Io dico che pulseIn() potrebbe andare... so che 1.2 sec è tantissimo ma gli altri calcoli non sono così importanti. Certo, se riuscissimo a fare meglio tanto meglio smiley-razz
17  International / Software / Re: Leggere da sensore PWM on: October 25, 2013, 05:22:07 am
Inizializzando a 0 ottengo sempre letture negative. E' PWM, non PPM, questo è sicuro...
Non ho a priori il dato sulla durata, ma prove empiriche oscilloscopiche mi danno 1200 ms di durata. Sapendo questo, con pulseIn() come potrei fare?
18  International / Software / Re: Leggere da sensore PWM on: October 25, 2013, 05:04:23 am
Diciamo che dovrebbe fare anche altro. Ho usato gli interrupt perché dovrebbero essere anche più precisi in termini di timing. pulseIn() potrebbe anche andare, forse è anche molto più semplice, ma non l'ho mai usato per letture simultanee e non saprei come fare. Sicuramente sarebbe molto più comodo. Il fatto che sia blocking non è un grosso problema... la lettura dal sensore avviene velocissimamente e potrei postporre le altre operazioni. Con pulseIn come potrei fare?
19  International / Software / Re: Leggere da sensore PWM on: October 25, 2013, 04:48:48 am
Purtroppo non è una durata fissa... anzi, proprio al variare del duty cycle (ovviamente) varia la lettura.
Ho modificato il codice in questo modo:

Code:
// First Example in a series of posts illustrating reading an RC Receiver with
// micro controller interrupts.
//
// Subsequent posts will provide enhancements required for real world operation
// in high speed applications with multiple inputs.
//
// http://rcarduino.blogspot.com/
//
// Posts in the series will be titled - How To Read an RC Receiver With A Microcontroller

// See also http://rcarduino.blogspot.co.uk/2012/04/how-to-read-multiple-rc-channels-draft.html 

#define THROTTLE_SIGNAL_IN 0 // INTERRUPT 0 = DIGITAL PIN 2 - use the interrupt number in attachInterrupt
#define THROTTLE_SIGNAL_IN_PIN 2 // INTERRUPT 0 = DIGITAL PIN 2 - use the PIN number in digitalRead

#define NEUTRAL_THROTTLE 0


// this is the duration in microseconds of neutral throttle on an electric RC Car

volatile int nThrottleIn = NEUTRAL_THROTTLE; // volatile, we set this in the Interrupt and read it in loop so it must be declared volatile
volatile unsigned long ulStartPeriod = 0; // set in the interrupt
volatile boolean bNewThrottleSignal = false; // set in the interrupt and read in the loop
// we could use nThrottleIn = 0 in loop instead of a separate variable, but using bNewThrottleSignal to indicate we have a new signal
// is clearer for this first example
double arr[3];         // tra le variabili globali a inizio
byte ndx=0;
double lettura1;
double lettura2;
double lettura3;
void setup()
{
  // tell the Arduino we want the function calcInput to be called whenever INT0 (digital pin 2) changes from HIGH to LOW or LOW to HIGH
  // catching these changes will allow us to calculate how long the input pulse is
  attachInterrupt(THROTTLE_SIGNAL_IN,calcInput,CHANGE);

  Serial.begin(9600);
}

void loop()
{
 // if a new throttle signal has been measured, lets print the value to serial, if not our code could carry on with some other processing
 if(bNewThrottleSignal)
 {
  arr[ndx]=nThrottleIn;
  ndx++;
  if(ndx==3)   
  { // fatte tre letture perciò faccio quel che devo con i tre valori
  lettura1 = arr[0];
  lettura2 = arr[1];
  lettura3 = arr[2];
  Serial.print("Lettura 1: ");
  Serial.println(lettura1);
  Serial.print("Lettura 2: ");
  Serial.println(lettura2);
  Serial.print("Lettura 3: ");
  Serial.println(lettura3);
    // per ultima cosa azzero ndx, altrimenti vado oltre agli elementi del vettore
     ndx=0;
  }
 
   // set this back to false when we have finished
   // with nThrottleIn, while true, calcInput will not update
   // nThrottleIn
   bNewThrottleSignal = false;
 }

 // other processing ...
}

void calcInput()
{
  // if the pin is high, its the start of an interrupt
  if(digitalRead(THROTTLE_SIGNAL_IN_PIN) == HIGH)
  {
     // if the pin is low, its the falling edge of the pulse so now we can calculate the pulse duration by subtracting the
    // start time ulStartPeriod from the current time returned by micros()
    if(ulStartPeriod && (bNewThrottleSignal == false))
    {
      nThrottleIn = (int)(micros() - ulStartPeriod);
      ulStartPeriod = 0;

      // tell loop we have a new signal on the throttle channel
      // we will not update nThrottleIn until loop sets
      // bNewThrottleSignal back to false
      bNewThrottleSignal = true;
    }
   
  }
  else
  {
    // get the time using micros - when our code gets really busy this will become inaccurate, but for the current application its
    // easy to understand and works very well
    ulStartPeriod = micros();
  }
}

e ottengo le prime due letture negative... potrebbe essere relativo comunque. Il problema è che avrei bisogno di eseguire il seguente calcolo. Speriamo di riuscire a spiegarmi bene...

Allora. Io ho da calcolare 3 valori, rispettivamente
PWM1
PWM2
PWM3

che sono da calcolarsi in questo modo:

PWM1 = T1/T
PWM2 = T2/T
PWM3 = T3/T

dove, supponendo la seguente onda:

Code:

H   -----------                            -----------                             -----------                   --------------------------
                           |                           |                      |                           |                      |                  |
L                         |_________|                      |_________|                      |______|
 
<--------->    <------------->                      <------------->                     <-------------> <------------------>
     pausa                     t1                                                   t2                                             t3                   pausa
                          <------------------------><------------------------><------------------------>
                                              T                                                      T                                                  T

(ammazza che fatica disegnare l'onda quadra smiley-razz)

Dunque...

PWM1 dovrebbe essere il T in cui il segnale rimane LOW la prima volta / t1
PWM2 dovrebbe essere il T in cui il segnale rimane LOW la seconda volta / t2
PWM3 dovrebbe essere il T in cui il segnale rimane LOW la terza volta / t3 (notare che il duty cycle di t3 rimane uguale, anche se
il segnale ha un rising ad un certo punto - qui dovrei capire bene come fare).

E qui sono fermo...
20  International / Software / Re: Leggere da sensore PWM on: October 25, 2013, 03:56:26 am
Rieccomi (come sospettavo smiley )

Il sensore funziona a inverted PWM. Come dovrei riadattare quel codice affinché legga correttamente il treno d'onda? Triggerando l'interrupt quando arriva un segnale LOW ottengo letture inconcludenti... la prima potrebbe anche significare qualcosa ma le altre due sono 0. Suggerimenti?
21  International / Software / Re: Leggere da sensore PWM on: October 24, 2013, 08:08:59 am
Qui:
Code:
if(bNewThrottleSignal)
 {
   Serial.println(nThrottleIn);
nella loop() è dove hai un singolo tempo, perciò qui devi scrivere nell'array. Usando una variabile globale che fa da indice.
Esempio byte ndx inializzata a zero e vettore di nome arr.
Code:
int arr[3];         // tra le variabili globali a inizio
byte ndx=0;
...
... nella loop
if(bNewThrottleSignal)
{ arr[ndx]=nThrottleIn;
  ndx++;
  if(ndx==3)  
  { // fatte tre letture perciò faccio quel che devo con i tre valori
     ....
    // per ultima cosa azzero ndx, altrimenti vado oltre agli elementi del vettore
     ndx=0;
  }
   Serial.println(nThrottleIn);
...



Grazie mille, le letture sembrano avvenire correttamente.  Ora devo fare altri conti su quei segnali, bisogna condizionarli in un certo modo. Sicuramente avrò bisogno di altro aiuto, scriverò.

Grazie!
22  International / Software / Re: Leggere da sensore PWM on: October 24, 2013, 07:43:25 am
No, forse avete frainteso. Non è che non so come riempire un array. In questo caso specifico non saprei DOVE piazzare il codice per riempire l'array. Idee in merito?
23  International / Software / Re: Leggere da sensore PWM on: October 24, 2013, 07:28:04 am
Avevo già pensato ad un array. Il problema non è scorrere per leggerlo, quanto riempirlo! Non riesco a capire dove piazzare il codice che potrebbe riempire l'array.
24  International / Software / Re: Leggere da sensore PWM on: October 24, 2013, 07:17:05 am
Niente di più facile.
Invece di stampare il dato come fai ora:
Code:
Serial.println(nThrottleIn);

Assegnalo ad una variabile di tipo opportuno (nThrottleIn è un signed int).
Code:
int a = nThrottleIn;

Purtroppo non è così semplice: essendo tre valori, sono tre risultati distinti. Il risultato che ottengo dal Serial monitor è il seguente:

Code:
3880
4224
580

e a me serve trattarli in tre modi distinti. Forse sbaglio qualcosa?
25  International / Software / Leggere da sensore PWM on: October 24, 2013, 05:17:28 am
Ciao a tutti! Ho bisogno di leggere un treno d'onda da un sensore che mi spara la rilevazione in PWM (sono 3 letture separate da un segnale LOW). Questo è il codice riadattato preso da uno sketch trovato sul web (http://rcarduino.blogspot.ae/2012/01/how-to-read-rc-receiver-with.html):
Code:
// First Example in a series of posts illustrating reading an RC Receiver with
// micro controller interrupts.
//
// Subsequent posts will provide enhancements required for real world operation
// in high speed applications with multiple inputs.
//
// http://rcarduino.blogspot.com/
//
// Posts in the series will be titled - How To Read an RC Receiver With A Microcontroller

// See also http://rcarduino.blogspot.co.uk/2012/04/how-to-read-multiple-rc-channels-draft.html 

#define THROTTLE_SIGNAL_IN 0 // INTERRUPT 0 = DIGITAL PIN 2 - use the interrupt number in attachInterrupt
#define THROTTLE_SIGNAL_IN_PIN 2 // INTERRUPT 0 = DIGITAL PIN 2 - use the PIN number in digitalRead

#define NEUTRAL_THROTTLE 1500 // this is the duration in microseconds of neutral throttle on an electric RC Car

volatile int nThrottleIn = NEUTRAL_THROTTLE; // volatile, we set this in the Interrupt and read it in loop so it must be declared volatile
volatile unsigned long ulStartPeriod = 0; // set in the interrupt
volatile boolean bNewThrottleSignal = false; // set in the interrupt and read in the loop
// we could use nThrottleIn = 0 in loop instead of a separate variable, but using bNewThrottleSignal to indicate we have a new signal
// is clearer for this first example

void setup()
{
  // tell the Arduino we want the function calcInput to be called whenever INT0 (digital pin 2) changes from HIGH to LOW or LOW to HIGH
  // catching these changes will allow us to calculate how long the input pulse is
  attachInterrupt(THROTTLE_SIGNAL_IN,calcInput,CHANGE);

  Serial.begin(9600);
}

void loop()
{
 // if a new throttle signal has been measured, lets print the value to serial, if not our code could carry on with some other processing
 if(bNewThrottleSignal)
 {

   Serial.println(nThrottleIn); 

   // set this back to false when we have finished
   // with nThrottleIn, while true, calcInput will not update
   // nThrottleIn
   bNewThrottleSignal = false;
 }

 // other processing ...
}

void calcInput()
{
  // if the pin is high, its the start of an interrupt
  if(digitalRead(THROTTLE_SIGNAL_IN_PIN) == HIGH)
  {
    // get the time using micros - when our code gets really busy this will become inaccurate, but for the current application its
    // easy to understand and works very well
    ulStartPeriod = micros();
  }
  else
  {
    // if the pin is low, its the falling edge of the pulse so now we can calculate the pulse duration by subtracting the
    // start time ulStartPeriod from the current time returned by micros()
    if(ulStartPeriod && (bNewThrottleSignal == false))
    {
      nThrottleIn = (int)(micros() - ulStartPeriod);
      ulStartPeriod = 0;

      // tell loop we have a new signal on the throttle channel
      // we will not update nThrottleIn until loop sets
      // bNewThrottleSignal back to false
      bNewThrottleSignal = true;
    }
  }
}

Ottengo effettivamente 3 letture ma non ho capito dove posso memorizzare i singoli valori delle singole letture. Avrei bisogno di qualcosa del tipo

Code:
Serial.print("Valore1: ");
Serial.println(lettura1);
Serial.print("Valore2: ");
Serial.println(lettura2);
Serial.print("Valore3: ");
Serial.println(lettura3);

ma non riesco a capire come fare.
Qualche idea?

Grazie!
26  International / Hardware / Re: Multilinea su display 20x4 HD44780 compatibile on: October 10, 2012, 04:50:58 pm
Quindi, in pratica, dovrei creare delle procedure che puntano dove serve da richiamare quando mi servono con setCursor(x,y)?
Sarei curioso di capire perché hanno gestito la cosa così. Infatti, se uso "println" o "\n" ottengo sì il caporiga, ma anche dei caratteri strani (suppongo l'escape di EOL). Ma tant'è...

La rottura di scatole sta nel fatto che se mi serve nel loop diventa un po' farraginoso da gestire... non ci sono librerie che "sanno" di questa peculiarità?
27  International / Hardware / Multilinea su display 20x4 HD44780 compatibile on: October 10, 2012, 11:52:54 am
Salute a tutti!

Ho un problema con il mio progetto: in pratica, quando vado a capo (o la stringa è troppo lunga) su un display LCD 20 colonne x 4 righe mi salta una riga.

Invece di avere riga -> riga -> riga -> riga ottengo riga -> riga vuota -> riga -> riga vuota.
Il codice:

Code:
#include <LiquidCrystal.h>

LiquidCrystal lcd(12, 11, 5, 4, 3, 2);

void setup() {
 
  lcd.begin(20, 4);
   lcd.setCursor(0,1);
 
  lcd.print("Questa è una stringa molto lunga solo per dimostrare che dovrebbe funzionare correttamente! ");

}

void loop() {

}


In pratica appare come l'ultimo esempio qui:

http://learn.adafruit.com/character-lcds/using-a-character-lcd


E' un problema della libreria LiquidCristal?

Grazie e saluti!
28  Using Arduino / Displays / Re: HD44780 20x4 issue (showing all squares) on: October 10, 2012, 05:32:24 am
Mmm... yesterday night i posted the images, but for a strange reason i can't find them now. I know it sucks, but if you don't have 10 fingers (and a breadbord) then it's a quite discrete job. I'll get a breadboard and let you know. Dhenry, where you talking about good ol' Edsger?
29  Using Arduino / Displays / Re: HD44780 20x4 issue (showing all squares) on: October 09, 2012, 05:00:18 pm
Horrible is a compliment. I know it's pitiful. It's a fast prototype, anyway, i'm doing exactly what is in the scheme by DEAFBOY. The only thing that changes, is that i'm taking two wires from the +5V of the Arduino: one to the potentiometer and the other on the supply of the LCD directly. Then it's exactly the same. I double and triple checked the connections and they are correct.
30  Using Arduino / Displays / Re: HD44780 20x4 issue (showing all squares) on: October 09, 2012, 02:34:15 pm
So, that is what i've done. sorry if it's a little bit confused, but this should clarify what i'm doing.
Let me know what you think!

Open -> Liquid Crystal -> HelloWorld



Meh, the only thing that changes from what i'm doing, is the 5V+ connected to the potentiometer. So nothing changes. Right?
Pages: 1 [2] 3 4