Strona 1 z 1

MPD / MPC - radio internetowe ( Ubuntu/ Debian - platforma ARM )

: 05 cze 2026, 19:29
autor: kobrawerde
Może komuś przyda się trochę informacji jak zbudować radio internetowe oparte o programy : mpd / mpc i Linux-a (Ubuntu / Debian) ale na platformie ARM w moim przypadku Bananapim2pro (zrezygnowałem i osobiście odradzam felerną SBC : OrangePi3 LTS z powodu wady szyny GPIO i niestabilnej pracy tego modelu z napięciem 5V / usb itd oraz braku wsparcia Armbian /standard niestety sam jako beta-tester zapłaciłem tzw. frycowe za ten felerny model)
Zasada będzie pewnie podobna dla innych modeli: OrangePi / Raspberry Pi itd ... wybrałem ten model bo ma wbudowaną pamięć stałą emmc 16GB na której możemy po skonfigurowaniu systemu na karcie SD wgrać system na w/w i zapomnieć o kartach SD które pewnie jak wiecie nie są wieczne a z doświadczenia po ok 3 / 6 latach ulegają awarii (ciągły zapis -odczyt) i lepiej mieć backup takich SD jeśli nie mamy emmc !!! jak taki zrobić żeby system się uruchamiał itd
viewtopic.php?t=184218
Ważne dla mnie było użycie wyświetlacza LCD np. 16x2 / 40x2 i podstawowa opcja żeby można było na bieżąco odczytać nazwę stacji radiowej ,odtwarzanego utworu muzycznego / artysty (zespołu) jeśli takowe są dostarczane ze stremowanej stacji radiowej + ewentualnie aktualną godzinę.
Sciągamy i instalujemy aktualne firmware Armbian 26.2.1 Minimal (CLI) ( bo i po co nam wersja Desktop-owa )
https://armbian.com/boards/bananapim2pro
Po rozpakowaniu nagrywamy w/w na kartę SD ( pomocna będzie przejściówka SD/USB ) podłączamy Bananapi pod HDMI (np. TV) podczas pierwszego boot-owania podajemy / ustawiamy swój logi / hasło jako standardowe konto lub możemy zrezygnować i pozostać tylko jako root ! . Następnie możemy jeśli mamy sieć wifi przeskanować w/w i zalogować się do w/w. ( będzie to jednorazowa czynność zapamiętana na stałe )
Od teraz będzie prościej bo można się logować do systemu przez (laptopa) usługę SSH / terminal linux-a (Ubuntu/Debian) podając przydzielony adres IP swojego OrangePi np. 192.168.1.17

Kod: Zaznacz cały

ssh root@192.168.1.17
Na początku uaktualniamy system itd !!!

Kod: Zaznacz cały

apt update
apt upgrade
instalujemy programy mpd /mpc / lcdproc /pulseaudio / lirc /ir-keytable ...drivery dla naszego LCD (hd44780) / pilota itd

Kod: Zaznacz cały

apt install mpd mpc 
sudo apt-get install lcdproc lcdproc-extra-drivers
sudo apt-get install -y lirc lirc-compat-remotes
sudo apt-get install -y ir-keytable
Możemy doinstalować programy związane z aktualną datą / czasem itp

Kod: Zaznacz cały

sudo apt-get install ntpdate
ntpdate pool.ntp.org
Podajemy lokalizację : warsaw itd

Kod: Zaznacz cały

dpkg-reconfigure tzdata
Lub prościej dokonujemy tych czynności ( język / hostname / strefę ) przez dostarczony przez firmę Armbian program : armbian-config i jego menu :

Kod: Zaznacz cały

armbian-config
Obrazek
Na Bananapim2pro funkcja IR ( diody czujnika pod pilota ) jest już włączona standardowo więc nic nie musimy kombinować. Lub korzystamy z innego pilota z czujnikiem pod Usb ( ja preferuję pilota radiowego firmy medion x10 który niestety już nie jest produkowany a umożliwia sterowanie radiem z drugiego pokoju przez ścianę a nawet dwie ...używki można jeszcze nabyć na różnych aukcjach )
Obrazek Obrazek
Konfigurujemy pilota radiowego
komenda wyświetla listę sterowników a pilot x10 korzysta z : atilibusb

Kod: Zaznacz cały

lircd --driver=
Możemy na chwile użyć w/w sterowników w danej sesji aż do restartu prog. lircd

Kod: Zaznacz cały

lircd --driver=atilibusb
lub na stałe zapisując w pliku: lirc_options.conf zmieniając drivery: devinput ... na ... atilibusb

Kod: Zaznacz cały

nano /etc/lirc/lirc_options.conf
Zapisujemy także plik obsługujący w/w pilota z wpisem :

Kod: Zaznacz cały

nano /etc/lirc/lircd.conf
wpis:

Kod: Zaznacz cały

# Please make this file available to others
# by sending it to <lirc@bartelmus.de>
#
# this config file was automatically generated
# using lirc-0.8.3(default) on Sat Apr 23 13:45:36 2011
#
# contributed by
#
# brand: or24v / or28v :-)
# model no. of remote control:
# devices being controlled by this remote:
#

begin remote

name or28v
bits 16
eps 30
aeps 100

one 0 0
zero 0 0
pre_data_bits 8
pre_data 0x14
post_data_bits 16
post_data 0x0
gap 219976
toggle_bit_mask 0x80800000
min_repeat 1
suppress_repeat 5

begin codes
UP 0xEF1A
DOWN 0x77A2
LEFT 0xF21D
RIGHT 0x749F
VOL_UP 0xDE09
VOL_DOWN 0x5D88
CH_UP 0xE00B
CH_DOWN 0x618C
MUTE 0xD500
OK 0x739E
SELECT 0xF01B
1 0x628D
2 0xE30E
3 0x648F
4 0xE510
5 0x6691
6 0xE712
7 0x6893
8 0xE914
9 0x6A95
0 0xEC17
CLEAR 0x85B0
ENTER 0x0B36
PLAY 0x7AA5
PAUSE 0xFE29
STOP 0x7DA8
RECORD 0xFC27
REW 0x79A4
FORWARD 0xFB26
BACK 0x75A0
INFO 0x042F
POWER 0xD702
RED 0x0732
YELLOW 0x89B4
BLUE 0x0A35
GREEN 0x88B3
PREV 0xF621
NEXT 0x78A3
TEXT 0xEB16
RECORDED 0xED18
MOVIE 0x719C
MUSIC 0x0631
FOTO 0x5984
HASH 0x0D38
STAR 0x8CB7
end codes

end remote
Teraz sprawdzamy czy pilot reaguje na przyciski komenda: Obrazek
Konfigurujemy program mpd ...w pliku mpd.conf podajemy własne ścieżki do konfiguracji : playlisty / muzyki / karty dźwiękowej itd
U mnie konfiguracja jest w folderze : /radio ...( uwaga nie używajcie folderu : media bo po przeniesieniu systemu na pamięć emmc system tam zapisuje i kasuje wszelką konfiguracje ) mój przykład:

Kod: Zaznacz cały

nano /etc/mpd.conf

Kod: Zaznacz cały

# An example configuration file for MPD.
# Read the user manual for documentation: http://www.musicpd.org/doc/user/
# or /usr/share/doc/mpd/html/user.html


# Files and directories #######################################################
#
# This setting controls the top directory which MPD will search to discover the
# available audio files and add them to the daemon's online database. This
# setting defaults to the XDG directory, otherwise the music directory will be
# be disabled and audio files will only be accepted over ipc socket (using
# file:// protocol) or streaming files over an accepted protocol.
#
music_directory		"/radio/music"
#
# This setting sets the MPD internal playlist directory. The purpose of this
# directory is storage for playlists created by MPD. The server will use
# playlist files not created by the server but only if they are in the MPD
# format. This setting defaults to playlist saving being disabled.
#
playlist_directory		"/radio/playlists"
#
# This setting sets the location of the MPD database. This file is used to
# load the database at server start up and store the database while the
# server is not up. This setting defaults to disabled which will allow
# MPD to accept files over ipc socket (using file:// protocol) or streaming
# files over an accepted protocol.
#
db_file			"/radio/tag_cache"
#
# These settings are the locations for the daemon log files for the daemon.
# These logs are great for troubleshooting, depending on your log_level
# settings.
#
# The special value "syslog" makes MPD use the local syslog daemon. This
# setting defaults to logging to syslog, or to journal if mpd was started as
# a systemd service.
#
log_file			"/radio/mpd.log"
#
# This setting sets the location of the file which stores the process ID
# for use of mpd --kill and some init scripts. This setting is disabled by
# default and the pid file will not be stored.
#
pid_file			"/radio/pid"
#
# This setting sets the location of the file which contains information about
# most variables to get MPD back into the same general shape it was in before
# it was brought down. This setting is disabled by default and the server
# state will be reset on server start up.
#
state_file			"/radio/state"
#
# The location of the sticker database.  This is a database which
# manages dynamic information attached to songs.
#
sticker_file                   "/radio/sticker.sql"
#
###############################################################################


# General music daemon options ################################################
#
# This setting specifies the user that MPD will run as. MPD should never run as
# root and you may use this setting to make MPD change its user ID after
# initialization. This setting is disabled by default and MPD is run as the
# current user.
#
user				"mpd"
#
# This setting specifies the group that MPD will run as. If not specified
# primary group of user specified with "user" setting will be used (if set).
# This is useful if MPD needs to be a member of group such as "audio" to
# have permission to use sound card.
#
#group				"nogroup"
#
# This setting sets the address for the daemon to listen on. Careful attention
# should be paid if this is assigned to anything other than the default, any.
# This setting can deny access to control of the daemon. Choose any if you want
# to have mpd listen on every address. Not effective if systemd socket
# activation is in use.
#
# For network
bind_to_address			"localhost"
#
# And for Unix Socket
#bind_to_address		"/run/mpd/socket"
#
# This setting is the TCP port that is desired for the daemon to get assigned
# to.
#
#port				"6600"
#
# Suppress all messages below the given threshold.  Use "verbose" for
# troubleshooting. Available setting arguments are "notice", "info", "verbose",
# "warning" and "error".
#
#log_level			"notice"
#
# Setting "restore_paused" to "yes" puts MPD into pause mode instead
# of starting playback after startup.
#
#restore_paused "no"
#
# This setting enables MPD to create playlists in a format usable by other
# music players.
#
#save_absolute_paths_in_playlists	"no"
#
# This setting defines a list of tag types that will be extracted during the
# audio file discovery process. The complete list of possible values can be
# found in the user manual.
#metadata_to_use	"artist,album,title,track,name,genre,date,composer,performer,disc"
#
# This example just enables the "comment" tag without disabling all
# the other supported tags:
#metadata_to_use "+comment"
#
# This setting enables automatic update of MPD's database when files in
# music_directory are changed.
#
#auto_update	"yes"
#
# Limit the depth of the directories being watched, 0 means only watch
# the music directory itself.  There is no limit by default.
#
#auto_update_depth "3"
#
###############################################################################


# Symbolic link behavior ######################################################
#
# If this setting is set to "yes", MPD will discover audio files by following
# symbolic links outside of the configured music_directory.
#
#follow_outside_symlinks	"yes"
#
# If this setting is set to "yes", MPD will discover audio files by following
# symbolic links inside of the configured music_directory.
#
#follow_inside_symlinks		"yes"
#
###############################################################################


# Zeroconf / Avahi Service Discovery ##########################################
#
# If this setting is set to "yes", service information will be published with
# Zeroconf / Avahi.
#
#zeroconf_enabled		"yes"
#
# The argument to this setting will be the Zeroconf / Avahi unique name for
# this MPD server on the network. %h will be replaced with the hostname.
#
#zeroconf_name			"Music Player @ %h"
#
###############################################################################


# Permissions #################################################################
#
# If this setting is set, MPD will require password authorization. The password
# setting can be specified multiple times for different password profiles.
#
#password                        "password@read,add,control,admin"
#
# This setting specifies the permissions a user has who has not yet logged in.
#
#default_permissions             "read,add,control,admin"
#
###############################################################################


# Database #######################################################################
#
# An example of a database section instead of the old 'db_file' setting.
# It enables mounting other storages into the music directory.
#
#database {
#       plugin "simple"
#       path "/var/lib/mpd/tag_cache"
#       cache_directory "/var/lib/mpd/cache"
#}
#
# An example of database config for a sattelite setup
#
#music_directory "nfs://fileserver.local/srv/mp3"
#database {
#       plugin "proxy"
#       host "other.mpd.host"
#       port "6600"
#}

# Input #######################################################################
#
input {
        plugin "curl"
#       proxy "proxy.isp.com:8080"
#       proxy_user "user"
#       proxy_password "password"
}

# Decoder #####################################################################
#

decoder {
        plugin                  "hybrid_dsd"
        enabled                 "no"
#       gapless                 "no"
}
decoder {
        plugin        "wildmidi"
        enabled       "no"
        #config_file "/etc/timidity/timidity.cfg"
}

#
###############################################################################

# Audio Output ################################################################
#
# MPD supports various audio output types, as well as playing through multiple
# audio outputs at the same time, through multiple audio_output settings
# blocks. Setting this block is optional, though the server will only attempt
# autodetection for one sound card.
#
# An example of an ALSA output:
#
audio_output {
	type		"alsa"
	name		"Audio"
	device		"hw:1,0"	# optional
        format          "192000:32:2"
	mixer_type      "software"	# optional
	mixer_device	"default"	# optional
	mixer_control	"PCM"		# optional
##	mixer_index	"0"		# optional
}
#
# An example of an OSS output:
#
#audio_output {
#	type		"oss"
#	name		"My OSS Device"
##	device		"/dev/dsp"	# optional
##	mixer_type      "hardware"	# optional
##	mixer_device	"/dev/mixer"	# optional
##	mixer_control	"PCM"		# optional
#}
#
# An example of a shout output (for streaming to Icecast):
#
#audio_output {
#	type		"shout"
#	encoder		"vorbis"		# optional
#	name		"My Shout Stream"
#	host		"localhost"
#	port		"8000"
#	mount		"/mpd.ogg"
#	password	"hackme"
#	quality		"5.0"
#	bitrate		"128"
#	format		"44100:16:1"
##	protocol	"icecast2"		# optional
##	user		"source"		# optional
##	description	"My Stream Description"	# optional
##	url		"http://example.com"	# optional
##	genre		"jazz"			# optional
##	public		"no"			# optional
##	timeout		"2"			# optional
##	mixer_type      "software"		# optional
#}
#
# An example of a recorder output:
#
#audio_output {
#	type		"recorder"
#	name		"My recorder"
#	encoder		"vorbis"		# optional, vorbis or lame
#	path		"/var/lib/mpd/recorder/mpd.ogg"
##	quality		"5.0"			# do not define if bitrate is defined
#	bitrate		"128"			# do not define if quality is defined
#	format		"44100:16:1"
#}
#
# An example of a httpd output (built-in HTTP streaming server):
#
#audio_output {
#	type		"httpd"
#	name		"My HTTP Stream"
#	encoder		"vorbis"		# optional, vorbis or lame
#	port		"8000"
#	bind_to_address	"0.0.0.0"		# optional, IPv4 or IPv6
##	quality		"5.0"			# do not define if bitrate is defined
#	bitrate		"128"			# do not define if quality is defined
#	format		"44100:16:1"
#	max_clients	"0"			# optional 0=no limit
#}
#
# An example of a pulseaudio output (streaming to a remote pulseaudio server)
# Please see README.Debian if you want mpd to play through the pulseaudio
# daemon started as part of your graphical desktop session!
#
#audio_output {
#	type		"pulse"
#	name		"My Pulse Output"
##	server		"remote_server"		# optional
##	sink		"remote_server_sink"	# optional
##	media_role	"media_role"		#optional
#}
#
# An example of a winmm output (Windows multimedia API).
#
#audio_output {
#	type		"winmm"
#	name		"My WinMM output"
##	device		"Digital Audio (S/PDIF) (High Definition Audio Device)" # optional
#		or
##	device		"0"		# optional
##	mixer_type	"hardware"	# optional
#}
#
# An example of an openal output.
#
#audio_output {
#	type		"openal"
#	name		"My OpenAL output"
##	device		"Digital Audio (S/PDIF) (High Definition Audio Device)" # optional
#}
#
# An example of an sndio output.
#
#audio_output {
#	type		"sndio"
#	name		"sndio output"
#	mixer_type	"hardware"
#}
#
# An example of an OS X output:
#
#audio_output {
#	type		"osx"
#	name		"My OS X Device"
##	device		"Built-in Output"	# optional
##	channel_map      "-1,-1,0,1"	# optional
#}
#
## Example "pipe" output:
#
#audio_output {
#	type		"pipe"
#	name		"my pipe"
#	command		"aplay -f cd 2>/dev/null"
## Or if you're want to use AudioCompress
#	command		"AudioCompress -m | aplay -f cd 2>/dev/null"
## Or to send raw PCM stream through PCM:
#	command		"nc example.org 8765"
#	format		"44100:16:2"
#}
#
## An example of a null output (for no audio output):
#
#audio_output {
#	type		"null"
#	name		"My Null Output"
#	mixer_type      "none"			# optional
#}
#
###############################################################################


# Normalization automatic volume adjustments ##################################
#
# This setting specifies the type of ReplayGain to use. This setting can have
# the argument "off", "album", "track" or "auto". "auto" is a special mode that
# chooses between "track" and "album" depending on the current state of
# random playback. If random playback is enabled then "track" mode is used.
# See <https://wiki.hydrogenaud.io/index.php?title=Replaygain> for
# more details about ReplayGain.
# This setting is off by default.
#
#replaygain			"album"
#
# This setting sets the pre-amp used for files that have ReplayGain tags. By
# default this setting is disabled.
#
#replaygain_preamp		"0"
#
# This setting sets the pre-amp used for files that do NOT have ReplayGain tags.
# By default this setting is disabled.
#
#replaygain_missing_preamp	"0"
#
# This setting enables or disables ReplayGain limiting.
# MPD calculates actual amplification based on the ReplayGain tags
# and replaygain_preamp / replaygain_missing_preamp setting.
# If replaygain_limit is enabled MPD will never amplify audio signal
# above its original level. If replaygain_limit is disabled such amplification
# might occur. By default this setting is enabled.
#
#replaygain_limit		"yes"
#
# This setting enables on-the-fly normalization volume adjustment. This will
# result in the volume of all playing audio to be adjusted so the output has
# equal "loudness". This setting is disabled by default.
#
#volume_normalization		"no"
#
###############################################################################

# Character Encoding ##########################################################
#
# If file or directory names do not display correctly for your locale then you
# may need to modify this setting.
#
filesystem_charset		"UTF-8"
#
###############################################################################
Ważne są dane dla karty dźwiękowej którą identyfikujemy :

