Hemgjord infraröda avståndsmätare (liknande skarpa GP2D120 (10 / 11 steg)
Steg 10: Steg 9: Linearizing resultaten
Jag placerade resultaten i en tabell och ritade en graf från dessa resultat. Jag ingår också en exponentiell trendlinje. Om du kommer ihåg grafen jag visade i ett tidigare steg, du kan se är det ganska likt, excel tillåter inte den plottning av 1 / x grafer!
Nu, genom att titta på de matematiska funktionerna att Arduino kan göra begränsar oss lite till hur vi kan linearize dessa resultat. Genom att leka med funktionerna i excel kommer att hjälpa oss att hitta lämplig men som raden exponentiell trend passar, fann jag att det bara skulle vara lämpligt att göra inversen av en exponent (en exponent är lika med e ^ x), inversen är lika med den naturliga logaritmen (känd som ln) för x. Genom att göra omvänd exponenten, resultaten kommer att vara mycket mer linjärt och Arduino tillåter denna funktion. Om du rita denna graf, du kommer att kunna tillämpa en linjär trendlinje och har en helt acceptabelt R ^ 2 värde.
Nu när du har linearized resultaten, måste du invertera övertoningen. För närvarande, som avståndet minskas, ökar spänningen. Detta är inte en livskraftig form av mätning som man skulle förvänta sig ett värde att minska som spänningen ökade!
Det enklaste sättet att göra detta vore att Invertera resultaten av loggen genom att multiplicera med minus 1. Detta kommer sedan Invertera övertoningen och de resulterande värdet kommer att öka när avståndet ökar!
Nästa del är att använda en relation mellan dessa värden och avstånd. För det första, du värdet på 0 avstånd vara noll. Du gör detta genom att loggen för din största experimentellt finns spänning och att lägga till detta till alla värden.
Du får då ett resultat att den minsta spänningen ger det största värdet och den största spänningen ger sedan värdet 0.
Nu har du en linjär funktion som konverterar icke linjära spänningen. Behöver du nu är kartlägga detta till motsvarande avstånd, e.g. det största värdet som du beräknade ska vara lika med avståndet som du mätt (för det värdet, dess förvirrande jag vet!). För detta sista steg, allt du behöver göra med största avståndet mäts multiplicera delad med normaliserade resultatet och du kommer att ha en funktion som kommer att ge dig en lyckad avstånd läsning! Observera att om du ändrar någon av parametrarna krets, eller justera temperaturen, detta kommer att förändras! Därav varför dess endast enkla.
Detta kommer att göra mycket mer känsla när du läst koden, ärlig!
Den nya koden är:
int Readvalue; Inledningsvis Läs värdet
int Printvalue; Värdet skrivs ut på skärmen
float Mathvalue; Variabeln används för någon form av matematik
flyta Normalize_constant = 0,47; De variabler som jag räknat från mina resultat
flyta Scale_constant = 3.34; Samma som ovan!
void setup() {
Serial.BEGIN(9600); Börja seriell kommunikation med dator på 9600bps
}
void loop() {
Readvalue = analogRead (A0) + 1; Läs infraröda avståndsmätare input, Lägg till 1 för att säkerställa att behandlingen aldrig är lika med noll eller du kommer att få konstiga matematik resultat!
Mathvalue = log(Readvalue) //Apply loggen för Läs värdet
Mathvalue = Mathvalue *-1 //Invert logga värdena
Mathvalue = Mathvalue + Normalize_constant //Normalize resultaten, min normalisera konstant var lika LN(1.6) som beräknats från mina resultat. Yours varierar!
Mathvalue = Mathvalue * Scale_constant //Multiply vid den skala konstanten se till att det uppmätta avståndet är samma som värdena.
Serial.println(Mathvalue); Skriva ut sista matte värdet till seriell bildskärmen
Delay(50); Fördröjning för 50 ms att inte fylla den seriella buffert
}