モブ沢工房

プログラミングとかLinux関連(特にOSSのグラフィックツール関連)とかレトロゲームとか3Dプリンタやら日曜大工等、色々。

Blenderでjoinしたオブジェクトに対するBooleanモデファイアの挙動について

BlenderのBooleanモデファイアを使って穴を開けようとした所、変なことになったので備忘録としてメモです。 あっ、ちなみにまだ、ver3.3を使ってます😅 そろそろver4系に移行すべきか…

それはさておき、まず状況としては、角パイプのような形状があり、その先にシリンダーを半分切り取って作った半筒型の物体(なお、筒の蓋はN-gonではなく、予め三角形化してあります)を合体させて、そこに可動部分の軸をbooleanで引くことで軸穴を作ろう、という状況です。

この時、何も考えずに各パイプと半筒をjoinして合体させると、booleanモデファイアで穴が開かずに、逆に穴用の軸が合体した形状になってしまいます… この手前側のオブジェクトがその状況で、奥側のような形状を目指していたわけです。

なお、Booleanモデファイアの「Solver Options」でHole TolerantをONにすればこの状況でも穴が空きますが、何か少し遅いらしいし気持ちよくない。

そこで解決する方法ですが、これはjoin時に辺の頂点構成がおかしくなっているために起きるので、それを予め下処理することで防ぐことになります。

  1. まず角パイプの端、半筒の蓋と合体する辺をsubdivideしておきます。
  2. それから、joinします。
  3. 頂点編集モードに入り、全ての頂点を選択状態にし、Mesh -> Merge -> by Distance で重複頂点を合体(重要)

未処理の角パイプは次のような普通の構成ですが

下処理された角パイプは次のような頂点構成となります

真ん中に頂点が増えているのがおわかりいただけるでしょうか…

なお、join後のmerge処理が行われていないと、下処理がしてあるのに結局未処理のと同じ「望まない結果」が出来てしまいますので注意。

これでBooleanモデファイアが効いて穴が開くようになります☺️

fbcp-ili9341で画面サイズを設定した(備忘録)

えー、前回の記事、間違っていたようです😅

dothiko.hatenablog.com

どうもmednafenの解像度設定を手動でしたり、sshからshutdown -h nowで遮断していて全然気づかなかったのですが…

なんと、画面が1024x600?ぐらいからの640x480の切り出しの一部になってました😅

色々、/boot/config.txtの設定を書き換えても変わらず…結局、config.txtの内容をもとに戻してラズパイOSの解像度設定から行った所、fbcp-ili9341により640x480のデスクトップが普通に使えました。っていうか、もっと大きくても縮小してくれるので、別に640x480にこだわる必要もないのかな…とも思えましたが、画面比率が関わってくるので、640x480ぐらいが良いのかなとも思います。

なお、fbcp-ili9341はアスペクト比が違うとなんとアスペクト比保持したまま黒枠で縮小してくれます。なんか凄いこだわりだ…!

640x480で全て収まったデスクトップ

ではでは!

fbcp-ili9341で省電力を無効化する方法

先日の記事に追記でも良かったのですが、検索でも中々出てこない事のようなので取り敢えず記事にしておきます。

Raspberry Piでfbcp-ili9341を普通にビルドすると、独自の省電力機能がonになっています。画面の更新が行われない時間が一定期間あると、キーボードで復帰する必要があるのです。

つまりfbcpのものは、は、x11やwaylandやscreensaverとは別の原因です。

でもx11やらwaylandやらデスクトップ環境の省電力設定も、処置しておく必要があるのではないかと思います。多分…😅 実は、双方の処置を一辺にやってしまったので、実際どうなのか。未検証ですが…

ともかくそんなわけで、まず取り敢えずデスクトップの方の処置も備忘録的に記しておきます。

デスクトップの設定で省電力を停止

raspi-config -> Display Optnions -> Screen Blanking でoffに設定しておきます。これでOK。GUIの方からも出来る?っぽいですが、これが楽です。

fbcp-ili9341の設定

さて、これをやろうが、検索すると出てくる通常のxsetを使った設定などをしても、前述のようにfbcp-ili9341では独自の省電力機能を持っているために、意味がないのです。

これを止めるには、fbcp-ili9341のconfig.hを編集してビルドしなおす必要があります。ソースの変更なので、一度行ったcmake設定は関係ないため、cmakeの実行は不要です。

config.hの中にTURN_DISPLAY_OFF_AFTER_USECS_OF_INACTIVITYをdefine している部分が211行目ぐらいにあります。それをコメントアウトします。キーボードを読んでいる事自体が気に入らない…という場合は 同じセクションにあるBACKLIGHT_CONTROL_FROM_KEYBOARD と KEYBOARD_INPUT_FILE もコメントアウトしてしまって良いかと思います。

