Bien sûr, je suis un nerd, alors voici des solutions moins susceptibles d'être implémentées par vous, mais qui méritent d'être mentionnées pour le plaisir:
Shenanigans basées sur le registre des changements
Les idées suivantes sont basées sur des registres à décalage série-parallèle.
Broche de sortie -> Entrée de données
Vous pouvez simplement transférer vos données vers l'entrée de données série de votre registre à décalage.
Problem: Les registres à décalage ont besoin d'une horloge pour savoir quand "échantillonner" l'entrée.
Solution: Génère une impulsion d'horloge chaque fois que l'entrée change.
N Nouveau problème: OK, nous pouvons le faire avec une simple porte logique ET, combinant votre DataIN et une version minimalement retardée de sa sortie (retard à travers des composants discrets, par exemple un filtre RC). Mais: alors nous ne pouvons avoir que des modèles de bits alternés.
Solution: La séquence de sortie de votre pin doit toujours être
0->1 [long] ->B [court] ->0
.
Ce qui se passe ici, c'est que le premier 1
charge un condensateur (d'où le "long" 1), la tension aux bornes de ce cap déclenche un one-shot retardé (par exemple, via un NE555) il franchit un seuil, ce qui provoque alors une impulsion d'horloge pour le registre à décalage.
Au moment où l'impulsion se produit, vous avez déjà défini le bit de sortie souhaité B
sur la sortie. Cela doit être plus court que le 1 "fixe" pour éviter de déclencher à nouveau l'impulsion d'horloge.
Vous faites ce qui précède deux fois pour décaler deux bits différents B1 et B2 dans le registre à décalage.
Vous pouvez implémenter le schéma d'envoi ci-dessus
0b1111BB00
avec l'unité UART (si votre microcontrôleur en est équipé).
Si vous regardez de plus près, c'est très similaire à ce que font les trucs WSxxxx "neopixel" pour communiquer: 0->1
marque le début d'une période, et le montant de 1
dans cette période définit si c'est un 0 logique ou un 1.
Pulsations populaires passives polynomiales
Cela avait besoin d'un titre rimant. En toute vérité, cela devrait probablement être appelé "génération de registre à décalage à rétroaction linéaire d'une séquence de sortie".
L'idée est que lorsque vous utilisez un registre à décalage et que vous connectez son entrée à une combinaison logique de ses cellules internes, vous pouvez créer quelque chose qui parcourt tous les états de sortie possibles (si vous choisissez la fonction de rétroaction de manière appropriée). J'expliquerais cela ici, mais moi, paresseux, alors lisez l'article de wikipedia sur les registres à décalage à rétroaction linéaire.
À retenir: si vous pouvez avoir un tel LFSR, vous pouvez, simplement en basculant son clock, obtenir toutes les sorties (il suffit de basculer le bon nombre de fois).
Doh '. C'est bien, mais c'est plus difficile à expliquer qu'un compteur
Bien sûr, ce qui précède est très cool (car il a de nombreuses applications, par exemple dans la communication, la vérification de l'intégrité des données, etc.), et c'est très efficace en termes de nombre de portes dont vous avez besoin pour cela, mais:
Vous pouvez tout aussi bien acheter ou construire un compteur 2 bits (ou plus). Et comptez les bascules de votre épingle Attiny. La sortie de bits parallèles du compteur peut être vos 2 broches de sortie (ou plus).
Je pense que cela en dit long. J'ai d'abord pensé aux LFSR plutôt qu'aux compteurs.
Discrimation basée sur la fréquence
Filterbank avec deux fréquences discrètes
L'idée est simple:
- Générez deux fréquences différentes avec la broche, par exemple, en la basculant avec une fréquence de 1 kHz (c.-à-d. toutes les 1 ms la sortie se répète, vous devez basculer toutes les 500 µs), ou à 2 kHz (basculer toutes les 250 µs) ou somme logique des deux oscillations (un peu difficile à faire dans la tête, mais cela revient à avoir des périodes hautes et courtes alternées).
- Filtrez la sortie avec deux filtres différents:
- un filtre passe-bas qui ne laisse passer que tout ce qui est en dessous, disons 1,2 kHz, un RC fera l'affaire
- un filtre passe-bande qui laisse passer 2 kHz, mais pas 1 kHz ni 3 kHz.
- rectifie et filtre passe-bas la sortie de ces deux filtres. Tada, vous avez construit un récepteur 2-Tone 2FSK, si vous le souhaitez.
- Ce sont vos deux signaux de sortie; utiliser un dispositif de seuillage, un "discriminateur" (diode Zener, comparateur) pour les convertir en binaire 0 ou 1.
Bonus
Si vous n'utilisez pas 1 et 2 kHz, mais quelques MHz, vous pouvez en fait remplacer votre câble de connexion par des antennes appropriées et effectuer ce transfert par voie aérienne. Vous enfreindriez également la loi en abusant du spectre pour lequel vous n'avez aucune licence.
PWM qui
Idea: identique à ci-dessus, mais plus simple.
Soit deux informations indépendantes:
- Cycle de service de sortie> 50%
- Modifications de sortie du tout
Vous pouvez avoir le cycle de service> 50% soit par
- commutation de la broche constamment haute (cycle de service de 100%), ou basse (0%), ou par
- réglage de l'unité PWM pour vous donner un cycle de service de 25% ou 75%.
Ensuite, comme ci-dessus, un filtre passe-bas, suivi d'un discriminateur qui commute à la moitié de la plage de tension de sortie, vous donne le premier bit de sortie.
Un filtre passe-haut, suivi d'un redresseur, d'un condensateur et d'un discriminateur vous donne le deuxième bit.