Pages: [1]   Go Down
Author Topic: arduino - firmata - processing  (Read 857 times)
0 Members and 1 Guest are viewing this topic.
Offline Offline
Full Member
***
Karma: 1
Posts: 160
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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:
#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?

Logged

Cagliari, Italy
Offline Offline
Tesla Member
***
Karma: 115
Posts: 7265
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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

« Last Edit: November 08, 2012, 09:21:12 am by PaoloP » Logged

Code fast. Code easy. Codebender --> http://codebender.cc/?referrer=PaoloP

0
Offline Offline
Edison Member
*
Karma: 24
Posts: 2319
Have you mooed today?
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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

Pages: [1]   Go Up
Jump to: