作品タイトル:GR-KURUMIを用いて物理現象に基づくお手軽乱数発生器をつく
表示名:今岡 通博
コンセプト・作品説明 |
---|
数年前にNHKスペシャルの『超常現象 科学者たちの挑戦』が放送されました。何度か再放送もあったようですが私は今年の正月休みの再放送を見ました。ご覧になられた方も少なからずいらっしゃると思います。内容は人々の感情の起伏が物理現象に基づく乱数発生器に影響を及ぼすというものです。番組後半では『バーニングマン』に集まった人たちの思いが、乱数発生器影響を与える実験を紹介していました。バーニングマンはとあるイベントの名称でアメリカのある州の砂漠に集まった何万人が、外部と遮断された環境で1週間自給自足の共同生活するというものです。イベントの最後に参加者全員の目の前で巨大な人形を燃やします。この時、参加者たちの感情は最高潮に達し乱数にも偏りが生じるのだそうです。 放送された内容に関しては様々な意見があるようですが、そのあたりは他のWEBページを参考にして頂くとして、そこは技術者としてその真意を確かめたいと思いもあり、今回は誰でも手軽に作れる物理現象に基づく乱数発生器の作り方を紹介したいと思います。そしてできるだけ多くの読者にその真意をご自分の目で確かめて頂きたいのです。 |
自然現象による乱数
乱数の作り方に色々あります。例えば純粋にソフトウエアだけで乱数を生成する方法もあります。これは一般的に擬似乱数と云います。乱数を生成するための様々なアルゴリズムが考案されていますが、詳しくはここでは割愛しますが、ただ毎回ことなる初期値を与えてやらないといつも同じ乱数列となってしまいます。またハードウエアロジックにより生成される乱数もあります。図のようなシフトレジスタと排他的論理和を組み合わせた回路です。
生成される乱数は2値となります。シフトレジスタは複数段あり最上位ビットが最下位ビットに循環するようになっています。シフトレジスタの段数が多いほど長い乱数列を生成することができます。クロックを与え続けると一定の長さで乱数列は循環します。このように生成される乱数はM系列の擬似乱数とよばれます。排他的論理和をどこに入れるかでM系列の乱数になるかが決まります。すでにシフトレジスタの数に対して排他的論理和を入れる箇所がいくつか発見されています。乱数を生成するためには初期状態のシフトレジスタの値が少なくとも一か所以上は1である必要があります。
今回はこれらとは異なり物理現象による乱数の生成方法を考えてみましょう。最も身近に思いつくのはサイコロを振ってみることではないでしょうか。ただサイコロを振るといっても大量の乱数列を生成すためには人間ではとても疲れます。サイコロを拾って投げるという機械を作ったとしても(それはそれで大変ですが)サイコロの角が取れて目の出方に偏りが出てくるかもしれません。今回は「はじめに」でも書いた通りできるだけお手軽に作りたいわけですから、この点からもこの方法は良案ではありませんね。そこで1個10円以下のトランジスタ使って乱数の発生源を作るところからはじめたいと思います。
まずはホワイトノイズを聞いてみよう
今回乱数の生成源として使うトランジスタは2SC1815L-GRです。もっとも安くかつ入手性の良いトランジスタのひとつです。秋葉原に出店している通販サイトでは20個で100円程度で入手できます。
トランジスターは回路図では図の記号で表されます。
Bがベースと呼ばれます。矢印がついたピンがエミッタ(E)といいます。その反対側がコレクタ(C)です。エミッターは電子を発散する極という意味でこの名前が付きました。またコレクタ-はエミッターが放出した電子を回収するという意味合いでこの名が付いています。ベースはトランジスタが発明された当初、ベースの上にコレクターとエミッターの電極をさしてトランジスターの製造を行っていたので、機能から由来する名前ではありませんが、この名前になりました。今となっては当時の製造方法とは全く違うのですが、現在でもこの名前が使われています。
トランジスタはP型半導体とN型半導体の組み合わせでできています。2SC1815L-GRはNPN型のトランジスタです。NPN型とはN型半導体でP型半導体を挟んだような構造になっています。
両端のN型半導体にコレクターピンとエミッターピンが接続されています。そしてそれらに挟まれたP型半導体からベースの電極が出ています。このようにP型とN型の半導体を接続すると面白い性質が出現します。N型からP型には電流が流れますが、その逆のP型からN型には電流が流れません。
次の表は今回使う2SC1815の最大定格と云われる表で、この電圧を超えるとこのトランジスタが不可逆的に壊れてしまう可能性があるという値です。この表の中で特に注目して頂きたいのがEmitter-Base Voltage(エミッター・ベース間の電圧)です。エミッターからベースに向かって5V以上の電圧をかけてはならないことを示しています。他の端子間の電圧に比べて極端に低い値になっています。この値を超えると急激に大きな電流が流れ、この現象を逆電圧降伏(breakdown)といい、降伏が始まる電圧を降伏電圧(breakdown voltage)といいます。
この値が表のVEBOです。これが電子雪崩降伏(avalanche breakdown)を引き起こします。詳しくは参考文献を参照して下さい。この電子雪崩降伏を意図的に起こして乱数の源であるホワイトノイズを生成します。 N型に負の電圧、P型に正の電圧をかけることを逆バイアスをかけるなどと云いますが、トランジスタの一般的な使い方である増幅器とやスイッチング素子として使う場合はまず逆バイアスをかける使い方はしません。
図がトランジスタを使ってホワイトノイズを発生させる回路です。電源には9Vの006P電池を使います。この電圧をベースとエミッター間に印加して電子雪崩現象を発生させます。最大定格ではVEBOは5Vと記載されていましたが、実際には8V後半あたりから電子雪崩現象が発生します。このトランジスタがある程度余裕をもって設計されているからなのだと思います。ここで本格的な電子雪崩現象を発生させてしまうと、ベースとエミッター間に大電流がながれトランジスタが破損してしまいますので1MΩの抵抗を入れています。電子雪崩現象を発生するもののトランジスタのダメージにはつながらないための抵抗です。
図がブレッドボードに実装した図です。図のエミッターとベースあるいは電源のGNDに図のようなクリスタルイヤホンをつなぐと耳でホワイトノイズを確認できます。音はあまり大きくないのですが、FMラジオの放送局がないところにダイアルを合したときの様な「サー」という音が聞こえませんか。これがトランジスタの電子雪崩現象によるホワイトノイズです。電界をかけたことにより電子が加速され本来通過することができないPN接合の壁を乗り越えてきた電子の音を聞いているわけです。これはまるで電子一個一個が鮭やアユが水門を乗り越えて遡上するようなもので、その現象を音として聞いているのです。
因みにクリスタイヤホンでなきゃならい理由ですが、他の一般的なイヤホンは電磁コイルを使っていますので、抵抗値が数十Ωです。エミッターとベース間にこれらのイヤホンを接続するとベースとエミッター間の電圧が低下し電子雪崩現象が停止してしまいます。クリスタルイヤホンはこの抵抗値が極めて高いのです。またクリスタルイヤホンと呼ばれているほとんどのイヤホンは実際にはセラミックを素材にしたセラミックイヤホンです。ですが今回の用途にはどちらも問題なく使えます。
GR-KURUMIのADCでホワイトノイズを取り込む
それでは、GR-KURUMIを使ってトランジスタのエミッターとベース間で生成するホワイトノイズを取り出してみましょう。回路は先ほど説明したホワイトノイズを生成させる回路です。その出力であるトランジスタのベースをクルミの0番のアナログ入力に接続します。またKurumiの左のFTDI Basic Programmer は作成したプログラムをKURUMI本体に書き込むために使うためのものですが、ADコンバーターで取り込んだホワイトノイズの値をPC側に送るためにも使います。
図は上記の回路をブレッドボードに搭載した図です。
GR-KURUMIに書き込むプログラムは以下の通りです。
1: void setup()
2: {
3: Serial.begin(9600);
4: }
5: void loop()
6: {
7: int sensorReading = analogRead(A0);
8: delay(10);
9: Serial.println(sensorReading);
10: }
3行目でシリアルインターフェースの設定をしています。今回は9600bpsとしています。このコードはsetup関数内に書かれていますのでKURMIをリセットした後、一度だけ実行されます。
5行からはloop関数内のコードで、setup関数実行後何度も繰り返し実行されるコードが並んでいます。
7行目ではアナログ入力A0から値を取得し整数型のsensorRadingに格納します。その後8行目のdelay関数で10ミリ秒ウエイトを置きます。これはADコンバーターの値が安定するのとPCに送るデーター数を調整するためのものです。
9行目でADコンバーターが取得した整数型の値をシリアルインターフェース経由で送ります。これは3行目で設定したボーレートでPCに送信されます。Serial.println()のlnが付くADコンバーターが取得した値を送信した後改行が追加されます。この際、整数型の値は10進の数字文字列に変換されて送出されます。
それでは実際にUSBをPCに接続して乱数の値を観測してみましょう。PCからはKURUMIの書き込み器であるFTDI BASIC PROGRAMMERが仮想シリアルポートとして見えています。このシリアルポートを読み出すことでホワイトノイズの値が取り出せます。筆者はWindowsの環境なのでターミナルエミュレーターとして有名なTeraTermを使いました。立ち上げ時の設定でFTDIがつながった仮想シリアルポートを指定します。またボーレートは9600BPSです。その他の設定は取り敢えずデフォルトで結構です。
値がスクロールしながらTeraTermの画面に表示されるのですが、あらあら、これはどういう事でしょう。本来ADCの分解能は10bitなので上限1024なのですが、ほんの少ししか値が変化しません。トランジスタが生成するホワイトノイズを直接ADCに入れるだけではゲイン不足かもしれません。あるいはADCの入力段のインピーダンスの関係で電圧降下が起きているのかもしれません。いずれにしても他の方法を考えねば。
オペアンプでゲイン不足を解決
ゲイン不足を解決するには入力信号を増幅せねばなりません。入力信号を増幅する方法は色々ありますが、今回はオペアンプを使います。オペアンプは増幅器をはじめ各種フィルターやコンパレーター、信号発生器などアナログ回路を構成するうえでは欠くことのできないデバイスのひとつです。内部はトランジスターやFETなどのより単純な素子で構成された回路をひとつのパッケージに収めてものです。オペアンプの名前の由来はOperational Amplifier の略で演算増幅器とも訳されます。デジタルコンピューターが主流になる前、アナログコンピューターが存在した頃の演算素子として使われていたようです。今回はLM358Nとうオペアンプを使います。
これはナショナルセミコンダクター社が開発元ですが、世界の様々な半導体メーカーがセカンドソースとして製造しており、低価格でもっともポピュラーな定番オペアンプのひとつです。部品屋さんの店舗でも製造元によって異なるLM358をいくつも扱っている所がありますが、今回の用途ではどこのメーカー製でも問題なく使えます。一番値ごろなものを選んでもらえれば結構です。因みに秋葉原に出店してる部品屋さんの通販サイトなどで5個で100円程度で入手できます。ただし図のようなDIPタイプのパッケージを選んでください。これだとそのままブレッドボードに挿して利用することができます。パッケージの中には二つのオペアンプが図のように入っています。
オペアンプの使い方を示します。
単一電源で使う場合の回路を示しています。オペアンプはプラス電源とマイナス電源の二つの電源で使うのが本来の使い方なのですが、今回のLM358Nは単一電源でも使用可能です。 入力を抵抗のR2を介してマイナス入力(ピン番号でいうと2番)にいれます。出力はピン番号の1番から出てきます。出力は抵抗R3を通じてマイナス入力に戻されます。図に示したものは反転増幅器になっており入力信号に対して反転した信号が出力されます。正弦波を入れると180°位相がずれて出力されます。勿論非反転回路も構成することも可能ですが、一般的に反転増幅の方が性能面で優れているといわれています。
増幅率はR3/R2で決まります。図の回路では33,000/100=330倍の増幅率です。入力抵抗R2はもう少し大きな値の抵抗が良いのですが、出張中ということもあり手持ちに100Ωしかなかったのでこの値になっていますが、一般的には1KΩ以上が推奨されます。R4はオペアンプのプラス入力に印加する電圧を調整するためのものです。一般的に電源電圧の半分の電圧がかかるように固定抵抗で分圧しますが、今回の用途では入力信号にバイアス電圧がかかっているのでそれとの調整で可変抵抗にしています。
図がオペアンプを用いて増幅した信号をGR-KURUMIのADCに入力する回路です。LM358Nはひとつのパッケージにふたつのオペアンプが入っていますが、今回はそのうちのひとつを使います。もうひとつは余っていますが、使わないオペアンプがある場合は必ず二つの入力に異なる電圧を印加して出力を固定するようにしてください。両方の入力が未接続や同一電圧を印加した場合は出力の値が定まらずノイズ源になることがあります。ノイズ対策としてこれらの処置は必ず行ってください。
図が上記の回路をブレッドボードに実装した図です。
図がオペアンプのピン配列です。オペアンプの表面に半月状の窪みがありますので、その辺を上に向けて左のピンが1番ピンです。後は1番ピンから8番ピンまで図のように並んでいます。ブレッドボードの図では窪みがある辺が左を向いています。
LM358Nの出力である一番ピンとGND間にイヤホンを接続してもっともホワイトノイズが大きくなるように可変抵抗を調整してみてください。
図はターミナルエミュレーターのバッファーを表計算ソフトにコピーしてグラフ化したものです。
オペアンプを入れることにより信号の振れ幅も十分になりました。またプラス側にもマイナス側にサチッてないことが確認できます。
おわりに
今回はトランジスターのベースとエミッタ間に逆バイアスをかけて意図的に電子雪崩現象を起こしホワイトノイズを生成しました。このホワイトノイズをGR-KURUMIのADCを用いて量子化しパソコンで値を取得するというところまでやりました。次回はこのホワイトノイズが本当に乱数なのか検定してみます。お楽しみに。
■参考文献 降伏現象
http://akita-nct.jp/~tanaka/kougi/2010nen/4e/7-5breakdown.pdf
以下次回以降
■乱数の検定
■マイコンによる高電圧の生成
■トンネル効果による乱数生成
■もう少し詳しいオペアンプの使い方など
今岡工学事務所 個人事業主代表
十数年前は現役のプログラマーでした。当時は呼吸をするようにコードを書いていました。FPGAのコーディングもSMDの半田付けも得意でした。最近は老眼も進み原稿書きへ転進を図っている最中です。物書きで凌げるか暗中模索の毎日です。
愛媛県松山市在住
・基本的には組込系システムの請け負い開発が主たる業務
・最近は原稿を書いていることが多い
・セキュリティ・キャンプの講師とか
・ハードウエアスタートアップ支援
・オープンソース系のコミュニティ活動
http://www.itmedia.co.jp/author/208685/