Go Down

Topic: arduino - firmata - processing (Read 949 times) previous topic - next topic

aureliusss

ciao a tutti, vorrei far comunicare arduino e processing per disegnare in tempo reale dei grafici corrente tensione.
fino ad ora ho semplicemente comunicato con il monitor seriale, copiato i risultati su excel e fatto i grafici.
ora vorrei automatizzare il plot dei grafici tramite processing.
questo il mio sketch:
Code: [Select]
#define RELAY_PIN 3 //digital pin to control the relay
#define c_pin A1    //capacitor analog pin
#define ps_pin A0  //power supply analog pin
#define num_misure 65

// defines for setting and clearing register bits
#ifndef cbi
#define cbi(sfr, bit) (_SFR_BYTE(sfr) &= ~_BV(bit))
#endif
#ifndef sbi
#define sbi(sfr, bit) (_SFR_BYTE(sfr) |= _BV(bit))
#endif



void setup()
{
  // set prescale to 16
  sbi(ADCSRA,ADPS2) ;
  cbi(ADCSRA,ADPS1) ;
  cbi(ADCSRA,ADPS0) ;

  pinMode(RELAY_PIN, OUTPUT);
  Serial.begin(9600); // open serial
  Serial.println("Press the spacebar to start to measure");
}


void loop()
{
  static int relayVal = 0;
  int cmd;
  float c_voltage, ps_voltage, current;
  static float res = 3.59;
  unsigned long int time1, time2, time0;
  unsigned long int PS_TIME[num_misure], C_TIME[num_misure];
  float PS_VOLTAGE[num_misure], C_VOLTAGE[num_misure], CURRENT[num_misure];
  int j = 0;

  while(Serial.available() > 0)
  {
    cmd = Serial.read();

    switch(cmd)
    {
    case ' ':
      {
        relayVal ^= 1;
        Serial.println("Relay on");
        break;
      }
    default:
      {
        Serial.println("Press the spacebar to start to measure");
      }
    }




    if(relayVal)
    {       
      do{
        digitalWrite(RELAY_PIN, HIGH);
        delay(20);            // relay transition time ---------- problema, ho impostato questo ritardo
        // per aspettare la commutazione del relay, ma questa non è tempocostante

        time0 = micros();     // time the measure start


        do
        {

          c_voltage = analogRead(c_pin);
          time1 = micros()-time0; //time c_voltage measurement
          ps_voltage = analogRead(ps_pin);
          time2 = micros() - time0; //time ps_voltage measurement

          c_voltage = (c_voltage * 5) /1023;
          ps_voltage = (ps_voltage * 5) / 1023;
          current = ((ps_voltage - c_voltage)*1000)/res; // to obtain mA

          //put all the measurements in their arrays
          PS_VOLTAGE[j] = ps_voltage;
          PS_TIME[j] = time2;     
          C_VOLTAGE[j]= c_voltage;
          C_TIME[j] = time1;
          CURRENT[j] = current;
          j++;
          delayMicroseconds(1380);
        }
        while(current >0 && j < num_misure);

        //capacitor discharge
        digitalWrite(RELAY_PIN, LOW);
        do
        {
          c_voltage =  (analogRead(c_pin) >> 2);
          c_voltage =  (c_voltage * 5) / 1023;         
        }
        while(c_voltage > 0.001);

      }
      while( j <= num_misure - 1 );

      //stampa risultati
      Serial.println("  PS_VOLTAGE");

      for ( j = 0; j < num_misure ; j++)
      {
        Serial.print(PS_VOLTAGE[j]);
        Serial.print("  ");
        Serial.println(PS_TIME[j]);
      }


      j=0;
      Serial.println("\n\n  CURRENT");
      for ( j = 0; j < num_misure ; j++)
      {
        Serial.println(CURRENT[j]);
      }

      Serial.println("  C_VOLTAGE");

      for ( j = 0; j < num_misure ; j++)
      {
        Serial.print(C_VOLTAGE[j]);
        Serial.print("  ");
        Serial.println(C_TIME[j]);
      }






      relayVal = 0; //reitialize relayVal

      Serial.print("\n\n");

      Serial.print("Do you want to repeat the measure?");
    }


  }   
}


i grafici che mi serve stampare c_voltage vs. c_time; current vs ps_voltage; ps_voltage vs ps_time
come vedete, con questo codice rilevo i dati ad intervalli dell'ordine dei microsecondi, e purtroppo tale deve rimanere per avere un numero  ragionevole di misure.
leggendo vari articoli sulla libreria firmata e processing (anche leggendo l'esempio stadardFirmata) noto che il loop va ogni 20ms, tempo decisamente troppo lungo per i miei scopi, dato che tutta la misura si svolge nel tempo di circa 50ms, e in questo intervallo di tempo devo prendere più misure possibili.

mi sapete indicare qualche metodo per poter plottare i tre grafici tramite processing?


PaoloP

#1
Nov 08, 2012, 03:11 pm Last Edit: Nov 08, 2012, 03:21 pm by PaoloP Reason: 1
Ciao,
secondo me è molto difficile ottenere i grafici in tempo reale.
Potresti invece inviarli tra una serie di misure e l'altra.

--> http://www.negtronics.com/simplot


pitusso

Ciao,
dai un'occhiata a questo progetto, vedrai che troverai spunti validi:
http://code.google.com/p/arduinoscope/

Go Up
 


Please enter a valid email to subscribe

Confirm your email address

We need to confirm your email address.
To complete the subscription, please click the link in the email we just sent you.

Thank you for subscribing!

Arduino
via Egeo 16
Torino, 10131
Italy