jl7gmnのblog

yahooブログから移行してきました。アマチュア無線を中心としたブログです。

2023年08月

Ubuntu 22.04.3LTSディスプレーサーバーWayland

Core i5へのデスクトップPCの入れ替えが済んだところで、以前から愛用していたスクリーンショットアプリのShutterをインストールしてみました。

Shutter

試しにと切り取り確認をしようとしたところが、範囲を選択が選択できない状態でした。ウィンドウもいわゆるソフトウェア的にイネーブルfaulse状態です。操作可能なのはデスクトップのみといった状態です。この状態の原因を調べてゆくと、Ubuntuのバージョンアップ(22.04)に伴う、ディスプレーサーバーの変更によるものと言うことがわかりました。範囲を選択の上にマウスカーソルを持っていくと、次のツールチップテキストメッセージが表示されました。

Can't take screen shots without X11 Server

多種多様なモニター対応等で以前のX11 ディスプレーサーバーからWaylandディスプレーサーバーに変更になった為にShutterで対応していたX11ディスプレーサーバーが起動していないため切り取りとウィンドウ選択ができなかった事のようです。

ウィンドウシステムの確認で現在のディスプレーサーバーが何であるか確認できます。
これは、元のx11ディスプレーサーバーに切り替えた後の画像です。
Ubuntu22.04.3LTSを何もせず起動した場合、ウィンドウシステムのディスプレーサーバーはWaylandになっています。
ウィンドウシステム


スクリーンショットアプリ(Linux版 Shutter) 
Screenshot from 2023-08-23 05-35-51

次のリンク先を参考にしました。(切り替え方法についての説明がありました。)


Ubuntu22.04.3LTSでは、現在ディスプレーサーバーの移行期のためか、このディスプレーサーバーの選択が起動時のパスワード設定時に選択できるようにしてあるようです。

Ubuntu 選択時Waylandディスプレーサーバーの選択(Ubuntu22.04)
Ubuntu on Xorg選択時X11ディスプレーサーバーの選択

X11サーバーを使用したアプリケーションがある場合はShutterのように動かない機能があったり、ブラックアウトとかがあったりする様です。このようなX11サーバー対応アプリではWaylandから前のUbuntu対応のX11サーバーに切り替えて使う必要があるということです。

スクリーンショットに関してですが、Ubuntu22.04.3LTSではわざわざスクリーンショットアプリのShutterをインストールしなくてもプリントスクリーンボタンにスクリーンショット機能がありました。範囲も自由に選択できるようです。アプリに合わせてディスプレーサーバー(Wayland,X11)の切り替え方法がわかっただけでも、前のバージョンのUbuntuでX11サーバー対応アプリなどを使用するときに役立ちますね。


つづく?

Ubuntu22.04.3 LTS でのBluetoothキーボード接続

キーボードのワイヤーが邪魔なので、ブルートゥースタイプのキーボードを購入してあったのを、PCのバージョンを少しだけアップしたついでに、接続を試してみました。
まず、PCはUbuntuでいままで、GatewayのSX-2800-21 のWindows VistaにUbuntu22.04.3LTSを入れて使っていました。CPUはCore2DuoE7400でした。時折起動も不安定となってきたので、今のうちに同じSSDを使えるPCをオークションで探していたところGatewayのSX-2855、CPUはIntel Core i5-2320CPU@3.00GHzX4 のWindows7のHDDなしがあリマした。まずまず安いのでオークション参戦しました。誰も今時このようなPCは必要としないのか、すんなり落札できました。開始価格1,500円と送料での落札です。ただ、使用する目的はLinuxとしてですのでこのPCで全く問題ありません。Ubuntu 22.04.3LTSとロングタームバージョンで2027年06月01日まで有効期間があります。今は2023年8月ですから4年ぐらいは問題なく使用できれば十分です。期間が過ぎても使用継続もありです。または次のLTS版のバージョンアップでも使えれば御の字です。いままでVistaのPCでUbuntu18.04, 20.04とバージョンアップして使ってきましたが、アベマTVや、ネットサーフィン、Arduinoスケッチ、ブログ作成、画像(写真)処理等で大活躍してくれていました。今回のCore i5となりTVとモニターの2画面での使用できるので使いかってもTVでの画像解像度も良く気に入っています。
前置きがながくなりましたが、ブルーツースのキーボード接続の確認をしていくわけですが、まずはとても不思議な状態で悩まされました。それは、ブルーツースのUGIの接続設定で、ELECOM TK-FBP102と検出されているのですが、接続の設定をしても直ぐに切断の元の状態に戻ってしまう始末です。検出はしているのに繋げない状態です。もうここで、半分このキーボードはUbuntu22.04.3LTSではドライバーが対応してないんではないかなどと思ってしまいました。先ずめげずに、解決策があるかをネット情報を頼ります。次のHatenablogのリンクは手動で端末を使って接続するための情報がありましたので、自分のブルーツースの」状態を探るべくコマンド打ちして確認してみました。

