自作プラネタリウムの記録・兵庫県立大学天文部

はじめに

 兵庫県立大学天文部では2016年度にプラネタリウムのエアドームの製作,2017年度に投影機の製作を行った.投影機は過去のピンホール式プラネタリウムの恒星球(投影する恒星の等級に応じた穴をあけたもの)をそのまま利用することにし,電気系統やギヤ部分の製作をメインに行った.ここでは投影機の電気系統・プログラムについての解説を行う./media/uploads/Raccoon/planetarium.jpg

システムの概要

 プラネタリウムのシステムの概要を以下の図に示す.投影機とコントローラーは無線で接続されている.投影機は主に4つの機能を備えている.ステッピングモーターの駆動,EX球の点灯,RGBLEDの点灯,無線通信を行うことができる. /media/uploads/Raccoon/overview.jpg

使用部品

ステッピングモーター

 投影機の恒星球を回転することで,天球の回転を表現することができる.回転のために使用したモーターはステッピングモーターである.ステッピングモーターはパルス信号で正確な位置決めをすることができ,音も静音であるため,プラネタリウムには適している.使用したステッピングモーターはバイポーラタイプのST-42BYH1004,モータードライバにDRV8835を使用した.ステッピングモーターを動かすための関数を以下に示す。void stepper(void)は100usごとに繰り返しタイマー割り込みが行われる.コントローラから受信してきた配列の値data[0]の大きさによって回転スピードの調整ができ,data[0]が大きいほど早くなる.

ステッピングモーターを制御するプログラムモータードライバDRV8835使用)

DigitalOut APHASE(p5);
DigitalOut AENBL(p6);
DigitalOut BPHASE(p7);
DigitalOut BENBL(p8);
uint8_t data[4];//受信した配列の値

/*100usごとに繰り返しタイマー割り込みする*/
void stepper(void)
{
    static unsigned int cnt = 0;
    static int i = 1;
    static int delay = 1000;
    
    delay = (255 - data[0]) + 10;

    if((++cnt > delay) && data[0]!=0)
    {
        AENBL = 1;
        BENBL = 1;
        switch(i)
        {
        case 1:
            APHASE = 1;
            break;
        case 2:
            BPHASE = 1;
            break;
        case 3:
            APHASE = 0;
            break;
        case 4:
            BPHASE = 0;
            break;
        }
        
        if(++i==5)i = 1;
        cnt = 0;
    }
    else if(data[0]==0)
    {
        AENBL = 0;
        BENBL = 0;
    }
}

投影機のギヤの部分を以下の図に示す.ステッピングモータは図中のアルミ板の裏から接続されており,ギヤを介して恒星球を回転させる。 /media/uploads/Raccoon/gear.jpg

EX球の駆動回路

 ピンホール式プラネタリウムの光源としてEX球がよく用いられる。EX球はフィラメントがとても小さく,点光源に近い.そのため,綺麗な星像を投影することができる.五藤光学研究所が販売しており,一個1000円で手に入れることができる.EX球は口金E10のソケットを使えば,豆電球と同じように点灯させることができる.ただし,定格が2V2Aであるので,それに合わせて回路を設計する必要がある.
 よく用いられる方法として,可変抵抗で調光する方法がある.2V以上の電源に可変抵抗とEX球を直列に接続して,分圧させることで適切な電圧をEX球に印加する。この方法の欠点として,調光するときに人が可変抵抗の大きさを変更する必要がある.そのため,マイコンから調光することができない。
 LEDをマイコンで調光する方法として,PWMがよく用いられる。PWMはパルス波を与えて,LEDを連続でON・OFFさせて,あたかも明るさが変わったかのように見せる方法である。この方法をEX球にも適用すれば調光ができると考えられる.
 ここで,マイコンから電圧を変化させることでEX球を調光させる方法を提案する.マイコンから任意の電圧を出力させる方法としてDAコンバータ(DAC)がある.しかし,一般的なDACは大電流を流すことは難しい.そこで,エミッタフォロワ回路を利用する.エミッタフォロワは電圧の変化がほとんどなく,電流だけを増幅させることのできる回路である.しかし,ベース・エミッタ間電圧Vbe(約0.65V(ダーリントン・トランジスタでは約1.3V))によって出力電圧はVbeだけ小さくなってしまう.EX球に印加する電圧は最大でも2VであるのでVbeの影響は非常に大きい.そこで,以下の図のような電流ブースト回路を用いる.この回路では,オペアンプを使ってDACの電圧Vdacをベース・エミッタ間電圧Vbeだけ大きくしてベースに出力するようなフィードバックをかけている.そのため,VoutはVdacと同じ大きさにして出力させることができる.

