Entries filed under Hardware

How to disable ACK with xbee-arduino API

Posted on 23. April 2014 Comments

It might be useful to disable all the ACK packages(0x8B) for testing purposes. That’s possible with all packages that inherit from XBeeRequest, my example shows a ZBTxRequest.

txRequest.setFrameId(NO_RESPONSE_FRAME_ID);

Mit Arduino und Android 434MHz Funk Steckdosen schalten

Posted on 10. April 2013 Comments

Schon lange wollte ich die Funksteckdosen wieder hervorräumen und mit meinem ebenfalls schon eingestaubten Arduino Uno (rev 3)und einem 434MHz Sender von watterot wieder in Gange bringen. Das Ganze gestaltet sich aufgrund der RCSwitch Library relativ einfach. Ich benutze hier im Gegensatz zum homecontrol4me-Projekt (mit kostenpflichtiger Android App) die Arduino IDE 1.0 aus den Ubuntu Repositories. Das hatte zur Folge, dass man den Beispielcode etwas anpassen muss. Dazu muss man aber auch sagen, dass ich hier keine Sicherheit eingebaut habe, jeder der die (interne) IP vom Arduino kennt, kann HTTP-Requests absenden und damit wild meine Geräte an- und ausschalten, NAT ist ja nicht wirklich ein Sicherheitsfeature.

Arduino

Sketch: Download (github)

Weil Arduino 1.0 die neuen libraries enthält muss für Server immer EthernetServer und für Client immer EthernetClient geschrieben werden. Ausserdem müssen die beiden Dateien EthernetServer.h und EthernetClient.h included werden. Am besten kann man das mit Strg+F(Suchen+Ersetzen) machen.

Die Funktion httpResponseHome() stellt die Website dar. Im Grunde bräuchte man das nicht, wenn man nur die Android App benutzen möchte.

 

Android

Android-Projekt für Eclipse: Download (github)screenshot-lichtsteuerung

Im Grunde muss man nur HTTP-Requests absetzen, die /?1-On usw. hinter der IP stehen haben. In Android dürfen keine langen Operationen, also hier Netzwerkverbindungen, in der MainActivity aufgebaut werden. Dafür habe ich die Klasse Network.java geschrieben, welche über einen AsyncTask Threads mit den HTTP-Requests startet. Weil sich das bei Lampen anbietet, habe ich ToggleButtons genommen. Diese haben das Attribut  android:onClick=“onToggleButton1Clicked“. Für jeden dieser Button habe ich eine entsprechende Methode in der mainActivity.java, die diesem Schema folgen. update: weil es manchmal hakte, hab ich eine loop eingebaut, die die Requests an die Network-Klasse drei mal sendet. Das löst zwar nicht das Problem(was immer es war), aber es funktioniert.

