ich bin leider nicht sehr versiert im Umgang mit Boards wie dem Arduino aber habe aktuell ein Projekt, dass ich kurzfristig realisieren muss.
Folgende Ausgangssituation:
Ich habe einen Dehnungsmessreifen (mit 2 Kontakten), welcher dazu verwendet werden soll eine aufgebrachte Kraft zu erfassen. Hierbei gilt, dass sich der Widerstandswert des DMS verringert wenn die aufgebrachte Kraft ansteigt.
Nun soll der Arduino dazu verwendet werden eine grüne LED zum leuchten zu bringen, wenn eine bestimmte Kraft (bzw. ein bestimmter Widerstandswert des DMS) erreicht wird. Wenn die aufgebrachte Kraft größer oder kleiner ist, soll eine rote LED leuchten.
Hierzu habe ich mir folgende Schaltung überlegt:
DMS und ein fester Widerstand in Reihe an den Arduino angeschlossen. Die Spannung zwischen den beiden Widerständen wird abgegriffen und auf einen analogen Eingang gelegt.
Nach meinem Verständnis kann ich nun die sich ergebende Spannung erfassen (0-5V --> 0-1023).
Der Code den ich mir grob übelegt habe würde mithilfe einer if, else if, else Abfrage zwei digitale Ausgänge ansteuern und entsprechend der Aufgabenstellung eine rote bzw. eine grüne LED zum leuchten bringen.
Ich würde mich freuen wenn mich jemand mit etwas Erfahrung sagen könnte, ob das so funktionieren kann oder ob ich schon im Ansatz daneben liege.
Vielen Dank schonmal.
Falls irgendwas unklar ist kann ich auch noch die Schaltung oder so nachreichen.
Der Dehmungsmesstreifen verhält sich nicht wie ein Potentiometer, welches dir eine Spannung zwischen 0 und 5V liefert beim drehen. Die Widerstandsänderung eines DMS ist sehr gering. Die dazu korrospondierenden Spannungsänderungen liegen im Millivoltbereich - in der selben Größenordnung, wie die Auflösung des AD-Wandlers im letzten Bit!
Für sowas gibt es darauf spezialisierte ICs, die garnicht teuer sind.
Googele mal nach HX711. Den gibt es für etwas mehr als einen Euro auf einer briefmarkengroßen Platine.
Wenn der Vorwiderstand in der gleichen Größenordung wie der FSR bei deiner zu messenden Last ist, ist die Auflösung am größten ( also z.B. 10k bei ca. 200g )
Statt des opamp im Bild kannst du gleich einen Arduino-Analogpin nehmen.
Das mit den 2 if und 2 else ist schon richtig
void loop () {
int wert = analogRead(A0);
if (wert > MAX) rot();
else if (wert < MIN) rot();
else gruen();
}
void rot() {
digitalWrite(REDPIN, HIGH);
digitalWrite(GREENPIN, LOW);
}
Der OP entkoppelt den Kraftsensor vom digitalen Eingang und paßt den Innenwiderstand an. Dies weil zum messen der Spannung der ADC einen kleinen Kondensator lädt und der Ladestrom bei zu hohen Widerständen im Spannungteiler (Sensor) nicht genügend groß ist damit der Konsensator in der vorgegebenen Zeit auf die volle Spannung auflädt. wenn Du keine schnellen Messungen brauchst kannst Du einen 0,1µF Kondensator zwischen analogen Eingang und masse schalten. Bei schnellen Lastwechseln bruchst Du den OP.
Grüße Uwe
Danke Uwe.
Was meinst du mit schnell? Denn “schnell” ist ja bei Embedded Anwendungen immer Definitionssache
Sekunden können da ja schon oft Ewigkeiten sein.
Es geht quasi darum über eine entsprechene Mechanik mit dem Finger eine Kraft auf eine Feder auszuüben um festzustellen, ob diese die “richtigen” Eigenschaften hat. Die Federkraft soll also nicht zu hoch und auch nicht zu niedrig sein.
Wenn jemand noch Lust und Zeit hat sich meinen Code durchzulesen und ihn zu zerreißen oder mir zu bestätigen, dass des so evtl. funzt…ich wäre demjenigen sehr verbunden. Letzteres wäre mir natürlich lieber.
Danke nochmal an Michael_x
int SensorPIN = A0; //Definition des analogen Eingangs
int GREENPIN = 12; //Definition des digitalen Ausgangs fuer die gruene LED
int REDPIN = 13; //Definition des digitalen Ausgangs fuer die rote LED
int wert = 0; //Variablendeklaration fuer das Sensorsignal
int MAX = 500; //Definition des maximalen Spannungswertes
int MIN = 300; //Definition des minimalen Spannungswertes
void setup() {
pinMode(GREENPIN, OUTPUT);
pinMode(REDPIN, OUTPUT);
}
void loop () {
int wert = analogRead(A0);
if (wert > MAX) rot();
else if (wert < MIN) rot();
else gruen();
}
void rot() {
digitalWrite(REDPIN, HIGH);
digitalWrite(GREENPIN, LOW);
}
void gruen() {
digitalWrite(GREENPIN, HIGH);
digitalWrite(REDPIN, LOW);
}
Du brauchst es nicht "schnell", wenn deine einzige Anwendung entweder eine rote oder grüne LED ist.
Wenn du Schingungen durch eine unterschiedliche resultierende Mischfarbe messen wolltest, wäre das etwas anderes
Der von Uwe vorgeschlagene Kondensator, aus dem sich beim Messen der ADC versorgt, schadet natürlich nicht.
Die globale Variable int wert; wird übrigens nicht verwendet und ist auch nicht erforderlich.
Sonst habe selbst ich nichts an deinem Sketch zu meckern.
Nachtrag: Doch, wenn du [b]const byte [/b] GREENPIN=12; schreibst (usw), wird dein Sketch ein bisschen kleiner.
Hallo michael_x, aus welchem Grund sollte der sketch kleiner werden. Hab ich nicht verstanden.
Habs probiert mit der IDE 1.6.7 und hat jedes mal die gleiche Größe
Dann hat der Optimizer seinen Job gut gemacht.
Das muss ihm nicht immer so gut gelingen.
Besser ist es, ihn zu seinem Glück zu zwingen, bzw. eine offensichtliche Chance zu geben.
Der Sketch verwendet 1.750 Bytes (5%) des Programmspeicherplatzes. Das Maximum sind 32.256 Bytes.
Globale Variablen verwenden 182 Bytes (8%) des dynamischen Speichers, 1.866 Bytes für lokale Variablen verbleiben. Das Maximum sind 2.048 Bytes.
das sagt die IDE 1.6.7 mit Arduino Uno egal ob ich " int pin=13;"oder " const byte pin = 13;" schreibe
Weiss nicht mit welchen sketch du testest.
Beim Sketch von ArduD2 - 2016-12-05, 19:59:54
ergibt sich für mich mit IDE 1.6.7 für Uno
entweder
int:
Der Sketch verwendet 1.022 Bytes (3%) des Programmspeicherplatzes. Das Maximum sind 32.256 Bytes.
Globale Variablen verwenden 19 Bytes (0%) des dynamischen Speichers
oder
const:
Der Sketch verwendet 984 Bytes (3%) des Programmspeicherplatzes. Das Maximum sind 32.256 Bytes.
Globale Variablen verwenden 11 Bytes (0%) des dynamischen Speichers
mit
const int SensorPIN = A0; //Definition des analogen Eingangs
const int GREENPIN = 12; //Definition des digitalen Ausgangs fuer die gruene LED
const int REDPIN = 13; //Definition des digitalen Ausgangs fuer die rote LED
const int MAX = 500; //Definition des maximalen Spannungswertes
const int MIN = 300; //Definition des minimalen Spannungswertes
Interessanterweise spart das nur 8 Byte, obwohl 5 int-Variable wegfallen.SensorPinwurde auch so schon wegoptimiert, weil gar nicht verwendet.
int SensorPIN = A0; //Definition des analogen Eingangs
int GREENPIN = 12; //Definition des digitalen Ausgangs fuer die gruene LED
int REDPIN = 13; //Definition des digitalen Ausgangs fuer die rote LED
int wert = 0; //Variablendeklaration fuer das Sensorsignal
int MAX = 500; //Definition des maximalen Spannungswertes
int MIN = 300; //Definition des minimalen Spannungswertes
void setup() {
pinMode(GREENPIN, OUTPUT);
pinMode(REDPIN, OUTPUT);
}
void loop () {
int wert = analogRead(A0);
if (wert > MAX) rot();
else if (wert < MIN) rot();
else gruen();
}
void rot() {
digitalWrite(REDPIN, HIGH);
digitalWrite(GREENPIN, LOW);
}
void gruen() {
digitalWrite(GREENPIN, HIGH);
digitalWrite(REDPIN, LOW);
}
Der Sketch verwendet 834 Bytes (2%) des Programmspeicherplatzes. Das Maximum sind 32.256 Bytes.
Globale Variablen verwenden 9 Bytes (0%) des dynamischen Speichers, 2.039 Bytes für lokale Variablen verbleiben. Das Maximum sind 2.048 Bytes.
so sieht das bei mir aus ob “int” oder “const int”
was ist bei mir anders als bei dir?
Muss irgendwas in diesen Compiler-Optionen sein, was bei dir besser ist !
-c -g -Os -w -std=gnu++11 -fno-exceptions -ffunction-sections -fdata-sections -fno-threadsafe-statics -w -x c++ -E -CC -mmcu=atmega328p
Ich betreibe den Arduino Nano über vier 1.5 V Batterien (also mit 6V) über den VIN port.
Kann ich den Arduino Nano mit angeschlossenen Batterien gleichzeitig über USB an den PC anschließen um mir über die serielle Schnittstelle die Messwerte anzeigen zu lassen, oder zerschieße ich dann das Gerät?