Kod: Zaznacz cały

cat /proc/asound/cards
lub

Kod: Zaznacz cały

aplay -l
tu tylko przykład :
**** List of PLAYBACK Hardware Devices ****
card 0: AUDIO [XMOS USB AUDIO], device 0: USB Audio [USB Audio]
Subdevices: 1/1
Subdevice #0: subdevice #0
Czasem się zdarza że podczas startu systemu pozycja / numer karty ulega zmianie i radio nie działa trzeba wtedy zapisać auto-uruchamianie (globalne) danej karty w pliku :

Kod: Zaznacz cały

nano /etc/asound.conf
wpis:

Kod: Zaznacz cały

pcm.!default {
    type hw
    card 0
    device 0
  }
  ctl.!default {
    type hw
    card 0
  }
lub

Kod: Zaznacz cały

defaults.pcm.card 0
defaults.ctl.card 0
W przypadku Bananapim2pro jako wyjście audio mamy wyłącznie HDMI które można co prawda wykorzystać jako kartę dźwiękowa ( np. przejściówka konwerter HDMI / RCA która daje b. dobre parametry ale jest to raczej rzadko stosowane i nie wiem czy ogólnie poprawne dla plików audio / mp3 / flac itd raczej tylko TV ) Mamy więc dylemat w wyborze karty dźwiękowej pod USB z dobrymi parametrami i obsługiwanej przez SBC / linux / kernel itd.
W moim przypadku przetestowałem dwie karty / konwertery USB które działają poprawnie na Bananapim2pro / Armbian / linux. Jedna karta to tania : no name ale działająca b. poprawnie 16 bitowa (PCM2706 /PCM5102A USB Audio DAC) co prawda układ PCM5102A na niej może dekodować 24/32 bity ale znowu układ PCM2706 ogranicza go do 16bit przynajmniej przez USB/RCA !
Obrazek
Druga karta ...USB / konwerter USB-I2S ( na chip-ie XMOS ) + modół (I2S/RCA) PCM5102A tzw. wersja ulepszona XU208 Xmos USB która działa OK nawet na wyższych częstotliwościach i wszystkich systemach Linux które testowałem a drivery są prawie w każdym kernelu :-)
To chyba jest już super wybór i koniec ciągłego borykania się z niemożnością uruchomienia serwisu I2S na platformach chińskich SBC i nie tylko oraz uzyskania poprawnego 32bit dźwięku.
ObrazekObrazek
Jak to podłączyć ?
Zielona płytka (XMOS) / Żółta płytka (PCM5102) / Uwagi / Alternatywa
DATA - DATA - Sygnał audio
BCLK - BCK - Zegar bitowy
LRCK - LRCK - Zegar kanałów
GND - GND - Masa układu
Brak (Zostaw wolny)- VCC - Podłącz do 5V w GPIO Banana Pi

Pin 5V z GPIO Banana Pi -> Pin VCC na żółtej płytce PCM5102.
Pin GND z GPIO Banana Pi -> Drugi (wolny) pin GND na żółtej płytce PCM5102.


Żeby uruchomić jakieś stacje radiowe z pilota musimy jeszcze skonfigurować dwa pliki : lircrc / plik playlistę ze stacjami radiowymi u mnie mpd poprawnie czyta: .pls / .m3u więcej w informacji terminal : mpd -V
lista radio.pls przykład:

Kod: Zaznacz cały

[playlist]
Version=2
numberofentries=170
File1=http://stream10.radioagora.pl/tuba140-1.mp3
Title1=RADIO POGODA
File2=http://gdansk1-1.radio.pionier.net.pl:8000/pl/tuba10-1.mp3
Title2=RADIO TOK FM
File3=http://stream3.polskieradio.pl:8900/
Title3=POLSKIE RADIO 1
File4=http://stream3.polskieradio.pl:8904/
Title4=POLSKIE RADIO 3
File5=http://stream3.polskieradio.pl:8080/
Title5=POLSKIE RADIO 24
lista radio.m3u

Kod: Zaznacz cały

http://stream10.radioagora.pl/tuba140-1.mp3
http://gdansk1-1.radio.pionier.net.pl:8000/pl/tuba10-1.mp3
http://stream3.polskieradio.pl:8900/
http://stream3.polskieradio.pl:8904/
http://51.68.135.155:80/stream
http://195.150.20.8:8000/rmf_5
http://stream3.polskieradio.pl:8080/
http://stream4.nadaje.com:8306/rbstudiosuwalki
http://stream4.nadaje.com:9680/radiokrakow-s3
Po stworzeniu takiej i np zapisie przez sieć / samba / ftp itd najlepiej nadać jej uprawnienia : chmod 777 bo inaczej są błędy przy ładowaniu do mpc :-) ... ja także zastosowałem to dla folderu /radio : (chmod 777 -R /radio)

Kod: Zaznacz cały

nano /radio/music/radio.m3u
Testujemy w terminalu czy radio działa musimy załadować utworzoną listę

Kod: Zaznacz cały

mpc load radio.m3u
mpc load radio.pls

Kod: Zaznacz cały

mpc play 
Czyścimy listę i ładujemy nową

Kod: Zaznacz cały

mpc clear
mpc load radio2.m3u
więcej info : https://manpages.ubuntu.com/manpages/tr ... mpc.1.html
Jeśli działa trzeba skonfigurować plik lircrc żeby można było sterować radiem przez pilota radiowego

Kod: Zaznacz cały

nano /etc/lirc/lircrc
przykładowy wpis:

Kod: Zaznacz cały

begin
  prog = irexec
  button = KEY_CHANNELDOWN
  config = mpc prev
  repeat = 0
end

begin
  prog = irexec
  button = KEY_CHANNELUP
  config = mpc next
  repeat = 0
end

begin
  prog = irexec
  button = KEY_LEFT
  config = mpc prev
  repeat = 0
end

begin
  prog = irexec
  button = KEY_RIGHT
  config = mpc next
  repeat = 0
end

begin
  prog = irexec
  button = KEY_DOWN
  config = mpc prev
  repeat = 0
end

begin
  prog = irexec
  button = KEY_UP
  config = mpc next
  repeat = 0
end

begin
  prog = irexec
  button = KEY_PLAY
  config = mpc toggle
end

begin
   prog = irexec
   button = KEY_VOLUMEDOWN
   config = mpc volume -3
   repeat = 0