以下確認したブルーツース用コマンドです。
〜$ bluetoothctl  でブルーツース確認モードに入ります。

[bluetooth]# scan on
上記コマンドでマックアドレスがスキャンされ検出表示されます。
[bluetooth]# scan off
表示を止めます。
[bluetooth]# pair **:**:**:**:**:** 
表示されたマックアドレスでペアリングです。
上記でのペアリングは
Attempting to pair with **:**:**:**:**:**
Failed to pair : org.bluez.Error.AlreadyExists
のエラーを吐きました。
この状態で
[bluetooth]:# paird-devices
でペアリングのデバイス名を確認すると
Device **:**:**:**:**:** ELECOM TK-FBP102
とペアリングデバイスは表示されてます。
bluezのソフトも再インストールを行いましたが、変わりありませんでした。
この状態でもうバンザイ状態です。
検出はしててもペアリングがされない状態が確認できたわけです。
そんな馬鹿なことがあるのかと思いつつ別の情報を探りました。
コマンドモードでのブルーツースを邪魔しているものがないかを確認するコマンドです。
リンク先は下記です。
$ systemctl status bluetooth.service
上記コマンドでは下記の表示がでました。

bluetooth.service - Bluetooth service
Loaded: loaded (/lib/systemd/system/bluetooth.service; enabled; vendor pre>
Active: active (running) since Mon 2023-08-21 23:11:40 JST; 2h 23min ago
Docs: man:bluetoothd(8)
Main PID: 819 (bluetoothd)
Status: "Running"
Tasks: 1 (limit: 4532)
Memory: 1.7M
CPU: 392ms
CGroup: /system.slice/bluetooth.service
└─819 /usr/lib/bluetooth/bluetoothd
8月 22 00:22:54 ****** bluetoothd[819]: profiles/input/device.c:ioctl_is_connected() Can't get HIDP connection info
8月 22 00:22:55 ****** bluetoothd[819]: profiles/input/device.c:control_connect_cb() connect to DC:2C:26:12:31:8B: Invalid >
8月 22 00:22:56 ****** bluetoothd[819]: profiles/input/device.c:ioctl_is_connected() Can't get HIDP connection info
8月 22 00:22:57 ****** bluetoothd[819]: profiles/input/device.c:control_connect_cb() connect to DC:2C:26:12:31:8B: Invalid >
8月 22 00:23:10 ****** bluetoothd[819]: profiles/input/device.c:ioctl_is_connected() Can't get HIDP connection info
8月 22 00:28:14 ****** bluetoothd[819]: profiles/input/device.c:ioctl_is_connected() Can't get HIDP connection info
8月 22 00:42:05 ****** bluetoothd[819]: profiles/input/device.c:ioctl_is_connected() Can't get HIDP connection info
8月 22 01:05:52 ****** bluetoothd[819]: profiles/input/device.c:ioctl_is_connected() Can't get HIDP connection info
8月 22 01:05:57 ******0 bluetoothd[819]: profiles/input/device.c:control_connect_cb() connect to DC:2C:26:12:31:8B: Host is >
8月 22 01:06:01 ******0 bluetoothd[819]: profiles/input/device.c:ioctl_is_connected() Can't get HIDP connection info

ブルーツースは"Running"ステータスなので問題ないということのようです。
あとの方にはエラーコメントがズラズラとでています。
次のコマンドも試してみます。
何がブロックしていたりするかを確認するコマンドのようです。
〜$ rfkill list
1: phy0: Wireless LAN
    Soft blocked: no
    Hard blocked: no
2: hci0: Bluetooth
    Soft blocked: no
    Hard blocked: no

結果は何もブロックしていないということです。

もう一つ下記のページ対応を試してみました。


1.内容は、ブルーツースデバイスを閉じてみるやり方から入ります。

2.次はbtusbのカーネルモジュールをアンロードする(取り外し)

3.そして再度 btusbをロードする(組み込み)方法

4.デバイスを開いて初期化する

上記の1から4をひとまず、試しました。

結果はペアリングも直ぐに切断する状態は変わりませんでした。

最後の手段として、以前も別のPCで同じような対応をしたことがありましたが、GUIのフォーム上にある赤いコマンドボタン(デバイスの削除(R))で一旦デバイスクリアし、最初から検出させるやり方をしてみようと言うことをやってみることに!
クリアした後に最初の端末を使ったコマンド打ちでペアリング接続を順序よくやってみるということです。
[bluetooth]# scan on
上記コマンドでマックアドレスがスキャンされ検出表示されます。
[bluetooth]# scan off
表示を止めます。
[bluetooth]# pair **:**:**:**:**:** 
表示されたマックアドレスでペアリングです。
上記でのペアリングは
Attempting to pair with **:**:**:**:**:**

結果は案の定、ペアリングOKとなりました。
最初から全部デバイスクリアして最初のデバイス検出から行うのが良いということでした。

長い迷路でしたが、端末でのブルーツースのペアリング手順もできるようになったので、まあまあ良かった事にします。以前のUbuntuでの無線LANモジュールの接続設定を思い出しました。

Core i5はすこぶるUbuntu 22.04.3LTSで快調に動いてくれています。Windows7はLinuxで間違いなく活かせます。
ブルーツースのエンターキーが小さくて、エンターキーの上の ”]” キーを間違えて押すことが多いです。馴染みのキーボード配列位置が違うのが原因ですが、なれるしかないですね!ただ、PCとの接続ケーブルーがなくなったので、良しとしています。

