Der Hall-Sensor

Handbücher zur Programmiersprache. Kleine übersichtliche Programme, die gut Dokumentiert sind. u.v.m.
Benutzeravatar
Admin
Administrator
Beiträge: 1196
Registriert: Mo 20. Apr 2020, 09:47
Wohnort: 82441 Ohlstadt
Kontaktdaten:

Re: Der Hall-Sensor

Beitrag von Admin »

Nochmal zusammenfassend.
Für die, die nicht gerne Löten und sicher sein wollen, dass sie analog die Entfernung bestimmen können, auf die sie reagieren wollen, habe ich diese hier. Die habe ich mir auch bestellt. Für die, denen noch nicht klar ist welche Möglichkeiten es gibt.

1. Digitale Sensoren (3144), wo man die Reaktion auf die Annäherung eines Magnetes nicht bestimmen kann. und nur ein Digitales HIGH/ LOW bekommt.
2. Analoge Sensoren (49E), wo man bestimmen kann, wie weit man den Magneten kommen lässt, bis zur Reaktion. Da hat man ein Analoges Signal 0 bis 5 Volt, je nach Nähe dess Magneten.
3. Analoger Sensor (49E), wo man einen Ausgang hat wie bei 2. aber auch einen Ausgang wie bei 1. Leider muss man da offenbar aufpassen dass man einen Funktionierenden bekommen, meine waren die falschen, die hatten einen (3144 Sensor), also für die Tonne. Beim Reichelt habe ich die gesehen. Die habe ich soeben bekommen und sind der selbe Müll, wie die, die ich schon hatte. Auch mit dem Digitalen Sensor 3144 bestückt.

1 und 2 bekommt man auf Platine, aber auch einfach zum selber einlöten. Jeder wie er will.
3 ist immer eine Platine, weil man da einen Sensor (49E), ein IC (LM393) zum umsetzen des Analogen Signales auf ein Digitales Signal und ein Poti zum einstellen der Empfindlichkeit braucht. Hier die Schaltung dieses regelbaren Hall-Sensors, mit dem SS49E Sensor.
.
Hallsensor_regelbare Empfindlichkeit.jpeg
Hallsensor_regelbare Empfindlichkeit.jpeg (73.83 KiB) 779 mal betrachtet
Diese Sensoren sind alle auf dem Weg zu mir, weil ich gerne immer den verwende, der für seine Aufgabe am besten geeignet ist.Den Digitalen hatte ich ja schon erwähnt, für den sehe ich im Moment eher keinerlei Verwendung. Aber die beiden Analogen sind in meinen Augen wünschenswert und sinnvoll. Die Platine, weil ich damit die Empfindlichkeit Hardwaremässig am Poti ohne Programm Änderung anpassen kann, der reine analoge Sensor, ist platzsparend, aber die Empfindlichkeit muss im Programm angepasst werden und man muss ein bischen mit dem Lötkolben umgehen können. Wie gut das funktioniert, wird sich zeigen, wenn ich die Dinger am Tisch habe.
Benutzeravatar
Admin
Administrator
Beiträge: 1196
Registriert: Mo 20. Apr 2020, 09:47
Wohnort: 82441 Ohlstadt
Kontaktdaten:

Re: Der Hall-Sensor

Beitrag von Admin »

Wer aber auch ein wenig mit dem Lötkolben umgehen kann, sollte sich vielleicht diese HallSensoren hier besorgen. Der ist Analog, man bekommt als Signal bei Annäherung eines Magneten ein DC Spannugnssignal, das in der Höhe je nach Nähe des Magneten am Sensor ausfällt. Wenn ich diese Dinger habe, ich glaube Ende Januar, dann teste ich das noch aus, und berichte noch darüber.