(バックライトのコントロール自体要らないのであれば、ソースを書き換えずともcmakeの設定オプションで -DBACKLIGHT_CONTROL=0で良いのかもしれません。(未検証) )

// If enabled, the display backlight will be turned off after this many usecs of no activity on screen.
//#define TURN_DISPLAY_OFF_AFTER_USECS_OF_INACTIVITY (1 * 60 * 1000000)

そして、ビルドすれば省電力機能のないfbcpドライバが完成です。

あっもちろん、省電力自体は欲しいけど短すぎるんよ…って時は コメントアウトではなく、このμsec単位の待ち時間部分を書き換えればOKだと思います。1分は短いですよねさすがに😅

ではでは!

Raspberry piにili9431のSPI液晶を取り付けてみました

検索しても情報が錯綜しており結構苦労したので、備忘録です☺️

環境は以下の通りです。

最初から使える「fbtft」と、自分でコンパイルする「fbcp-ili9341」の2つについて書いてあります。

fbtftについて

ネット検索で出てくる情報においては、色々なOSバージョン、色々な環境、色々な目的で情報が錯綜しまくる中…

elchika.com

こちらのサイトが大変参考になりました。本当にありがとうございました。

現状のRaspberry Pi OSにおいて、fbtftは何もビルドせずに設定と接続だけで使えるようです。 この環境で、何も設定しなかった場合のデフォルト接続は以下の通りとなりました。

GPIOピン接続
LCD側端子名 ラズパイ側ピン番号 ラズパイ側BCM番号
SDO / MISO 21 GPIO 09
LED 12 GPIO 18
SCK 23 GPIO 11
SDI/MOSI 19 GPIO 10
D/C(もしくはDC/RS) 18 GPIO 24
RESET 16 GPIO 23
CS 24 GPIO 8

LEDは、 +3.3v直結でも良いようです(制御する必要のない場合)

/boot/config.txt の設定

config.txtには、以下の設定を追記します。 ほんと最後に付け足すだけでOK。

dtoverlay=rpi-display
raspi-configの設定

続けてconfig.txtを手動編集でも良いのですが、折角なのでraspi-configでInterface Option -> I3 SPI からの「はい」でSPIをEnableします。

表示テスト

以上の設定だけでfbtftがlsmodで出現するようになります(はずです)。フレームバッファとして機能し、 fbiコマンドで画像表示テストが可能です。

sudo fbi -nocomments -noverbose -a -T 1 -d /dev/fb1 hoge.jpg

縦長画像だと横トリミングで表示されるので、画像自体を回転させておいた方が楽でしょう。

デスクトップ表示

簡単な方法としてはまず、raspi-configのAdvanced OptionからwaylandをやめてX11にします。

その後、 /usr/share/X11/xorg.conf.d/に、99-my-spi-lcd.conf というようなファイル名で

Section "Device"
        Identifier      "TFT framebuffer FBDEV"
        Driver          "fbdev"
        Option          "fbdev" "/dev/fb1"
EndSection

として再起動で、320x240の狭い画面ですがデスクトップ画面が表示されます。

動きは荒いですが、まぁ使えないことはないです。 なお、このままではHDMI画面を別途接続していても、HDMIには何も表示されずSPI液晶だけに画面が出ました。何か方法があるのかもしれませんが…

fbcp-ili9341について

このSPI液晶、高速版ドライバのfbcp-ili9341を試してみたくて買ったようなものです。このfbcp-ili9341があればSPIにもかかわらず、かなりの速度で表示できるらしい!

ソースはこちら

github.com

日本語の解説ページはこちらです。本当に助かりました感謝です🙏

niccol.li

基本的には、fbcp-ili9341が起動している間は専用のフレームバッファが出来、それで表示が可能になるっぽいです。

注意事項
  • 干渉を防ぐため、fbtftと異なり、/boot/config.txtでのdt-overlay=rpi-display等は追記しない。しかし、他のフレームバッファ設定は色々追加する必要がある。
  • 干渉を防ぐため、raspi-configでfbtftの逆にSPIをdisable(選択肢で「いいえ」を選択)しておく(しなくても動作するけど、一応)
  • 64ビット環境ではビルドが通らないためfbcp-ili9341は今の所、32ビット環境でしか使えない
  • waylandでは上手く行かなかったため、 raspi-configにてX11に切り替えておく必要あり(Advanced Optionから切り替え可能)
ビルドに必要なパッケージ

