Frduino デモ4



※加速度センサーのREADが出鱈目だったので修正しました。

現状のデモのsketchを掲載します。
動作チェックと、加速度センサーの設定の参考にしてください。
動作内容は、

・単色LED明滅
・RGB LED PWM点灯
・振った時だけ、POV表示(加速度センサーで検知)
・しばらくするとパワーセーブ
・SW1で復帰


です。振らないと光らないのはバッテリーに優しいPOV。
WireライブラリーはIDE1.0では、以前のバージョンと
コマンドの表記が変わっているので注意。


//Frduino DEMO4.1

#include <Wire.h>
#include <avr/sleep.h>


unsigned char i,j,k,w2=15,val,wait=2;
unsigned int c;
unsigned char ledpin[]={4,2,16,17,15,14,13,9,8,7};
unsigned char pwmpin[]={3,5,6};
unsigned char rdata[4];
byte shdet;
int  MMA7660 = 0x4C  ;
#define WAIT 10

//POV
#define DELAYMS 4    // 点滅間隔(ミリ秒で指定)
int LEDPINS[]={15,17,16,2,4};

byte bitmap[]={
0b01000,
0b11110,
0b11110,
0b01111,
0b11110,
0b11110,
0b01000,
0b00000,
0b00000,
0b00000,
0b00000,
0b00000,
0b00000,
0b11111,
0b10100,
0b10100,
0b10000,
0b00000,
0b00000,
0b11111,
0b10100,
0b10100,
0b01011,
0b00000,
0b00000,
0b11111,
0b10001,
0b10001,
0b01110,
0b00000,
0b00000,
0b11110,
0b00001,
0b00001,
0b11110,
0b00000,
0b00000,
0b10001,
0b11111,
0b10001,
0b00000,
0b00000,
0b00000,
0b11111,
0b01100,
0b00010,
0b11111,
0b00000,
0b00000,
0b01110,
0b10001,
0b10001,
0b01110,
0b00000,
};
#define  BITMAPLEN 54

unsigned char pos = 0;
//


void setup() {

    for(i = 0; i < 10; i++){ 
    pinMode(ledpin[i],OUTPUT);
    digitalWrite(ledpin[i],LOW);
  }

  for(i = 0; i < 3; i++){ 
    analogWrite(pwmpin[i],255);
  }  

  Serial.begin(9600);  


   //I2C通信開始 
  Wire.begin();
  
  Wire.beginTransmission(MMA7660); // transmit to device #
  Wire.write(byte(0x06));              // sends one byte  
 //   delay(WAIT);
  Wire.write(byte(0xFF)); //add:0x06 
//    delay(WAIT);
  Wire.write(0x59); //add:0x07
 //   delay(WAIT);
  Wire.write(byte(0x20)); //add:0x08
 //   delay(WAIT);
  Wire.write(byte(0x00)); //add:0x09
 //   delay(WAIT);
  Wire.write(byte(0xE0)); //add:0x0A
   delay(WAIT);
  
  Wire.endTransmission();    // stop transmitting
  
  
  Serial.println("DEMO START");


 //sleep 
  pinMode(2,INPUT); 
  digitalWrite(2,HIGH); 
  set_sleep_mode(SLEEP_MODE_PWR_DOWN);   
  sleep_enable();    
  attachInterrupt(0, powon, LOW );

}


void pov()
{
  pinMode(2,OUTPUT);  
  for(k=0; k<128; k++){
  
       for(i = 0; i < 5; i++) 
    {    // 表示する1byteから1bitを取り出してピンの状態に反映    
    	digitalWrite(LEDPINS[i], (bitmap[pos] >> i) & 0b00000001);  
    } 
     
    if(++pos == BITMAPLEN) pos = 0;  delay(DELAYMS);

  }
  pinMode(2,INPUT); 
  digitalWrite(2,HIGH); 
}

void rgbpwm()
{
  for(i = 128; i > 0; i--){ 
    for(k=0;k<3;k++){
    analogWrite(pwmpin[k],i);
    }        
    delay(wait); 
  }

  for(i = 0; i < 128; i++){ 
    for(k=0;k<3;k++){
    analogWrite(pwmpin[k],i); 
    }
    delay(wait); 
  }        

    for(k=0;k<3;k++){
    analogWrite(pwmpin[k],255); 
    }
    delay(200);
  
}


void powon()
{  
}


void ledoff()
{
    digitalWrite(ledpin[0],LOW);
    for(i = 2; i < 10; i++){ 
      digitalWrite(ledpin[i],LOW);
    }
}


void loop() {

  
//LED ON-OFF 
  pinMode(2,OUTPUT);  
  
  for(i = 0; i < 10; i++){ 
      digitalWrite(ledpin[i],HIGH);
      delay(50);
    }   
  for(i = 9; i > 0; i--){ 
      digitalWrite(ledpin[i],LOW);
      delay(25);
    }   
      digitalWrite(ledpin[0],LOW);


//RGB PWM
for(k=0;k<3;k++){
  
    
  for(i = 255; i > 0; i--){ 
        analogWrite(pwmpin[k],i);
        delay(wait); 
  }
  for(i = 0; i < 255; i++){ 
        analogWrite(pwmpin[k],i); 
        delay(wait); 
  }        
      analogWrite(pwmpin[k],255); 
  }    

//White
  rgbpwm();


 pinMode(2,INPUT); 
 digitalWrite(2,HIGH); 



//Axis
for(c=0; c<64 ;c++){
  
  delay(200);
  i=0;
    Wire.requestFrom(MMA7660, 4);    // request 4 bytes from slave device #MX6225Add
    while(Wire.available())    // slave may send less than requested
    { 
      rdata[i] = Wire.read(); // receive a byte as character
      Serial.print("DATA[");
      Serial.print(i);   
      Serial.print("]:");      
      Serial.println(rdata[i],HEX);  
      i++;
    }
    Serial.println("");    
    Serial.print("DATA[3]:"); 
    Serial.println(rdata[3],BIN);
    Serial.println(""); 

//  for(i=0; i<8; i++) {
  // 表示する1byteから1bitを取り出してピンの状態に反映
//  digitalWrite(ledpin[2 + i], (rdata >> i) & 0x01);
//  }


  shdet = rdata[3] & 0x80;
  if (shdet == 0x80) {
  
    //shake??
   Serial.println("SHAKE!");
    pov();
    ledoff();
    pinMode(2,INPUT); 
    digitalWrite(2,HIGH); 

  }  
}

//sleep
  ledoff(); 
  for(i = 0; i < 3; i++){ 
    analogWrite(pwmpin[i],255);
  }  
 sleep_mode(); 

}