Es geht bitte nicht um die Lieferanten, die ich hier verlinke, die soll sich jeder selber suchen und bestimmen. Ich bekomme kein Geld, egal was ich hier empfehle!! Ich mache diese Seite ohne jedes Interesse an finaziellen Zuwendungen. Leider muss man das ind er Heutigen Zeit immer mal wieder deutlich sagen, weil unser Vortänzer aus der Politik ein korrupter Haufen ist, der uns was anderes vormacht. Ganz im Gegenteil, dieser Platz am Server kostet Geld, mein Geld. Aber das zählt nicht, ich hoffe damit eine kleine Runde aufbauen zu können, die die selben Interessen hat. Miteinander Basteln finde ich interessanter als alleine. Und ich habe auch nicht das Bedürfnis den großen Buana zu spielen, dazu weiß ich viel zu wenig. Es macht einfach nur mehr Spass am selben Seilende zu ziehen, als gegeneinander.

Servus
Franz
Benutzeravatar
Admin
Administrator
Beiträge: 1196
Registriert: Mo 20. Apr 2020, 09:47
Wohnort: 82441 Ohlstadt
Kontaktdaten:

Re: Der Hall-Sensor

Beitrag von Admin »

Ich habe hier mal das Programm, mit dem ich die Digtalen und die Analogen Hall_Sensoren teste.
Zwei Digtale Anschlüße, ich nenne sie Digisensor01 und Digisensor02, einer Plus aktiv, einer Minus aktiv und der Analoge wird im Display als Wert ausgegeben.

Code: Alles auswählen

//########################################
/*
 * Test für Anlaog und Digtal HallSensor
 * Magnet links herun 165 - 490
 * Kein Magnet = 492 - 493
 * Magnet rechts herum 495 - 875
 */
//########################################
// Timer DS3231 einrichten
#include "Wire.h"
#define DS3231_ADDRESSE 0x68
// LCD Display I2C 4 Zeilen je 20 Zeichen einrichten
#include <LiquidCrystal_I2C.h> // LCD Display
// Displayadresse ist 0x27 oder 0x3F
LiquidCrystal_I2C lcd(0x27, 20, 4);

// Baudrate fuer Serial Schnittstelle
const int baudSerial = 9600;
//-----------------------Hallsensor Digital 1---------------------------
// const byte ist im Programm Constant und byte ist fuer Werte 0-255
const byte Digisensor01 = 8;           // Pin 15 wird Constant als Taster01 bezeichnet
byte Sensorstatus01 = 0;            // Zum Abfragen des Tatsenpins
//-----------------------Hallsensor Digital 2---------------------------
const byte Digisensor02 = 13;           // Pin 15 wird Constant als Taster02 bezeichnet
byte Sensorstatus02 = 0;            // Zum Abfragen des Tatsenpins
//-----------------------Hallsensor Analog A1---------------------------
const byte ANALOG_PIN = A1; // Hier wird der Name fuer den Steuereingang festgelegt
int a0 = 0;      // Der Speicher fuer den Analogwert
int a0alt = 0;   // Der Speicher fuer den alten Analogwert
//-------------------------Tonausgabe PIN 17-----------------------------
const byte tonPin = 17;
const int frequenz1 = 1000; // Ton für Sensor1
const int frequenz2 = 2000; // Ton für Sensor2
unsigned long tonZeit = 100;
//-------------------------Programmdurchlauf in Millis messen------------
unsigned long Startzeit = 0;
unsigned long Stoppzeit = 0;
//-------------------------Kontrolle ob eine Minute abgelaufen-----------
unsigned long minutenablauf = 0;
unsigned long eineminute = 60000;
//-------------------------Kontrolle ob halbe Sekunde abgelaufen-----------
unsigned long sekundenablauf = 0;
unsigned long einesekunde = 500;

