Physique expérimentale avec Phoenix et Python

Gazette Linux n°111 — Février 2005

Pramode C.E.

Article paru dans le n°111 de la Gazette Linux de février 2005.

Traduction française par Joëlle Cornavin .

Relecture de la traduction française par Éric Madesclair .

Article publié sous Open Publication License. La Linux Gazette n'est ni produite, ni sponsorisée, ni avalisée par notre hébergeur principal, SSC, Inc.


Table des matières
1. Qu'est-ce que Phoenix ?
2. L'approche de Phoenix
3. Matériel de Phoenix
4. Logiciels de Phoenix
5. Phoenix et Python
6. Expériences !
6.1. Temps de vol
6.2. Condensateur de décharge
7. Orientation future

Bon nombre d'entre nous qui ont été scolarisés dans un passé déjà lointain se rappelleront avec bonheur du temps passé dans les laboratoires de sciences à apprendre des choses amusantes et palpitantes sur le monde qui nous entoure. J'avais une fascination pour la chimie et je me revois encore en train de faire des expériences sans grand danger avec des substances nocives comme l'acide sulfurique derrière les portes closes de mon laboratoire personnel « privé ». La physique était un peu trop « intellectuelle » pour mon goût, mais je n'en fus pas moins passionné quand j'ai découvert le Phoenix Project, dont le but est de mettre les techniques modernes de la physique expérimentale « basée sur l'informatique » à la portée de l'étudiant et de l'amateur dans les pays en voie de développement. Cet article est écrit dans l'intention que le corps enseignant et les fervents de GNU/Linux impliqués dans le projet prennent ainsi l'initiative d'un effort de « constitution d'une communauté ».


1. Qu'est-ce que Phoenix ?

Le Phoenix Project [1] est le résultat des travaux de B. P. Ajith Kumar, un chercheur qui travaille avec le Nuclear Science Centre, en Inde [2]. Ajith décrit Phoenix comme de la physique avec des équipements « maison » et des expériences innovantes. La physique expérimentale moderne fait appel à un large éventail d'équipements complexes interfacés avec des ordinateurs polyvalents. Les données recueillies par ces équipements sont introduites dans la machine à l'aide de « matériel d'acquisition de données » coûteux (la plupart du temps des convertisseurs analogique->numérique à haute vitesse) où elles sont analysées par des outils mathématiques sophistiqués. La pratique courante de l'enseignement de la physique des étudiants préparant une licence (au moins dans la partie du monde où je vis) ne manifeste qu'un intérêt de pure forme à cet aspect important de la formation d'un physicien en incorporant un exposé sur la « programmation C » et/ou les « microprocesseurs » au programme. L'objectif du Phoenix Project est de changer la situation pour l'améliorer, en donnant aux élèves des écoles/lycées une occasion d'utiliser l'ordinateur pour observer et analyser des phénomènes réels.

