Outils pour utilisateurs

Outils du site


godot_et_le_port_serie

Différences

Ci-dessous, les différences entre deux révisions de la page.

Lien vers cette vue comparative

Les deux révisions précédentesRévision précédente
Prochaine révision
Révision précédente
godot_et_le_port_serie [2020/03/06 09:54] Simon Deplatgodot_et_le_port_serie [2020/12/01 17:43] (Version actuelle) – ↷ Liens modifiés en raison d'un déplacement. serge
Ligne 1: Ligne 1:
 +====== Godot et le port série ======
  
-====== Présentation ======+===== Présentation =====
  
 Aujourd'hui, je souhaite réaliser un programme permettant, à l'aide d'un instrument, de jouer une animation sur un écran. Aujourd'hui, je souhaite réaliser un programme permettant, à l'aide d'un instrument, de jouer une animation sur un écran.
Ligne 6: Ligne 7:
 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. 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 ======+===== Arduino et KY-038 =====
  
 Le module de microphone est tout simple à utiliser : il possède quatre broches. Le module de microphone est tout simple à utiliser : il possède quatre broches.
Ligne 26: Ligne 27:
  
   int counter = 0; // On initialise un compteur   int counter = 0; // On initialise un compteur
-  int measure = 0; // On crée une variable pour stocker nos données+  long int measure = 0; // On crée une variable pour stocker nos données, assez longue pour éviter le terrible stack overflow
      
   while ( counter < measure_length ) { // Tant que l'on a pas fini de compter   while ( counter < measure_length ) { // Tant que l'on a pas fini de compter
Ligne 38: Ligne 39:
   measure = measure / measure_length; // Ici on fait la moyenne   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+  Serial.write( measure ); // Et on affiche tout ça dans le port série, sous Linux à priori /dev/ttyACM0 sous forme de byte.
 } }
 </code> </code>
Ligne 44: Ligne 45:
 Une moyenne est effectuée afin de minimiser les éventuelles incohérences. Une moyenne est effectuée afin de minimiser les éventuelles incohérences.
  
-====== Lien avec Godot ======+===== 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 : 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 :
Ligne 74: Ligne 75:
  
 pour retirer l'erreur. Voilà, les données captées s'affichent dans Godot ! 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.
 +
 +Voici l'idée :
 +
 +{{media_12:spgodot.png?400|}}
 +
 +Le script du nœud KY038 est tout beau tout neuf.
 +
 +Le script du nœud Serial est une //copie// de MenuLogic.gd.
 +
 +Le script du nœud COM est Com.gd.
 +
 +Le code de base est dépendant de l'interface utilisateur proposée, qui permet de sélectionner les ports et baudrates de tous les ports série, ce qui nous intéresse peu. Je vais donc modifier les fichiers afin que tout soit réglé sur le port /dev/ttyACM0 à 9600 baudrate et que les valeurs captées déclenchent automatiquement une fonction dans le script du nœud KY038, pour n'avoir plus à me soucier du processus sous-jacent de récupération des valeurs. Pour des question de flemme, le processus ne sera pas documenté, mais le résultat est le suivant :
 +
 +Le script du nœud KY038 est le suivant :
 +
 +<code>
 +extends Node2D
 +
 +func new_input( value ):
 + print( value )
 +</code>
 +
 +Le script du nœud Serial est le suivant :
 +
 +<code>
 +tool
 +extends Control
 +
 +const SERCOMM = preload("res://addons/GDSerCommDock/bin/GDSerComm.gdns")
 +onready var PORT = SERCOMM.new()
 +
 +var value_string = ""
 +
 +func _ready():
 + PORT.open( "/dev/ttyACM0", 9600, 1000, $COM.bytesz.SER_BYTESZ_8, $COM.parity.SER_PAR_NONE, $COM.stopbyte.SER_STOPB_ONE)
 + PORT.flush()
 + set_physics_process(true)
 +
 +#_physics_process may lag with lots of characters, but is the simplest way
 +#for best speed, you can use a thread
 +#do not use _process due to fps being too high
 +func _physics_process(delta):
 + if PORT != null && PORT.get_available()>0:
 + for i in range(PORT.get_available()):
 + var data = PORT.read()
 + get_node("..").new_input( data )
 +</code>
 +
 +Note : j'ai d'abord eu des valeurs incohérentes en utilisant Serial.print( measure ) dans le code Arduino. En utilisant Serial.write, les valeurs dans Godot sont bien mieux récupérées.
 +
 +Pour finir, j'ai rajouté un CPUParticles2D afin que celui-ci émette un visuel quand on détecte un bruit sur le capteur :
 +
 +Script du nœud KY038 :
 +
 +<code>
 +extends Node2D
 +
 +var threshold = 45;
 +
 +func new_input( value ):
 + if value < threshold:
 + $CPUParticles2D.set_emitting( false )
 + else:
 + $CPUParticles2D.set_emitting( true )
 +</code>
 +
 +Maintenant, de petites étoiles apparaissent sur l'écran quand on souffle sur le capteur ! Choupi !
godot_et_le_port_serie.1583488482.txt.gz · Dernière modification : 2020/03/06 09:54 de Simon Deplat