Pulsmesser (kontaktbehaftet) von Ergometer auslesen

Hallo zusammen,

mein Fahrrad-Ergometer, dessen Computer ich derzeit neu baue, hat einen Pulsmesser mit kontaktbehafteten Sensoren. Am “Lenker” sind links und rechts jeweils zwei Metallkontakte, auf die die Handflächen aufgelegt werden. Wie die bisherige Schaltung das gemacht hat, kann ich nicht nachvollziehen, ich würde die Sensoren aber gerne mit meinem Nano (Clone) auslesen und brauche eure Hilfe um das zu realisieren.

Beim vorhandenen Computer werden die Kontakte durch eine separate Schaltung/Platine ausgelesen, die mit 4 Pins/Lötkontakten mit der Hauptplatine verbunden ist. Die Pins tragen die Bezeichnung + - E O, + und E wurden bisher von der Batterie (2x AAA) direkt mit ca. +3V versorgt und - ist natürlich GND. Somit bleibt noch O für Output übrig.

Am liebsten würde ich nur die Sensoren/Kontaktflächen mit dem Nano auslesen, denke aber dass das nicht einfach wird, daher Plan B: Auslesen der Platine mit dem Nano und das Signal abgreifen.

Was ich bisher versucht habe:
Nano und Platine habe ich wie folgt verbunden: 3V3 an +, GND an - A0/D4 an O.

Mit Multimeter Spannung an O und - gemessen - 0,0-0,2 mV ob Kontaktflächen berührt worden oder nicht.

Mit Nano auf analoge Werte gehorcht, mit analogRead() und Seriellen Monitor - Signal meist 0 und ganz selten 1.

const byte PulsPin = A0;
int Signal;

void setup() {
  Serial.begin(9600);
}

void loop() {
  Signal = analogRead(PulsPin);
  Serial.println(Signal);
  delay(50);
}

Mit Nano nach digitalen Werten LOW/HIGH (0/1) gesucht, bleibt auf 0.

const byte PulsPin = 4;
int Signal;

void setup() {
  Serial.begin(9600);
  pinMode(PulsPin, INPUT); // Auch mit INPUT_PULLUP getestet
}

void loop() {
  Signal = digitalRead(PulsPin);
  Serial.println(Signal);

  delay(50);
}

Selbst nach I2C hab ich gescannt.

Hab ihr noch eine Idee wie ich das Teil mit einfachen Mitteln auslesen kann?
Falls es relevant ist, kann ich noch die Widerstandswerte von R1-R10 ablesen und posten, aber die Kondensatoren (?) C1-C10 sind nicht beschriftet.

Hier noch die beiden Platinen mit Erklärungen, wo es Sinn macht.
Pulsmesser:
Platine Rückseite.jpgPlatine Vorderseite.jpg

Hauptplatine:
Hauptplatine oben.jpgHauptplatine unten.jpg

Wäre cool wenn jemand eine Idee hätte! :slight_smile:

Gruß
Jörg

Analog 0 oder 1 von 1023 ist etwas wenig.

Ich würde da erst mal mit einem Scope drangehen.

DrDiettrich:
Analog 0 oder 1 von 1023 ist etwas wenig.

Ich würde da erst mal mit einem Scope drangehen.

Die Antwort hab ich befürchtet, leider hab ich keinen Ozzi, außer du weißt wie den mit einfachen Mitteln und nem Mega2560 oder D1 mini nachbauen kann… :confused:

Bin eigentlich nur ein Hobbybastler/-Programmierer, aber BTW. wie teuer sind brauchbare Ozzis eigentlich? ;D

Außer Oszi sehe ich nur die Möglichkeit, etwaige Impulse per Interrupt zu detektieren.

Brauchbar ist bei Oszis recht dehnbar, und fehlende Optionen vermißt man nachher oft. Als Kompromiß ggf. ein Logikanalysator (USB ab 10€?).

DrDiettrich: Außer Oszi sehe ich nur die Möglichkeit, etwaige Impulse per Interrupt zu detektieren.

