2022年11月30日水曜日

Raspberry Pi でOLEDにmpd 曲名を追加(Python3 ver.) 曲名full test ver.

長い曲名の後半が表示されてない問題への、とりえずの対応版です。

長い場合は、次行に表示するように試みる。


#!/usr/bin/env python3

import os

import os.path

import re

#

import time

import Adafruit_GPIO.SPI as SPI

import Adafruit_SSD1306


from PIL import Image

from PIL import ImageDraw

from PIL import ImageFont

import subprocess

# Raspberry Pi pin configuration:

RST = 24

# Note the following are only used with SPI:

DC = 23

SPI_PORT = 0

SPI_DEVICE = 0

# Beaglebone Black pin configuration:

# RST = 'P9_12'

# Note the following are only used with SPI:

# DC = 'P9_15'

# SPI_PORT = 1

# SPI_DEVICE = 0

# 128x32 display with hardware I2C:

##disp = Adafruit_SSD1306.SSD1306_128_32(rst=RST)

# 128x64 display with hardware I2C:

# disp = Adafruit_SSD1306.SSD1306_128_64(rst=RST)

# Note you can change the I2C address by passing an i2c_address parameter like:

disp = Adafruit_SSD1306.SSD1306_128_64(rst=RST, i2c_address=0x3C)

# Alternatively you can specify an explicit I2C bus number, for example

# with the 128x32 display you would use:

# disp = Adafruit_SSD1306.SSD1306_128_32(rst=RST, i2c_bus=2)

# 128x32 display with hardware SPI:

# disp = Adafruit_SSD1306.SSD1306_128_32(rst=RST, dc=DC, spi=SPI.SpiDev(SPI_PORT, SPI_DEVICE, max_speed_hz=8000000))

# 128x64 display with hardware SPI:

# disp = Adafruit_SSD1306.SSD1306_128_64(rst=RST, dc=DC, spi=SPI.SpiDev(SPI_PORT, SPI_DEVICE, max_speed_hz=8000000))

# Alternatively you can specify a software SPI implementation by providing

# digital GPIO pin numbers for all the required display pins.  For example

# on a Raspberry Pi with the 128x32 display you might use:

# disp = Adafruit_SSD1306.SSD1306_128_32(rst=RST, dc=DC, sclk=18, din=25, cs=22)

# Initialize library.

disp.begin()

# Clear display.

disp.clear()

disp.display()

# Create blank image for drawing.

# Make sure to create image with mode '1' for 1-bit color.

width = disp.width

height = disp.height

image = Image.new('1', (width, height))

# Get drawing object to draw on image.

draw = ImageDraw.Draw(image)

# Draw a black filled box to clear the image.

draw.rectangle((0,0,width,height), outline=0, fill=0)

# Draw some shapes.

# First define some constants to allow easy resizing of shapes.

padding = -2

top = padding

bottom = height-padding

# Move left to right keeping track of the current x position for drawing shapes.

x = 0

# Load default font.

font = ImageFont.load_default()

## font2

#font = ImageFont.truetype('/home/hogehoge/font/misakifont/misaki_gothic.ttf', 8, encoding='unic')

font2 = ImageFont.truetype('/home/hogehoge/font/misakifont/misaki_gothic.ttf', 8, encoding='unic')

# Alternatively load a TTF font.  Make sure the .ttf font file is in the same directory as the python script!

# Some other nice fonts to try: http://www.dafont.com/bitmap.php

# font = ImageFont.truetype('Minecraftia.ttf', 8)

while True:

    # Draw a black filled box to clear the image.

    draw.rectangle((0,0,width,height), outline=0, fill=0)

    # Shell scripts for system monitoring from here : https://unix.stackexchange.com/questions/119126/command-to-display-memory-usage-disk-usage-and-cpu-load

    cmd = "hostname -I | cut -d\' \' -f1"

    IP = subprocess.check_output(cmd, shell = True )

    cmd = "top -bn1 | grep load | awk '{printf \"CPU Load: %.2f\", $(NF-2)}'"

    CPU = subprocess.check_output(cmd, shell = True )

    cmd = "free -m | awk 'NR==2{printf \"Mem: %s/%sMB %.2f%%\", $3,$2,$3*100/$2 }'"

    MemUsage = subprocess.check_output(cmd, shell = True )

    cmd = "df -h | awk '$NF==\"/\"{printf \"Disk: %d/%dGB %s\", $3,$2,$5}'"

    Disk = subprocess.check_output(cmd, shell = True )

    cmd = "uptime -p"

    Uptime = subprocess.check_output(cmd, shell = True )

    cmd = "mpc current"

    FullSongName = subprocess.check_output(cmd, shell = True )

    fo=os.path.basename(FullSongName)

    f=fo.decode('utf-8')

    regexp = re.compile("^[0-9]+ +|^[0-9]+-")

    if f=='':

       SongName=''

    else:

       fn, ext = os.path.splitext(f)

       pre = regexp.search(fn)

       if pre is None:

          SongName=fn

       else:

          SongName=fn.replace(pre.group(), "")

    # Write two lines of text.

    draw.text((x, top),       "IP: " + str(IP.decode('utf-8')),  font=font, fill=255)

    draw.text((x, top+8),    "CPU " + str(CPU.decode('utf-8')),  font=font, fill=255)

    draw.text((x, top+16),    str(MemUsage.decode('utf-8')),  font=font, fill=255)

#    draw.text((x, top+25),    str(Disk),  font=font, fill=255)

    draw.text((x, top+25),    str(Disk.decode('utf-8')),  font=font, fill=255)

    draw.text((x, top+34),    str(Uptime.decode('utf-8')),  font=font, fill=255)

    if SongName.isascii():

       draw.text((x, top+43),    SongName[0:32],  font=font2, fill=255)

    else:

       draw.text((x, top+43),    SongName[0:17],  font=font2, fill=255)

# 32 char display

    if SongName.isascii():

      draw.text((x, top+52),    SongName[32:],  font=font2, fill=255)

    else:

      draw.text((x, top+52),    SongName[17:],  font=font2, fill=255)

    # Display image.

    disp.image(image)

    disp.display()

#    time.sleep(.1)

    time.sleep(30)

2022年11月28日月曜日

Raspberry Pi でOLEDにmpd 曲名を追加(Python3 ver.)


Adafruit_Python_SSD1306
のサンプルスクリプトstats.pyにmpd の曲名を追加してみました Python3 ver.

Python2 も終わったので3対応かな。OSのver. upは未だですが。
(新しいmicroSD card未入手)



# apt install python3-pip
# pip3 install Adafruit-SSD1306
# pip3 install RPi.GPIO  <--- 必要か不明?!
# pip3 install pillow

[python script ]

#!/usr/bin/env python3

import os
import os.path
import re

import time

import Adafruit_GPIO.SPI as SPI
import Adafruit_SSD1306

from PIL import Image
from PIL import ImageDraw
from PIL import ImageFont

import subprocess

# Raspberry Pi pin configuration:
RST = 24
# Note the following are only used with SPI:
DC = 23
SPI_PORT = 0
SPI_DEVICE = 0


# Note you can change the I2C address by passing an i2c_address parameter like:
disp = Adafruit_SSD1306.SSD1306_128_64(rst=RST, i2c_address=0x3C)

# Initialize library.
disp.begin()

# Clear display.
disp.clear()
disp.display()

# Create blank image for drawing.
# Make sure to create image with mode '1' for 1-bit color.
width = disp.width
height = disp.height
image = Image.new('1', (width, height))

# Get drawing object to draw on image.
draw = ImageDraw.Draw(image)

# Draw a black filled box to clear the image.
draw.rectangle((0,0,width,height), outline=0, fill=0)

# Draw some shapes.
# First define some constants to allow easy resizing of shapes.
padding = -2
top = padding
bottom = height-padding
# Move left to right keeping track of the current x position for drawing shapes.
x = 0


# Load default font.
font = ImageFont.load_default()

