Outils pour utilisateurs

Outils du site


sonification_vegetale_pdb_2020

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.

A propos du Floranion Shield https://www.elektormagazine.fr/magazine/elektor-201805/41593

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 :

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, depuis la liste des applications ou dans un terminal, via la commande :

scide

Le code de décodage


(

var decode_string = { | input | // Cette valeur nous permettra de transformer la suite de caractères fournie par le capteur par une liste de valeurs numériques.

	var string = ""; // On va stocker nos valeurs ici le temps de les reconstruire
	var values_list = List.new(); // Puis les regrouper dans cette liste.

	input.at( (1..6) ).do( // Première valeur
		{|item |
			if( item.isAlphaNum, { // On ne garde que les chiffres
				string = string ++ item;
			});
		});

	values_list.add( string.asInt );
	string = ""; // Remise à zéro

	input.at( (8..14) ).do( // Deuxième valeur
		{|item |
			if( ( item.isAlphaNum )||( item.isPunct  ), { // On ne garde que les chiffres et les points
				string = string ++ item;
			});
		});

	values_list.add( string.asFloat );
	string = ""; // Remise à zéro

	input.at( (15..18) ).do( // Troisième valeur
		{|item |
			if( item.isAlphaNum, { // On ne garde que les chiffres
				string = string ++ item;
			});
		});

	values_list.add( string.asInt );
	string = ""; // Remise à zéro

	values_list.add( input.size - 20 ); // La dernière valeur est définie par la position de l'astérisque, moins le nombre de caractères que prennent les valeurs précédentes ( 20 caractères ).

	//values_list.postln; // On affiche la liste contenant les valeurs numériques

};

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

		var test_string = "";

		loop { // En boucle:

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

			string = string ++ data; // On ajoute la data actuelle

			if( byte == 42, { // Si on a une astérisque, c'est fini
				//string.postln; // On affiche la string dans la console
				decode_string.value( string ); // On appelle la fonction de decodage
				string = ""; // Et on la remet à zéro
			} )
		};
	};
).play; // Et on lance tout ça

)

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

Celui-ci est commenté ligne par ligne, mais sera sûrement plus agréable à lire depuis SuperCollider où les couleurs différencieront les commentaires.

sonification_vegetale_pdb_2020.txt · Dernière modification : 2020/03/04 15:05 de Benjamin Labomedia