Mit Interrupts hab ich bisher noch nicht (bewusst) gearbeitet, kannst du mir ein-zwei Beispiele liefern und/oder ein Tuturial?

Brauchbar ist bei Oszis recht dehnbar, und fehlende Optionen vermißt man nachher oft. Als Kompromiß ggf. ein Logikanalysator (USB ab 10€?).

Ich hab auf die Schnelle den hier gefunden, was meinst du? die 10 € tun mir nicht wirklich weh ;)

Analog 0 oder 1 von 1023 ist etwas wenig.

Kann man mit Bordmitteln um den Faktor 5 erhöhen ( analogReference(INTERNAL); )

Aber wenn dein "0,0-0,2 mV" richtig ist, nutzt das auch nix und wird ebenso 0 .. 1 liefern. Ist aber eher fraglich, ob das nur ein sehr niedriger Pegel oder nicht ein ganz anderes Problem ist.

Digitale Signale (für einen Logik-Analysator) sind das jedenfalls wohl nicht. Obwohl man so einen Saleae-Clon generell schon mal brauchen kann ;)

Also mit Interrupts habe ich mich jetzt mal kurz befasst. Auf mikrocontroller.net hab ich eine recht verständliche Erklärung gefunden, den 2. Sketch übernommen und mit serieller Ausgabe ergänzt:

#include <Arduino.h> // Für Platformio benötigt
const int buttonPin = 2;     // the number of the pushbutton pin (3 = INT1)
const int ledPin =  13;      // the number of the LED pin
void pin_ISR();              // Funktionsdeklaration für Platformio

// variables will change:
volatile int buttonState = 0;         // variable for reading the pushbutton status

void setup() {
  Serial.begin(9600);
  // initialize the LED pin as an output:
  pinMode(ledPin, OUTPUT);
  // initialize the pushbutton pin as an input:
  pinMode(buttonPin, INPUT);
  // Attach an interrupt to the ISR vector
  attachInterrupt(0, pin_ISR, CHANGE); // Int1 auch getestet
}

void loop() {
  // Nothing here!
}

void pin_ISR() {
  buttonState = digitalRead(buttonPin);
  Serial.println(buttonState);
  digitalWrite(ledPin, buttonState);
}

Leider keinerlei Ergebnis.

michael_x: Kann man mit Bordmitteln um den Faktor 5 erhöhen ( analogReference(INTERNAL); )

Aber wenn dein "0,0-0,2 mV" richtig ist, nutzt das auch nix und wird ebenso 0 .. 1 liefern. Ist aber eher fraglich, ob das nur ein sehr niedriger Pegel oder nicht ein ganz anderes Problem ist.

Ich löte die Platinen morgen wieder zusammen, nicht dass ich das Teil wie auch immer geschrottet habe...

Digitale Signale (für einen Logik-Analysator) sind das jedenfalls wohl nicht. Obwohl man so einen Saleae-Clon generell schon mal brauchen kann ;)

Empfehlung ist Empfehlung, ob ich es direkt brauche oder nicht, ist bestellt... ;)

Ich konnte es jetzt nicht ruhen lassen und habe die Platinen mit den zuvor angelöteten Jumperkabel, mit +, - und O verbunden, keine Reaktion. Das einzige was ich nicht verbunden hatte war der Pin E, der auf beiden Platinen mit + direkt verbunden wird - 4. Kabel angelötet, verbunden und ich kriege einen Puls, d.h. ich lebe noch und die Platine lebt... :grinning:

Ich vermute hier mit meinem laienhaften Wissen, dass die Platine das gewisse Quäntchen mA gefehlt hat... ???

Naja ich teste es morgen am Nano mit allen 4 Pins und sage euch noch mal Bescheid! Danke schon mal bis hier... ;)

mit serieller Ausgabe ergänzt

Das ist schlecht. Grundregel: Kein Serial in einer ISR.

Leider keinerlei Ergebnis

Sollte eigentlich den Zustand von Pin2 auf der eingebauten LED anzeigen. Den Pin kann man mit GND oder mit 5V verbinden, oder (wie es sich gehört) auch einen Pulldown - Widerstand dazunehmen. Erst wenn der unveränderte Sketch wie erwartet funktioniert, solltest du weiter machen. (Serial um das Prellen zu erleben, oder statt eines Drahts+Pulldown deinen "Pulsmesser" anschließen, oder auf INPUT_PULLUP umstellen, oder was auch immer)

