ジェスチャーセンサ で LED をコントロール
DFROBOT様より、ありがたいことに部品提供頂きました!!
ここではジェスチャーセンサでフレキシブルLEDマトリクスの表示をコントロールしてみました。
目次
構成
LEDマトリクスにお得意の目ン玉を表示させてジェスチャーセンサで左右を向いたり、まぶたを開閉させてみました。
部品
- Arduino Uno
- フレキシブル 8×8 RGB LEDマトリクス
- 3D ジェスチャーセンサ
フレキシブル 8x8 RGB LEDマトリクス
フレキシブル基板にフルカラーLED (NeoPixel)が配置されており、割りとグニャグニャです。
NeoPixelのArduinoライブラリは以下にあります。
https://github.com/adafruit/Adafruit_NeoPixel
製品詳細は以下参照ください。
3D ジェスチャーセンサ
上下左右、真ん中に5つの電極が配置されており、電極の静電容量の手の接近による変化を検出して動作をセンシングします。
Arduinoライブラリは以下にあります。
https://github.com/DFRobot/DFRobot_Gesture
上記ライブラリのプログラム例 “_3D_Gesture_Test.ino“で上下左右、時計回り、反時計回りの動きを検出することができます。
製品詳細は以下参照ください。
Arduinoプログラム
LEDに目ン玉を表示させて、ジェスチャーセンサの左右センシングで瞳を左右にうごかし、上下センシングでまぶたを開閉させます。時計回りもしくは反時計回りセンシングで瞳が正面を向くようにしました。
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 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 |
#include <Adafruit_NeoPixel.h> #include <DFRobot_Gesture.h> #include <Wire.h> int sensePin= A1; unsigned char cmd; DFRobot_Gesture myGesture; #define DIN A0 Adafruit_NeoPixel led = Adafruit_NeoPixel(64, DIN, NEO_GRB + NEO_KHZ800); int LR = 5; int eyelid = 0; int whiteNum = 52; int blackNum = 20; int pupilNum = 12; //白目 int whiteLED[52] = { 2, 3, 4, 5, 9, 10, 11, 12, 13, 14, 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, 49, 50, 51, 52, 53, 54, 58, 59, 60, 61}; //黒目 int blackLED[11][20] = {{50, 51, 52, 53, 58, 61, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64}, {42, 43, 44, 45, 49, 50, 53, 54, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64}, {34, 35, 36, 37, 41, 42, 45, 46, 49, 54, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64}, {26, 27, 28, 29, 33, 34, 37, 38, 41, 46, 54, 49, 58, 61, 61, 64, 64, 64, 64, 64}, {18, 19, 20, 21, 25, 26, 29, 30, 33, 38, 41, 46, 49, 50, 53, 54, 58, 59, 60, 61}, {10, 11, 12, 13, 17, 18, 21, 22, 25, 30, 33, 38, 41, 42, 45, 46, 50, 51, 52, 53}, { 2, 3, 4, 5, 9, 10, 13, 14, 17, 22, 25, 30, 33, 34, 37, 38, 42, 43, 44, 45}, { 2, 5, 9, 14, 17, 22, 25, 26, 29, 30, 34, 35, 36, 37, 64, 64, 64, 64, 64, 64}, { 9, 14, 17, 18, 21, 22, 26, 27, 28, 29, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64}, { 9, 10, 13, 14, 18, 19, 20, 21, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64}, { 2, 5, 10, 11, 12, 13, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64}}; //瞳孔 int pupilLED[11][12] = {{59, 60, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64}, {51, 52, 58, 59, 60, 61, 64, 64, 64, 64, 64, 64}, {43, 44, 50, 51, 52, 53, 58, 59, 60, 61, 64, 64}, {35, 36, 42, 43, 44, 45, 50, 51, 52, 53, 59, 60}, {27, 28, 34, 35, 36, 37, 42, 43, 44, 45, 51, 52}, {19, 20, 26, 27, 28, 29, 34, 35, 36, 37, 43, 44}, {11, 12, 18, 19, 20, 21, 26, 27, 28, 29, 35, 36}, { 3, 4, 10, 11, 12, 13, 18, 19, 20, 21, 27, 28}, { 2, 3, 4, 5, 10, 11, 12, 13, 19, 20, 64, 64}, { 2, 3, 4, 5, 11, 12, 64, 64, 64, 64, 64, 64}, { 3, 4, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64}}; //まばたき用 int eyelidNum[8] = {0,4,8,14,20,28,36,44}; int eyelidLED[56] = {23, 24, 39, 40, 22, 25, 38, 41, 9, 21, 26, 37, 42, 54, 10, 20, 27, 36, 43, 53, 5, 11, 19, 28, 35, 44, 52, 58, 4, 12, 18, 29, 34, 45, 51, 59, 3, 13, 17, 30, 33, 46, 50, 60}; void setup(){ Wire.begin(); // join i2c bus (address optional for master) Serial.begin(115200); // start serial for output pinMode(sensePin, INPUT); led.begin(); led.setBrightness(100); //LED 輝度 0-255 blink(LR, eyelid); } void loop(){ if(digitalRead(sensePin)==0){ myGesture.I2C1_MasterRead(md.buf,26,0x42); //The address is:0x42 cmd = myGesture.mgcProcMsg(); //process the message if(cmd != GI_NOGESTURE ){ switch(cmd){ case GI_FLICK_R: Serial.println("RIGHT"); //瞳を右移動 for(int i = LR; i <= 10; i++){ blink(i, eyelid); delay(100); } LR = 10; break; case GI_FLICK_L: Serial.println("LEFT"); //瞳を左移動 for(int i = LR; i >= 0; i--){ blink(i, eyelid); delay(100); } LR = 0; break; case GI_FLICK_D: Serial.println("DOWN"); //まぶた閉じる for(int i = eyelid; eyelid <= 8; eyelid++){ blink(LR, eyelid); delay(100); } eyelid = 8; break; case GI_FLICK_U: Serial.println("UP"); //まぶた開ける for(int i = eyelid; eyelid >= 0; eyelid--){ blink(LR, eyelid); delay(100); } eyelid = 0; break; case GI_AIRWHEEL_CW://Clockwise in circles Serial.println("CW"); //瞳を正面に戻す Return(); break; case GI_AIRWHEEL_CCW://Counterclockwise circles Serial.println("CCW"); //瞳を正面に戻す Return(); break; default: break; } } } } void blink( int LR, int eyelid) { if (eyelid != 8){ //白目 for(uint16_t i=0; i<whiteNum; i++) { led.setPixelColor(whiteLED[i], led.Color(66, 66, 66)); } //黒目 for(uint16_t i=0; i<blackNum; i++) { led.setPixelColor(blackLED[LR][i], led.Color(0, 177, 55)); } //瞳孔 for(uint16_t i=0; i<pupilNum; i++) { led.setPixelColor(pupilLED[LR][i], led.Color(0, 0, 66)); } //まぶた for(int i=0; i < eyelidNum[eyelid]; i++) { led.setPixelColor(eyelidLED[i], 0); } } else if (eyelid == 8){ led.clear(); } led.show(); } void Return() { if(LR == 0){ for(int i = LR; i <= 5; i++){ blink(i, eyelid); delay(100); } } if(LR == 10){ for(int i = LR; i >= 5; i--){ blink(i, eyelid); delay(100); } } LR = 5; } |
動作
LED controlled by 3D gesture sensor #dfrobot pic.twitter.com/7XA5ZvgM3h
— HomeMadeGarbage (@H0meMadeGarbage) 2017年10月31日
ジェスチャーセンサ面白い!色々応用できそうです♪
フレキシブルLEDマトリクスもよく曲がるので帽子やカバンとかに付けても面白いかも(*^^*)