Outils pour utilisateurs

Outils du site


sonification_vegetale_pdb_2020

Ceci est une ancienne révision du document !


Table des matières

Présentation

En cette année 2020, nous souhaitons à nouveau présenter un dispositif sonore piloté par les données transmises par une plante. Cette fois-ci, nous souhaitons utiliser deux nouvelles technologies : du côté matériel, un Floranion Shield couplé à un FRDM-KL25Z, du côté logiciel un programme en SuperCollider.

Préparation

Afin de documenter l'ensemble du processus, je décide de partir d'une installation neuve de Debian 9.

Premièrement, je souhaite installer SuperCollider, à l'aide de la commande suivante :

sudo apt install supercollider

Je veux ensuite faire fonctionner le capteur. En l'ayant branché, celui-ci s'allume, mais il faut le configurer pour qu'il accepte le Floranion Shield. Il faut brancher le FRDM-KL25Z sur le PC en maintenant le bouton Reset, pour avoir accès au Bootloader, et copier le fichier de mise-à-jour dans celui-ci. Plus d'infos ici :

https://os.mbed.com/handbook/FirmwareFRDM-KL25Z

Je regrette qu'il faille s'inscrire sur le site pour réaliser le projet…

https://os.mbed.com/users/lasmahei/code/floranionSciShield

Le lien ci-dessus permet, après avoir ajouté le FRDM-KL25Z à la liste des compilateurs, de compiler et récupérer un fichier .bin correspondant au paramétrage du Shield pour cette carte ARM précise, qu'il faut rajouter dans le dossier MBED, disponible après avoir rebranché le FRDM-KL25Z. J'appuie ensuite sur le bouton Reset pour mettre tout ça à jour.

Je tape la commande

cat /dev/ttyACM0

pour afficher les valeurs du capteur à l'écran.

Si cela ne fonctionne pas, il est possible que la féquence de lecture du port série soit mauvaise. Je peux vérifier celle-ci avec la commande :

stty -F /dev/ttyACM0

Si la valeur affichée après speed est différente de 115200, je tape la commande suivante pour ajuster le bitrate de réception des capteurs à 115200 bauds (sans quoi je n'aurai pas de retour) :

stty -F /dev/ttyACM0 115200

Il me faut maintenant trouver comment envoyer données vers SuperCollider.

En fait, il existe déjà une classe pour accéder aux ports série : SerialPort.

SerialPort.devices

me renvoie une liste des ports disponibles. /dev/ttyACM0 apparaît bien.

Je lance SuperCollider, dans un terminal, via la commande

sudo scide

En effet, sans les droits d'utilisateur, je n'obtiens pas de données lors de la lecture du port…

Le code de décodage

(

SerialPort.cleanupAll; // Premièrement, on remet à zéro les ports série pour ne pas avoir d'erreur

p = SerialPort( // On crée une nouvelle instance de port série
	"/dev/ttyACM0", // Avec la bonne adresse
	baudrate: 115200, // Et la bonne fréquence de communication
);

// Le caractère '*' équivaut au byte 42
// Le caractère ' ' (vide) équivaut au byte 32

r = Routine( // Nous allons créer une boucle pour lire constamment les données du capteur
	{
		var state = 0; // Nous permet de référencer l'index de la valeur en cours de lecture
		var string = ""; // Nous permet de référencer la valeur en cours de lecture
		var list = List.new(); // Nous permet de stocker les données lues
		var fourth_data_offset = 0;	// Nous permet d'incrémenter la quatrième valeur

		loop { // En boucle:

			var byte = p.read; // On lit le byte actuel du capteur
			var data = byte.asAscii; // Et on le traduit en Ascii

			if( byte != 32, // S'il est différent de " " ( vide )
				{
					if( ( state < 3 ), { // Si l'on est sur une des trois premières valeurs,
						string = string ++ data; // on rajoute la data à la suite de caractères actuels
					}, { // Si nous sommes sur la quatrième valeur, "*" est détecté, c'est la fin des données :
						list.add( fourth_data_offset.asFloat ); // On ajoute la quatrième valeur à la liste
						//list.postln; // Pour afficher la liste dans la console.
						list = List.new(); // On remet la liste à zéro
						fourth_data_offset = 0; // On remet le compteur de la donnée 4 à zéro
						state = 0; // On remet l'état à zéro
					} );
				}, { // Si le caractère est " " ( vide )
					if( ( state < 3 ), { // Si l'on est sur une des trois premières valeurs
						if( ( string != ""), { // Si la suite de caractère n'est pas vide, ( pour les espaces vides après "*" )
							list.add( string.asFloat ); // On la stocke dans la liste
							state = state + 1; // On incrémente l'état
							string = ""; // Et on remet la valeur stockée à zéro
						} );
					}, { // Sinon, si l'on est sur la quatrième valeur,
						fourth_data_offset = fourth_data_offset + 1; // On augmente le compteur
					} );
				}
			);
		};
	};
).play; // Et on lance tout ça

)

r.stop; // Permet d'arrêter la routine.

Celui-ci est commenté ligne par ligne.

sonification_vegetale_pdb_2020.1583235369.txt.gz · Dernière modification : 2020/03/03 11:36 de Simon Deplat