Arduino tæller, hjælp søges (Læst 8198x)

Offline martinbjerre

  • Jordet Basic
  • **
  • Indlæg: 151
  • Antal brugbare Indlæg: 10
    • Vis profil
Arduino tæller, hjælp søges
« Dato: Oktober 20, 2013, 07:49:09 »
Min plan er at lave en omdrejningstæller til mine drejebænke, med udlæsning på et 16x2 LCD.
Problemet består i at jeg gerne vil have omdr/min på øverste linie, og en fortløbende tæller på nederste linie. Den nederste tæller skal kunne nulstilles ved tryk på en knap.
Formålet med den nederste tæller, er at kunne tælle omdrejninger, feks ved vikling af spoler.  Drejebænkene kan køre fra ca 2 omdr/min til 1500 omdr/min.
Aftastningen regner jeg med bliver optisk eller evt Hall.

Jeg er "kun" automekaniker, så tilgiv evt. dumme spørgsmål :)
Forslag til kode modtages gerne :)

 

Offline gerd

  • Administrator
  • µProcessoren
  • *****
  • Indlæg: 915
  • Antal brugbare Indlæg: 97
    • Vis profil
    • Hjemmeside med nogle af mine projekter
Sv: Arduino tæller, hjælp søges
« Svar #1 Dato: Oktober 20, 2013, 10:51:55 »
Hej Martin,

Det går hvis du måler tiden mellem 2 impulser med input capture interrupt:
https://www.inkling.com/read/arduino-cookbook-michael-margolis-2nd/chapter-18/recipe-18-8

2 omdr/min = 30 sek
1500 omdr/min = 0.040 sek

En Arduino har en 16Bit counter som kan tælle fra 0 til 65535. Du kan indstille den så, at den tæller hver 0.5ms (=2kHz).

2 omdr/min = 30 sek = 60000 steps
1500 omdr/min = 0.040 sek = 80 steps

Det betyder, at du kan måle 1500 omdr/min med en præcision af 1/80 =  1.25% eller +- 18 omdr/min.

Ville det være ok?
Hvis ikke, du skal også tælle timer overflows.

gerd



 

Offline martinbjerre

  • Jordet Basic
  • **
  • Indlæg: 151
  • Antal brugbare Indlæg: 10
    • Vis profil
Sv: Arduino tæller, hjælp søges
« Svar #2 Dato: Oktober 20, 2013, 19:22:19 »
Tak for dit hurtige svar.
Jeg er 99% newbie mht. Arduino, så dit svar er lidt sort snak ;)
Planen var at støtte mig til denne: http://www.pyroelectro.com/tutorials/tachometer_rpm_arduino/software.html
Jeg har dog fundet ud af at i linien med :  rpm_array[4] = 60*(1000000/(time*7));    skal 7 tallet ændres til det antal jeg har pr omdr. Jeg har også fundet ud af at "current rpm" linien skal væk, og "setcursor" skal ændres.
Jeg kan dog ikke gennemskue hvordan jeg får samtlige omdrejninger på nederste linie,  jeg mener... den har jo talt omdrejningerne.
Reset kunne klares ved at resette hele enheden, det behøver jo ikke være kun tælleren.

 

Offline gerd

  • Administrator
  • µProcessoren
  • *****
  • Indlæg: 915
  • Antal brugbare Indlæg: 97
    • Vis profil
    • Hjemmeside med nogle af mine projekter
Sv: Arduino tæller, hjælp søges
« Svar #3 Dato: Oktober 21, 2013, 20:58:57 »
Hej Martin,

undskyld  ::)

Ja, jeg tror at din pyroelectro-link er perfekt til dit projekt.

Hvis du vil ikke have noget filter skriv:
Kode:
      rpm = 60*(1000000/(time));    
i stedet for
Kode:
    //5 Sample Moving Average To Smooth Out The Data
      rpm_array[0] = rpm_array[1];
      rpm_array[1] = rpm_array[2];
      rpm_array[2] = rpm_array[3];
      rpm_array[3] = rpm_array[4];
      rpm_array[4] = 60*(1000000/(time));   
    //Last 5 Average RPM Counts Eqauls....
      rpm = (rpm_array[0] + rpm_array[1] + rpm_array[2] + rpm_array[3] + rpm_array[4]) / 5;