aptで以下のパッケージのインストールが必要となります。

パッケージ名 備考
build-essential 大抵最初から入っている
cmake ビルド自体に必要
libraspberrypi-dev fbcp-ili9341が使用しているbcm_host.hに必要
raspberrypi-kernel-headers 同上
ビルド

私の場合はピン配置を上記fbtft互換とするため、以下のようなビルドオプションとなりました。その他の細かい設定は日本語解説に従っています。

注意点としては

  • GPIO_TFT_DATA_CONTROL、 GPIO_TFT_RESET_PIN、 GPIO_TFT_BACKLIGHT はGPIOのピン番号ではなく、BCM番号で指定します。
  • このため、 私の目的の場合は、-DGPIO_TFT_DATA_CONTROL=24 -DGPIO_TFT_RESET_PIN=23 -DGPIO_TFT_BACKLIGHT=18 となります。
  • クロック分周比設定ですが、私の環境では-DSPI_BUS_CLOCK_DIVISOR=8では正常に動きませんでした。デスクトップまでは表示されるのですが、激しい動作をするソフトを立ち上げると画面が真っ白になります。ので、-DSPI_BUS_CLOCK_DIVISOR=16にあげ(動作クロックを下げ)ました。
  • LCDを試験的に接続しているジャンパ線のクオリティが問題なのかもしれません。それか単にOCに耐えられない個体だったか…
  • -DSTATISTICSを指定しないとデフォルトは1(enabled)で、カッコイイステータス表示が上に出るのですが、普段使用する時は要らないなってことで0です😅
cmake -DILI9341=ON \
-DCMAKE_BUILD_TYPE=Release \
-DGPIO_TFT_DATA_CONTROL=24 \
-DGPIO_TFT_RESET_PIN=23 \
-DSPI_BUS_CLOCK_DIVISOR=16 \
-DARMV8A=ON \
-DUSE_DMA_TRANSFERS=ON \
-DDMA_RX_CHANNEL=5 \
-DSTATISTICS=0 \
-DBACKLIGHT_CONTROL=ON \
-DGPIO_TFT_BACKLIGHT=18

これでcmakeした後、 make -j で実行ファイルfbcp-ili9341が割とすぐに出来ます。

なお、何故か公式の説明のように「buildサブディレクトリを掘ってそこに移動してcmake」しても、エラーが出て上手く行きませんでした…cmakeをあまり使った事がないので原因はよく分かりませんが、仕方なくfbcp-ili9341のディレクトリで直でcmake & make -jで実行ファイルが生成されました。

起動設定

fbcp-ili9341が正常に起動している間、/dev/fb* が追加されるわけですが、実使用においては起動直後から動かしておくために/etc/rc.localもしくはsystemd向けにserviceファイルを作成してデーモン化しておく必要が出てきます。

Raspberry pi OS bookwormではrc-local.serviceがデフォルトでenableされていたので、取り敢えずラクチンな/etc/rc.localを選びましたが、落ちた時の自動再起動を考えればsystemdにしておきたい所ではあります。

/etc/rc.local は以下のようになりました。皆様の環境に合わせてfbcp-ili9341へのフルパスを書き換えておけば良いでしょう。

#!/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.

# Print the IP address
_IP=$(hostname -I) || true
if [ "$_IP" ]; then
  printf "My IP address is %s\n" "$_IP"
fi

sudo /home/dothiko/cprgs/fbcp-ili9341/fbcp-ili9341 &

exit 0

…なお、私の環境のこのディレクトリですが、本来はfbcp-ili9341/の下にbuildディレクトリを掘ってそこでcmakeしてビルドするっぽいのですが…何故か上手く行かなかったため、

南無三!

という感じでfbcp-ili9341のディレクトリで直接cmake & make -jしました😅

/boot/config.txtの設定

以下のように書き換えましたので一部抜粋。 なお、dtoverlay=vc4-kms-v3d では何故か上手く行きませんでしたので、vc4-fkms-v3dで行きました。

dtoverlay=vc4-fkms-v3dに書き換えた後、 arm_boost=1の下、[cm4] までの間に SPI専用設定を挿入してあるわけです。

# Enable DRM VC4 V3D driver
#dtoverlay=vc4-kms-v3d
dtoverlay=vc4-fkms-v3d
max_framebuffers=2

# Don't have the firmware create an initial video= setting in cmdline.txt.
# Use the kernel's default instead.
disable_fw_kms_setup=1

# Disable compensation for displays with overscan
disable_overscan=1

# Run as fast as firmware / board allows
arm_boost=1

