オーディオアンプ用USB Type-C PowerDelivery 電源基板の製作 その2

ロードスイッチ回路

概要

LDR6321(USB-PDシンクコントローラIC)のデータシートに記載されている回路のように、VBUSの電圧をVbusEN信号でコントロールする。

ロードスイッチについては、以下のサイトが分かりやすいです。

ロードスイッチとは、負荷(モータ、AV機器、ポータブル機器等)に電力を供給するラインに対して、ON/OFFを行うスイッチのことです。

という説明の通り、今回の負荷であるオーディオアンプ基板への電力供給をいい感じに制御するのがロードスイッチです。例えば、スピーカーに有害な直流電圧が発生した際に、ロードスイッチをOFFにすることで電源を遮断したりすることができます。

回路図

回路図をLTspiceで作成した。FDS4885C_PはPchパワーMOSFET(しきい値-2V), AO6408はNchMOSFET(しきい値1V)。PchMOSFETはオン抵抗が低い方が負荷安定度が高くなるが、特に性能を追求しなければ何を使っても動くはず。

全体のタイミングチャート

入力信号の説明と、タイミングの仮定は以下の通り。

  • V(BUS)
    • Type-C Power Deliveryからの20V
    • 0.5sで起動, 1sで20Vになるとする
  • V(busEN)
    • LDR6321の出力信号で、V(BUS)が起動して暫くすると立ち上がる
    • 0.75sで立ち上がり、6.75sで立ち下がるとする
  • V(Shutdown)
    • この電源基板の外部から入力される遮断信号
    • 例えば、最終的な負荷であるスピーカーに有害な直流電圧がかかったときに、自動的に電源を遮断することができる。
    • 3sで立ち上がり、4sで立ち下がるとする

LTspice上でシミュレーションを行った際の動作波形はこんな感じ。

回路ブロックの説明

ロードスイッチ部

Type-CケーブルからV(BUS)=20Vが供給される。BUSノードはSBDを介してBack To Back接続された2つのPchMOSFET(M1, M2)に接続されている。Back To Back接続により、電源を遮断した際に、負荷に接続されたコンデンサの逆流を防ぐ効果がある。ゲート・ソース間のコンデンサは、V(GS)を緩やかに立ち上げることで、誤動作防止と突入電流防止の効果がある(らしい)。負荷は適当に100Ω。LM7805はロジック駆動用電源を生成する5Vの三端子レギュレータ。

  • V(bus) :Type-C Power Deliveryからの20V
  • V(G,S) :PchMOSFET(M1, M2)のゲート・ソース間電圧
  • V(out) :負荷への出力電圧

ゲートドライバ部

  • PchMOSFETのゲートを駆動する回路。NchMOSFET(M3)がターン・オンすると、R1とR2で分圧されるので、PchMOSFETのゲート電圧は10V になる。つまり、ゲート・ソース間は V(G,S)=V(G)-V(S)=10V-20V=-10V となり、PchMOSFET(M1, M2)がターン・オンする。しきい値よりもさらにV(G, S)を低くしているのは、オン抵抗を小さくするため。
  • NchMOSFET(M3)のゲート電圧はANDゲート(A1)によって生成される。ANDゲートは入力にV(Delay)とV(\overline{\text{Shutdown}})がある。なお、上付きの線は反転された信号を表す。
  • ANDゲートの入力信号のそれぞれの状態を確認するためのLEDがあると、オシロスコープで確認する必要がなくなって楽だと思います。
  • 厳密には、ANDゲートの電源は5Vの三端子レギュレータから供給されるため、V(BUS)起動直後は5Vよりも低い電圧になっている。シミュレーション上ではVhigh=5と指定しているため、常に5Vが供給されている。

遅延回路により、V(busEN)がONになってから0.9s秒後に出力がONになっている。また、遮断信号(Shutdown)が入力されると、一時的に出力が遮断される。

  • V(Delay) :V(busEN)がRC積分回路で遅延された信号
  • V(\overline{\text{Shutdown}}) :外部から入力された遮断信号(反転)
  • V(and) :Delayと\overline{\text{Shutdown}}論理積
  • V(out) :負荷への出力電圧

遅延回路

