2015年6月27日土曜日

[電子工作] 車載用オーディオのノイズを除去する (イレギュラーなグランドループ対策)

How to remove the ground loop noise
自動車で音楽を聴くためにウォークマンを使ってます。最近故障したので買い換えました。
そのウォークマンを車載オーディオのAUX端子につなげるために、ウォークマン専用LINEOUT端子付カーチャージャーという製品を使っています。
※WM-PORT付きのモデルにのみ使えます。
(使い始めてすぐに皮膜が裂けたのが社外品の悲しいところ)
エンジン(ACC)のオン・オフに合わせてウォークマンが再生・停止し、充電も出来る便利なアクセサリーです。
ただし自分が買った製品は大きな欠点があり、エンジンの回転数に合わせてオーディオにノイズが乗ります
グランドループという現象らしいのですが当時はそんな知識はなく電源を細工してノイズを除去しました。
そのときの方法をまとめてみました。


原因を推測する

知識が無いなりに原因について考えます。
ウォークマンにカーチャージャーをつなげてオーディオを再生すると、エンジンの回転数が上がるとノイズが大きくなりノイズ音も甲高くなります。
この現象からノイズはオルタネーター(発電機)の電圧変化か電磁波によるものと仮定しました。
一方、ウォークマンにカーチャージャーをつなげなければノイズは全く再生されません。
この現象から原因の第一候補を電圧変化に絞りました。


電子工作で電源を定電圧化してみる

自分が使っているカーチャージャーはシガーソケットから電源をとるタイプです。
シガーソケットから出力される電圧は12Vですが実際にはオルタネーターの回転数によって12Vを超えたり、時には12Vを下回ったり小刻みに変動しています。
そこで定電圧レギュレーターを使ってカーチャージャーに供給する電源を定電圧化することにしました。
定電圧レギュレーターはその名前の通り、電源を与えると一定の電圧を出力してくれる半導体です。
定電圧レギュレーターの仕様によっては抵抗・ダイオード・コンデンサなど別の電子部品が必要な場合があります。データシートで確認してください。
電子工作マガジンやエレキジャックに電子部品を取り扱ってる全国のお店が載ってるので、最寄りのお店を探して買いに行きました。


定電圧化でノイズがなくなった

定電圧レギュレーターと必要な部品を組み立てます。
電子回路の知識がない上に正しい半田付けの方法も知らないのですが売り物ではないのでよしとします。
電源の入力は自動車のACCとボディアースからとり、メス型シガーソケットに出力しました。
発光ダイオードが付いてますが通電確認用のためで必須ではありません。
組み上がったらサーキットテスターでショートしてないか調べて、乾電池で正常に動作するか確認します。
乾電池なら万が一不具合があっても大事に至らないと思います。
電源を低電圧化した結果、10Vの定電圧レギュレーターでノイズの除去ができました。
ちなみに5Vの定電圧レギュレーターでも除去できたのですが、ウォークマンが充電されませんでした。


グランドループ対策はアイソレーショントランスを使うのが一般的

上の方でも書きましたが、ノイズの本当の原因はグランドループだったようです。
グランドループ対策にはアイソレーション(絶縁)トランスを使うのが一般的のようです。
ただ、ステレオの場合は1個数百円のアイソレーショントランスが二つ必要のようで、結果的に定電圧レギュレーターの方が安上がりでした。
とはいえ電源の細工はショートや感電のおそれがあるのでアイソレーショントランスの方が安全です。

ウォークマンに限らずiPodや携帯型メディアプレイヤーを車載してグランドループノイズが発生したら同じ方法で除去できると思います。


関連ブログ

[エンスー] アクセルを踏んだ分だけの加速をしない(エンジンの息継ぎ・プラグのくすぶり)
[エンスー] 自動車の点火プラグ交換エンスー
[エンスー] ガソリンエンジンのオイル交換
[CUBASE][StudioOne] 音の遅れ(レイテンシー)の原因を探る

以上、参考になれば幸いです。

2015年6月20日土曜日

MikuMikuDanceのガラスが透けない時の対処方法

How to correct the transparent parts
CG動画作成ソフトのMikuMikuDance(以下MMD)は、ゲーム開発ツールのUnityなどと異なる点が多々あります。
特にガラスなどの透過を表現する時は設定が必要な場合があります。
透過の表示が異常な場合の対処方法をまとめてみました。


環境

・Windows8.1
・MMD 9.10


モデル名の表記について

MMDのモデル名の表記は「○○式□□」とします。
○○はモデルデータの作者名、□□はモデルデータのキャラクター名です。


アクセサリーの透過設定

Lat式初音ミクにA01hudebako式メガネをかけさせてみました。
初音ミクは拡張子がpmd(pmx)のモデルデータで、メガネは拡張子がxのアクセサリーです。レンズが透けません。

角度を変えるとレンズの向こうにメガネのツルや座標軸が見えています。

対処方法はメニューの
背景 - アクセサリ編集
を開きます。

「1番目より後の・・・」の設定を「0番目より後の・・・」に変更します。

これで正しく表示されました。

MMEが正しく表示されない場合もこの設定で表示されることがあります。

モデルの透過設定

マシシ式MEIKOを自動車(hata式ソアラ)に乗せました。
MEIKOも自動車も拡張子がpmdまたはpmxのモデルデータです。
自動車のガラスが透けないのでおかしなことになっています。

