Il fut un temps où l’électronique de construction et les logiciels de construction étaient deux activités distinctes. De nos jours, presque tous les projets électroniques importants utiliseront un processeur quelque part, ou – du moins – pourraient le faire. L’utilisation d’un simulateur de circuit peut vous aider à faire une partie du chemin et les simulateurs logiciels abondent. Mais la cosimulation – simulant à la fois des circuits analogiques et un processeur en marche – ne se trouve souvent que dans les produits de simulation haut de gamme. Mais j’ai remarqué l’autre jour que la fonctionnalité s’est discrètement glissée dans notre simulateur Web préféré, Falstad.

En mars, le projet principal a ajouté des travaux de [Mark McGarry] pour prendre en charge AVR8js écrit par [Uri Shaked]. Le résultat final est que vous pouvez avoir le simulateur de circuit sur la gauche de l’écran et un IDE Arduino basé sur le Web sur le côté droit. Mais comment ça marche au-delà de la simple démo ? Nous voulions savoir.

L’écran semble prometteur. Le simulateur familier est à gauche et l’IDE Arduino – en quelque sorte – est à droite. Il y a une sortie série sous le code source, mais ça ne défile pas très bien, donc si vous sortez beaucoup de données série, c’est difficile à lire.

J’aime à peu près tout sur le simulateur Falstad et avoir une cosimulation Arduino est génial. Mais il y a un problème vraiment important qui peut finir par être résolu. Normalement, lorsque vous dessinez un schéma, vous pouvez l’enregistrer sous forme de texte ou encodé dans un lien. Si vous cliquez sur le lien ou importez le texte, tout redevient tel qu’il était lors de l’enregistrement. Je l’utilise dans de nombreux messages Circuit VR afin que vous puissiez cliquer sur un circuit et le voir en direct.

Cependant, le simulateur n’enregistre pas le code source dans l’Arduino virtuel. Vous devez le faire vous-même. Cela signifie que si tout fonctionne, enregistrez votre circuit et fermez votre navigateur, vous devrez recréer votre code Arduino la prochaine fois. Heureusement, je l’ai testé avant de perdre mon travail. Il devrait cependant y avoir un gros avertissement rouge sur la page.

Ce que cela signifie, cependant, c’est que je ne peux pas vous donner de lien à suivre avec des exemples. Voici ce que vous pouvez faire :

  1. Jetez un œil au code source.
  2. Ouvrez le simulateur.
  3. Copiez le texte du haut des commentaires du code source et collez-le dans le simulateur (instructions détaillées dans les commentaires).

N’oubliez pas d’enregistrer les modifications de votre code source. Si vous apportez des modifications au circuit, vous souhaiterez les exporter sous forme de texte et les copier dans le code source afin de pouvoir tout enregistrer ensemble.

Un exemple

Schéma d’essai.

Je voulais un exemple simple qui montre l’avantage d’utiliser la cosimulation. J’ai décidé d’examiner quelques alternatives pour effectuer une conversion analogique-numérique en utilisant des approximations successives. Un potentiomètre virtuel fournit une tension d’entrée. Il y a un comparateur et une sortie PWM tamponnée. Voici le schéma :

Entrée sortie

Il y a trois points d’interface avec l’Arduino. La sortie PWM est définie comme une tension externe à l’aide des composants « Entrées et sources » (rappelez-vous que la sortie de l’Arduino est l’entrée du circuit). Inversement, la sortie du comparateur et la connexion au convertisseur analogique de l’Arduino (A0) sont des nœuds étiquetés à partir du menu « Sortie et étiquettes ». Les noms sont significatifs, y compris les espaces.

Le code

En théorie, le code est assez simple. Vous devinez une tension et lisez la sortie du comparateur pour voir si vous avez raison. Il existe deux méthodes dans le code et vous pouvez basculer entre elles en définissant le convert définir à convert0 ou alors convert1.

À chaque passage dans la boucle, le code appelle l’une des fonctions de conversion pour gérer le processus d’approximation successive via un algorithme différent. Il met également à jour la sortie PWM à chaque passage.

L’algorithme de première approximation est très simple mais pas très efficace. Il devine chaque tension de sortie en commençant à 0 et en augmentant de 1/255 V à chaque passage. Lorsque le comparateur passe de faux à vrai, vous savez que la tension d’entrée doit être inférieure à la tension actuelle mais supérieure à la tension précédente.

Le deuxième algorithme est plus intelligent et fonctionne comme une recherche binaire. La première estimation est 128/255. Cette tension est supérieure ou inférieure à notre cible. S’il est inférieur, nous nous souvenons que le bit doit être activé et, dans tous les cas, passer au bit suivant. En d’autres termes, le deuxième test sera soit 64/255 soit 128/255 + Simulide64/255. Encore une fois, la nouvelle valeur est haute ou basse et déterminera l’état du bit suivant.