VbusENは, Vbusが5Vになってしばらくすると立ち上がる。R4, C2の積(時定数)により立ち上がり時間が決まり、R5, C2の積(時定数)により立下り時間が決まる。C2にノイズが乗るとANDゲートの出力がチャタリングのようにLowになったりHighになったりしてしまうので、シュミットトリガ入力のANDゲートを使うか、もしくはシュミットトリガ・バッファをかませる。

立ち上がり時は典型的な積分波形になっている。立ち下がり時はダイオードによりコンデンサ電荷が引き抜かれるので殆ど遅延がない。R5(1kΩ)はダイオードの過電流を制限している。

  • V(busEN) :LDR6321の出力信号で、V(BUS)が起動して暫くすると立ち上がる
  • V(delay) :V(busEN)がRC積分回路で遅延された信号

遮断信号の外部入力回路

出力の遮断信号(Shutdown)を外部から入力できるようにしている。フォトカプラで絶縁しているので、GND同士が接続されていない別の基板から遮断信号を受け取り、出力を遮断することができる。フォトカプラの2次側はコレクタ出力なので、出力が反転(\overline{\text{Shutdown}})する。

遮断されてOFFになったV(out)が再度ONになるまでの復帰時間を十分長く取る必要がある。何故かというと、遮断信号の要因が取り除かれていない状態で復帰すると、遮断->復帰->遮断が短い周期でループしてしまうため。CR積分回路や555タイマーなどを使えば簡単に実現できる。フリップフロップを使えば、一度遮断信号が入力されたら、電源を入れ直して再起動するまで復帰しない、という機能も実現できる......はず。

Shutdown信号が入力されたら、出力電圧が遮断するようになっている。

  • V(Shutdown) :外部から入力された遮断信号
  • V(\overline{\text{Shutdown}}) :外部から入力された遮断信号(反転)
  • V(out) :負荷への出力電圧

実測波形

ブレッドボードで組んで測定してみた。オシロスコープおよび信号発生器はAnalog Discovery 3を使った。オシロスコープ2CHしかないので、V(BUS)を1/5程度に分圧した電圧でトリガをかけた。負荷はLEDのみ。

使用した素子

  • ANDゲート :74HC08AP
  • PchMOSFET :2SJ334
  • NchMOSFET :2N7000

Shutdown信号の生成方法

前述の通り、V(BUS)を分圧した電圧でトリガをかけているので、V(BUS)が入力されてから3秒後にAnalog Discovery 3のAWG1から1秒間パルスをONにしている。

測定結果

Analog Discovery 3で測定した結果もだいたい同じ波形になった。特に変化があったのは、以下の写真に示す黄色の波形V(OUT)が、起動直後に若干(およそ2V)ぴょこっとなっていることだけ。これは......何が原因なんだろう?

おまけ

Excelのグラフで描画した実測波形を示す。実際には測定を5回行った結果を同じ時間軸に描画しているだけなので、厳密にはそれぞれの信号のトリガのタイミングは若干ズレています。

  • ゲートドライブ動作

    ゲート・ソース間電圧はゲート電圧とソース電圧をそれぞれ測定して差を取りました。

  • ANDゲートの入出力
  • 遅延回路
  • 遮断信号の反転

オーディオアンプ用USB Type-C PowerDelivery 電源基板の製作 その1

USB-PDを利用した電源回路

トランジスタ技術2023年6月号p57~60「秋月に新登場!USB PDチップ LDR6321試用レポート」を参考に製作を行う(現在設計中...)。

概要

USB-Power Deliveryを使ったアプリケーションが作りたかったので、約1年前に製作したオーディオアンプを設計し直すことに。PDシンクコントローラ LDR6321はUSB PD 20Vに対応しているので、レールスプリッタを使って(仮想的に)±10Vを生成する。今回は、回路図記号(シンボル)の用意と、部品レイアウト用のフットプリントの用意、回路図入力を行いました。

リニア電源も9V乾電池も使わないですが、まあ何とかなるでしょ(希望的観測)

↓簡易的な動作確認をしています。

具体的な要件としては(ボトムアップ開発なのでまだ確定じゃないけど)

  • 単電源 20Vを仮想的に±10Vに
  • 電源基板とオーディオアンプ基板は分けたい(電源回路として汎用性を持たせるため)
  • 過電流保護を付ける(1.1Aポリスイッチで対応)
    • 定格1.1Aなら20Wなので、相当な負荷や熱暴走がない限り大丈夫なはず…
  • 可能な限り基板サイズを小さくする。スリムなケースに収めたい

