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
Prochaine révisionLes deux révisions suivantes
godot_et_le_port_serie [2020/03/06 09:54] Simon Deplatgodot_et_le_port_serie [2020/04/04 10:37] 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 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 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 :
 +
 +{{::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.txt · Dernière modification : 2020/12/01 17:43 de serge