Arduino Input Høj-Lav
En Arduino har grænser for, hvor den skifter mellem et logisk højt og lavt input. Hvilket kan bruges under programmering af en Arduino til at konvertere strøm til en digital værdi. Der skal være en bestemt spænding til stede før en Arduino anser inputtet, den modtager som 1 eller 0.
Grænsen kan findes ved at lave en opstilling, hvor Arduinoen viser spændingen ved et skift fra HØJ til LAV eller omvendt, ved at printe spændingen i den serielle monitor.
Datablad
Tabellen er taget fra databladet[1] og viser hvornår et input med sikkerhed er LAV eller HØJ.
Når inputspændingen er indenfor -0.5 og 0.2 eller 0.3 gange forsyningsspændingen, afhængig af forsyningsspændingens størrelse, er den LAV.
Når inputspændingen er indenfor 0.6 eller 0.7 gange forsyningsspændingen og forsyningsspændningen + 0.5, er den HØJ.
Det er et meget bredt spekter at input-niveauet angiver, men typisk vil skiftet ligge omkring 0.5 gange forsyningsspændingen.
Der er angivet at der sidder en schmitt-trigger i indgangen på alle digitale input, dog med undtagelse af oscillator-indgangen, som ikke er tilgængelig på en Arduino. Databladet fortæller dog minimalt om hvilke spændinger den skifter på, der er dog angivet lidt omkring den serielle indgang som vist her:
![]()
Udsnit fra databladet, der viser hysteresen på den serielle indgang
I databladet ses det at hysteresen er 0.05*Vcc, og med en Arduino der arbejder på 5V bliver det til 0.25V, hvilket eftervises længere nede på siden.
Test kode
Billedet viser et diagram over den opstilling der er brugt.
Pin 8 er det digitale input. Der er også koblet et
voltmeter til inden den digitale indgang, for at måle inputspændingen. Der er
også herfra koblet en ledning ned til den første analoge indgang på Arduinoen, denne måler også hvor
meget strøm, der er inden indgang.
Koden til denne opstilling:
//definere input pins nummer
int inputD = 8;
int inputA = A0;
//denne variabel indeholder den sidste digitale værdi, og nuværende hvis det er ligeefter skiftet.
boolean lastDigitalValue = false;
//sætter arduinoen op, så den kan læse værdierne af pinene, og kommunikere med computeren.
void setup() { Serial.begin(9600);
pinMode(inputD, INPUT);
pinMode(inputA, INPUT);
}
void loop() { //den digitale værdi læses og gemmes til senere brug.
boolean digitalValue = digitalRead(inputD) == HIGH;
//den analog værdi gemmes til hvis der nu er skift hvilket ville kunne være tilfældet, hvis den først blev læst,
//så der er mindst chance for at den skifter inden at den sendes til computeren,
//da der kan være lidt forsinkelses fordi der sker lidt før der sendes.
//den er conventere desuden fra analog værdi(0-1023) til volt(den er kallibreret efter et volt meter, hvor 1023(analog værdi) = 5V).
float analogValue = ((float) analogRead(inputA))/1023*5.104;
//tjekker om den digitale værdi er skiftet siden sidst.
if(digitalValue != lastDigitalValue){
//fortæller om det er op eller ned gang, altså fra LOW til HIGH eller omvendt.
if(lastDigitalValue) Serial.print("Change at(1->0): ");
else Serial.print("Change at(0->1): ");
//analog værdi tilføjes til stringen.
Serial.print(analogValue);
Serial.print("V\n");
//den sidste digitale værdi opdateres.
lastDigitalValue = digitalValue;
}
}
Kode fra Daniel Aarup Hasselund og Ole Van Santen's Arduino aflevering
Den ovenstående kode's output vil se således ud:
Ud fra dette kan det ses at en Arduino har input hysterese da skiftet fra højt til lavt ikke ligger samme sted som fra lavt til højt.
Hysterese
At det har en hysterese vil sige at systemet er afhængigt af om en variable er stigende eller aftagende. I forbindelse med arduinoens input kan dette hjælpe med at forhindre at et input ligger og svinger mellem højt og lavt hvis den for eksempel kun lige er oppe og være høj.
Her er et eksempel hvor der øverst vises en graf med input og output uden en hysterese og nederst er der en graf hvor man kan se input og output med hysterese. Som man kan se kommer outputtet af det ustabile input til at svinge meget uden en hysterese hvor at det samme input med en hysterese er meget mere stabilt.
Supplerende målinger
For at tjekke at flere forskellige Arduinoer opfører sig på samme måde er der lavet en ekstra opstilling, som måler egenskaberne for schmitt-triggerens hysterese.
Opstillingen er lavet med en modstand og en kondensator, hvor en udgang styrer modstanden høj eller lav, og det vil så op- eller af-lade kondensatoren. Kondensatoren har så forbindelse til en digital og en analog indgang. Koden oplader så kondensatoren indtil den digitale indgang skifter til høj, og på det tidspunkt udskrives spændingen udregnet fra den analoge måling. Når det er sket sættes udgangen lav, så kondensatoren aflades indtil den digitale indgang bliver lav, hvor den analoge måling udskrives. Dette gentages fortløbende.
Kredsløbet ser ud som vist her:
![]()
Kredsløb til måling af hysteresen på et Arduino input
Koden til måling af hysteresen
Til måling af hysteresen er der lavet følgende kode:
byte pin = 7;
void setup() {
// put your setup code here, to run once:
pinMode(12, OUTPUT);
digitalWrite(12, LOW);
delay(1000);
Serial.begin(1000000);
}
int analog;
float volt;
boolean digital;
void laes() {
analog = analogRead(A0);
digital = digitalRead(pin);
}
void loop() {
if (Serial.available()) {
pin = Serial.parseInt();
Serial.println(pin);
while (Serial.available()) {
char ch = Serial.read();
}
}
digitalWrite(12, HIGH);
laes();
while(! digital) {
laes();
}
volt = (float) analog * 5.0 / 1024.0;
Serial.print("Vutl\t");
Serial.println(volt);
digitalWrite(12, LOW);
laes();
while(digital) {
laes();
}
volt = (float) analog * 5.0 / 1024.0;
Serial.print("Vltl\t");
Serial.println(volt);
}
Den første del af koden i loop er lavet til at man kan skifte det digitale input man måler på. Man gør det ved at skrive pin-nummeret ind i Serial Monitor
Resultater af målinger på indgangenes hysterese
Der er målt på 3 forskellige Arduino UNOer, hvor det kun er den første, hvor alle input er målt igennem.
| Klon 1 | Original | Klon 2 | ||||||
|---|---|---|---|---|---|---|---|---|
| Pin | Vltl | Vutl | Vltl | Vutl | Vltl | Vutl | ||
| 2 | 2,23 | 2,51 | 2,21 | 2,56 | 2,31 | 2,51 | ||
| 3 | 2,24 | 2,52 | ||||||
| 4 | 2,24 | 2,53 | ||||||
| 5 | 2,21 | 2,50 | 2,21 | 2,53 | 2,29 | 2,51 | ||
| 6 | 2,20 | 2,52 | ||||||
| 7 | 2,20 | 2,51 | 2,19 | 2,55 | 2,24 | 2,55 | ||
| 8 | 2,21 | 2,49 | ||||||
| 9 | 2,15 | 2,43 | ||||||
| 10 | 2,17 | 2,44 | ||||||
| 11 | 2,13 | 2,44 | 2,16 | 2,47 | 2,22 | 2,46 | ||
| 13 | 2,10 | 2,43 | 2,15 | 2,43 | 2,20 | 2,43 | ||
| A1 (15) | 2,17 | 2,46 | 2,15 | 2,53 | 2,22 | 2,51 | ||
| A2 (16) | 2,14 | 2,46 | ||||||
| A3 (17) | 2,16 | 2,47 | ||||||
| A4 (18) | 2,14 | 2,47 | ||||||
| A5 (19) | 2,14 | 2,46 | 2,14 | 2,52 | 2,20 | 2,50 | ||
Som det ses på målingerne, så er der små variationer, både i hysteresens størrelse og i hvor de ligger i spændingsområdet, men det er ganske små variationer, og det ligger fint inden for det forventede.
Referencer