悩み中

  • 電源回路とレールスプリッタ回路を別々の基板にするかどうか
  • 電源回路にロードスイッチ回路を付けたい
    • 電源電圧が20Vになってから負荷(ロード)への出力を開始する回路
    • LDR6321のVbusEN信号を利用する
  • スピーカー保護回路を付けたい
    1. スピーカーへの出力に(スピーカーを破損させる恐れがある)直流電圧を検出
    2. ロードスイッチをオフにして負荷への出力を遮断
  • 保護回路の構成と信号を流すコネクタの配線

シンボル作成

LDR6321のシンボル作成

シンボル作成の方法は、大きく分けて2パターンある。

  1. 実際のパッケージと同じピン配置にする

  2. 役割毎にピン配置をまとめる(アナログ, デジタルや入力, 出力, 電源などの分離)

今回は、とりあえず 1. の方針でシンボル作成を行う。USB type-C PDコントローラ LDR6321のデータシートを参考にKiCad用のシンボルを作成する。

シンボルエディタを開き、新規ライブラリAkidukidenshi.kicad_symを作成した。 そして、新規シンボルとして、LDR6321を作成。 最初に、グリッドを1.27 or 2.54mmにしておくと位置調整しやすいです。

ピンテーブルを使ってピンを配置する(使うのは今回が初めて)。

とりあえず入力したところ。ピン番号と名前の対応を間違えると悲惨なので必ず確認する。 電源入力だけエレクトリカルタイプを指定した。USB PD のネゴシエーションに関係するピンの入出力の関係がいまいちわかっていないので、とりあえず全部エレクトリカルタイプを入力にしておきます。VbusENは出力に変更しました。

こうなる。16~9番の位置を調整する。

その後、ピンの向きを左右反転し、矩形を描いて塗りつぶしたら完成。

シンボルの名前はシンボルのプロパティから設定する。

ついでに、フットプリントを紐づけておく。シンボルのプロパティを開き、フットプリントを選択する。データシートに寸法が記載されている。E=4.4mm, D=5mm, e=0.65mmだった。

16ピンSSOPパッケージで検索し、寸法が一致するものを選択。

NJM78LxxUAのシンボル作成

5Vのレギュレータ。USB-PDの20Vを5Vに降圧する。 最大消費電力が350mWなので、供給できる電流は、350mW/(20V-5V)=23mA以下(多分)。LDR6321とLEDだけなら、全然問題ないはず。

SOT-89パッケージのピン配置

KiCadの標準ライブラリ(?)に3端子レギュレータがあるので、これで代用しても多分大丈夫です。

後から気づきましたが、シンボルを右クリックして名前を付けてコピーを保存を選択ことで、Regulator_Linearライブラリのシンボルを自分のライブラリにコピーできます。ピン配置さえ正しければ、こちらの方が楽ですね…

自作したシンボルですが、見た目は全く同じです。

フットプリントは、SOT-89-3_Handsolderingとした。

シンボル作成に関する参考資料

途中経過

USB type-cからPD給電する回路はおおむね完了

残りのタスク

  • VBUS出力用のコネクタ(XHコネクタ(3Amax), DCジャックを使う予定)
  • 電解コンデンサが未記載
  • ヒューズの選定
  • ロードスイッチ回路を付けたい(LDR6321のVbusEN信号を利用する)

ポリスイッチのモデルデータを登録

モデルの入手

基板製作が久しぶりすぎて記憶が怪しいですが…モデルデータ入手~KiCadへの登録をやります。

Mouserのサイトからリセッタブルヒューズ(MF-RX110, 定格1.1A)のフットプリントおよび3DCADモデルをダウンロードする。ダウンロードする際にユーザー名とパスワードを要求されるが、これは、COMPONENT SEARCH ENGINEに登録する必要がある(分かりにくい)。ユーザー名はメールアドレスを入力する。

3Dモデル, フットプリント, シンボルの登録

ダウンロードしたら展開。フォルダ 3D, KiCadに必要なデータがある。

これらのファイルを KiCadのライブラリに移動させる。自分の場合のファイル名とパスを示す。

