チャーハンノート

チャーハンの作り方に関する覚書

データロガーの作製 (後編)

前編データロガーの作製 (前編) - チャーハンノートの続きです。
作製したデータロガーで、ゲームボーイのバッテリー寿命を測定しました。
f:id:friedrice_mushroom:20181104231016p:plain

目次

準備

ゲームボーイ本体

改造ゲームボーイというものに興味を持ったので作ってみました。初代ゲームボーイに対してバックライト化とプロサウンド化を施したものです。

カートリッジ

GB USB SMART CARD 64M
Amazon | GB USB SMART CARD 64M for GB / GBC / GBA / ゲームボーイ ・ ゲームボーイアドバンス 専用 バックアップ ツール | ゲーム ゲームボーイチップチューンを始めるために購入したカートリッジです。消費電力が激しいです。
ROMイメージはLittle Sound Djから購入しました。

バッテリー(eneloop Pro)

上記のフラッシュカートリッジは消費電力がとても激しく、アルカリ乾電池だとすぐ電池切れになって勿体無い問題がありました。そこで初代ゲームボーイLSDJを使用するのに最適な電池について調べていると、eneloopのようなニッケル水素充電池を使っている人が多いようでした。それで私も専らエネループを使用しています。
今回使用したのはeneloop Proです。これまで10回ほど充放電を繰り返しており、測定前日に満充電となったものです。

測定回路

今回測定する項目は、バッテリーの電圧とヘッドフォン出力信号の2つです。

ヘッドフォン出力の測定について

ヘッドフォン出力の信号電圧はとても小さく、Arduinoでそのまま測定することは難しいです。ただ、必ずしも音量を測定する必要はなく、信号が出ているかどうか判定できれば十分です。色々ためした結果、下記の回路を試みました。回路シミュレータはLTspiceです。
入力信号→ハイパスフィルタ→コンパレータ→ローパスフィルタの順にブロック分けされます。
f:id:friedrice_mushroom:20181104232841p:plain

入力信号部は、測定対象であるゲームボーイのヘッドフォン出力電圧が、バッテリー電圧低下により減衰していく様子を模しています。 基本周波数は1kHzのサイン波で、最初の1秒間は振幅が±10mV、さらに1秒から4.5秒にかけて、振幅が0Vになるまで減衰します。その後0.5秒間は振幅0Vのままです。

ハイパスフィルタ部は、入力信号の絶縁と、信号の中心を0Vに合わせることを目的としています。

コンパレータ部では、ハイパスフィルタの出力電圧とref電圧とを比較して、ref電圧より大きいときにUSB電源電圧(約5V)を出力します。ただしOPアンプの特性上、数V減衰しています。Arduinoで測定できる範囲であれば良しです。 ref電圧は適当ですが、今回はUSB電源電圧と100kΩ・10Ωの抵抗を組み合わせて、約0.5mVとしました。

ローパスフィルタ部では、コンパレータ部から出てきたギザギザの信号をなめらかにして、Arduinoで安定的に測定できる状態にしています。

シミュレーションを実行したときの波形が下記です。 上から入力信号、ハイパスフィルタ(とref電圧)、コンパレータ、ローパスフィルタの出力電圧です。
f:id:friedrice_mushroom:20181104233019p:plain

入力信号の振幅が10mVからある程度減衰した時点(4.0s付近)で、ローパスフィルタ出力電圧(V(a0))が低下しているので、ひとまずこれでヘッドフォン出力の信号有無は判定ができそうです。

実測

データロガーのミニブレッドボードに、上記の回路を追加して、ゲームボーイと接続した図です。
f:id:friedrice_mushroom:20181104233042p:plain

就寝前に測定セットしました。夜通し測定します。
f:id:friedrice_mushroom:20181104233105p:plain

測定データの確認

夜通し測定して、microSDカードに記録されたデータを確認します。エクセルでもいいのですが、今回はpythonで確認しました。pythonのコードは下記です。

import pandas as pd
from matplotlib.dates import DateFormatter
import matplotlib.pyplot as plt
import seaborn as sns

df = pd.read_csv("aaaa.txt",header=None) #データ読み込み
df=df.dropna(how='any') #欠損のある行を削除
df.columns = ['time','A0','A1','millis','next_time'] #列名を定義
df.time=pd.to_datetime(df.time,format='%H:%M:%S') #測定時間が文字列なのでhh:mm:ssに変換

fig,ax=plt.subplots()
ax.plot(df.time,df.A0,label="A0 : headphone_output")
ax.plot(df.time,df.A1,label="A1 : GB_battery_voltage")

ax.xaxis.set_major_formatter(DateFormatter('%H:%M')) #x軸 書式をhh:mm:ssに
plt.legend(loc="upper right") #凡例を表示

plt.title("DataLogger")
plt.xlabel("Logging_time [hh:mm]")
plt.ylabel("Voltage [V]")

# x軸の範囲を調整
time_range=["00:00:00","09:00:00"]
time_range=pd.to_datetime(time_range,format='%H:%M:%S')
plt.xlim(time_range)

sns.set() #見た目がいい感じに

出力波形が下図です。緑色がゲームボーイの電源電圧、青色がヘッドフォン出力測定回路の電圧です。 測定開始から8時間となる前に、一気に電圧が下がっています。ただ、ヘッドフォン出力は若干増加しているようにみえます。。バッテリの電圧が下がっているのにヘッドフォン出力の電圧が増加するとは考えにくいので、しきい値のところはシミュレーションどおりに行かなかったようです。
f:id:friedrice_mushroom:20181103195015p:plain

08:00前後を拡大してみます。
f:id:friedrice_mushroom:20181103195035p:plain

07:55頃からヘッドフォン出力が増加しているように見えます。意図しなかった挙動なのですが、少なくともこの時点で出力波形が変化し始めた(電源電圧低下により、音声信号に異常が生じ始めた)ことは確かです。
改造ゲームボーイeneloop ProでLSDJを使用する場合、およそ8時間ほど使用できるということがわかりました。

おわり

以上が今回、データロガーを作成してゲームボーイのバッテリ寿命を測定した結果です。
ようやく、データロガーを作った過程と測定結果について、文書化するという目標を果たすことができました。ゲームボーイ改造を初めてからというものの、こんなことばかり考えていたのでLSDJのスキルは全く身についていません。
今後、他のバッテリについても検証をする、かも、しれません。
ひとまず、ここまで読んでくださった方ありがとうございました。