end

begin
   prog = irexec
   button = KEY_VOLUMEUP
   config = mpc volume +3
   repeat = 0
end

begin
   prog = irexec
   button = KEY_STOP
   config = /root/mpc-stop.sh
   repeat = 0
end
po zapisie i restarcie prog. mpd / lircd ( ewentualnie reboot systemu ) radio powinno działać z pilota z funkcjami przydzielonymi do
poszczególnych klawiszy np. jeśli naciśniemy play / lub 1 ...i otrzymamy w terminalu komenda :irw : PLAY / 1 to wpisujemy w pliku lircrc

Kod: Zaznacz cały

sudo /etc/init.d/lircd restart
begin
prog = irexec
button = PLAY
config = mpc play
end

begin
prog = irexec
button = 1
config = mpc play 1
end
Uwaga w ten sposób możemy także uruchomić pilotem jakiś skrypt na linux-ie np Czytanie aktualnej daty i godziny : KLIK
begin
prog = irexec
button = RED
config = /root/skrypt.sh
repeat = 0
end
Niestety ale nie udało mi się uruchomić starego pilota z czujnikiem na podczerwień w prog. lirc .Mój pilot to standardowy Microsift (drivery mce / rc6 ) i bliźniak OrigenAe (nieco więcej przycisków) także na driverach rc6. Co dziwne na OrangePi lite oba działają prawidłowo. Ale skorzystałem z programu : ir-keytable i zadziałały.
Obrazek
ir-keytable konfiguracja pilota na podczerwień czyli czujnik na płytce OrangePi 3 LTS
komenda pokazuje informacje konfiguracyjne:

Kod: Zaznacz cały

ir-keytable 
np.

Kod: Zaznacz cały

Found /sys/class/rc/rc0/ with:
	Name: sunxi-ir
	Driver: sunxi-ir
	Default keymap: rc-empty
	Input device: /dev/input/event2
	LIRC device: /dev/lirc0
	Attached BPF protocols: Operacja nie obsługiwana
	Supported kernel protocols: lirc rc-5 rc-5-sz jvc sony nec sanyo mce_kbd rc-6 sharp xmp imon rc-mm 
	Enabled kernel protocols: lirc 
	bus: 25, vendor/product: 0001:0001, version: 0x0100
	Repeat delay = 500 ms, repeat period = 125 ms
Kompatybilne drivery do pilotów : lirc rc-5 rc-5-sz jvc sony nec sanyo mce_kbd rc-6 sharp xmp imon rc-mm
Włączony jest tylko : lirc
Jeśli chcemy sterownik : rc6 to wykonujemy

Kod: Zaznacz cały

ir-keytable -p rc-6,lirc
lub wszystkie: ir-keytable -p all
Teraz testujemy czy pilot działa komenda jest równoznaczna do polecenia irw z prog. lirc

Kod: Zaznacz cały

ir-keytable -t
U mnie działa ale kody są w dziwnym formacie np : scancode = 0x800f0405 zamiast : PLAY / STOP / 1 / RED / REVIND itd
Musimy wyszukać i załadować plik o rozszerzeniu .toml dotyczący naszego pilota u mnie rc6 który to zmieni (podobnie jak w prog. lirc plik lircd.conf) można w internecie lub w systemie w ścieżce : /lib/udev/rc_keymaps . U mnie jest plik: rc6_mce.toml
Zapisujemy:

Kod: Zaznacz cały

sudo cp /lib/udev/rc_keymaps/rc6_mce.toml /etc/rc_keymaps
Teraz jest OK

Kod: Zaznacz cały

root@orangepi3-lts:~# ir-keytable -t
Testing events. Please, press CTRL-C to abort.
33045.683183: lirc protocol(rc6_mce): scancode = 0x800f0422
33045.683217: event type EV_MSC(0x04): scancode = 0x800f0422
33045.683217: event type EV_KEY(0x01) key_down: KEY_OK(0x0160)
33045.683217: event type EV_SYN(0x00).
33045.816084: event type EV_KEY(0x01) key_up: KEY_OK(0x0160)
33045.816084: event type EV_SYN(0x00).
33048.810437: lirc protocol(rc6_mce): scancode = 0x800f0401 toggle=1
33048.810477: event type EV_MSC(0x04): scancode = 0x800f0401
33048.810477: event type EV_KEY(0x01) key_down: KEY_NUMERIC_1(0x0201)
33048.810477: event type EV_SYN(0x00).
33048.944042: event type EV_KEY(0x01) key_up: KEY_NUMERIC_1(0x0201)
33048.944042: event type EV_SYN(0x00).
33056.974660: lirc protocol(rc6_mce): scancode = 0x800f0410
33056.974703: event type EV_MSC(0x04): scancode = 0x800f0410
33056.974703: event type EV_KEY(0x01) key_down: KEY_VOLUMEUP(0x0073)
33056.974703: event type EV_SYN(0x00).
33057.108040: event type EV_KEY(0x01) key_up: KEY_VOLUMEUP(0x0073)
33057.108040: event type EV_SYN(0x00).
Żeby ta konfiguracja uruchamiała się automatycznie z systemem dla rc6 edytujemy plik

Kod: Zaznacz cały

nano /etc/rc_maps.cfg
i wstawiamy lub poprawiamy wpis dotyczący pilota rc6 / mce / restart systemu

Kod: Zaznacz cały

*                *                  /etc/rc_keymaps/rc6_mce.toml
możemy sprawdzić zawartość tablicy kluczy czy jest OK

Kod: Zaznacz cały

