投影機本体のプログラム

Dependencies:   mbed

Fork of AstroC_planetarium_master by Ryota Маэда

/media/uploads/Raccoon/main.jpg

Revision:
1:b6a142877de4
Parent:
0:ee25c3c95837
Child:
2:9aaad52da789
--- a/main.cpp	Sat Sep 23 08:05:10 2017 +0000
+++ b/main.cpp	Thu Dec 21 13:02:23 2017 +0000
@@ -1,5 +1,7 @@
 #include "mbed.h"
-#define STEPPER_DELTA_T 100
+#define STEPPER_DELTA_T 150
+#define k 5
+#define MAX 4
 
 /*ステッピングモーター*/
 Ticker step_timer;
@@ -17,15 +19,16 @@
 /*RGB_LED_3*/
 Ticker rgb_timer;
 BusOut signal(p24, p25, p26);
-PwmOut R_led(p23);
-PwmOut G_led(p22);
-PwmOut B_led(p21);
+PwmOut R_led(p22);
+PwmOut G_led(p21);
+PwmOut B_led(p23);
 
 /*シリアル通信(xbee)*/
 Serial xbee(p28, p27); // tx, rx
 
 /*受信データ格納*/
-char data[6] = {0};
+unsigned char data[MAX] = {0};
+unsigned char tmp_data[MAX][k] ={0};
 
 /*ステッピングモーター*/
 void stepper(void)
@@ -35,7 +38,7 @@
     static unsigned int delay = 1000;
     
     /*速度制限:MAX周期1500[us](脱調防止)*/
-    delay = (255 - data[0]) + 15;
+    delay = (255 - data[0]) + 10;
     
     /*ステッピングモーターの制御*/
     if((++cnt > delay) && data[0]!=0)
@@ -65,7 +68,7 @@
     {
         AENBL = 0;
         BENBL = 0;
-    }    
+    }
 }
 
 /*spiでの書き込み用関数*/
@@ -90,78 +93,88 @@
     unsigned int config;
     unsigned int value;
     
-    static unsigned int EX_MAX = 2510;//2.0[V]
+    static unsigned int EX_MAX = 2300;//2.0[V]
     static unsigned int Milky_MAX = 3150;//2.5[V]
     
-    /*前回の電圧の値と違う場合のみ実行される*/
-    if(ss==0 /*&& data[1]!=old_data[0]*/)
+    if(ss==0)//減らせる
     {
         /*EX球(2V2A)用*/
         config = 0b0111000000000000;
-        value = (data[1] * EX_MAX) / 255;
+        value = (data[1] * EX_MAX) * 0.0039215f;
         spi_write(config, mask, value);
         ss = 1;
     }
-    else if(ss==1 /*&& data[2]!=old_data[1]*/)
+    else if(ss==1)//減らせる
     {
         /*天の川(2.5V2A)用*/
         config = 0b1111000000000000;
-        value = (data[2] * Milky_MAX) / 255;
+        //value = (data[2] * Milky_MAX) / 255;
+        value = (data[1] * EX_MAX) * 0.0039215f;
         spi_write(config, mask, value);
         ss = 0;
     }
 }
 
-/*Hueの値deg(0~180)を受け取るとRGBに変換して反映させる*/
-void HSB2RGB(float deg)
+//light//
+void light(float val)
 {
-    /*リセット*/
-    R_led = 0.0;
-    G_led = 0.0;
+    R_led = val;
+    G_led = 0.38f*val;
     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;
-    }*/
+    
+    light((float)data[3]*0.0039215f);
+    
     signal = binary << dig;
+    
     if(++dig == 3)dig = 0;
 }
 
+void swap(unsigned char *x, unsigned char *y)
+{
+    unsigned char tmp;
+    tmp = *x;
+    *x = *y;
+    *y = tmp;
+}
+
+/*通信のスパイクノイズの除去*/
+/*k(奇数) の値で参照する過去の値の数を変更する*/
+unsigned char MedianFilter(unsigned char array[k])
+{
+    int i, j;
+    static int index = (int)(k-1)/2;
+    unsigned char tmp;
+    unsigned char N[k];
+    
+    /*copy*/
+    for(i=k-1; i>=0; i--)
+    {
+        N[i]=array[i];
+        if(i!=k-1)array[i+1] = array[i];
+    }
+    
+    for(i=0; i<index; i++)
+    {
+        for(j=k-1; i<j; j--)
+        {
+            if(N[j] < N[j-1])
+            {
+                //swap(&N[j], &N[j-1]);
+                tmp = N[j];
+                N[j] = N[j-1];
+                N[j-1] = tmp;
+            }
+        }
+    }
+    return N[index];
+}
+
 /*シリアル通信受信(xbee)*/
 void receve(void)
 {
@@ -173,18 +186,23 @@
     { 
         sw = 1;
     }
-    else if(1 <= sw && sw <= 6)
+    else if(1 <= sw && sw <= MAX)//条件式減らせる
     {
-        data[sw-1] = xbee.getc();
-        if(++sw > 6)sw = 0;
+        //data[sw-1] = xbee.getc();
+        
+        tmp_data[sw-1][0] = xbee.getc();
+        data[sw-1] = MedianFilter(tmp_data[sw-1]);
+        
+        if(++sw > MAX)sw = 0;
     }
+    xbee.putc(1);//受信確認
 }
 
 int main(){
     /*ステッピングモーター*/
-    AENBL = 1;
+    AENBL = 0;
     APHASE = 0;
-    BENBL = 1;
+    BENBL = 0;
     BPHASE = 0;
     step_timer.attach_us(&stepper, STEPPER_DELTA_T);//100[us],10000[Hz]
     
@@ -193,18 +211,18 @@
     LDAC = 1;
     spi.format(16, 0);
     spi.frequency(1000000);
-    spi_timer.attach_us(&light_bulb, 10000);
+    spi_timer.attach_us(&light_bulb, 50000);
     
     /*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);
+    R_led.period(0.000048);//0.00004
+    G_led.period(0.000048);
+    B_led.period(0.000048);
+    rgb_timer.attach_us(&RGB_LED, 4800);//4000
     
     /*シリアル通信(xbee)*/
     xbee.baud(9600);
-    xbee.format(8, Serial::None, 1);
+    xbee.format(8, Serial::None, 2);
     xbee.attach(&receve, Serial::RxIrq);//受信割り込み
     
-    while(1)__WFI();
+    while(1);
 }
\ No newline at end of file