Category Archives: Hardware

Open source powered GNU Casino slot machine

For our private party some weeks ago we prepared a fun slot machine in the spirit of GNU open source software (I’m aware that this might sound contradictory). We already had an old internet cafe terminal but had to change the internal hardware to more recent components. Then we were ready to install a most basic ArchLinux system and configured it to launch X and our PyGame application at startup.

A real slot machine needs some fancy colored buzzers for authentic gamble feeling. So we developed some in Blender and 3d printed them. They are wired to a tiny USB-Arduino and on key press, they will trigger generic key press events on the system.

 

Since we haven’t been able to get the “coin entry” machine working, we checked the credit with a barcode scanner which was further connected to our party payment system :)

Here’s a demo video:

And here you can get our unenhanced, hacky source code. Note that we removed all original sounds and graphics to avoid copyright infringement.

Update (December 2017): We are proud to note that our project got featured on the front page of Heise Online, one of the leading technology news sites in Germany. In addition to the online publication, an even longer article was printed in the C’t Make magazine of 6/2017 (page 104-105).

ArmStone A9 als Mediacenter und NAS

homeserver_sata_bananapiMit Hilfe eines kleinen, leistungsfähigen und energiesparenden Mini-Computers, einem ArmStone A9 ARM-Board, ist es mir endlich gelungen, einen Daten-Server (NAS) für meine WG einzurichten. Die Platine wird eigentlich in der Industrie verwendet (z.B. in Automobilsystemen) und hat dementsprechend viel Peripherie, die Ich eigentlich garnicht benötige. Trotzdem eignet sich das Board mit Gbit-Ethernet und einem Sata-Port auch für meine Zwecke.

Der Hersteller fs-net aus Stuttgart hat seit nicht all zu langer Zeit auch einen aktuelleren Linux Kernel für die i.MX6 SOC Platform nachgeliefert, womit es mir dann auch einfacher gelungen ist, ein ArchLinuxARM Betriebssystem zu installieren. Hier hatte Ich eine aktuelle und breite Auswahl an Software zur Verfügung, wie Ich es auch schon bei Server- und Desktopumgebungen gewohnt bin.

Verwendet hatte Ich davor einen Banana PI, der aber für Multimediaanwendungen zu schwach war und einige Hardwarefehler aufwies. Der ArmStone hingegen schafft Ethernet-Transferraten von bis zu 40MB/s und ist auch schnell genug für das Reenkodieren von Audiodateien.

Folgende Dienste soll der kleine Server bereitstellen:

  • Dateifreigabe der 5 TB Festplatte im Netzwerk
  • Plex-Media-Server für Zugriff auf Mediendateien (via. App oder Webseite)
  • DynDNS-Dienst, der dafür sorgt, dass der WG-Server auch über das Internet erreichbar ist

Die folgende Anleitung beschreibt die Software-Installation auf diesem speziellen Gerät und desweiteren die Konfiguration ind Installation der benötigten Software. Letzteres ist allgemeiner gehalten und kann auch ohne Probleme auf anderen Geräten oder Platformen angewendet werden.

ArchLinux auf dem ArmStone installieren

Hierzu habe Ich schon im ArchLinux-Wiki eine ausführliche Anleitung erstellt. Für mein Setup sei ergänzend noch angemerkt, dass Ich folgende Kernel-Module bei dem vom Hersteller ausgelieferten Linux-Kernel noch hinzugenommen habe:
nftables
iptables
btrfs

Nachdem ArchLinux und der anepasste Kernel eingerichtet sind, kann das System gestartet werden.
Bevor das System mit Ansible eingerichtet werden kann (siehe nächster Abschnitt), müssen SSH-Schlüssel generiert und der SSH-Dienst gestartet werden. Der ArmStone muss hierfür via. Ethernet mit dem Internet verbunden sein. Einloggen kann man sich via. SSH mit dem Benutzer root und dem Passwort root.
pacman -Sy python sudo
systemctl start sshdgenkeys
systemctl start sshd