"Keinerlei Ergebnis" ist eigentlich eine noch blödere Antwort als "es funktioniert nicht". Fühl dich also hiermit ausgeschimpft.

ich lebe noch und die Platine lebt... :grinning:

Glückwunsch ! … und schau mal, bevor du es wieder auseinanderrupfst, ob du bei richtigem Anschluss im Betrieb andere Spannungen messen kannst.

michael_x: Das ist schlecht. Grundregel: Kein Serial in einer ISR. Sollte eigentlich den Zustand von Pin2 auf der eingebauten LED anzeigen. Den Pin kann man mit GND oder mit 5V verbinden, oder (wie es sich gehört) auch einen Pulldown - Widerstand dazunehmen. Erst wenn der unveränderte Sketch wie erwartet funktioniert, solltest du weiter machen. (Serial um das Prellen zu erleben, oder statt eines Drahts+Pulldown deinen "Pulsmesser" anschließen, oder auf INPUT_PULLUP umstellen, oder was auch immer)

"Keinerlei Ergebnis" ist eigentlich eine noch blödere Antwort als "es funktioniert nicht". Fühl dich also hiermit ausgeschimpft.

Nehme ich hiermit zur Kenntnis! ;)

Ich habe aber ein positives Ergebnis, hab jetzt doch noch den Nano mit allen 4 Pins der Platine (+=3V3, -=GND, E=3V3, O=A0) verbunden und frei nach Seti: Wir haben ein Signal! :D

Also ich kriege jetzt ein analoges Signal zwischen 896 und 904, in Intervallen, dazwischen 0. Also kann ich darauf aufbauen.

Mit Interrupt war das mein erster Gehversuch und muss mir das noch mal genauer anschauen. Ich denke das kann ich spätestens bei der Kombination aller Einzelsketche noch gebrauchen.

Jetzt geh ich aber mal schlafen... :sleeping:

Schön daß Du inzwischen schon weiter bist :-)

Der Vollständigkeit halber:

wapjoe: Ich hab auf die Schnelle den hier gefunden, was meinst du? die 10 € tun mir nicht wirklich weh ;)

Du solltest nochmal etwa so viel für Kabel mit Klammern ausgeben (siehe Zubehör). Wenn Du vorab noch mehr wissen möchtest, dann mach Dich erst einmal mit der Bedienung und der zugehörigen Software vertraut.

Als Oszi hatte ich mir zuerst ein Modell bestellt, das von den Daten her ganz gut aussah, sich dann aber als fast unbrauchbar in der Bedieung und Anwendung herausgestellt hat. Da hat es der Anbieter doch tatsächlich geschafft, für die Bedienung einen alten analogen (Tektronix) Speicher-Oszi nachzubauen! Bei diesen Modellen hat die Röhre das Bild festgehalten, nachträgliches Zoomen, Scrollen etc. war nicht vorgesehen - was man bei einem digitalen Oszi eigentlich schon als Grundfunktion erwarten darf. Man sollte bei solchen Bestellungen darauf achten, daß der Verkäufer ein Gerät problemlos zurücknimmt, wenn es sich auf Anhieb als wenig brauchbar erweist. Im Laden vorführen lassen ist ja leider nicht mehr in Mode :-(

Also ich kriege jetzt ein analoges Signal zwischen 896 und 904, in Intervallen, dazwischen 0. Also kann ich darauf aufbauen.

Das ist vermutlich ein digitales Signal. Herzlichen Glückwunsch und viel Spaß mit dem Logikanalysator :) Kriegst du das nur am lebenden Objekt oder auch, wenn du nur die vier Pins richtig anschließt? Im letzteren Fall tippe ich auf was Serielles. Bis der LA da ist miss mal die Pulsdauern und schätze aus der kürzesten 1 oder 0 die Baudrate.

