Wecker powered by Linux

Klassischer mechanischer Wecker

Meine Weckersituation

Derzeit lasse ich mich von meinem alten Android Handy (HTC Desire HD) mithilfe von RadioAlarm und einem Internet Radio stream wecken. Der Wecker  Das Handy meiner Frau hingegen mit einem voreingestellten Weckton. Der Weckton ist nervtötend tut aber seinen Dienst. Das Radio ist angenehmer aber damit aufzuwachen dauert ein bischen länger. Das Problem ist, mein altes Handy ist sehr alt, also so richtig sehr alt. Der Akku ist kaputt und deshalb steht es immer in der Ladestation. Manchmal passiert es aber (vorzugsweise in der Nacht) dass sich das Ding einfach ausschaltet und so am Morgen nur dieser Piepton kommt. Dabei wird man zwar wach, aber der Tag beginnt gleich viel genervter als sonst.

 

Recherche nach Weckern

Meine Recherche ergab nichts brauchbares. Ich möchte mindestens 3 Weckzeiten. Eine für die Arbeitstage, eine für das Wochenende und eine für andere besondere Tage, wenn man mal früher raus muss oder länger schlafen kann. Idealerweise ist die dritte Weckzeit eine Art Shortcut die, wenn aktiviert die anderen anstehenden Weckzeiten abschaltet. So brauch ich nicht immer die Einträge bearbeiten, was mich zugegebenermaßen extrem nervt (Ich möchte aber nicht ausschließen, dass das nur an dem lahmen Handy liegt).

Das sind so meine Traumfeatures an Weckzeiten. Und man glaubt es kaum, soooo viele mit mehr als 2 Weckzeiten gibt es gar nicht (Oder hat wer einen Tipp für mich? -> Kontakt)

Wenn man jetzt noch das Internetradio als Feature dazupackt wird die Luft so dünn, dass ich nicht bezahlbares mehr gefunden habe.

 

Einen Wecker selber bauen?

Also bin ich auf die Idee gekommen einen Wecker selbst zu bauen. Als Features habe ich mir vorgestellt:

  • Internet Radio
  • Spielen von lokalen Dateien (vorzugsweise MP3)
  • Spielen von Inhalten des NAS (über DLNA oder NFS)
  • Untermischen von nervtötenden Tönen 1
  • ∞ Weckzeiten

1: Zum schnelleren Aufwachen, dieses Feature soll natürlich abschaltbar sein.

 

Die Tatsache dass er sich im Netzwerk aufhalten und MP3 dekodieren können soll macht es etwas umständlich das ganze auf einem Mikrocontroller aufzubauen. Aus diesem Grund dachte ich eher an ein Embeded Linux Board als Basis. Das kümmert sich zumindest um den Netzwerkkram und auch das MP3 dekodieren hat da schon ein anderer programmiert. Zudem gibt es Leistung satt zum schmalen Preis. Die Weckzeiten können als ersten Versuch als Cronjob implementiert werden. Zuerst dachte ich an einen RaspberryPi oder besser den RaspberryPi Zero, allerdings ist dieser nicht so gut verfügbar. Nach etwas recherche stieß ich auf die Indiegogo Kampange zum Omega2 und habe dieses Modul als Basis auserkoren.

Heute zeige ich mal wie man die Toolchain für den Omega unter Ubuntu baut.

Zuerst holen wir uns das Lede Projekt von Github. Ich installiere für diesen Beitrag einfach mal unter /tmp, weil ich die Toolchain für mich schon gebaut habe.

chrimbo@helios:/tmp$ git clone https://github.com/WereCatf/source.git omega

 Nun gehen wir in das so eben geclonte Projekt und führen das first_time_setup Script aus.

chrimbo@helios:/tmp$ cd omega
chrimbo@helios:/tmp/omega$ ./first_time_setup.sh

 ledeconfig
Am Ende kommt automatisch das Menuconfig und wir müssen ein paar Grundeinstellungen für den Omega2 vornehmen. Mithilfe der Pfeiltasten und Enter kann navigiert werden. Im Bild sind die zu wählenden Einstellungen aufgeführt. Im Anschluss kann die Konfiguration beendet werden, dazu mit Hilfe der Pfeiltasten zum Exit navigieren und das Programm mit einem Druck auf Enter verlassen.

 

  • Target System MediaTek Ralink MIPS
  • Subtarget MT7688 based boards
  • Target Profile Onion Omega2

Nun kann die Toolchain mit folgendem Kommando gebaut werden.

