ALSA Bluetooth mit Raspberry Pi Zero W

Puh, Multimedia und Linux ist ja immer so eine Sache … Damit ich das alles nicht gleich wieder vergesse und weil ich es bestimmt nochmal brauchen werde, hier ein paar Schritte wie es dann endlich funktioniert (unter zu Hilfenahme einiger Quellen, die ich unten nochmal verlinkt habe)

sudo apt-get install bluez pulseaudio-module-bluetooth python-gobject python-gobject-2 bluez-tools
sudo usermod -a -G lp pi

pi@raspberrypi:~ $ hcitool scan
Scanning …
00:02:3C:4D:F7:37 Creative T12 Wireless

 

/etc/asound.conf

pcm.bluetooth {
type bluetooth
device 00:02:3C:4D:F7:37 # change this MAC address to the one you wrote down
}

/etc/bluetooth/audio.conf

[General]
Enable=Sink
Disable=Socket

systemctl restart bluetooth

/etc/pulse/daemon.conf

resample-method = trivial

pulseaudio -D

bluetoothctl

power on
scan on
pair 00:02:3C:4D:F7:37
[confirm pin]
scan off
connect 00:02:3C:4D:F7:37
trust 00:02:3C:4D:F7:37

 

speaker-test -c2

Nach einem Reboot ist jetzt nur noch ein „pulseaudio -D“ und ein Druck auf den Bluetooth-Taster meines Lautsprechers notwendig – danach funktioniert Audio problemlos.

Quellen:
http://tgarc.github.io/2015/03/24/connecting-to-a-bluetooth-speaker-with-pulseaudio/
https://unix.stackexchange.com/questions/381342/bluetooth-a2dp-pulseaudio-source-to-play-sound-from-phone-to-linux-with-bluez-5

Mainline-Linux für STM32F429 kompilieren

Ich bin gerade dabei ein Custom-Board mit einem STM32F429 zu bauen.

Ewig hatte ich mich mit STMCubeMX herumgespielt, auf der Suche nach einem günstigen und relativ kleinen STM32 mit SDRAM-Interface. Es hat etwas gedauert, dann bin ich über den STM32F429 gestolpert und hatte beschlossen, den zu verwenden. Mit 144 Pins im QFP-Gehäuse gerade noch Bastler-freundlich …

Nachdem ich mit Schaltplan und Layout quasi fertig war, stellte ich fest, dass es ebenfalls ein STM32F429-Discovery-Board gibt. Interessehalber hatte ich mal nach Linux für diese Plattform gesucht und bin über uralte Portierungen von ucLinux gestolpert. In einem GIT-Repository und etliche Jahre nicht mehr gepflegt. Irgendwas mit 2.6er Kernel.

Nach ewigen weiteren Recherchen stieß ich auf die Information, dass das STM32F429-Discovery mittlerweile ab dem Kernel 4.2 in der Mailine ist!

Interessanterweise nur der 429 und der 469er … So ein Zufall! 🙂

Ich hab dann auch eine Anleitung gefunden, mit der das Kompilieren wirklich klappt 🙂

 

 

[STM32] Zweite Schritte

In der Theorie sah CubeMX gut aus, in der Praxis nicht wirklich … Vorallem generierte es Code mit einem Logikfehler, der dazu führte, dass die System-Clöcke (^^) nicht eingestellt werden konnten und der Controller stets in eine while (1) {} Error-Behandlungs-Loop hängen blieb. (hätte mein STLinkV2-Debugger nicht schon funktioniert, hätte ich den Fehler niemals gefunden!)

Zudem gefiel mir der Workflow zum Erstellen des Makefiles nicht und der Code war durchsetzt mit Kommentaren, wo man User-Funktionen, Methoden, Variablen reinschreiben darf … Das hat natürlich nur eine Relevanz, wenn man den Code nochmal mit CubeMX überarbeiten möchte, weil man z.B. eine neue Peripherie verwenden möchte, die man zuvor noch nicht konfiguriert hatte.

Das Kompilat ergab 20kB Code, ohne dass etwas gemacht wurde. Das erschien mir schon sehr aufgeblasen.

Und ein weiteres großes Manko: Viele Tutorial verwenden ST’s HAL nicht, weshalb man Code-Schnippsel ständig übersetzen müsste, worauf ich keine Lust habe.

