Leafony の応用を楽しむ
前回はいただいたLeafonyの基本動作を堪能いたしました。
ここでは Extension Kit A1.0 の基板(Leaf)も活用して、ちょっと応用いたしました。
目次
Extension Kit A1.0
Extension Kit A1.0には たくさんのLeafが同梱されておりました。
多いので一個一個は取り上げません。以下参照くださいw
https://leafony.com/extension-kit-a1-0/
以下の試してみた応用で使用したLeafの紹介をさせていただきます。
ブザー制御
ブザーの出力周波数を可変抵抗で制御する、楽器なようなものを作ってみました。
使用したLeafは以下の通りです。
- AVR MCU Leaf (Basic Kit A1.0)
- CR2032 ボタン電池Leaf (Basic Kit A1.0)
- USBシリアルLeaf (Basic Kit A1.0)
- 並列接続Leaf (Extension Kit A1.0)
- 圧電スピーカ・人感センサLeaf (Extension Kit A1.0)
- MEMSマイク・ボリューム・LED Leaf (Extension Kit A1.0)
動作
ボリュームに連動してブザーの周波数も変更します。
LEDもボリュームに連動させてみました。
テルミンもしくはエキサイトバイクのような味わいを実現することができました。
Leafony のブザーを楽しむ pic.twitter.com/LgsBWulZng
— HomeMadeGarbage (@H0meMadeGarbage) June 16, 2020
Arduinoコード
ブザーについては以下の応用例を参考にいたしました。
https://trillion-node.org/example/sp_pir-melody/
ボリュームとLEDについては以下を参考にいたしました。
https://trillion-node.org/example/mic-vr-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 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 |
#include <Wire.h> //===================================================================== // IOピンの名前定義 // 接続するリーフに合わせて定義する //===================================================================== // -------------------------------------------- // PD port // digital 0: PD0 = PCRX (HW UART) // digital 1: PD1 = PCTX (HW UART) // digital 2: PD2 = PIR INT0 // digital 3: PD3 = MIC&VR&LED Leaf LED1 // digital 4: PD4 = MIC&VR&LED Leaf LED2 // digital 5: PD5 = MIC&VR&LED Leaf LED3 SP // digital 6: PD6 = MIC&VR&LED Leaf LED4 // digital 7: PD7 = MIC&VR&LED Leaf LED5 // -------------------------------------------- #define PCTX 0 #define PCRX 1 #define INT0 2 #define INT1 3 #define D4 4 #define SP 5 #define LED1 6 #define LED2 7 // -------------------------------------------- // PB port // digital 8: PB0 = MIC&VR&LED Leaf LED6 // digital 9: PB1 = D9 /* not use */ // digital 10:PB2 = SS# // digital 11:PB3 = MOSI // digital 12:PB4 = MISO // digital 13:PB5 = SCK (LED) // PB6 = XTAL1 // PB7 = XTAL2 //--------------------------------------------- #define LED3 8 #define LED4 9 #define LED5 10 #define LED6 11 #define MISO 12 #define AVR_LED 13 // -------------------------------------------- // PC port // digital 14/ Analog0: PC0 = D14 // digital 15/ Analog1: PC1 = D15 // digital 16/ Analog2: PC2 = MIC // digital 17/ Analog3: PC3 = VR // digital 18/ SDA : PC4 = SDA (I2C) // digital 19/ SCL : PC5 = SCL (I2C) // RESET : PC6 = RESET# //----------------------------------------------- #define D14 14 #define D15 15 #define MIC 16 #define VR 17 #define SDA 18 #define SCL 19 unsigned int dataVR; //===================================================================== // setup //===================================================================== //----------------------------------------------- // port //----------------------------------------------- //===================================================================== // IOピンの入出力設定 // 接続するリーフに合わせて設定する //===================================================================== void setupPort(){ //--------------------- // PD port //--------------------- // PD0 : digital 0 = RX // PD1 : digital 1 = TX pinMode(INT0, INPUT); // PD2 : digital 2 = INT0# pinMode(INT1, INPUT); // PD3 : digital 3 = INT1# pinMode(D4, INPUT); // PD4 : digital 4 = not used pinMode(SP, OUTPUT); // PD5 : digital 5 = SP not used digitalWrite(SP, LOW); pinMode(LED1, OUTPUT); // PD6 : digital 6 = LED1 digitalWrite(LED1, LOW); pinMode(LED2, OUTPUT); // PD7 : digital 7 = LED2 digitalWrite(LED2, LOW); //--------------------- // PB port //--------------------- pinMode(LED3, OUTPUT); // PB0 : digital 8 = LED3 digitalWrite(LED3, LOW); pinMode(LED4, OUTPUT); // PB1 : digital 9 = LED4 digitalWrite(LED4, LOW); pinMode(LED5, OUTPUT); // PB2 : digital 10 = LED5 digitalWrite(LED5, LOW); pinMode(LED6, OUTPUT); // PB3 : digital 11 = LED6 digitalWrite(LED6, LOW); pinMode(MISO, INPUT); // PB4 : digital 12 = not used pinMode(AVR_LED, OUTPUT); // PB5 : digital 13 =LED on 8bit-Dev. Leaf digitalWrite(AVR_LED, LOW); //--------------------- // PC port //--------------------- pinMode(D14, INPUT); // PC0 : digital 14 = not used pinMode(D15, INPUT); // PC1 : digital 14 = not used pinMode(MIC, INPUT); // PC2 : digital 14 = not used pinMode(VR, INPUT); // PC3 : digital 14 = not used // PC4 : digital 18 = I2C SDA // PC5 : digital 19 = I2C SCL } //----------------------------------------------- // setup //----------------------------------------------- void setup() { setupPort(); Serial.begin(115200); Serial.println("start!!"); digitalWrite(LED1,LOW); digitalWrite(LED2,LOW); digitalWrite(LED3,LOW); digitalWrite(LED4,LOW); digitalWrite(LED5,LOW); digitalWrite(LED6,LOW); // delay(2000); } //----------------------------------------------- // Main //----------------------------------------------- void loop() { dataVR = map(analogRead(A3),0, 933, 5000, 100); int led = map(dataVR, 100, 5000, 0, 7); Serial.print(dataVR); Serial.print("\t"); Serial.println(led); tone(5, dataVR); if(led == 1){ digitalWrite(LED1,HIGH); digitalWrite(LED2,LOW); digitalWrite(LED3,LOW); digitalWrite(LED4,LOW); digitalWrite(LED5,LOW); digitalWrite(LED6,LOW); }else if(led == 2){ digitalWrite(LED1,HIGH); digitalWrite(LED2,HIGH); digitalWrite(LED3,LOW); digitalWrite(LED4,LOW); digitalWrite(LED5,LOW); digitalWrite(LED6,LOW); }else if(led == 3){ digitalWrite(LED1,HIGH); digitalWrite(LED2,HIGH); digitalWrite(LED3,HIGH); digitalWrite(LED4,LOW); digitalWrite(LED5,LOW); digitalWrite(LED6,LOW); }else if(led == 4){ digitalWrite(LED1,HIGH); digitalWrite(LED2,HIGH); digitalWrite(LED3,HIGH); digitalWrite(LED4,HIGH); digitalWrite(LED5,LOW); digitalWrite(LED6,LOW); }else if(led == 5){ digitalWrite(LED1,HIGH); digitalWrite(LED2,HIGH); digitalWrite(LED3,HIGH); digitalWrite(LED4,HIGH); digitalWrite(LED5,HIGH); digitalWrite(LED6,LOW); }else if(led >= 6){ digitalWrite(LED1,HIGH); digitalWrite(LED2,HIGH); digitalWrite(LED3,HIGH); digitalWrite(LED4,HIGH); digitalWrite(LED5,HIGH); digitalWrite(LED6,HIGH); }else{ digitalWrite(LED1,LOW); digitalWrite(LED2,LOW); digitalWrite(LED3,LOW); digitalWrite(LED4,LOW); digitalWrite(LED5,LOW); digitalWrite(LED6,LOW); } } |
Groveセンサ
Grove拡張基板にセンサをつけて結果をLCDに表示させてみました。
Extension Kit A1.0 にはGrove拡張Leaf に加えてArduinoシールド拡張Leaf も同梱されておりまさにExtensionで様々な応用ができそうです。
https://trillion-node.org/leaf-technical-data/ax-extender/
ここでは以下のLeafを使用しました。
- AVR MCU Leaf (Basic Kit A1.0)
- USBシリアルLeaf (Basic Kit A1.0)
- 並列接続Leaf (Extension Kit A1.0)
- Grove拡張Leaf (Extension Kit A1.0)
- LCD Leaf (Extension Kit A1.0)
- 単三電池Leaf (Extension Kit A1.0)
電源Leaf
Leafonyにはボタン電池や単三電池を3.3Vに昇圧するLeafがあり非常に便利です。
これによって非常にユビキタスな応用が可能となります。
https://trillion-node.org/leaf-technical-data/av-voltage-supply/
Grove拡張Leaf
Grove拡張Leaf はUART、I2C、アナログ入力、デジタル入力の4種のGrove4ピン端子を有し、電源Leafからの3.3Vを5Vに昇圧して電源供給します。
Groveセンサ類には3.3Vでは駆動できない製品も多いので5V供給は非常にありがたい心遣いです。
動作
I2C通信のジェスチャーモジュールを接続して認識結果をLCDに表示させています。
Leafony
Grove拡張基板にジェスチャーセンサつけて
LCDに表示 pic.twitter.com/F1EDhh4BDY— HomeMadeGarbage (@H0meMadeGarbage) June 17, 2020
Arduinoコード
Grove拡張及びLCD表示については以下を参考にしました。
https://trillion-node.org/example/grove-distance/
ジェスチャーモジュールPAJ7620 のライブラリは以下を使用しました。
https://github.com/Seeed-Studio/Gesture_PAJ7620
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 |
#include <Wire.h> #include <ST7032.h> #include "paj7620.h" // LCD ST7032 lcd; #define GES_REACTION_TIME 500 // You can adjust the reaction time according to the actual circumstance. #define GES_ENTRY_TIME 800 // When you want to recognize the Forward/Backward gestures, your gestures' reaction time must less than GES_ENTRY_TIME(0.8s). #define GES_QUIT_TIME 1000 void setup() { uint8_t error = 0; Serial.begin(115200); Serial.println("\nPAJ7620U2 TEST DEMO: Recognize 9 gestures."); error = paj7620Init(); // initialize Paj7620 registers if (error) { Serial.print("INIT ERROR,CODE:"); Serial.println(error); } else { Serial.println("INIT OK"); } Serial.println("Please input your gestures:\n"); //LCD Initialize lcd.begin(8, 2); lcd.setContrast(30); lcd.print(" Hello!"); delay(1000); lcd.clear(); } String Move; void loop() { uint8_t data = 0, data1 = 0, error; error = paj7620ReadReg(0x43, 1, &data); // Read Bank_0_Reg_0x43/0x44 for gesture result. if (!error) { switch (data) // When different gestures be detected, the variable 'data' will be set to different values by paj7620ReadReg(0x43, 1, &data). { case GES_RIGHT_FLAG: delay(GES_ENTRY_TIME); paj7620ReadReg(0x43, 1, &data); if(data == GES_FORWARD_FLAG) { Move = "Forward"; Serial.println("Forward"); delay(GES_QUIT_TIME); } else if(data == GES_BACKWARD_FLAG) { Move = "Backward"; Serial.println("Backward"); delay(GES_QUIT_TIME); } else { Move = " Right"; Serial.println(" Right"); } break; case GES_LEFT_FLAG: delay(GES_ENTRY_TIME); paj7620ReadReg(0x43, 1, &data); if(data == GES_FORWARD_FLAG) { Move = "Forward"; Serial.println("Forward"); delay(GES_QUIT_TIME); } else if(data == GES_BACKWARD_FLAG) { Move = "Backward"; Serial.println("Backward"); delay(GES_QUIT_TIME); } else { Move = " Left"; Serial.println(" Left"); } break; case GES_UP_FLAG: delay(GES_ENTRY_TIME); paj7620ReadReg(0x43, 1, &data); if(data == GES_FORWARD_FLAG) { Move = "Forward"; Serial.println("Forward"); delay(GES_QUIT_TIME); } else if(data == GES_BACKWARD_FLAG) { Move = "Backward"; Serial.println("Backward"); delay(GES_QUIT_TIME); } else { Move = " Up"; Serial.println(" Up"); } break; case GES_DOWN_FLAG: delay(GES_ENTRY_TIME); paj7620ReadReg(0x43, 1, &data); if(data == GES_FORWARD_FLAG) { Move = "Forward"; Serial.println("Forward"); delay(GES_QUIT_TIME); } else if(data == GES_BACKWARD_FLAG) { Move = "Backward"; Serial.println("Backward"); delay(GES_QUIT_TIME); } else { Move = " Down"; Serial.println(" Down"); } break; case GES_FORWARD_FLAG: Move = "Forward"; Serial.println("Forward"); delay(GES_QUIT_TIME); break; case GES_BACKWARD_FLAG: Move = "Backward"; Serial.println("Backward"); delay(GES_QUIT_TIME); break; case GES_CLOCKWISE_FLAG: Serial.println("Clockwise"); break; case GES_COUNT_CLOCKWISE_FLAG: Serial.println("anti-clockwise"); break; default: paj7620ReadReg(0x44, 1, &data1); if (data1 == GES_WAVE_FLAG) { Serial.println("wave"); } break; } lcd.clear(); lcd.print(Move); } delay(100); } |
シリアルモニタ
Arduino IDE (ver 1.8.12)にてSerial.begin(115200) でシリアル出力の設定をしているのですが、シリアルモニタではなぜか文字化けしていました。
シリアルモニタでボーレート57600 bpsにすると 文字化けせずに出力された。
不思議だね