# ----------- FOR SPI LCD ----------------
# uncomment to force a console size. By default it will be display's size minus
# overscan.
framebuffer_width=320
framebuffer_height=240

# uncomment if hdmi display is not detected and composite is being output
hdmi_force_hotplug=1

# uncomment to force a specific HDMI mode (this will force VGA)
hdmi_group=2
hdmi_mode=87
hdmi_cvt=320 240 60 1 0 0 0

[cm4]

なお、幅320, 高さ240は変更が可能で、fbcp-ili9341はパネル解像度を上回る場合は自動でスケーリングしてくれます。

そして、HDMIとの共存においては解像度320x240は存在しないため不可能だそうで。 そこで妥協策として、640x480に収めておくという対応方法があるようです。

私は実際には320x240での動作確認後、640x480に書き換えて動かしています。 この場合、HDMIモニタと同時に使用するとクローン表示になります。

追記:

…と、打ち消し線にしたのは理由がありまして…実は、640x480に書き換えて動くことは動くのです。ただし、実際には1024x600?ぐらいの大きな画面の一部を切り抜いた状態になっていて、画面隅のアイコンが見えていない事をXの@TororoLabさんの指摘で知りました😅

対応方法は、以下の記事に記してあります。

dothiko.hatenablog.com

raspi-configでの設定

SPIをdisableするのに加え、Advanced Options -> A6 Wayland -> W1 X11 を選択してwayfire(wayland)からX11に切り替えます。

動作の感想

起動直後のデスクトップ画面

以上により起動時からデスクトップ画面がLCDに、しかも滑らかに表示されるはずです😆 分周比16でも十分イケますね〜。

まぁ、8にしたい所ですが…ケーブルから考え直したほうが良さそうです。もしかすると、液晶自体がOCに耐えられないハズレなのかも…いやこれほどのOCに耐えられるほうがちょっと優秀すぎるのかもしれませんがw

試しにmednafenでomegablastをやってみましたが、PC上でやるより上手く避けれる気がするのは気の所為でしょうか…😅

おっと、この環境下でmednafenで正しくフルスクリーンするには、メガドラのomegablastの場合は ~/.mednafen/mednafen.cfgを書き換えて、

md.xres 640
md.xscalefs 1.000000
md.yres 480
md.yscalefs 1.000000

…などとしておく必要があるかもしれません (640x480時, 320x240時は当然320と240になります)

その他、ファミコンフリーゲームをやってみるのであればnes.xres/yres等も必要だと思います。

