GANT INTERPRETEUR DE LA LANGUE DES SIGNES

Projet de Benoit T, Hugo P, Le Bao D. et Loris M.

  • Trier les valeurs mesurées
  • Envoyer les données
  • Interpréter les données

PROGRAMMATION

C++ simplifié

IDE

Script

Communication série

  • Code Arduino
  • Scripts Python
  • Améliorations

Arduino

													const int flex[] = {A0, A1, A2, A3, A4};
const int bp[] = {1, 2, 3, 4, 5};
int flexp[5];
bool bps[5];
int d[5];
int doigt[5];

Déclaration des variables

  • Entrées analogiques utilisées par les flex sensors
  • Entrées utilisées par les interrupteurs
  • Position des flex sensors
  • Etats des interrupteurs
  • Etats intermédiaires
  • Etats des doigts

SimaArduino.ino

Pourquoi utiliser des listes ?

													const int flex[] = {A0, A1, A2, A3, A4};
const int bp[] = {1, 2, 3, 4, 5};
  • Optimisation
  • Lisibilité
  • Simplicité

SimaArduino.ino

													const int flex0 = A0; //déclarer les variables sans liste...
const int flex1 = A1;
const int flex2 = A2;
...
													void setup(){
	Serial.begin(9600);
	for (int i = 0; i < 5; i++){
		pinMode(flex[i], INPUT);
		pinMode(bp[i], INPUT);
	}
}

Fonction setup

  • Initialisation communication série
  • Boucle: initialisation des entrées