Der Benutzer alarm, der schon von Anfang an dabei ist und von Ansible genutzt werden soll, benötigt administrative Rechte via. sudo. Dazu muss die sudoers-Datei um folgende Zeile, nach “root ALL …” ergänzt werden:

Damit Ansible sich automatisch via. SSH auf dem NAS einloggen kann, sollten die öffentlichen Schlüssel des lokalen Benutzers auf den ArmStone kopiert werden:
ssh-copy-id alarm@10.0.0.2

Mit Ansible das System automatisch einrichten

Mit dem Programm Ansible ist es möglich, eine Systemkonfiguration einheitlich und abstrahiert zu beschreiben und danach automatisiert auf einen oder mehreren Systemen zu anzuwenden. Viele hier verwendete Module und Konfigurationsanweisungen können auch in Zukunft in anderen Projekten wiederverwendet werden.

Ansible muss bereits auf dem lokalen System installiert, und der zu konfigurierende Server über das Netzwerk angeschlossen und erreichbar sein. Mit folgenden Befehlen wird das Ansible-Skript heruntergeladen und alle benötigten Abhängigkeiten installiert:
https://git.project-insanity.org/onny/ansible-picloud.git
cd ansible-picloud
ansible-galaxy install -r requirements.yml -p roles --ignore-errors

Grundlegende Einstellungen bzw. Variablen für das NAS-System können in folgenden Dateien (im vars-Ordner) angepasst werden:

common.yml Definiert Hostname, Locale und Benutzernamen.
systemd-networkd.yml Festlegen der IP-Adresse und des Gateways.
ufw.yml Beinhaltet Konfigration der Firewall. Alle Ports bis auf: CIFS, Plex, mosh, ssh und https werden blockiert. Der Zugriff auf CIFS (Samba) wird nur aus einem bestimmten Subnet gestattet.
mount.yml Definiert Einhängepunkte von Root und dem externen Datenträger nach /mnt
inwx_dyndns_update.yml Beinhaltet Login-Daten zu Inwx.com und angaben über den zu aktualisierenden DNS-Record
shares.yml Definiert Benutzer- und Zugriffsrechte für die Netzwerkdateifreigabe via. Samba
archlinux_aur.yml Zu installierende AUR-Packete. Abägnigkeit des Inwx-Skriptes
hd-idle.yml Installiert und konfiguriert das Programm, dass die Festplatten bei inaktivität in Standby versetzt

Es genügt in diesen Dateien die grundlegenden Einstellungen vorzunehmen. Je nach belieben können einzelne Module aus dem sogenannten Ansible-Playbook (picloud.yml) herausgenommen oder hinzugefügt werden, sodass nicht das komplette Setup, wie hier beschrieben, 1-zu-1 umgesetzt werden muss. Zuletzt wird in der hosts-Datei die IP-Adresse des Servers definiert:

Die Verbindung zum Server kann direkt mit Ansible getestet werden:
ansible -i hosts all -m ping
10.0.0.2 | SUCCESS => {
"changed": false,
"ping": "pong"
}

Sollte dies alles in Ordnung sein, kann die Konfiguration auf dem Zielsystem mit folgendem Befehl ausgeführt werden:
ansible-playbook -i hosts picloud.yml --ask-become-pass

Alle oben genannten Dienste werden nun automatisch installiert, konfiguriert und gestartet :)

Mit Vagrant in einer virtuellen Maschine Konfiguration testen

In dem Ansible-Projektordner ist auch noch Vagrantfile beigelegt, die eine ArchLinux-VM automatisch einrichtet und die Ansible-Konfiguration anschließend anwendet. Dafür muss nur folgender Befehl ausgeführt werden:

cd ansible-picloud
vagrant up