対処方法はメニューの
背景 - モデル描画順
を開きます。

MEIKOのモデル描画順が自動車より上になるように設定してOKをクリックします。

これで正しく表示されました。

透過パーツを持つモデルは描画順を出来るだけ下に設定すると正しく表示されます。


関連ブログ

コミPo!で初音ミクのMMDモデルを使う
プロ生ちゃんMMDモデルを踊らせよう
[MMD] プロ生ちゃんのスパッツに厚みを付ける
[Unity3D] Unityでプロ生ちゃんMMDモデルを扱う

以上、参考になれば幸いです。

2015年6月13日土曜日

[ASP.NET] ポストバック処理で実行するJavaScriptを選ぶ方法

How to control running JavaScript after PostBack
ASP.NETはポストバック処理からWebページのJavaScript関数(function)を直接実行する機能はないようです。
それでもJavaScriptの関数を実行するタイミングをポストバックで制御したかったのでどうにかしてみました。


環境

・Windows8.1
・Visual Studio Community 2013
・C#


どうするか?

次の処理を自分で作りました。
  1. ASP.NETのポストバック処理はJavaScriptを実行したタイミングで画面上のラベル(<span>タグ)を特定の内容に変更する
  2. JavaSriptはラベルの表示が特定の内容になったら実行するように監視し続ける
ASP/NET Ajaxでラベルの内容を変化させた場合の監視漏れがないように、JavaScriptは再帰呼び出しによる無限ループで監視します。
ラベルはユーザーに見せる必要が無いのでスタイルシートで非表示に設定します。


ソース

JsFromCSharp.aspx


JsFromCSharp.aspx.cs



画面を開いただけでは何も起きません。
ボタンをクリックするとポストバックされた後、JavaScriptが実行されます。

とても強引な気がしますが、JavaScriptでしか実行できないライブラリーを使うなど、やむを得ないときには効果あると思います。



関連ブログ

[ASP.NET] 動的に追加したイベントが動作しない
[ASP.NET] 動的に追加したラベルやテキストボックスが消える現象の対策
[C#] タスクトレイにバルーンチップを表示するアプリ
[Unity3D] Visual Studio Community 2013を日本語化してUnityアプリを作る
Unity3DのソースをVisual Studio Expressで編集する

以上、参考になれば幸いです。

2015年6月6日土曜日

[ASP.NET] 動的に追加したイベントが動作しない

How to keep additional events after PostBack
ASP.NETでユーザーの操作によって画面にボタンを追加するアプリを作ったときに悩んだ内容をまとめました。
ボタンをクリックしたら新しいボタンを画面に追加するアプリを作ったのですが、新しいボタンのイベントが実行されません。


環境

・Windows8.1
・Visual Studio Community 2013
・C#


イベントが動作しない例

1. Button1をクリックすると新しいボタンを追加する
2. 新しいボタンをクリックするとラベルの文字を変化させる
というWebアプリを作ろうとして失敗した例です。

DynamicControls.aspx


DynamicControls.aspx.cs


DynamicControls.aspx.designer.cs


実行するとこうなります。
Button1をクリックすると新しいボタンが追加されるまではいいのですが
新しいボタンをクリックしても期待通りに動作しません。


修正後

[HOWTO] Visual C# .NET を使用して ASP.NET で動的にコントロールを作成する方法
http://support.microsoft.com/kb/317794/ja
によると
OnInit イベント ハンドラまたは Page_Load イベント ハンドラで、作成したコントロールをコントロール コレクションに追加する必要があります。
とのことです。

上のソースで期待通りに操作しなかった原因は、動的に追加するボタンをOnInitイベントやPage_Loadイベントで追加しなかったためです。

新しいボタンを追加する処理をPage_Loadイベントで発生させるように修正します。
ただし、ASP.NETはイベントごとにポストバックが発生し、OnInitイベントやPage_Loadイベントが処理されます。
Button1をクリックしたときだけPage_Loadで新しいボタンを追加するように工夫します。

ボタンのUseSubmitBehaviorプロパティをFalseに設定すると、ポストバックした際Page_LoadイベントのRequest["__EVENTTARGET"]にボスとバックさせたボタンのIDが設定されます。

というわけで
・ボタンの追加をPage_Loadイベントで処理
・ボタンのUseSubmitBehaviorをFalseに設定
に修正したのが次のソースです。


これで期待通りに動作しました。


まとめ

動的に追加したイベントはポストバック後のPage_Loadより後に発生します。
動的にコントロールを追加する場合はポストバックの前と後に画面に配置するように工夫すればすればいいと思います。

※ボタンを配置して生成されるHTMLタグはUseSubmitBehaviorプロパティが
Trueの場合は<input type="submit">
Falseの場合は<input type="button"> とonclickイベントのJavaScript
に変わります。プロパティ名通り振る舞いが変わるのでリファクタリングするときは要注意です。



関連ブログ

[ASP.NET] ポストバック処理で実行するJavaScriptを選ぶ方法
[ASP.NET] 動的に追加したラベルやテキストボックスが消える現象の対策
[C#] タスクトレイにバルーンチップを表示するアプリ
[Unity3D] Visual Studio Community 2013を日本語化してUnityアプリを作る
Unity3DのソースをVisual Studio Expressで編集する

以上、参考になれば幸いです。