Echanges autour d'EduPython.
Vous n'êtes pas identifié(e).
Pages : 1
Bonjour,
Je suis en train d'essayer un tp de physique de l'academie de Besançon sur comment jouer un son avec arduino et python.
Méthode :
1. Script python, microcontroleurs.py
#! encoding: utf-8 import serial class arduino(): def __init__(self,port): self.serie = serial.Serial(port,baudrate=9600) synchro = ord(self.serie.read()) while synchro != 0: synchro = ord(self.serie.read()) def sortie_numerique(self,pin,etat): self.serie.write(chr(1).encode('latin-1')) self.serie.write(chr(pin).encode('latin-1')) self.serie.write(chr(etat).encode('latin-1')) def entree_numerique(self,pin): self.serie.write(chr(2).encode('latin-1')) self.serie.write(chr(pin).encode('latin-1')) val=ord(self.serie.read()) return val def sortie_analogique(self,pin,val): self.serie.write(chr(3).encode('latin-1')) self.serie.write(chr(pin).encode('latin-1')) self.serie.write(chr(val).encode('latin-1')) def entree_analogique(self,pin): self.serie.write(chr(4).encode('latin-1')) self.serie.write(chr(pin).encode('latin-1')) val1=ord(self.serie.read()) val2=ord(self.serie.read()) return val1*256 + val2 def son(self,pin,freq,duree=0): self.serie.write(chr(5).encode('latin-1')) self.serie.write(chr(pin).encode('latin-1')) self.serie.write(chr(freq>>8 & 255).encode('latin-1')) self.serie.write(chr(freq & 255).encode('latin-1')) self.serie.write(chr(int(duree*1000)>>8 & 255).encode('latin-1')) self.serie.write(chr(int(duree*1000) & 255).encode('latin-1')) def module_us(self,echo,trig): self.serie.write(chr(6).encode('latin-1')) self.serie.write(chr(echo).encode('latin-1')) self.serie.write(chr(trig).encode('latin-1')) val1=ord(self.serie.read()) val2=ord(self.serie.read()) return val1*256 + val2 def resistance_pt100(self,cs,di,do,clk): self.serie.write(chr(7).encode('latin-1')) self.serie.write(chr(cs).encode('latin-1')) self.serie.write(chr(di).encode('latin-1')) self.serie.write(chr(do).encode('latin-1')) self.serie.write(chr(clk).encode('latin-1')) val1=ord(self.serie.read()) val2=ord(self.serie.read()) return 430*(val1*256 + val2)/32768 def fermer(self): self.serie.close()
2. Script emission son.py
from microcontroleurs import arduino import time macarte = arduino("COM3") #nom du port à adapter ###Creation d'un son for i in range(3): macarte.son(6,262,0.4) time.sleep(0.80) macarte.son(6,262,0.4) time.sleep(0.80) macarte.son(6,262,0.4) time.sleep(0.80) macarte.son(6,294,0.4) time.sleep(0.80) macarte.son(6,330,0.70) time.sleep(1.10) macarte.son(6,294,0.70) time.sleep(1.10) macarte.son(6,262,0.4) time.sleep(0.90) macarte.son(6,330,0.40) time.sleep(0.80) macarte.son(6,294,0.40) time.sleep(0.80) macarte.son(6,294,0.40) time.sleep(0.80) macarte.son(6,262,0.90) time.sleep(1.30) macarte.fermer()
3. Manip
- le fichier microcontroleurs.py est dans le même répertoire que le fichier emission son.py
- le port choisi est com3 et noté dans le gestionnaire de périphériques de l'ordi
- la connexion est bien entre pin6 et gnd pour le hp
- le hp est 8ohms et 1W avec en série sur le pin6 une résistance 100ohms
Après lancement du fichier :
- La console indique :
*** Console de processus distant Réinitialisée *** >>>
- l'exécution du fichier est bloquée....bug
Pouvez vous m'aider? Merci
Bien cordialement
lj
Hors ligne
Bonjour,
Je ne vois rien d'anormal, mais je n'ai pas le matériel pour tester, peut-être pouvez-vous déjà mettre quelques print pour suivre le déroulement du code, par exemple :
from microcontroleurs import arduino import time print("début") macarte = arduino("COM3") #nom du port à adapter print("carte initialisée") ###Creation d'un son for i in range(3): macarte.son(6,262,0.4) time.sleep(0.80) print(i) macarte.son(6,262,0.4) time.sleep(0.80) macarte.son(6,262,0.4) time.sleep(0.80) macarte.son(6,294,0.4) time.sleep(0.80) macarte.son(6,330,0.70) time.sleep(1.10) macarte.son(6,294,0.70) time.sleep(1.10) macarte.son(6,262,0.4) time.sleep(0.90) macarte.son(6,330,0.40) time.sleep(0.80) macarte.son(6,294,0.40) time.sleep(0.80) macarte.son(6,294,0.40) time.sleep(0.80) macarte.son(6,262,0.90) time.sleep(1.30) print("fin") macarte.fermer() print("fini")
Vincent
Hors ligne
Bonjour,
Merci pour vos conseils
Après essais, j'obtiens :
*** Console de processus distant Réinitialisée ***
>>>
début
carte initialisée
fin
fini
>>>
mais pas de son, je ne sais ou ça cloche !
Merci
lj
Hors ligne
Rebonjour,
Avec le fihier arduino :
void setup()
{
pinMode(6, OUTPUT); //La broche 6 est une sortie
}
void loop()
{
tone(6,262,400); //Do
delay(400);
tone(6,262,400); //Do
delay(400);
tone(6,262,400); //Do
delay(400);
tone(6,294,400); //Ré
delay(400);
tone(6,330,700); //Mi
delay(400);
tone(6,294,700); //Ré
delay(400);
tone(6,262,400); //Do
delay(400);
tone(6,330,400); //Mi
delay(400);
tone(6,294,400); //Ré
delay(400);
tone(6,294,400); //Ré
delay(400);
tone(6,262,900); //Do
delay(400);
}
ça fonctionne hp ok, j'ai le son...
sauf que le son ne s'arrête plus !!!!!!
comment faire pour stopper???????
Avec python, pas de son et pourtant même montage
Je ne vois pas le pb !!!!!!
Merci
lj
Hors ligne
Rrbjr
Est -il possible de réinitialiser la carte arduino uno?
Merci
lj
Hors ligne
rrrbjr
Dans la console, j'obtiens :
*** Console de processus distant Réinitialisée ***
>>>
début
carte initialisée
fin
fini
>>>
*** Console de processus distant Réinitialisée ***
>>>
début
>>>
*** Console de processus distant Réinitialisée ***
Après essais,
- le 1ier, ficher se termine sans son
- le 2ieme, blocage de l'exécution du fichier à"debut"
On dirait que l'exécution n'est pas reproductible....
Qu'en penser?
lj
Hors ligne
Pour la partie Arduino, la fonction loop, comme son nom l'indique est exécutée en boucle, donc si vous voulez ne jouer qu'une fois, il est préférable de mettre le code dans la fonction setup.
Pour la partie Python, ça reste fort obscur...
Bizarre qu'on ne voit pas le 0, 1, 2 du print dans la boucle.
Bizarre aussi qu'on en puisse pas lancer 2 fois de suite le script car avec EduPython, quant on relance tout est réinitialisé....
Par contre, une question côté carte Arduino, vous avez un code qui lit le port série et qui exécute les actions, non ?
Parce que là ce que fait le code, c'est juste envoyer des infos sur le port série, donc côté arduino, il faut un code qui lit le port série et convertit cela en info sur les broches.
Vincent
Hors ligne
Oubli du print(i)
La console donne :
*** Console de processus distant Réinitialisée ***
>>>
début
carte initialisée
0
1
2
fin
fini
>>>
Mais toujours pas reproductible
Pour le port serie, le fichier miroontroleurs.py est dans le même répertire ue le fichier qui doit produire le son...
microcontroleurs.py
#! encoding: utf-8
import serial
class arduino():
def __init__(self,port):
self.serie = serial.Serial(port,baudrate=9600)
synchro = ord(self.serie.read())
while synchro != 0:
synchro = ord(self.serie.read())
def sortie_numerique(self,pin,etat):
self.serie.write(chr(1).encode('latin-1'))
self.serie.write(chr(pin).encode('latin-1'))
self.serie.write(chr(etat).encode('latin-1'))
def entree_numerique(self,pin):
self.serie.write(chr(2).encode('latin-1'))
self.serie.write(chr(pin).encode('latin-1'))
val=ord(self.serie.read())
return val
def sortie_analogique(self,pin,val):
self.serie.write(chr(3).encode('latin-1'))
self.serie.write(chr(pin).encode('latin-1'))
self.serie.write(chr(val).encode('latin-1'))
def entree_analogique(self,pin):
self.serie.write(chr(4).encode('latin-1'))
self.serie.write(chr(pin).encode('latin-1'))
val1=ord(self.serie.read())
val2=ord(self.serie.read())
return val1*256 + val2
def son(self,pin,freq,duree=0):
self.serie.write(chr(5).encode('latin-1'))
self.serie.write(chr(pin).encode('latin-1'))
self.serie.write(chr(freq>>8 & 255).encode('latin-1'))
self.serie.write(chr(freq & 255).encode('latin-1'))
self.serie.write(chr(int(duree*1000)>>8 & 255).encode('latin-1'))
self.serie.write(chr(int(duree*1000) & 255).encode('latin-1'))
def module_us(self,echo,trig):
self.serie.write(chr(6).encode('latin-1'))
self.serie.write(chr(echo).encode('latin-1'))
self.serie.write(chr(trig).encode('latin-1'))
val1=ord(self.serie.read())
val2=ord(self.serie.read())
return val1*256 + val2
def resistance_pt100(self,cs,di,do,clk):
self.serie.write(chr(7).encode('latin-1'))
self.serie.write(chr(cs).encode('latin-1'))
self.serie.write(chr(di).encode('latin-1'))
self.serie.write(chr(do).encode('latin-1'))
self.serie.write(chr(clk).encode('latin-1'))
val1=ord(self.serie.read())
val2=ord(self.serie.read())
return 430*(val1*256 + val2)/32768
def fermer(self):
self.serie.close()
Je vois pas pourquoi il n'y a pas de son ?
Merci
lj
Hors ligne
Bonjour,
Comme je vous disais il faut lancer le programme côté carté arduino, c'est l'étape 2 de l'activité : http://sciences-physiques.ac-besancon.f … -a-python/
Avez-vous réalisé l'étape 2 au moment du lancement du code Python ?
VM
Hors ligne
J'ai bien installer la bibliotheque Adafruit_MAX31865
Puis copier coller de microcontroleurs.ino
MAIS lorsque je veux le telever, arduino me demande de l'enregistrer.........je place ou ce fichier?
Merci
Hors ligne
La bibliotheque Adafruit_MAX31865 apparait dans arduino
Croquis/Inclure bibliotheque/Recommandé Bibliotheque/Adafruit_MAX31865 library
Hors ligne
Le code microcontroleurs.ino doit être téléversé puis executé sur la carte arduino, comme dans votre post :
https://edupython.tuxfamily.org/forum/v … 1027#p1027
C'est ce code qui surveille ce qui est envoyé sur le port série et qui converti cela en instruction arduino pour jouer le son par exemple. Vous pouvez l'enregistrer où vous voulez, ce qui est important c'est de la téléverser sur la carte et de le lancer
VM
Hors ligne
Que veux dire....... "et de le lancer VM"
Hors ligne
VM, c'est mon nom
Il faut téléverser le fichier, de mémoire, si le téléversement a fonctionné, le code se lance automatiquement.
Hors ligne
Cela fonctionne, j'ai du son
Merci beaucoup
Hors ligne
Impeccable !
Bonne continuation
Vincent M
Hors ligne
Encore merci
Je reviens vers vous via ce forum....si pbs
lj
Hors ligne
Pages : 1