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(); }