![](/media/cache/profiles/51207371af261a5765e1ce9d4f56997a.jpg.50x50_q85.png)
投影機本体のプログラム
Fork of AstroC_planetarium_master by
Diff: main.cpp
- 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