ファイル名 移動先(KiCad/8.0/)
3Dモデル MF-RX110_72-2.stp 3dmodels/MyModels/fuse
シンボル MF-RX110_72-2.kicad_sym symbols/MyLib
フットプリント MFRX110722.kicad_mod footprints/Myfoot.pretty

移動出来たら自分のライブラリにシンボルを登録する。AkidukidenshiライブラリにシンボルMF-RX110_72-2.kicad_symをインポートする。

インポートできた。

シンボルプロパティから先ほどダウンロードしたフットプリント(MFRX110722.kicad_mod)を指定する。

つぎは、フットプリントエディタを開き、フットプリントのプロパティ/3Dモデルを選択する。

プレビュー画面で位置合わせしたら登録完了!

とりあえず大きさを確認…ポリスイッチがでかすぎんだろ(高さ16mm)

まだ電解コンデンサを実装していないので、多分大丈夫かな?

最近表面実装部品を使えるようになったので、基板サイズがかなり圧縮できそうです。

初めてのオーディオアンプシミュレーションと自作基板【LTspice】

電力増幅回路

概要

「定本 トランジスタ回路の設計」第4章 ミニパワー・アンプの設計を参考に、0.5W出力のオーディオアンプを作る。

具体的な回路定数の決め方や回路の評価など、めちゃくちゃ丁寧に解説されている本です。おすすめ。

設計仕様

  • 電圧利得 10倍(20dB)程度
  • 出力電力 0.5W以上(8Ω負荷)
  • 出力電圧  V_{out}=\sqrt{0.5\ \text W×8\ \text Ω}=2\ \text{Vrms}
  • 周波数特性 20~20kHz
  • ひずみ率 1%以下

    回路図

  • 電圧増幅段はQ1によるエミッタ接地増幅回路&Q2によるバイアス調整回路
  • 電流増幅段はQ3,Q4によるAB級プッシュプル回路

電力増幅回路の温度安定度

温度安定度については「定本 トランジスタ回路の設計」第4章の内容から抜粋し、要約した。

  • 電圧増幅回路(エミッタ接地など)に流れる電流は小さいので、ほとんど発熱はない。
  • 電流増幅回路(エミッタフォロワなど)は比較的大きな電流が流れるので、発熱が大きい。

この発熱によって、設計次第ではトランジスタが熱暴走してしまうことがある。

図(a)の回路はB級プッシュプル回路で、アイドリング(バイアス)電流が流れないが、波形の歪みがある。

図(b)の回路はAB級プッシュプル回路で、クロスオーバー歪みを解消するためにダイオードを挿入している。流す電流が小さければ問題ないが、大電流を流したときにトランジスタが発熱すると、トランジスタのベース・エミッタ間電圧  V_{BE}は負の温度係数を持つので、小さくなる。(具体的には、40℃上昇すると約0.1V低下する) すると、ダイオードの順方向電圧  V_F \simeq V_{BE} の均衡が崩れ、 V_F>V_{BE} となるので、ベース電圧が増加し、コレクタのアイドリング電流が増加する。電流が増加するとさらにトランジスタの温度が上がる。これがトランジスタの熱暴走のメカニズムらしい。

図(c)のようにエミッタ抵抗をつけると、電流制限はできるものの、出力インピーダンスが大きくなるので、出力電圧が低下する。したがって、スピーカーのような低インピーダンス負荷は駆動できなくなる。

そこで、上のようにTr1をTr2とTr3のベース間バイアスとして使う。この回路では、3つのトランジスタ Tr1,Tr2,Tr3をヒートシンクで熱結合する。熱結合すると、3つのトランジスタの温度は殆ど等しくなる。つまり、温度特性が同じトランジスタなら、 V_{BE} が等しくなる。Tr1のCE間電圧( V_{CE} )は、BE間電圧に比例し、 V_{CE}=\frac{R_A+R_B}{R_B}V_{BE1} となる。したがって、 V_{CE} V_{BE1} に比例して温度変化する。  R_A を可変抵抗として調整することで、 V_{CE}\simeq V_{BE2}+V_{BE3} にできる。実際には、クロスオーバー歪みを解消するために、 V_{CE}\gt V_{BE2}+V_{BE3} として、Tr2,Tr3にコレクタバイアス(アイドリング)電流を10mA程度流す。したがって、信号入力がないときのTr2,Tr3の消費電力はおよそ15V×10mA=150mW。