Als Fazit könnte man sagen, dass der erste Aufwand beim Einrichten von Ansible sehr hoch ist. Auf der anderen Seite denke Ich, dass es gerade bei der Administration von vielen unterschiedlichen VMs im Serverbereich nützlich ist, mit Ansible schnell und einfach einen einheitlichen Konfigurationsstand auf allen Maschinen zu haben.

A shiny new life for an old Lenco internet radio

Some months ago my Lenco internet radio wasn’t usable anymore since the original software seemed to get faulty over time and further the manufacturer dropped support completely. Nethertheless I liked the sound quality of the radio and it was really easy to use (compared to a bluetooth box, a smartphone and an unhandy radio app).

So I throw the old hardware away and figured out, together with St, how to wire the display, the keypad matrix and the speakers to the Raspberry PI. To my surprise, this is easier than I thought :)

Raspberry PI wired to the control pcb of the radio

Additional hardware requirements for the project are a wifi antenna, an external usb audio dongle (internal audio quality is really bad on the old RaspberryPI) and a small digital amplifier chip. I used to different power supplies for the amplifier and the PI to avoid noisy cracking on the sound output (common ground problem).

Wiring to the HD44780 display and the keypad matrix

Fortunately there are enough free GPIO pins available to wire the HD44780 display and the keypad matrix to the PI. One can find plenty of documentation and tutorials, for the display, the corresponding RPLCD library and also useful modules to manage the keypad.

The complete source code can be found on our Gitlab instance, but don’t expect some sophisticated python program. It is really simple but atleast works fine so far :) Here’s a demo video:

WLAN-Hardware für den Linux-Libre Kernel

img_20160928_182917Heute ist die neue WLAN-Karte Atheros AR9280 endlich per Post angekommen! Von den Spezifikationen her bietet die Karte nichts besonderes. 300 Mbps Übertragungsrate und 5 Ghz Netzwerke werden unterstützt, wie bei aktuellen WLAN-Karten üblich.
Spannend ist jedoch, dass Atheros bekannt ist für gute quelloffene Treiber und desweiteren sogar freie Firmwares verfügbar sind. Dies spielt dann eine Rolle, wenn ein Linux-Kernel, wie z.B. linux-libre, komplett auf alle properitären, closed-source Treiber und Firmwares verzichtet. Mit diesem “freieren” Kernel, kann es schnell passieren, dass ein großteil der Hardware-Peripherie nicht mehr funktioniert. Z.B. konnte mit diesem Kernel meine Intel WLAN-Karte nicht mehr verwendet werden, da es für diese keine freie Firmware gibt. Der standard Linux-Kernel ist hier nicht so streng und verwendet für den Betrieb die unfreie Firmware.

Bei dem Online-Store Thinkpenguin bin Ich dann auf Hardware gestoßen, die mit linux-libre kompatibel ist. In diesem Fall sollten Firmware und Treiber open-source sein. Meiner Meinung nach ist dies nicht nur nützlich fürs soft- und hardwarehacken sondern stellt auch einen nicht zu unterschätzenden Sicherheitsaspekt dar. Geschlossene Firmware-Dateien können Backdoors oder Sicherheitslücken beinhalten, die nicht eingesehen oder behoben werden können. Im schlimmsten Fall hat der Hersteller, vielleicht aus wirtschaftlichen Gründen heraus, garkein Interesse mehr, diese Fehler zu beheben oder zu veröffentlichen.

Zum ausprobieren der neuen Karte, habe Ich mir den Kernel aus dem AUR bezogen:
pacaur -S linux-libre
Vorausgesetzt der Bootloader ist richtig konfiguriert und startet den neuen Kernel, sollte nach einem Neustart dieser auch verwendet werden:
onny@onny ~ % uname -a
Linux onny 4.7.0-gnu-1 #1 SMP PREEMPT Tue Aug 16 15:30:05 UTC 2016 x86_64 GNU/Linux

Das Prefix -gnu deutet hier auf den Linux-Libre Kernel hin. Die WLAN-Karte meldet sich beim System wie folgt:
onny@onny ~ % lspci | grep -i wireless
03:00.0 Network controller: Qualcomm Atheros AR928X Wireless Network Adapter (PCI-Express) (rev 01)

