Aktuell fehlt aus meiner Sicht noch eine vernünftige, einfache Lösung bezüglich des Druckwellenschlauches für den Bumperduino. Da ich den gleichen Sensor verwende wie der Bumperduino, sollten meine Lösung mit dem Bumperduino kompatibel sein.
Als Schlauch verwende ich EPDM Moosgummi D-profil SK 21x17 mm. Kommerzielle Druckwellenschläuche werden aus dem gleichen Material hergestellt - zumindest was ich gegooglet habe. https://www.technirub.de/moosgummi-d-profil-sk-21x17-mm.html
Der funktioniert sehr gut. Der Sensor spricht schon bei geringstem Druck an. Der Schlauch geht um den ganzen Roboter.
Aktuell habe ich den Pattexkleber im angehängten Bild genommen. Der hält sehr gut. Bei dem nächsten Mal werde ich aber wohl Loctite 406 als Kleber nehmen. Gibt es bei Amazon.
Als ich die Enden vom Schlauch dicht kleben wollte (mit der Unterseite des Schlauches mit Azeton gereinigt), hatte ich den Schlauch mit Gewebeklebeband fixiert. Als ich dieses dann wieder abmachen wollte, hat es so stark geklebt, dass mir das Gummi an der Oberfläche rausgerissen ist. Also nicht nachmachen. Daraufhin habe ich dann das defekte Stück herausgeschnitten und ein Stück dazwischengeklebt. Funktioniert erstmal, aber ich werde es nochmal neu erstellen. Vor dem Kleben das Gummi mit Azeton reinigen.
Den Anschluss an den Silikonschlauch habe ich mit einem Teil von Regenmeister hergestellt. Kleines Loch eingestochen, eingeklebt und den Schlauch draufgesteckt. https://www.regenmeister.de/Beetbew...oer/Adapter-fuer-Steigrohr-5-Stueck::718.html
Als Code habe ich nicht den vom Bumperduion benutzt, da dieser den Zero-Point nicht aus der Vergangenheit nimmt, sondern neu kalkuliert in der Hoffnung das bei der Berechnung nicht gerade der Schlauch gedrückt wird.
Anbei mal mein Testcode wie ich es machen würde. Ich werde wohl noch ein paar mehr Summen aus dem Array berechen. Der Code in run() benötigt bei mir 11uS. Diesen rufe ich dann in Intervallen von 15ms auf.
Als Schlauch verwende ich EPDM Moosgummi D-profil SK 21x17 mm. Kommerzielle Druckwellenschläuche werden aus dem gleichen Material hergestellt - zumindest was ich gegooglet habe. https://www.technirub.de/moosgummi-d-profil-sk-21x17-mm.html
Der funktioniert sehr gut. Der Sensor spricht schon bei geringstem Druck an. Der Schlauch geht um den ganzen Roboter.
Aktuell habe ich den Pattexkleber im angehängten Bild genommen. Der hält sehr gut. Bei dem nächsten Mal werde ich aber wohl Loctite 406 als Kleber nehmen. Gibt es bei Amazon.
Als ich die Enden vom Schlauch dicht kleben wollte (mit der Unterseite des Schlauches mit Azeton gereinigt), hatte ich den Schlauch mit Gewebeklebeband fixiert. Als ich dieses dann wieder abmachen wollte, hat es so stark geklebt, dass mir das Gummi an der Oberfläche rausgerissen ist. Also nicht nachmachen. Daraufhin habe ich dann das defekte Stück herausgeschnitten und ein Stück dazwischengeklebt. Funktioniert erstmal, aber ich werde es nochmal neu erstellen. Vor dem Kleben das Gummi mit Azeton reinigen.
Den Anschluss an den Silikonschlauch habe ich mit einem Teil von Regenmeister hergestellt. Kleines Loch eingestochen, eingeklebt und den Schlauch draufgesteckt. https://www.regenmeister.de/Beetbew...oer/Adapter-fuer-Steigrohr-5-Stueck::718.html
Als Code habe ich nicht den vom Bumperduion benutzt, da dieser den Zero-Point nicht aus der Vergangenheit nimmt, sondern neu kalkuliert in der Hoffnung das bei der Berechnung nicht gerade der Schlauch gedrückt wird.
Anbei mal mein Testcode wie ich es machen würde. Ich werde wohl noch ein paar mehr Summen aus dem Array berechen. Der Code in run() benötigt bei mir 11uS. Diesen rufe ich dann in Intervallen von 15ms auf.
Code:
#ifndef MPX5010DP_H_INCLUDED
#define MPX5010DP_H_INCLUDED
#include "mbed.h"
#define MPX5010DP_BUF_SIZE 50 // Bei 15ms Intervall sind dies 750ms die zurückgeguckt werden
class CMPX5010DP
{
public:
bool flagShowBumper;
void setup();
void run();
bool isBumperActivated();
private:
bool _bumperActivated;
float _buf[MPX5010DP_BUF_SIZE];
float _deactivateThreshold;
};
#endif
Code:
#include "mbed.h"
#include "MPX5010DP.h"
#define MPX5010DP_Pin PC_0
extern Serial pc;
AnalogIn aiMPX5010DP(MPX5010DP_Pin);
void CMPX5010DP::setup()
{
int i;
_bumperActivated = false;
flagShowBumper = false;
for(i=0; i < MPX5010DP_BUF_SIZE; i++) {
_buf[i] = aiMPX5010DP.read();
}
};
bool CMPX5010DP::isBumperActivated()
{
return _bumperActivated;
}
void CMPX5010DP::run()
{
int i;
float sum1=0.0f, sum2=0.0f, sum3=0.0f;
memcpy(&_buf[0],&_buf[1],sizeof(float) * (MPX5010DP_BUF_SIZE-1));
_buf[ MPX5010DP_BUF_SIZE-1 ] = aiMPX5010DP.read();
for(i=0; i < 4; i++) {
sum1 += _buf[i];
}
sum1 /=4;
for(i=MPX5010DP_BUF_SIZE-8; i < MPX5010DP_BUF_SIZE-4; i++) {
sum2 += _buf[i];
}
sum2 /=4;
for(i=MPX5010DP_BUF_SIZE-4; i < MPX5010DP_BUF_SIZE; i++) {
sum3 += _buf[i];
}
sum3 /=4;
if(!_bumperActivated) {
if(sum3-sum1 > 0.03f) {
_bumperActivated = true;
if(flagShowBumper) {
pc.printf("3-1: %f-%frn", sum3,sum1);
}
}
if(sum3-sum2 > 0.03f) {
_bumperActivated = true;
if(flagShowBumper) {
pc.printf("3-2: %f-%frn", sum3,sum2);
}
}
// calculate deactivate threshold out of least sum
if(_bumperActivated) {
if(sum2<sum1)
_deactivateThreshold = sum2+0.02f;
else
_deactivateThreshold = sum1+0.02f;
}
} else {
if(sum3 < _deactivateThreshold) {
_bumperActivated = false;
if(flagShowBumper) {
pc.printf("3-threshold: %f-%frn",sum3, _deactivateThreshold);
}
}
}
};