rokito troublemaker

troublemaker

bei uns in der agentur haben wir einen türöffner, der bei uns im netzwerk hängt. wenn es an der türe klingelt, können wir einfach auf ein kleines webinterface gehen, dort ein knöpfchen drücken und damit den türsummer ansteuern und so unsere besucher reinlassen. wenn dann mal stoßzeiten sind und man gefühlt sekündlich die leute zur tür reinlassen muss kann das schnell nervig werden. deshalb schaffe ich abhilfe und bauen den troublemaker türöffner. grundidee ist es, einen fetten buzzer zu haben, der beim draufhauen unseren türöffner anstößt. im idealfall sollte er auch autark funktionieren, ohne irgendwelche kabel, dann kann man ihn mitnehmen und an jedem ort in der agentur benutzen. zufälligerweise hatte ich noch einen spark core rumliegen, der kommt bereits mit integriertem wifi daher, perfekt. unser türöffner selbst ist auch nur ein arduino mit mehreren relais die über ein ethernet shield geschalten werden, das webinterface wird dabei auf dem arduino gehostet und ist über eine feste IP im lokalen netz erreichbar. es gibt dabei mehrere zustände (tür oben, tür unten, beide türen) die beim klick auf einen der türöffner buttons per request variable vom webinterface an den arduino host gesendet werden.

material

die einzelteile habe ich mir diesmal etwas umständlicher zusammensuchen müssen. insgesamt war der spaß mit ca 100€ etwas teuer, aber das endergebnis war mir das wert. zum ein und aus schalten wollte ich etwas besonderes, ich hatte bei voelkner diese schlüssel schalter gefunden, das fand ich sehr witzig.

vorbereitung

troublemaker

zuerst musste ich mir mal den spark genauer ansehen. die heißen neuerdings nicht mehr spark sondern particle, und der core heißt nicht mehr core sondern photon, aber im grunde ist das das selbe. beim bestellen bietet es sich an das starter kit zu bestellen, dann ist gleich ein micro usb kabel und ein hübsches breadbord dabei. und ein aufkleber – ich liebe aufkleber! man sollte nur drauf achten die version mit der chip antenne zu bestellen, denn es gibt da noch eine andere version bei der man eine externe antenne nutzen muss. das tolle beim core ist, dass er komplett über die particle cloud programmierbar ist, das heißt ich kann später den code auch aktualisieren und optimieren ohne das gehäuse aufschrauben zu müssen. geil! laut particle soll kann man den core (photon) einfach per iOS app konfigurieren, das hat bei mir nicht so gut geklappt. mein iPhone hat ihn zwar in meinem wlan erkannt, aber irgendwas haut da nicht hin oder ich bin zu dumm 😃 weitaus einfacher ist es den core einfach per kabel an den rechner zu hängen und dann per terminal einzurichten, das ist wirklich sehr einfach. man kann dabei bis zu sieben wifi netzwerke einspeichern, einmal eingerichtet verbindet sich der core immer von selbst mit einem der gemerkten netzwerke und dann kann es schon losgehen. hilfe beim einrichten bietet die ausführiche dokumentation bei particle. das wichtigste ist eigentlich, dass node js installiert ist, dann genügt ein wenig zauberei im terminal.

npm install -g particle-cli
particle setup

particle terminal

prototyp

die programmierung vom core passiert dann eigentlich nur noch über die particle cloud. als nächstes teste ich, wie ich den core als tcp client einrichte und get requests senden kann. im grunde will ich ja nur die gleiche url aufrufen, die unser webinterace zum türöffnen nutzt, sowas wie 192.168.1.123/?mode=oben... ich hatte dann etwas rumgesucht und schließlich eine tolle diskussion im spark forum gefunden. für den anfang teste ich mit einem einfachen aufbau bestehend aus spark und button. nach ein wenig rumprobieren hatte ich den spark soweit, dass er unsere tür öffnet.

TCPClient client;
byte server[] = {192,168,1,123};
client.connect(server, 80);
client.println("GET http://192.168.1.123/?mode=beide HTTP/1.0");

troublemaker troublemaker

