2025年12月24日水曜日

OpenAIのwhisperで、処理した音声認識テキストを表示するアプリ(Qt版)

https://github.com/gh6141/QtMp3Srt.git 

OpenAIのwhisperで音声認識処理すると.srtというファイルができますが。これと音声ファイル(mp3)を一緒のフォルダに置いて使えるようにしてみました。ちょうど、映画の字幕のような感じで表示できます。-smallのオプションで、処理したものだと、たまに認識が間違って、若干ずれることもありますが、日本語以外等でいろいろ使えそうです。

2025年12月22日月曜日

灯油残量 WIFI OLEDで表示

 ewp32-c3を表示用に使ってみた、センサーからのデータを蓄積しているraspiからWIFIで読み出すようにした。

 とりあえず、補正計算した残量に加えて、気温・気圧表示し、気圧変化のグラフも表示させてみた。スイッチオンで手軽に見ることができて便利。降圧コンバータが容量大きすぎてもったいないので、これは、12Vバッテリーを5Vモーターでドリルに使うことにした。代わりに小型のコンバータにして、さらに小さいケースに後日変更。
  ※灯油残量とは関係ないけれど、苗床ヒーターの温度調整Esp32の温度データもついでに表示できるように、コードを追加した。

※その後、コードにSSIDを3つ登録して、電波が一番強いところに接続できるようにしました。
※変換のための計算パラメータも、raspiにあるデータに追随するようにした。また、raspiのURL、SSIDとパスワードなどもPreferencesに保存可能にした。(アクセスエラーのとき、設定できるようにサーバモードになるようにした。)


2025年12月21日日曜日

pic16f628AによるDFplayer改良

 EEPROMで、どの番号まで再生したか、不揮発メモリに記録できるようにした。フォルダは01のみとした。以前のフォルダ番号用スイッチを制御用(1回タッチで番号を進める、2回タッチで番号を減らす)とし、ファイル番号用スイッチは、1回目の連続タッチで10の位、2回目の連続タッチで1の位を指定して入力できるようにした。(ただし、10未満は、1回目のタッチを10回タッチすると0になるようにした。)

dfPlayer、しかもPIC利用だとやはり、かなり制限があって、コーディングも難しかった。

2025年12月19日金曜日

OpenAIのWhisperがローカル実行でかなりの認識率

 最近は、音声認識が、無料でしかもローカル実行で正確に認識できるのには驚きました。コマンドラインで実行できるので、アプリの中で活用できてとても便利だと思います。

バッチファイルです。途中のパスを通すところは、ffmpegのあるパスです。

radio2text.bat

.m4aなど、いったん.wavに変換してから処理しています。
LANGはenが英語、jaが日本語 --languageないとどちらも出します
--output_format srt で時間付き字幕

Qt使えば
if (line.contains(QRegularExpression("[ぁ-んァ-ン一-龯]"))) {
    // 日本語
} else {
    // 英語
}
のように分けたりもできそうです。

※なお、準備としては ffmpeg以外に、python3.9以上で
pip install -U openai-whisper
をインストールするだけで動くようです。

2025年12月17日水曜日

ESP32灯油残量センサー 実験

まだ、測定値が安定しないので、新たに容量カウント補正用のセンサ(タンク入口までの短い線)を追加して、しばらくデータをとってみることにした。追加PINはGPIO15。esp32から外に出ている線がぬれるだけで、測定値に影響するので、補正できないか試す予定。 
※その後、測定用のCPSをc1、補正用のCPSをc2とすると、容量がカウントの逆数なので、(1/c1-2.05/c2)*10^5*係数a+切片bで近似すると、比較的うまくいくようだった。残量との差をエクセルで計算して、分散が最小になるように、aとbを調整してみた。この値をグラフにしてみると、ほぼ湿度と逆相関のようだったので、最終的に(上記の値)+51-0.6*湿度とするとさらに近似できそうだった。(このときも分散を見ながら手作業で調整。2次の項も入れてみたがかえってよくなかった。)
 これでも、変動が多いけれど、おそらく空気中の湿度というより、表面の水滴などが影響しているのでないかとも予想?されます。(湿度と相関あっても、完全な相関でないので)そこで、平均すればあるていど変動を抑えられるかと思い、移動平均的な計算を入れることにした。ChatGPTによると、 Value=RawValue*0.07+PrevValue*0.93のように前回データとその時の測定値に重みを付けながら足していくといいらしい。これで、しばらく様子をみることにした。
 今のところ、この移動平均を取り入れたら、以下のグラフ(赤い線)のようになり、わりと実測値に近くなった気がした。
 ChatGPTによると指数移動平均というらしい。低い周波数(残量の変化はかなりゆっくり進むので、あうらしい)を通すフィルターと同じ効果あるのだそう。ある意味LPFのようなものだとか。
