Étape 12 : sons
Tous les sons étaient issues d’un ATtiny84. Il n’y avait aucun espace pour un autre Conseil. Et le ATtiny était là de toute façon, lire le cadran de la gâchette et le sélecteur et envoyant PWM pour les pilotes de LED.
En fait, j’ai utilisé une planche que j’ai travaillé sur à cet effet ; Il a un ATtiny84, un en-tête de programmation ICSP et quatre conducteurs de courant constant de LC135. Ces derniers sont une puce peu cool fournira un milliampères 350 réglementé à une LED de haute puissance, aura PWM et pouvant être empilée (ou, plutôt, de s’exécuter en parallèle).
Le jury devait être fortement modifiée pour cette hélice, bien sûr.
Il est relativement simple à faire tons sur un ATtiny. Il s’exécute (avec quelques bémols importants) la bibliothèque tone() pour Arduino. Il est également capable d’une synthèse wavetable. La théorie est assez simple. L’un des timers matériels embarqués est mis en place pour la sortie analogique de tension ; fréquence de coupure variable, de Difficulté (PWM, essentiellement). Un deuxième timer est utilisé pour générer une interruption matérielle. Lorsque la routine d’interruption du service est appelée, elle ramasse la valeur suivante d’une table d’ondes et ajuste la sortie de tension de la minuterie de la première.
Cette astuce nécessite un certain nombre de choses. Elle nécessite la minuterie deuxième être fonctionnant à la fréquence désirée X la longueur de la table d’ondes. Il nécessite le premier timer exécuter plusieurs commandes plus rapides (sinon il sera drôle aliasing en cours). Et nécessite le programme ne passent pas des cycles de faire quoi que ce soit d’autre que d’être prêt pour la prochaine interruption à traiter.
Que ce dernier s’est avéré difficile. Je courais logiciel PWM pour la LED (il n’y a aucuns plus minuteurs matériel en disponible sur cette puce), j’ai dû prendre des lectures détente et lectures analogiques sur le cadran et les types de sons, j’ai voulu si nécessaire, à évoluer avec le temps. Donc j’ai abandonné sur la table d’onde pleine et généré des vagues simples de forme carrées ou en dents de scie. Et cela signifiait que je pouvais épargner les cycles de programmes pour ajouter ou soustraire des nombres à la fréquence (c'est-à-dire le taux de base dans laquelle les changements sont faits à la sortie analogique du timer1.)
Encore, cela signifiait que les sons radicalement changé chaque fois que j’ai mis dans un nouveau « If » instruction et ils étaient aussi fortement dépendant de la fréquence de base choisie pour le PWM. Mais avec une bonne quantité de tâtonnements, j’ai pu obtenir quelques grésillements, œstre et clics pour les divers plans et fonction sonne (alimentation, mouvement de cadran de sélecteur, etc..)
En fait, l’aliasing et le général « grit » était un avantage. Utilisant des techniques similaires à la synthèse wavetable ci-dessus on peut faire un bruit blanc ou rose de diverses saveurs, mais cela s’est avéré inutile. Si j’ai été en utilisant une puce plus rapide et plus puissante, tel que trouvée dans un Arduino Nano, je serais probablement numériquement combinant différentes tables d’ondes et de traitement avant l’envoi qu’à la sortie analogique finale.
Toute la programmation a été nominalement faite dans l’IDE Arduino. Pour exploiter les minuteurs matériel de la manière que je devais, je m’adressais à eux directement, sans l’aide de toutes les bibliothèques Arduino. Mais l’avantage de la programmation sur un étai comme ça, c’est vous pouvez penser « croquis », jeter ensemble tout ce qui fonctionne code malpropre et appelez-le assez bon.