つづく?


ESP32DevKitCでのカラーグラフィックSメータその6

Sメータの画像表示で使用したLovyanGFXライブラリでの画像データを直接TFT液晶に書き込み表示するやり方とスプライト画面に書き込んでから表示する方法をまとめてみました。

■オフラインスプライトcanvasに書き込む方法

//#define LGFX_AUTODETECT //no need this one
#include <LovyanGFX.hpp>
#include "LGFX_ESP32_ST7735S.hpp" // add needing
#include "smeter.h"
#include "needle.h"

static LGFX lcd;
static LGFX_Sprite canvas(&lcd); // off screen draw buffer
static LGFX_Sprite smeter(&canvas);// myBitmap (128x160)
static LGFX_Sprite needle(&canvas);// hari     (5x100)

const uint16_t imgWidth = 128;
const uint16_t imgHeight = 160;

uint16_t signalLevel;  //角度に変換するのA/D値(0から4095)
uint16_t avtimes = 16 ;   //16 analoginput avaraging times

#define SW_TX  32                // A/D port 32   original sketch D0

void setup() {
  pinMode(SW_TX,INPUT);          

  lcd.init();
  lcd.setColorDepth(16);
  lcd.setSwapBytes(true);

  smeter.setColorDepth(16);
  needle.setColorDepth(16);

  canvas.fillScreen(TFT_WHITE); 
  canvas.setPivot(lcd.width() >>1,lcd.height() >>1);
  canvas.setColorDepth(16);
  canvas.setSwapBytes(true);
  canvas.setRotation(1);
  canvas.setBuffer((void*)myBitmap,128,160,16);
  canvas.createSprite(lcd.width(),lcd.height());
  canvas.pushImage(0,0,128,168,myBitmap);
  canvas.pushSprite(0,0);

  needle.createSprite(5,100);
  needle.setPivot((imgWidth/2),(imgHeight/3));
  needle.setBuffer((void*)hari,5,100,16);
  
}
void loop() {
 
    long d = 0 ;
  //*********************************************************
  // averaging settingtimes avtimes now setting 16
    for(int i=0;i<avtimes;i++){
      d += analogRead(32);
    }
    signalLevel = d/avtimes;

   Serial.println(signalLevel);
   //********************************************************

   //********************************************************
   // mapping to degree value
    signalLevel = map(signalLevel, 0, 4095, -64 , 80);
   //********************************************************
    
   //****************************************************************************************
 //エイリアス処理なし
   //needle.pushRotateZoom(&lcd,(imgWidth/1.55),(imgHeight/1),signalLevel,1.0,2.8);
   //エイリアス処理あり
    needle.pushRotateZoomWithAA(&lcd,(imgWidth/1.55),(imgHeight/1),signalLevel,1.0,2.8);
   // needleスプライト表示 
    needle.pushSprite(imgWidth/1.55,imgHeight/1); 
   //****************************************************************************************
    delay(200); //needle 表示時間調整用
   //スプライト書き込みしたcanvasを表示
   canvas.pushSprite(0,0);
   delay(1);

}