//=============================================================================================================
void setup() {

  //I2C für DS3231 aktivieren
  Wire.begin();
  // Wenn die I2C Leitung länger ist, kann man den Tackt für den I2C Bus langsammer machen!!
  Wire.setClock(32000);

  // Serial Schnittstelle starten
  Serial.begin(baudSerial);

  // Wenn die Zeit gestellt werden muß
  // aktuelle Zeit        sek min std wt tag monat jahr
  // einstellenDS3231zeit(00, 37, 22, 6, 21,  01,  23);
  //-----------LCD Display Start----------------------------------------
  lcd.begin();
  lcd.backlight();
  lcd.clear();
  //-----------Display Maske erstellen----------------------------------
  zeigeZeit(); // Zeit ausgeben    // Zeile 1
  lcd.setCursor (0, 3);            // Zeile 4
  lcd.print (F("Naeherungswert "));
  lcd.setCursor (0, 1);            // Zeile 2
  lcd.print (F("Sensor Analog"));
  lcd.setCursor (0, 2);            // Zeile 2
  lcd.print (F("Sensor Digital"));
  //-----------Taster einrichten----------------------------------------
  pinMode(Digisensor01, INPUT);
  pinMode(Digisensor02, INPUT);
  //-----------Input Analog Pin bestimmen-------------------
  pinMode(ANALOG_PIN, INPUT);      // Eingang für Hall_Sensor Analog A1
  //--------------Ton Ausgabepin einrichten----------------------------
  pinMode(tonPin, OUTPUT);         // Pin 17 Lautsprecher
  //--------------Startzeit für Zeitausgabe----------------------------
  minutenablauf = millis();
}
//=============================================================================================================
void loop()
{
  Startzeit = micros();
  //-----------Zeit ausgeben von DS3231-----------------------------------
  if (millis() - minutenablauf >= eineminute) // Eine Minute abgelaufen?
  {
    zeigeZeit(); // Zeit ausgeben
    minutenablauf = millis();
  }
  //-------------------Hallsensor Analogwert Ausgabe----------------------
  if (millis() - sekundenablauf >= einesekunde)//Halbe Sekunde abgelaufen?
  {

    sekundenablauf = millis();

    //----------Analogen Eingang auslesen-----------------------------------
    a0 = analogRead (ANALOG_PIN);
    if ((a0 > a0alt + 2) || (a0 < a0alt - 2)) {
      lcd.setCursor (15, 3);                            // Zeile 4
      lcd.print (F("    "));
      lcd.setCursor (15, 3);
      lcd.print (a0);
      a0alt = a0;
    }
  }
  //-----------Digitalen Sensor01 HighAktiv abfragen--------------------------------------------
  Sensorstatus01 = digitalRead(Digisensor01);         // Pin von Sensor01 abfragen
  if (Sensorstatus01 == HIGH)
  {
    lcd.setCursor (15, 1);                        // Ins Display Zeile 2 schreiben
    lcd.print (Sensorstatus01);
    tone(tonPin, frequenz1, tonZeit);              // Bestätigungston für Sensorauslösung ausgeben
  }
  else
  {
    lcd.setCursor (15, 1);                        // Ins Display Zeile 2 schreiben
    lcd.print (Sensorstatus01);
  }

  //-----------Digitalen Sensor02 LowAktiv abfragen--------------------------------------------
  Sensorstatus02 = digitalRead(Digisensor02);         // Pin von Sensor02 abfragen
  if (Sensorstatus02 == LOW)
  {
    lcd.setCursor (15, 2);                        // Ins Display Zeile 3 schreiben
    lcd.print (Sensorstatus02);
    tone(tonPin, frequenz2, tonZeit);              // Bestätigungston für Sensorauslösung ausgeben
  }
  else
  {
    lcd.setCursor (15, 2);                        // Ins Display Zeile 3 schreiben
    lcd.print (Sensorstatus02);
  }

  // Zeitmessung für einen Programm Durchlauf und Ausgabe des Wertes
  // Mit Serial.print() sieht man die Laufzeiten des Programmes in MicroSekunden
  Stoppzeit = micros();
  //Serial.print("Laufzeit= ");
  //Serial.println(Stoppzeit - Startzeit);
}
//=======================Loop Ende==============================================================================
//---------------Erweiterung für die DS3132---------------------------------------------------------------------
void einstellenDS3231zeit(byte sekunde, byte minute, byte stunde, byte wochentag, byte tag, byte monat, byte jahr)
{
  // Datum und Uhrzeit einstellen
  Wire.beginTransmission(DS3231_ADDRESSE);
  Wire.write(0);
  Wire.write(decToBcd(sekunde)); // Sekunden einstellen
  Wire.write(decToBcd(minute)); // Minuten einstellen
  Wire.write(decToBcd(stunde));
  Wire.write(decToBcd(wochentag)); // 1=Sonntag ... 7=Samstag
  Wire.write(decToBcd(tag));
  Wire.write(decToBcd(monat));
  Wire.write(decToBcd(jahr)); // 0...99
  Wire.endTransmission();
}
//--------------------------Die Zeit auslesen------------------------------------------------------------------
// jede Minute etwa 5000 Microsekunden
void leseDS3231zeit(byte *sekunde, byte *minute, byte *stunde, byte *wochentag, byte *tag, byte *monat, byte *jahr)
{
  Wire.beginTransmission(DS3231_ADDRESSE);
  Wire.write(0); // DS3231 Register zu 00h
  Wire.endTransmission();
  Wire.requestFrom(DS3231_ADDRESSE, 7); // 7 Byte Daten vom DS3231 holen
  *sekunde = bcdToDec(Wire.read() & 0x7f);
  *minute = bcdToDec(Wire.read());
  *stunde = bcdToDec(Wire.read() & 0x3f);
  *wochentag = bcdToDec(Wire.read());
  *tag = bcdToDec(Wire.read());
  *monat = bcdToDec(Wire.read());
  *jahr = bcdToDec(Wire.read());
}
//---------------------------Die Zeit anzeigen----------------------------------------------------------------
// jede Minute etwa 15000 Microsekunden
void zeigeZeit() {
  byte sekunde, minute, stunde, wochentag, tag, monat, jahr, minuteAlt;
  leseDS3231zeit(&sekunde, &minute, &stunde, &wochentag, &tag, &monat, &jahr);   // Daten vom DS3231 holen
  if ((minute > minuteAlt) || (minute == 0)) {
    switch (wochentag) {
      case 1:
        lcd.setCursor(0, 0);
        lcd.print(F("Mo "));
        break;
      case 2:
        lcd.setCursor(0, 0);
        lcd.print(F("Di "));
        break;
      case 3:
        lcd.setCursor(0, 0);
        lcd.print(F("Mi "));
        break;
      case 4:
        lcd.setCursor(0, 0);
        lcd.print(F("Do "));
        break;
      case 5:
        lcd.setCursor(0, 0);
        lcd.print(F("Fr "));
        break;
      case 6:
        lcd.setCursor(0, 0);
        lcd.print(F("Sa "));
        break;
      case 7:
        lcd.setCursor(0, 0);
        lcd.print(F("So "));
        break;
      default:
        break;
    }
    if (tag < 10) {
      lcd.print(F("0"));
    }
    lcd.print(tag); // ausgeben T.M.J H:M:S
    lcd.print(F("."));
    if (monat < 10) {
      lcd.print(F("0"));
    }
    lcd.print(monat);
    lcd.print(F("."));
    lcd.print(jahr);
    lcd.print(F(" um "));
    if (stunde < 10) {
      lcd.print(F("0"));
    }
    lcd.print(stunde, DEC); // byte in Dezimal zur Ausgabe
    lcd.print(F(":"));
    if (minute < 10) {
      lcd.print("0");
    }
    lcd.print(minute, DEC);
    minuteAlt = minute;
    // Bestimmen wann wieder eine Minute um
    minutenablauf = millis();
    eineminute = (60 - sekunde) * 1000UL;
  }
}
byte decToBcd(byte val) {
  // Dezimal Zahl zu binary coded decimal (BCD) umwandeln
  return ((val / 10 * 16) + (val % 10));
}
byte bcdToDec(byte val) {
  // BCD (binary coded decimal) in Dezimal Zahl umwandeln
  return ((val / 16 * 10) + (val % 16));
}
Benutzeravatar
Admin
Administrator
Beiträge: 1196
Registriert: Mo 20. Apr 2020, 09:47
Wohnort: 82441 Ohlstadt
Kontaktdaten:

Re: Der Hall-Sensor

Beitrag von Admin »

Bei mir kam gerade eine Thema für die Verwendung des Analogen Sensors in einem Schachbrett auf. Da könnte man in jedes Feld am Brett einen Sensor einbauen, und dann in die 6 möglichen Figuren Magneten auf verschiedene Höhen über dem Brett einbauen. Schwarze und Weise Figuren könnte man durch die Polung des Magneten unterscheiden. Ob man 6 eindeutig unterscheidbare Magnet-Höhen hinbekommt, wäre zu prüfen. Aber ich glaube das bekommt man hin.
Dann könnte man z.B. das Spiel auf einer Speicherkarte mitschneiden und somit jederzeit Nachvollziehen.

Franz
Benutzeravatar
Admin
Administrator
Beiträge: 1196
Registriert: Mo 20. Apr 2020, 09:47
Wohnort: 82441 Ohlstadt
Kontaktdaten:

Re: Der Hall-Sensor

Beitrag von Admin »

Ich habe jetzt nicht mehr warten wollen, bis die Analogen Sensoren 49E zum Einlöten kommen. Deshlab habe ich einen 49E von seiner Platine ausgelötet und anstelle des 3144 Sensors auf der Analog/Digital Platiene eingelötet. OK, man kann damit die Empfindlichkeit des Digitalen Augangs einstellen. Also ob der Magnet erst bei 1cm Abstand vom Sensor regiert, oder schon bei 3cm. Also es ist damit dann von 1-3 cm justierbar. Allerdings ist die einstellspanne sehr gering. Also nicht mal annähnernd von 0 bis 1023, sondern von 533 für 3cm bis 557 für 1cm. Naja, aber jedenfalls macht das Ding was es soll, wenn man den Sensor 3144 runterschmeißt und einen 49E einlötet. Empfehlen kann ich es nicht.