## font2

font2 = ImageFont.truetype('/home/hogehoge/font/misakifont/misaki_gothic.ttf', 8, encoding='unic')

# Alternatively load a TTF font.  Make sure the .ttf font file is in the same directory as the python script!
# Some other nice fonts to try: http://www.dafont.com/bitmap.php
# font = ImageFont.truetype('Minecraftia.ttf', 8)

while True:

    # Draw a black filled box to clear the image.
    draw.rectangle((0,0,width,height), outline=0, fill=0)

    # Shell scripts for system monitoring from here : https://unix.stackexchange.com/questions/119126/command-to-display-memory-usage-disk-usage-and-cpu-load
    cmd = "hostname -I | cut -d\' \' -f1"
    IP = subprocess.check_output(cmd, shell = True )
    cmd = "top -bn1 | grep load | awk '{printf \"CPU Load: %.2f\", $(NF-2)}'"
    CPU = subprocess.check_output(cmd, shell = True )
    cmd = "free -m | awk 'NR==2{printf \"Mem: %s/%sMB %.2f%%\", $3,$2,$3*100/$2 }'"
    MemUsage = subprocess.check_output(cmd, shell = True )
    cmd = "df -h | awk '$NF==\"/\"{printf \"Disk: %d/%dGB %s\", $3,$2,$5}'"
    Disk = subprocess.check_output(cmd, shell = True )
#
    cmd = "uptime -p"
    Uptime = subprocess.check_output(cmd, shell = True )

    cmd = "mpc current"
    FullSongName = subprocess.check_output(cmd, shell = True )

    fo=os.path.basename(FullSongName)
    f=fo.decode('utf-8')
    regexp = re.compile("^[0-9]+ +|^[0-9]+-")
    if f=='':
       SongName=''
    else:
       fn, ext = os.path.splitext(f)
       pre = regexp.search(fn)
       if pre is None:
          SongName=fn
       else:
          SongName=fn.replace(pre.group(), "")

    # Write two lines of text.
    draw.text((x, top),       "IP: " + str(IP.decode('utf-8')),  font=font, fill=255)
    draw.text((x, top+8),    "CPU " + str(CPU.decode('utf-8')),  font=font, fill=255)
    draw.text((x, top+16),    str(MemUsage.decode('utf-8')),  font=font, fill=255)
    draw.text((x, top+25),    str(Disk.decode('utf-8')),  font=font, fill=255)
    draw.text((x, top+34),    str(Uptime.decode('utf-8')),  font=font, fill=255)
    draw.text((x, top+43),    SongName,  font=font2, fill=255)
   # Display image.
    disp.image(image)
    disp.display()
    time.sleep(30)

2022年11月17日木曜日

Raspberry Pi Zero Again(4) lirc(Debian 11(Bullseye) base)

 赤外線リモコン用の設定を従来どおりしたのだが

使えない

よく見ると、必要なソフトがあがって無い!!

各種サービスがデフォルトで無効化されていた。

手動で、有効化及び起動した。このパッケージは変だーーーぞ

cd /lib/systemd/system

  systemctl enable lircd-setup.service

  systemctl start lircd-setup.service

  systemctl enable lircd-uinput.service

  systemctl start lircd-uinput.service

  systemctl enable lircmd.service

  systemctl start lircmd.service

  systemctl enable irexec.service

  systemctl start irexec.service

root@zeroxxx:/lib/systemd/system# ps axg|grep lirc

  499 ?        Ss     0:00 /usr/sbin/lircd --nodaemon

 1060 ?        Ss     0:00 /usr/sbin/lircd-uinput

 1121 ?        Ss     0:00 /usr/sbin/lircmd --nodaemon

 1147 ?        Ss     0:00 /usr/bin/irexec /etc/lirc/irexec.lircrc


これで、使えるようになった。

Raspberry Pi Zero Again(3) audio(Debian 11(Bullseye) base)

なかなか音源デバイスを認識しなくて困った。もともとH/W無いしね。。

/boot/config.txt

dtparam=audio=on

は必要

従来のver.ではOKだった

dtoverlay=pwm-2chan,pin2=13,func2=4

では、NG

で、

dtoverlay=audremap,swap_lr=pins_12_13

に変更してやっとハードウェアデバイスを認識するようになった。

ex)

root@zeroXXX:~# aplay -L

null

    Discard all samples (playback) or generate zero samples (capture)

hw:CARD=Headphones,DEV=0

    bcm2835 Headphones, bcm2835 Headphones

    Direct hardware device without any conversions

plughw:CARD=Headphones,DEV=0

    bcm2835 Headphones, bcm2835 Headphones

    Hardware device with all software conversions

default:CARD=Headphones

    bcm2835 Headphones, bcm2835 Headphones

    Default Audio Device

sysdefault:CARD=Headphones

    bcm2835 Headphones, bcm2835 Headphones

    Default Audio Device

dmix:CARD=Headphones,DEV=0

    bcm2835 Headphones, bcm2835 Headphones

    Direct sample mixing device 

Raspberry Pi Zero Again(2) wifi driver up(Debian 11(Bullseye) base)

 2016/3最初に取得したZeroは、2W位でusbデバイスを認識しなくなりました(初期不良orオペミスかは不明)

(有線10base/T のモジュールで繋げていた時期もありますが。。)

そこで出会ったのが、以下のサイトです。


ESP-12Fのwifi機能を使うプロジェクトです。

https://hackaday.io/project/8678/instructions

今回、久々にdriverが make出来ました。

以下、当該サイトのドキュメント通りですが (w/o HARDWARE setting )

# sh -c 'echo "dtoverlay=sdio,poll_once=off" >> /boot/config.txt'

reboot

# wget https://github.com/al177/esp8089/releases/download/1.9.20220717/esp8089-dkms_1.9.20220717_all.deb.gz

# gunzip esp8089-dkms_1.9.20220717_all.deb.gz

# dpkg -i esp8089-dkms_1.9.20220717_all.deb

# modprobe esp8089


/etc/modules への esp8089 追加も忘れずに





Raspberry Pi Zero Again(1) xxxx renamed from wlan0

 Raspberry Pi Zero w 2 とか w/whとか入手困難になってるので、

埃を被ってた w/o wifi の奴の OS新しくしてみました。

ちょっとwifiが特殊な設定なので、とりあえずwifiドングルを刺して起動

してみると、

rtl8192cu 1-1:1.0 wlx00a0009aa8ff: renamed from wlan0


てな感じで、勝手に変えられるんですね。(wlマックアドレス文字列)


ネットの情報だと、当該現象は多々あるようばんですが、

対処方法として特に多いのが、

/lib/udev/rules.d/ 配下に色々設定せよとのことでしたが

当該環境では解決せず、

結局、以下設定で解決しました。

net.ifnames=0 

を

/boot/cmdline.txt

の末尾に追加!!!

root@zero107:~# cat /boot/cmdline.txt

dwc_otg.lpm_enable=0 console=serial0,115200 console=tty1 root=PARTUUID=a9d07efd-02 rootfstype=ext4 elevator=deadline fsck.repair=yes rootwait net.ifnames=0

root@zero107:~#

これで、wlan0 renameされなくなりました

当該情報公開者に、感謝です。


2021年11月8日月曜日

Raspberry Pi Zero 2 W arrived!

 今日の午前中に届いたようです。(宅配ボックスに隠れてました)

今回は、英国から5営業日位で届きました。


とりあえず、電源入れてみた。

最低限の動作確認です。


[基本情報]

# vcgencmd version

Copyright (c) 2012 Broadcom

version 51215b4f6e3966401ecd99652a35cf1c25069113 (clean) (release) (start_cd)



# cat /proc/cpuinfo

processor       : 0

model name      : ARMv7 Processor rev 4 (v7l)

BogoMIPS        : 38.40

Features        : half thumb fastmult vfp edsp neon vfpv3 tls vfpv4 idiva idivt vfpd32 lpae evtstrm crc32