ir-keytable -r
Żeby jednak można było sterować radiem i prog. mpd / mpc nie możemy użyć programu lirc :-( ... jednak jest jakiś zamiennik :triggerhappy

Kod: Zaznacz cały

sudo apt-get install triggerhappy
Jeśli nie ma utwórz katalog:

Kod: Zaznacz cały

mkdir -p /etc/triggerhappy/triggers.d/
Uruchamiamy komendę do sprawdzenia reakcji pilota podobną w działaniu do : irw / ir-keytable -t

Kod: Zaznacz cały

thd -d /dev/input/event*
np. wynik:

Kod: Zaznacz cały

EV_KEY	KEY_PLAY	1	/dev/input/event2
# KEY_PLAY	1	command
EV_KEY	KEY_PLAY	0	/dev/input/event2
# KEY_PLAY	0	command
EV_KEY	KEY_STOP	1	/dev/input/event2
# KEY_STOP	1	command
EV_KEY	KEY_STOP	0	/dev/input/event2
# KEY_STOP	0	command
Tworzymy plik konfiguracyjny podobny do :lircrc z programu lirc ...do przypisywania przycisków pilota do akcji mpd / mpc ...lub skryptu.

Kod: Zaznacz cały

nano /etc/triggerhappy/triggers.d/triggerhappy.conf
np wpis:

Kod: Zaznacz cały

KEY_PLAY 1 /usr/bin/mpc play
KEY_STOP 1 /usr/bin/mpc stop
KEY_MEDIA 1 /root/mpc-start.sh
Uwaga program triggerhappy jest ustawiony na użytkownika nobody i skrypty nie będą działać brak uprawnień root-a
zmieniamy to w pliku na root:

Kod: Zaznacz cały

 nano /etc/systemd/system/multi-user.target.wants/triggerhappy.service
Teraz już działa przynajmniej klawisz play / stop :-) ...więcej ustawicie sami. Start usługi / status itd

Kod: Zaznacz cały

systemctl enable triggerhappy
systemctl start triggerhappy
systemctl status triggerhappy
Teraz konfiguracja programu lcdproc ...do wyświetlania na LCD zegara ( aktualnego czasu ):
Musimy wpisać odpowiednie dane odnośnie lokalizacji drivera hd44780, identyfikacji naszego LCD (f3) , 16x2 lub 40x2 , wielkość zegara itp
Edytujemy pliki LCDd.conf i lcdproc.conf i wstawiamy odpowiednie dane

Kod: Zaznacz cały

nano /etc/LCDd.conf
wpis:

Kod: Zaznacz cały

## Server section with all kinds of settings for the LCDd server ##
[server]

DriverPath=/usr/lib/aarch64-linux-gnu/lcdproc/
Driver=hd44780
Bind=127.0.0.1
Port=13666
ReportLevel=3
User=root
Foreground=no
Hello="Welcome to"
Hello="OrangePi3 LTS"
GoodBye="Internet Radio"
GoodBye="OrangePi3 LTS"
WaitTime=5
ServerScreen=off
Backlight=off
Heartbeat=off
TitleSpeed=4
ToggleRotateKey=Enter
PrevScreenKey=Left
NextScreenKey=Right


## The menu section. The menu is an internal LCDproc client. ##
[menu]

## Hitachi HD44780 driver ##
[HD44780]
ConnectionType=i2c
Device=/dev/i2c-0
Port=0x3f
Backlight=no
Size=40x2
DelayBus=false
DelayMult=1
Keypad=no
Speed=0
i2c_line_RS=0x01
i2c_line_RW=0x02
i2c_line_EN=0x04
i2c_line_BL=0x08

i2c_line_D4=0x10
i2c_line_D5=0x20
i2c_line_D6=0x40
i2c_line_D7=0x80
BacklightInvert=no

# EOF
lokalizacja drivera

Kod: Zaznacz cały

cd /
find -name hd44780.so

Kod: Zaznacz cały

nano /etc/lcdproc.conf
wpis:

Kod: Zaznacz cały

# LCDproc client configuration file

## general options ##
[lcdproc]
# address of the LCDd server to connect to
Server=localhost

# Port of the server to connect to
Port=13666

# set reporting level
ReportLevel=2

# report to to syslog ?
ReportToSyslog=false

# run in foreground [default: false; legal: true, false]
#Foreground=true

# PidFile location when running as daemon [default: /var/run/lcdproc.pid]
#PidFile=/var/run/lcdproc.pid

# slow down initial announcement of modes (in 1/100s)
#delay=2

# display name for the main menu [default: LCDproc HOST]
#DisplayName=lcdproc


## screen specific configuration options ##

[CPU]
# Show screen
Active=false
OnTime=1
OffTime=2
ShowInvisible=false


[Iface]
# Show screen
Active=false

# Show stats for Interface0
Interface0=eth0
# Interface alias name to display [default: <interface name>]
Alias0=LAN

# Show stats for Interface1
Interface1=wlan0
Alias1=WLAN

# Show stats for Interface2
#Interface2=eth2
#Alias2=MGMT

# for more than 3 interfaces change MAX_INTERFACES in iface.h and rebuild

# Units to display [default: byte; legal: byte, bit, packet]
unit=bit

# add screen with transferred traffic
#transfer=TRUE


[Memory]
# Show screen
Active=false


[Load]
# Show screen
Active=false
# Min Load Avg at which the backlight will be turned off [default: 0.05]
LowLoad=0.05
# Max Load Avg at which the backlight will start blinking [default: 1.3]
HighLoad=1.3


[TimeDate]
# Show screen
Active=false
# time format [default: %H:%M:%S; legal: see strftime(3)]
TimeFormat="%H:%M:%S"
# date format [default: %x; legal: see strftime(3)]
DateFormat="%x"


[About]
# Show screen
Active=false


[SMP-CPU]
# Show screen
Active=false


[OldTime]
# Show screen
Active=false
# time format [default: %H:%M:%S; legal: see strftime(3)]
TimeFormat="%H:%M:%S"
# date format [default: %x; legal: see strftime(3)]
DateFormat="%x"
# Display the title bar in two-line mode. Note that with four lines or more
# the title is always shown. [default: true; legal: true, false]
#ShowTitle=false


[BigClock]
# Show screen
Active=true


[Uptime]
# Show screen
Active=false


[Battery]
# Show screen
Active=false


[CPUGraph]
# Show screen
Active=false


[ProcSize]
# Show screen
Active=false


[Disk]
# Show screen
Active=false


[MiniClock]
# Show screen
Active=false
# time format [default: %H:%M; legal: see strftime(3)]
TimeFormat="%H:%M"