SimaArduino.ino

													void loop(){
	for (int i = 0; i < 5; i++){
		flexp[i] = analogRead(flex[i]);
		bps[i] = digitalRead(bp[i]);

		d[i] = map(flexp[i], 90, 280, 0, 300);
		d[i] = constrain(d[i], 0, 300);

		doigt[i] = 0;

Fonction loop

Boucle pour chaque doigt:

  • Variable position flex sensor = résistance flex sensor (0-1023)
  • Variable état bouton = 1 ou 0
  • Variable intermédiaire 0 < d < 300
  • Récupération des valeurs volatiles
  • Etat final du doigt = 0

SimaArduino.ino

													if (flexp[i] > 0){
	if (d[i] <= 100){
		doigt[i] = 3;
	} else if (d[i] > 200){
		doigt[i] = 1;
	} else {
		doigt[i] = 2;
	}
	if (bps[i] == 1){
		doigt[i] = doigt[i] + 3;
	}
}

SimaArduino.ino

Modélisations effectuées sur SolidWorks 2016, avec PhotoView 360

													if (bps[i] == 1){
	doigt[i] = doigt[i] + 3;
}

Les interrupteurs

Si activé: rajoute 3 à l'état du doigt

SimaArduino.ino

Etat = 1

Etat = 1 + 3 = 4

Etat = 2

Etat = 2 + 3 = 5

Etat = 3

Etat = 3 + 3 = 6

13301

Oui mais ... non

0 = Dysfonctionnement

Annulaire non pris en compte

Pouce

Index

Majeur

Annulaire

Auriculaire

Antoine Griezmann

Python

Organisation

SimaSLI/

SimaCore.py

SimaVoice.py

TextInput.py

main.py

config.cfg

db.txt

Module des fonctions principales

Module voix de synthèse

Module boite textuelle (GUI)

Script

Fichier configuration

Fichier base de données

GetConfig(cfg)

SimaCore.py

GetPort(port, baud, timeout)

GetArgs()

 Récupère la configuration

 Intercepte les arguments de lancement

 Teste le port série

Logger()

 Affiche toutes les informations dans la console

Configuration

															def GetConfig(cfg):	#fonction pour récupérer la configuration
	try:
		config = ConfigParser.ConfigParser()	#initialisation du configparser
		config.read(cfg)

		port = config.get('ARDUINO', 'port')	#récupération des valeurs
		baud = config.get('ARDUINO','debit')
		serial_timeout = config.getint('ARDUINO','serial_timeout')

		db_file = config.get('SIMA', 'database')
		debug_mode = config.getboolean('SIMA', 'debug_mode')
		debug_code = config.get('SIMA', 'debug_code')

		test_timeout = config.getint('GUI', 'test_timeout')

		synth_lang = config.get('VOICE', 'synth_lang')
		persistant = config.getboolean('VOICE', 'persistant')
		return (port, baud, serial_timeout, db_file, debug_mode,
debug_code, test_timeout, synth_lang, persistant)
	except:
		Quit()	#interception des erreurs

SimaCore.py

Récupérer la configuration de l'utilisateur

SimaCore.py

															def GetArgs():	#fonction pour récupérer les arguments de lancement
	parser = optparse.OptionParser()
	parser.add_option("-n", "--nogui", action="store_false", dest="gui", default=True)
	#"python main.py -n" pour désactiver l'interface
	parser.add_option("-v", "--voice", action="store_true", dest="voice", default=False)
	#"python main.py -v" pour activer le module de voix de synthèse
	opt, args = parser.parse_args()	#stockage des variables
	options = vars(opt)
	gui = options.get('gui')
	voice = options.get('voice')
	return (gui, voice)

def GetPort(port, baud, serial_timeout):	#fonction pour tester le port série
	try:
		serial_arduino = serial.Serial(port, baud, rtscts=True,
dsrdtr=True, timeout=serial_timeout)
		return (1, serial_arduino)	#retourne 1 si le port est disponible
	except IOError:
		return (0, 0)	#retourne 0 si erreur d'ouverture

Récupérer les arguments de lancement

Tester si le port est disponible

Séquence d'initialisation de SimaSLI

													[ARDUINO]
port: /dev/ttyUSB0
debit: 9600
serial_timeout: 10

[SIMA]
database: db.txt
debug_mode: False
debug_code: 14111

[GUI]
test_timeout: 2

[VOICE]
synth_lang: en
persistant: True

config.cfg

  • Port de la carte Arduino
  • Débit
  • Temps d'attente lors de l'ouverture du port
  • Fichier base de données
  • Activation du mode test
  • Code par défaut
  • Attente entre deux tests
  • Langue de la voix de synthèse
  • Persistance des données vocales

Base de données

SimaCore.py

GetDB()

Ouverture du fichier base de données

Pour chaque ligne du fichier faire:

    La découper en 3 éléments

    Le premier élément va dans la liste [code]

    Le deuxième élément va dans la liste [word_fr]

    Le troisième élément va dans la liste [word_en]

															14111;bonjour;hello
13331;qui;who
15111;oui;yes
13333;boire;to drink
11411;bonjour;hello

db.txt

															def GetDB(file):	#fonction pour récupérer la base de données
	txt = []
	db = open(file, 'r')	#ouverture du fichier base de données
	with db as inputfile:
		for line in inputfile:
			txt.append(line.strip().split(';'))	#toutes les lignes sont récupérées
			code = [item[0] for item in txt]
			word_fr = [item[1] for item in txt]
			word_en = [item[2] for item in txt]
	db.close()	#fermeture du fichier
	return (code, word_fr, word_en)

SimaCore.py

													txt = [[14111, bonjour, hello], [13331, qui, who]]
													code = [14111, 13331]
													word_fr = [bonjour, qui]
													word_en = [hello, who]

Le contenu des variables

Encore des listes !

GetArduinoCode(serial)

SimaCore.py

interpreter_fr(ser, code, word_fr)

 Récupère le code envoyé par la carte

 Fonction interprétation

													code = [14111, 11411, 13331]
													word_fr = [bonjour, bonjour, qui]
													ser = 13331

Interprétation

main.py

Si liaison série:

    [ser] est récupéré avec la fonction GetArduinoCode()

Sinon:

    [ser] par défaut du fichier config

 

Si [ser] différent de [précédent] :

    Affichage du mot associé en français avec interpreter_fr()

    Affichage du mot associé en anglais avec interpreter_en()

    [précédent] = [ser]

 

															def GetArduinoCode(arduino):	#fonction qui récupère le code envoyé par la carte
	code = arduino.readline()	#récupération du code
	data_ser = re.findall('\d+', code)	#nettoyage du code
	if not data_ser or data_ser[0] == 0:	#test de validité du code
		return "0"
	else:
		return data_ser[0]	#retour du code reçu et nettoyé

def interpreter_fr(ser, code, word_fr):	#fonction interprétation
	if ser != "0":	#test du code reçu
		if ser in code:	#test de la présence du code dans la base de données
			idx = code.index(ser)
				return word_fr[idx]	#la fonction retourne le mot associé
		else:
			return "error"	#si le code n'existe pas elle retourne une erreur
	else:
		return "null"	#si le code n'est pas valide elle retourne "null"

SimaCore.py

															try:	#exécution jusqu'à interruption
	while True:
		if com == 0:	#test si la carte est connectée
			ser = debug_code
		else:
			ser = SimaCore.GetArduinoCode(serial_arduino)
		if ser != old:	#test si le signe a changé
			old = ser
			show_fr = SimaCore.interpreter_fr(ser, code, word_fr)
			show_en = SimaCore.interpreter_en(ser, code, word_en)

			if show_fr == "error":	#test du mot
				error = 1
			elif show_fr == "null":
				SimaCore.Restart()
			else:
				error = 0
			print("[FRENCH] " + show_fr)	#affichage du mot
			print("[ENGLISH] " + show_en)

except KeyboardInterrupt:	#interception du [ctrl] + [C]
	print ("[ERROR] Liaison interrompue")

main.py

Apprentissage

Pour remplir la base de données plus simplement

main.py

Demander mot français et stocker dans [ask_fr]

Demander mot anglais et stocker dans [ask_en]

Si liaison série:

    [code] est récupéré avec la fonction GetArduinoCode()

Sinon:

    [code] par défaut du fichier config

 

Créer nouvelle ligne: ( [code] + ";" + [ask_fr] + ";" + [ask_en])

Ouvrir la base de données

Ecrire la ligne

Voix de synthèse

SimaSLI/

fr/

en-uk/

5d41402abc4b2a76b9719d911017c592.mp3

f02368945726d5fc2a14eb576f7276c0.mp3

EncodeFileName(text) //encode

GetFile(name, lang) //vérifie

SaveFile(text, name, lang) //télécharge

Speak(name, lang) //lit

Conclusion

Comprendre le mouvement des doigts: SimaArduino

Interpréter le signe: SimaCore

  • Trie les valeurs mesurées
  • Définit un état aux doigts
  • Test code reçu/base de données
  • Mode apprentissage

Communiquer: SimaSLI

  • Interface graphique
  • Voix de synthèse
  • Affichage du mot

Améliorations

  • Base de données collaborative (en ligne)
  • Mise à jour automatique
  • Traduction en ligne (API de traduction)

Module SimaDirect

Mode phrase

  • Alignement des mots
  • Détection de début et fin de phrase

Pour aller plus loin

SimaCore... un pont entre le gant et les scripts

Capteurs

Ordinateur

Arduino

Gant

SimaCore

Outil de développement pour différents projets

SimaCore

SimaSLI

SimaProject

Jeux

Simulations

Code source disponible sur GitHub

https://hugo-p.github.io/SimaShifumi/

Pour finir

Codes sources disponibles sur notre GitHub

https://github.com/hugo-p/SimaSLI

Retrouvez plus d'informations sur notre site

http://sima.pointcheval.fr/