では、良きラズパイライフを ( ← youtubeのハンターチャンネルの真似w

Xubuntu 22.04での音割れ対策

Ubuntu mate 20.04からXubuntu 22.04にして以来、何か曲や動画の音が割れてる気がする… 気のせいかな…?とも思いましたがpulseaudioの設定をアレコレ弄ってみました。

/etc/pulse/daemon.confで

default-sample-format = float32le
default-sample-rate = 48000
alternate-sample-rate = 44100

とかしてみたりですね。

微妙に良くなった気はしますが、まだまだ良くない…と、先程、遂に原因を発見しました。

これです。(修正後の状態)。ミキサーアプレットではこう。

と言っても、これではわからないと思います。ミキサーアプリではこうです。

こうです。これが正しい状態です。

何故かこの青いバーがもっと右に行っていました。多分、ミキサーアプレットの簡易設定の一番右が100%と思い込んで設定してたのです。よく見ると、アプレットでも100%のところには縦筋がついてる…

つまるところ、音量が100%超えてただけです。そりゃ割れるわな😅

気のせいか分かりませんが、pulseaudioの設定をいじった結果か、今は前よりいい音してる気がしています☺️

重い腰を上げてXubuntu 22.04.3に以降した時のメモ

重い腰を上げてubuntu mate 20.04.3からxubuntu 22.04.3に移行しました。 普通にやっていればまず問題は無いと思われますが…久々の更新なので準備運動的にメモですw

使用環境

  • Ryzen 5700G APU
  • 64GB DDR4 3200
  • WD SN770 NVMe 512GB (ブート)
  • Excelia G3 NVMe 2TB (/home)
  • WD 1TB SATA HDD (倉庫)

デスクトップでブラウザ、動画視聴、 プログラミング、お絵描きなど一般的な用途に使ってます

インストール前の問題

まず引っかかったのが起動ドライブ。買ったばかりで何もしていないWestern DigitalのSN770を搭載してインストールしようとした所、インストーラーがロゴを出したまま固まってしまいました。 一瞬、不良品を疑ってしまいましたがubuntu mateの22.04.3のインストーラーでも同じなため、SN770を取り外して取り敢えずはUSBブートで起動、そしてNVMe->USB変換でgpartedからパーティションテーブルを作成して再度m.2スロットに戻してインストールしました。

パーティションテーブルを作る所からやれると思い込んでいましたが、そうではなかったようです。

インストール後の問題

ポカミスで起動せず

インストール後、/homeとなる2TBのssdや倉庫用ssdを取り付けて、/etc/fstabを書き換えたのですが…うっかり、パーティションのオプションに空白を入れてしまい起動しなくなりました😅

この状態だとrootでメンテナンスモードログインしても書き換えが不能になるので、またも取り外してUSBブートしてのUSB変換でSN770を取り付けて書き換えるという手間が掛かってしまいました…

Firefox周り

次にハマったのがブラウザ周り(Firefox)です。

snapになったせいか知りませんが、旧プロファイルを全く受け付けず新規作成を強要してきます。

使い込んだメインプロファイルはFirefox Syncしてあるので大方問題無かったのですが、サブのブログ用プロファイルは油断していて全く何もしていませんでした。結構危なかったです…

もう一つの問題点はsnap故に設定でのダウンロードフォルダの表記がおかしくなるという問題点です。

私はダウンロードはhddからシンボリックリンクしたディレクトリに保存しています。これは、たかがダウンロードファイルのためにssdの消耗は許せない…というケチ臭い概念から来たものですが、snapになったFirefoxでは設定画面でホームディレクトリ上のディレクトリを指定しても /run/user/…といったsnapのサンドボックス上のディレクトリに強制変換されます。

これは実際にはホームディレクトリのディレクトリを指しているので、実使用上は問題にはなりません。しかし前知識がまったくなかったために、一体これはどうしたものか…としばらく考え込んでしまいました😅

また、Firefox Syncでは使っていたアドオンのインストール自体は同期で実行されますが、その設定は同期されないようです。コレもやり直しでした。

あと、いつものabout:config設定も、これもFirefox Syncでは行われないようなので、きっちりやっておく必要があります。

  • browser.cache.disk.max_entry_size を 128に(youtubeでキャッシュ書き換えでのssd消耗対策)
  • media.webspeech.synth.enabled を、 falseに (謎のpulseaudio音割れ現象避け…20.04時代は頻発しました。22.04でちょっと使った所ではでませんでしたが、予防的に)
インストール中の出来事

私は自動インストールスクリプトを作ってあり、必要なパッケージはそれで自動で入れ、また不必要なものをアンインストールするように仕組んであります。

特に、スクリーンセーバー(xfce4-screensaver & xscreensaver) をアンインストールしているのです

しかしここで事件が起きた!

xfce4-screensaverをアンインストールしており、しかしまだxscreensaverをアンインストールしていない状況でロック画面に入ると、真っ黒になったままのロック画面から戻れなくなるのでした…😅

ctrl+alt+F2などでコンソールに入ったあとスクリーンセーバーのプロセスをkillすればOKですが、少し焦りましたw

xscreensaverのアンインストールを最初にすることにしました。

教訓とまとめ
  • ブラウザ設定は定期的にバックアップしておこう

今の所、それ以外の点は特に問題なく快適に使用出来ています。今年の4月には24.04 LTSが出るとは思いますが、いずれにせよ最初は玄人の皆様を遠くから見てるだけでどうせ怖くて入れないしな〜と考え、今更ながらの22.04インストールとなりました😊

なお、すっかり忘れていましたがAPUのドライバ周りなど一切弄っておらず、インストールから何もせずにOpenGL等快適に使用できています。考えてみればすごい時代になってしまいました。

ブログのタイトルを変えました

「dothikoのカクカクワールド2D」 という超適当な名前で垂れ流していましたが、今回より題して、「モブ沢工房」として、中身はほぼ変わりませんが3Dプリンタ等も含めたクリエイティブ系の記事を垂れ流して行こうかと。 結局別段、ドット絵も描いていなかったし。

絵は自分自身に発注した感じですね…10年ほど前に趣味のお絵描きを再開したのはこういう事をやりたかったのもあるのだ〜☺️ まぁ自分自身に発注と言ってもしょせんアマチュアですが…とりあえず頑張って描いてみました。 相場が分かりませんが20000円ぐらいは浮いたのかなw もちろん、LinuxでKritaを使って描いたのです☺️ だから何だって感じですが😅

なお、ロゴ部分のフォントは稲塚 春@ハルねこさん( Xの @Inatsuka さん)のフォント「アンニャントロマン」を切り貼りして漢字を作成するなどして作りました。フォント公開ありがとうございました

ではでは!