# EOF
Teraz musimy podłączyć jakiś LCD żeby można było w sposób komfortowy podejrzeć np. nazwę nadawanej stacji radiowej / nazwę
odtwarzanego utworu muzycznego / nazwę zespołu jeśli takowe dane są dostarczane ...mnie tyle wystarczy :-)
Musicie szukać jakiś wyświetlaczy przynajmniej LCD 16x2 lub 40x2 kompatybilnych z driverami : hd44780 ten drugi wyświetli wszystkie info na LCD a na 16x2 zawija text i nie wszystko się mieści (chyba że jesteśmy programistami w pythonie to można sobie dostosować specjalne przewijanie) Teraz możemu skorzystać z pomocy AI / Gemini. Ja zastosowałem LCD 40x2 firmy Winstar (5V) (oled) oparty o kontroler / driver: WS0010 kompatybilny z hd44780 + Konwerter I2C dla wyświetlacza LCD HD44780
Obrazek Obrazek
Podpinanie LCD do Bananapi ...najpierw podpinamy do LCD konwerter I2C w przypadku 16x2 jest prosto bo zawsze jest tak samo lutujemy 16 pinów do LCD jak na zdjęciu (na LCD tak 16x2 jak 40x2 piny są numerowane 1 do 16 więc nie ma problemu z tym że 40x2 piny ma nie po kolei a na przemian w dwóch rzędach )
Konwerter I2C ma cztery piny które potem podłączamy do płyty BananaPim2 pro :
GND - masa
VCC - napięcie (3 / 5V)
SDA - dane
SCL - dane
Schemat pinów na BananaPim2 pro i info podłączenia pinów konwertera I2C: vcc/sda/scl/gnd
Obrazek
Dodajemy wpisy dla poprawnej konfiguracji serwisu I2C i LCD ( można to zrobić też przez: armbian-config )

Kod: Zaznacz cały

cd /boot
sudo nano /boot/armbianEnv.txt
wstawiamy :

Kod: Zaznacz cały

overlays=sm1-odroid-c4-i2c0 sm1-odroid-c4-i2c1
Restart systemu po którym powinien być uruchomiony interface I2C dla LCD
jeszcze instalujemy

Kod: Zaznacz cały

sudo apt-get install -y python-smbus i2c-tools

jeśli w systemie nie ma python-smbus to może:

Kod: Zaznacz cały

sudo apt-get install i2c-tools
sudo apt-get install python3-smbus
sudo apt-get install libhdf5-dev 
sudo apt install pip
sudo pip install smbus
sudo pip3 install smbus
Teraz po wydaniu komendy :

Kod: Zaznacz cały

sudo i2cdetect -y 0
powinno być np.:

Kod: Zaznacz cały

root@orangepi3-lts:~# sudo i2cdetect -y 0
     0  1  2  3  4  5  6  7  8  9  a  b  c  d  e  f
00:                         -- -- -- -- -- -- -- -- 
10: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 
20: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 
30: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 3f 
40: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 
50: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 
60: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 
70: -- -- -- -- -- -- -- --                         
Info : 3f świadczy że nasz LCD został wykryty przez system :-) ...z innym LCD może być inny wpis / w innym miejscu np : 5d / 2c itd
Teraz już tylko odpowiedni program napisany w python -ie do obsługi naszego LCD / Bananapim2pro / mpd / mpc ...
tworzymy plik w pythonie np. o nazwie np. start.py

Kod: Zaznacz cały

nano /ścieżka_do_skryptu/start.py
w kodzie musicie zmienić pewne parametry dotyczące swojego LCD 16x2 lub 40x2 itp i informacji odnośnie LCD u mnie :3f

Kod: Zaznacz cały

#!/usr/bin/env python3
# -*- coding: utf-8 -*-

import smbus
import time
import subprocess

from time import sleep, strftime
from datetime import datetime
from subprocess import *

# Define some device parameters
I2C_ADDR = 0x3f
LCD_WIDTH = 40
LCD_HEIGHT = 2

# Define some device constants
LCD_CHR = 1
LCD_CMD = 0

LCD_LINE_1 = 0x80
LCD_LINE_2 = 0xC0
LCD_LINE_3 = 0x94
LCD_LINE_4 = 0xD4

LCD_BACKLIGHT  = 0x08  # On
#LCD_BACKLIGHT = 0x0C  # Assuming "On" was intended

ENABLE = 0b00000100

# Timing constants
E_PULSE = 0.005
E_DELAY = 0.005

# Open I2C interface
bus = smbus.SMBus(0)

def lcd_byte(bits, mode):
    bits_high = mode | (bits & 0xF0) | LCD_BACKLIGHT
    bits_low = mode | ((bits << 4) & 0xF0) | LCD_BACKLIGHT

    bus.write_byte(I2C_ADDR, bits_high)
    lcd_toggle_enable(bits_high)

    bus.write_byte(I2C_ADDR, bits_low)
    lcd_toggle_enable(bits_low)

def lcd_toggle_enable(bits):
    time.sleep(E_DELAY)
    bus.write_byte(I2C_ADDR, (bits | ENABLE))
    time.sleep(E_PULSE)
    bus.write_byte(I2C_ADDR, (bits & ~ENABLE))
    time.sleep(E_DELAY)

def lcd_string(message, line):
    message = message.ljust(LCD_WIDTH, " ")
    lcd_byte(line, LCD_CMD)

    for i in range(LCD_WIDTH):
        lcd_byte(ord(message[i]), LCD_CHR)

def replace_pl(chars):
    pl = {
        'ą': 'a', 'ć': 'c', 'ę': 'e', 'ł': 'l',
        'ń': 'n', 'ó': 'o', 'ś': 's', 'ź': 'z', 'ż': 'z',
        'Ą': 'A', 'Ć': 'C', 'Ę': 'E', 'Ł': 'L',
        'Ń': 'N', 'Ó': 'O', 'Ś': 'S', 'Ź': 'Z', 'Ż': 'Z',
    }
    for f, t in pl.items():
        chars = chars.replace(f, t)
    return chars

def run_cmd(cmd):
    result = subprocess.run(cmd, shell=True, stdout=subprocess.PIPE)
    return result.stdout.decode('utf-8')

