最近のArduino IDEではボード追加で8pino(Trinket 8MHz)をプログラミングできるようになりました。価格は888円なので中国直送互換機には及びませんが、ボードの小ささでは群を抜いています。
I2Cの加速度センサーで姿勢を検知して傾けるとフルカラーLEDの色や光の強さが変わるようにプログラミングしてみました。
用意した機材
8pino
GY521(加速度・ジャイロセンサー)
マイコン内臓フルカラーLED
機能
加速度センサーで置き物の前後左右方向の傾きに応じて目に配置された2個のLEDの色と明るさが変化します。不感帯を設けて垂直に静止している時には光らないようにしています。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 |
// for 8pino 2017.01.05 Koji Ohashi #include<Wire.h> #include <Adafruit_NeoPixel.h> #define PIN 3 //2pixels, pin, RGB bitstream + 800 KHz bitstream Adafruit_NeoPixel strip = Adafruit_NeoPixel(2, PIN, NEO_RGB + NEO_KHZ800); const int MPU_addr=0x68; // I2C address of the MPU-6050 int AcX,AcY; byte Hue; int Value; byte R,G,B; void setup(){ Wire.begin(); Wire.beginTransmission(MPU_addr); Wire.write(0x6B); // PWR_MGMT_1 register Wire.write(0); // set to zero (wakes up the MPU-6050) Wire.endTransmission(true); pinMode(4, OUTPUT); strip.begin(); } void loop(){ Wire.beginTransmission(MPU_addr); Wire.write(0x3B); // starting with register 0x3B (ACCEL_XOUT_H) Wire.endTransmission(false); Wire.requestFrom(MPU_addr,4); // request a total of 14 registers AcX=Wire.read()<<8|Wire.read(); // 0x3B (ACCEL_XOUT_H) & 0x3C (ACCEL_XOUT_L) AcY=Wire.read()<<8|Wire.read(); // 0x3D (ACCEL_YOUT_H) & 0x3E (ACCEL_YOUT_L) Hue=byte((atan2(AcX,AcY)/3.14*180+180)/360*255); Value=max(abs(AcX),abs(AcY)); Value=max(Value-3276,0); Value=int(Value/13108.0*255); for(int i=0;i<2;i++){ strip.setPixelColor(i, HV2RGB(Hue,Value));} strip.show(); delay(100); } uint32_t HV2RGB(byte H, byte V) { H = 255 - H; float C= V/255.0; if(H < 85) { return strip.Color((255-H*3)*C, 0, H*3*C);} if(H < 170) { H = H - 85; return strip.Color(0, H*3*C, (255-H*3)*C);} H = H - 170; return strip.Color(H*3*C, (255-H*3)*C, 0); } |
メモリーが小さいのでプログラムもミニマル目指して推敲を重ねました。「最大5,310バイトのフラッシュメモリのうち、スケッチが5,176バイト(97%)を使っています。グローバル変数は69バイトのRAMを使用しています。」