Forum: Mikrocontroller und Digitale Elektronik handbedienter Drehgeber Signal erzeugen


von brettleherbert (Gast)


Lesenswert?

Hallo liebe Bastlergemeinde,

nach nun einigen Spielereien mit einem ESP8266, habe ich mir ein erstes 
funktionelles Ziel gesetzt. Entsprechend den Beiträgen: 
https://abtlog.wordpress.com/2016/03/07/heizungsthermostatsteuerung-mit-esp8266-fuer-unter-5-eur/#comment-752

und den genaueren Ausführungen bei:

https://github.com/coolibre/thermomat/tree/master/thermomat_device

möchte ich das Signal des Drehgebers des Heizungsthermostates (in meinem 
Fall: 
https://www.amazon.de/Heizk%C3%B6rper-Thermostat-SPARmatic-basic/dp/B001L2KNQC) 
mit dem ESP8266 erzeugen, um dem Thermostat eine Einstellung an dem 
Handrad vorzugaukeln.

Leider stoße ich hierbei schon schnell an meine persönlichen Grenzen. 
Die Programmierung entspr. 
https://github.com/coolibre/thermomat/tree/master/thermomat_device/test 
funktioniert nur insoweit, dass das Signal der Rechtsdrehung von dem 
Thermostat als solches erkannt wird. Die entsprechenden Linksdrehungen 
hingegen nicht. Nach einigen Spielereien und Versuchen mit anderen 
Ansätzen u.a. entsprechend diesem Beitrag 
https://electronics.stackexchange.com/questions/359397/generate-rotary-encoder-signal 
sowie der Erläuterung von Internetding unter diesem Beitrag: 
https://abtlog.wordpress.com/2016/03/07/heizungsthermostatsteuerung-mit-esp8266-fuer-unter-5-eur/#comment-752 
gehen mir langsam die Ideen aus, woran mein Scheitern liegt. Ich habe 
bereits die Ansteuerung der drei Pins des Drehgebers getauscht, da 
entspr. allgemeiner Artikel, welche ich zu den Drehgebern gelesen habe 
u.a. auch hier: https://www.mikrocontroller.net/articles/Drehgeber nicht 
zwangsläufig der Mittlere Pin stets auf Masse gezogen wird.

Wo liegt mein Fehler?
Zur weiteren Untersuchung steht mir leider nur ein einfacher Multimeter 
zur Verfügung. Ich bitte die ggf. etwas technisch unpräzise 
Ausdrucksweise zu entschuldigen, ich bin noch nicht ganz in dieser 
Sphäre angekommen.

Vielen Dank schon vorab für eure und Ihre Mithilfe!

LG brettleherbert

von Wolfgang (Gast)


Lesenswert?

brettleherbert schrieb:
> Zur weiteren Untersuchung steht mir leider nur ein einfacher Multimeter
> zur Verfügung.

Dann schließ an die Pulsausgänge LEDs an (über Vorwiderstände) und gibt 
die Signale so langsam aus, dass du die Pulse per Auge verfolgen kannst.

von Falk B. (falk)


Lesenswert?

brettleherbert schrieb:
> gehen mir langsam die Ideen aus, woran mein Scheitern liegt. Ich habe
> bereits die Ansteuerung der drei Pins des Drehgebers getauscht, da
> entspr. allgemeiner Artikel, welche ich zu den Drehgebern gelesen habe
> u.a. auch hier: https://www.mikrocontroller.net/articles/Drehgeber nicht
> zwangsläufig der Mittlere Pin stets auf Masse gezogen wird.

Lass den Drehgeber erstmal dran und miss mit dem Oszi oder Muultimeter. 
Dann siehst du, welcher Pin was wirklich macht.

Einen Drehgeber nachbilden ist einfach. Man muss nur den Gray-Code 
nachbilden, das ist ein einfaches Bitmuster mit 4 Schritten. Dazu gibt 
es auch ein Beispiel im Artikel Drehgeber.

Beitrag "Re: Signal für Drehsignalgeber erzeugen"

von brettleherbert (Gast)


Lesenswert?

Wolfgang schrieb:
> Dann schließ an die Pulsausgänge LEDs an (über Vorwiderstände) und gibt
> die Signale so langsam aus, dass du die Pulse per Auge verfolgen kannst.

Um damit prüfen zu können, ob etwas an der Ausgabe meines Programmes 
nicht stimmt? Dann organisiere ich mir mal LEDs und Widerstände. Wie 
groß sollte denn der verwendete Widerstand sein?

Falk B. schrieb:
> Lass den Drehgeber erstmal dran und miss mit dem Oszi oder Muultimeter.
> Dann siehst du, welcher Pin was wirklich macht.

Inwiefern kann ich mit dem Multimeter messen, was welcher Ausgang macht?

Falk B. schrieb:
> Einen Drehgeber nachbilden ist einfach. Man muss nur den Gray-Code
> nachbilden, das ist ein einfaches Bitmuster mit 4 Schritten. Dazu gibt
> es auch ein Beispiel im Artikel Drehgeber.

Betreffen die in diesem Beitrag genannten Programme nicht nur das 
Auslesen der Drehgebersignale?

Falk B. schrieb:
> Beitrag "Re: Signal für Drehsignalgeber erzeugen"

Ich muss gestehen, diese Programmierung übersteigt meine bisherigen 
Lesekünste der Programmiersprache.

Müsste es nicht auch mit dieser recht simplen Steuerung funktionieren? 
Für die eine Richtung:
1
 
2
#define DLY 4167
3
#define PIN1 5
4
#define PIN2 4
5
6
void setup() {
7
pinMode(PIN1, OUTPUT);
8
pinMode(PIN2, OUTPUT);
9
digitalWrite(PIN1, LOW);
10
digitalWrite(PIN2, LOW);
11
}
12
13
void loop() {
14
  delayMicroseconds(DLY); 
15
  digitalWrite(PIN1, HIGH);
16
  delayMicroseconds(DLY); 
17
  digitalWrite(PIN2, HIGH);
18
  delayMicroseconds(DLY); 
19
  digitalWrite(PIN1, LOW);
20
  delayMicroseconds(DLY); 
21
  digitalWrite(PIN2, LOW);
22
  }
Und für die entgegengesetzte Drehrichtung: ?
1
#define DLY 4167
2
#define PIN1 5
3
#define PIN2 4
4
5
void setup() {
6
pinMode(PIN1, OUTPUT);
7
pinMode(PIN2, OUTPUT);
8
digitalWrite(PIN1, LOW);
9
digitalWrite(PIN2, LOW);
10
}
11
12
void loop() {
13
  delayMicroseconds(DLY); 
14
  digitalWrite(PIN1, HIGH);
15
  delayMicroseconds(DLY); 
16
  digitalWrite(PIN2, LOW);
17
  delayMicroseconds(DLY); 
18
  digitalWrite(PIN1, LOW);
19
  delayMicroseconds(DLY); 
20
  digitalWrite(PIN2, HIGH);
21
  }

von Falk B. (falk)


Lesenswert?

brettleherbert schrieb:
>> Lass den Drehgeber erstmal dran und miss mit dem Oszi oder Muultimeter.
>> Dann siehst du, welcher Pin was wirklich macht.
>
> Inwiefern kann ich mit dem Multimeter messen, was welcher Ausgang macht?

Ja wie wohl? Man misst die Spannung an den drei Pins in bezg auf Masse. 
2 der Pins wackeln, wenn man den Drehgeber langsam dreht, die Masse am 
Drehgeber bleibt immer bei 0V. So kannst du sicher die Masse erkennen.

>> Beitrag "Re: Signal für Drehsignalgeber erzeugen"
>
> Ich muss gestehen, diese Programmierung übersteigt meine bisherigen
> Lesekünste der Programmiersprache.

Tja, das ist ein Problem.

> Müsste es nicht auch mit dieser recht simplen Steuerung funktionieren?

Ja, aber viel zu schnell!!! Das ist doch kein Maschinenencoder! Hier 
brauchen wir keine Mikrosekunden, eher viele Millisekunden.

> Und für die entgegengesetzte Drehrichtung: ?

Ok, du bist ein totaler Anfänger. Drum laß dirgesagt sein, daß man sowas 
mit einer Funktion macht, der man als Parameter die Richtung gibt. Sonst 
wird die praktische Anwendung extrem unhandlich bis unmöglich. Eher so.
1
#define STEP_TIME 10   //ms
2
3
void encoder(uint16_t steps, bool direction) {
4
  static uint8_t state;
5
6
  for(; steps > 0; steps--) {
7
    if (direction) state++; else state--;
8
    state &= 3;  // Überlauf für 2 Bit Zähler
9
    switch (state) {
10
      case 0: digitalWrite(PIN1, LOW);  digitalWrite(PIN2, LOW); break;
11
      case 1: digitalWrite(PIN1, HIGH); digitalWrite(PIN2, LOW); break;
12
      case 2: digitalWrite(PIN1, HIGH); digitalWrite(PIN2, HIGH); break;
13
      case 3: digitalWrite(PIN1, LOW);  digitalWrite(PIN2, HIGH); break;
14
    }
15
    delay(STEP_TIME);
16
  }
17
}

von brettleherbert (Gast)


Lesenswert?

Falk B. schrieb:
> Ja wie wohl? Man misst die Spannung an den drei Pins in bezg auf Masse.
> 2 der Pins wackeln, wenn man den Drehgeber langsam dreht, die Masse am
> Drehgeber bleibt immer bei 0V. So kannst du sicher die Masse erkennen.

Wunderbar. Das war des Rätsels Lösung. An dem 3. Pin lagen nicht 0V 
sondern dauerhaft 3V an.
Danke für den Input!

von Harald W. (wilhelms)


Lesenswert?

Falk B. schrieb:

> Einen Drehgeber nachbilden ist einfach. Man muss nur den Gray-Code
> nachbilden,

In meinem Thermostat war ein Drehgeber verbaut, der statt des Gray-
codes rein mechanisch Auf- und Abwärtszählimpulse lieferte. Man
sollte also vorher prüfen ob da wirklich Gray-Code rauskommt.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.