Bonsoir,
Je me permet de revenir. Mon projet avance bien. Maintenant je suis confronté à un problème et sans réponse.
J'essaye de faire fonctionner le keypad, mais impossible. Tous les potentiomètres fonctionnent, mais pas les boutons.
Les différents numéros de pin sont bon.
#include <Wire.h> #include <Keypad.h> #include <Firmata.h> #define BITSB 8 #define TOLERANCE 10 #define Data0 32 //15 #define Data1 30 //16 #define Data2 28 //17 #define Data3 24 //19 #define Data4 23 // #define Data5 27 // #define Data6 31 // #define Data7 35 // #define W0 40 // #define W1 38 // #define W2 36 // #define W3 34 // #define AnalRead 33 //5 #define AnalConv 29 //7 #define LEDwrite 26 //18 #define buttread 22 //20 #define Display 25 //9 #define ON 1 #define OFF 0 int DecoderPins[] = {40, 38, 36, 34}; int BlinkCount = 0; int BlinkStatus = 0; byte AnalogPreviousValues [] = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}; // Keypad setup // const byte ROWS = 8; const byte COLS = 10; char keys[ROWS][COLS] = { {'1', '9', 'h', 'p', 'x', 'G', 'O', 'W', '$', '>'}, {'2', 'a', 'i', 'q', 'y', 'H', 'P', 'X', '%', '?'}, {'3', 'b', 'j', 'r', 'A', 'I', 'Q', 'Y', '^', '/'}, {'4', 'c', 'k', 's', 'B', 'J', 'R', 'Z', '&', '-'}, {'5', 'd', 'l', 't', 'C', 'K', 'S', '~', '*', '['}, {'6', 'e', 'm', 'u', 'D', 'L', 'T', '!', '(', ']'}, {'7', 'f', 'n', 'v', 'E', 'M', 'U', '@', ')', ';'}, {'8', 'g', 'o', 'w', 'F', 'N', 'V', '#', '<', '+'} }; byte rowPins[ROWS] = {32, 30, 28, 24, 23, 27, 31, 35}; byte colPins[COLS] = {2, 3, 4, 5, 6, 8, 9, 10, 11, 12}; //not actually using these pins, just binary conversion to drive encoder //BCD to drive decoder pins for LED and Keyboard row select byte BCD[16][4] = {{0, 0, 0, 0}, {1, 0, 0, 0}, {0, 1, 0, 0}, {1, 1, 0, 0}, {0, 0, 1, 0}, {1, 0, 1, 0}, {0, 1, 1, 0}, {1, 1, 1, 0}, {0, 0, 0, 1}, {1, 0, 0, 1}, {0, 1, 0, 1}, {1, 1, 0, 1}, {0, 0, 1, 1}, {1, 0, 1, 1}, {0, 1, 1, 1}, {1, 1, 1, 1} }; //BCD code int bussLEDs[] = {8, 9, 10, 11, 12, 13, 14, 15, 34, 35}; int previewLEDs[] = {16, 17, 18, 19, 20, 21, 22, 23, 32, 33}; int programLEDs [] = {24, 25, 26, 27, 28, 29, 30, 31, 36, 37}; int patternLEDs[] = {68, 69, 66, 65, 64, 76, 77,74, 73, 72}; Keypad keypad = Keypad( makeKeymap(keys), rowPins, colPins, ROWS, COLS ); void keypadEvent(KeypadEvent key) { String echoMsg; String action; switch (keypad.getState()) { case PRESSED: { action = "Down,"; echoMsg = action + key; Firmata.sendString(echoMsg.c_str()); break; } case HOLD: { action = "Hold,"; echoMsg = action + key; Firmata.sendString(echoMsg.c_str()); break; } } } //Led status array #define LedBITSB 8 // number of bits per byte, used for code clarity #define LedDATABITS 80 const int arrayLen = (int)((LedDATABITS - 1) / LedBITSB) + 1; //byte LEDArray[arrayLen]; // for GVG100, length is 10 and that could hold 80 values int LEDArray[LedDATABITS]; int BlinkLEDArray[LedDATABITS]; void initLEDarray() { for (int i = 0; i < LedDATABITS; i++) { LEDArray[i] = 0; } } void initBlinkLEDarray() { for (int i = 0; i < LedDATABITS; i++) { BlinkLEDArray[i] = 0; } } void stringCallback(char *myString) { String lcdString = String(myString); int Line1Index = lcdString.indexOf(','); int Line2Index = lcdString.indexOf(',', Line1Index + 1); // more than one comma? String Line1 = lcdString.substring(0, Line1Index); String Line2 = lcdString.substring(Line1Index + 1); // update led int LEDSelRow = 0; LEDSelRow = Line2.toInt() / 8; //find row number - this rounds automatically //SelectLedRow(LEDSelRow); int LedSelCol = 0; LedSelCol = (Line2.toInt() % 8); //use MOD to find bit position digitalWrite(buttread, HIGH); switch (Line1.toInt()) { case 0: { //set all off initBlinkLEDarray(); WriteData(); digitalWrite(Data0, LOW); digitalWrite(Data1, LOW); digitalWrite(Data2, LOW); digitalWrite(Data3, LOW); digitalWrite(Data4, LOW); digitalWrite(Data5, LOW); digitalWrite(Data6, LOW); digitalWrite(Data7, LOW); for (int number = 0; number <= 11; number ++) { DecoderOut(number); } break; } case 1: { //set LED off LEDArray[Line2.toInt()] = 0; WriteData(); for (int i = 0; i < 8; i++) { digitalWrite(rowPins[i] , LEDArray[(LEDSelRow * 8) + i]); } delay(1); DecoderOut(LEDSelRow); delay(1); break; } case 2: { //Set LED On LEDArray[Line2.toInt()] = 1; WriteData(); for (int i = 0; i < 8; i++) { digitalWrite(rowPins[i] , LEDArray[(LEDSelRow * 8) + i]); } delay(1); DecoderOut(LEDSelRow); delay(1); break; } case 3: { //set LED blink off BlinkLEDArray[Line2.toInt()] = 0; LEDArray[Line2.toInt()] = 0; break; } case 4: { //set LED blink on BlinkLEDArray[Line2.toInt()] = 1; break; } case 5: { //set all KeyBus leds to blink (1) or no blink (0) if (BlinkStatus == 1) { //leds are already on so update blinking and set state off blinkLEDs(); BlinkStatus = 0; } for (int i = 0; i < 10; i++) { BlinkLEDArray[bussLEDs[i]] = Line2.toInt(); } break; } case 6: { //turn off all led and bling state for specified program, preview or keybus //if(BlinkStatus == 1){ //leds are already on so update blinking and set state off //blinkLEDs(); //BlinkStatus = 0; //} for (int i = 0; i < 10; i++) { if (Line2 == "program") { BlinkLEDArray[programLEDs[i]] = 0; LEDArray[programLEDs[i]] = 0; WriteData(); for (int j = 0; j < 8; j++) { digitalWrite(rowPins[j] , LEDArray[(0) + j]); } DecoderOut(0); for (int j = 0; j < 8; j++) { digitalWrite(rowPins[j] , LEDArray[(8) + j]); } DecoderOut(1); for (int j = 0; j < 8; j++) { digitalWrite(rowPins[j] , LEDArray[(32) + j]); } DecoderOut(4); } if (Line2 == "preview") { BlinkLEDArray[previewLEDs[i]] = 0; LEDArray[previewLEDs[i]] = 0; WriteData(); for (int j = 0; j < 8; j++) { digitalWrite(rowPins[j] , LEDArray[(0) + j]); } DecoderOut(0); for (int j = 0; j < 8; j++) { digitalWrite(rowPins[j] , LEDArray[(32) + j]); } DecoderOut(4); } if (Line2 == "keybus") { BlinkLEDArray[bussLEDs[i]] = 0; LEDArray[bussLEDs[i]] = 0; WriteData(); for (int j = 0; j < 8; j++) { digitalWrite(rowPins[j] , LEDArray[(8) + j]); } DecoderOut(1); for (int j = 0; j < 8; j++) { digitalWrite(rowPins[j] , LEDArray[(24) + j]); } DecoderOut(3); for (int j = 0; j < 8; j++) { digitalWrite(rowPins[j] , LEDArray[(48) + j]); } DecoderOut(6); } if (Line2 == "patterns") { BlinkLEDArray[patternLEDs[i]] = 0; LEDArray[patternLEDs[i]] = 0; WriteData(); for (int j = 0; j < 8; j++) { digitalWrite(rowPins[j] , LEDArray[(64) + j]); } DecoderOut(8); for (int j = 0; j < 8; j++) { digitalWrite(rowPins[j] , LEDArray[(72) + j]); } DecoderOut(9); } } break; } case 7: { //Set Pattern Control leds //0 = all off, 1= all blink if (BlinkStatus == 1) { //leds are already on so update blinking and set state off blinkLEDs(); BlinkStatus = 0; } for (int i = 0; i < 10; i++) { BlinkLEDArray[patternLEDs[i]] = Line2.toInt(); if (Line2.toInt() == 0) { //if turning off blink, also turning off leds alltogether LEDArray[patternLEDs[i]] = 0; } } break; } case 9: { readAnalogValues(); break; } } } void SetDataBit(int bit) { switch (bit) { case 0: { digitalWrite(Data0, HIGH); digitalWrite(Data1, LOW); digitalWrite(Data2, LOW); digitalWrite(Data3, LOW); digitalWrite(Data4, LOW); digitalWrite(Data5, LOW); digitalWrite(Data6, LOW); digitalWrite(Data7, LOW); break; } case 1: { digitalWrite(Data0, LOW); digitalWrite(Data1, HIGH); digitalWrite(Data2, LOW); digitalWrite(Data3, LOW); digitalWrite(Data4, LOW); digitalWrite(Data5, LOW); digitalWrite(Data6, LOW); digitalWrite(Data7, LOW); break; } case 2: { digitalWrite(Data0, LOW); digitalWrite(Data1, LOW); digitalWrite(Data2, HIGH); digitalWrite(Data3, LOW); digitalWrite(Data4, LOW); digitalWrite(Data5, LOW); digitalWrite(Data6, LOW); digitalWrite(Data7, LOW); break; } case 3: { digitalWrite(Data0, LOW); digitalWrite(Data1, LOW); digitalWrite(Data2, LOW); digitalWrite(Data3, HIGH); digitalWrite(Data4, LOW); digitalWrite(Data5, LOW); digitalWrite(Data6, LOW); digitalWrite(Data7, LOW); break; } case 4: { digitalWrite(Data0, LOW); digitalWrite(Data1, LOW); digitalWrite(Data2, LOW); digitalWrite(Data3, LOW); digitalWrite(Data4, HIGH); digitalWrite(Data5, LOW); digitalWrite(Data6, LOW); digitalWrite(Data7, LOW); break; } case 5: { digitalWrite(Data0, LOW); digitalWrite(Data1, LOW); digitalWrite(Data2, LOW); digitalWrite(Data3, LOW); digitalWrite(Data4, LOW); digitalWrite(Data5, HIGH); digitalWrite(Data6, LOW); digitalWrite(Data7, LOW); break; } case 6: { digitalWrite(Data0, LOW); digitalWrite(Data1, LOW); digitalWrite(Data2, LOW); digitalWrite(Data3, LOW); digitalWrite(Data4, LOW); digitalWrite(Data5, LOW); digitalWrite(Data6, HIGH); digitalWrite(Data7, LOW); break; } case 7: { digitalWrite(Data0, LOW); digitalWrite(Data1, LOW); digitalWrite(Data2, LOW); digitalWrite(Data3, LOW); digitalWrite(Data4, LOW); digitalWrite(Data5, LOW); digitalWrite(Data6, LOW); digitalWrite(Data7, HIGH); break; } } } void initFirmata() { // Uncomment to save a couple of seconds by disabling the startup blink sequence. Firmata.setFirmwareVersion(FIRMATA_FIRMWARE_MAJOR_VERSION, FIRMATA_FIRMWARE_MINOR_VERSION); Firmata.attach(STRING_DATA, stringCallback); Firmata.disableBlinkVersion(); Firmata.begin(57600); } void setup() { initLEDarray(); initBlinkLEDarray(); pinMode(13, OUTPUT); digitalWrite(13, LOW); pinMode(AnalRead, OUTPUT); digitalWrite(AnalRead, HIGH); pinMode(AnalConv, OUTPUT); digitalWrite(AnalConv, HIGH); pinMode(LEDwrite, OUTPUT); digitalWrite(LEDwrite, HIGH); pinMode(buttread, OUTPUT); digitalWrite(buttread, HIGH); pinMode(Display, OUTPUT); digitalWrite(Display, HIGH); pinMode(W0, OUTPUT); pinMode(W1, OUTPUT); pinMode(W2, OUTPUT); pinMode(W3, OUTPUT); //turn off all lamps WriteData(); digitalWrite(Data0, LOW); digitalWrite(Data1, LOW); digitalWrite(Data2, LOW); digitalWrite(Data3, LOW); digitalWrite(Data4, LOW); digitalWrite(Data5, LOW); digitalWrite(Data6, LOW); digitalWrite(Data7, LOW); for (int number = 0; number <= 11; number ++) { DecoderOut(number); } //set initial analog values in array ReadData(); for (int pot = 0; pot < 15; pot++) { byte currentPotValue = AnalogIn(pot); AnalogPreviousValues[pot] = currentPotValue; } initFirmata(); delay(10); //READY FOR KEYBOARD keypad.addEventListener(keypadEvent); } void loop() { WriteData(); while (Firmata.available()) { Firmata.processInput(); } readAnalogValues(); delay(50); keypad.getKeys(); //serial.update(); //delay(10); BlinkCount ++; if (BlinkCount > 6) { blinkLEDs(); BlinkCount = 0; if (BlinkStatus == 0) { BlinkStatus = 1; } else { BlinkStatus = 0; } } } void ReadData() { pinMode(Data0, INPUT_PULLUP); pinMode(Data1, INPUT_PULLUP); pinMode(Data2, INPUT_PULLUP); pinMode(Data3, INPUT_PULLUP); pinMode(Data4, INPUT_PULLUP); pinMode(Data5, INPUT_PULLUP); pinMode(Data6, INPUT_PULLUP); pinMode(Data7, INPUT_PULLUP); } void WriteData() { pinMode(Data0, OUTPUT); pinMode(Data1, OUTPUT); pinMode(Data2, OUTPUT); pinMode(Data3, OUTPUT); pinMode(Data4, OUTPUT); pinMode(Data5, OUTPUT); pinMode(Data6, OUTPUT); pinMode(Data7, OUTPUT); } void DecoderOut(byte number) { for (int i = 0; i < 4; i ++) { digitalWrite(DecoderPins[i], BCD[number][i]); } delay(2); digitalWrite(LEDwrite, LOW); delay(2); digitalWrite(LEDwrite, HIGH); } void SelectLedRow(byte number) { for (int i = 0; i <= 4; i ++) { if (bitRead(number, 1) == 1) { digitalWrite(DecoderPins[i], HIGH); } else { digitalWrite(DecoderPins[i], LOW); } } } void setLight(int pin, byte val) { byte arrayElem = int((pin) / BITSB); // which element of the ledArray is pin in byte byteElem = (pin - (arrayElem * BITSB)); // and which bit in that byte is the pin //LEDArray[arrayElem] |= (val << byteElem); // zero vals require a two-step process, //if(val == 0) { // first we set them to a one and then // ledArray[arrayElem] ^= (1 << byteElem); // toggle them //} byte temp1 = LEDArray[arrayElem]; bitWrite(temp1, byteElem, val); LEDArray[arrayElem] = temp1; } void blinkLEDs() { for (int i = 0; i < LedDATABITS; i++) { if (BlinkLEDArray[i] == 1) { if (BlinkStatus == 1) { LEDArray[i] = 0; } else { LEDArray[i] = 1; } int LEDSelRow = 0; LEDSelRow = i / 8; //find row number - this rounds automatically //SelectLedRow(LEDSelRow); int LedSelCol = 0; LedSelCol = (i % 8); //use MOD to find bit position digitalWrite(buttread, HIGH); WriteData(); for (int i = 0; i < 8; i++) { digitalWrite(rowPins[i] , LEDArray[(LEDSelRow * 8) + i]); } delay(1); DecoderOut(LEDSelRow); } } } void readAnalogValues() { int AnalogCurrentValues [14]; ReadData(); for (int pot = 0; pot < 15; pot++) { //int area = AnalogIn(pot); //if new value <> old value, send itto serial byte currentPotValue = AnalogIn(pot); int diff = abs(currentPotValue - AnalogPreviousValues[pot]); //need high res for t-bar so don't care about jitter if ((pot == 2) && (diff > 0)) { AnalogPreviousValues[pot] = currentPotValue; String action = "Pot"; String echoMsg = action + pot + ',' + currentPotValue; Firmata.sendString(echoMsg.c_str()); } if ((pot != 2) && (diff > 1)) { AnalogPreviousValues[pot] = currentPotValue; String action = "Pot"; String echoMsg = action + pot + ',' + currentPotValue; Firmata.sendString(echoMsg.c_str()); } } } byte AnalogIn(int number) { for (int i = 0; i < 4; i ++) { digitalWrite(DecoderPins[i], BCD[number][i]); } delay(1); digitalWrite(AnalConv, LOW); delay(1); digitalWrite(AnalConv, HIGH); delay(1); digitalWrite(AnalRead, LOW); //read all 8 bits and write value to array of the pot number byte inByte = 0; for (int r = 0; r < 8; r++) { bitWrite(inByte, r, digitalRead(rowPins[r])); } digitalWrite(AnalRead, HIGH); //return value as int return inByte; }
Après son fonctionnement, je ferais le ménage dans la classe.
En espérant, que ma demande ne soit pas trop complexe.
Dans l'attente de vous lire.
Cordialement,
Vincent D.