Go Down

Topic: Velocità motore (Read 10324 times) previous topic - next topic

francescoprisco

quello piccolo che tu hai postato funziona.Incrementa il valore reedCounter

PaoloP

Ok, allora c'è un errore di concetto nel codice "grande".

francescoprisco

se pure fosse... il valore reedCounter dovrebbe restituirmelo incrementato no?Funziona nel "Piccolo" dovrebbe andare anche nel "grande"

PaoloP

Potrebbe essere questo controllo
Code: [Select]
if (lastTimeReed - currentTimeRpm > 2000){
    vel = 0;
    reedCounter = 0;
  }


prova a commentarlo.

francescoprisco

Funziona!!  :smiley-mr-green: :smiley-mr-green: :smiley-mr-green:


Quella è la velocità in?  metri al secondo?

PaoloP

#50
Mar 15, 2013, 06:52 pm Last Edit: Mar 15, 2013, 06:54 pm by PaoloP Reason: 1
Bene sono contento.
Adesso il codice è da migliorare e correggere.
Si, la velocità, se non ho sbagliato i calcoli dovrebbe essere in metri al secondo lineari.
I giri al minuti li calcolo (rpm)con 60*impulsi/nummagneti
la velocità come rpm per la circonferenza diviso 60.

Se è corretta si può anche semplificare.

La circonferenza è in metri perché moltiplico i pollici del raggio per 0.0254 e poi per 6.28

Adesso devo uscire. :smiley-mr-green:

francescoprisco

bene.Ho notato che il valore torna a 0 appena tolgo il magnete da sopra. Il problema e che il motore gira lento di conseguenza il tempo di giro e maggiore a 1 secondo.mi servirebbe che il valore rimanga finquando non ripassa di nuovo il magnete sul sensore


PaoloP

Si, può essere utile.
Ma dovresti provare prima a montare più magneti, possibilmente 4 in modo da poter apprezzare meglio anche le basse velocità.

francescoprisco

ieri sera ho fatto un test.Il sistema funziona a meraviglia  non da problemi.Solo uno piccolo.dopo che il magnete è passato continua a segnare a tratti ma credo sia perchè il magnete è grande quindi credo basti montarne uno più piccolo.

leo72


ieri sera ho fatto un test.Il sistema funziona a meraviglia  non da problemi.Solo uno piccolo.dopo che il magnete è passato continua a segnare a tratti ma credo sia perchè il magnete è grande quindi credo basti montarne uno più piccolo.


Se il contatto è molto sensibile, è probabile.

francescoprisco

Appena provo con uno più piccolo ti farò sapere...Comunque ti ringrazio tantissimo.Senza il tuo aiuto non sarei riuscito a fare tutto.

PaoloP

Ho fatto le modifiche seguendo l'esempio del link

Code: [Select]
const byte ButtonPinuno = 11;        //pin pulsante incremento
const byte ButtonPindue = A0;    //pin pulsante decremento
int CurrentStateuno;                  //variabile per lo stato uno corrente
int LastStateuno = 0;                //variabile per l'ultimo stato uno
int CurrentStatedue;                  //variabile per lo stato due corrente
int LastStatedue = 0;            //variabile per l'ultimo stato due
byte contprima = 0;          //Holds number of button presses.
const byte ButtonPintre = 3;        //pin pulsante incremento
const byte ButtonPinquattro = 4; //pin pulsante decremento
int CurrentStatetre;                  //variabile per lo stato uno corrente
int LastStatetre = 0;                //variabile per l'ultimo stato uno
int CurrentStatequattro;              //variabile per lo stato due corrente
int LastStatequattro = 0;            //variabile per l'ultimo stato due
byte contseconda = 0;          //Holds number of button presses
const byte ButtonPincinque = 5;        //pin pulsante incremento
const byte ButtonPinsei = 6; //pin pulsante decremento
int CurrentStatecinque;              //variabile per lo stato uno corrente
int LastStatecinque = 0;              //variabile per l'ultimo stato uno
int CurrentStatesei;                  //variabile per lo stato due corrente
int LastStatesei = 0;                //variabile per l'ultimo stato due
int short contterza = 0;            //Holds number of button presses
unsigned long currentTime = 0;
unsigned long loopTime = 0;
unsigned long lastTimeReed = 0;
unsigned long loopTimeReed = 0;
const byte moton = 7;
const byte motoff= 8;
const byte aumenta= 9;
const byte diminuisci= 10;

