dimanche 27 mai 2012

alimenter un MCU par l'entrée microphone

L'entrée microphone des ordinateurs fournis un voltage car les microphones actuels sont à base d'électret. Hors ces microphones contiennent un transistor JFET pour amplifier le signal provenant de l'électret, il faut donc alimenter ce transistor. J'ai mesuré le voltage à circuit ouvert sur différent ordinateurs et il varie d'un ordinateur à l'autre. Par exemple sur mon PC Dell il est à 5 volt alors que sur mon portable HP Pavilion il est à 3,3 volt comme sur d'autres ordinateurs portables sur lequel j'ai pris une mesure. Hors la majorité des MCU PIC acceptent une alimentation entre 2volt et 5,5 Volt. Certains modèles fonctionnent avec une alimentation comprise entre 1,8 et 3,6 volt. Mais cette alimentation sur l'entré microphone ne peut fournir qu'un très faible courant. Quoi qu'il en soit je me suis demandé si on pourrait alimenté un petit MCU avec ça, et la réponse est oui. Dans cette chronique je vais présenter le résultat de mes expériences.

Circuit de test

Fonctionnement

A chaque bouton SW1 à SW3 est à associée une tonalité de fréquence différente. Lorsqu'on presse un bouton la tonalité correspondante est envoyée via GP2 à l'entrée microphone. La résistance R1 limite l'amplitude du signal et la diode D1 empêche C1 et C2 de se décharger à travers R1 lorsque GP2 est à bas niveau.Sur mon HP Pavilion lorsqu'aucun bouton n'est enfoncé la tenstion sur Vdd est de 2,3 Volt lorsque je garde un bouton enfoncé la tension baisse à 1,87Volt. Même si la spécification du PIC10F202 indique un Vdd minninum de 2Volt ça fonctionne quand même. Pour rester dans les spec. et empêcher Vdd de tomber sous les 2 Volts j'ai limité la durée des tonalités à 20msec et inséré un délais de 30msec entre chaque tonalité. Ça permet aux condensateurs C1 et C2 de se recharger. Avec cette technique Vdd demeure au dessus de 2 volt. L'inconvénient est que la tonalité entendue dans le haut-parleur. est entrecoupée. J'ai fait un enregistrement avec et sans interruption sonore. Les fichiers .WMA sont avec délais et sans délais. Même en enlevant le condensateur C2 du circuit ça fonctionne mais le timbre est altéré car l'onde devient triangulaire plutôt que carrée.

code source

#include

__CONFIG _WDTE_OFF & _MCLRE_OFF & _CP_OFF

;;; constantes ;;;;;;;;;;;;;;;;;
OPTION_INI EQU 0x01
TRIS_INI EQU 0xB ; GP2 en mode sortie
; fréquences tonalités
FR1 EQU .697
FR2 EQU .770
FR3 EQU .852
FR4 EQU .941
FR5 EQU .1209
FR6 EQU .1336
FR7 EQU .1477
FR8 EQU .1633

; demi-péridodes
HPT1 EQU ~(.125000/FR1)
HPT2 EQU ~(.125000/FR2)
HPT3 EQU ~(.125000/FR3)
; comptes pour une durée de 20msec
LAPSE1 EQU ~(FR1*.20/.1000)
LAPSE2 EQU ~(FR2*.20/.1000)
LAPSE3 EQU ~(FR3*.20/.1000)



;;; macros ;;;;;;;;;;;;;;;;;;
#define SW1 GPIO, GP0
#define SW2 GPIO, GP1
#define SW3 GPIO, GP3
#define TONE_OUT GPIO, GP2

delay_us macro
movfw half_period
movwf TMR0
movfw TMR0
skpz
goto $-2
endm

;;; variables ;;;;;;;;;;;;;;
cblock 8
half_period : 1
delay_cntr : 2
endc

;;; code ;;;;;;;;
org 0
init
movwf OSCCAL
bcf OSCCAL, 0
movlw OPTION_INI
option
movlw TRIS_INI
tris GPIO

main
btfss SW3
goto tone3
btfss SW2
goto tone2
btfsc SW1
goto kill_time
tone1
movlw LAPSE1
movwf delay_cntr
movlw HPT1
goto main01
tone2
movlw LAPSE2
movwf delay_cntr
movlw HPT2
goto main01
tone3
movlw LAPSE3
movwf delay_cntr
movlw HPT3
main01
movwf half_period
call tone
kill_time
goto main
; ajouter ce délais si le Vdd descent trop bas
; va permettre à Vdd de remonter
; mais la tonalité sera interrompue pendant 30msec à tous les 20msec.
movlw .30
movwf delay_cntr
call delay_ms
goto main


tone
bcf TONE_OUT
delay_us
bsf TONE_OUT
delay_us
incfsz delay_cntr
goto tone
retlw 0

delay_ms
movlw .5
movwf TMR0
movfw TMR0
skpz
goto $-2
decfsz delay_cntr
goto delay_ms
retlw 0


end

Mais à quoi ça peut servir?

En fait cette idée mais venue en voyant sur internet un gamepad pour iPhone connecté à celui-ci par l'entré micro. J'ai donc essayé d'imaginer comment ça fonctionnait et j'ai testé l'idée. L'ordinateur n'a qu'à utiliser un programme FFT pour décoder les tonalités et convertir celle-ci en commandes pour les jeux. J'ai testé une variante qui consiste au lieu d'associé à chaque bouton une tonalité, à envoyer un code binaire pour chaque touche par AFSK (Audio Frequency Shift keying). Cette technique était utilisé dans les années 70 pour enregistrer et lire des programmes sur cassettes audio. La fonction pour envoyer un code binaire à l'entrée microphone est la suivante.

afsk ; audio frequency shift keying
movlw .10
movwf bitcnt
movfw button
movwf temp
bcf STATUS, C
next_bit
movlw 2
btfsc STATUS, C
movlw 4
movwf cyclecnt
movlw ZERO_TONE
btfsc STATUS, C
movlw ONE_TONE
movwf half_period
bit_loop
bcf TONE_OUT
delay_us
bsf TONE_OUT
delay_us
decfsz cyclecnt
goto bit_loop
decf bitcnt,F
skpnz
retlw 0
bsf STATUS, C
rrf temp,F
goto next_bit

idée de projet

En utilisant un PIC12F1822 qui est un modèle XLP (ultra low power) et en le faisant fonctionner à la plus basse fréquence possible pour réduire la consommation au mininum il serait possible de fabriquer un mini-synthéseur alimenter par la prise micro et qui se servirait de l'ordinateur pour amplifier et faire entendre les notes. On pourrait enregistrer ses propres créations musicales. Voici de quoi pourrait avoir l'air un tel circuit. Avec 5 entrée Digitale pour les switch et des diodes 1N4148 on peut coder 31 touches de clavier. On réserve RA5 pour la sortie. Seul inconvénient un seule touche peut-être utilisé à la fois.





Aucun commentaire:

Enregistrer un commentaire