Permettez-moi de vous présenter deux exemples simples. Le temps de mesure est une notion fondamentale dans beaucoup d'expériences. Supposez que vous souhaitiez mesurer le temps de vol d'un objet soumis à la pesanteur. Vous notez le moment exact où il chute et vous mesurez également le moment où il frappe le sol. Une petite boule en acier peut être facilement saisie par un électro-aimant qui est activé par le port parallèle du PC. La boule peut être relâchée en désactivant la bobine (il suffit d'une simple instruction out sur le port parallèle). Quand la boule frappe le « sol », on peut lui faire fermer/ouvrir une sorte de « contact » connecté à une broche d'entrée du port parallèle. Quelques lignes de code qui mesurent le moment où une broche de sortie du port parallèle désactive la bobine et le moment où une broche d'entrée change d'état devraient être suffisantes pour vérifier un principe de physique important. Consultez ce document ici.

Quelles sont les principales pierres d'achoppement de la présentation d'une telle expérience ?

À titre d'autre exemple, dans la théorie de base des circuits, nous nous familiarisons avec la manière dont se comportent les réseaux de résistance-condensateur. Un convertisseur analogique->numérique sur 8 bits peu coûteux connecté au port parallèle et l'échantillonnage périodique de la tension sur le condensateur produira des quantités de nombres que l'on peut analyser pour se faire une meilleure idée du comportement des réseaux RC (Resistor Capacitor, résistance-condensateur). Là encore, les principales contraintes impliquées ici sont de mettre en place le circuit CAN (convertisseur analogique->numérique) et d'écrire des programmes de mesure. Il y a une solution — acheter du matériel et des logiciels d'acquisition de données disponibles dans le commerce, mais ce n'est pas forcément attractif en raison des dépenses entraînées.


2. L'approche de Phoenix

Pour que les expériences de physique basées sur l'informatique deviennent réalité dans nos laboratoires scolaires, nous avons besoin :


3. Matériel de Phoenix

Voici une image du kit entièrement assemblé :

Le matériel se compose :

Outre ces éléments « programmables », le dispositif contient aussi les unités suivantes, ce qui simplifie l'interfaçage :

Un schéma de principe est disponible ici. Vous pouvez suivre ce lien pour lire une description détaillée du fonctionnement de chacune des unités fonctionnelles. Des schémas de circuit complets, avec topologie de PCB (Printed Circuit Board, carte de circuit imprimé) prêts à l'emploi, sont également disponibles sur la page d'accueil du projet. La conception est pratiquement stable ; quelques boîtiers ont été fabriqués et distribués à fins de test.


4. Logiciels de Phoenix

Toutes les unités programmables du kit Phoenix peuvent être manipulées en exécutant quelques instructions in/out sur le port parallèle. Deux des aspects à prendre en charge étaient :

Trois approches ont été identifiées :

La troisième approche s'est avérée relativement meilleure. Les utilisateurs n'auront besoin d'aucun privilège spécial, et le code du noyau est garanti ne pas être perturbé par d'autres processus (les boucles actives de mesure de gestion du temps dans le noyau gèleront le système, mais dans presque tous les cas, nous avons besoin de boucles très courtes inférieures à la seconde ; ce n'est donc pas un gros problème).

Un programme de pilote témoin (encore en phase expérimentale !) peut être téléchargé ici. Vous observerez que la majeure partie du code est une seule fonction ioctl géante qui sait faire des choses comme définir les broches numériques de sortie, lire la valeur sur les broches d'entrée, définir la tension sur l'alimentation en tension programmable, lire l'CAN, mesurer le temps entre un front montant et un bord tombant [3] sur une broche numérique d'E/S, etc.


5. Phoenix et Python

Un des avantages de placer le code du pilote sensible à la gestion du temps dans le noyau est que maintenant, il devient possible pour nous d'interagir avec le matériel via un langage comme Python, que l'on ne peut normalement pas employer pour le travail en temps réel. Étant fan de Python, une de mes premières réalisations avec le boîtier de Phoenix a été d'essayer d'écrire une bibliothèque Python simple pour dialoguer avec le matériel. Mon intention était de pouvoir faire des choses comme :


>>> from phoenix import *
>>> p = Phoenix() # Nous avons  un 'objet phoenix'
>>> p.set_voltage(2000) # Fixer la sortie DAC à 2000 mV
>>> p.select_adc(0) # Sélectionner le canal CAN 0
>>> p.zero_to_5000() # Numériser la tension sur le canal 0 et renvoyez la valeur entre 0 et 5000 mV

Une telle interaction, qui donne des retours immédiats, pourrait être le commencement de la meilleure introduction de l'étudiant au dispositif.

D'ailleurs, il est intéressant de voir comme il est facile (et naturel) d'utiliser Python pour faire de l'informatique sophistiquée (programmation fonctionnelle, lambda-calcul, fermetures...) et normale, les pieds sur terre, avec l'interaction du système d'exploitation, comme représenté dans l'extrait ci-dessus. Le code source du module Python (expérimental !) est disponible ici. Les lecteurs pourraient être intéressés par l'utilisation du module fcntl, ainsi que les modules struct et array pour effectuer les opérations ioctl requises pour commander le dispositif.


6. Expériences !

Le matériel de Phoenix, tout comme les logiciels, fournit une infrastructure générale pour un interfaçage et une expérimentation aisés. Je vais décrire deux expériences très simples que j'ai conduites avec le boîtier. La page d'accueil du projet donne plus d'explications — l'une d'entre elles concerne une expérience intéressante et simple avec un pendule, que vous pouvez consulter ici. La conception d'autres expériences est un des domaines où une communauté d'enseignants et de développeurs peut contribuer énormément.


6.1. Temps de vol

Un électro-aimant (une bobine de relais désassemblée) est connecté à une des broches du pilote de moteur pas à pas du boîtier de Phoenix et sert à maintenir fermement une petite boule de fer. Le code du pilote de noyau contient une routine qui désexcite la bobine de relais, note l'heure et se met en boucle jusqu'à ce qu'une broche passe de bas à haut, en notant l'heure où le phénomène se produit. Les deux estampilles temporelles sont retransmises au « pays magique des utilisateurs », où un programme Python les capture et renvoie la différence.

La boule de fer tombe quand la bobine de relais est désexcitée et frappe la table avec fracas. Un haut-parleur est placé à l'envers sur la table, capte les vibrations et les convertit en signaux électriques. Les signaux électriques faibles sont amplifiés par les blocs d'amplificateur sur le boîtier de Phoenix et introduits dans une broche numérique d'entrée qui enregistre une transition de bas à haut. Le code du pilote de noyau peut très facilement calculer la différence de temps entre le moment où la boule est libérée et l'instant où elle frappe la table, provoquant une transition électrique sur la broche d'entrée. Cette différence de temps peut être mise en relation dans une équation simple et la distance parcourue peut être calculée.

Voici une image de la configuration que j'ai utilisée pour conduire cette expérience :

Et voici le code Python :


from phoenix import *
p = Phoenix()
p.write_motors(0xf) # Exciter les broches du pilote de moteur pas à pas
t = p.get_drop_time() # Faire tomber la boule et noter l'heure !
print t

6.2. Condensateur de décharge

Le pilote du noyau de Phoenix contient du code pour prendre des échantillons répétés provenant de l'CAN (avec un délai optionnel intermédiaire). Il est possible de commencer à prendre des échantillons quand un déclenchement particulier est reçu — le déclenchement est sous la forme d'un « bord tombant » sur la broche numérique d'entrée 0. Cette fonctionnalité peut être employée pour tracer la tension à travers un condensateur de décharge (j'ai utilisé une résistance de 10 k et un condensateur de 100 µF). Observons le segment de code Python :


from phoenix import *

p = Phoenix()
p.select_adc(0)
# 1000 points, 2 ms delay between reads
r = p.trig_read_block(1000, 2000)
for val in r:
        print val[0], val[1]

La fonction trig_read_block rassemble 1 000 échantillons provenant du convertisseur analogique->numérique avec un délai intermédiaire de 2 000 micro-secondes. La collection témoin ne commence que quand le déclenchement est reçu, ce dernier étant un bord tombant sur la broche numérique d'entrée 0. La valeur renvoyée par la fonction est une liste dont chaque élément est un couple de la forme (timestamp, adval) où 'timestamp' est l'instant du moment où l'échantillon a été pris. La boucle for affiche simplement ces nombres sur l'écran ; la sortie peut être redirigée vers un fichier et tracée à l'aide du puissant utilitaire qu'est gnuplot (une commande simple à l'invite de gnuplot de la forme plot "a.dat"). Voici le graphe que j'ai obtenu :


7. Orientation future

Le Phoenix Project vient juste de sortir du laboratoire. Pour devenir un succès, comme n'importe quel projet de logiciel ou de matériel libre, il doit pouvoir attirer une communauté de fervents — des enseignants et des étudiants en sciences, des amateurs d'électronique, des geeks Linux, des développeurs de matériel... Quantités de logiciels doivent être écrits et de nouvelles expériences conçues. J'espère que cet article contribuera, à son modeste niveau, à l'implication de la communauté. N'hésitez pas à me contacter si vous voulez en savoir plus sur le projet ou si vous souhaitez organiser un atelier ou une démonstration. Suivez ce lien pour contacter le développeur de Phoenix et savoir comment obtenir le matériel et les logiciels.

Je suis formateur et travaille pour IC Software® à Kerala (Inde). J'aurais aimé travailler dans le domaine de la chimie organique, mais je donne le meilleur de moi-même à ma seconde passion, jouer avec Linux et enseigner la programmation !

Notes

[1]

Pour éviter la confusion avec d'autres projets du même nom en français, il est important de garder la dénomination Phoenix Project originale. (N. d. T.)

[2]

Depuis le 1er juin 2005, cet organisme a changé de nom. Il est désormais désigné sous l'acronyme IUAC (Inter University Accelerator Centre. (N. d. T.)

[3]

« Falling edge » se traduit également par « bord négatif ». (N. d. T.)