Also flog der Kram mit HAL wieder raus und es wurde sauber ein Blinky-Projekt mit dem ARM-Eclipse-Plugin erstellt und das angepasst.

Erfreulicherweise geht die CMSIS-Standard-Library schon von einem externen 8Mhz Quartz aus, weshalb man nur noch ein Define auf 48MHz setzen musste und voila, der HSE (High-Speed-External-Clock) und die PLL sind richtig gesetzt.

Ich konnte die Firmware auch schon auf meinem „custom-Board“ testen … Es gibt ein git-Repository mit einem st-flash Tool, das zum Flashen über einen USB STLinkV2 (für 2EUR beim Chinesen) verwendet werden kann. Eine Anleitung gibt es hier

Auf den Seiten des ARM-Eclipse-Plugins folgte ich heute der Anleitung, wie man Eclipse mit OpenOCD konfiguriert und ich muss sagen, das funktioniert super! Endlich richtiges Debuggen mit Breakpoints und allem, was dazu gehört 🙂 Und das funktioniert sogar unter Linux 😉

Nach etwas Googeln konnte ich die ersten 2 PWM-Generatoren auf meinem Board in Betrieb nehmen … Morgen kommen die Schieberegister für das LED-Dot-Matrix-Display dran usw …

Morgen gibt es dann auch mal ein Foto von dem Dings, das ich überhaupt bastel …^^

STM32F103 – Erste Schritte

Lang lang ist es her, dass ich mal produktiv mit µCs gearbeitet hab. Sträflich vernachlässigt hab ich eines meiner liebsten Hobbies.

Nachdem so viel Zeit vergangen ist, hat sich auch wieder viel geändert. Die AVR 8Bit-Controller gibt es immer noch … Da hat sich erstaunlich wenig getan. Offensichtlicher sind die Entwicklungen im ARM-Bereich. Da scheinen sich die Cortex Cores stark durchgesetzt zu haben. Atmel spielt nur noch eine Nebenrolle (damals der SAM7Sxxx war der letzte, den ich noch verwendete) und von den LPCxxx hört man auch nicht mehr viel. Damals war ich auf einer Präsentation von Renesas bzgl Cortex M3 und sah die Relevanz dieser Kerne nicht. Cortex hat sich durchgesetzt und von Renesas hört man auch nichts mehr.

ST scheint wohl derzeit in zu sein, weshalb die Wahl auf die STM32-Controller fiel.

Der Controller der Wahl war schnell gefunden … Die Bauteilsuche des Shops meines vertrauens nach STM32 gefragt und nach Preis sortiert und voila da war er: Der STM32F103C8T.

Einer der Schwachbrüstigen, aber dafür günstig 😉

Mir fiel ein, dass ich ja sogar noch ein STM32F4xx-Discovery-Board irgendwo rumliegen habe, d.h. ich hatte tatsächlich schonmal etwas damit gemacht … Und tatsächlich, hatte ich da sogar mal etwas gepostet 🙂 Damals … Vor 2 Jahren^^ (Und ahja, da war noch was … Mit EM::Blocks hatte ich den Okarina-Klanggenerator schon auf dem Board laufen und wusste das kaum noch^^)

Ich denke, damals hatte ich CooCox verwendet … Das glaube ich, gibt es aber nur für Windows.

Für Linux gibt es aber ein CubeMX-Tool von ST, mit dem die ganze Peripherie-Konfiguration erschlagen werden kann. Grafisch anklicken, was man wie konfiguriert haben möchte und es erzeugt ein C-Code-Framework, das man nur noch kompilieren muss.

Das werde ich mir jetzt gleich mal anschauen 🙂

Schnell installiert und selbsterklärend, was man machen muss … Das gefällt mir schon mal! Da wird einiges an Datenblatt-lesen durch eine GUI ersetzt 🙂

Spectacle.TJ1506

Das CubeMX ist wohl nur zur Erzeugung eines C/C++ Frameworks. Es kann einige Projektfiles erzeugen, die von IDEs diverser Hersteller gelesen werden können (z.B. Keil), aber das Ziel ist der arm-gcc.

Hierfür gibt es netterweise ein Konvertierungs-Script, mit dem ein mit CubeMX erstelltes SW4STM32-Projekt in ein Makefile umgewandelt werden kann, welches dann von Eclipse mit ARM-Plugin importiert werden kann.