※ただ、その後、最初のほうのデータにより、前半の状況が変わってくることもあるようなので、まだ十分とはいえないよう。
※変換式のパラメータをWebで変更できるようにして、実測値と計算値の分散が最小なるようにときどき調整している。残量が少なくなってきたときのほうが、データが多く蓄積してくるので、平均化されて誤差は減っている気もする。大事なのは、灯油がなくなりつつある頃の状況を知ることなので、そういう意味では、なんとか使える?かも。


2025年12月15日月曜日

Qtで最下行へスクロールする方法について

 Qtでは、行数が多くなると最下行へのスクロールが難しい仕様?のようです。

 実際のWigetの行サイズとかもあり、すべてを反映して正確なスクロール量を割り出すのが難しいという問題もある?ちょうど、エクセルなどで印刷イメージと編集画面で微妙にずれたりするのと同じ困難さかもしれませんが。

 こういうときは、泥臭い方法で、実際に繰り返し試しながらスクロール量を割り出すしかないのかもしれません。その旨、ChatGPTに伝えたところ、以下のコードを作ってくれました。なんとか、うまくいきました。

void KakeiboTable::scrollDown(){
    QScrollBar* bar = view->verticalScrollBar();
    if (!bar) return;
    int lastMax = -1;
    QTimer* timer = new QTimer(this);
    connect(timer, &QTimer::timeout, this, [=]() mutable {
        int curMax = bar->maximum();
        bar->setValue(curMax);
        if (curMax == lastMax) {
            timer->stop();
            timer->deleteLater();
        }
        lastMax = curMax;
    });
    timer->start(0);
}

2025年12月11日木曜日

Unityで縦列駐車シミュレーションをつくってみた

 WebGLで縦列駐車のシミュレーションできるようにしてみた。実車の運転前に、シミュレーションでコツをつかんでおくと役立つかもしれません。

https://github.com/gh6141/Parking.git(source code)

https://gh6141.github.io/WebGL-Parking/(シミュレーション)

上下左右の矢印で操作し、Spaceでブレーキです

※Github PageでWebGLを使うには、zip圧縮はしないほうがいいようです。パフォーマンスレベルはできるだけLow側にするとうまく動作するようです。

2025年12月10日水曜日

釣り竿アンテナの接触不良対策

 釣り竿アンテナ(カーボン)に銅箔テープを貼ったものをアンテナとして使っていましたが、接続部がどうしても接触不良起こしやすく、SWRも安定しにくくなってきたので、試しに金属クリップを使ったら比較的調子がよくなり59+レポートもらえるようになりました。境目よりなるべくぎりぎり上のほうをはさむとうまくいくようです。

関数解析(宮寺功著)

 文庫本で関数解析が読めるということで購入してみました。早速、壁にぶつかりましたが。

P40 定理2.2で、(x,y)=||(x+y)/2||^2-||(x-y)/2||^2+i||(x+iy)/2||^2-i||(x-iy)/2||^2の定義で(x,y)=(y,x)の共役 が言えるのかどうか? ||x+y||^2+||x-y||^2=2||x||^2+2||y||^2を使うとうまくできるようです。

注意が必要なのは、(x,y)=||(x+y)/2||^2-||(x-y)/2||^2+i||(x+iy)/2||^2-i||(x-iy)/2||^2の共役をとるとき、|| ||のなかにあるiの符号は変えてはいけないということ?うっかりけてしまいそうですが、外側のiは符号変えてもいいですが、ここがたぶん注意点?

Unityを久しぶり少し使ってみました

基本的なことを忘れていて思い出すの時間はかかりましたが、以前作りかけていたものを少しだけ手を加えてみました。文字式の計算を動物キャラクタで、できないか、試しに作ってみたものです。導入等に使えないかと。 使う機会もないので、まだ中途半端の状態ですが。同類項=同じ種類の動物を重ねて計算します。+ーゼロだと爆発して消えるようにしています。

https://github.com/gh6141/WebGL_MathBoxSrc2.git(code)

https://gh6141.github.io/WebGL_mathBox/(WebGL)

こういうゲームでも誰か作ってくれれば、文字式や方程式の抽象概念も多少は理解促進の助けになるのでないかと思っていますが。

2025年12月6日土曜日

ESP32+BME280 bottleコードの調整

 ESP32からのデータをbottleで表示するコードを少し調整。スマホでの表示が見ずらいので少し調整してみたのがこちら


2025年12月3日水曜日

ESP32にBME280追加

 キャパシティのカウントに、温度影響などあれば、補正の可能性もあるかと思い、温度等もロギングすることにしてみた。ついでも、気圧、湿度も計測できるセンサが安く入手できたのでつないでみた。ロギングはbottleサーバで行い、PCから確認できるようにした。esp32のコードもそれに合わせて書き換えた。

補足:容量カウントのピンはGPIO4からノイズが少なめのGPIO12に変更した。また、容量カウントは、WIFIやBME280の起動前に行い、ノイズの影響を除くようにコードを修正。シリアル通信も同様の理由で削除(2025.12.5)(ChatGPTのよると、GPIO12,GPIO33,GPIO32,GPIO13,GPIO15の順でノイズが少ないらしい)

SparkFunBME280というライブラリを追加する必要があります。

BME280のI2C接続図

 アクリルだと、紫外線で脆くなるだろうと考え、塩ビパイプをヒートガンで平面にしたものを加工して作ってみた。

Web確認すると推移グラフもチェックできるようにした(2025.12.6)
(12/7)湿度が容量に影響しているような様子も見られ、もう少し分析が必要と思われる。
(12/8)湿度との相関もはっきりしないところもある。タンク内と外では湿度が同じでないことも影響しているかもしれないので、補正も難しさがありそう。


2025年11月28日金曜日

SMB1.0で古くなったNASをバージョンあげて使う方法

NASのファームウエアをアップデートはさすがに聞かないので、代替案として、raspi2をproxyとして利用してみた。

sudo pico /etc/samba/smb.confで設定追加
[oldnas_proxy]
   path = /mnt/oldnas
   read only = no
   guest ok = no
   valid users = pi
   force user = pi
   force group = pi
   create mask = 0664
   directory mask = 0775
   min protocol = SMB2_02
   max protocol = SMB3

sudo smbpasswd -a pi
sudo systemctl restart smbd

sudo mkdir -p /mnt/oldnas
sudo mount -t cifs -o username=NASのユーザー名,password=NASのパスワード,vers=1.0,uid=pi,gid=pi,file_mode=0664,dir_mode=0775 //192.168.1.アドレス/disk /mnt/oldnas

上記のマウントは、シャットダウンで消えるので、再起動で保持するには
sudo nano /etc/samba/nas.credentials
username=ユーザー名
password=パスワード
sudo chmod 600 /etc/samba/nas.credentials

/etc/fstab に追加
//adress/disk  /mnt/oldnas cifs  credentials=/etc/samba/nas.credentials,vers=3.0,uid=1000,gid=1000,file_mode=0664,dir_mode=0775  0  0

マウントテスト
sudo mount -a
ls /mnt/oldnas

2025年11月25日火曜日

Qt 他のOSからのコードの取り込み

 Windowsで作成したコードをLinuxで使う手順:
最初、NewProject>プロジェクトのインポート>既存プロジェクトのインポート
だと思って操作した。しかし、コンパイラのバージョンが一致しないためかうまくいかない。
ChatGPTによるとコマンドラインだけでもできるようだ。
必要なものそろえるには
sudo apt update
sudo apt install qt6-base-dev qt6-base-dev-tools qt6-tools-dev qt6-tools-dev-tools
sudo apt install cmake build-essential ninja-build gdb
cd ~/qtkjog
rm -rf build
mkdir build
cd build
cmake ..
make -j4
これで、IDEに頼らず実行ファイルが動作した。

IDEの設定も、プロジェクト>ビルドと実行の中のDesktop Qt6.10.1というのができていたので、そこのビルド設定>一般マネージャを/home/user/qtkjog/buildと変更
また、実行時の設定>実行ファイルのところを/home/user/qtkjog/build/kjogとして、作業ディレクトリは空欄にしてみた。すると、立ち上げることができた。

ところが、これが、ビルドを消すとうまくいかなので、この方法は不完全なよう。configureがエラーでうまくいかない。

いろいろ、試行錯誤をしながらも、結局、正しくは、
・CMakeLists.txt を開く
・/home/user/qtkjog/build等の名称自動でつくので 必要なものにチェック入れる
・右下にconfigure projectのボタンが出てくるので、これをクリックでOk
・あとは、実行ボタンでOk
じつは、シンプルな操作でした。(ChatGPTはcmakeのconfigureがどっかにあるはずだと教えてくれるのだけど、新しいIDEにはそれは見つけられず、結局このconfigure projectのボタンがそれに該当するものだったらしい。configure>makeの手順はいつの時代になっても変わらないようだ。)

Windowsでは動作したのに、Ubuntuでは動作しないものもあった。C++の派生クラスの扱いがOSで微妙に違いがあるらしく、そのためらしい。こういうものは、なかなかバグを発見しずらく、気づくまで時間がかかってしまった。

2025年11月24日月曜日

Linux Mint へのMultiWriter5300のプリンタ追加(覚書)

 LinuxMint標準のドライバだけではうまくいかなかったが、次の手順で設定できた。CUPS を使用。

 NECの公式ウェブサイトからMultiWriter 5300向けのLinuxドライバーをダウンロードします。通常はRPM形式で提供されます。DEBパッケージを使用
sudo apt update
sudo apt install cups alien
sudo systemctl enable cups.service
sudo systemctl start cups.service
sudo usermod -aG lpadmin your_username(your_usernameを実際のユーザー名に置き換え) 
保存したディレクトリに移動  cd ~/Downloads
↓注!:x.x.xのところはダウンロードしたものに合わせて適宜変更
sudo alien -d nclinuxprint-x.x.x-1.i386.rpm
sudo dpkg -i nclinuxprint-x.x.x-1.deb
エラーあれば sudo apt install -f 
ウェブブラウザを開き、CUPSの管理画面 (http://localhost:631/) にアクセス
「管理」タブをクリック>「プリンターの追加」>認証を求められたら、lpadminグループに追加したユーザー名とパスワードを入力
接続方法を選択:USB接続の場合は**「Local Printers」から、ネットワーク接続の場合は「Network Printers」**からプリンターを選択
ネットワーク接続の場合、自分の場合、ipp://*.*.*.*:631/ippでうまくいった。(*は各自環境に合わせて設定)
「続ける」>プリンターの製造元(NEC)とモデル(MultiWriter 5300)を選択、またはインストールしたPPDファイルをアップロード>画面の指示に従って名前や場所を設定し、インストールを完了>最後にテスト印刷で確認

2025年11月23日日曜日

Qt6 Linuxへのデプロイ

 配布の前段階として、試しにフォームのみのテストコードをデプロイ試してみた。
sudo apt install ninja-build
sudo apt install qt6-base-dev qt6-base-dev-tools
sudo apt install  qt6-tools-dev-tools qt6-l10n-tools
何度か失敗したらrm -rf CMakeCache.txt CMakeFiles/
cd ~/デスクトップ/test           rm -rf build           mkdir build            cd build   でいったん削除
cmake -DCMAKE_PREFIX_PATH="/usr/lib/x86_64-linux-gnu/cmake/Qt6" -DCMAKE_BUILD_TYPE=Release ..  (..はひとつ上にCMakeLists.txtがあることを示している)
make -j8
情況としては
test/
 ├ build/  ←ここで上記コマンド
 │   ├ Makefile
 │   ├ CMakeFiles/
 │   └ myapp (実行ファイル) →これが、このPC環境でなら実行可能になった
 └ CMakeLists.txt   となる

2025年11月20日木曜日

Qt レイアウトについて

    auto *labelLayout = new QHBoxLayout;
    labelLayout->addWidget(new QLabel("削除(左列)"));
    labelLayout->addWidget(new QLabel("適用(右列)"));

    auto *container = new QWidget;
    auto *containerLayout = new QVBoxLayout(container);
    containerLayout->addLayout(labelLayout);
    containerLayout->addWidget(grid);

    scrollArea->setWidget(container);

container:大きいレイアウトの中に入れる対象、containerLayout:その container 内での並べ方の定義 と 考える。

2025年11月18日火曜日

Qt ComboBoxの更新時シグナルを一時的に無視

一時的にシグナルを無効化するには 
QString oldText = cb->currentText();  // 現在の文字を保存
cb->blockSignals(true);  // イベントを一時的に無効化
cb->clear();
cb->addItems(items);
cb->setCurrentText(oldText);  // 元の文字に戻す
cb->blockSignals(false);  // イベント再開

これは、いろんな場面で必要になってくる定石?
QString oldText = cb->currentText();
{
    QSignalBlocker blocker(cb);  // ブロック開始
    cb->clear();
    cb->addItems(items);
    cb->setCurrentText(oldText);
} // ブロック終了と同時に自動復帰
という方法もあるとのこと。

2025年11月17日月曜日

Qtでボタンをグリッド内でDrag&Dropするコード

 よく使いそうな機能なので、ChatGPTといろいろやりとりしながら、BugFixして完成したものです。グリッド内のボタンをDrag&Dropで動かせるので、対応関係の設定などに利用すると便利そうです。


DraggableButton.h

DraggableGridWidget.h

DraggableGridWidget.cpp

mainwindow内のダイアログ起動コード

2025年11月14日金曜日

Qtで、同時に2つのmodelを扱う例

 ChatGPTに聞いてみたところ、modelを切り替えながら処理する場合どうするか、だいぶ複雑にはなる。あまり見慣れないコードだけど、これで動くようになる。(家計簿で、口座間移動処理データを同時に2つ削除するときのslotの部分)


モデルを使って「いったん読み込んで処理してから反映」としたのは、複数行選択
元テーブルの情報を参照先テーブルの削除条件に使う、という 2つのモデルを絡めた処理 を安全に実装するための手法、ということのようです。

C++の参照、ポインタ復習

 Qtで、最近ほとんど使ってなかったポインタや参照をC++で久しぶりに使うことになったが、ほとんど忘れていた。少し復習してみた。

#include <iostream>
using namespace std;
int func(int& x);
int func2(int* y);

int main(void){
    int a=10;

//  int& x=  では別名にしたい変数をもってくる   ①
// int x= ではコピーしたい変数をもってくる(関数型言語ではこちらの手法)

    int &b=a;  //参照渡し (1)
     printf("%d\n",b);     
     b=11;     
     int b2=a; //コピー渡し
     printf("%d\n",b2);     
     b2=12;    

// int* y= ではアドレスを代入 ②

    int *c=&a; //参照
    printf("%d\n",*c);           

    char* e="a";
    printf("%s\n",e);   
// 関数の引数でも同様
    int d=func(a);
    printf("%d",d);

    int g=func2(&a);
    printf("%d",g);
    
}

int func(int& x){  //参照 渡し ①
    return x;
}

int func2(int* y){  // ②
    return *y;
}
 
自分なりの覚え方として、次のように考えてみた。
・&xはxのアドレス *yはyがアドレスのときの値 なので、&と*は逆関数の関係ともいえそう。    *(&x) == x   &(*p) == p
・int &b=a    int *c=&a   これらをよくみると、b=a  c=&aは、どちらも同じ
   注意が必要なのは 値が入るのはbと*cであるということ
 →それと整合性とれるように、int &bのintは&bでなくbに適用され、int *cのintは *cに適用されるともいえそう。
 

2025年11月10日月曜日

Qtでいろいろ作成

 家計簿、スケジューラ、日記は、これまで.Net使った自作アプリを使ってきたが、今後Linuxでも使えるようにするため、すべてQtで作り変えることにした。スケジューラと日記はほぼ完成する。日記は、SQlite保存なので、暗号化したテキストで保存することにした。.NETに比べると復号が入っても検索処理も圧倒的に早くなっている。(.NETだと遅すぎて暗号処理を諦めていたけれど、Qtはその点心配はないようだ。)

  昨今は、C++に変わり、Rustあたりが速度を要求されるアプリに使われつつあるということだけれど、QtでC++も悪くないように思う。

2025年11月9日日曜日

QtでSqliteつかいたいとき

CMakeList.txtに以下3行追加必要

 find_package(QT NAMES Qt6 Qt5 REQUIRED COMPONENTS Widgets Sql)

find_package(Qt${QT_VERSION_MAJOR} REQUIRED COMPONENTS Widgets Sql)


target_link_libraries(QtDiary PRIVATE Qt${QT_VERSION_MAJOR}::Widgets Qt${QT_VERSION_MAJOR}::Sql)

git pullのエラー解決 (覚書)

 error: Your local changes to the following files would be overwritten by merge: CMakeLists.txt.user Please commit your changes or stash them before you merge. Aborting

この場合、git stash > git pull > git stash pop を試してみる

CMakeLists.txt.user は通常 IDE のユーザー固有設定ファイルなので、プロジェクトによってはバージョン管理に含めないこともあるとか(.gitignore に追加したほうがいい)

コンフリクトしたら
<<<<<<< Updated upstream
(リモートの変更)
=======
(自分の stash の変更)
>>>>>>> Stashed changes     となっているので、===や<< >>を削除し、どちらかを残す


git add CMakeLists.txt.user
git commit -m "Resolve merge conflict in CMakeLists.txt.user"

.gitignoreにCMakeList.txt.user追加したら反映させるために
git rm --cached CMakeLists.txt.user
git rm -r --cached .
git add .
git push

2025年11月8日土曜日

Qtのandroidへのデプロイ(備忘録)

 android studioをインストール
環境変数 setxで永続保存
setx JAVA_HOME "C:\Program Files\Android\Android Studio\jbr"
setx ANDROID_SDK_ROOT  "C:\Users\<ユーザー名>\AppData\Local\Android\Sdk"
setx ANDROID_NDK_ROOT  "C:\Users\<ユーザー名>\AppData\Local\Android\Sdk\ndk\29.0.14206865" のように
NDKがないときインストール必要(CMAKEも)
Qtで プロジェクト>キットの管理...>デバイスでAndroidが追加できるが、他の項目をチェックしてまだ不十分なところ(SDKsの赤字のところSdkCommandLineToolなどあれば)をAndroidStudioのSDK Managerで設定していく
・OpenSSLダウンロードなども

スマホ側設定:「設定 → 開発者向けオプション」を有効化→ 「ビルド番号」を7回タップして出ます。「USBデバッグ」をオンにする システムの開発者向けオプションの設定で

PC側:Android Studio で「SDK Manager → SDK Tools → Android SDK Platform-Tools」
がインストールされていること(=adbコマンドが使える)。Qt Creator が SDK/NDK/JDK を認識している。(ツール → オプション → Devices / Android を確認) 

デプロイ手順(Qt Creatorから):スマホをUSBで接続>
adb devices→ device と表示されれば接続成功。
(C:\Users\<ユーザー名>\AppData\Local\Android\Sdk\platform-tools\adb.exeのパスも通しておく必要あり、コントロールパネルあたりから)
Qt Creator を開く>左下でデバイスとしてスマホ選択>▶ 実行ボタンをクリック
Qt が自動で.apk をビルドスマホへインストール>アプリを起動

ビルド、デプロイ環境構築に手間はかかるが、自作アプリがWin、Linuxだけでなくスマホでも使えるのは便利。

QtのWindowsでのデプロイ方法

 マルチプラットフォーム言語のため、デプロイ方法は少し手間がかかる。

mingwの形式でビルドした場合

Release ビルドの exe があるディレクトリに移動して、

cd C:\Users\****\kjog\build\Desktop_Qt_6_9_3_MinGW_64_bit-Release

windeployqt.exe のフルパスを指定して実行する必要がある。

"C:\Qt\6.9.3\mingw_64\bin\windeployqt.exe" kjog.exe

2025年11月1日土曜日

ESP32 DEVKIT_Cで容量をWIFIでロギング

間欠動作で12時間ごとにGPIO4を容量センサとして使い、ロギングしてみた。raspiにGETでデータを保存し、スマホ等で取り出すアプリを作れば完成の予定。 はたして、灯油タンク残量が容量センサで計測実用なるか、テスト予定。(PICのCPSも検討したが、かえって複雑になりそうなので、このパターンにしてみた。)
PICに比べると、至れり尽くせりでesp32は開発しやすい。それでも、ネットワークがからむとプロトコルやポートとかいろいろ調整が必要になってくる。

2025年10月30日木曜日

PIC12F1822で間欠ブザー

30秒ごとにブザーならすタイマーをPICで作ってみた。TTP223と2sc1815で電源オンオフ、電子ブザーはPICのRA2で出力してみた。電源はボタン電池で常時TTP223を待機状態にしておくけれど、ほとんど消費しないらしいので、これで試してみたい。なお省エネのため、TTP223のLEDは取り外した。かわりにブザーを1secごとに1msならして、電源状態確認できるようにした。
 
 最初、TTP223がオフの状態でもブザーがかすかに音するので、なぜかと思ったら、PICのアースはコレクタに、ブザーのアースは電源のアースにつないでいたためだった。内部抵抗による微妙な電位差が原因かと思われます。
 PICとブザーのアースをどちらもトランジスタのコレクタにつなぐことで解決した。


2025年10月29日水曜日

PIC12F675のタイマー修正

 以前つくったタイマーのコード修正してみた。すでにPICを基板に半田づけしてしまったが、PicKITに合わせてコネクタをつけてPICにエナメル線で配線しなんとか、書き込みできるようにしてみた。コードを少し変更して、時間ずれも調整してみた。1割ほど時間が短いので、11/10をかけてみた。だいぶ正確になる。


2025年10月28日火曜日

PIC12F1822のCPS 再挑戦

 静電気測定ということで、PICのCPSを内臓クロックで使ってみたが、温度の影響のためか、変動が大きい気がしたので、12MHzのXtalを使ってみた。ヤフオクで、10pfコンデンサと一緒に購入。


・配線は混乱してきたので、基板を新しくして配線しなおす。
・RA4とRA5をXtalにつなぐため、CPSはRA0に変更したり、周波数も変わるため、ANSELA、TRISA,CPSCON1,SSP1ADDなどの設定を慎重に変更する必要があった。
・XtalをRA4とRA5に接続したら、この2か所に2個10pFをつないでアース。
・TTP223は消費電力が少ないようなので、電池に常時つないで、トランジスタスイッチを動作させることにした。2sc1815使用。電源はエネループ3本。

 タッチしたときだけ、LCDが表示されるようになった。以前は、ボタンスイッチの接触不良があって使いにくかったが、これだとストレスなく使える。
・当初、灯油残量センサに使う予定だったが、ESP32だけで間に合いそうだったので、最終的には容量測定器にしてみた。pF=60000/cps-0.02*cpsという近似式を使ってみた。30pF~20000pFぐらいの範囲で、ある程度の目安としては使えることを確認した。本来反比例になるはずだけれど、容量が小さくなると誤差が出やすくなるようで、-0.02*cpsで補正。