Toeren meten met Arduino
14-4-2013
Toeren meten met de Arduino is niet zo lastig. Het lastigste is een systeem te maken waarmee je de rondgang van de as kan meten. Je kan geen simpele schakelaar gebruiken want als een schakelaar 3000 keer per seconde bediend wordt gaat die schakelaar defect of slaat een paar pulsen over.
Ik maakte gebruik van een O ring die ik met secondelijm op een as plakte. In die O ring heb ik een gat geboord en via dat gat kan ik licht zenden wat ik aan de andere kant van de ring kan meten. Een lichtsluis.










Het andere filmpje laat zien dat ik het geheel via I2C lees op het display.
Om via de I2C te meten gebruik ik een tussenstap in de vorm van een 4040 teller IC dat ik aflees om de 30 seconden. De lichtsluis zend een puls naar de 4040, die telt de pulsen. De Arduino leest om de X(30?) seconden via de I2C de MCP23017 IC uit die de waarde van de 4040 van dat moment doorgeeft. De Arduino reset daarna via de MCP de telling van de 4040.

Uitleg
Bij 30.000 nanoseconde (0,000 030 000 seconde)staat het gat in de schijf precies in de cel tussen de led en de opnemer stil. Zodra de schijf gaat draaien wordt die tijd dat het gat tussen de led en de opnemer staat, steeds korter. Zo kan je bij een 5V motor met een gat van 4 mm in de schijf, de volgende waarden lezen.
1,5 V= 29 xx xx
2 V= 20 xx xx
2,5 V= 15 xx xx
3 V= 12 xx xx
3,5 V= 11 xx xx
4 V= 9 xx xx
4,5 V= 8 xx xx
5 V= 7 xx xx
spanning microseconden
Dus 7 microseconden over 4 mm. Bij een maximum snelheid.
Het was voor mij de uitdaging om snelheid te meten over I2C en niet om een nauwkeurige telling te maken. Best kans dat de snelheid dus afwijkt.



Een oude sketch die nu anders kan(moet) en die ik ooit nog eens ga aanpassen;-)

/*
The circuit:
* LCD RS pin to digital pin 12
* LCD Enable pin to digital pin 11
* LCD D4 pin to digital pin 5
* LCD D5 pin to digital pin 4
* LCD D6 pin to digital pin 3
* LCD D7 pin to digital pin 2
* 10K resistor:
* ends to +5V and ground
* wiper to LCD VO pin (pin 3)
*/
#include <LiquidCrystal.h>

// initialize the library with the numbers of the interface pins
// RS RW E D4 D5 D6 D7
LiquidCrystal lcd(12, 11, 10, 5, 4, 3, 2);
int waarde=0 ; //voltage op de motor
int motorspanning= 0; // spanning op motor
int pin =8; // optocoupler om de snelheid te meten
unsigned long tijd; // milliseconden verschil
unsigned long puls; // de puls van de optocoupler
int snelheid=0; // snelheid van de motor
int aantal= 0; // aantal pulsen per seconde
long rotatie=0;
void setup()
{
pinMode(pin,INPUT);
lcd.begin(16, 2);
tijd=millis();
}
void loop()
{
// eerst de variable weerstand lezen
waarde = analogRead(motorspanning/4);
// die waarde heel grof, omzetten voltage, max 5V
waarde = waarde/51;
// de motor uitgang heeft nu een waarde welke ingesteld is met de regelbare weerstand
// nu controleren we die waarde via de optocoupler
// omdat we ook de wentelingen per seconde willen weten resetten we de pulslengte
puls=0; // resetten
puls= pulseIn(pin,HIGH,30000);
// als de coupler opend is er een puls en die is dus groter dan nul, er is een omwenteling
if (puls>0){ aantal++;}
// dat is echter de lengte van de puls
// het gat is 4 mm
// de puls is in nanoseconden
// dat is 0,000 03 seconde
// dat wordt dus m/sec
// 4 mm = 0,004 meter
// we verhogen beide met 1000
// we krijgen nu een omwenteling snelheid in ??
snelheid=(400/(puls/1000));
if (snelheid<0){snelheid=0;}
// we kijken of de oude tijd + 1000 groter is dan de huidige tijd
if ((tijd+500)<=millis())
{
// als dat zo is kijken we hoeveel omwentelingen er waren per tijds eenheid
rotatie=aantal*2;
lcd.setCursor(8,1);
lcd.print("R= ");
lcd.setCursor(10,1);
lcd.print(rotatie);
aantal=0;
tijd=millis();
}

// voltage op de motor
lcd.setCursor(0,0);
lcd.print("V= ");
lcd.setCursor(2,0);
lcd.print(waarde );
// berekende snelheid van de motor
lcd.setCursor(4,0);
lcd.print("S= ");
lcd.setCursor(6,0);
lcd.print(snelheid);
/*
// tijd
lcd.setCursor(9,0);
lcd.print("T= ");
lcd.setCursor(11,0);
lcd.print(tijd);
*/
//pulslengte
lcd.setCursor(0,1);
lcd.print("P= ");
lcd.setCursor(2,1);
// je kan het delen door 100 weglaten maar het getal wordt niet makkelijker leesbaar.
lcd.print(puls/100);

}