hardware:controllers:bk-g4m_lesekopf
Unterschiede
Hier werden die Unterschiede zwischen zwei Versionen angezeigt.
Beide Seiten der vorigen RevisionVorhergehende ÜberarbeitungNächste Überarbeitung | Vorhergehende Überarbeitung | ||
hardware:controllers:bk-g4m_lesekopf [2022/10/12 16:29] – Formatierung, umformuliert jau | hardware:controllers:bk-g4m_lesekopf [2022/11/12 11:54] (aktuell) – [Binary] tilman | ||
---|---|---|---|
Zeile 8: | Zeile 8: | ||
Als Magnetfeldsensor wird mit dem HSCDTD008A ein Low-Cost-Sensor verwendet, der für die Anwendung völlig ausreicht. Der HSCDTD008A vermisst die Stärke des Magnetfelds in den 3 Raumrichtungen. Für die Anwendung interessiert lediglich die Stärke des Gesamtfeldes. Die Richtung ist nicht wesentlich. | Als Magnetfeldsensor wird mit dem HSCDTD008A ein Low-Cost-Sensor verwendet, der für die Anwendung völlig ausreicht. Der HSCDTD008A vermisst die Stärke des Magnetfelds in den 3 Raumrichtungen. Für die Anwendung interessiert lediglich die Stärke des Gesamtfeldes. Die Richtung ist nicht wesentlich. | ||
- | Gegenwärtig die Software | + | Gegenwärtig |
Das Programm misst alle 500ms die 3 Komponenten des Magnetfeldes und errechnet den Betrag des gemessenen Magnetfeldes. Zusammen mit dem vorherigen Messwert kann man dann ermitteln, ob eine fallende Flanke vorliegt: Wenn der alte Messwerte einen Triggerlevel überschreitet, | Das Programm misst alle 500ms die 3 Komponenten des Magnetfeldes und errechnet den Betrag des gemessenen Magnetfeldes. Zusammen mit dem vorherigen Messwert kann man dann ermitteln, ob eine fallende Flanke vorliegt: Wenn der alte Messwerte einen Triggerlevel überschreitet, | ||
Zeile 14: | Zeile 14: | ||
=====Benötigte Komponenten===== | =====Benötigte Komponenten===== | ||
* HSCDTD008A mit BreakoutBox | * HSCDTD008A mit BreakoutBox | ||
- | * Halterung ([[https:// | + | * Halterung ([[https:// |
* HSCDTD008A Library ([[https:// | * HSCDTD008A Library ([[https:// | ||
* Binary (PoC) zum Zählen der Impulse | * Binary (PoC) zum Zählen der Impulse | ||
Zeile 27: | Zeile 27: | ||
- Die Platine des Sensors ist lediglich in die Halterung gesteckt. Das Kabel ist mit Kabelbindern an der Halterung befestigt. Das ist stabil genug. Man könnte den Sensor sicherlich zusätzlich in die Öffnung der Halterung einkleben, um ihn vor Umwelteinflüssen zu schützen | - Die Platine des Sensors ist lediglich in die Halterung gesteckt. Das Kabel ist mit Kabelbindern an der Halterung befestigt. Das ist stabil genug. Man könnte den Sensor sicherlich zusätzlich in die Öffnung der Halterung einkleben, um ihn vor Umwelteinflüssen zu schützen | ||
- | {{: | + | {{: |
- | {{: | + | {{: |
- | + | ||
- | {{: | + | |
- | + | ||
- | {{: | + | |
=====Software===== | =====Software===== | ||
Zeile 43: | Zeile 39: | ||
* Example5_Basics.cpp | * Example5_Basics.cpp | ||
* HSCDTD008A Library Demo | * HSCDTD008A Library Demo | ||
- | | + | * Tilman Glötzner |
* Original Creation Date: 2022-09-03 | * Original Creation Date: 2022-09-03 | ||
* | * | ||
Zeile 63: | Zeile 59: | ||
#include < | #include < | ||
#include < | #include < | ||
+ | |||
+ | #define NUMBABSENTRIES 3 | ||
// Create an instance of the sensor. | // Create an instance of the sensor. | ||
Zeile 71: | Zeile 69: | ||
hscdtd_status_t status; | hscdtd_status_t status; | ||
| | ||
+ | // | ||
// If you know the I2C address is different than in the provided | // If you know the I2C address is different than in the provided | ||
// data sheet. Uncomment the line below, and configure the address. | // data sheet. Uncomment the line below, and configure the address. | ||
Zeile 93: | Zeile 91: | ||
hscdtd_status_t status; | hscdtd_status_t status; | ||
sem_t mutex; | sem_t mutex; | ||
- | float bAbs = 0; | + | float bAbs[NUMBABSENTRIES]; |
- | float bAbsOld | + | int bAbsLastEntryIndex |
float lowLimit = 50; | float lowLimit = 50; | ||
float highLimit = 200; | float highLimit = 200; | ||
Zeile 100: | Zeile 98: | ||
unsigned long totalCounter = 0; | unsigned long totalCounter = 0; | ||
int stopFlag = 0; | int stopFlag = 0; | ||
+ | int daemonized = 0; | ||
+ | int verbose = 2; | ||
void* loop(void *ptr) | void* loop(void *ptr) | ||
{ | { | ||
- | // Explicitly start a reading. | + | int k; |
- | while (stopFlag == 0) | + | |
- | { | + | |
- | | + | |
- | for (i = 0; i < 2;i++) | + | memset(bAbs, 0, sizeof(float)); |
- | { | + | // Explicitly start a reading. |
- | status = geomag.startMeasurement(); | + | while (stopFlag |
- | | + | { |
- | if (status | + | |
- | { | + | |
- | bAbs = sqrt(pow(geomag.mag.mag_x, | + | |
- | pow(geomag.mag.mag_y, | + | |
- | pow(geomag.mag.mag_z, | + | |
- | + | ||
- | if (( bAbs < highLimit) && (abs(bAbsOld - bAbs)>0.001)) | + | |
- | | + | |
- | printf(" | + | |
- | geomag.mag.mag_x, | + | |
- | printf("; | + | |
- | } | + | |
- | // trigger on falling flank | + | |
- | if (((bAbs < lowLimit) && (bAbsOld > highLimit)) ) | + | |
- | { | + | |
- | sem_wait(& | + | |
- | counter++; | + | |
- | sem_post(& | + | |
- | totalCounter++; | + | status = geomag.startMeasurement(); |
+ | // If the status is OK then we can print the result. | ||
+ | if (status == HSCDTD_STAT_OK) | ||
+ | { | ||
+ | bAbs[bAbsLastEntryIndex] = sqrt(pow(geomag.mag.mag_x, | ||
+ | pow(geomag.mag.mag_y, | ||
+ | pow(geomag.mag.mag_z, | ||
- | printf(" | + | // weed out erroneous readings bAbs = 0 |
- | printf("; | + | if (bAbs[bAbsLastEntryIndex] == 0) |
+ | { | ||
+ | // | ||
- | | + | if (verbose >=2) |
- | bAbsOld | + | { |
- | | + | char c; |
- | | + | printf(" |
- | | + | printf(" |
- | + | geomag.mag.mag_x, | |
- | | + | for (k = 0 ; k < NUMBABSENTRIES; |
- | | + | { |
- | | + | |
+ | if (k == bAbsLastEntryIndex) | ||
+ | c = ' | ||
+ | else | ||
+ | c = ' '; | ||
+ | printf(" | ||
+ | } | ||
+ | printf("; | ||
+ | } | ||
+ | continue; | ||
+ | |||
+ | } | ||
+ | // trigger on falling flank. | ||
+ | // To prevent occassional missreadings (i.e. bAbs = 0) several measurements are used | ||
+ | // all new entries but the oldest need to be under the lower limit | ||
+ | // while the oldest entriey needs to be above the high limit | ||
+ | int trigger = 0; | ||
+ | int index = 0; | ||
+ | int mod = 0; | ||
+ | for (k=0; k < NUMBABSENTRIES; | ||
+ | { | ||
+ | mod = ((bAbsLastEntryIndex-k) % NUMBABSENTRIES); | ||
+ | index = mod >= 0 ? mod : NUMBABSENTRIES + mod ; | ||
+ | if (k< | ||
+ | { | ||
+ | if (bAbs[index] < lowLimit) | ||
+ | trigger++; | ||
+ | } | ||
+ | else | ||
+ | { | ||
+ | if (bAbs[index] > highLimit) | ||
+ | trigger++; | ||
+ | } | ||
+ | if (verbose >=3 ) | ||
+ | { | ||
+ | printf(" | ||
+ | } | ||
+ | } | ||
+ | |||
+ | |||
+ | if (trigger == NUMBABSENTRIES) | ||
+ | { | ||
+ | sem_wait(& | ||
+ | counter++; | ||
+ | sem_post(& | ||
+ | |||
+ | totalCounter++; | ||
+ | |||
+ | if (verbose >= 2) | ||
+ | { | ||
+ | printf(" | ||
+ | printf("; | ||
+ | |||
+ | char c; | ||
+ | for (k = 0 ; k < NUMBABSENTRIES; | ||
+ | { | ||
+ | if (k == bAbsLastEntryIndex) | ||
+ | c = ' | ||
+ | else | ||
+ | c = ' '; | ||
+ | printf(" | ||
+ | } | ||
+ | printf(" | ||
+ | } | ||
+ | } | ||
+ | bAbsLastEntryIndex = (bAbsLastEntryIndex + 1) % NUMBABSENTRIES; | ||
+ | } | ||
+ | else | ||
+ | { | ||
+ | if (verbose >= 1) | ||
+ | { | ||
+ | printf(" | ||
+ | } | ||
+ | stopFlag = 1; | ||
+ | // | ||
+ | } | ||
+ | |||
+ | // Wait 500ms before reading the next sample. | ||
+ | usleep(500000); | ||
- | // Wait 500ms before reading the next sample. | ||
- | usleep(500000); | ||
- | } | ||
} | } | ||
return NULL; | return NULL; | ||
} | } | ||
- | |||
int main(int argc, char** argv) | int main(int argc, char** argv) | ||
{ | { | ||
+ | |||
| | ||
Zeile 210: | Zeile 271: | ||
} | } | ||
+ | |||
+ | |||
+ | |||
+ | |||
hardware/controllers/bk-g4m_lesekopf.1665584993.txt.gz · Zuletzt geändert: 2022/10/12 16:29 von jau