chrimbo@helios:/tmp/omega$ make -j9 toolchain/install

 Sie ist danach im Verzeichnis staging_dir/toolchain-mipsel_24kc_gcc-5.4.0_musl/bin zu finden.

chrimbo@helios:/tmp/omega$ cd staging_dir/toolchain-mipsel_24kc_gcc-5.4.0_musl/bin/

 Ein Aufruf des GCC mit dem version Flag zeigt die korrekte Version an.

chrimbo@helios:/tmp/omega/staging_dir/toolchain-mipsel_24kc_gcc-5.4.0_musl/bin$ ./mipsel-openwrt-linux-gcc --version
mipsel-openwrt-linux-gcc (LEDE GCC 5.4.0 r3660+39-5087b40) 5.4.0
Copyright (C) 2015 Free Software Foundation, Inc.
This is free software; see the source for copying conditions.  There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.

 Test des Compilers

Also schnell ein kleines Hallo Welt tippen

  1. #include <stdio.h>
  2.  
  3. int main(int argc, char **argv)
  4. {
  5. printf("Hallo Welt");
  6. return 0;
  7. }

und durch den Compiler jagen

chrimbo@helios:/tmp$ omega/staging_dir/toolchain-mipsel_24kc_gcc-5.4.0_musl/bin/mipsel-openwrt-linux-gcc -o main.o main.c
mipsel-openwrt-linux-gcc: warning: environment variable 'STAGING_DIR' not defined
mipsel-openwrt-linux-gcc: warning: environment variable 'STAGING_DIR' not defined
mipsel-openwrt-linux-gcc: warning: environment variable 'STAGING_DIR' not defined
chrimbo@helios:/tmp$ ls
main.c main.o omega

Die main.o auf wie auch immer geartete Weise auf den Omega2 bringen. Ich nehme dafür einen USB-Stick aber über scp sollte es genauso gut gehen. Auf den Omega2 einloggen und das Programm ausführen

root@Omega-A067:/mnt# ./main.o
Hallo Welt

 

FT232RL wird nicht erkannt

Und noch ein Problem… Diesmal wurde der FT232RL nicht erkannt. Das Problem ließ sich aber recht schnell lokalisieren. Ich hatte vergessen den Test Pin auf GND zu legen. Der Pin ist wohl für den Hersteller gedacht, jedenfalls ist die Funktion im Datenblatt nicht beschrieben, bloß dass er für ordnungsgemäße Funktion auf GND gelegt werden muss.

Puts the device into IC test mode. Must be tied to GND for normal operation, otherwise the device will appear to fail.

 Zu meinem Glück hat der Hersteller daran gedacht den Pin daneben mit GND zu belegen, sodass es reicht eine kleine Lötbrücke zwischen Pin 25 und Pin 26 zu setzen. Und schon meldet sich der FT232RL am PC als USB-to-Uart Wandler.

12MHz auf CBUS0

ftdi cbusDamit der Audio Codec mit einem Takt versorgt wird muss nun noch die Leitung CBUS0 umkonfiguriert werden. Standardmäßig kann man dort eine LED zur Signalisierung das gesendet wird anschließen. Für den Wecker brauchen wir aber den 12MHz Takt der wie im Bild eingestellt wird. Gleichzeitig kann auch noch die Speisungskonfiguration auf Selfpowered gestellt werden, da der FTDI ja über das 5V Netzteil versorgt wird und nicht über den Bus (kein Bild). Im Anschluss wird das ganze noch gespeichert, dazu drückt man auf den kleinen Blitz in der Toolbar.

Nun sollte auf dem CBUS0 Pin ein 12MHz Takt verfügbar sein, welcher den SGTL5000 versorgt. Ab sofort kann dieser über den I²C Bus des Omega Onion2 angesprochen werden. Dazu ein kleiner Test. Per Putty auf das Omega einloggen und Register 0 des SGTL5000 abfragen:

BusyBox v1.25.1 () built-in shell (ash)

   ____       _             ____
  / __ \___  (_)__  ___    / __ \__ _  ___ ___ ____ _
 / /_/ / _ \/ / _ \/ _ \  / /_/ /  ' \/ -_) _ `/ _ `/
 \____/_//_/_/\___/_//_/  \____/_/_/_/\__/\_, /\_,_/
 W H A T  W I L L  Y O U  I N V E N T ? /___/
 -----------------------------------------------------
   Ω-ware: 0.1.9 b149
 -----------------------------------------------------