熱結合の図

ヒートシンクには秋月電子17PB046-01025(46×25×17mm)を使い、放熱用シリコン接着剤 HY-910で接着した。

シミュレーション

オーディオ・アナライザとか持ってないので、LTspiceで補完。有名なフリーの回路シミュレーター。

入出力波形

.measコマンドで入出力電圧のPeak to Peak値と電圧増幅率 Avを調べてみる。

.meas tran vipp PP v(in)
.meas tran vipp PP v(out)
.meas tran Av AVG v(out)/v(in)

Error Logに出力された結果はこんな感じ(デフォルトだと t=27℃) 設計通り-9.76倍≒-10倍(=20dB)で増幅されている。

電圧増幅率の周波数特性

電圧増幅率 Av=Vout/Vin は、低周波では結合コンデンサと入出力インピーダンス、高周波ではトランジスタの寄生容量・等価抵抗によって利得が下がる。 このグラフは、.ac解析で概算できる。(.ac dec 50 1 10Meg)

結果はこんな感じ。 実線が5本あるが、これは温度ごとの利得の周波数特性。破線の方は位相差の周波数特性になっている。 温度解析を行うには、.tempコマンドを使い、.temp 20 30 40 50 60のように温度のリストを記述する。

なんだか過渡解析のときの(20dB)と比べて利得が下がっているが、これはLTspice側の問題らしい。過渡解析側の入力信号を小さくすると、周波数解析と一致する。

以下の動画で詳しく説明されていた。 【伝スパ】LTSpice TRAN解析とAC解析を比較する その1 - YouTube

温度が上がると利得が増える傾向がある。(周波数=1kHzで比較)

FFT(高速フーリエ変換)

増幅回路では、入力信号の周波数のn倍(n=1, 2, ...)の周波数を持つ波形が、出力側には現れる。n=1のものを基本波といい、それ以外(n≠2)をn次高調波という。もちろん出力したい波形は基本波だけで、高調波は出力信号が歪む原因となる。

出力信号に高調波成分がどれだけ含まれているかを調べるには、V(out)をフーリエ変換すれば分かる。LTspiceでは、過渡解析のデータをもとにFFTを計算してくれる。横軸が周波数で、縦軸は周波数成分をdBに変換した、振幅スペクトルである。確かに基本周波数のn倍の周波数成分が1kHzごとに現れている。

THD(歪み率)

出力波形の歪み率をTHD(Total Harmonic Distortion)といい、次の式で定義される。

 \displaystyle
THD=\frac{\sqrt{\sum_{i\ne1} V_i^2}}{V_1}×100 \ [\% ]

ただし、 V_i i 次高調波の実効値である。

LTspiceには、歪み率を計算してくれる.fourコマンドがある。やり方は【LTspice】フーリエ変換を実行する『.fourコマンド』の使い方 - Electrical Informationを参考にした。

  1. .tranで2msの過渡解析をする。

  2. .optionsで3つの変数を指定する。

    • maxstep...2ms/10000程度の刻み幅で解析する
    • plotwinsize=0...データ圧縮をしない
    • numdgt=7...倍精度で計算する
  3. .four 基本周波数 調べたい信号でフーリエ解析をする。

.tran 2m
.options maxstep=0.2u plotwinsize=0 numdgt=7
.four 1k V(out)

9次高調波までの歪み率(PHD)が2.05%, n次高調波までの歪み率(THD)が2.07%となった。参考元の「定本 トランジスタ回路の設計」p108の図11で、出力電圧3Vのとき歪み率が2%になっているので、大体合ってそう。

実際の動作

実験装置の外観

おもちゃみたいな実験装置(笑)だが、動作確認には最低限使える。

  • 赤い基板:信号発生器 KKHMF XR2206 (Vpp=0.58,1kHz)
  • 緑の基盤:パワー・アンプ
  • 右手前:オシロスコープ DSO-TC3
  • 右奥:安定化電源 DP100

入出力波形

入力波形はVpp=0.58V, f=992Hz

出力波形はVpp=5.94V, f=992Hz

したがって、利得は5.94/0.58=10.2倍(=20dB)になっている! 波形の歪みも目視では全く分からない。