Citér
Jeg kan dog ikke gennemskue hvordan jeg får samtlige omdrejninger på nederste linie,  jeg mener... den har jo talt omdrejningerne.

Kode:
#include <LiquidCrystal.h>
LiquidCrystal lcd(3, 5, 9, 10, 11, 12);

volatile float time = 0;
volatile float time_last = 0;
volatile int rpm_array[5] = {0,0,0,0,0};
volatile int cnt = 0;

// digital pin 3 has a pushbutton (reset counts) attached to it. Give it a name:
int resetCntButton = 3;

void setup()
{
  // make the pushbutton's pin an input:
  pinMode(resetCntButton, INPUT);

  //Digital Pin 2 Set As An Interrupt
 attachInterrupt(0, fan_interrupt, FALLING);

  // set up the LCD's number of columns and rows:
  lcd.begin(16, 2);
  // Print a message to the LCD.
  lcd.print("RPM:");
}

//Main Loop To Calculate RPM and Update LCD Display
void loop()
{
  int rpm = 0;
 
  while(1){   

  //Slow Down The LCD Display Updates
  delay(400);
 
  //Clear The First Row
  lcd.setCursor(0, 0);
  lcd.print("RPM:                ");   
 
  //Update The Rpm Count
  lcd.setCursor(4, 0);
  lcd.print(rpm);   

  //Clear The Second Row
  lcd.setCursor(0, 1);
  lcd.print("CNT:                ");   

  lcd.setCursor(4, 1);
  lcd.print(cnt);   

  //Update The RPM
  if(time > 0)
  {
      rpm = 60*(1000000/(time));   
  }
 
  // Reset the counter by pressing the resetCntButton
  if (digitalRead(resetCntButton))
  {
    cnt = 0;
  }

 }
}

//Capture The IR Break-Beam Interrupt
void fan_interrupt()
{
   time = (micros() - time_last);
   time_last = micros();

   //Count the rotations
   cnt ++;
}

gerd
« Senest Redigeret: Oktober 22, 2013, 06:56:45 af gerd »

 

Offline martinbjerre

  • Jordet Basic
  • **
  • Indlæg: 151
  • Antal brugbare Indlæg: 10
    • Vis profil
Sv: Arduino tæller, hjælp søges
« Svar #4 Dato: Oktober 23, 2013, 16:49:07 »
Tak :)
Jeg begynder at forstå mere og mere, så det skal afprøves i weekenden :)

Jeg vender tilbage med resultat :)

 

Offline martinbjerre

  • Jordet Basic
  • **
  • Indlæg: 151
  • Antal brugbare Indlæg: 10
    • Vis profil
Sv: Arduino tæller, hjælp søges
« Svar #5 Dato: Oktober 26, 2013, 13:37:44 »
Så fik jeg kigget lidt på det.
Jeg har ændret resetpin til 4, idet nr 3 allerede er i brug til LCD :)
Dog kan jeg ikke resette visningen, desuden bliver RPM stående efter der ikke kommer flere pulser, og CNT nulstiller sig selv.
Pulserne laver jeg ligenu med en knap, da min hallgiver ikke er landet endnu.

Der ligger vist lidt arbejde forude for mig :)

 

Offline gerd

  • Administrator
  • µProcessoren
  • *****
  • Indlæg: 915
  • Antal brugbare Indlæg: 97
    • Vis profil
    • Hjemmeside med nogle af mine projekter
Sv: Arduino tæller, hjælp søges
« Svar #6 Dato: Oktober 26, 2013, 14:16:02 »
Hej Martin,

kan du måle spændingen på reset-pin?
Har du en pulldown-modstand ?

gerd

 

Offline bws

  • Lavpas filter
  • ****
  • Indlæg: 261
  • Antal brugbare Indlæg: 24
    • Vis profil
Sv: Arduino tæller, hjælp søges
« Svar #7 Dato: Oktober 27, 2013, 09:17:54 »
hey

har en lille ændring til Gerd's fine forslag der fjerner at RPM bliver stående

Kode:
#include <LiquidCrystal.h>
LiquidCrystal lcd(3, 5, 9, 10, 11, 12);

volatile float time = 0;
volatile float time_last = 0;
volatile int rpm_array[5] = {0,0,0,0,0};
volatile int cnt = 0;