root@Wecker:/# i2cset -y 0 0x0a 0 0
root@Wecker:/# i2cget -y 0 0x0a 0 w
0x11a0
root@Wecker:/#

0x11a0 ist der Inhalt von Register 0. a0 ist die Part ID, die 11 ist die Revisions ID

Keine Enumeration

TUSB2036KorrekturManchmal ist es vorgekommen, dass der USB Hub nicht erkannt wurde. Ich vermute das liegt daran, dass der Reset des TUSB2036 schneller fertig ist, als das USB System auf dem Omega2 bereit ist und deswegen keine Enumeration erfolgt. Wenn man den am Reset vorgesehenen Kondensator (C37) von 10nF durch 47nF tauscht, wird der Hub immer erkannt.  Also kurz den Lötkolben angeschmissen und ab geht die Lucy.

Die Änderung ist im Beitrag BOM schon angepasst.

USB: rejected 1 configuration due to insufficient available bus power

Noch so ein peinlicher Fehler. Der USB-Hub ist durch seine Außenbeschaltung als Bus-Powered gekennzeichnet. Ich habe nicht herausgefunden wie ich ihm beibringen kann wie hoch der maximale Strom sein darf und so meldet der Kernel beim einstecken eines USB-Sticks: USB: rejected 1 configuration due to insufficient available bus power. Das kann man umgehen mit einem Kommando:

echo 1 > /sys/bus/usb/devices/1-1.4/bConfigurationValue

wobei 1-1.4 auf den jeweiligen Port zu ändern ist. Bloß muss dieses Kommando bei jedem einstecken eines Gerätes durchgeführt werden, was natürlich den Komfort kaputt macht wenn man einen USB-Stick einsteckt um die darauf befindliche Musik zu hören. Wenn allerdings der Pin 8 BUSPWR auf 3.3V statt auf GND gesetzt wird wechselt die Konfiguration in den Self-Powered Modus. Diese Änderung ist leider nur durch hochbiegen des Beinchens und anlöten eines kleinen Kupferlackdrähtchens möglich.

Der Hub ist nur ein 2-Port Hub

Als nächtes fiel mir auf, dass sich der Hub nur als 2-Port meldet. Auch dies ist über die Pinkonfiguration änderbar. Dafür verantwortlich ist der Pin 24 NP3, der auf GND statt auf  3.3V gezogen werden muss. Auch hier muss der Pin wieder hochgebogen werden, allerdings ist direkt daneben an Pin 23 schon GND verfügbar, dass kein Drähtchen angelötet werden muss, sondern der Pin einfach zur Seite gebogen und ein Kurzschluss mit Pin 23 gelötet werden muss.

Platine vorne5V
Nach einer Teilbestückung folgte der erste Funktionstest. Dabei fiel mir auf, dass das Netzteil die 3.3V hervorragend erzeugt, die 5V allerdings bei 0V bleiben. Als erstes habe ich versucht die Pins des Netzteils nachzulöten, aber das bracht keine Besserung. Also habe ich im ausgeschalteten Zustand den Widerstand zwischen 5V und GND gemessen. Das Multimeter zeigte einen sauberen Kurzschluss an. Dann habe ich sukzessive das 5V-Netz mithilfe eines Cutter-Messers aufgetrennt. Der Kurzschluss war nun nur noch in der oberen linken Ecke zu finden. Es zeigte sich kurze Zeit später, dass der GND Pin der USB2-Buchse (ganz links) eine Verbindung zur 5V Fläche hatte. Dies war mir wohl beim Verschieben der Buchs nach oben entgangen. So entstand ein Kurzschluss durch die Durchkontaktierung.

Kurzschluss 5VDen Kurzschluss konnte ich dann wunderbar mittels Minibohrer (z.B. von Dremel) und dem passenden Schleifkörper entfernen. Dazu einfach links und rechts von der Bohrung das Kupfer entfernen.

Die Fehlersuche habe ich auf einer zweiten Platine durchgeführt, so dass ich auf der Platine für den Funktionstest nun auch nur diese beiden Verbindungen entfernen musste. Beim erneuten Anstecken des Netzteils wurden die 5V schließlich korrekt erzeugt und die Inbetriebnahme konnte weitergehen.

Cookies erleichtern die Bereitstellung unserer Dienste. Mit der Nutzung unserer Dienste erklären Sie sich damit einverstanden, dass wir Cookies verwenden.
Weitere Informationen Ok Ablehnen