#include // webコンパイラを使う場合はコメントにする #define DI() asm("di") #define EI() asm("ei") // 端子 マイコンリソース // D2 P3 テープLEDの制御 0xFFF03 アドレス #define TAPELED 2 #define VOLUME A0 #define LEDR 17 #define LEDG 51 #define LEDB 50 // テープLEDの信号を制御 #define TAPELED_ON (*(volatile unsigned char *)0xFFF03) = 1 #define TAPELED_OFF (*(volatile unsigned char *)0xFFF03) = 0 // テープLEDの時間待ち処理 #if 1 #define TAPELED_ON_WAIT1 dummy2++; dummy++; dummy1++ #define TAPELED_ON_WAIT0 for ( dummy = 0; dummy<0; dummy++ ) { ; }; dummy1++ #define TAPELED_OFF_WAIT1 for ( dummy = 0; dummy<0; dummy++ ) { ; }; dummy1++ #define TAPELED_OFF_WAIT0 for ( dummy = 0; dummy<1; dummy++ ) { ; }; dummy1++ #else #define TAPELED_ON_WAIT1 dummy2++; dummy++ #define TAPELED_ON_WAIT0 for ( dummy = 0; dummy<0; dummy++ ) { ; }; dummy1++ #define TAPELED_OFF_WAIT1 for ( dummy = 0; dummy<0; dummy++ ) { ; }; dummy1++ #define TAPELED_OFF_WAIT0 for ( dummy = 0; dummy<1; dummy++ ) { ; }; dummy1++ #endif #define TAPELED_WAIT for ( dummy2 = 0; dummy2<50; dummy2++ ) { ; } #define LEDDISTANCE 40 // テープLEDを時計モードにするA/D値 #define LEDMAX 16 // テープLEDに接続されているLEDの数 #define LEDDATAMAX 160 // テープLEDのカラーデータ数 void SetLed( void ); // テープLEDにデータを送る関数 int gAd0value; // HC-SR04 距離計用の変数 int Trig = 12; int Echo = 9; int Duration; float Distance; // テープLED LEDMAX分のバッファ uint8_t gtLedData[ LEDMAX ][ 3 ] = { { 0x00, 0x00, 0x00 } , { 0x00, 0x00, 0x00 } , { 0x00, 0x00, 0x00 } , { 0x00, 0x00, 0x00 } , { 0x00, 0x00, 0x00 } , { 0x00, 0x00, 0x00 } , { 0x00, 0x00, 0x00 } , { 0x00, 0x00, 0x00 } , { 0x00, 0x00, 0x00 } , { 0x00, 0x00, 0x00 } , { 0x00, 0x00, 0x00 } , { 0x00, 0x00, 0x00 } , { 0x00, 0x00, 0x00 } , { 0x00, 0x00, 0x00 } , { 0x00, 0x00, 0x00 } , { 0x00, 0x00, 0x00 } #if 0 { 0x00, 0x00, 0x00 } , { 0x00, 0x00, 0x00 } , { 0x00, 0x00, 0x00 } , { 0x00, 0x00, 0x00 } , { 0x00, 0x00, 0x00 } , { 0x00, 0x00, 0x00 } , { 0x00, 0x00, 0x00 } , { 0x00, 0x00, 0x00 } , { 0x00, 0x00, 0x00 } , { 0x00, 0x00, 0x00 } , { 0x00, 0x00, 0x00 } , { 0x00, 0x00, 0x00 } , { 0x00, 0x00, 0x00 } , { 0x00, 0x00, 0x00 } , { 0x00, 0x00, 0x00 } , { 0x00, 0x00, 0x00 } , { 0x00, 0x00, 0x00 } , { 0x00, 0x00, 0x00 } , { 0x00, 0x00, 0x00 } , { 0x00, 0x00, 0x00 } , { 0x00, 0x00, 0x00 } , { 0x00, 0x00, 0x00 } , { 0x00, 0x00, 0x00 } , { 0x00, 0x00, 0x00 } , { 0x00, 0x00, 0x00 } , { 0x00, 0x00, 0x00 } , { 0x00, 0x00, 0x00 } , { 0x00, 0x00, 0x00 } , { 0x00, 0x00, 0x00 } , { 0x00, 0x00, 0x00 } , { 0x00, 0x00, 0x00 } , { 0x00, 0x00, 0x00 } , { 0x00, 0x00, 0x00 } , { 0x00, 0x00, 0x00 } , { 0x00, 0x00, 0x00 } , { 0x00, 0x00, 0x00 } , { 0x00, 0x00, 0x00 } , { 0x00, 0x00, 0x00 } , { 0x00, 0x00, 0x00 } , { 0x00, 0x00, 0x00 } , { 0x00, 0x00, 0x00 } , { 0x00, 0x00, 0x00 } , { 0x00, 0x00, 0x00 } , { 0x00, 0x00, 0x00 } #endif }; // テープLED 色を変化させるためのデータテーブル 160個分 uint8_t gtLedColorData[ LEDDATAMAX ][ 3 ] = { // G R B { 0x00, 0x00, 0x00 } , // 1 { 0x00, 0x10, 0x00 } , { 0x00, 0x20, 0x00 } , { 0x00, 0x30, 0x00 } , { 0x00, 0x40, 0x00 } , { 0x00, 0x50, 0x00 } , { 0x00, 0x60, 0x00 } , { 0x08, 0x70, 0x00 } , { 0x00, 0x80, 0x00 } , { 0x08, 0x90, 0x00 } , { 0x00, 0xa0, 0x00 } , { 0x08, 0xb0, 0x00 } , { 0x00, 0xc0, 0x00 } , { 0x08, 0xd0, 0x00 } , { 0x00, 0xe0, 0x10 } , { 0x00, 0xf0, 0x20 } , { 0x00, 0x00, 0x30 } , // 2 { 0x00, 0x00, 0x40 } , { 0x00, 0x00, 0x50 } , { 0x00, 0x00, 0x60 } , { 0x00, 0x00, 0x70 } , { 0x00, 0x00, 0x80 } , { 0x00, 0x00, 0x90 } , { 0x00, 0x00, 0xa0 } , { 0x00, 0x00, 0xb0 } , { 0x00, 0x00, 0xc0 } , { 0x00, 0x00, 0xd0 } , { 0x00, 0x00, 0xe0 } , { 0x10, 0x00, 0x10 } , { 0x20, 0x00, 0x20 } , { 0x30, 0x00, 0x30 } , { 0x40, 0x00, 0x40 } , { 0x50, 0x00, 0x50 } , // 3 { 0x60, 0x00, 0x60 } , { 0x70, 0x00, 0x70 } , { 0x80, 0x00, 0x80 } , { 0x90, 0x00, 0x90 } , { 0xa0, 0x00, 0xa0 } , { 0xb0, 0x00, 0xb0 } , { 0xc0, 0x00, 0xc0 } , { 0xd0, 0x00, 0xd0 } , { 0xe0, 0x00, 0xe0 } , { 0x00, 0x10, 0x10 } , { 0x00, 0x20, 0x20 } , { 0x00, 0x30, 0x30 } , { 0x00, 0x40, 0x40 } , { 0x00, 0x50, 0x50 } , { 0x00, 0x60, 0x60 } , { 0x00, 0x70, 0x70 } , // 4 { 0x00, 0x80, 0x80 } , { 0x00, 0x90, 0x90 } , { 0x00, 0xa0, 0xa0 } , { 0x00, 0xb0, 0xb0 } , { 0x00, 0xc0, 0xc0 } , { 0x00, 0xd0, 0xd0 } , { 0x00, 0xe0, 0xe0 } , { 0x10, 0x10, 0x00 } , { 0x20, 0x20, 0x00 } , { 0x30, 0x30, 0x00 } , { 0x40, 0x40, 0x00 } , { 0x50, 0x50, 0x00 } , { 0x60, 0x60, 0x00 } , { 0x70, 0x70, 0x00 } , { 0x80, 0x80, 0x00 } , { 0x90, 0x90, 0x00 } , // 5 { 0xa0, 0xa0, 0x00 } , { 0xb0, 0xb0, 0x00 } , { 0xc0, 0xc0, 0x00 } , { 0xe0, 0xe0, 0x00 } , { 0xf0, 0xf0, 0x00 } , { 0xe0, 0xb0, 0x08 } , { 0xd0, 0x90, 0x10 } , { 0xc0, 0x80, 0x18 } , { 0xb8, 0x70, 0x20 } , { 0xb0, 0x60, 0x30 } , { 0xa8, 0x58, 0x40 } , { 0xa0, 0x50, 0x38 } , { 0x98, 0x48, 0x30 } , { 0x90, 0x40, 0x20 } , { 0x90, 0x38, 0x10 } , { 0x88, 0x30, 0x20 } , // 6 { 0x80, 0x28, 0x28 } , { 0x78, 0x20, 0x30 } , { 0x70, 0x18, 0x38 } , { 0x68, 0x10, 0x40 } , { 0x60, 0x20, 0x48 } , { 0x58, 0x30, 0x50 } , { 0x50, 0x40, 0x60 } , { 0x48, 0x50, 0x68 } , { 0x40, 0x60, 0x70 } , { 0x50, 0x70, 0x78 } , { 0x48, 0x80, 0x80 } , { 0x40, 0x90, 0x88 } , { 0x30, 0xa0, 0x90 } , { 0x20, 0xb0, 0xa0 } , { 0x10, 0xc0, 0xb0 } , { 0x20, 0xd0, 0xc0 } , // 7 { 0x30, 0xe0, 0xd0 } , { 0x40, 0xff, 0xe0 } , { 0x50, 0x90, 0xf0 } , { 0x60, 0x80, 0x80 } , { 0x70, 0x78, 0x78 } , { 0x80, 0x70, 0x70 } , { 0x90, 0x68, 0x68 } , { 0xa0, 0x60, 0x60 } , { 0xb0, 0x58, 0x58 } , { 0xc0, 0x50, 0x50 } , { 0xa0, 0x48, 0x48 } , { 0x80, 0x40, 0x40 } , { 0x60, 0x30, 0x30 } , { 0x4f, 0x20, 0x20 } , // 8 { 0x20, 0x10, 0x10 } , { 0x00, 0x00, 0x00 } , { 0x08, 0x08, 0x08 } , { 0x10, 0x10, 0x10 } , { 0x18, 0x18, 0x18 } , { 0x20, 0x20, 0x20 } , { 0x28, 0x28, 0x28 } , { 0x30, 0x30, 0x30 } , { 0x38, 0x38, 0x38 } , { 0x40, 0x40, 0x40 } , { 0x50, 0x50, 0x50 } , { 0x60, 0x60, 0x60 } , { 0x70, 0x70, 0x70 } , { 0x80, 0x80, 0x80 } , { 0x90, 0x90, 0x90 } , { 0xb0, 0xb0, 0xb0 } , // 9 { 0xe0, 0xe0, 0xe0 } , { 0xff, 0xff, 0xff } , { 0xff, 0xff, 0xff } , { 0xe0, 0xe0, 0xe0 } , { 0xd0, 0xd0, 0xd0 } , { 0xc0, 0xc0, 0xc0 } , { 0xb0, 0xb0, 0xb0 } , { 0xa8, 0xa8, 0xa8 } , { 0xa0, 0xa0, 0xa0 } , { 0x98, 0x98, 0x98 } , { 0x90, 0x90, 0x90 } , { 0x88, 0x88, 0x88 } , { 0x80, 0x80, 0x80 } , { 0x78, 0x78, 0x78 } , { 0x70, 0x70, 0x70 } , // 10 { 0x68, 0x68, 0x68 } , { 0x60, 0x60, 0x60 } , { 0x58, 0x58, 0x58 } , { 0x50, 0x50, 0x50 } , { 0x48, 0x48, 0x48 } , { 0x40, 0x40, 0x40 } , { 0x38, 0x38, 0x38 } , { 0x30, 0x30, 0x30 } , { 0x28, 0x28, 0x28 } , { 0x20, 0x20, 0x20 } , { 0x18, 0x18, 0x18 } , { 0x10, 0x10, 0x10 } , { 0x00, 0x00, 0x00 } , { 0x00, 0x00, 0x00 } , { 0x00, 0x00, 0x00 } }; // the setup routine runs once when you press reset: void setup() { pinMode( Trig,OUTPUT ); pinMode( Echo,INPUT ); pinMode( LEDR, OUTPUT ); pinMode( LEDG, OUTPUT ); pinMode( LEDB, OUTPUT ); digitalWrite( LEDR, HIGH ); digitalWrite( LEDG, HIGH ); digitalWrite( LEDB, HIGH ); pinMode( TAPELED, OUTPUT ); Serial.begin( 9600 ); // シリアルモニタの通信速度 } // the loop routine runs over and over again forever: void loop() { uint8_t datg, datr, datb; uint16_t datadrs, distance_u; char msg[128]; // 距離を計測 digitalWrite( Trig, LOW ); delayMicroseconds( 1 ); digitalWrite( Trig, HIGH ); delayMicroseconds( 11 ); digitalWrite( Trig, LOW ); Duration = pulseIn( Echo, HIGH ); if ( Duration > 0 ) { Distance = Duration/2; Distance = Distance*340*100/1000000; // ultrasonic speed is 340m/s = 34000cm/s = 0.034cm/us distance_u = (uint16_t)Distance; sprintf( msg," %d us, %f cm, %d cm", Duration, Distance, distance_u ); Serial.println( msg ); } if ( distance_u > 100 ) { // 距離が100cm以上なら LEDを消灯する datadrs = 0; } else if ( distance_u < 20 ) { // 距離が20cm以下なら警告LED色とする datadrs = 15; } else { // それ以外の距離は、距離に応じたデータを送出 datadrs = distance_u; } datg = gtLedColorData[ datadrs ][ 0 ]; gtLedData[ 0 ][ 0 ] = datg; datr = gtLedColorData[ datadrs ][ 1 ]; gtLedData[ 0 ][ 1 ] = datr; datb = gtLedColorData[ datadrs ][ 2 ]; gtLedData[ 0 ][ 2 ] = datb; SetLed(); delay( 100 ); } // テープLEDにデータを送る void SetLed( void ) { uint8_t datg, datr, datb, ledloop; volatile uint8_t dummy; volatile uint16_t dummy1; volatile uint32_t dummy2; // 割り込みを禁止して、データ送信がずれないようにする DI(); for ( ledloop = 0; ledloop < LEDMAX; ledloop++ ) { datg = gtLedData[ ledloop ][ 0 ]; datr = gtLedData[ ledloop ][ 1 ]; datb = gtLedData[ ledloop ][ 2 ]; // 緑LED if ( datg & 0x80 ) { // on data send TAPELED_ON; TAPELED_ON_WAIT1; TAPELED_OFF; TAPELED_OFF_WAIT1; } else { // off data send TAPELED_ON; TAPELED_ON_WAIT0; TAPELED_OFF; TAPELED_OFF_WAIT0; } if ( datg & 0x40 ) { // on data send TAPELED_ON; TAPELED_ON_WAIT1; TAPELED_OFF; TAPELED_OFF_WAIT1; } else { // off data send TAPELED_ON; TAPELED_ON_WAIT0; TAPELED_OFF; TAPELED_OFF_WAIT0; } if ( datg & 0x20 ) { // on data send TAPELED_ON; TAPELED_ON_WAIT1; TAPELED_OFF; TAPELED_OFF_WAIT1; } else { // off data send TAPELED_ON; TAPELED_ON_WAIT0; TAPELED_OFF; TAPELED_OFF_WAIT0; } if ( datg & 0x10 ) { // on data send TAPELED_ON; TAPELED_ON_WAIT1; TAPELED_OFF; TAPELED_OFF_WAIT1; } else { // off data send TAPELED_ON; TAPELED_ON_WAIT0; TAPELED_OFF; TAPELED_OFF_WAIT0; } if ( datg & 0x08 ) { // on data send TAPELED_ON; TAPELED_ON_WAIT1; TAPELED_OFF; TAPELED_OFF_WAIT1; } else { // off data send TAPELED_ON; TAPELED_ON_WAIT0; TAPELED_OFF; TAPELED_OFF_WAIT0; } if ( datg & 0x04 ) { // on data send TAPELED_ON; TAPELED_ON_WAIT1; TAPELED_OFF; TAPELED_OFF_WAIT1; } else { // off data send TAPELED_ON; TAPELED_ON_WAIT0; TAPELED_OFF; TAPELED_OFF_WAIT0; } if ( datg & 0x02 ) { // on data send TAPELED_ON; TAPELED_ON_WAIT1; TAPELED_OFF; TAPELED_OFF_WAIT1; } else { // off data send TAPELED_ON; TAPELED_ON_WAIT0; TAPELED_OFF; TAPELED_OFF_WAIT0; } if ( datg & 0x01 ) { // on data send TAPELED_ON; TAPELED_ON_WAIT1; TAPELED_OFF; TAPELED_OFF_WAIT1; } else { // off data send TAPELED_ON; TAPELED_ON_WAIT0; TAPELED_OFF; TAPELED_OFF_WAIT0; } // 赤LED if ( datr & 0x80 ) { // on data send TAPELED_ON; TAPELED_ON_WAIT1; TAPELED_OFF; TAPELED_OFF_WAIT1; } else { // off data send TAPELED_ON; TAPELED_ON_WAIT0; TAPELED_OFF; TAPELED_OFF_WAIT0; } if ( datr & 0x40 ) { // on data send TAPELED_ON; TAPELED_ON_WAIT1; TAPELED_OFF; TAPELED_OFF_WAIT1; } else { // off data send TAPELED_ON; TAPELED_ON_WAIT0; TAPELED_OFF; TAPELED_OFF_WAIT0; } if ( datr & 0x20 ) { // on data send TAPELED_ON; TAPELED_ON_WAIT1; TAPELED_OFF; TAPELED_OFF_WAIT1; } else { // off data send TAPELED_ON; TAPELED_ON_WAIT0; TAPELED_OFF; TAPELED_OFF_WAIT0; } if ( datr & 0x10 ) { // on data send TAPELED_ON; TAPELED_ON_WAIT1; TAPELED_OFF; TAPELED_OFF_WAIT1; } else { // off data send TAPELED_ON; TAPELED_ON_WAIT0; TAPELED_OFF; TAPELED_OFF_WAIT0; } if ( datr & 0x08 ) { // on data send TAPELED_ON; TAPELED_ON_WAIT1; TAPELED_OFF; TAPELED_OFF_WAIT1; } else { // off data send TAPELED_ON; TAPELED_ON_WAIT0; TAPELED_OFF; TAPELED_OFF_WAIT0; } if ( datr & 0x04 ) { // on data send TAPELED_ON; TAPELED_ON_WAIT1; TAPELED_OFF; TAPELED_OFF_WAIT1; } else { // off data send TAPELED_ON; TAPELED_ON_WAIT0; TAPELED_OFF; TAPELED_OFF_WAIT0; } if ( datr & 0x02 ) { // on data send TAPELED_ON; TAPELED_ON_WAIT1; TAPELED_OFF; TAPELED_OFF_WAIT1; } else { // off data send TAPELED_ON; TAPELED_ON_WAIT0; TAPELED_OFF; TAPELED_OFF_WAIT0; } if ( datr & 0x01 ) { // on data send TAPELED_ON; TAPELED_ON_WAIT1; TAPELED_OFF; TAPELED_OFF_WAIT1; } else { // off data send TAPELED_ON; TAPELED_ON_WAIT0; TAPELED_OFF; TAPELED_OFF_WAIT0; } // 青LED if ( datb & 0x80 ) { // on data send TAPELED_ON; TAPELED_ON_WAIT1; TAPELED_OFF; TAPELED_OFF_WAIT1; } else { // off data send TAPELED_ON; TAPELED_ON_WAIT0; TAPELED_OFF; TAPELED_OFF_WAIT0; } if ( datb & 0x40 ) { // on data send TAPELED_ON; TAPELED_ON_WAIT1; TAPELED_OFF; TAPELED_OFF_WAIT1; } else { // off data send TAPELED_ON; TAPELED_ON_WAIT0; TAPELED_OFF; TAPELED_OFF_WAIT0; } if ( datb & 0x20 ) { // on data send TAPELED_ON; TAPELED_ON_WAIT1; TAPELED_OFF; TAPELED_OFF_WAIT1; } else { // off data send TAPELED_ON; TAPELED_ON_WAIT0; TAPELED_OFF; TAPELED_OFF_WAIT0; } if ( datb & 0x10 ) { // on data send TAPELED_ON; TAPELED_ON_WAIT1; TAPELED_OFF; TAPELED_OFF_WAIT1; } else { // off data send TAPELED_ON; TAPELED_ON_WAIT0; TAPELED_OFF; TAPELED_OFF_WAIT0; } if ( datb & 0x08 ) { // on data send TAPELED_ON; TAPELED_ON_WAIT1; TAPELED_OFF; TAPELED_OFF_WAIT1; } else { // off data send TAPELED_ON; TAPELED_ON_WAIT0; TAPELED_OFF; TAPELED_OFF_WAIT0; } if ( datb & 0x04 ) { // on data send TAPELED_ON; TAPELED_ON_WAIT1; TAPELED_OFF; TAPELED_OFF_WAIT1; } else { // off data send TAPELED_ON; TAPELED_ON_WAIT0; TAPELED_OFF; TAPELED_OFF_WAIT0; } if ( datb & 0x02 ) { // on data send TAPELED_ON; TAPELED_ON_WAIT1; TAPELED_OFF; TAPELED_OFF_WAIT1; } else { // off data send TAPELED_ON; TAPELED_ON_WAIT0; TAPELED_OFF; TAPELED_OFF_WAIT0; } if ( datb & 0x01 ) { // on data send TAPELED_ON; TAPELED_ON_WAIT1; TAPELED_OFF; TAPELED_OFF_WAIT1; } else { // off data send TAPELED_ON; TAPELED_ON_WAIT0; TAPELED_OFF; TAPELED_OFF_WAIT0; } } // テープLEDのバッファをずらして、流れる表示にする for ( ledloop = LEDMAX - 1; ledloop > 0; ledloop-- ) { datg = gtLedData[ ledloop - 1 ][ 0 ]; gtLedData[ ledloop ][ 0 ] = datg; datr = gtLedData[ ledloop - 1 ][ 1 ]; gtLedData[ ledloop ][ 1 ] = datr; datb = gtLedData[ ledloop - 1 ][ 2 ]; gtLedData[ ledloop ][ 2 ] = datb; } EI(); }