const byte sensvel = 2;
const float radius = 13.5;// tire radius (in inches)
const float circumference = TWO_PI*radius*0.0254; // (in metri)
unsigned int ms = 0;
byte reedCounter = 0; // max 255
const byte reedNumber = 1; // numero di magneti per giro

void setup(void)
{
  delay(1000);
  Serial.begin(9600);          //Begins communication with computer
  pinMode(ButtonPinuno,INPUT);    //Sets ButtonPin as input.
  pinMode(ButtonPindue,INPUT);    //Sets ButtonPin as input.
  pinMode(ButtonPintre,INPUT);    //Sets ButtonPin as input.
  pinMode(ButtonPinquattro,INPUT);    //Sets ButtonPin as input.
  pinMode(ButtonPincinque,INPUT);    //Sets ButtonPin as input.
  pinMode(ButtonPinsei,INPUT);    //Sets ButtonPin as input.
  pinMode(moton, OUTPUT);
  pinMode(motoff, OUTPUT);
  pinMode(aumenta, OUTPUT);
  pinMode(diminuisci, OUTPUT);
  pinMode(sensvel, INPUT); // sensore reed velocità
  attachInterrupt(0, Counter, RISING);
}

void Counter(void){
  reedCounter++;
}

void loop(void)
{
  CheckButton();
  CheckSerial();
  SpeedCalc();

  currentTime = millis();
  if(abs(currentTime - loopTime) >= 1000)
  {
    Serial.print(contprima);
    Serial.print(F(","));
    Serial.print(contseconda);
    Serial.print(F(","));
    Serial.print(contterza);
    Serial.print(F(","));
    Serial.print(ms);
    Serial.print(F(","));
    Serial.println(reedCounter);
    loopTime = currentTime;
  }
}

void SpeedCalc(void){
  loopTimeReed =  abs(lastTimeReed - millis()); // intervallo in millisecondi degli n rilevamenti
  if (reedCounter > 1){ // MAX >254
    int rpm = (60*reedCounter)*(1000/loopTimeReed)/reedNumber; // giri al minuto dell'asse del motore
    reedCounter = 0;
    lastTimeReed = millis();
    ms = ((rpm * circumference)/60); // velocità lineare in metri al secondo
  }
  if (loopTimeReed > 2000){
    Serial.print(F("Motore fermo?"));
  }
}

void CheckButton(void){
  CurrentStateuno = digitalRead(ButtonPinuno);         
  CurrentStatedue = digitalRead(ButtonPindue);       
  CurrentStatetre = digitalRead(ButtonPintre);         
  CurrentStatequattro = digitalRead(ButtonPinquattro);   
  CurrentStatecinque = digitalRead(ButtonPincinque); 
  CurrentStatesei = digitalRead(ButtonPinsei);
  delay(10);  // debounce                                                 

  if(CurrentStateuno != LastStateuno)
  {
    if(CurrentStateuno == HIGH)
    {
      contprima++;
    }
  }
  LastStateuno = CurrentStateuno;

  if(CurrentStatedue != LastStatedue)
  {
    if(CurrentStatedue == HIGH)
    {
      contprima--;
    }
  }
  LastStatedue = CurrentStatedue;

  if(CurrentStatetre != LastStatetre)
  {
    if(CurrentStatetre == HIGH)
    {
      contseconda++;
    }
  }
  LastStatetre = CurrentStatetre;

  if(CurrentStatequattro != LastStatequattro)
  {
    if(CurrentStatequattro == HIGH)
    {
      contseconda--;
    }
  }
  LastStatequattro = CurrentStatequattro;

  if(CurrentStatecinque != LastStatecinque)
  {
    if(CurrentStatecinque == HIGH)
    {
      contterza++;
    }
  }
  LastStatecinque = CurrentStatecinque;

  if(CurrentStatesei != LastStatesei)
  {
    if(CurrentStatesei == HIGH)
    {
      contterza--;
    }
  }
  LastStatesei = CurrentStatesei;
}

void CheckSerial(void){
  if(Serial.available() >0)
  {
    switch (Serial.read()){

    case 'A':
      digitalWrite(moton, HIGH);
      delay(1000);
      digitalWrite(moton, LOW);
      break;

    case 'B':
      digitalWrite(motoff, HIGH);
      delay(1000);
      digitalWrite(motoff, LOW);
      break;

    case 'C':
      digitalWrite(aumenta, HIGH);
      delay(1000);
      digitalWrite(aumenta, LOW);
      break;

    case 'D':
      digitalWrite(diminuisci, HIGH);
      delay(1000);
      digitalWrite(diminuisci, LOW);
      break;

    default:
      break;
    }
  }   
}

Go Up