2026年3月15日日曜日

ESP32にスピーカとマイクをつけて実験

 短い音の録音再生(エコー)が可能か実験してみた。今後、raspi経由でいろいろ処理を予定していますが。

 配線の数が多いときは、意外とエナメル線が使いやすい。裏表に通したりしてなるべく干渉しないようにした。PCB等の発注も考えたけれど、配線の変更の可能性もあるし、それなりの料金はかかるので、最小限のユニバーサル基板にしてみた。モジュールが基板からはみ出しているところは、あとでサイズがあいそうな百均のケースに固定できないか、考えたい。

raspiで音声アラームをスケジュールに従い起動

アラームをスケジュールで起動する仕組みを考えてみた。
wavplay.py**********************
import os
import sys
import time
import subprocess
import RPi.GPIO as GPIO 
RELAY_PIN = 27
def play_wav(wav_file):
    file_path = os.path.join("/home/pi", wav_file)
    if not os.path.isfile(file_path):
        return f"File not found: {file_path}"
    GPIO.setmode(GPIO.BCM)
    GPIO.setup(RELAY_PIN, GPIO.OUT)
    try:
        GPIO.output(RELAY_PIN, GPIO.HIGH)
        time.sleep(0.2)
        proc = subprocess.Popen(["aplay", file_path])
        proc.wait()
        return f"Played {wav_file}"
    except Exception as e:
        return f"Error: {e}"
    finally:
        GPIO.output(RELAY_PIN, GPIO.LOW)
        GPIO.cleanup(RELAY_PIN)
if __name__ == "__main__":
    if len(sys.argv) < 2:
        print("Usage: python script.py <waveFilename>")
        sys.exit(1)
    filename = sys.argv[1]
    result = play_wav(filename)
    print(result)

crontab -e******************
0 17-19 10 11-12 * /usr/bin/python3 /home/pi/wavplay.py PurchaseKerosene.wav

ちなみに、現在のcrontabの一部
5 6 * * * /home/pi/update-cloudflare-ufw.sh >> /home/pi/tmp/ufw-cron.log 2>&1
*/10  * 13-29 2 * curl -s http://localhost:8080/py/collect >/dev/null
0     8 13-29 2 * curl "http://192.168.1.30/setConfig?setA1=21.5&setA2=21.4&setA3=21.5"
1行目cloudflare関連、2,3行目が苗床ヒーター管理

2026年3月4日水曜日

IPoE接続に変えてみた

  PPPoE接続をしばらく使ってきたが、最近土日や夜間がネット途切れるぐらい混雑してきたので、思い切ってIPoEに変えてみたら夜間でもダウンロード220Mbpsアップロード150Mbpsとだいぶ快適になった。

 ルータをどうするかで迷ったが、最近WIFI-Apを交換したばかりだし、WIFI付きの家庭用ルータはどうしても熱のためか、寿命が短いように思われたので、頑丈な有線ルータということで中古のIX2106をヤフオクで入手。希望小売価格が89000円ということなので、6000円ちょっとで購入でき、コスパはいいのでないかと思う。

 ただ、設定は情報集めがなかなか大変だった。ネットのNECの設定例も、ONU接続用の設定?のような感じだったので、PR400NEの内臓ONUを使うには不安があった。(電話はPR400NEから接続しているので、これを使わざるを得ない) ChatGPTとGoogleAIの助けを借りてなんとか、解決。

注意点としては

・PR400NEの接続1を停止 sshで設定するために、念のためUSBシリアルコンソール(1500円ほど)用意

・NECのサンプルの変更したところ

 ip-ad subscriber Giga~は削除 ※
interface GigaEthernet0.0

  no ip addressip address 192.168.2.2/24
  ipv6 enable
  ipv6 address autoconfig ※のかわり追加
  ipv6 dhcp client dhcpv6-cl 
  no shutdown

ip dhcp profile dhcpv4-sv
  assignable-range 192.168.1.50 192.168.1.70  ::dhcpの範囲を指定できる
  dns-server 192.168.1.1

interface Tunnel0.0
  tunnel mode 4-over-6
  tunnel destination fqdn gw.transix.jp
  tunnel source GigaEthernet1.0 → tunnel source GigaEthernet0.0 に変更
  ip unnumbered GigaEthernet1.0 これはなしで→  ip address 192.0.0.2/29 に変更
  ip tcp adjust-mss auto 
  no shutdown


※内部DNSサーバをうまく扱うことができなかったが、その後、「proxy-dns server ipアドレス priority 優先度」を設定することで、使えるようになった。
 また、bottleサーバでは、cloudflareからの外部アクセス制限をipアドレスで行う方法が使えず、別の方法に変更した。どうしても複雑化しているので細かいところに影響はでてしまうようだ。
※中古のため、縦置きスタンドがなかったため、不要になったアクリルボックスの破片からミニルータでL型に切り抜き、ねじ止めしたら安定するようになる。横置きより縦置きのほうが、熱は逃げやすいと思われるので、縦置きにした。
※念のため、使わずにいた廃品からはずした冷却ファンと使わずにいた温度センサーW1209、それにハードオフの330円の12Vアダプタで冷却もできるようにした。冷却ファンを最初はひもでしばっていたが、どうも不安定なので、あり合わせのアクリル破片をリベットでつないで、縦置き上部に載せられるように、フレームをつくってみた。
※PR400NE側の192.168.2.0/24側に192.168.1.0/24側からアクセスできず、HGWの管理画面が出せず不便だったが、以下の確認することで、なんとか解決できた。
1.PR-400NEの静的ルート: 192.168.1.0/24 宛を 192.168.2.2 へ
2.PR-400NEのipv4パケットフィルタ: 192.168.1.0/24 からの通信を許可
IX2106のマニュアルでは、2つのLANを接続するには、それぞれのインターフェースに ip address 192.168.1.254/24等を記述する例がでていたが、複数のルータが絡む場合はそれぞれきちんと確認が必要だということのようだ。
※結局、上記の設定では、ipv6がつながらないことが判明、再度、こちらの設定例1をもとに修正したらうまくいった。192.168.2.0/24というゾーンはつくらないほうがシンプルでいいようだ。ただ、HGWの管理画面を出すには、なぜかipv4ではだめで、ipv6のグローバルアドレス(たまに更新されるらしい)を指定必要だった。AIの意見も聞きながらも、そのままだとうまくいかないところもあったので、やはり、人間の判断も入れながら適宜修正は必要なようだ。

2026年3月1日日曜日

久しぶりの移動運用

 外の気温は6度と、まだ風が冷たかったけれど、比較的電波状況もよく、それほど強い風でもなかったので、久しぶりの移動運用。前回、ダイポールアンテナの実験失敗していたので、再チャレンジ。今回は、NanoVNAで慎重に長さを調整してみたところ、なんとかアンテナチューナで整合できた。末端が地面に近いこともあってか、かなり短めにする必要があった。とりあえず、1エリアの移動局と59で交信することができた。

 


 (ヒートガンで柔らかくした)塩ビパイプで、不要になった物干しパイプ、壊れた雪はねの柄、つっぱり棒をつなげて作ったポールなので、かなりしなっていますがなんとか持ちこたえています。近くに1m程度の杭があったので、ひもを結ぶのに使わせてもらいました。
 たまたま、河川公園に来ていた方から、声をかけられ、アマチュア無線だという話をしたところ、以前免許を取ったけど今はやってない方のようでした。受信の様子など、見てもらいながら、少しの間、アイボール。

2026年2月27日金曜日

cloudflareのトンネル利用

 これまで、cloudflareのプロキシーは利用していたが、グローバルIpアドレスをルータのものをDNSに設定していたので、Ipアドレスが変更になった途端、外部からアクセスできなくなった。自分では、自動更新の設定なっていたつもりだったけど、よく調べたら、なってなかったようで、結局は、トンネルを作らないとだめだったよう。cloudflareとraspiの間で独自プロトコルでトンネルを作り、常時接続状態にする仕組みのよう。早速、AIに聞きながらraspiにツールをいれ、設定変更。これで、Ipアドレス変更を気にしなくてもよくなり、だいぶ管理は楽になる。

※この方式にしたところ、外部からのアクセスログが正しく記録されなくなってしまった。いろいろ、試行錯誤した結果わかったことは。ヘッダー名: Cloudflareの仕様により、元のIPは CF-Connecting-IP という名前で送られてくるので、それを使うようにする設定が必要らしい。

sudo a2enmod remoteip

・トンネルでlocalhost:8080でbottleを指定したのがよくなかった。apacheのログを取りたい場合はapache経由のためlocalhost:80にする必要あった。

・ログ形式(apache2.conf)で

LogFormat "%v:%p %a %l %u %t \"%r\" %>s %O \"%{Referer}i\" \"%{User-Agent}i\"" vhost_combined
LogFormat "%a %l %u %t \"%r\" %>s %O \"%{Referer}i\" \"%{User-Agent}i\"" combined
LogFormat "%a %l %u %t \"%r\" %>s %O" common

内部設定(000-default.conf)で

RemoteIPHeader CF-Connecting-IP
RemoteIPInternalProxy 127.0.0.1

変更が必要。

sudo systemctl restart apache2 で再起動。


2026年2月26日木曜日

bottleのformで文字化け

bottleのformのPostで全角文字が文字化けしてしまい、原因がつかめず苦労しました。結局は、対症療法的ですが、以下のようにして解決。
def schedule_edit_post(): 
  schedules = load_schedule() 
  new_schedules = [] 
  for i, s in enumerate(schedules): 
    start = request.forms.get(f"start{i}") 
    end = request.forms.get(f"end{i}") 
    #title = request.forms.get(f"title{i}") 
     title = request.forms.get(f"title{i}").encode('latin1').decode('utf-8')
 いったん、latin1だったものをutf-8にデコードするという、二段構えで解決。bottleのバージョンが古くなってきたから?

2026年2月22日日曜日

raspiでPCのタイマー起動2

複数の予約できるようにアップデートしてみた。(一部<textarea>タグを半角にする必要あり) 
・複数にすることで、複雑度が増して解決が難しかった。そこで、タイマーにしても、タッチセンサーにしても、統一したflagを使うことにして、単純化したらうまくいった。flagがon->offになる場合は、pingでPCをチェックしoffならそのまま、onならoffにするためのHigh信号triggerとし、flagがoff->onになる場合は、pingによりPCチェックをして、onならそのまま、offならonにするためのHigh信号triggerとする。
・offにするためのHigh信号triggerは、長めの1秒にしてやる必要があった。
・曜日による繰り返し設定もできるようにした。(2026/3/5)