COTTONのタッチセンサの状態に応じてLEDスティック(8個)を制御

がじぇるね 藤本です。

GR-COTTONで、タッチセンサとLEDスティックで遊ぶサンプルです。

タッチセンサを長押し(長タッチ?)すると点灯しているLEDの数が減っていき、

タッチをやめるとLEDが8個点灯するまで戻ります。

COTTONとLEDスティックの接続 (USBを接続したまま使うことを想定しています。赤い線は"+"か"5V"どちらかにつなぎます。)

<プログラム>

/*GR-COTTON Sketch Template Version: E0.10*/
#include <Arduino.h>

#define DI() asm("di")
#define EI() asm("ei")

#define TAPELED_PIN 3 //pin for LEDs WS2812B
#define TAPELED_NUM 8 // number of led

#define TAPELED_PINREG P1.BIT.bit6 // register for rapid access to pin
#define TAPELED_ON TAPELED_PINREG = 1
#define TAPELED_OFF TAPELED_PINREG = 0

// Wait routine to construct the signal for LEDs.
// Needed to transfer the signal during DI because tight timing.
#define TAPELED_ON_WAIT0 NOP();NOP();NOP();NOP();NOP();NOP();
#define TAPELED_OFF_WAIT0 NOP();NOP();NOP();NOP();NOP();NOP();NOP();NOP();NOP();NOP();NOP();NOP();NOP();NOP();NOP();NOP();NOP();NOP();
#define TAPELED_ON_WAIT1 NOP();NOP();NOP();NOP();NOP();NOP();NOP();NOP();NOP();NOP();NOP();NOP();NOP();
#define TAPELED_OFF_WAIT1 NOP();NOP();NOP();NOP();NOP();NOP();NOP();NOP();NOP();NOP();


// COTTON LEDs
#define LED_R 22
#define LED_G 23
#define LED_B 24

void sendLedBuf(uint8_t* red, uint8_t* green, uint8_t* blue, uint8_t num);
void sendLedData(uint8_t red, uint8_t green, uint8_t blue);

unsigned int level = 0;

// the setup routine runs once when you press reset:
void setup()
{
  pinMode( TAPELED_PIN, OUTPUT );
}

// the loop routine runs over and over again forever:
void loop(){
  uint8_t buf_LEDs[TAPELED_NUM][3];
  if((analogRead(A6)<980)||(analogRead(A7)<980)){
    if(level!=7)level++;
    else level=7;
  }
  else {
    if(level!=0)level--;
    else level=0;
  }

  for(int i = 0; i < TAPELED_NUM; i++) {
    for (int j = 0; j < 3; j++) {
      if(level<=i)buf_LEDs[i][j] = 100;
      else buf_LEDs[i][j] = 0;
    }
  }
  for(int i = 0; i < TAPELED_NUM; i++){
    sendLedData(buf_LEDs[i][0], buf_LEDs[i][1], buf_LEDs[i][2]);
  }
  delay(200);

}

void sendLedBuf(uint8_t* red, uint8_t* green, uint8_t* blue, uint8_t num){
  for(int i = 0; i < num; i++){
    sendLedData(*(red + i), *(green + i), *(blue + i));
  }
}
void sendLedData(uint8_t red, uint8_t green, uint8_t blue){
  DI();
  if ( green & 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 ( green & 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 ( green & 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 ( green & 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 ( green & 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 ( green & 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 ( green & 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 ( green & 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;
  }


  if ( red & 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 ( red & 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 ( red & 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 ( red & 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 ( red & 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 ( red & 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 ( red & 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 ( red & 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;
  }


  if ( blue & 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 ( blue & 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 ( blue & 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 ( blue & 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 ( blue & 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 ( blue & 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 ( blue & 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 ( blue & 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;
  }
  EI();
}

cotton_serialLED-2016.02.10.zip
  • GR-COTTON のライブラリには fastDigitalWrite() というマクロがあるので、

    #define TAPELED_PINREG P1.BIT.bit6 // register for rapid access to pin

    #define TAPELED_ON TAPELED_PINREG = 1

    #define TAPELED_OFF TAPELED_PINREG = 0

    ↑の箇所を

    #include

    #define TAPELED_ON fastDigitalWrite(TAPELED_PIN, HIGH)

    #define TAPELED_OFF fastDigitalWrite(TAPELED_PIN, LOW)

    と書くのをオススメします。引数が定数ならば1命令にコンパイルされるのでレジスタ直アクセスとそん色ないコードに変換され、RL78 の内部のレジスタを意識しなくて良いのでいくらか可読性が向上します。コンパイラの都合でタイミングは変わるかもしれないので NOP() の数は要調整となるかもしれません。

  • あら、消えた。

    #include <fastio.h>

  • fujita様

    fastDigitalWriteというのがあるのですね。端子を調べなくて済むので便利ですね!ありがとうございます。

    (コメント欄で半角の<>を使うと消えてしまうみたいですね・・・)