Krautkanal.com

Veröffentlicht am 2016-06-29 17:05:31 in /t/

/t/ 30263: Einfache Elektrotechnik und Arduino

devankoshal Avatar
devankoshal:#30263

Hallo /t/,
ich habe bei meinem Arduino Projekt einen Schalter, der sehr weit weg ist, aus Faulheit mit dem eingebautem pullup Wiederstand verschaltet. Ich bekomme durch elektromagnetische Felder Störungen auf meinem Signal.
Kann ich die Störungen beheben, wenn ich das ganze als pulldown Schaltung baue?
Gibt es noch bessere Lösungen für den Anschluss eines sehr weit entferntem Schalters?

LG guter Informatiker

oscarowusu Avatar
oscarowusu:#30264

Schonmal was von "Entprellung" gehört?

vj_demien Avatar
vj_demien:#30265

>>30264
Mache ich Software seitig schon. Habe es zurzeit so eingestellt, das der schalter 100ms geschlossen sein muss, damit es schaltet. Möchte nicht deutlich höher gehen, da die Reaktionsfähigkeit leidet.

davidsasda Avatar
davidsasda:#30267

>>30265
Ja klar, Softwareseitig. Hardwareseitig muss man nur gucken, dass Über- und Unterspannungen ordentlich abgeleitet werden können (Freilaufdioden, sind aber im Controller meist schon mit drin, brauchst du dir keine Sorgen machen).

Wie genau sieh denn dein Entprellalgorithmus aus? 100 ms ist nämlich schon arg lange. Also wenn du da wirklich Störungen hast, die die Leitung durchgängig für 100 ms auf LOW oder HIGH ziehen, dann muss das HAARP sein oder so, was du dir da einfängst.

Entprellst du in beide Richtungen? Also bei jedem Zustandswechsel? Ich arbeite zum Beispiel ganz gerne mit Zählern:
In Zustand A wird Zähler X immer auf 100 gesetzt, wenn der Taster offen ist. Wenn der Taster geschlossen ist, wird der Zähler runtergezählt. Wenn man bei Null ankommt, wird Zustand B eingenommen.
In Zustand B wird Zähler X immer auf 100 gesetzt, wenn der Taster geschlossen ist . Ist der Taster geöffnet, wird der Zähler runtergezählt. Wenn man bei Null ankommt, wird Zustand A eingenommen.
Den Zustandsautomaten rufst du jede Milisekunde einmal auf.

Wenn du es (schon) so machst, und immernoch Probleme mit Rauschen hast, solltest du das "Rauschen" gleichrichten und damit dein Fahrrad betreiben oder deine Lauerkiste.

enjoythetau Avatar
enjoythetau:#30268

>>30267
Ich habe nichts dazu gefunden, ob der atmega328p Freilaufdioden verbaut hat.

Es wir abgefragt, ob sich der Zustand seit der letzten Abfrage geändert hat, falls ja, wird in eine Variable die Laufzeit geschrieben.
Wenn der Schalter geschlossen ist und 100ms seit der letzten Veränderung vergangen sind wird der Klick gestartet.
Wenn der Schalter geöffnet ist und ein klick gestartet wurde und 100ms seit der letzten Veränderung vergangen sind wird der klick ausgeführt.
Zudem wird noch erkannt, ob der Schalter gedrückt und gehalten wird.
kannst dir mal den Quelltext anschauen http://pastebin.com/05EjLhXi

maiklam Avatar
maiklam:#30269

>>30268
der Quelltest ist die Klasse für die Buttons. 1mal pro loop wird update() ausgeführt

snowshade Avatar
snowshade:#30270

>>30269
> Klasse
Ach Bernd, du benutzt objektorientierte Programmierung für einen beschissenen 8-Bit Mikrocontroller und wunderst dich, wenn irgendwas nicht geht?


Button::Button(int pin){
    pinMode(pin,INPUT);
    digitalWrite(pin,HIGH);
    _pin = pin;
    lastDebounce = 0;
    oldstate = HIGH;
    clickStart = -1;
    clickEnded = true;
    longclicked = false;
}


Was zum Fick soll das sein? Ist mir echt zu hoch. Warum machst du nicht einfach eine simple Struktur aus Timer und Zustand? Zum Beispiel:


enum BUTTON_STATES
{
    UNDEFINIERT =  0,
    AUS = 1,
    LANGE_AUS = 2,
    AN = 3,
    LANGE_AN = 4
};


typedef struct{
        enum BUTTON_STATES button_state:8 ;  // Zustand des Schalters; Anzahl Bits explizit angegeben
        UNS_8 button_debounce ;              // Zum Entprellen
        UNS_16 button_timer;                  // Um Langklicks zu erkennen
}t_button;               //
 
}


Du brauchst dir nur meine Header-Datei ansehen und weisst im Grunde schon, wie der Code aussieht und was der macht (eine switch-Struktur mit entsprechenden Abfragen um von einem in den anderen Zustand zu wechseln). Sehr simpel und selbsterklärend. Bei dir müsste ich erst stundenlang darüber meditieren was wie gemeint sein könnte, durch die ganzen if-then-else-dinger mit fragwürdiger Klammersetzung (lieber zu viel Klammern als zu wenig) wursteln, es am besten live ausprobieren und bei mir klappt es dann, weil die Variablen, die du nicht als volatile definiert hast, bei mir (im Gegensatz zu dir) nicht überschrieben werden, weil in meinem Controller wirklich nur der Button läuft.

Den Button deklarierst du dir dann als volatile in der Main und kannst dann super damit arbeiten:

volatile t_button roter_schalter ;
[...]
    schalterabfrage();  // Da wird dein Schalter abgefragt
    if ((roter_schalter.button_state == AN)||(roter_schalter.button_state == LANGE_AN)){
    gashahn_aufdrehen();
    }
    else{
    gashahn_zudrehen()
    }


So einfach ist das!

ryanmclaughlin Avatar
ryanmclaughlin:#30272

>>30268
>Freilaufdioden
Da geht es um die "Körperdioden", die sich durch die Fertigung ergeben (und kaum explizit erwähnt werden weil die Eigenschaften undefiniert sein können) oft werden sie auch als ESD-Schutz benutzt (also Über/Unterspannung im Prinzip). Dave Jones zeigt und erklärt das hier: https://youtu.be/2yFh7Vv0Paw

Neuste Fäden in diesem Brett: