Étape 4: logiciels
Je suis un ingénieur logiciel de commerce donc cette partie est la plus détaillée.
Summery : quand les premières bottes Arduino la méthode setup() est appelée. Là j’ai créé quelques-uns des variables et les lieux de sortie pour être utilisés plus tard. zeroCrossInterupt() est appelé / a couru chaque fois que l’AC traverse de positive à négative tension. Il va définir l’indicateur zeroCross pour chaque canal et démarrer la minuterie. La méthode loop() est appelée continuellement pour toujours. Pour activer la sortie, le TRIAC doit uniquement être déclenchée pour 10 microsecondes. Si il est temps de déclencher il TRIAC et zeroCross qui s’est passé la sortie s’allume jusqu'à la fin de la phase d’AC.
Il y avait quelques exemples en ligne que j’ai utilisé pour obtenir ce projet a commencé. La principale chose que je ne pouvais pas trouver était d’avoir plusieurs sorties TRIAC. D’autres ont utilisé la fonction de retard à la sortie PWM, mais qui ne fonctionnerait pas dans mon cas, car l’ATMEGA doit être à l’écoute de DMX tout le temps. J’ai résolu ceci en impulsions le TRIAC à tant de ms après zéro-Croix. Par impulsions le TRIAC rapprocher pour zéro-Croix plus du péché wave est sortie.
Voici ce que la demi-onde de péché 120VAC ressemble sur un oscilloscope, ci-dessus.
Le ISP814 est connecté pour interrompre 1. Donc lorsqu’il reçoit signal que l’AC passe de positif à négatif ou vice versa, il affecte la valeur true au zeroCross pour chaque canal et démarre le chronomètre.
Dans la méthode loop(), il vérifie tous les canaux si zeroCross a la valeur true et que le temps de s’activer a passé des flashe le TRIAC pour 10 microsecondes. C’est assez pour allumer le TRIAC. Une fois un TRIAC est activé sur il restera allumé jusqu’au zeroCross. La lumière serait scintiller lorsque le DMX était d’environ 3 % et j’ai ajouté la tronquant là-dedans pour l’empêcher. Cela était dû à l’Arduino étant trop lente, et le pouls parfois déclencherait la prochaine vague de péché au lieu de la dernière 4 % de l’onde.
Également dans le loop() j’ai mis la valeur PWM du statut LED. Ces voyants peuvent utiliser le PWM interne généré par l’Arduino, parce que nous n’avons pas à vous soucier de la zeroCross de l’AC. Une fois défini la PWM l’Arduino continuera à cette luminosité jusqu'à ce que dise les autres sages.
Tel que mentionné dans les commentaires dessus afin d’utiliser une interruption DMX sur la broche 2 et tourne à 20 MHz, vous devrez modifier certaines Arduino fichiers d’application. En HardwareSerial.cpp qu'un morceau de code doit être supprimé, cela nous permet d’écrire notre propre appel d’interruption. Cette méthode ISR est au fond du code pour gérer l’interruption DMX. Si vous allez utiliser un Arduino comme un programmateur ISP, n’oubliez pas d’annuler vos modifications à HardwareSerial.cpp sinon l’ATMEGA328 sur le plateau de pain sera inaccessible. Le deuxième changement est un easer un. Le fichier boards.txt doit être changé à la nouvelle vitesse d’horloge de 20MHz.
Brightness[ch]=Map(DmxRxField[ch],0,265,8000,0) ;
Luminosité mappe à 8000 parce que c’est la quantité de microsecondes, de 1/2 une onde sinusoïdale de AC à 60hz. Donc à pleine intensité DMX 256 le programme quittera 1/2 l’AC sine wave ON pour 8000us. Je suis venu avec 8000 par guess et cocher. Faire le calcul du 1000000us/60Hz/2 = 8333 donc c’est peut-être un meilleur numéro, mais avoir l’appoint 333us dessus de la tête permet le TRIAC ouvrir et une gigue au programme est probablement une bonne idée.
Sur l’Arduino 1.5.3 qu’ils ont déménagé à l’emplacement du fichier HardwareSerial.cpp. Il est maintenant /Applications/Arduino.app/Contents/Java/hardware/arduino/avr/cores/arduino/HardwareSerial0.cpp vous devrez commenter cela si tout bloc commençant par la ligne 39 : #if defined(USART_RX_vect)
Sinon vous allez vous retrouver avec cette erreur : core/core.a(HardwareSerial0.cpp.o) : In function « __vector_18 » :