Outils pour utilisateurs

Outils du site


godot_et_le_port_serie

Ceci est une ancienne révision du document !


Présentation

Aujourd'hui, je souhaite réaliser un programme permettant, à l'aide d'un instrument, de jouer une animation sur un écran.

Les technologies impliquées sont les suivantes : un KY-038 ( ou microphone ), relié à un Arduino, qui communique par le port série avec le logiciel Godot, que je maîtrise assez bien pour créer de petites animations.

Arduino et KY-038

Le module de microphone est tout simple à utiliser : il possède quatre broches.

Les premières correspondent, comme d'habitude, à l'alimentation. La broche notée “+”, parfois appelée “Vcc” ou “Vin”, se connecte à la pin 5V de l'Arduino, tandis que la broche “G”, abréviation de “GND” (ou ground), parfois appelée “-”, se connecte à la pin “GND” de l'Arduino. Il reste deux broches sur le capteur : “DO” et “AO”. La première, Digital Out, ne m'intéresse pas : elle enverra une donnée binaire : pas de courant si le son capté est en-dessous du seuil, 5V le cas échéant. L'autre broche, Analog Out, va me permettre de récupérer une valeur relative du bruit capté, via une entrée analogique de l'Arduino, ici A0. Voici le code :

int sound_sensor = A0; // Broche d'entrée des données
int measure_length = 100; // Longueur du cycle de mesure

void setup() {
  
  pinMode( sound_sensor, INPUT ); // Broche A0 en entrée
  Serial.begin( 9600 ); // Début de la communication avec l'ordinateur

}

void loop() { // À chaque boucle

  int counter = 0; // On initialise un compteur
  int measure = 0; // On crée une variable pour stocker nos données
  
  while ( counter < measure_length ) { // Tant que l'on a pas fini de compter
    
    measure = measure + analogRead( sound_sensor ); // On ajoute la valeur lue à notre variable
    counter++; // On incrémente le compteur
    delay( 1 ); // On attends une milliseconde
    
  };

  measure = measure / measure_length; // Ici on fait la moyenne

  Serial.println( measure ); // Et on affiche tout ça dans le port série, sous Linux à priori /dev/ttyACM0
}

Une moyenne est effectuée afin de minimiser les éventuelles incohérences.

Lien avec Godot

Je pensais qu'il existait une classe déjà prête de communication avec le port série dans Godot mais ce n'est pas le cas. À la place, j'ai trouvé ceci :

D'abord, j'ai récupéré la bonne librairie via ce projet :

https://github.com/Superwaitsum/GDSercomm

Il faut copier le fichier libsercomm.so dans les librairies de l'ordinateur :

cd /chemin/du/dossier/bin/linux64/
sudo cp libsercomm.so /usr/lib/libsercomm.so
sudo ldconfig

En trois étapes : on navigue au bon endroit, avec les droits on copie la librairie au bon endroit puis on met tout ça à jour.

Je n'ai cependant pas utilisé ce projet Godot pour tester, mais le suivant, qui avait l'air plus à jour :

https://github.com/NangiDev/GDSerCommPlugin

Il faut ouvrir le fichier project.godot dans Godot, naviguer dans le menu Projet > Paramètres du Projet > Extensions puis activer l'addon Serial Communication.

On peut ensuite lancer l'interface, régler le port sur /dev/ACM0 et le baudrate sur 9600. Cela fait planter le logiciel car le code attends une string en entrée et que nous envoyons un integer depuis l'arduino ! Il faut modifier la ligne 43 comme ceci :

readLabel.add_text(str(PORT.read()))

pour retirer l'erreur. Voilà, les données captées s'affichent dans Godot !

Créer son propre programme

Nous n'avons pas exactement fini. Nous souhaitons plutôt utiliser notre propre programme, et également faire en sorte que les valeurs affichées soient également cohérentes dans Godot ce qui n'est pas encore le cas.

godot_et_le_port_serie.1583488832.txt.gz · Dernière modification : 2020/03/06 10:00 de Simon Deplat