Différences entre versions de « P2E-THEREMIN »
Ligne 28 : | Ligne 28 : | ||
Il est très facile de se faire une idée de la réponse lumière/résistance en utilisant des conditions d'illumination constante et en pratiquant une série de mesure en positionnant la main à une hauteur donnée puis en mesurant la réponse sur le convertisseur ADC. | Il est très facile de se faire une idée de la réponse lumière/résistance en utilisant des conditions d'illumination constante et en pratiquant une série de mesure en positionnant la main à une hauteur donnée puis en mesurant la réponse sur le convertisseur ADC. | ||
− | En utilisant le câblage du Theremin, le petit script [https://github.com/mchobby/pico-2-explorer/blob/main/projects/theremin/read.py read.py] (présent dans le projet Theremin) permet d'effectuer les relevés nécessaires "sans main" (la valeur 99999) puis à 30cm, 25cm, 20cm, 15cm, 10cm, 5cm et enfin 1cm? | + | En utilisant le câblage du Theremin, le petit script [https://github.com/mchobby/pico-2-explorer/blob/main/projects/theremin/read.py read.py] (présent dans le projet Theremin) permet d'effectuer les relevés nécessaires "sans main" (la valeur 99999) puis à 30cm, 25cm, 20cm, 15cm, 10cm, 5cm et enfin 1cm simplement en pressant le bouton lorsque la main est positionnée. |
+ | |||
+ | Les valeurs obtenues sont encodées sur 10 bits significatifs (donc de 0 à 1023) pour rester au dessus du bruit (voir [https://wiki.mchobby.be/index.php?title=P2E-Analog-Input-FR#ENOB_.3D_Bits_significatifs tutoriel sur l'entrée analogique]). | ||
+ | |||
+ | <syntaxhighlight lang="python"> | ||
+ | import micropython, time | ||
+ | from machine import Pin, ADC | ||
+ | micropython.alloc_emergency_exception_buf(100) | ||
+ | |||
+ | counter = 0 | ||
+ | |||
+ | def bouton_cb( obj ): | ||
+ | global counter | ||
+ | counter += 1 | ||
+ | |||
+ | # https://docs.micropython.org/en/latest/library/machine.Pin.html | ||
+ | # https://docs.micropython.org/en/latest/reference/isr_rules.html | ||
+ | btn = Pin( Pin.board.GP16, Pin.IN, Pin.PULL_UP ) | ||
+ | btn.irq( handler=bouton_cb, trigger=Pin.IRQ_FALLING ) | ||
+ | |||
+ | a1 = ADC( Pin( Pin.board.GP27 ) ) | ||
+ | |||
+ | read_for_cm = [99999,30,25,20,15,10,5,1] | ||
+ | |||
+ | index = 0 | ||
+ | print( "read for %i cm" % read_for_cm[index] ) | ||
+ | while True: | ||
+ | if counter>0: # Button pressed? | ||
+ | val = 0 | ||
+ | # Acquire analog on 10 bits | ||
+ | val = 0 | ||
+ | for i in range( 10 ): | ||
+ | val += (a1.read_u16()>>6) | ||
+ | # calculer la moyenne | ||
+ | val = val/10 | ||
+ | |||
+ | print( " %i of 1024" % vald ) | ||
+ | index += 1 | ||
+ | if index>=len( read_for_cm ): | ||
+ | index = 0 | ||
+ | |||
+ | # next value | ||
+ | print( "read for %i cm" % read_for_cm[index] ) | ||
+ | |||
+ | # Reset button detection | ||
+ | time.sleep_ms( 500 ) | ||
+ | counter=0 | ||
+ | else: | ||
+ | time.sleep_ms( 200 ) | ||
+ | </syntaxhighlight> | ||
+ | |||
+ | Ce qui permet de faire un relevé comme celui-ci dessous. | ||
+ | |||
+ | <nowiki>read for 99999 cm | ||
+ | 793 of 1024 | ||
+ | read for 30 cm | ||
+ | 770 of 1024 | ||
+ | read for 25 cm | ||
+ | 758 of 1024 | ||
+ | read for 20 cm | ||
+ | 755 of 1024 | ||
+ | read for 15 cm | ||
+ | 742 of 1024 | ||
+ | read for 10 cm | ||
+ | 708 of 1024 | ||
+ | read for 5 cm | ||
+ | 634 of 1024 | ||
+ | read for 1 cm | ||
+ | 499 of 1024</nowiki> | ||
+ | |||
+ | A noter également le minima de 500 et maxima de 793. | ||
== Brancher == | == Brancher == |
Version du 5 avril 2025 à 21:06
Theremin
L'idée
A propos de la Photo-résistance
Une même surface masquant la photorésistance, il est instinctivement possible de se rendre compte que luminosité captée va croître/décroître avec le carré de la distance (puisque l'ombre se propage dans les deux directions X et Y.
Cette relation au carré de la distance, même si pas encore démontrée, existe aussi pour la puissance sonore (qui diminue avec le carré de la distance).
C'est pour cette raison que les potentiomètres de réglage de volumes n'ont pas de fonction linéaire mais une fonction logarithmique. Cela donne l' impression à l'oreille d'avoir un réglage du volume qui augmente linéairement avec la rotation du potentiomètre.
Linéaire ou pas, quel importance?
Le but du Theremin est de faire varier le son de façon proportionnelle avec la position de la main au dessus de la photorésistance.
Il est donc nécessaire d'avoir une relation linéaire entre la position de la main et la fréquence du son produit.
Savoir si la relation lumière/résistance de la photo-résistance est linéaire ou pas a donc de toute importance!
Si, comme supposé, la relation lumière/résistance est logarithmique cela signifie que la majorité de la variation de résistance (donc de fréquence du son) s'opère a proximité de la photo-résistance. Dans pareil cas, il faudra faire en sorti de reconvertir la réponse logarithmique vers une réponse linéaire.
Mesures sur la photo-résistance
Il est très facile de se faire une idée de la réponse lumière/résistance en utilisant des conditions d'illumination constante et en pratiquant une série de mesure en positionnant la main à une hauteur donnée puis en mesurant la réponse sur le convertisseur ADC.
En utilisant le câblage du Theremin, le petit script read.py (présent dans le projet Theremin) permet d'effectuer les relevés nécessaires "sans main" (la valeur 99999) puis à 30cm, 25cm, 20cm, 15cm, 10cm, 5cm et enfin 1cm simplement en pressant le bouton lorsque la main est positionnée.
Les valeurs obtenues sont encodées sur 10 bits significatifs (donc de 0 à 1023) pour rester au dessus du bruit (voir tutoriel sur l'entrée analogique).
import micropython, time
from machine import Pin, ADC
micropython.alloc_emergency_exception_buf(100)
counter = 0
def bouton_cb( obj ):
global counter
counter += 1
# https://docs.micropython.org/en/latest/library/machine.Pin.html
# https://docs.micropython.org/en/latest/reference/isr_rules.html
btn = Pin( Pin.board.GP16, Pin.IN, Pin.PULL_UP )
btn.irq( handler=bouton_cb, trigger=Pin.IRQ_FALLING )
a1 = ADC( Pin( Pin.board.GP27 ) )
read_for_cm = [99999,30,25,20,15,10,5,1]
index = 0
print( "read for %i cm" % read_for_cm[index] )
while True:
if counter>0: # Button pressed?
val = 0
# Acquire analog on 10 bits
val = 0
for i in range( 10 ):
val += (a1.read_u16()>>6)
# calculer la moyenne
val = val/10
print( " %i of 1024" % vald )
index += 1
if index>=len( read_for_cm ):
index = 0
# next value
print( "read for %i cm" % read_for_cm[index] )
# Reset button detection
time.sleep_ms( 500 )
counter=0
else:
time.sleep_ms( 200 )
Ce qui permet de faire un relevé comme celui-ci dessous.
read for 99999 cm 793 of 1024 read for 30 cm 770 of 1024 read for 25 cm 758 of 1024 read for 20 cm 755 of 1024 read for 15 cm 742 of 1024 read for 10 cm 708 of 1024 read for 5 cm 634 of 1024 read for 1 cm 499 of 1024
A noter également le minima de 500 et maxima de 793.
Brancher
Pico | Pico-2-Explorer |
GP16 | Btn3 |
GP27 | Photo-résistance |
xxx
Code
Le script theremin.py est disponible dans le dépôt dédié au Pico-2-Explorer.
1 import micropython, time
2 from random import randint