jl7gmnのblog

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

Linux

google chromeの最新番インストール

google chromeの右上にいつも更新が表示されていたが、ときどきアップデートの処理を行おうと思い更新用のファイルをダウンロードしたものの、その回数が4回も行っていました。何もインストール処理を行っていなかったので、あえて、debファイルのインストール方法を確認しました。LINUXも22.04の最新版にしてあるので、最新版でのgoogle chromeの再インストールを念の為確認しました。

手順としては、ダウンロードはまず準備段階でダウンロードして用意しておきます。次は、コマンドモードで、現在のインストールして更新で古いバージョンと表示されているgoogle chrome をアンインストール(削除)です。私の場合、前にインストールしたファイルがDebianベース(debファイル)なので次のコマンドで削除を行います。その他のシステムの場合は sudo dpkg -r が sudo rpm -e で対応するようです。パスワード入力要求されたら、起動時と同じパスワードを入力です。

***:$sudo dpkg -r google-chrome-stable
google-chrome-stable (111.0.5563.64-1) を削除しています ...
update-alternatives: /usr/bin/x-www-browser (x-www-browser) を提供するために自動モードで /usr/bin/firefox を使います
update-alternatives: /usr/bin/gnome-www-browser (gnome-www-browser) を提供するために自動モードで /usr/bin/firefox を使います
man-db (2.10.2-1) のトリガを処理しています ...
mailcap (3.70+nmu1ubuntu1) のトリガを処理しています ...
gnome-menus (3.36.0-1ubuntu3) のトリガを処理しています ...
desktop-file-utils (0.26-1ubuntu3) のトリガを処理しています ...
***:$

コマンドモードを閉じます。

ファイルでダウンロードしたファイルを探します。
ダウンロードファイル名:google-chrome-stable_current_amd64.deb

ファイルを右クリックし、別のアプリケーションで開く(A)をクリックします。
アプリケーションの選択フォームに推奨アプリケーションがいくつか表示されるので、次のアプリケーションをクリックし、選択ボタンを押してインストールします。

ソフトウェアのインストール

上記のインストールが完了で、開くで起動します。
右上に更新の文字がなくなり、最新版となります。
最後に設定で、chromeについてを見ると、アップデートが適用された旨の記載がありますが、この更新を完了するためには、最後に再起動を行うようにあります。


chrome-再起動

なので、再起動かけます。
以上の処理でchromeを最新版にすることができました。

やはり、削除、インストールの順番でした。
つづく?

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との接続ケーブルーがなくなったので、良しとしています。

つづく?


MODEL 1200FXローテーターその3

ローテーターの角度表示が上手くいったので、次のステップとしてスマフォからのコントロールをやってみることにしました。
結果から言うと上手くゆきました。

スマフォでのコントロール

ESP32のUDP通信機能を使い、スマフォで使えるUDP TCP Serverという素晴らしいアプリケーションがアンドロイド用にあります。ほかにも幾つかありましたが、他のものではエラーデータが時々発生して上手くなくこのUDP TCP Serverアプリがとても安定したアプリでしたので採用しました。
参考にしたWebです。

CIMG9529
今回はローテーターの角度表示のESP32DivKitCとは別のESP32DivKitCボードを使い実験しました。
上手くいったので、後で表示用のESP32に移植します。(ポートを選んで組込)表示用のESP32はTFT接続ポートも結構あり、他A/Dポートの関連で2つのポートもあります。これら以外で2つのポートを選んで組込します。

CIMG9526

スマフォからのUDP通信で アスキーデータをESP32で受けてフマフォのCCWボタン、CWボタン、OFFボタン対応のアスキーデータをデコードして、ポートに出力するという単純な動作です。ポートにはNPNトランジスタスィッチング回路が繋がって、オープンコレクタ出力がREMOTE端子へ繋がりON/OFFSW代わりとなります。CWとCCWの2つのトランジスタのスィッチング回路で対応です。

ESP32DevKitCのスケッチです。

// ESP32_WiFiUDP
// 2022APR16

#include <WiFi.h>
#include <WiFiUdp.h>

const char ssid[] = "***************"; //ご自分のルーターのSSIDに書き換えてください
const char pass[] = "***************"; //ご自分のルーターのパスワードに書き換えてください

const int localPort = 9999;      // ポート番号