■直接lcdに画像データを書き込む方法
//#define LGFX_AUTODETECT //no need this one
#include <LovyanGFX.hpp>
#include "LGFX_ESP32_ST7735S.hpp" // add needing
#include "smeter.h"
#include "needle.h"

static LGFX lcd;
static LGFX_Sprite smeter(&lcd);// myBitmap (113x160) (128x160)
static LGFX_Sprite needle(&lcd);// hari     (5x100)

const uint16_t imgWidth = 128;
const uint16_t imgHeight = 160;

uint16_t signalLevel;  //角度に変換するのA/D値(0から4095)
uint16_t avtimes = 16 ;   //16 analoginput avaraging times

#define SW_TX  32                // A/D port 32   original sketch D0

void setup() {
  pinMode(SW_TX,INPUT);          

  lcd.init();
  lcd.setColorDepth(16);
  lcd.setSwapBytes(true);

  smeter.setColorDepth(16);
  needle.setColorDepth(16);
   
  lcd.setRotation(1); //角度設定1
  lcd.pushImage(0,0,128,160,myBitmap); //指針表示
  lcd.setRotation(0);   //角度設定0に戻す 指針の位置設定に合わせる
  lcd.pushImage((imgWidth/1.6),(imgHeight/7),5,100,hari);
   
  needle.createSprite(5,100);
  needle.setPivot((imgWidth/2),(imgHeight/3));
  needle.setBuffer((void*)hari,5,100,16);
  
}
void loop() {

    long d = 0 ;
  //**************************************************
  // averaging 100times
    for(int i=0;i<avtimes;i++){
      d += analogRead(32);
    }
    signalLevel = d/avtimes;
  Serial.println(signalLevel);
  
  //*********************************************************
  // mapping to degree value
    signalLevel = map(signalLevel, 0, 4095, -64 , 80);
  //*********************************************************
 
  //******************************************************************************************************
  //エイリアス処理なし
  //needle.pushRotateZoom(&lcd,(imgWidth/1.55),(imgHeight/1),signalLevel,1.0,2.8);
  //エイリアス処理あり
    needle.pushRotateZoomWithAA(&lcd,(imgWidth/1.55),(imgHeight/1),signalLevel,1.0,2.8);
    
    needle.pushSprite(imgWidth/1.55,imgHeight/1); //指針スプライト表示
  //******************************************************************************************************
    delay(200);//needle 表示時間調整用

    lcd.setRotation(1); //角度設定1
    lcd.pushImage(0,0,128,160,myBitmap); // Sメータ画像表示
    lcd.setRotation(0); //角度設定0に戻す。指針の位置表示に合わせる

   delay(1);
}

直接lcdに書き込む方法とオフラインバッファ画面に書き込んでから表示するのと同じ動作ですが、指針表示時間調整のディレータイムの値設定にもよると思いますが、若干ですが、lcd直接書き込みのほうがチラつきが少ないように思えます。これは、実際に動作させてみて、良いほうを使うのが常道のようです。必ずしも、オフラインで画像書き込みしたのを表示するスプライト処理がチラつきがないとは言えないこともあるようです。(書き込みの画像データ量も関係あるかと思います。)