def main():
    counter = 0
    while True:
        ekran1 = replace_pl(run_cmd('sudo mpc -v'))
        statusLines = ekran1.splitlines()
        ekran1 = statusLines[1] if len(statusLines) > 1 else ""

        if ekran1 != "":
            ekran1L1 = ekran1.split(' ', 1)[0].strip()
            ekran1L2temp = ekran1.split(' ', 1)[1].strip() if ' ' in ekran1 else ""
            ekran1L2 = ekran1L2temp.split(' ', 1)[0].strip()

        ekran2 = replace_pl(run_cmd('sudo mpc -f %name%')).splitlines()[0]
        ekran2L1 = ekran2[0:40]
        ekran2L2 = ekran2[40:80]

        ekran3 = replace_pl(run_cmd('sudo mpc -f %artist%')).splitlines()[0]
        ekran3L1 = ekran3[0:40]
        ekran3L2 = ekran3[40:80]

        ekran4 = replace_pl(run_cmd('sudo mpc -f %title%')).splitlines()[0]
        ekran4L1 = ekran4[0:40]
        ekran4L2 = ekran4[40:80]

        ekran5 = replace_pl(run_cmd('sudo mpc status "jakość dźwięku : %kbitrate% bitrate audio format: %audioformat%"')).splitlines()[0]
        ekran5L1 = ekran5[0:40]
        ekran5L2 = ekran5[40:80]

        if counter == 1:
            if ekran1 == "":
                counter = 7
            else:
                lcd_string(ekran1L1, LCD_LINE_1)
                lcd_string(ekran1L2, LCD_LINE_2)
        if counter == 7:
            if ekran2 == "":
                counter = 14
            else:
                lcd_string(ekran2L1, LCD_LINE_1)
                lcd_string(ekran2L2, LCD_LINE_2)
        if counter == 14:
            if ekran3 == "":
                counter = 30
            else:
                lcd_string(ekran3L1, LCD_LINE_1)
                lcd_string(ekran3L2, LCD_LINE_2)
        if counter == 30:
            if ekran4 == "":
                counter = 46
            else:
                lcd_string(ekran4L1, LCD_LINE_1)
                lcd_string(ekran4L2, LCD_LINE_2)
        if counter == 46:
            if ekran5 == "":
                counter = 52
            else:
                lcd_string(ekran5L1, LCD_LINE_1)
                lcd_string(ekran5L2, LCD_LINE_2)

        sleep(0.1)
        counter += 1
        if counter == 60:
            counter = 1

if __name__ == '__main__':
    try:
        main()
    except KeyboardInterrupt:
        pass
    finally:
        lcd_byte(0x00, LCD_CMD)
        lcd_byte(0x01, LCD_CMD)
        lcd_byte(0x08, LCD_CMD)
Możemy przetestować czy działa. Uruchamiamy radio z pilota lub terminal :mpc play

autostart na Armbian / linux

Kod: Zaznacz cały

nano /etc/rc.local
wpis

Kod: Zaznacz cały

#!/bin/sh -e
#
# rc.local
#
# This script is executed at the end of each multiuser runlevel.
# Make sure that the script will "exit 0" on success or any other
# value on error.
#
# In order to enable or disable this script just change the execution
# bits.
#
# By default this script does nothing.
/ścieżka_do_pliku/skrypt &
exit 0
U mnie działa czyli wyświetla nazwę stacji radiowej / artystę / nazwę odtwarzanego utworu (jeśli stacja takowe nadaje)
Z zegarem na LCD miałem spore kłopoty a dokładnie pomiędzy dwoma programami lcdproc / prog. python do obsługi LCD / mpd /mpc. Sam program lcdproc działa OK i zegar jest wyświetlany prawidłowo ale zmiana między w/w powoduje błędy na wyświetlaczu LCD. Jest to spowodowane konkretnym LCD i jego podzespołami / możliwościami ...w skrócie trzeba znaleźć takie ustawienia żeby przed każdym uruchomieniem danego skryptu pamięć ram na LCD była wyczyszczona ! i w przypadku LCD Winstar jest problem z opóźnieniami bo jest to niby nowoczesny LCD ale wymaga długich opóźnień i jakiś dziwnych podwójnych czyszczeń w/w pamięci LCD ?
Wszystkie pliki są w systemie w ścieżce : /root lub /home/user ...zależnie jak wybraliśmy przy instalacji systemu Armbian.
Do poprawnego działania skorzystałem także z programu liblcm1602 który wymaga skompilowania.

Kod: Zaznacz cały

cd /root/liblcm1602
make clean
make
W plikach o nazwach : example.c / example2.c /example3.c - edytujemy i zmieniamy swoje dane dotyczące do swojego LCD : 0x3f
można ponownie skompilować po zmianie.
uruchamiając plik / skrypt mpc-start.sh z terminala lub przyciskiem z pilota uzyskałem sprawdzenie czy mpc odtwarza radio czy nie jeśli tak to wyświetla informację o w/w jeśli nie uruchamia Zegar centralnie na LCD :

Kod: Zaznacz cały

cd /root
/bin/bash ./mpc-start.sh
Plik : mpc-stop.sh - podpinam do przycisku pilota STOP który wyłącza odtwarzanie mpc/mpd i uruchamia zegar jw.
Plik: lcd.sh - sprawdza czy prog. LCDd jest uruchomiony jeśli tak nie robi nic jeśli nie uruchamia zegar
Plik: mpc.sh - sprawdza czy prog. mpc odtwarza radio ( tak naprawdę czy skrypt python-a jest uruchomiony ) jeśli tak nie robi nic ...jeśli nie uruchamia skrypt pythona do obsługi LCD / mpc /mpd
Na razie nie wiem czy nie umieszczę jednego do ciągłego sprawdzania np. w usłudze : cron
Można kombinować ... pozostawiam to każdemu jeśli się umie programować to super jeśli nie to wystarczy ta podstawowa konfiguracja lub pomoc AI / Gemini.
Dodatkowe informacje:
Można zobaczyć jak mniej więcej to działa ( sory za jakość wideo ) KLIK
Parametry karty dźwiękowej w Linux-ie można uzyskać z komendy (zmieniając tylko card1 / 2 itd):

Kod: Zaznacz cały

cat /proc/asound/card1/pcm0p/sub0/hw_params
a w prog. mpd można wymusić / sprawdzić w/w np wpisem w mpd.conf:

Kod: Zaznacz cały

format          "192000:32:2"
To informacje dla tych co lubią lepszą jakość audio bo dużo stacji radiowych nadaje utwory w już 192 a nawet 320 bitrate
Radio / Player oparty o BananaPI / mpd / mpc ma duży plus bo można nim sterować także przez PC ...linux / windows / androida (na linuxa jest prog. Ymuse lub przez www : Rompr) itd
Bananapim2pro działa naprawdę OK ma jak wspomniałem wsparcie developera Armbian/standard także CPU po zastosowaniu wysokiego radiatora uzyskuje akceptowalną temperaturę (w zamkniętej ciasnej obudowie) : 45 - 55 C
Obrazek
Obudowę każdy zrobi sobie według gustu :-)
Mój obraz : zamieszczę na google drive
pozdro