基板の製作

初めての基盤製作なので、インストールが不要で、KiCadよりも比較的簡単なeasyEDAを使って基盤を製作し、JLCPCBで発注した。中国からの輸送なのにクーポン込みで500円。滅茶苦茶安い…配送は一番安いOCS NEPで1週間程度でした。(2SC1815のフットプリントを何故か間違えてたので、代わりに手元にあった2N3904を使ったり、ヒートシンク用固定穴の銅箔が薄くてはんだが乗りにくかったりしましたが…動いたのでAll OKです) 電源ラインはベタ塗りするとか…詳しいことは知らん

3DViewで概観を確認できる。真ん中の空いている部分にヒートシンクを配置して、トランジスタを熱結合&排熱する。

実際の基盤

回路の末端は何も考えずピンソケットにしたけど、もっといい方法がある気がする…

終わりに

自作基板を作るのは初めてだったので、まったく動作しないゴミが送られてこないか不安でしたが、ちゃんと動きました。歪み率が小さいので、普通のスピーカーと同じくらい音がいいです。まあ賃貸なので大音量で比較はできませんが…

アナログ回路のうまみは結構感じれたので、次は電源回路とかデジタル回路を作ってみたいですね~

Googleカレンダーに時間割を登録するGUIアプリを作った

概要

講義の予定をGoogleカレンダーに自動的に追加するようなGUIアプリケーションを作りたい!

(半年ぐらい前に書いたプログラムの修正版といったところ…)

すでにひな型があったのでCUIからGUIにするのに1日ぐらいで終わった。

具体的なプログラムのイメージ

検索

検索キーは講義番号とする。

スクレイピングシラバスから講義情報を取得してうまく表示させたい。

予定データの入出力

登録する講義情報をGUIに入力し、Googleカレンダーの予定データの形式に変換したい。

予定データの登録

入力された予定データをGoogleカレンダーに登録する。隔週ごとに登録できるとなお良い。

予定データの削除

現在登録されている予定を削除する機能。登録するより難しい気がする… ->うまく実装できる気がしない…

曜日振替

(たまに曜日振替がある…)けど気にしない

マニュアル登録

保留その2

完成したものがこちら

予定を追加したい講義の講義番号から検索をする。 Googleカレンダーに予定を追加ボタンを押すと、表示されている時刻に予定が追加される。一度に予定が一気に登録されるので、間違えると消すのはかなり面倒くさいので注意 ちゃんと予定が追加されると、こんな感じに表示される。

結構便利そう。.exeファイルにしたので、Githubからダウンロードして以下の設定をすれば誰でも使えるはずです。(Microsoft Defenderにはじかれる可能性もありそう)

github.com

zipファイルでダウンロードするのが楽だと思います。

GASの認証について

サービスアカウントと呼ばれるアカウントを発行してGoogleカレンダーにアクセスできるようにすれば、このプログラムが機能するようになります。サービスアカウントにまつわる認証情報は機密情報なので、ネットなどに公開するのはNGです。自己責任でよろしくお願いします。

サービスアカウントを使って認証する

認証ファイルを作成する手順は以下のサイトを参考にした。

Google Cloud Platform の鍵ファイルの作成 - IBM Documentation

Google Cloud プラットフォーム

Googleクラウドにアクセスする。

プロジェクトの選択->新しいプロジェクトをクリック

適当なプロジェクト名をつけてプロジェクトを作成

初めの画面に戻る。IAMと管理をクリック。

サービスアカウントをクリック。

サービスアカウントを作成をクリック。

適当に名前を付けて作成。

鍵を管理をクリック。

ファイル名をcredentials.jsonとして保存する。

もう一度初めの画面へ戻る。APIとサービスをクリックし、画面が遷移したら、APIとサービスを有効にするをクリック。

APIの検索画面からカレンダーを検索。

Google Calendar APIを有効化する。

今度はGoogleカレンダーを開く。

Google カレンダーを共有するには?公開範囲の制限や詳細の非表示・権限付与方法を紹介|ヨシヅミ-吉積情報株式会社|Google 認定プレミアパートナーより画像を引用

ユーザーを追加するを押し、「予定の変更」権限で、作成したサービスアカウントを登録する。