public void onToggleButton1Clicked(View v) {

boolean on = ((ToggleButton) v).isChecked();

        if (on) {
            loop(LICHT1ON);
        } else {
            loop(LICHT1OFF);
        }

 

In Requests.java finden sich ein Haufen Strings nach dem Schema:

public static final String IP = "http://192.168.1.42/";
public static final String LICHT1ON = IP + "?1-on";

Da ich den Code hier sehr simpel (und damit natürlich auch unsicher) gehalten habe, war’s das auch schon. Den Arduino und den Sender habe ich dann in eine Box hinter den Schrank gestellt und ein altes Netzteil zur Stromversorgung benutzt.

arduino-lichtsteuerung

Credits
Den Async Task Code habe ich (leicht editiert) von Konstantin Burov von stackoverflow.com.

Den Code für die ToggleButtons habe ich aus der Developer API von Google.

Der Arduino Code stammt überwiegend von RCSwitch aus der Datei /examples/Webserver/Webserver.pde. Ich habe die oben genannten Anpassungen an Arduino 1.0 vorgenommen, mal abgesehen von der Anpassung an meine Steckdosen.

Raspberry Pi als Kiosk mit resourcenschonendem Browser und VESA Mount

Posted on 22. März 2013 Comments

Auf der Arbeit sollte ich einen Raspberry Pi zu einem reinen Service-PC im Kiosk-Modus umwandeln. Dafür habe ich ein VESA kompatibles Gehäuse auf ebay gekauft, das man hinten an den Monitor schrauben kann. Über einen DVI-HDMI Adapter wird das Bild ausgeliefert, dazu noch eine Maus und Tastatur über USB und ein Netzwerkkabel. Anleitungen wie man Raspbian installiert gibt es schon genügend, also überspringe ich mal den ganzen Installations- und Konfigurationspart. An Browsern habe ich Chromium aufgrund des eingebauten Kiosk Modus ausprobiert und dann noch Midori, weil der vorinstalliert ist. Chromium hat schlicht zu viele Resourcen gefressen und Midori hat nicht das geboten, was ich wollte. Ich wollte einen Browser, der absolut idiotensicher nur diese eine Seite anzeigt, kein Adressfeld, kein Quelltext ansehen o.ä.Ich stieß dann irgendwann auf den kiosk-browser von Peter Schultz auf github. Im Grunde sind es nurIMG_20130322_155429

ein paar Zeilen C-Code, die ein Fenster mit GTK+ öffnet und darin ein WebKit-Widget lädt. Das ist übrigens dasselbe Framwork, das auch Chromium benutzt. Zusätzlich hat er noch 2 Signale auf Tasten auf dem Keyboard gemappt, eins für Aktualisieren(F5) und eins um den Vollbildmodus zu verlassenn(F11). Das Aktualisieren habe ich drin behalten, aber da ich keine Notwendigkeit sehe, den Vollbildmodus zu verlassen, diese Zeile Code einfach auskommentiert.
Dann habe ich natürlich noch die Standardwebsite geändert. Mit nodm(s.u.) machte er trotzdem Proleme also habe ich noch folgende Zeilen hinzugefügt um das Bild immer mittig zu halten und in der Größe meines Bildschirms darzustellen:

gtk_window_set_default_size(GTK_WINDOW(window), 1280, 1024);
gtk_window_set_position(GTK_WINDOW(window),GTK_WIN_POS_CENTER_ALWAYS);

Den vollen Quelltext findet ihr hier: browser-repat.c und aktuelle Versionen zuerst auf GitHub.

Auch die Makedatei hat bei mir nicht funktioniert, ich habe ein Haufen Fehler nach diesem Schema bekommen:

undefined reference to `gtk_XXX

Stattdessen funktionierte bei mir dieser Befehl:

gcc -o browser browser.c $(pkg-config --libs --cflags gtk+-2.0 webkit-1.0)

Schlussendlich habe ich noch xorg und nodm installiert um lightdm bzw. lxde (wegen den ganzen Tastenkombinationen) los zu werden. Dabei habe ich diese Anleitung von nexxylove befolgt.

Die browser-Datei wandert in /usr/local/bin und in ~/.xsession steht nur:

#!/bin/bash
/usr/local/bin/browser

Dann wird noch in /etc/X11/default-display-manager statt /usr/sbin/lightdm einfach /usr/sbin/nodm  eingetragen und in /etc/default/nodm der Wert NODM_ENABLED auf true gesetzt.

Bildschirmsignal über HDMI kappen

Posted on 19. Oktober 2012 Comments

Auf meiner Suche nach einer Möglichkeit Bildschirme Remote in den Standby Modus zu bringen habe ich die folgende Zwischenlösung gefunden. Diese Befehle beenden das HDMI Signal und die meisten Bildschirme bekommen dann eine Meldung à la „Kein Signal, Überprüfuen Sie die Stromversorgung des angeschlossenen Geräts sowie die Kabelverbindung und gewählte Signalquelle“(Samsung). Nach einer bestimmten Zeit fahren dann die meisten Monitore automatisch in den Standby Modus. Benutzen kann man hierfür das Programm tvservice.

Ausschalten war relativ einfach herauszufinden:

$ tvservice -o

Anschalten mit dem -p Parameter jedoch funktioniert zwar; also der Monitor erkennt, dass es ein HDMI Signal gibt, jedoch findet er den X-Server nicht. Normalerweise müsste man diesen entweder neustarten oder einfach direkt mit einem reboot das ganze Gerät. Stattdessen habe allerdings einen kleinen Workaround gefunden:

$tvservice -p

$sudo chvt 6

$sudo chvt 7

Mit chvt wechselt man die virtuellen Konsolen durch, standardmässig läuft auf 7 der X-Server. Man muss allerdings einmal vorher zu einem anderen, z.B. 6, wechseln.

Credits gehen an XavM und vor allem svelev vom raspberry-pi.org forum, sowie sysstem.at.

Drehbarer Stylus Touchscreen unter Ubuntu

Posted on 2. Oktober 2012 Comments

Ich habe hier einen Laptop mit drehbarem Bildschirm auf dem man mit einem Stfit/Stylus bedienen kann. Leider erkennt Ubuntu weder die Drehung noch die Hotkeys, die sich unter dem Monitor befinden. Zum drehen habe ich also 2 einfache Skripte geschrieben. Eigentlich gab es dafür ein eine gnome-shell-extension(xrandr-indicator), aber die funktioniert mit der neusten Version anscheinend nicht mehr. Hier sind also die einzelnen Befehle in den 2 Dateien rotate und rotate-back, denke die sind selbstsprechend.

Es reicht nicht(!), einfach nur mit xrandr den Bildschirm zu drehen, weil dann der Stift entgegengesetzt reagiert. Am besten legt man sich die beiden Dateien in /usr/local/bin ab und erstellt ein Shortcut auf dem Desktop. Wenn ich irgendwann mal Zeit finde, werd ich nochmal eine gnome-shell-extension dafür schreiben.

Eine Auflistung der verfügbaren Hardware mir ergab das folgende Ausgabe:

user@laptop:~$ xsetwacom --list dev
Wacom Serial Penabled 1FG Touchscreen stylus    id: 16    type: STYLUS
Wacom Serial Penabled 1FG Touchscreen eraser    id: 17    type: ERASER
Wacom Serial Penabled 1FG Touchscreen touch    id: 18    type: TOUCH

Die beiden Dateien:

user@laptop:~$ cat rotate
xsetwacom --set "Wacom Serial Penabled 1FG Touchscreen touch" rotate half
xsetwacom --set "Wacom Serial Penabled 1FG Touchscreen stylus" rotate half
xsetwacom --set "Wacom Serial Penabled 1FG Touchscreen eraser" rotate none
xrandr -o inverted
user@laptop:~$ cat rotate-back
xsetwacom --set "Wacom Serial Penabled 1FG Touchscreen touch" rotate none
xsetwacom --set "Wacom Serial Penabled 1FG Touchscreen stylus" rotate none
xsetwacom --set "Wacom Serial Penabled 1FG Touchscreen eraser" rotate none
xrandr -o normal

changers.com solarpanel unboxing und review

Posted on 9. Juli 2012 Comments

Ich habe mir neulich das Starter Kit von changers.com geholt: 1 Solarpanel und dazugehöriges Akkupack, welches mit ein bisschen exchangers.com 4th july specialtra-Hardware die Energiemenge misst, die man erzeugt. Die kann man dann per USB auf den Rechner übertragen und bei facebook und twitter hochladen. Da es ein Independence-Day Special gab, hab ich mal zugegriffen.

 

Unboxing-Videos gibts einige auf youtube, deswegen mach ich’s kurz:

  • 1 Solarpanel
  • 1 Akkupack
  • ein Haufen Adapter Kabel
  • 1 Micro USB Kabel zum Daten hochladen
  • 2 Saugnäpfe

Alles wie bestellt in 2 Pappkartons. Der Akku war etwas geladen, mein Handy lädt auch wunderbar da dran.

 

changers.com kit

 

 

 

 

 

 

Allerdings war es, wie so oft in letzter Zeit, etwas bewölkt und so funktionierte das Laden überhaupt nicht. Davon mal abgesehen, ist mein Schlafzimmer nachmittags auf der sonnenabgewandten Seite. Ich werde es morgen noch einmal probieren.

Hamburg

 

update: knappe 2 Jahre später kann ich sagen, dass mir das Ding auf einer Fahrradtour nach Schweden definitiv das Leben erleichtert hat, weil ich mein Smartphone doch mehr zur Navigation brauchte, als ursprünglich angenommen. Es nervt, dass man die Batterie im Zweifelsfall nicht über die Steckdose aufladen kann, gerade in Städten, in denen die Sonne weniger häufig scheint oder im Winter(update2: gibt es jetzt auch ein Netzteil für). Am besten kann ich es also auf Tour gebrauchen, vor allem die Größe gefällt mir. Wenn man nachts drinnen schläft, kann ich sonst für einen Bruchteil des Geldes den Lippenstift großen Akku von Anker empfehlen. Allerdings braucht er auch die ganze Nacht zum Aufladen.

changers.com software mobile-battery auf Ubuntu 11.10 64-Bit

Posted on 9. Juli 2012 Comments

Ich habe mir neulich schonmal die Software von changers.com angeguckt, einem kleinem berliner Start-Up, das Solarpanel und dazu passende Akkuspacks verkauft. Der Clou: ein bisschen Hardware in dem Akku misst, wieviel Energie erzeugt wurde und so kann man die Daten per USB übertragen und bei facebook/twitter hochladen.

Anyway, das .deb-Paket ließ sich erst nicht installieren, weil ein paar Abhängigkeiten fehlten. Ist ja auch kein Problem, das löst unter Ubuntu normalerweise ein

sudo apt-get install -f

Die Abhängigkeiten wurden installiert nur gab das auch diese Fehlermeldung:

E: Das Paket mobile-battery muss neu installiert werden, es kann jedoch kein Archiv dafür gefunden werden.

Dasselbe passierte wenn ich mit folgendem Befehl versucht habe, das Paket zu entfernen:

sudo apt-get remove mobile-battery

Wäre jetzt alles nicht so schlimm gewesen aber ich konnte weder über upgrade meine Programme auf dem aktuellen Stand halten noch über install neue installieren!

Eine Neuinstallation brachte mich dann auf den richtigen Weg:

repat@laptop:~/Downloads$ sudo dpkg -i changers_software_v274-1_amd64.deb
    (Lese Datenbank ... 473163 Dateien und Verzeichnisse sind derzeit installiert.)
    Vorbereitung zum Ersetzen von mobile-battery 1.0-274-1 (durch changers_software_v274-1_amd64.deb) ...
    Ersatz für mobile-battery wird entpackt ...
    /var/lib/dpkg/info/mobile-battery.postrm: Zeile 11: return: can only `return' from a function or sourced script
    dpkg: Warnung: Unterprozess altes post-removal-Skript gab den Fehlerwert 1 zurück
    dpkg - stattdessen wird Skript aus dem neuen Paket probiert ...
    /var/lib/dpkg/tmp.ci/postrm: Zeile 11: return: can only `return' from a function or sourced script
    dpkg: Fehler beim Bearbeiten von changers_software_v274-1_amd64.deb (--install):
     Unterprozess neues post-removal-Skript gab den Fehlerwert 1 zurück
    /var/lib/dpkg/tmp.ci/postrm: Zeile 11: return: can only `return' from a function or sourced script
    dpkg: Fehler beim Aufräumen:
    Unterprozess neues post-removal-Skript gab den Fehlerwert 1 zurück
    Trigger für bamfdaemon werden verarbeitet ...
    Rebuilding /usr/share/applications/bamf.index...
    Trigger für desktop-file-utils werden verarbeitet ...
    Trigger für gnome-menus werden verarbeitet ...
    Fehler traten auf beim Bearbeiten von:
    changers_software_v274-1_amd64.deb

Vor allem diese Zeile machte mich stutzig:

 /var/lib/dpkg/tmp.ci/postrm: Zeile 11: return: can only `return' from a function or sourced script

.deb-Pakete sind ja eigentlich auch eine Art Archive wie .zip oder .tar.gz. In diesen findet man 2 Ordner: DEBIAN und usr.Die beiden post-removal Skripts in .deb-Paketen heissen postrm und postinst. Man findet sie im DEBIAN-Ordner, wenn man das .deb-Paket man mit einem Archiv-Programm aufruft(z.B. File-Roller). postinst enthält in Zeile 18 und postrm in Zeile 11 (s.o.) tatsächlich ein return, was da anscheinend nicht ‚reingehört. Nun war das Problem, dass bei jeder neuen Installation, er die Skripte aus dem temporären Verzeichniss tmp.ci startet. Nach ein bisschen googeln stieß ich auf diesen Beitrag von bed von zockertown.de. Also habe ich in /var/lib/dpkg/info in den beiden Dateien die return-Zeile gelöst und dann ein

sudo apt-get install -f

ausgeführt. Das hat die Software dann runtergeschmießen. Ich habe den Support mal angeschrieben(ich hatte sie vorher auch schon über Twitter um Hilfe gebeten aber keine Antwort erhalten…), vielleicht fixen sie das ja mal. Bis dahin muss ich meine Daten wohl per Windows hochladen. Mein Solarpanel ist heute angekommen, unboxing folgt;-)

Sie haben allerdings beim Schreiben dieses Blog-Eintrags auf meine E-Mails geantwortet, mal sehen was das wird:-)

Arduino Ethernet Shield und LM35DZ Temperatursensor

Posted on 18. Mai 2012 Comments

Das ist ein Projekt was bei mir bestimmt schon 2 Jahre rumliegt. Vielleicht wird es auch noch erweitert.

Hardware
Einen Arduino bekommt man für knapp 25€ bei diversen Shops im Internet, im Laden hab ich sie bis jetzt nur überteuert als Paket bei Conrad gesehen. Das Ethernet Shield bekommt man auch für ~$10 bei ebay. Den LM35DZ Temperatursensor hab ich für ca. 4€ bei Conrad gekauft. Der Rest (Lötsachen, Kabel, Schrumpfschläuche) ist Zubehör, das hier so rumlag.
Gemäss dem Datenblatt habe ich den Temperatursensor über ein paar angelötete Kabel an das Breadboard aufgesteckt. Die Beinchen habe ich mit Schrumpfschläuchen versehen, damit sie nicht aus versehen gegeneinander kommen können. Ich überlege gerade noch es mit Heisskleber abzudichten, so dass der Sensor nach draussen kann.

Software
Ich setze ein bisschen Grundwissen der Programmierung voraus. Vor allem, wer C kann, sollte hier keine Schwierigkeiten haben. Ist auch nicht schwer. Es gibt 2 Funktionen, setup() und loop(), die entsprechend ihrem Namen genau das tun. Für fast alles hat schonmal jemand eine library geschrieben, man muss quasi nur noch den Bastelkasten nehmen und zusammenstecken. Für das Ethernet Shield gibt es natürlich eine library, die das im Grunde recht simpel macht. Man bindet einfach die libraries dafür ein:

#include <Ethernet.h>
#include <SPI.h>

und kann dann global mit

byte mac[] = {
0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED};
byte ip[] = {
192,168,1,5 };
byte gateway[] = {
192, 168, 1, 1};
byte dns[] = {
192, 168, 1, 1};
byte subnet[] = {
255, 255, 255, 0 };

die entsprechenden Optionen setzen. Am besten die IP-Adresse so wählen, dass man nicht mit dem DHCP Server korreliert. Dann kommt noch eine kurze Initialisierung:

Server server(80);

Nebenbei habe ich den input pin für die Temperatur gesetzt und eine globale Variabale dafür angelegt:

const int apin = A3;
float temperature;

In setup() wird dann mit folgenden Befehlen der Webserver gestartet:

Ethernet.begin(mac, ip, dns, gateway);
server.begin();

Hier setze ich die serielle Verbindung auf 9600 Baud und definiere den oben spezifierten Pin als INPUT:

Serial.begin(9600);
pinMode(apin,INPUT);

Als nächstes kommt loop(). Hier definier ich eine Variable in die der rohe Input gespeichert wird. Die rechnet man dann gemäß einer Formel um, die ich im Internet gefunden hab. Zum Test habe ich eine Ausgabe auf der seriellen Console eingestellt. Die findest man in der Arduino IDE unter Tools. Jenachdem ob man ihn an 3.3V oder an 5.0V anschliesst, ist die Formel natürlich anders.

int input = analogRead(apin);

temperature = (5.0 * input * 100.0)/1024.0;

Serial.print( "Temperature: ");
Serial.print(temperature);
Serial.print("\n");
delay(1000);

Damit der Code da jetzt ein bisschen übersichtlich bleibt habe ich eine Funktion namens listenForClients() geschrieben. Ich denke aus den Kommentare sollte klar werden, was hier passiert:

void listenForClients() {

  // Initialize client
  Client client = server.available();

  if (client) {
    // Message for debugging
    // Serial.println("Got a client");

    boolean currentLineIsBlank = true;

    while (client.connected()) {
      if (client.available()) {
        char c = client.read();

        if (c == '\n' && currentLineIsBlank) {

          // Tell the client the receiving data is HTML
          client.println("HTTP/1.1 200 OK");
          client.println("Content-Type: text/html");
          client.println();

          // This is the actual temperature value
	  // $deg; is the little round degree sign
          client.print("Temperature: ");
          client.print(temperature);
          client.print(" °C");

          break;
        }
        if (c == '\n') {
          // you're starting a new line
          currentLineIsBlank = true;
        }
        else if (c != '\r') {
          // you've gotten a character on the current line
          currentLineIsBlank = false;
        }
      }
    }

    // Give the web browser time to receive the data
    delay(1);

    // Close the connection:
    client.stop();
  }

Der Code ist überwiegend Copy-Pasta aus File/Examples/Ethernet/Webserver.

Hier gibts nochmal den Quelltext zum downloaden.

 

Fotos

(click to enlarge)

Foto Arduino Webserver LM35 Temperatursensor
Screenshot Arduino Webserver LM35 Temperatursensor

 

Links

Sprachausgabe im Menu beim Kindle ausstellen

Posted on 9. März 2012 Comments

Settings hat noch eine zweite Seite, die man mit den Pfeiltasten an der Seite erreicht und auf der man Text to Speech ausstellen kann, also nicht nur TTS für ein Buch sondern auch, dass er das Menü vorliest.

Alte Computer Luefter wiederverwenden

Posted on 16. Oktober 2010 Comments

Man braucht:

  • Multimeter, zum durchmessen der alten Batterie, die man irgendwo gefunden hat
  • 9V Blockbatterie
  • Heissklebepistole
  • Ein Stück Pappe
  • Langeweile

Optional:

  • 2 x AA Mignon Batterien
  • Schalter
  • Klebeband
  • Kabel

Das hier ist nur eine sehr einfache Ausführung, der Fantasie sind hier natürlich keine Grenzen gesetzt. Der Lüfter, den ich hier hab, brauch 12V, deswegen kann man mit ein bisschen Kabel noch 2 AA Batterien in Reihe(!) schalten, um die Spannung zu erhöhen, 8,XX Volt tun es aber auch schon als „Proof of concept“. Wer das alles etwas stabiler verkabeln will, dem wäre angeraten, sich so eine Kappe für 9V Batterien zu holen, keine Ahnung wie die heissen. Ich benutz das Teil jetzt grade, um meinen Dockstar zu kühlen, während er MongoDB(hoffentlich) kompiliert, der USB Stick ist schon etwas warm geworden;)

Hier ein paar Bilder von meinem Projekt, Zeitaufwand ca 15min(mit Vorwärmen von der Heissklebepistole):

Zubohoer Luefterbau

Heissklebepistole

Fertiger Luefter