circuit

 使用したDACはMCP4922-E/PでSPI通信で動かす.以下にMCP4922を動かすためのプログラムを示す.void LightBulb(void)は50msごとに繰り返しタイマー割り込みが行われる.EX_MAXの値を変えることで,出力する電圧の最大値を変更することができる.

SPI通信でMCP4922(DAC)を動かすためのプログラム

SPI spi(p11, p12, p13);//mosi(SDO), miso, sclk
DigitalOut CS(p14);
DigitalOut LDAC(p17);
uint8_t data[4];//受信した配列の値

void spi_write(int config, int mask, int value)
{
    int spi_data;
    spi_data = config | (mask & value);
    CS = 0;
    LDAC = 1;
    spi.write(spi_data);
    CS = 1;
    LDAC = 0;
}    

void LightBulb(void)
{  
    static int mask = 0b0000111111111111;
    int config;
    int value;
    
    static int EX_MAX = 1638;

    config = 0b0111000000000000;
    value = EX_MAX * (data[1] / 255);//12bit(0-4095)で0-VREFだけ出力
    spi_write(config, mask, value);
}

RGBLED

 投影機では3つのRGBLEDを任意の色をそれぞれ出力できるようにしている。このLEDを室内灯として用いる.LEDの明るさはPWMで調節している.今回使用したマイコン(LPC1768)のPWMを利用できるピンは最大で6本しかない.RGBLEDを3個を別々の色で調光しようとすると,合計で9本のPWMが必要になる.そこでPWMピン3本とGPIOピン3本を使って,各RGBLEDについてダイナミック点灯を行った.また,使用したRGBLEDは表面実装型であるが,ちょうど良い基板が見つからなかったので,以下の図のようなプリント基板を製作した。 /media/uploads/Raccoon/rgbled.jpg

XBeeによる無線通信

 投影機本体とコントローラーとの無線通信を行い,モーターの回転スピードや星の明るさなどの命令を送信している.無線通信はXBeeを使うと簡単に実現できる.XBeeとマイコンの通信にはシリアル通信を利用する.具体的な流れとしてはコントローラ側で複数の可変抵抗の値をAD変換でそれぞれ読み取り,配列に保存する.シリアル通信で一度に送信できるデータ量は最大で8bitである.そのため,上位5bitを配列の値,下位3bitを配列の要素の値として符号化を行い送信する. /media/uploads/Raccoon/channelcoding.jpg

符号化の関数

/*floatの値data_f(AD変換で得られた値(0-1))とintの配列の要素indexを引数として,上位5bitを配列の値,下位3bitを要素の値として符号化して返り値とする*/
uint8_t ChannelCoding(float data_f, int index)
{
    uint8_t tmp;
    tmp = data_f * 31;//floatの値を5bit(0-31)の値に変換
    return ((tmp << 3) | index);
}

復号化の関数

/*受信したデータCodeWordを引数として,配列の値と要素の値indexに分割し,グローバル変数で宣言した配列に代入する*/
#define MAX 4
uint8_t data[MAX];
void ChannelDecoding(uint8_t CodeWord)
{
    int index;
    index = CodeWord & 0b00000111;
    if(index<MAX) data[index] = CodeWord >> 3;
}   

 実際の使用では通信路でノイズが付加され,スパイクノイズのように現れる可能性がある.このため,過去に受信された情報を保存しておき,中央値をとるようなメディアンフィルターを通すことで,ノイズの除去をしている。

プログラム

投影機本体とコントローラーのプログラム

Import programAstroC_planetarium_master

投影機本体のプログラム

Import programAstroC_planetarium_slave

コントローラーのプログラム

過去の記録

過去の先輩方の記録


Please log in to post comments.