const IPAddress ip(192, 168, 4, 3);       // IPアドレス(ゲートウェイも兼ねる)
const IPAddress subnet(255, 255, 255, 0); // サブネットマスク

WiFiUDP udp;
const int ledccw = 4;
const int ledcw = 0;

void setup() {
  Serial.begin(115200);

  WiFi.softAP(ssid, pass);           // SSIDとパスの設定
  delay(100);                        // 追記:このdelayを入れないと失敗する場合がある
  WiFi.softAPConfig(ip, ip, subnet); // IPアドレス、ゲートウェイ、サブネットマスクの設定

  Serial.print("AP IP address: ");
  IPAddress myIP = WiFi.softAPIP();
  Serial.println(myIP);

  Serial.println("Starting UDP");
 
  udp.begin(localPort);  // UDP通信の開始(引数はポート番号)

  Serial.print("Local port: ");
  Serial.println(localPort);
  pinMode(ledccw,OUTPUT);
  pinMode(ledcw,OUTPUT);
}

void loop() {
  int j,k;
  char i[64];
  while(1){
    if (udp.parsePacket())
    {
      j = udp.read(i,64);
      i[j]='\0';
      Serial.print(i[0]);
      Serial.print("\n");
   
      k = atoi(i);
      Serial.print("k= ");
      Serial.println(k);

      switch(k){
        case 0:
          digitalWrite(ledccw,0);
          digitalWrite(ledcw,0);
          break;
        case 1:
          digitalWrite(ledccw,1);
          digitalWrite(ledcw,0);
          break;
        case 2:
          digitalWrite(ledcw,1);
          digitalWrite(ledccw,0);
          break;
        case 3:
          digitalWrite(ledccw,0);
          digitalWrite(ledcw,0);
          break;
        case 4:
          digitalWrite(ledccw,0);
          digitalWrite(ledcw,0);
          break;
        case 5:
          digitalWrite(ledccw,0);
          digitalWrite(ledcw,0);
          break;
       default:
          break;
      }
    }
    delay(100);
  }
}

スマフォでの使用は0,1,2の3つです。
0:停止
1:CCW
2:CW
数値3から5までは予備ボタンスケッチで0と同じ停止です。(停止コマンドとして設定)
スマフォのアプリではNumber of buttons in use で表示ボタンを任意に決めることが出来ます。ここで表示しない設定なのでスケッチがあっても問題はありません。
ESP32の出力ポートについてですが、そのままでの動作では同時出力もなりますので、ポート出力(CW,CCW)は排他的にしなければなりませんので、動作メイン設定以外の出力ポートはあえて強制停止としてスケッチしてあります。

簡単なリモコンができました。
これだけでも便利で当分使用出来ると思います。
先ずは実際に試してみたいと思います。
まだまだESP32の表示部への組込等、ステップアップは続きます。

つづく?

MODEL 1200FXローテーターその2

ESP32DevKitCのADコンバーターの精度の良い2.5DBアッテネーションを使い誤差を調べての簡易補正を行なったREMOTE端子の角度に対しての出力電圧を角度計算して表示した動画です。

かなり角度と指針位置の精度が取れています。補正前はかなりのズレがありましたが、補正後はほとんど±1カウント以内ぐらいです、多くても±2カウント以内に収まっています。ただし、これは見る角度とかでも多少代わりますし、進めて戻って、または戻って進めてをやると±2カウントぐらいの誤差になります。(とても指針表示にヒステリシス、またはバックラッシュがあるローテーターです。)またスピード設定を早くすると止める位置が難しくなりますし、最初と終わりの止まる位置が勢いがあるのでスピードが遅い時のAD変換値とスピードが速い時のエッヂのAD変換値は多少異なります。通常の仕様を標準とするのでスピードはセンターで設計しています。SWの操作はスピードが遅い程目的の角度で止めやすいです。


大まかな事ですが、指針は−10°〜から+379°まで表示範囲があります。その中の0°から360°を使っています。これもエッヂ近辺の精度の悪いところを使用しない為の方策の一つであるのと、エッヂ指針設定では必ずオーバーするので余裕をもたせる意味でも広くしてあります。

0°超えた左回転時のエッヂ位置 (角度でー10°のゆとり)
CIMG9524

360°を超えた右回転時のエッヂ位置(角度で379°(360°から+19°))
CIMG9525

ここまでは上手くいった指針とTFT液晶への角度表紙動画と写真説明で終了です。
TFT液晶表示関係のスケッチやTFT液晶を使う場合の設定についての重要と思われた点,等を私自身の忘備録して記します。

今回使用したTFT液晶は1.8インチのものです。
仕様としてwidth 128 x height 160 typeがST7735REDTAB 中華製でALIEXPRESSで購入したものです。とても使いやすいTFT液晶ですが、使うためには使用するESP32DevKitCの端子の指定と使用するフォントとかをドライバー設定のように予め設定を行う必要があります。それは User_Setup.h のヘッダーファイルの設定です。
Arduinoの中のlibrariesフォルダの中のTFT_eSPIのフォルダの中にあります。
先ずは仕様のWIDTHと HEIGHTを自分の液晶の物に合わせてコメントアウトを外し設定します。
define the pixel width and height in portrait orientation とあります。

#define TFT_WIDTH  128
#define TFT_HEIGHT 160

次に液晶のtypeも自分の液晶に合わせてコメントアウトを外して設定します。たくさん種類がある中から自分の使う液晶のtypeを選びます。
define the type of display とあります。

#define ST7735_REDTAB

次はESP32 のDev board pinセットアップです。ここが一番厄介でした。というのもWebのスケッチで動作しているものと、この設定が違う事がある為、オリジナルの設定では表示できない事が起きえます。ある程度の自由度(ポート選択可能)があるためです。自分のTFT液晶とESP32Dev boardではいつも同じポート設定で行ないたいのが心情ですが、Webで気に入ったスケッチで動作している物に合わせて設定を変えてしまうのが手です。私はそうしてます。ブログで作成したTS-820 DDS-VFOでも同じTFT液晶を使っていますので、これと同じポート設置に書きかえています。すると全部同じ接続で新たなスケッチでの液晶表示も悩まずに組んで行けます。
下記のTFT_CS  5,  TFT_RST 15 の2つは書き換えてあります。元はそれぞれ 15 と 4です。

// ###### EDIT THE PIN NUMBERS IN THE LINES FOLLOWING TO SUIT YOUR ESP32 SETUP   ######

// For ESP32 Dev board (only tested with ILI9341 display)
// The hardware SPI can be mapped to any pins

#define TFT_MISO 19
#define TFT_MOSI 23
#define TFT_SCLK 18

#define TFT_CS    5  // Chip select control pin 15
#define TFT_DC    2  // Data Command control pin
#define TFT_RST  15  // Reset pin (could connect to RST pin) 4

次は使うフォントを指定します。面倒なので使える物全部指定しておきます。
// ##################################################################################
//
// Section 3. Define the fonts that are to be used here
//
// ##################################################################################

// Comment out the #defines below with // to stop that font being loaded
// The ESP8366 and ESP32 have plenty of memory so commenting out fonts is not
// normally necessary. If all fonts are loaded the extra FLASH space required is
// about 17Kbytes. To save FLASH space only enable the fonts you need!

#define LOAD_GLCD   // Font 1. Original Adafruit 8 pixel font needs ~1820 bytes in FLASH
#define LOAD_FONT2  // Font 2. Small 16 pixel high font, needs ~3534 bytes in FLASH, 96 characters
#define LOAD_FONT4  // Font 4. Medium 26 pixel high font, needs ~5848 bytes in FLASH, 96 characters
#define LOAD_FONT6  // Font 6. Large 48 pixel font, needs ~2666 bytes in FLASH, only characters 1234567890:-.apm
#define LOAD_FONT7  // Font 7. 7 segment 48 pixel font, needs ~2438 bytes in FLASH, only characters 1234567890:-.
#define LOAD_FONT8  // Font 8. Large 75 pixel font needs ~3256 bytes in FLASH, only characters 1234567890:-.
//#define LOAD_FONT8N // Font 8. Alternative to Font 8 above, slightly narrower, so 3 digits fit a 160 pixel TFT
#define LOAD_GFXFF  // FreeFonts. Include access to the 48 Adafruit_GFX free fonts FF1 to FF48 and custom fonts

// Comment out the #define below to stop the SPIFFS filing system and smooth font code being loaded
// this will save ~20kbytes of FLASH
#define SMOOTH_FONT

残りの設定はオプションです。これは次の2つを設定します。
ST7735は27MHzより上では動作しない(スプリアスピクセルライン障害)とコメントあります。なので最大である27MHzの設定なのでしょう!
// With a ST7735 display more than 27MHz may not work (spurious pixels and lines)

#define SPI_FREQUENCY  27000000

これはおまじない?
#define SPI_TOUCH_FREQUENCY  2500000

これで設定する箇所の全部です。
一度設定しておくと同じ液晶とESP32Dev ボードの接続は代わりませんので、スケッチがしやすくなります。

User_Setup.hの設定が終わったら次は今回の1200FXの角度の液晶への表示方法のスケッチについてです。TFT液晶の表示についてのみ特化して記します。

ヘッダーのロードを設定します。
//TFT1.8
#include <SPI.h>
#include <TFT_eSPI.h>

TFT_eSPI tft = TFT_eSPI(); // Invoke library, pins defined in User_Setup.h

次にセットアップでの設定です。
void setup(){
    Serial.begin(115200);

    //TFT setting -----------------------------------------------
    tft.init();
    tft.setRotation(1);
    tft.fillScreen(TFT_BLACK);
    //-----------------------------------------------------------


void loop(){ での設定です。
ミソはlongの数値はcharに変換して表示することです。
 char cc[6];で文字配列を用意して  sprintfで数値を文字変換します。
 sprintf(cc,"%3d",((deg*1)+dd)); 
上は変換時に補正した角度を入れています。
後はTFTのテキストカラーを指定(白)、テキストサイズ設定(5)、セットする位置設定(0,50)で後は数値をccに変換し、後はccをTFTで表示するだけです。
    tft.setTextColor(TFT_WHITE,TFT_BLACK);
    tft.setTextSize(5);
    tft.setCursor(0,50);
    char cc[6];
    sprintf(cc,"%3d",((deg*1)+dd)); 
    tft.print(cc);


以下 void loop 全スケッチです
void loop(){
    uint32_t voltage;
    // ADC1_CH6の電圧値を取得
    esp_adc_cal_get_voltage(ADC_CHANNEL_6, &adcChar, &voltage);

    long d =0;
    for(int i=0 ;i<2000;i++){
      d +=analogRead(34);
    }
    
    long deg =0;
    long dd =0;
  
    // deg=((((d-78)/2000)-14)/15.27)*1.02;
    // Serial.print("deg = ");
    // Serial.println(deg*5);
    
    // deg=((((d-78)/2000)-14)/1.52);
    // Serial.print("deg = ");
    // Serial.println(deg*0.5);

    deg=(((d/2000)-62)/2.83);
    Serial.print("deg = ");
    Serial.println(deg*1.0);

    //hosei
    dd=-1*0.000123456*deg*deg+0.0444444*deg;
    char cd[6];
    sprintf(cd,"%4d",dd);
    Serial.print("HOSEI:");
    Serial.println(cd);

    tft.setTextColor(TFT_WHITE,TFT_BLACK);
    tft.setTextSize(5);
    tft.setCursor(0,50);
 

    char cc[6];
    sprintf(cc,"%3d",((deg*1)+dd));
    tft.print(cc);
 
    Serial.println(((d)/2000));
     delay(10);
}

以上で角度の数値変換値は液晶表示できます。
--------------------------------------------------------------------------------------------------------------------------------------


AD変換のスケッチ設定についてはお決まりなので、しかも説明付きのサンプルですので省略します。
ADC用のヘッダーのインクルードを2つします。
//adc header ----------------------------
#include "driver/adc.h"
#include "esp_adc_cal.h"

esp_adc_cal_characteristics_t    adcChar;

ADCのATTの設定が11dB1つしかなかったので,コメントアウトで全部の設定を載せました。
使用出来る電圧のフルスケールは便利です。
今回は2.5dB設定で使用しましたので1.5Vフルスケールです。

void setup(){
    Serial.begin(115200);

    //TFT setting -----------------------------------------------
    tft.init();
    tft.setRotation(1);
    tft.fillScreen(TFT_BLACK);
    //-----------------------------------------------------------
    // ADCを起動(ほかの部分で明示的にOFFにしてなければなくても大丈夫)
    adc_power_on();
 
    // ADC1_CH6を初期化
    adc_gpio_init(ADC_UNIT_1, ADC_CHANNEL_6);// GPIO 34
   
    // ADC1の解像度を12bit(0~4095)に設定
    adc1_config_width(ADC_WIDTH_BIT_12);
   
    // ADC1の減衰を11dBに設定
   // adc1_config_channel_atten(ADC1_CHANNEL_6, ADC_ATTEN_DB_11);
    
   //ADC_ATTEN_DB_0     //FULL SCALE 1.1V
   //adc1_config_channel_atten(ADC1_CHANNEL_6, ADC_ATTEN_DB_0);
   //ADC_ATTEN_DB_2_5   //FULL SCALE 1.5V
   adc1_config_channel_atten(ADC1_CHANNEL_6, ADC_ATTEN_DB_2_5);
   //ADC_ATTEN_DB_6     //FULL SCALE 2.2V
   //adc1_config_channel_atten(ADC1_CHANNEL_6, ADC_ATTEN_DB_6);
   //ADC_ATTEN_DB_11    //FULL SCALE 3.9V
   //adc1_config_channel_atten(ADC1_CHANNEL_6, ADC_ATTEN_DB_11);
 

  hiZ(25);
  dacWrite(25,9);//9
   
    // 電圧値に変換するための情報をaddCharに格納
    esp_adc_cal_characterize(ADC_UNIT_1, ADC_ATTEN_DB_2_5, ADC_WIDTH_BIT_12, 1100, &adcChar);

}

次にADC変換時入力感度特性でゼロボルト付近のオフセットが(不感帯)が大きい回避策としてですが、ラジオペンチのWebを参考にしました。とても素晴らしい方法かと思います。


回路図も全く同じポートを使っていますので、すべて引用させていただきました。
範囲を選択_279

スケッチ上でのポートD25の設定と出力の下記の2つの処理です。

    hiZ(25);
    dacWrite(25,9);//9

上記のサブルーチンhiZ();
void hiZ(int n) {               // 指定ピンをHi-Zに設定 set the pin to hi-z
  pinMode(n, INPUT);            // 入力にして set INPUT
  digitalWrite(n, LOW);         // 念のためにプルアップを解除 no pull up
}
dacWriteではポート25に9を出力しています。出力は0,1,、、、7,8,9などと入れてみてオフセットの不感地帯がなくなる補正電圧値を見つけます。通常時は78mV出力がありますが、私の場合は以下の電圧値でした。9の97mVを採用しました。

2の出力時 78mV
3の出力時   78mV
4の出力時 78mV
5の出力時   79mV
6の出力時 83mV
7の出力時    89mV
8の出力時 93mV
9の出力時    97mV

補正電圧は差し引きして使います。
不感地帯はローテーターの0°から増加時の数値の変化が突然数値が上がる様な感じの所を言っています。上記の出力設定の状態で0°近辺でもADC出力値が変化する様になり変換値も同様に変化します。不感帯はキャンセルされています。

平均値化の為のスケッチです。アナログポートからの電圧の読み込みです。
void loop(){
    uint32_t voltage;
    // ADC1_CH6の電圧値を取得
    esp_adc_cal_get_voltage(ADC_CHANNEL_6, &adcChar, &voltage);

    long d =0;
    for(int i=0 ;i<2000;i++){
      d +=analogRead(34);
    }

dは2000回のDACの入力値の和算値が入ります。1000回ではバラツキが顕著だったので変えました。
平均値化する事でノイズ的な突飛な値が押さえられるのでバラツキがなくなります。
2000で割ることで平均値となります。
0°の時の電圧値分をひきます。
0°で62mV 360°で1084mV   0°分を引く処理で 0mV〜1022mVの電圧範囲を検出します。
2.83は360°のADC変換値の1022を360°分割した1°当たりのADC変換値です。各角度時のADC変換値を2.83で割ることで角度が算出されます。

deg=(((d/2000)-62)/2.83);

残りは補正の式のスケッチですが、単にコーディングするだけです。桁数は電卓の桁です。
求めた補正の計算式をスケッチ様に書きます。

dd=−0.000123456deg^2+(−360)*(−0.000123456)*deg
上を更にまとめると
dd=−0.000123456deg^2+0.04444416*deg

上をスケッチ用に書き換えます。
//hosei
  dd=-1*0.000123456*deg*deg+0.04444416*deg;

補正をかけるスケッチ箇所(ddを足す箇所)
TFT液晶の所でも取り上げています下記の箇所です。
 char cc[6];
    sprintf(cc,"%3d",((deg*1)+dd));
    tft.print(cc);

以上です。
ESP32DevKitCのADCでローテーターのリモート端子を用いた指示角度表示が短いスケッチで簡単に作製することが出来ます。

つづく?

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

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