Gå til innhold

Bremsebenk. måle omdreininger på aksel og sende resultat til datamaskin


Anbefalte innlegg

Takk for koden:)

 

Dersom denne fungerer så har eg jo egentlig koden på arduino kortet.

Da trenger eg ein måte å få sendt koden til USB porten for så å lese den av i et programm å få verdiene som tabellverdier eller lignende.

Hvilket programmeringspråk anbefaler du til dette? or hvor kan eg finne info om slik kommunikasjon med seriel porten?

Endret av kikk0
Lenke til kommentar
Videoannonse
Annonse
Takk for koden:)

 

Dersom denne fungerer så har eg jo egentlig koden på arduino kortet.

Da trenger eg ein måte å få sendt koden til USB porten for så å lese den av i et programm å få verdiene som tabellverdier eller lignende.

Hvilket programmeringspråk anbefaler du til dette? or hvor kan eg finne info om slik kommunikasjon med seriel porten?

 

Alle programmeringsspråk som kan kommunisere med ein serieport vil klare dette. Koden som eg laga skriv ut tida på eit enkelt format til ein virtuell serieport på ei datamaskin. Du kan f.eks bruke HyperTerminal eller PuTTY for å teste at det fungerer, så kan du lage deg eit programm i valfritt språk, gjerne med moglegheit for GUI, slik at du kan få fancy grafar og slikt. Formatet informasjonen kjem ut i er ("dT=xxxxxx" & CR & LF) der xxxxxx er antall mikrosekund siden sist lyset vart blokkert. Baudraten er 115200 bit/s.

 

Koden kan sikkert optimaliserast meir, samt at noko filtrering hadde sikkert vore lurt, men det kan fiksast i programmet som skal tolke desse verdiane.

 

Når det gjeld programmeringspråk så har eg ganske liten erfaring med det, men om du ikkje kan noko frå før av må du nesten bare velga noko som er lett å setje seg inn i, f.eks. Visual Basic eller Python.

 

Edit:

Ser at koden eg skreiv blei litt feil, eg endra litt på interruptargumentet og gløymte å endre på resten :thumbdown:

const int pinGaffel = 2;
const int pinIndLED = 4;
unsigned long mikro1, mikro2 = 2147483647; 
long delta_t;

int status = LOW;
bool nyVerdi = false;

void setup()
{
 pinMode(pinGaffel, INPUT);
 pinMode(pinIndLED, OUTPUT);
 Serial.begin(115200);
 attachInterrupt(0, gaffelEndring, RISING);
}

void loop()
{
 if (nyVerdi == true)
 {
   delta_t = mikro1 - mikro2; //delta_t er i mikrosekund
   mikro2 = mikro1;  
   if (delta_t > 0) //Sjekker at micros() ikkje har hatt overflyt (skjer ca kvart 70. minutt)
   {
     Serial.print("dT=");
     Serial.println(delta_t); //Skriver ut delta_t
   }

 digitalWrite(pinIndLED, status);

 nyVerdi = false;
 }
}

void gaffelEndring()
{
 mikro1 = micros();

 nyVerdi = true;
 status = !status;
}

Endret av SkydiveWings
Lenke til kommentar
Bruk preprosesseringsdirektivet #define for å definere konstanter. Og sett opp en timer med interrups på et passende intervall for å regne ut rpm og skrive det ut på USARTen. ;)

 

I følge referanseverket til Arduino er const å anbefale over #define, og meiner du at ein timer skal polle inputen, og ikkje flanketrigging slik eg har satt opp? Om du skal rekne ut RPM må du vel til med flyttalsutrekningar, og sidan det er ganske tidkrevande på ein mikrokontroller ville eg heller gjort dette i programmvaren i PCen.

Lenke til kommentar
Bruk preprosesseringsdirektivet #define for å definere konstanter. Og sett opp en timer med interrups på et passende intervall for å regne ut rpm og skrive det ut på USARTen. ;)

 

I følge referanseverket til Arduino er const å anbefale over #define, og meiner du at ein timer skal polle inputen, og ikkje flanketrigging slik eg har satt opp? Om du skal rekne ut RPM må du vel til med flyttalsutrekningar, og sidan det er ganske tidkrevande på ein mikrokontroller ville eg heller gjort dette i programmvaren i PCen.

 

konstanter er alltid å foretrekke fremfor #DEFINE direktiver, man kan få noen svært interessante bugs ved bruk av sistnevnte da det ikke bare mangler typesikkerhet, men er en direkte substitusjon av hva som helst rett inn i koden.

 

Det er forøvrig ikke nødvendig med flyttallsberegninger, man klarer seg fint med skalering av fixed-point verdier. Uansett er det et godt tips å gjøre disse beregningene på PCen som du sier da det gir mye mer fleksibilitet.

 

Har omdreiningshastigheten på hjulet blitt nevnt forresten? Dette er jo relevant for implementeringen. Dersom det går for fort er det kanskje nødvendig med mer prosessering på arduinoen for å unngå unødig mye data på linken.

 

Som andre har skrevet er jeg også enig i at en optisk sensor er en lite robust løsning i dette tilfellet. En hall-sensor virker som en mye bedre løsning

Endret av kurant
Lenke til kommentar

takker for meir inputs :)

tanken var i starten å bruke en hall sensor ja. det er nok det som kommer til å brukes også. men eg har tenkt få få til dataprogrammet før eg begynner å bygge.

 

Når de gjelder omdreininger vil maxverdien ligge mellom 3500 og 5000 rpm alt etter kor stor aksling eg greier å skaffe. vil ha størst mulig aksling så da faller omdreiningstallet til ca 3500rpm med en kawasaki zx10 med 330km/h på hjulet. om dette er oppnåelig eller ikkje får bli ein anna diskusjon. Den skal uansett dimensjoneres for det.

 

flott med mange inputs og forslag her folkens:)

 

noen ide om hvor eg kan få tak i en egnet hallsensor?

Lenke til kommentar

Tips, avhenging av tannhjulets oppløsning vil du i råverdi få en togglende RPM. Du bør derfor lage en eller annen form for filtrering i sw. Med god oppløsning burde det være akesptabelt med 5-10 RPM avrunding, eller enda bedre konfigurerbar RPM rounding.

 

Alternativt kan du sample og beregne snitt, men du får da en liten forsinkelse på avlesningen. Jeg ville "filtrert" ved hjelp av avrunding.

Lenke til kommentar
  • 3 måneder senere...

Opprett en konto eller logg inn for å kommentere

Du må være et medlem for å kunne skrive en kommentar

Opprett konto

Det er enkelt å melde seg inn for å starte en ny konto!

Start en konto

Logg inn

Har du allerede en konto? Logg inn her.

Logg inn nå
  • Hvem er aktive   0 medlemmer

    • Ingen innloggede medlemmer aktive
×
×
  • Opprett ny...