Man kann aber einen 49E auch direkt an 5 Volt und einen Analogen Pin. des Arduinos anschließen, und durch die Abfrage des Analogen Einganges auf die Nähe des Magneten reagieren. Die Abstände sind vondeutlich unter 1cm bis 3cm und die Daten die man dabei auslesen kann, sind je nach polung des Magneten, 880 bis 520 und 180 bis 512. Ohne Magnet so um die 516. Diese Werte muss man aber bei jedem 49E-Sensor erneut auslesen, weil da jeder ein bischen anders reagiert.

Franz
Benutzeravatar
Admin
Administrator
Beiträge: 1196
Registriert: Mo 20. Apr 2020, 09:47
Wohnort: 82441 Ohlstadt
Kontaktdaten:

Re: Der Hall-Sensor

Beitrag von Admin »

Ich habe jetzt den 49E Sensor einfach so am Arduino angeschloßen, und habe dann zusätzlich ein 5K Poti auch an einem Analogen Pin angeschlossen. Also genau gesagt, den Sensor am Pin A1 und das Poti am Pin A0. Und eine kleines Programm drum herum. Wie immer versuche ich damit, den Leuten die sich noch in die Sensorik reinarbeiten müßen, spielerisch klar zu machen was damit möglich ist. Das Poti ist dafür da, um die Schaltschwelle des Sensors einzustellen. Der Sensor bringt über die A1 Schnittstelle den Wert, der aufzeigt wie weit weg oder nahe drann der Magnet am Sensor ist. Ausserdem kann der Sensor unterscheiden mit welchem Magnetpol du dich dem Sensor näherst. Ich habe das Programm so ausgeführt, dass du am Display siehst, mit welchem Pol sich der Magnet dem Sensor nähern. Wenn sich nichts tut, ist der Wert am Poti falsch eingestellt. Das Poti bestimmt, bei welchen Wert der Pipser los geht, der ein einfach kleiner Lautsprecher aus dem Telefon, oder aus nem kleinen Radio ist. unf vor den Lautsprecher wird ein Widerstand von 200-500 Ohm geschalten, dass der Ausgangspin des Arduinos nicht überlastet wird. Ich hatte auch schon 1000 Ohm davor, dann ist der Ton eben leiser. Hier ist mal das Programm, das ich benutze:

Code: Alles auswählen