あと、タイムゾーンがずれている場合は日本標準時に変更してください。

認証ファイルを所定の位置に移動する

全体のファイル構成はこんな感じ

MySyllabus
├── Pipfile //ライブラリ管理
├── Pipfile.lock
├── README.md
├── config //学期と時限の設定ファイル
│   ├── period.csv
│   └── semester.csv
├── env //ユーザー設定フォルダ
│   ├── .env //メールアドレス
│   └── credentials.json //認証ファイル
└── src
    ├── MySyllabus.exe //実行ファイル
    ├── MySyllabus.ipynb
    ├── MySyllabus.py //ソースコード
    ├── MySyllabus.spec
    └── build

設定の必要があるのはsemester.csv, .env, credentials.jsonの3つだけ。

credentials.jsonはサービスアカウントを作成したときにダウンロードしたファイルで、envディレクトリの直下に保存する。

.envファイルには、Googleカレンダーと紐づいているメールアドレスを入力する必要がある。

semester.csvは学期の開始日と終了日が入力されているだけ。年に一回更新すればOK。

学期,開始,終了
1,2024/4/8,2024/6/6
2,2024/6/7,2024/8/5
3,2024/10/1,2024/11/28
4,2024/11/29,2024/2/7

デジタル時計とライブラリの自作【Arduino IDE】

DS1307(リアルタイムクロックモジュール)のクラスを自作して、温度表示機能付きのデジタル時計を作った。 調べた感じすでにライブラリが存在するらしい。

GitHub - makerhero/DS1307: Biblioteca DS1307 - Arduino

このライブラリは使わずにライブラリを自作する。

自分でクラスを作れば、必要最低限の機能が実装できる。

それから最近C++を勉強したので自分でクラスを作ってみたいという理由。

とりあえず単体で(自作ライブラリなしで)動くスケッチを作った。

github.com

Arduino IDEでライブラリを自作するには?

参考:

Arduino IDEの使い方(ライブラリの自作編) - NOBのArduino日記!

Arduinoの自作ライブラリを作成するには? – StupidDog's blog

Arduino用ライブラリを書く

今回作るライブラリ名はDS1307Libとする。

このライブラリはGithubにアップロードした。

github.com

  1. クラスをヘッダファイルに記述

    場所は~/Documents/Arduino/libraries/DS1307Lib

    ファイル名はDS1307Lib.h

  2. メンバ関数の定義をソースファイルに記述

    場所は~/Documents/Arduino/libraries/DS1307Lib

  3. 新たに定義した型や関数をハイライトするためのファイルを用意

    場所は~/Documents/Arduino/libraries/DS1307Lib

    ファイル名はkeywords.txt

  4. ライブラリを利用する

    自作したライブラリは、通常のライブラリと同じように、

    #include <DS1307Lib>で使えるようになる。

    なお、使用したOLEDはSSD1306

時刻と温度をOLEDに表示

DS1307のライブラリDS1307Lib.hとADT7410のライブラリADT7410Lib.hを自作して、SSD1306というOLEDディスプレイに表示するプログラムを作成した。あと、今更気づいたけどLCDは液晶のことでOLEDとは全然別物でした。修正が面倒なので放置...

github.com

左からDS1307,ADT7410,SSD1306

(I2Cアドレス0x68,0x48,0x3c)

詳細はそれぞれ別の記事にメモした。

DS1307のメモ - よもつひらさか

ADT7410のメモ - よもつひらさか

SSD1306のメモ - よもつひらさか

画面構成はshowDataLCD()内を変更すれば変えられる。 デジタル時計っぽく表示してみた

すべてI2Cなので回路構成はシンプル…かと思いきやDS1307が5Vじゃないと駆動しないので3.3Vを電源に使うには昇圧回路 or I2Cバスレベル変換が必要らしい。

昇圧回路の場合は3.3Vだけで駆動する。I2Cバスレベル変換の場合、3.3Vと5Vの両方必要。

モジュール 価格
3.3Vマイコン 1000
DS1307 560
ADT7140 600
5V昇圧コンバーター 300
SSD1306 500
2960

3000円の時計は高いだろ…マイコンが高い

PICを使えば回路も小型化できて安くもなるだろうけど

Arduinoのライブラリが使えないと現状厳しそう(能力的に)