dann erweitere ich den prototp um den schalter aus dem grobhandtaster (der-schlag-den-raab-style-buzzer) und um die batterien. ich hatte erst an einen 9V block gedacht, aber laut particle datasheet verträgt der core nur max. 6V. also musste ich umdenken und aufpassen dass im gehäuse noch genug platz übrig ist. also bleiben mir nur AAA batterien, dann aber gerne akkus, dann kann man den buzzer wenigstens wiederaufladen. rechnerisch geht es genau auf, ein akku hat 1.2V, macht insgesamt 4.8V, passt.

fertigung

witzigerweise passt alles auf den millimeter genau in das gehäuse vom grobhandtaster, als wäre es dafür gemacht 😃 der eigentliche taste hat drei mögliche positionen, ich setze ihn weit nach rechts um platz für das batteriefach zu schaffen. rechts und unten bohre ich das gehäuse auf um den schlüsselschalter und den wippschalter einzusetzen, hie muss ich nur drauf achten dass die kontakte nicht so sehr gequetscht werden oder andere leitende teile berühren. linkerhand ist noch so eine eigenartige stelle mit klemmschrauben, dort passt super der core rein, ich klemme ihn mit einem stück kabelbinder in den klemmschrauben ein. an der stelle der LED vom core bohre ich noch ein kleines loch und fülle das mit druchsichtigem heißkleber auf, dann sieht man später was der core im gehäuse macht, also ein perfekte statuslampe. alles zusammenlöten und dann auch gleich noch den finalen code auf den wippschalter anpassen, um die verschiedenen türöffner modi auswählen zu können.

core/photon VIN GND A1 A3 A5
batterien/netzteil + -
taster - +
wippschalter - + +

troublemaker

TCPClient client;
byte server[] = {192,168,1,123};

void setup() {

    pinMode(D7, OUTPUT);
    pinMode(A1, INPUT);
    pinMode(A3, INPUT); //u
    pinMode(A5, INPUT); //o

}

void loop() {

    if (analogRead(A1) == LOW) {

        digitalWrite(D7, HIGH);
        client.connect(server, 80);

        if (analogRead(A3) == LOW) {
            client.println("GET http://192.168.1.123/?mode=unten HTTP/1.0");
        }

        if (analogRead(A5) == LOW) {
            client.println("GET http://192.168.1.123/?mode=oben HTTP/1.0");
        }

        if (analogRead(A3) != LOW && analogRead(A5) != LOW) {
            client.println("GET http://192.168.1.123/?mode=beide HTTP/1.0");
        }

        client.println();
        delay(2000);
        client.stop();

    }

    digitalWrite(D7, LOW);

}

die wichtigsten zeilen im code sind die folgenden. ich hatte im testbetrieb festgestellt, dass der core nach mehrmaligem türöffnen die wlan verbindung verliert. offenabr waren dann irgendwie zu viele verbindungen offen oder so. aber offenbar hilft es, nach jedem get request einen delay einzusetzen und den client zu stoppen. durch den delay nimmt der buzzer nicht mehrmalige auslösungen nacheinander an, verhaspelt sich dadruch anscheinend weniger, und das stoppen des clients scheint allgemein sauberer zu sein.

delay(2000);
client.stop();

auch hier hatte sich im nachgang noch herausgestellt, dass der betrieb über batterien doch mehr energie verbraucht als ich erwartet hatte, die akkus waren nach einem halben tag dauerbetrieb leer. weil ich natürlich nicht zweimal am tag das gehäuse aufschrauben will um die batterien zu wechseln hab ich das gehäuse noch um eine netzteilbuchse erweitert, die habe ich aus etwas technikschrott ausgebaut, dazu gibts ein 5V netzteil. glücklicherweise hatte der schlüsselschalter zwei schaltpositionen, von denen ich bisher nur eine richtung für den batteriebetrieb gebraucht hatte. die andere richtung nutze ich jetzt einfach für den netzteilbetrieb. damit kann man sich entscheiden, ob der türöffner dauerhaft am platz bleibt, oder ob man ihm mit rumtragen möchte 😃

troublemaker troublemaker