//#######################################
/*
   Test für Anlaog und Digtal HallSensor
   Magnet links herun 175 - 510
   Kein Magnet = 511 - 520
   Magnet rechts herum 525 - 875
*/
//########################################
// LCD Display I2C 4 Zeilen je 20 Zeichen einrichten
#include <LiquidCrystal_I2C.h> // LCD Display
// Displayadresse ist 0x27 oder 0x3F
LiquidCrystal_I2C lcd(0x27, 20, 4);
//-----------------------Hallsensor Analog A1---------------------------
const byte Poti_PIN = A0;
const byte ANALOG_PIN = A1; // Hier wird der Name fuer den Steuereingang festgelegt
int a1 = 0;      // Der Speicher fuer den Analogwert
int a1alt = 0;   // Der Speicher fuer den alten Analogwert
int a0 = 0;      // Eingang für Potiwert
int a02 = 0;     // a0 Wert + nach "map" Bearbeitung
int a03 = 0;     // a0 Wert - nach "map" Bearbeitung
//-------------------------Tonausgabe PIN 17-----------------------------
const byte tonPin = 17;
const int frequenz1 = 1000; //Ton für Sensor1
const int frequenz2 = 2000; //Ton für Sensor2
unsigned long tonZeit = 100;
//-------------------------Kontrolle ob halbe Sekunde abgelaufen-----------
unsigned long sekundenablauf = 0;
unsigned long einesekunde = 500;

//=============================================================================================================
void setup()
{
  //-----------LCD Display Start----------------------------------------
  lcd.begin();
  lcd.backlight();
  lcd.clear();
  //-----------Display Maske erstellen----------------------------------
  lcd.setCursor (0, 0);            // Zeile 1
  lcd.print (F("Hall Sensor 49E A/D"));
  lcd.setCursor (0, 1);            // Zeile 2
  lcd.print (F("       Pot<->Sen"));
  lcd.setCursor (0, 2);            // Zeile 3
  lcd.print (F("Soll-"));
  lcd.setCursor (10, 2);            // Zeile 3
  lcd.print (F("<->"));
  lcd.setCursor (0, 3);             // Zeile 4
  lcd.print (F("Soll+"));
  lcd.setCursor (10, 3);            // Zeile 4
  lcd.print (F("<->"));
  //-----------Input Analog Pin bestimmen-------------------
  pinMode(ANALOG_PIN, INPUT);      // Eingang für Hall_Sensor Analog A1
  pinMode(Poti_PIN, INPUT);        // Potentiometer für vergleichstwert
  //--------------Ton Ausgabepin einrichten----------------------------
  pinMode(tonPin, OUTPUT);         // Pin 17 Lautsprecher
}
//=============================================================================================================
void loop()
{
  //-------------------Hallsensor Analogwert Ausgabe----------------------
  if (millis() - sekundenablauf >= einesekunde)//Halbe Sekunde abgelaufen?
  {
    sekundenablauf = millis();

    //----------Analogen Eingang auslesen-----------------------------------
    a1 = analogRead (ANALOG_PIN); // Analog Sensor auslesen
    a0 = analogRead (Poti_PIN);   // Poti auslesen
    if ((a1 > a1alt + 1) || (a1 < a1alt - 1)) // Hat sich der Sensor wert geändert?
    {
      lcd.setCursor (13, 3);                         // Sensor Display Zeile 4
      lcd.print (F("   "));
      lcd.setCursor (13, 3);
      lcd.print (a1);
      lcd.setCursor (13, 2);                         // Sensor Display Zeile 4
      lcd.print (F("   "));
      lcd.setCursor (13, 2);
      lcd.print (a1);
      a1alt = a1;
    }
    a02 = map(a0, 0, 1023, 875, 525);                //Potibereich=Sensorbereich+
    a03 = map(a0, 0, 1023, 175, 510);                //Potibereich=Sensorbereich+

    lcd.setCursor (7, 3);                            // Poti Display Zeile 4
    lcd.print (F("  "));
    lcd.setCursor (7, 3);
    lcd.print (a02);
    lcd.setCursor (7, 2);                            // Poti Display Zeile 4
    lcd.print (F("  "));
    lcd.setCursor (7, 2);
    lcd.print (a03);
    if (a1 > a02)                                   // Sensor größer Potiwert
    {
      tone(tonPin, frequenz1, tonZeit);
      lcd.setCursor (17, 3);            // Zeile 3
      lcd.print (F("###"));
    }
    else
    {
      lcd.setCursor (17, 3);            // Zeile 3
      lcd.print (F("   "));
    }
    if ((a1 > a03) && (a1 < 510))
    {
      tone(tonPin, frequenz2, tonZeit);
      lcd.setCursor (17, 2);            // Zeile 2
      lcd.print (F("###"));
    }
    else
    {
      lcd.setCursor (17, 2);            // Zeile 3
      lcd.print (F("   "));
    }
  }
}
//=======================Loop Ende==========================================================
Und hier die Schaltung dazu, dass ihr wisst wohin mit den Drähten. :(V):
.
Hallsensor mit Poti.JPG
Hallsensor mit Poti.JPG (386.57 KiB) 707 mal betrachtet
Benutzeravatar
Admin
Administrator
Beiträge: 1196
Registriert: Mo 20. Apr 2020, 09:47
Wohnort: 82441 Ohlstadt
Kontaktdaten:

Re: Der Hall-Sensor

Beitrag von Admin »

So, ich habe jetzt die 40 analogen HallSensoren 49E zum selber einlöten bekommen, und habe mit deren Hilfe diese 9 HallSensoren Analog/Digital umgebaut. Das heißt, ich habe den Digitalen Sensor 3144 ausgelötet und die Platine mit den richtigen 49E Sensoren bestückt. Dann habe ich alle 9 einzeln getestet und habe dabei festgestellt, dass bei den Platienen immer noch welche dabei sind, die mit dem 49E zwar laufen, aber funktionieren wäre übertrieben. Vier davon habe ich ausgemustert. Und auch die anderen, denke ich, werde ich nicht benutzen, weil sie zwar das tun, was sie sollen, und wenigstens eine Spanne von 0,5 bis 3cm einstellbar ist. Die 4 Stück die ich ausgesondert habe, machen so 1-2 cm einstellbar, die sind im Müll, aber die übrigen 5 lassen bei mir auch kein Vertrauen aufkommen. Aber wer weiß, vielleicht mache sie ja mal irgendwo Sinn. :roll:

Also rund herum, Diese Analog/Digital Platinen kann man sich in die Harre schmieren, die Digitalen 3144 sind ok, wenn es kein Problem ist, dass sie auf Entfernungen von 0mm bis etwar 3cm regieren und man das nicht eingrenzen muss, die Analogen 49E finde ich als einzige wirklich brauchbar, egal ob sie wie von AZ-Deliverie auf Platienen gelötet sind oder zum selber einlöten benutzt werden können. Die auf der Platine sind für die User, die den Lötkolben meiden eben dann die bessere Wahl. Diese Anlagen machen auch etwa 0,5 - 3cm und da sie an den Arduino je nach Nähe und Polung des Magneten verschiedene analoge Werte ausgeben, kann ich im Programm bestimmen, auf welche Nähe und auch noch Polung, ich reagieren will. Diese Dinger haben einen Mittelwert von etwa 500, wenn kein Magnet in der Nähe ist, und gehen mit dem Wert darüber und darunter, je nachdem, wie nah ein Magnet drann kommt, und mit welcher Seite des Magneten. Also ich kann z.B. auch auswerten, ob der Magnet von Links oder Rechts kommt.

Das wars wohl zu dem Thema.
Franz
Max
Beiträge: 78
Registriert: Di 27. Sep 2022, 17:37
Kontaktdaten:

Re: Der Hall-Sensor

Beitrag von Max »

Servus miteinander,

nun habe ich ein neues Anwendungsgebiet für Hall-Sensoren gefunden.
Schon seit Längerem hatte ich geplant einen Drehzahlmesser für meine
Eigenbau- Benzinmotoren zu bauen.
Nun hatte ich mal die Muse mich dieser Aufgabe zuzuwenden.
Als Sensor benutzte ich den KY-003, den Sensor habe ich ausgelötet und einzeln eingelötet.
Das Programm dazu habe ich im Internet gefunden und etwas mit der Anzeige angepasst.
Das zu messende Objekt (zB. Kurbelwelle, Propeller usw.) muß mit einem Magneten bestückt werden.
Ein Durchmesser von 5mm ist voll ausreichend. Man muß allerdings auf die Polarität des Magneten achten.
Einfach vor dem Aufkleben am Drehzahlmesser testen.
Mein Gerät funktioniert ganz gut, nur der Abstand zum Magneten muß ziemlich kurz sein.
Vielleicht gibt es da ev. bessere Sensoren, die da mehr Abstand zulassen?

