Benutzer:Rdnzl/netio opto

Aus Ethersex_Wiki
Wechseln zu: Navigation, Suche

Net-IO schaltet ATX per Optokoppler

Oder: Resetbox für Arme.

Die Aufgabe ist mehrere Computer in einem entfernten Raum über Netzwerk einzuschalten. Nachdem WakeOnLan kläglicht versagt hat und netzwerkfähige Steckdosenleisten scheinbar Müll oder richtig teuer sind: Hier meine Lösung mit Ethersex, einem Net-IO und ein wenig Kleinkram. Das Ganze funktioniert bestimmt auch ohne Optokoppler, ich wollte es aber galvanisch getrennt haben.

Schema

Die Beschaltung, beispielhaft für einen zu bedienenden Rechner. Ein Koppler ist zum Einschalten, der wird parallel zum PowerKnopf des Rechners angeklemmt, der zweite Koppler kommt an die PowerLed des Rechners und zeigt mittels einer LED den Zustand des Rechners optisch an, aber der eigentliche Zweck ist den Pin per Software abfragen zu können.

Opto netio.png

Kleiner Tipp: drehe LED4 um und schalte LED3 in Reihe zu R1. R3 entfällt. --Sven 22:46, 10. Jul. 2010 (UTC)

Danke. Ich hatte schon drüber nachgedacht wie ich das noch kompakter hinbekomme. Werd ich mal versuchen. Weitere Verbesserung wäre die beiden GND-Leitungen zum Rechner zusammenzufassen. Rdnzl 00:45, 11. Jul. 2010 (UTC)

Hardware

Oben

DSCN7449.JPG

Unten

DSCN7448.JPG


Pinning

pinning/named_pin/default - PortA komplett belegt:

PA0     INPUT    LOW        LED_1
PA1     OUTPUT   HIGH       PWR_1
PA2     INPUT    LOW        LED_2
PA3     OUTPUT   HIGH       PWR_2
PA4     INPUT    LOW        LED_3
PA5     OUTPUT   HIGH       PWR_3
PA6     INPUT    LOW        LED_4
PA7     OUTPUT   HIGH       PWR_4


Control6

Um ein ATX-Netzteil anzuschalten drückt man kurz auf den Power-Knopf des Rechners und lässt ihn dann wieder los. Dieses Verhalten soll in C6 nachgestellt werden:

uint8_t clear1 = 0;
uint8_t clear2 = 0;
uint8_t clear3 = 0;
uint8_t clear4 = 0;
uint8_t delay = 2;

CONTROL_START

    THREAD(delay_pin1)
        TIMER_START(t1)
        TIMER_WAIT(t1, delay)
        PIN_CLEAR(PWR_1);
        DEBUG("clear: 1")
        clear1 = 1;
    THREAD_END(delay_pin1)

    THREAD(delay_pin2)
        TIMER_START(t2)
        TIMER_WAIT(t2, delay)
        PIN_CLEAR(PWR_2);
        DEBUG("clear: 2")
        clear2 = 1;
    THREAD_END(delay_pin2)

    THREAD(delay_pin3)
        TIMER_START(t3)
        TIMER_WAIT(t3, delay)
        PIN_CLEAR(PWR_3);
        DEBUG("clear: 3")
        clear3 = 1;
    THREAD_END(delay_pin3)

    THREAD(delay_pin4)
        TIMER_START(t4)
        TIMER_WAIT(t4, delay)
        PIN_CLEAR(PWR_4);
        DEBUG("clear: 4")
        clear4 = 1;
    THREAD_END(delay_pin4)

    ON ( clear1 ) DO DEBUG("stop: 1") THREAD_STOP(delay_pin1) clear1 = 0; END
    ON ( clear2 ) DO DEBUG("stop: 2") THREAD_STOP(delay_pin2) clear2 = 0; END
    ON ( clear3 ) DO DEBUG("stop: 3") THREAD_STOP(delay_pin3) clear3 = 0; END
    ON ( clear4 ) DO DEBUG("stop: 4") THREAD_STOP(delay_pin4) clear4 = 0; END

    ON PIN_RISING(PWR_1) DO DEBUG("rising: 1") THREAD_RESTART(delay_pin1) END
    ON PIN_RISING(PWR_2) DO DEBUG("rising: 2") THREAD_RESTART(delay_pin2) END
    ON PIN_RISING(PWR_3) DO DEBUG("rising: 3") THREAD_RESTART(delay_pin3) END
    ON PIN_RISING(PWR_4) DO DEBUG("rising: 4") THREAD_RESTART(delay_pin4) END

CONTROL_END

Geht vielleicht noch eleganter, aber es funktioniert soweit.

Screenshot Named Pins

So schaut das dann im Webinterface aus:

Named pins.png