俺言語。

自分にしか理解できない言語で書かれた備忘録

【Switchbot】温湿度計 プローブタイプの温度センサ接続

下記のページを参考にさせていただき、Switch botの温湿度系をプローブタイプの温度センサに換装。
boule.tech

センサは下記のSHT40を使った防水センサを使用、温湿度系についている温度センサ部をカットして、もともと存在するI2C用のスルーホールにプローブタイプのセンサから出ている配線を接続。これのみで無事動作した。

Temperature sensor with SHT40
Pin assignment

水槽に水没させて使っているので耐久性が心配だが、2週間ほど経過した現在でも無事動作中。他の水温計と比べると20℃環境で差は多くて±1℃程度。

【Arduino】Leonardo/Micro をbootloaderの書き込み機にする方法

Leonardo/Microをbootloaderの書き込み機にする方法が意外にwebに情報がなかったので覚書。

Arduino IDEが1.8.8だとprogrammers.txtへの追加は必要なかった(arduinoasisp.protocolがすでにarduinoだった)が、2.3.6だと変更が必要

あとは,書き込み側のpin10を書き込みターゲットのリセット端子につなぐ必要がある。これは書き込み機に書き込むArduinoISPのスケッチにそのピンの定義があるので変更が可能かも。

ArduinoISP.ino


下記を参考にさせてもらいました。
hex.ro

python consoleでmatplotlibのグラフが表示されない

Python console上でplt.figure()等を実行しようとすると、グラフのウィンドウは表示されるものの、グラフは表示されず、下記のエラーが出る。
スクリプトから実行するとグラフは問題なく表示される。

Failed to enable GUI event loop integration for 'qt'

ImportError: 
    Could not load requested Qt binding. Please ensure that
    PyQt4 >= 4.7 or PySide >= 1.0.3 is available,
    and only one is imported per session.
    Currently-imported Qt library:   'pyqt6'
    PyQt4 installed:                 False
    PyQt5 installed:                 False
    PyQt6 installed:                 False
    PySide >= 1.0.3 installed:       False
    Tried to load:                   ['pyqt6']

matplotlibrc内のbackendがデフォルトでAggになっているところをQt5Aggかほかのものに変えると解決。

【Arduino】【MCP_CAN】Seeed CAN BUS Sheild 古いライブラリ

最新のSeeed MCP CAN Shield (MCP2515) のライブラリを導入したところ下記のエラーが発生。

cannot declare variable 'CAN' to be of abstract type 'MCP_CAN'

調べたところライブラリが大きくアップデートされているようで、インポートする側のプログラムもその変更に応じた修正が必要とのこと。
https://github.com/Seeed-Studio/Seeed_Arduino_CAN/issues/106

プログラムの変更をしたくない場合は下記から古いライブラリが入手可能。
https://github.com/Seeed-Studio/Seeed_Arduino_CAN/tree/old

【wxPython】長いTextCtrlの中身の末尾を表示する方法

ファイルのパスなどを短いTextCtrlに表示する時など、ファイル名が表示されるように右揃え?にしたい場合。下記のようにTextCtrlのstyleで右揃えを指定しますが、TextCtrlを操作した後などに無効になっていることがある。

この場合はTextCtrl内のテキストを全選択することで右揃えを再度有効にすることが出来る。

m_textCtrl.SetSelection(-2, -1)

畳み込み積分の確認

畳み込み積分がいまいちイメージしづらかったので実際にプログラムを書いて確認してみた。

畳み込み積分の式


伝達関数

1自由度振動系にt=0でインパルス入力した応答を伝達関数として使う。
インパルス入力は周波数領域で全周波数で大きさ1のスペクトルを持つので、インパルス応答の周波数スペクトルがそのまま伝達関数となる性質を使う。
減衰しながら振動が収束する系。


入力

t<1までは0で1<=tで1となるステップ入力。インパルス入力がずっと続く入力とみなせる。


出力(畳み込み積分)

畳み込み積分によって最初の図のような応答を示す系に入力を入れた際の時系列の応答が求まった。ステップ入力を入れた瞬間オーバーシュートして、振動しながら一定値に収束するのでイメージ通り。

例えばt=2.0sec時点の出力はt=2.0での入力と、t=1.0からステップ入力を入れた出力の名残りの影響を受けていて、それはt=2.0secまでの畳み込み積分で求まる。
イメージとしては入力波形の時間軸を左右ひっくり返して、応答と入力の内積をとる感じが個人的にしっくりくる。


使ったコードはこちら

dt = 0.05
time = np.arange(0, 5, dt)
m = 400  # [kg]
omega = 2 * np.pi * 1.5
zeta = 0.2
sigma = omega * zeta

# ----- 粘性1自由度振動系 インパルス入力の応答
h = np.exp(-sigma * time) * np.sin(omega * time) / (m * omega)

# ----- 0<=t<1まで0で 1<=t<=5まで1が続くステップ入力(インパルスが連続している状態)
f = np.hstack([np.zeros(int(1 /dt)), np.ones(int((5 -1 + dt) / dt))])

# ----- ステップ入力と粘性1自由度振動系の畳み込み積分
y = np.zeros(time.shape[0])
for t in range(time.shape[0]):
    for tau in range(t+1):
        y[t] = y[t] + f[tau] * h[t - tau]

# ----- グラフ化
fig, ax = plt.subplots(3, 1, gridspec_kw=dict(hspace=0.4), figsize=(5, 6))
ax[0].plot(time, h)
ax[0].set_xlabel("Time[sec]")
ax[1].plot(time, f)
ax[1].set_xlabel("Time[sec]")
ax[2].plot(time, y)
ax[2].set_xlabel("Time[sec]")

【Android】バータイプのインジケータ -> ProgressBarクラスの応用

以前書いた円形のプログレスバーで値に応じで色をグラデーションさせる方法のバータイプのプログレスバーへの応用。
oregengo.hatenablog.com


設定は全てxml側で完結できて、

Layout


Drawable


こちらを参考にさせて頂きました。
gist.github.com