Le premier algorithme pourrait se terminer rapidement ou il pourrait devoir compter jusqu’à 255 pour trouver la réponse. Le deuxième algorithme prend toujours 8 mesures. Il n’y a aucun moyen pour le comparateur de nous dire que notre tension de référence est exactement égale à l’entrée même si nous pouvions définir ce que cela signifie pour un signal analogique. Nous devons donc mesurer chaque bit et décider s’il doit être activé ou désactivé.

La sortie apparaît dans le terminal sériel. Le premier nombre est le résultat de la conversion et le second est la valeur du convertisseur intégré pour la même tension.

Référence de tension

Générer la tension de référence est la clé. Il serait possible d’utiliser 8 bits de sortie et un réseau R2R pour générer une tension de sortie rapidement, mais cela consomme beaucoup de broches. Au lieu de cela, j’ai utilisé une broche pour générer des tensions en utilisant PWM. Ce n’est pas aussi rapide, bien sûr, car vous devez laisser le temps au filtre RC pour que la tension atteigne la valeur souhaitée.

La broche 9 génère un signal PWM en utilisant une technique ancestrale. Supposons que vous vouliez générer 20/255 (environ 8% de cycle de service). Vous prenez un accumulateur de 8 bits et vous y ajoutez 20 à plusieurs reprises. La sortie PWM est l’exécution du bit supérieur. Vous pouvez trouver une feuille de calcul avec la logique, mais vous devrez imaginer que les vagues de sortie sont des carrés, car la feuille de calcul trace utilement des lignes droites entre les points.

Cette feuille de calcul modélise la logique de sortie PWM.

Pour ce faire correctement, le code doit s’exécuter sur une interruption précise et égaliser le temps entre les sorties. Cependant, pour cette démo rapide, j’ai supposé que le temps d’appel de la boucle principale sera assez régulier. J’ai envisagé de le faire sur une interruption, mais – honnêtement – ​​je ne sais pas à quel point le simulateur est fidèle, à quel point il est précis dans le temps, et il ne semble pas que vous puissiez facilement y ajouter des bibliothèques, donc vous le feriez presque certainement doivent gérer les interruptions au niveau des registres.

Le signal de sortie est lissé par un filtre RC. Les valeurs ici sont intéressantes et il est amusant de regarder la portée pendant que vous faites varier les paramètres dans cette partie du circuit. Vous voulez un signal de référence sans bruit. Cela implique donc un gros condensateur. Cependant, un gros condensateur prend plus de temps à se charger et à se décharger, donc la tension prendra plus de temps à se stabiliser. C’est un compromis classique. Voulez-vous une réponse rapide bruyante ou une réponse lente et propre ?

Dans ce cas, le potentiomètre ne change probablement pas très rapidement, mais dans la vraie vie, le signal d’entrée peut changer tout le temps et vous pouvez même envisager un échantillon et maintenir cette entrée pour vous assurer qu’elle ne change pas pendant que vous sont en train de deviner.

Réglage

Évidemment, vous pouvez facilement modifier les valeurs RC dans le simulateur. Il est même possible d’ajouter des curseurs pour définir les valeurs graphiquement pendant que la simulation est en cours (le pot est déjà configuré pour le faire). Cependant, la modification du code nécessite un arrêt et un redémarrage.

Dans le code, vous pouvez modifier le nombre de cycles de boucle que les routines de conversion attendent pour permettre à une nouvelle valeur PWM de s’installer (SETTLELOOPS) et combien de temps pour faire une pause entre les lectures (SAMPLOOP). Les interactions entre ces nombres et les valeurs RC sont critiques. Des constantes de temps RC plus grandes nécessitent plus de temps pour produire des résultats corrects. Des nombres RC plus petits nécessiteront moins de temps, mais le bruit introduira des erreurs. Faites votre choix.

Signal PWM avec condensateur 2uF.
Signal PWM avec condensateur 47uF.

Le verdict

Ceci est un exemple de jouet. La génération PWM souffre de certains problèmes et PWM n’est pas une bonne idée pour une référence de conversion. Pourtant, cela montre une bonne partie de ce qui est possible avec la cosimulation disponible avec Falstad. J’attends avec impatience la prochaine fois que j’aurai besoin d’un signal exotique introduit dans un circuit. Le simple fait d’utiliser l’Arduino comme générateur de fonctions aura son utilité.

Je souhaite que vous puissiez ajouter des bibliothèques et enregistrer un projet entier plus facilement. Néanmoins, il existe de nombreux scénarios de simulation que vous pouvez simuler rapidement et facilement à l’aide de cet outil. Comme il n’est dans la base de code que depuis quelques mois, j’espère que certains de ces problèmes se résoudront avec le temps. Ajoutez le débogage au mélange, et ce serait un vrai gagnant.

Tinkercad vous permet de simuler Arduino, mais pas avec la sophistication du circuit de Falstad. Cela nécessite une installation, mais nous sommes toujours surpris de ne pas en entendre plus sur Simulide.