michael_x: Das ist vermutlich ein digitales Signal. Herzlichen Glückwunsch und viel Spaß mit dem Logikanalysator :) Kriegst du das nur am lebenden Objekt oder auch, wenn du nur die vier Pins richtig anschließt? Im letzteren Fall tippe ich auf was Serielles. Bis der LA da ist miss mal die Pulsdauern und schätze aus der kürzesten 1 oder 0 die Baudrate.

Ohne Berührung, testweise noch mit 50 ms delay, wird nur 0 ausgegeben, sobald ich die Handflächen auflege erscheinen Werte um die 900 im Intervall:

0
0
0
0
0
0
908
908
885
906
907
907
908
908
900
908
909
910
909
910
895
910
910
0
0
0
0
0
0
910
910
911
912
910
910
0
0
0
0
0
910
910
910
911
911
0
0
0
0
1
911
911
911
911
901
911
0
0
0
0
0
0
911
912
911
893
911
0
0
0
0
0
0
913
911
913
912
915
909
0
0
0
0
0
911
912
912
912
911
912
0
0
0
0
0
0
912
912
893
912
913
0
0
0
0
0
0
0
912
912
910
912
912
0
0
0
0
0
0
0
899
912
911
912
911
0
0
0
0
0
0
0
912
909
911
915
912
0
0
0
0
0
0
912
910
913
913
912
913
0
0
0
0
0
0
910
910
913
913
913
913
0
0
0
0

Theoretisch könnte ich schon so den Puls berechnen in dem ich die Zeit zwischen den Herzschlägen mit millis() ausrechne. Aber möglich dass es Digital ist, ~900 = HIGH und 0 = LOW, teste es einfach mal.

Und ich bin auf den LA gespannt :D

Regelmäßige (250 .. 300 ms) HIGH / LOW Wechsel und LOW in Ruhe spricht jetzt nicht mehr für Serial. Aber, hast du einen Puls von 100 - 120 ? Wenn ja, beruhige dich mal :) Oder miss mal genauer ( pulseIn );

Digital klappt wie erwartet ebenfalls, zumindest wenn man das Signal an den richtigen Pin anlegt… :smiley:

Naja, mein Ruhepuls liegt meist bei 90-100, daher (Krankheitsbedingt) hab ich mir das Teil zugelegt, okay ich investiere mehr Zeit ins Basteln als ins Fahren, aber das hält den Kopf fit! :wink:

Aber puseln() schau ich mir noch mal genauer an, habs grad nur überflogen, aber damit könnte ich auch in meiner Tachomessung etliche Zeilen Code einsparen.

Danke, für den 500. Karma bin ich verantwortlich :wink:

damit könnte ich auch in meiner Tachomessung etliche Zeilen Code einsparen.

Ist halt blockierend. Könntest also während einer Puls-Messung nicht gleichzeitig den Tacho bedienen.

Das ist generell der Unterschied zwischen 10 Zeilen Prinzip-Demo und einem Komplett-Sketch.

Aber Interrupts braucht es wohl auch nicht wirklich, außer zu Lern- und Übungszwecken.

Hi,

ich habe gerade meinen Ruhepuls gemessen, 52 ??? Evtl. hilft Dir beim Tacho auch die Frequenz zu messen. Nur wenn es zu langsam ist, ist wohl pulseln() die bessere Variante. Die Lib zum Frequenz messen habe ich im letzten Sketch mit verwurstet: http://interface.khm.de/index.php/lab/interfaces-advanced/arduino-frequency-counter-library/

Gruß André

@SpaghettiCode:

Sehe ich das richtig, dass die FreqCounter lib aus dem Link mit einem festen Pin arbeitet, und man damit also auch keine zwei Frequenzen (ErgometerSpeed / Puls) parallel erfassen kann?

@ michael, ja, der Takt wird an Pin D5 erwartet. Ist dann für diesen Zweck eher nicht das Gelbe vom Ei.

Nachtrag: Für eine geplante HW hatte ich mir schon einen Umschalter mit einem 74HC00 zurechtgelegt,
damit ist zumindest ein ODER möglich, also entweder (F) / oder (H) via Select (S)

Gruß André