ジュールシーフの動作をGIFアニメにしてみた

(2015/12/21) GIFアニメの高速化版を作りました。

乾電池1本では光らないLEDをブロッキング発振回路で昇圧して光らせる「ジュールシーフ」の原理をもっとわかりやすくしようと、GIFアニメを作ってみました。

How Joule Thief works

ジュールシーフの動作をスローモーションで見るとたぶんこんな感じ

各部品の基本的な働き

  • コイルには自己誘導作用があるので、電流の変化を妨げる方向の電圧(起電力)を発生させます。
  • トランジスタには増幅作用があるので、ベース電流の変化よりコレクタ電流の変化のほうが大きくなります。
  • ベースについている抵抗により、ベースよりもコレクタのほうに電流が回りやすくなります。

これらの作用が重なると、下記のようになります:

  1. 最初はトランジスタOFF、LEDも電圧不足のためOFF
  2. 電流はベースへ逃げるしかない → ベース電流増
  3. トランジスタON
  4. コレクタ電流増 → コイルの逆起電力でベース電流増 → …(繰返し)
  5. 飽和して電流がピークを迎える
  6. 起電力減 → コレクタに電流を取られてベース電流減
  7. コレクタ電流減 → コイルの逆起電力でベース電流減 → …(繰返し)
  8. → このタイミングでコイルの逆起電力がピークに達してLED点灯
  9. 最初に戻る

つまり、コレクタ電流の強い変化にコイルが対抗しようとして逆起電力を発生させても、それがかえって(コレクタ電流より弱い)ベース電流の変化を後押しする結果になり、トランジスタで増幅されてコレクタ電流の変化が「倍返し」で促進されてしまうわけです。これはいわば「正帰還」であり、発振を引き起こすパターンです。発振によって起電力のピークが繰り返しやってくるので、人間の目には連続して光り続けているように見えるわけです。

ついでにメモ。CdSを追加して暗くなると自動的に点灯する回路と、通常のジュールシーフの回路、コイルの巻き方。線を2本束ねてトロイダルコアに巻き、片方の巻き終わりをもう片方の巻き始めに接続して中間タップを作るのがポイント(間違えて巻き始め同士を接続するとうまく動作しません)。20回ぐらい巻けば安定するようです。

ジュールシーフの作り方メモ

ジュールシーフの作り方メモ

実際に作ったものがこれ。

自動点灯ジュールシーフLED

自動点灯ジュールシーフLED


自動点灯ジュールシーフLED(拡大)

自動点灯ジュールシーフLED(拡大)

【参考になるページ】

MIDI Chord Helper の更新・その後

前回のこのブログの記事で書いたGugen応募の件ですが、2年前と違って今回はノミネートすらされず。
原宿での作品展とか渋谷での授賞式とかうーん行こうかどうしようといいながらも、寒かったしちょっと遠い割には自分が展示するわけじゃないし面倒になってしまい結局全然行かず、元になったJavaアプリのほうの MIDI Chord Helper のバージョンアップばかりやってた気がします。

さて、ここからが本題。
1ヶ月ほど前の記事でeclipse入れたことなど書きましたが、ここにきて MIDI Chord Helper のMIDIエディタ部分を中心にリファクタリングして修正しやすくしたうえで、細かいところをいろいろ改善しました。主なものはこんな感じ:

【MIDI Editor 関連】
ボタンの整理。今までプレイリストの下にあったプレイボタンと Load to Sequencer ボタンをプレイリストの中に入れ、プレイボタンや現在位置「分:秒」の空いてるセルをダブルクリックするだけでシーケンサーに選択させることができるようになり、直感的でわかりやすくなりました。
それと同時に、MIDI同期モードのマスター/スレーブのそれぞれについてモード切り替えを行うコンボボックスを追加しました。これはもともと javax.sound.midi でサポートされている機能だったので比較的容易に実装できました。が、Windows7だとモードが1つしか選べず、実質的に機能していないも同然だったりします(他のシステムだと選べたりするんでしょうかね…?選べたっていう人がいたらぜひお知らせください)。

イベント編集ダイアログを開いている最中に表の選択が変わったときに、それに変に追従していたのを、ダイアログを開いたときに決めた箇所に反映するようにしました。

セル幅も選択が変わるたびに等幅に戻ったりしていた現象も直りました。これはテーブルビューが対象とするテーブルデータモデル(例:曲、トラック)が切り替わるたびにその都度内部でテーブル列モデルを作り直すという javax.swing.JTable のデフォルトの動作が原因だったので、テーブル列モデルをテーブルデータモデルに合わせて一度作ったらもう作り直さないよう、JTable のメソッドを setAutoCreateColumnsFromModel(false) として呼ぶようにしました。

Base64変換ダイアログも、曲を選択していないと開けなかったりしましたが、よく考えたらそれでは新しい曲を空のプレイリストに追加できないことに気づいて修正しました。

【アプレットのときだけ発生する問題】
アプレットとして実行したときに、タイムスライダーをちょっと戻すなどの操作をしないと再生音が出なかったり、曲が終わっても次の曲に行かずに秒数をカウントアップし続けるといった現象が出ていて、まだ原因がわかっていない状況です。これもそのうち直したいのですが…今のところめどが立っていない状況(原因さえわかれば直りそうな気もしますが…)

【あの楽器】
MIDI Chord Helper には、初音ミクのあの楽器みたいな図形の広がりを表示する機能がついていますが、MIDI演奏中に頻繁にノートONがやってきたときなど、たまに java.util.ConcurrentModificationException という例外が投げられることがありました。原因は表示中の図形が何であるかを覚えておくキューが別スレッド(paint() と javax.swing.Timer の実行は別スレッド同士とみられる)で同時にイテレータを操作したことで反復処理の衝突が起きたのが原因でした。イテレータだけを別々にしても直らず、結局キューにアクセスする複数の箇所を全部 synchronized で囲んで排他制御することで対応しました。

MIDI Chord Helper のページはこちらです。ソースやダウンロードのページにもここから行けるようになっています。久々に新しくなった MIDI Chord Helper をぜひお試しください。電子楽器CAmiDionの発想の元になったJavaアプリで、これだけでもマウスでコード演奏して遊べます。