いずれにしても、スプライト処理は画像のみならず、文字でも同様に処理できますので、覚えておいてよい表示方法かと思います。

つづく?

ESP32DevKitCでのカラーグラフィックSメータその5

気が向いたので、Sメータのパネルを最初から作り直してみました。
画像編集用のアプリは例のごとく、Inkscape とWindows10のペイントアプリ、そして、画像変換アプリの LCD-Image-Converterです。

Inkscapeはレイヤー処理で重ねる順番も自由に設定できるので、パネルの赤塗処理はとても簡単にきれいに作成できます。他、文字はコピーで、単に文字を書き換えて作成が簡単です。前のSメータパネルで一番気になっていたのは文字盤の目盛りと針の重なった時の一致していないことでした。今回はほぼ指針と重なるようにできましたので、すっきりしました。

■Inkscapeで作成したSメータパネル
できるだけ大きなページサイズで作成しておきます。サイズ変更はペイントアプリが便利です。
幅:1000px 、 高さ:680px
エクスポートで名前を適当に決めて、jpegで保存します。

inkscape-smeter


■ペイントアプリで編集します。
最初にサイズを目的の128x160pcになるように横の160pcは固定で縦の128pcになるように下側のページ位置を下げたり上げたりして変換値を確認し丁度128x160のサイズになったら変換します。
ESPのスケッチでは画像を左に90度回転しての取り込み仕様なので、ペイントで左回転90度で下記の画像にしてjpegで保管です。


paint-smeter-size-rotate

■ESP32DevKitC用の取り込みデータ用に変換するLCD-Image-Conveterで変換します。

LCD-image-converter-main

OptionでPreviewしデータを確認します。右側のデータをすべてを選択し、コピーしてESP32DevKitCのSメータスケッチのSメータ用データ取り込みファイルにコピー貼り付けします。
LCD-image-converter

■ESP32DevKitCのSメータスケッチをコンパイルしてTFT液晶に表示されることを確認します。出来上がったのが下記の画像です。
Homebrew1

Homebrew2


前のSメータパネルより、インジケータ指針とSメータパネルの目盛りのバランスはよくなったと思います。目盛りとインジケータ指針の重なりもうまく一致してバランスの悪かった違和感がなくなり見やすくなったと思います。粗削りの要素多く、まだいろいろと問題があるかと思いますが、最初から作成したのは今回が初めてなので、次の作成時はもっと、よくできるかと! ただ、デザインやスケッチのセンスが、かなり影響がでるので、私の場合は、もしかしたらこの程度が限界かもしれません。Hi !


ついでに動画も取りました。カメラを手で持ってるので、フォーカスとブレがありますが、まずまず動作は確認できると思います。



既存の画像を利用してうまく加工できればいいのですが、やはり、納得のいくものは、自分で作成するのが一番です。
LovyanGFXライブラリではSPIライブラリ(従来のスプライト処理)を継承し、たくさんのコマンドが用意されています。その中のコマンドでで指針の元画像を拡大、伸長できる調整パラメータがあるので、あとからでも指針のバランス調整が自由にできます。

通常表示
needle.pushRotateZoom(&lcd,(imgWidth/1.55),(imgHeight/1),signalLevel,2.3,2.8);
OR
アンチエイリアス付き回転と拡大縮小
needle.pushRotateZoomWithAA(&lcd,(imgWidth/1.55),(imgHeight/1),signalLevel,2.3,2.8);

目盛り版としての画像データは作り直しでないとできませんが!
LCD-image-Converterは各種のTFT液晶のサイズも対応しているので、もう一回りサイズの大きなTFT液晶を用意すれば、既存の受信機のSメータをデジタル式に入れ替えできますね。指針のカラーや、目盛り装飾などアイデア次第で、自由に目盛り版も作成できるので、楽しく自作できるデジタル式Sメータとしてアマチュア無線家の醍醐味の一つにもなると思います。Hi !

つづく?
アクセスカウンター
  • 今日:
  • 昨日:
  • 累計:

QRコード
QRコード
  • ライブドアブログ