Étape 12 : Matériel le module 1 - clavier
Problème avec ceci est que nous n’avons que 3 entrées gauche sur l’Arduino, donc en utilisant un clavier dans sa voie normale ne fonctionnera pas. Donc après quelques recherches ici et sur internet, j’ai trouvé une solution pour utiliser uniquement une seule entrée pour détecter quel bouton a été enfoncé.
Lire cet excellent instructable sur comment détecter les broches sur le fil de votre clavier et howto jusqu'à seulement utiliser une seule entrée. Une fois que j’avais construire la matrice de la résistance, j’ai branché la sortie du clavier à la broche A2. J’ai utilisé une maquette tandis que l’essai de ce matériel. Aussi, j’ai soudé broches d’en-tête pour le clavier donc je peux déconnecter vers et à partir de la maquette plus facile. aussi, lorsque je construis le circuit final, tout est modulaire et peut être facilement branché.
C’est pourquoi j’ai ajouté trois déclarations suivantes juste sous les définitions du tableau
int keyboardPin = A2 ;
int keyboardValue = 0 ;
keypressed int = 0 ;
Puis j’ai ajouté la fonction suivante pour me permettre de lire dans laquelle la touche a été enfoncée sur le clavier. Notez que mes valeurs sont différents de l’instructable ci-dessus car j’ai utilisé des valeurs de résistance différente.
void readkeyboard() {}
keypressed = 0 ;
keyboardValue = analogRead(keyboardPin) ;
Si (keyboardValue < 25) {keypressed = -1;}
Si ((keyboardValue >25) & & (keyboardValue < 45)) {keypressed = 1;}
Si ((keyboardValue >45) & & (keyboardValue < 80)) {keypressed = 2;}
Si ((keyboardValue >80) & & (keyboardValue < 160)) {keypressed = 3;}
Si ((keyboardValue >162) & & (keyboardValue < 253)) {keypressed = 4;}
Si ((keyboardValue >253) & & (keyboardValue < 361)) {keypressed = 5;}
Si ((keyboardValue >361) & & (keyboardValue < 479)) {keypressed = 6;}
Si ((keyboardValue >479) & & (keyboardValue < 585)) {keypressed = 7;}
Si ((keyboardValue >585) & & (keyboardValue < 715)) {keypressed = 8;}
Si ((keyboardValue >715) & & (keyboardValue < 760)) {keypressed = 9;}
Si ((keyboardValue >839) & & (keyboardValue < 880)) {keypressed = 10;}
Si ((keyboardValue >760) & & (keyboardValue < 839)) {keypressed = 11;}
Si ((keyboardValue >880) & & (keyboardValue < 1000)) {keypressed = 12;}
Delay(50) ;
}
Cette fonction fonctionne en détectant quelle touche a été enfoncée basé sur la valeur sur l’axe d’entrée de clavier et puis en définissant la keypressed variable globale à un nombre qui correspond à cela.
La fonction de boucle est ensuite modifiée pour lire comme ça
void loop() {}
int randnumber = 0 ;
readkeyboard() ;
Si (keypressed > 0 & & keypressed < 12) {}
manualEffect = 1 ;
prevKeyPressed = keypressed ;
pour (int x = 0; x < 2; x ++) {}
(*funcAnimate[keypressed]) ();
Delay(1) ;
}
} ElseIf (keypressed = 12) {}
manualEffect = 0 ;
Laisser la boucle parcourent à nouveau et l’instruction else finale fonctionnera alors un effet aléatoire
comme le manualEffect a été remis à zéro
} else if (manualEffect = 1) {}
pour (int x = 0; x < 2; x ++) {}
(*funcAnimate[prevKeyPressed]) ();
Delay(1) ;
}
} else {}
randnumber = random(0,2) ;
pour (int x = 0; x < 2; x ++) {}
(*funcAnimate[randnumber]) ();
Delay(1) ;
}
}
}
Cela fonctionne en lisant la valeur de clavier.
Puis un si instruction vérifie pour voir si une touche a été enfoncée entre 0 et 11
Si cela est vrai alors il définit manualeffect à 1 et exécute ensuite l’effet choisi.
Si la touche dièse a été enfoncée, puis il sera mis manualeffect à 0, alors la boucle temporelle suivante est exécutée car aucune touche et manualeffect est définie sur 0, alors, un effet aléatoire est exécuté
Puis l’instruction If vérifie si manualeffect est égal à 1. Cela se produit si une touche a été enfoncée précédemment et a commencé un effet manuel en cours d’exécution. Cela nous permet de continuer à jouer l’effet manuel choisi précédemment. Cet effet manuel continuera à fonctionner jusqu'à ce que l’autre touche
L’instruction else finale s’exécute si manualeffect est défini sur 0, ce qui va se passer lorsque l’appareil est allumé ou lorsque la touche aléatoire. Un effet aléatoire sera exécuté.
L’ajustement final à l’esquisse est d’ajouter la fonction suivante
void dummy() {}
Puis dans le tableau des fonctions de changement de lire comme ça
funcAnimate [0] = mannequin ;
funcAnimate [1] = MakeSadSmileFace ;
funcAnimate [2] = MakewinkingFace ;
Puis modifiez le randNumber = random(0,2) ; pour randnumber = random(1,3) ;
Ces changements signifient que lorsque le clavier est enfoncé à la fonction à la position 0 de la matrice n’est jamais exécuté en raison des affectations de variables. Pour nous il suffit d’ajouter une fonction factice il qui ne fait rien. Nous avons aussi changé le randNumber être affecté un nombre aléatoire de recommencer de 1, donc le tableau position 0 n’est jamais exécutée.
Le schéma complet est en dessous.