// digital pin 3 has a pushbutton (reset counts) attached to it. Give it a name:
int resetCntButton = 3;

void setup()
{
  // make the pushbutton's pin an input:
  pinMode(resetCntButton, INPUT);

  //Digital Pin 2 Set As An Interrupt
 attachInterrupt(0, fan_interrupt, FALLING);

  // set up the LCD's number of columns and rows:
  lcd.begin(16, 2);
  // Print a message to the LCD.
  lcd.print("RPM:");
}

//Main Loop To Calculate RPM and Update LCD Display
void loop()
{
  int rpm = 0;
 
  while(1){   

  //Slow Down The LCD Display Updates
  delay(400);
 
  //Clear The First Row
  lcd.setCursor(0, 0);
  lcd.print("RPM:                ");   
 
  //Update The Rpm Count
  lcd.setCursor(4, 0);
  lcd.print(rpm);   

  //Clear The Second Row
  lcd.setCursor(0, 1);
  lcd.print("CNT:                ");   

  lcd.setCursor(4, 1);
  lcd.print(cnt);   

  //Update The RPM
  if(time > 0)
  {
      rpm = 60*(1000000/(time));   
  }
  else rpm = 0;
 
  // Reset the counter by pressing the resetCntButton
  if (digitalRead(resetCntButton))
  {
    cnt = 0;
  }

 }
}

//Capture The IR Break-Beam Interrupt
void fan_interrupt()
{
   time = (micros() - time_last);
   time_last = micros();

   //Count the rotations
   cnt ++;
}

men ellers som Gerd siger så skal du have en pull-down på din knap altså sådan her.:



MVH

 

Offline martinbjerre

  • Jordet Basic
  • **
  • Indlæg: 151
  • Antal brugbare Indlæg: 10
    • Vis profil
Sv: Arduino tæller, hjælp søges
« Svar #8 Dato: Oktober 27, 2013, 11:09:39 »
Så fik jeg skidtet til at virke lidt bedre, jeg havde brugt 10K pullup, men efter skift til 1K går det bedre :)
Jeg kan ikke se formålet med 1uf til kontakten, med mindre det er for at modvirke prel ??

Godt med gode input :) Jeg har dårligt rodet med elektronik siden ungdomsskolen i 1985-1990.....

 

Offline martinbjerre

  • Jordet Basic
  • **
  • Indlæg: 151
  • Antal brugbare Indlæg: 10
    • Vis profil
Sv: Arduino tæller, hjælp søges
« Svar #9 Dato: Oktober 27, 2013, 11:12:51 »
glemte lige...
Med en knap som pulsgiver, får jeg en meget svingende RPM visning, men det kan være det ændrer sig når der kommer et mere stabilt signal ?
..nu må posten godt komme med min hallgiver...

 

Offline bws

  • Lavpas filter
  • ****
  • Indlæg: 261
  • Antal brugbare Indlæg: 24
    • Vis profil
Sv: Arduino tæller, hjælp søges
« Svar #10 Dato: Oktober 27, 2013, 13:14:02 »
Jeg kan ikke se formålet med 1uf til kontakten, med mindre det er for at modvirke prel ??

ja det er lige præcis imod prel, man kan selvfølgelig argumentere for at alle de kald til LCD'en bag efter giver det samme delay, men hvis man sætter en større modstand på sammen med kondensatoren kan man jo have en høj værdi på benet i nok tid til at man er sikker på at den detektere knappen.

men det er jo sådan en "trial and error" ting :)

MVH

 

Offline martinbjerre

  • Jordet Basic
  • **
  • Indlæg: 151
  • Antal brugbare Indlæg: 10
    • Vis profil
Sv: Arduino tæller, hjælp søges
« Svar #11 Dato: November 09, 2013, 10:58:11 »
Så fik jeg min hallgiver :)
Jeg har strikket det hele sammen på et breadboard, og har monteret giveren på drejebænken.
Det virker præcist som jeg havde håbet (fandt dog ud af at det bolthovede giveren måler på, er rustfrit :( )
Nu kommer opgaven med at lave en "bare minimum arduino" på et stripboard, og få skidtet i en kasse.
Jeg tager lidt video og billeder, så i kan se resultatet. så indtil videre, tak for hjælpen :)