Projet de Benoit T, Hugo P, Le Bao D. et Loris M.
C++ simplifié
IDE
Script
Communication série
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];
SimaArduino.ino
const int flex[] = {A0, A1, A2, A3, A4};
const int bp[] = {1, 2, 3, 4, 5};
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);
}
}
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;
Boucle pour chaque doigt:
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;
}
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
Oui mais ... non
0 = Dysfonctionnement
Annulaire non pris en compte
Pouce
Index
Majeur
Annulaire
Auriculaire
Antoine Griezmann
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
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
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]
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
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
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
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
Comprendre le mouvement des doigts: SimaArduino
Interpréter le signe: SimaCore
Communiquer: SimaSLI
Module SimaDirect
Mode phrase
SimaCore... un pont entre le gant et les scripts
Capteurs
Ordinateur
Arduino
Gant
SimaCore
Outil de développement pour différents projets
SimaSLI
SimaProject
Jeux
Simulations
Code source disponible sur GitHub
Codes sources disponibles sur notre GitHub
Retrouvez plus d'informations sur notre site
Téléchargements