Étape 9: Raccorder la lampe principale
La seule chose différente de la lampe du maître pour les lampes de l’esclave est qu’il y a un autre microcontrôleur dedans (ou vous pouvez également utiliser des arduinos dans toutes les lampes de l’esclave et télécharger le code de l’esclave (adapté) pour les lampes de l’esclave). Aussi, c’est la seule lampe qui dispose d’un connecteur USB et un récepteur infrarouge.
J’ai retiré la prise mini-USB original du jeu et utilisé des câbles wrap (tous les autres câbles petits sera très bien) pour le rebrancher avec câble de 5cm entre les deux. J’ai utilisé l’outil dremel pour faire un trou dans la lampe pour s’adapter à la prise usb, donc je peux mettre à jour le logiciel maître sans avoir à ouvrir le feu. Du côté opposé, j’ai fait un trou assez grand pour le récepteur IR mais assez petit pour que de l’extérieur, il ressemble à un petit bouton noir. C’est une bonne idée de placer le récepteur IR sur le milieu entre la couture des deux moitiés et la partie inférieure de la lampe.
Connectez le récepteur IR à GND, 5V et le signal de sortie à la broche à la broche numérique arduino 8 (qui est liée à l’interruption de capture de timer1 d’entrée).
Raccorder le transistor NFET à l’Arduino : Connectez la porte à la broche numérique 13 et la source à GND. Le Drain se connecte à l’entrée négative du ventilateur. Connectez l’entrée positive du ventilateur à broches 5V de l’Arduino. Oui, c’est un ventilateur 12V mais à 5V il crée assez d’air pour garder la LED refroidie et il ne crée presque aucun bruit. Si votre ventilateur ne fonctionne pas à 5V, reliez-le à la ligne 12V (qui vaut également pour toutes les lampes de l’esclave soit dit en passant).
Utiliser deux 1,5 k Ohm résistances et connectez-les comme tractions : celle de SDA (broche analogique 4) à 5V et l’autre de SCL (broche analogique 5) à 5V. Ce sont les tractions pour le bus de communication I2C. Si vous les oubliez, la communication série ne fonctionnera pas. N’utilisez pas de tractions internes de l’Arduino, ils sont trop faibles (ignorer cette phrase si vous ne savez pas sur les tractions internes de l’Arduino, ils sont activés par le logiciel et il n’importe pas si elles sont activées ou non, si vous soudez pullups externe).
Les signaux PWM sont générés à l’aide de timer1 (rouge et vert) et timer2 (bleu). Les broches contrôlées sont la broche numérique 9 (rouge), la broche numérique 10 (vert) et la broche numérique 11 (bleu).
Timer1 est une minuterie de 16 bits, en vous donnant des étapes de 65'536 couleurs, qui est plus que suffisant (au-dessus de 12 bits, vous ne voyez aucun « sauts de couleurs » lorsque la gradation) mais timer1 est seulement un timer de 8 bits. Au début que j’ai eu tant d’exécuter en mode 8 bits, mais qui semblait un peu merde parce que nos yeux sont logarithmiques et la LED est linéaire, ce qui signifie que vous percevez un passage de 2 à 4 comme un plus grand changement de luminosité qu’un changement de 200 à 255. En réalité les 256 étapes de luminosité, lorsque le fait de façon logarithmique vous donnent uniquement sur les valeurs de couleur de 12-13 (en théorie, en réalité, c’est un peu plus) par canal, ce qui donne un total de 13 ^ 3 = 2197 couleurs distinctes. Ressemble beaucoup, mais ce n’est pas.
Je vais un peu dans les détails sur le code maintenant, si vous n’êtes pas familier avec des trucs de calendrier et horloge matérielle, ignorez-la.
J’ai cherché sur le web pendant quelques heures, essayant de trouver une méthode logicielle pour augmenter le timer de 8 bits, mais chacun d’eux introduit des erreurs de jitter en raison de la temporisation logicielle, qui se traduit par fréquents clignotement d’une led qui n’est pas acceptable. Ensuite, je m’assis et a écrit mon propre code pour obtenir une meilleure résolution. J’ai trouvé que pour les valeurs inférieures, retards de logiciel sont trop lents, aussi les interruptions ne sont pas assez rapides (nous parlons simple précision de horloge cpu ici). Il aurait peut-être pu être fait en assembleur mais je ne voulais pas aller dans cette voie, non, Monsieur.
J’ai utilisé à la place un truc (que j’ai découvert par hasard et maintenant, suis assez fière de) que les minuteries ne pas immédiatement mettre à jour la comparer correspondent à registre mais ont une mémoire tampon sur elle, mettre à jour uniquement sur le prochain débordement de minuterie. Dans cet esprit, j’ai utiliser le débordement timer2 pour synchroniser et vérifier les minuteries et peut faire un up de 16 bit timer sur une minuterie de 8 bits, mais peuvent également avoir ce soit 12bits ou 13bits. Cela ajoute beaucoup de charge CPU, mais le maître lampe seule doit écouter l’IR, envoyons les commandes et générer PWM, qui se fait tout pour la plupart dans le matériel, donc il y a assez de temps couleur calculs et autres choses en attendant. Avec une horloge arduino CPU de 16Mhz et un diviseur de minuterie de 8 (avec un prescaler de 1 la charge CPU devient trop élevé en raison d’interruptions chaque horloge 256) la fréquence PWM est 2MHz/(2^13) = 244 Hz (pour les feux de l’esclave c’est seulement 122 Hz depuis ils courent sur 8 Mhz) qui est très bien (100 Hz est le minimum pour obtenir le scintillement des lumières gratuit).
Bon, donc nous avons une combinaison de logiciel-matériel sortie PWM avec une résolution de 13 bits, ce qui nous donne 8191 étapes linéaires de couleur pour chaque lampe, ce qui nous donne 254 étapes logarithmiques (la résolution est effectivement trop élevée et les valeurs inférieures utilisent le même nombre de graduations de la minuterie) qui en résulte dans les différentes couleurs 16 387 064 ! Cela donne des changements de couleur agréable et lisse.
OK, assez parlé de la théorie de code et de couleur. Raccorder l’alimentation 12V à l’arduino. Prenez le câble d’alimentation et le mettre dans une des deux petits trous dans le fond de la lampe. Connectez-le à l’entrée du secteur de l’alimentation de 12V, assurez-vous d’utiliser des gaines thermorétractables tuyaux sur les joints soudés du câble. Organiser toute l’électronique bien dans les deux bols en bois et le fixer avec de la colle, comme décrit pour les feux de l’esclave. Vérifiez bien que les lignes de 230V sont sécurisés et bien isolées. Maintenant, vous pouvez le brancher (j’utilise une rallonge avec un interrupteur, également d’IKEA). Soyez très prudent maintenant, la lampe a encore quelques endroits (sur l’alimentation) avec des pièces exposées 230V.
Il ne fonctionne pas comme prévu ? Gotcha. Vous devez commentez toutes les updatelamp(x) ; commandes à partir du code de l’arduino (également de toutes les fonctions!), avec x étant de 1 à 5 (seulement mise à jour de lampe 0, master). Les commandes d’updatelamp attendent la réponse appropriée de l’esclave et essaient de renvoyer les commandes en cas d’échec, alors le programme tombe dans une boucle infinie. Vous pouvez mettre dans un délai d’attente à la commande updatelamp si vous le souhaitez, je ne voulais pas faire cela donc aucune lampe ne saute toutes les couleurs.
Ah et Pendant que vous travaillez sur la lampe principale, chaussez dans trois résistances de pulldown (au GND) de permet de dire environ 2k Ohms chacune des broches signal PWM. J’ai oublié de le faire et Pendant le démarrage de l’arduino le maître clignote en lumière blanche brillante pendant environ une demi-seconde, laquelle elle would ' t si je n’avais pas oublié ces pulldowns...
Si tout fonctionne, il est maintenant temps pour se brancher à des esclaves. J’espère que vous avez marqué que celui que vous avez programmée avec l’adresse de l’esclave numéro un.
Note : Je sais qu’il y a encore quelques bugs dans le code, si vous en trouver un, veuillez me le signaler (et me dire si vous savez comment résoudre ce problème,). Aussi mes compétences en programmation sont modérés au mieux et le code est un gâchis, mais j’ai essayé d’ajouter dans les commentaires sur la plupart des lignes (peut être en allemand dans certaines parties, Désolé pour ça). Il est encore un work in progress (code qui n’est pas?) et pas entièrement nettoyé.
Des ajouts ou des suggestions du code sont les bienvenus.