Grüße Max
Dateianhänge
P1100291.JPG
P1100291.JPG (255.6 KiB) 630 mal betrachtet
P1100289.JPG
P1100289.JPG (280.08 KiB) 630 mal betrachtet
P1100287.JPG
P1100287.JPG (293.34 KiB) 630 mal betrachtet
Benutzeravatar
Admin
Administrator
Beiträge: 1196
Registriert: Mo 20. Apr 2020, 09:47
Wohnort: 82441 Ohlstadt
Kontaktdaten:

Re: Der Hall-Sensor

Beitrag von Admin »

Hallo Max.
Das ist der Digitale 3144 Sensor. Der macht so 2-3 cm. Auf der Sicheren Seite ist man wohl bei 2cm. Das sind die selbem, die ich bei Sonnen Verfolger zum Anfahren der Startposition verwende. Ich wüßte jetzt auch keinen Hallsensor der mehr macht. Ich weiß nur, wie ich den Abstand verkleinere. Einen größeren Abstand bekommt man wohl noch über die Stärke des Magneten, aber dann ist er auch schwerer. Aber die 2cm passt ja auch, denke ich. Hast du Grenzen des Programmes schon mal ausgelotet? Also bei welcher max. Drehzahl ist Schluß?. Gibts da, wo du das Programm gefunden hast vielleicht ne Info, bis zu welcher Drehzahl es sicher zählt?

Franz :(V):
Max
Beiträge: 78
Registriert: Di 27. Sep 2022, 17:37
Kontaktdaten:

Re: Der Hall-Sensor

Beitrag von Max »

Servus Franz,

getestet habe ich den Drehzahlmesser auch an einem DC-Motor, siehe Bild,
ob da noch mehr geht müsste ich mal an anderen Motoren testen. Für meine Zwecke,
nämlich meine Benzinmotoren, reicht es allemal.
Das OLED- Display ist gut ablesbar und die Zahlen flackern nicht.

Gruß
Max

Code: Alles auswählen

//Drehzahlmesser mit Hallsensor und OLED

#include <Arduino.h>
#include <U8g2lib.h>

#ifdef U8X8_HAVE_HW_SPI
#include <SPI.h>
#endif
#ifdef U8X8_HAVE_HW_I2C
#include <Wire.h>
#endif
U8G2_SSD1306_128X64_NONAME_F_SW_I2C u8g2(U8G2_R0, /* clock=*/ SCL, /* data=*/ SDA, /* reset=*/ U8X8_PIN_NONE);

byte DZM_InputPin = 2;
volatile unsigned long RPM_T2, RPM_Count;
unsigned long RPM , RPM_T1;

void setup() {
  u8g2.begin();
  pinMode(DZM_InputPin, INPUT_PULLUP);
  RPM_T1 = 0;
  RPM_T2 = 0;
  RPM_Count = 0;

  attachInterrupt(0, RPM_Meter, FALLING);    // Interrupt0 wird bei fallender Flanke auf Pin2

}

void loop() {
  char RPMStr[5];
  u8g2.clearBuffer();         // löschen des Interen Speicher
//  u8g2.setFont(u8g2_font_ncenB14_tr); // auswahl der Schriftart
  u8g2.setFont(u8g2_font_logisoso34_tf);
  if (RPM_T2 > RPM_T1) {
    RPM = (unsigned)(long)(60000 * RPM_Count / (RPM_T2 - RPM_T1));
    RPM_T1 = RPM_T2;
    RPM_Count = 0;
  }
  else {
    RPM = 0;
  } 
  sprintf(RPMStr, "%4u", RPM);
  u8g2.drawStr(0, 40, RPMStr);
  u8g2.sendBuffer();
}

void RPM_Meter () {

  RPM_Count++;
  RPM_T2 = millis();

}
Dateianhänge
IMG_20230130_165905_682.jpg
IMG_20230130_165905_682.jpg (312.55 KiB) 614 mal betrachtet
Antworten

Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 2 Gäste