PICのお勉強をするべきなんでしょうか…

DS1307のメモ

I2C RTCモジュール DS1307

秋月電子で購入

AE-DS1307 I2C RTCモジュール

モジュールのマニュアル

接続

SCL,SDAのプルアップ抵抗は内蔵されているので不要。

電源は5Vのみ。3.3Vでは動かない。

RTCモジュールで日時を表示するスケッチ

Arduino RTC DS1307のブログのコードをコピペして動かしてみた。

github.com

このコードを参考にしてDS1307の自作ライブラリを作成した。詳細は別の記事を参照。

yomaityan.hatenablog.com

ADT7410のメモ

ADT7410は16bit/13bitのI2C温度センサ。

16bitモード マスタリングWireライブラリ その7 温度センサADT7410 リピーテッド・スタート・コンディション - Arduinoクックブック

13bitモード Arduino と ADT7410とI2C通信で温度測定 | 計測ブログ Measurement Blog を参考にした。

とりあえずクラス部分(のちに自作ライブラリとなる部分)を作って単体で動くプログラムを作成する

#include <Wire.h>
class ADT7410{
  private:
    const uint8_t ADT7410_address=0x48; //ADT7410のI2Cアドレス
    const uint8_t Configuration_register = 0x03 ; //設定レジスタのアドレス
    int mode; //16bitモードか13bitモードかを指定する整数
    float temperature; //変換後の温度データ
  public:
    //コンストラクタ
    ADT7410(int Mode=16); //Mode=13 or 16を指定 デフォルトは16
    float getTempData();
    float convTempData(int tempSign);
    void showTempDataSerial(){Serial.println(temperature,2);}
};

ADT7410::ADT7410(int Mode){
  /*ADT7410のコンストラクタです*/
  Wire.beginTransmission(ADT7410_address); //ADT7410とI2C通信を開始
  mode=Mode;
  if(mode==16||mode==13){
    Wire.write(Configuration_register); //設定レジスタに書き込みを指示
    Wire.write(0x80); //設定レジスタに0x80を書き込み=>16bitモードへ
    delay(240); //設定が有効になるまで待機
  }
  else{
    Serial.println("エラー:");
    Serial.println("無効なモードが指定されました");
    Serial.println("ADT7410のコンストラクタの引数には13か16を指定してください");
  }
  Wire.endTransmission();
}

float ADT7410::getTempData(){
  /*ADT7410から16bitまたは13bitのデータを受信し、温度(℃)を返します*/ 
  Wire.requestFrom((uint8_t)ADT7410_address, (uint8_t)2); //ADT7410から2byteデータを受信
  int tempSign = (Wire.read()<<8) | Wire.read() ; //2byteを結合し16bitの温度データとして取得
  if(mode==16){
    return convTempData(tempSign);
  }
  else if(mode==13){
    tempSign=tempSign>>3; //13bit化
    return convTempData(tempSign);
  }
  else return (float) -1;
}

float ADT7410::convTempData(int tempSign){
  /*ADT7410から取得したデータを浮動小数表示に変換します*/ 
  if(mode==16){
    int temp = tempSign & 0x7fff; //符号ビットを除去
    if (tempSign & 0x8000 ) temp = -( (~temp & 0x7fff) +1); //温度が負の場合、2の補数をとる
    return temperature = temp * 0.0078 ; //128で割って0.0078℃/LSBの変換を行う
  }
  else if(mode==13){ 
    int temp = (tempSign & 0x1000) ? (tempSign - 0x2000) : tempSign; //符号判定した値を返す
    return temperature = temp * 0.0625; //16で割って0.0625℃/LSBの変換を行う
  }
  else return (float) -1;
}

void setup() {
    Wire.begin();
    Serial.begin(9600);
}
 
void loop() {
  //コンストラクタを作成
  static ADT7410 adt7410;
  //温度データを取得
  float temp=adt7410.getTempData();
  //温度データをシリアルモニタに表示
  adt7410.showTempDataSerial();
  delay(1000);
}

github.com

自作クラスを作成

場所はC:\Users\ユーザー名\Documents\Arduino\libraries\ADT7410Lib\ADT7410Lib.h

いい感じに表示できるようになった。

自作クラスを作成する手順は別の記事で説明する。

yomaityan.hatenablog.com