投影機本体のプログラム

Dependencies:   mbed

Fork of AstroC_planetarium_master by Ryota Маэда

/media/uploads/Raccoon/main.jpg

Revision:
0:ee25c3c95837
Child:
1:b6a142877de4
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/main.cpp	Sat Sep 23 08:05:10 2017 +0000
@@ -0,0 +1,210 @@
+#include "mbed.h"
+#define STEPPER_DELTA_T 100
+
+/*ステッピングモーター*/
+Ticker step_timer;
+DigitalOut APHASE(p5);
+DigitalOut AENBL(p6);
+DigitalOut BPHASE(p7);
+DigitalOut BENBL(p8);
+
+/*MCP4922*/
+Ticker spi_timer;
+SPI spi(p11, p12, p13);//mosi(SDO), miso, sclk
+DigitalOut CS(p14);
+DigitalOut LDAC(p17);
+
+/*RGB_LED_3*/
+Ticker rgb_timer;
+BusOut signal(p24, p25, p26);
+PwmOut R_led(p23);
+PwmOut G_led(p22);
+PwmOut B_led(p21);
+
+/*シリアル通信(xbee)*/
+Serial xbee(p28, p27); // tx, rx
+
+/*受信データ格納*/
+char data[6] = {0};
+
+/*ステッピングモーター*/
+void stepper(void)
+{
+    static unsigned int cnt = 0;
+    static int i = 1;
+    static unsigned int delay = 1000;
+    
+    /*速度制限:MAX周期1500[us](脱調防止)*/
+    delay = (255 - data[0]) + 15;
+    
+    /*ステッピングモーターの制御*/
+    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;
+    }    
+}
+
+/*spiでの書き込み用関数*/
+void spi_write(unsigned int config, unsigned int mask, unsigned int value)
+{
+    unsigned int spi_data;
+    spi_data = config | (mask & value);
+    CS = 0;
+    LDAC = 1;
+    spi.write(spi_data);
+    CS = 1;
+    LDAC = 0;
+}    
+
+/*SPI通信でMCP4922(DAC)を動かすための関数*/
+void light_bulb(void)
+{
+    static unsigned char ss = 0;
+    
+    //MCP4922へ送信するデータ
+    static unsigned int mask = 0b0000111111111111;
+    unsigned int config;
+    unsigned int value;
+    
+    static unsigned int EX_MAX = 2510;//2.0[V]
+    static unsigned int Milky_MAX = 3150;//2.5[V]
+    
+    /*前回の電圧の値と違う場合のみ実行される*/
+    if(ss==0 /*&& data[1]!=old_data[0]*/)
+    {
+        /*EX球(2V2A)用*/
+        config = 0b0111000000000000;
+        value = (data[1] * EX_MAX) / 255;
+        spi_write(config, mask, value);
+        ss = 1;
+    }
+    else if(ss==1 /*&& data[2]!=old_data[1]*/)
+    {
+        /*天の川(2.5V2A)用*/
+        config = 0b1111000000000000;
+        value = (data[2] * Milky_MAX) / 255;
+        spi_write(config, mask, value);
+        ss = 0;
+    }
+}
+
+/*Hueの値deg(0~180)を受け取るとRGBに変換して反映させる*/
+void HSB2RGB(float deg)
+{
+    /*リセット*/
+    R_led = 0.0;
+    G_led = 0.0;
+    B_led = 0.0;
+    
+    if(0 < deg && deg <= 60)
+    {
+        R_led = 1.0 - (deg / 60);
+        G_led = deg/60;
+        B_led = 0.0;
+    }
+    else if(60 < deg && deg <= 120)
+    {
+        deg = deg - 60;
+        R_led = 0.0;
+        G_led = 1.0 - (deg / 60);
+        B_led = deg/60;
+    }
+    else if(120 < deg && deg <= 180)
+    {
+        deg = deg - 120;
+        R_led = deg/60;
+        G_led = 0.0;
+        B_led = 1.0 - (deg / 60);
+    }
+}
+
+/*RGB_LEDをダイナミック点灯するための関数*/
+void RGB_LED(void){
+    static uint8_t dig;
+    uint8_t binary = 0b00001;
+    HSB2RGB((float)data[3]*180/255);
+    /*switch(dig){
+        case 0:
+        signal = 0b00001;
+        break;
+        case 1:
+        signal = 0b00010;
+        break;
+        case 2:
+        signal = 0b00100;
+        break;
+    }*/
+    signal = binary << dig;
+    if(++dig == 3)dig = 0;
+}
+
+/*シリアル通信受信(xbee)*/
+void receve(void)
+{
+    static int sw = 0;
+    /*送信側から送信開始の合図で'R'が送られてくる*/
+    /*'R'を受信したら、データ受信開始*/
+    /*5個のデータが順番に受信されるので、順番に配列に代入する*/
+    if((sw == 0) && (xbee.getc() == 'R'))
+    { 
+        sw = 1;
+    }
+    else if(1 <= sw && sw <= 6)
+    {
+        data[sw-1] = xbee.getc();
+        if(++sw > 6)sw = 0;
+    }
+}
+
+int main(){
+    /*ステッピングモーター*/
+    AENBL = 1;
+    APHASE = 0;
+    BENBL = 1;
+    BPHASE = 0;
+    step_timer.attach_us(&stepper, STEPPER_DELTA_T);//100[us],10000[Hz]
+    
+    /*spi通信(MCP4922)*/
+    CS = 1;
+    LDAC = 1;
+    spi.format(16, 0);
+    spi.frequency(1000000);
+    spi_timer.attach_us(&light_bulb, 10000);
+    
+    /*RGB_LED_3*/
+    R_led.period(0.00004);
+    G_led.period(0.00004);
+    B_led.period(0.00004);
+    rgb_timer.attach_us(&RGB_LED, 5000);
+    
+    /*シリアル通信(xbee)*/
+    xbee.baud(9600);
+    xbee.format(8, Serial::None, 1);
+    xbee.attach(&receve, Serial::RxIrq);//受信割り込み
+    
+    while(1)__WFI();
+}
\ No newline at end of file