CPU implementer : 0x41

CPU architecture: 7

CPU variant     : 0x0

CPU part        : 0xd03

CPU revision    : 4


あと3 core


# cat /proc/meminfo


MemTotal:         486968 kB

MemFree:          351312 kB

MemAvailable:     393960 kB


うーん。最低1GBは欲しいですね。。。。



# cat /sys/devices/system/cpu/cpu0/cpufreq/cpuinfo_max_freq


1000000


控え目?!


# vcgencmd measure_temp


temp=44.0'C


結構熱い!!



定番の

[UNIX Benchmark]


========================================================================

   BYTE UNIX Benchmarks (Version 5.1.3)


   System: piz2w: GNU/Linux

   OS: GNU/Linux -- 5.10.63-v7+ -- #1459 SMP Wed Oct 6 16:41:10 BST 2021

   Machine: armv7l (unknown)

   Language: en_US.utf8 (charmap="ANSI_X3.4-1968", collate="ANSI_X3.4-1968")

   CPU 0: ARMv7 Processor rev 4 (v7l) (0.0 bogomips)


   CPU 1: ARMv7 Processor rev 4 (v7l) (0.0 bogomips)


   CPU 2: ARMv7 Processor rev 4 (v7l) (0.0 bogomips)


   CPU 3: ARMv7 Processor rev 4 (v7l) (0.0 bogomips)


   19:04:09 up 19 min,  1 user,  load average: 0.91, 0.58, 0.30; runlevel 5


------------------------------------------------------------------------

Benchmark Run: 月 11月 08 2021 19:04:10 - 19:33:18

4 CPUs in system; running 4 parallel copies of tests


Dhrystone 2 using register variables       14246429.6 lps   (10.0 s, 7 samples)

Double-Precision Whetstone                     4259.9 MWIPS (10.1 s, 7 samples)

Execl Throughput                               1757.7 lps   (29.9 s, 2 samples)

File Copy 1024 bufsize 2000 maxblocks        160829.8 KBps  (30.0 s, 2 samples)

File Copy 256 bufsize 500 maxblocks           43617.6 KBps  (30.0 s, 2 samples)

File Copy 4096 bufsize 8000 maxblocks        475423.0 KBps  (30.0 s, 2 samples)

Pipe Throughput                              534290.6 lps   (10.0 s, 7 samples)

Pipe-based Context Switching                  93582.7 lps   (10.0 s, 7 samples)

Process Creation                               3932.1 lps   (30.0 s, 2 samples)

Shell Scripts (1 concurrent)                   3687.7 lpm   (60.0 s, 2 samples)

Shell Scripts (8 concurrent)                    491.2 lpm   (60.3 s, 2 samples)

System Call Overhead                        1815146.0 lps   (10.0 s, 7 samples)


System Benchmarks Index Values               BASELINE       RESULT    INDEX

Dhrystone 2 using register variables         116700.0   14246429.6   1220.8

Double-Precision Whetstone                       55.0       4259.9    774.5

Execl Throughput                                 43.0       1757.7    408.8

File Copy 1024 bufsize 2000 maxblocks          3960.0     160829.8    406.1

File Copy 256 bufsize 500 maxblocks            1655.0      43617.6    263.6

File Copy 4096 bufsize 8000 maxblocks          5800.0     475423.0    819.7

Pipe Throughput                               12440.0     534290.6    429.5

Pipe-based Context Switching                   4000.0      93582.7    234.0

Process Creation                                126.0       3932.1    312.1

Shell Scripts (1 concurrent)                     42.4       3687.7    869.7

Shell Scripts (8 concurrent)                      6.0        491.2    818.7

System Call Overhead                          15000.0    1815146.0   1210.1

                                                                   ========

System Benchmarks Index Score                                         558.3


[os ver.]


# lsb_release -a

No LSB modules are available.

Distributor ID: Raspbian

Description:    Raspbian GNU/Linux 11 (bullseye)

Release:        11

Codename:       bullseye



とりあえず......