Zu guter letzt: Die IDE der Wahl ist natürlich Eclipse. Man installiert sich die C++/C-Variante (mit CDT) und anschließend das ARM-Eclipse-Plugin und die ARM-GCC-Toolchain. Dann lässt sich das zuvor erstellte Makefile importieren, kompilieren und (voraussichtlich) debuggen 🙂

 

Memo an mich selbst

Fokus-Schift Elektronik

Hah, ich hatte ja noch einen Blog … und den schon ziemlich lange.

Ich denke, ich werde den wieder öfters mal nutzen … Schwerpunkt-Thema dieses mal Elektronik-Entwicklung 🙂

Da erfahrungsgemäß das Interesse und die Resonanz in meinem Umfeld bezüglich solcher Themen recht bescheiden ist, gibt es vlt hier ein paar Leser, die sich dafür interessieren 🙂

Bald geht’s los, ich hab ein paar Projekte in meiner Pipeline 😀

Erste Schritte mit dem Raspi V2

Nur mal für mich zusammen gefasst, was ich konfigurieren musste …

Eduroam WLAN … /etc/network/interfaces

auto wlan0
allow-hotplug wlan0
+auto wlan0
iface wlan0 inet dhcp
wpa-conf /etc/wpa_supplicant/wpa_supplicant.conf

/etc/wpa_supplicant/wpa_supplicant.conf:


ctrl_interface=DIR=/var/run/wpa_supplicant GROUP=netdev
update_config=1

network={
ssid="eduroam"
key_mgmt=WPA-EAP
eap=PEAP
ca_cert="/etc/ssl/certs/Deutsche_Telekom_Root_CA_2.pem"
phase2="auth=MSCHAPV2"
identity="xxx@eduroam.mwn.de"
domain_suffix_match="radius.lrz.de"
anonymous_identity="anonymous@mwn.de"
password=hash:xxx
}

/etc/default/keyboard:

# KEYBOARD CONFIGURATION FILE
# Consult the keyboard(5) manual page.
XKBMODEL="pc105"
XKBLAYOUT="de"
XKBVARIANT=""
XKBOPTIONS=""
BACKSPACE="guess"

WLAN-Power-Save ausschalten: sudo vi /etc/modprobe.d/8192cu.conf

options 8192cu rtw_power_mgnt=0

Zeitzone:

sudo cp /usr/share/zoneinfo/Europe/Berlin /etc/timezone

User erstellen und Passwort setzen:

sudo useradd -m -d /home/myuser myuser
sudo passwd myuser

Sudoers-Eintrag:

sudo visudo

Nicht vergessen, den pi-Benutzer in der Shadow zu deaktivieren.

No-IP konfigurieren (noip-duc-linux.tar.gz download und danach installieren)

 

Darktable und Sony NEX5-T

Achja, Linux ist wie immer ein Trauerspiel … Aaaaber es gibt eine Lösung …

Folgende 2 Probleme:

  • falsche Farben beim importieren der RAW-Bilder, die von einer NEX5-T geschossen wurde
  • die richtigen Entzerrungsparameter für das SEL-P1650 Objektiv gibt es nicht.

Lösung zu Problem1:

Neueste Version von Darktable als Source-Code herunterladen und selbst kompilieren. Dann kennt Darktable zumindest die NEX5-T und die Farben stimmen!

sudo apt-get install intltool libatk1.0-dev libcairo2-dev libexiv2-dev libfontconfig1-dev libfreetype6-dev libgomp1 libgtk2.0-dev libjpeg-dev libtiff4-dev liblcms2-dev liblensfun-dev libpng12-dev libsqlite3-dev libstdc++6-4.4-dev libxml2-dev libopenexr-dev libcurl4-gnutls-dev libgphoto2-2-dev libdbus-glib-1-dev libgnome-keyring-dev fop librsvg2-dev libflickcurl-dev cmake liblua5.2-dev
git clone git://github.com/darktable-org/darktable.git

cd darktable
./build.sh

Lösung zu Problem 2:

Neueste Version der Bibliothek lensfun aus dem git-Repository clonen und die xml-Files der Objektive nach /usr/share/lensfun kopieren.

git clone git://git.code.sf.net/p/lensfun/code lensfun-code

Falls es eine Fehlermeldung gibt, weil der root-Tag kein Attribute haben darf, dann einfach fixen mit:

sed -i 's| version="1"||g' *.xml

Danach funktioniert alles und die Bilder werden perfekt entzerrt!