Die passenden Module, der ath9k-Treiber, sind auch geladen:
onny@onny ~ % lsmod | grep ath
ath9k 131072 0
ath9k_common 32768 1 ath9k
ath9k_hw 442368 2 ath9k_common,ath9k
ath 28672 3 ath9k_common,ath9k,ath9k_hw
mac80211 659456 1 ath9k
cfg80211 495616 4 ath,ath9k_common,ath9k,mac80211
led_class 16384 4 ath9k,sdhci,dell_laptop,input_leds

… und siehe da, das WLAN funktioniert problemlos mit dem neuen Kernel :)

Interessant ist auch, dass in meinem Netzwerkmanager nun auch ein P2P-Interface auftaucht. Ich vermute mal, dass es sich um IEEE 802.11s handelt, was hier implementiert wurde.

Opel Agila Autoradio AUX Hack

radio_frontNach längerer Zeit möchte Ich den Blog mal wieder mit einem kleinen Beitrag zu einem aktuellen Projekt von mir bereichern. Vorallem dürfte diese Lösung, AUX in ein original Opel Autoradio zu integrieren,  sich von allen bisherigen im Netz, mehr oder weniger auffindbaren, unterscheiden.

Angeblich lässt sich über einen CD-Wechsler Anschluss im Radio ein externes Gerät anschließen, dass dann je nach Bedarf einen MP3-Player, Bluetooth- oder AUX-Anschluss bereitstellt. Schade nur, dass zu dem Pinout oder der Hardware wenig im Netz dokumentiert ist, sodass man wenig selber dafür entwickeln kann. Abgesehen von dem Geld, was man für den Adapter ausgibt, ist dieser unter umständen unpraktikabel und vllt. garnicht mit meinem Autoradio kompatibel.

platine_radioBeim Betrachten der Platine des PACR08 benannten Radios/Verstärker, fällt auf, dass es ein eigenes FM-Modul gibt, das sehr sauber von der Hauptplatine getrennt ist und dessen Pinout auch ausführlich beschriftet ist. Daran ließen sich die Pins für Audio L/R-Out des Radio-Moduls ablesen. Die Idee war nun, anstelle des FM-Audios, eine eigene Audio-Quelle anzuschließen.

Tatsächlich funktioniert das ohne größere Probleme (abgesehen davon, dass wir die Leiterbahnen getrennt und sehr filigrane Kontakte anlöten mussten) und das eingeschleuste, vom Smartphone vorverstärkte Audio-Signal, hört sich auch richtig gut an :)

platine_backZu guter letzt haben wir uns noch ein 5V-Netzteil angelötet und dafür eine USB-Buchse an die Front angebracht (für die Data-Pins muss es eine kleine zusätzliche Schaltung geben, damit Smartphones auch mit +1A laden können). Für das AUX gibt es auch eine (in unserem Fall mehrere) Klinke-Buchsen und einen Wippschalter der zwischen FM- und AUX-Eingang wechselt.

Angedacht ist noch einen Philips AEA2700 Multipair Bluetooth Adapter einzubauen, für den dann nur noch der Tethering-Button rausgelegt werden müsste.

img_20160917_212520Update 18.09.16: Bluetooth Audio-Adapter eingebaut!

WIe auf dem Bild links zu sehen ist, habe Ich nun auch den Philips Bluetooth-Adapter eingebaut. Der Audio-Ausgang geht direkt an die eingebauten AUX-Anschlüsse und die Stromversorgung läuft über den DC-DC-Spannungswandler. Ein kleiner zusätzlich eingebauter Taster an der Blende wurde an die Philips-Platine drangelötet und aktiviert das Pairing für neue Geärte. Klangqualität ist wie erwartet richtig gut, es existiert nur ein hohes aber leises Fiepen, dass von der Lichtanlage induziert wird.