kro — 2009-12-02 19:54:14

je fabrique un instrument de musique
un genre de basse électronique percussive

je compte mettre 2 piezos (percussion main droite) et 3 capteurs de position (mélodie sur le manche, main gauche)

ça ferait 7 câbles à tirer jusqu'à l'arduino du coup (1 5v, 1 masse, 2 piezo et 3 cv)
ça fait un câble de + qu'un câble midi, dommage (j'avais prévu le coup comme ça à la base avec un boitier arduino + carte son externe)
je pensais utiliser 2 entrées de ma carte son pour les piezos et 3 analog in arduino pour les capteurs

traitement sonore dans max msp

l'alternative à laquelle je pense serait d'utiliser un arduino bluetooth intégré dans le corps de l'instrument
comme ça pas de galère de câble

quelqu'un à testé bluetooth ?
temps de latence ?
stabilité ?
portée ?

du coup je connecte logiquement mes piezos direct à l'arduino
mais les tests que j'ai effectué avec duemilanove donne pas grand chose via maxuino les valeur d'analog in sont justes étranges
je trouve pas trop d'info sur maxuino + piezo en fait

si quelqu'un à une idée, c'est merci

kro — 2009-12-02 23:30:16

la gueule de la bête :

http://www.mindthepressure.org/jeanmi4.gif

c'est plus serré que ça en a l'air
je vais peut-être réduire mes ambitions et me contenter de 2 capteurs de position et d'un câble midi ça serait plus simple à tous les niveaux ...

kro — 2009-12-05 01:56:52

je vais rester sur une idée d'ukulélé wireless :cool:
en plus d'être sexy ça m'offre plus de possibilités

je pense quand même qu'arduino bluetooth est relativement fait pour ça, mais sinon on m'a conseillé xbee
je capte pas tout sur le site
mais ça a l'air un poil plus cher quand même

quel serait l'intérêt par rapport à un arduino bt ?

emoc — 2009-12-05 11:32:28

Hello,

Je crois que le xbee revient moins cher
avec arduino bluetooth, il te faut : un arduino bt + 1 clé usb bluetooth : 160$
avec le xbee : 2 modules xbee, 1 kit adaptateur xbee pour arduino, 1 cable usb/ttl, 1 arduino = 2 x 23 + 10 + 20 + 30 : 106$


arduino bluetooth : http://www.sparkfun.com/commerce/produc … ts_id=8255

xbee module : http://www.adafruit.com/index.php?main_ … cts_id=128
xbee adapter kit : http://www.adafruit.com/index.php?main_ … cts_id=126
usb ttl 232 cable : http://www.adafruit.com/index.php?main_ … ucts_id=70
arduino atmega : http://www.adafruit.com/index.php?main_ … ucts_id=50

Sur l'utilisation du xbee avec arduino, pas mal de choses ici : http://www.ladyada.net/make/xbee/

En pièce jointe un article de Tom Igoe sur l'utilisation de xbee (sans arduino!)

kro — 2009-12-05 17:57:15

merci pour cette réponse

j'ai déjà du bluetooth côté ordi en fait

ce que je comprends avec xbee :
dans mon ukulélé j'aurais besoin de glisser un arduino duemilanove + un arduino xbee shield + un xbee module
et côté ordi un xbee adapter kit + un usb ttl 232 cable + un autre xbee module

j'ai bon ?

ça me simplifie pas le schmilblick j'ai l'impression
je pensais pouvoir gagner en consommation électrique mais vu que j'aurais quand même un arduino dans l'ukulélé ça doit consommer presque autant au final
et surtout j'ai pas trop de place dans l'instrument, j'ai déjà façonné le corps en bois

du coup je vais quand même faire simple et commander le bt je crois

kro — 2009-12-05 18:12:44

quoique si je me réfère au scéma de la 2e page de l'article d'Igoe, j'ai l'impression qu'il branche direct l'accéléromètre au module xbee

donc quid de l'utilité d'un arduino dans ce cas ?

je pourrais brancher direct capteurs de positions et piezzi au module xbee et alimenter avec 2 piles, ça me ferais moins de bordel embarqué et moins de conso électrique ?

emoc — 2009-12-05 18:53:33

kro a écrit:

et côté ordi un xbee adapter kit + un usb ttl 232 cable + un autre xbee module

Ah oui, j'avais oublié cet adapter... Ce qui revient à 116$ + quelques composants

Le xbee shield n'est pas obligatoire, tu peux relier l'adaptateur directement (d'après http://www.ladyada.net/make/xbee/arduino.html ):

http://codelab.fr/up/xbeelinkarduino-t.jpg

Sinon comme shield, il y aussi ces kits : http://www.nkcelectronics.com/freeduino … d-kit.html

Bon c'est vrai qu'en fin de compte, ça fait pas mal de bricole...

kro a écrit:

j'ai l'impression qu'il branche direct l'accéléromètre au module xbee

Oui, je suppose que l'accéléromètre fournit des signaux adaptés au xbee, à priori les xbee ont "9 input/output lines for analog and digital IO" ce qui permet de relier directement pas mal de choses, si ça te suffit pas besoin d'arduino (voir http://www.makingthings.com/documentati … -all-pages )

matohawk — 2009-12-06 11:05:25

Le xbee n'a pas des meilleures propriétés par rapport au bluetouth : genre portée du signal, débit plus constant...

kro — 2009-12-06 15:29:04

emoc a écrit:

les xbee ont "9 input/output lines for analog and digital IO" ce qui permet de relier directement pas mal de choses, si ça te suffit pas besoin d'arduino (voir http://www.makingthings.com/documentati … -all-pages )

lecture instructive !

ça m'aurait l'air de fonctionner sans arduino du coup
merci emoc

mais je vais utiliser le bt quand même, parce que j'ai plus l'habitude d'arduino et que j'aurais pas besoin de boitier supplémentaire (la mobilité et la disponibilité des ports usb est un point important vu le bordel que je me trimbale à chaque live)

merci à vous je commande le bt pour le moment puis je vous tiens au jus

kro — 2010-02-02 04:51:42

argh

ça y est j'ai tout construit

je fais des essais depuis hier mais les piezos capteurs de chocs me donnent du fil à retordre.

schéma :
http://www.mindthepressure.org/ukulele_sch.gif

j'ai trouvé deux sortes de codes pour gérer les piezo knock sensors

 const int threshold = 100;  // threshold value to decide when the detected sound is a knock or not

 // these variables will change:
 int sensorReading = 0;      // variable to store the value read from the sensor pin
 int ledState = LOW;         // variable used to store the last LED status, to toggle the light

 void setup() {
  pinMode(ledPin, OUTPUT); // declare the ledPin as as OUTPUT
  Serial.begin(9600);       // use the serial port
 }

 void loop() {
   // read the sensor and store it in the variable sensorReading:
   sensorReading = analogRead(knockSensor);    

   // if the sensor reading is greater than the threshold:
   if (sensorReading >= threshold) {
     // toggle the status of the ledPin:
     ledState = !ledState;   
     // update the LED pin itself:        
     digitalWrite(ledPin, ledState);
     // send the string "Knock!" back to the computer, followed by newline
     Serial.println("Knock!");         
   }
   delay(100);  // delay to avoid overloading the serial port buffer
 }

http://arduino.cc/en/Tutorial/Knock

et

// deal with first piezo, this is kind of a hack
  val = analogRead(piezoAPin);
  if( val >= PIEZOTHRESHOLD ) {
    t=0;
    while(analogRead(piezoAPin) >= PIEZOTHRESHOLD/2) {
      t++;
    }
    noteOn(drumchan,note_hihatopen, t*2);
    delay(t);
    noteOff(drumchan,note_hihatopen,0);
  }

http://todbot.com/blog/2006/10/29/spook … l-arduino/

là il s'agit d'estimer la force de frappe en fonction du temps que met l'onde à redescendre
http://todbot.com/blog/wp-content/uploads/2006/10/piezo_whack-300.png
ce que je trouve peu logique car on aura plutôt une notion de la fréquence que de la vélocité
d'ailleurs dans mes tests c'est vraiment pas convainquant

du coup je suis pour l'instant sur le premier système :

sensorReading_0 = analogRead(piezo_0);
if(sensorReading_0 >= threshold) {
  Serial.print("/piezo_0/");
  Serial.println(sensorReading_0);
  delay(60);
}

je crois que le problème vient surtout d'un manque de sensibilité (la vitesse de communication serial ne permet pas une analyse externe du signal, je loupe 3 knocks sur 4)
sur le duemilanove en ne branchant qu'un piezo avec sa résistance les chocs électriques que j'envoie oscillent entre 1 et 20 (sur 1024) et ça fonctionne
mais sur le bluetooth j'ai un gros buzz (même en débranchant les capteurs de positions) et toujours des valeurs entre 0 et 10 ce qui m'empêche de réduire le threshold en dessous de 10, du coup très peu de sensibilité
(pourtant en branchant en même temps le piezo à l'entrée de ma table de mix le buzz n'est pas si énorme, à moins qu'il ne soit pas dans les fréquences audibles)

je me demande si il y aurait un méthode pour réduire ce buzz que je n'ai pas sur le duemilanove
(par ex relier la masse qui alimente l'arduino avec celle que sort l'arduino serait une très mauvaise idée ? je m'y connais pas tant en électricité)

kro — 2010-02-02 15:35:42

kro a écrit:

pourtant en branchant en même temps le piezo à l'entrée de ma table de mix le buzz n'est pas si énorme, à moins qu'il ne soit pas dans les fréquences audibles

après enregistrement et analyse du signal (en audio) j'ai bien un gros buzz de 50 hz
voilà un impact typique de piezo noyé dans le buzz :
http://www.mindthepressure.org/waveform.gif

pas si gros le buzz en fait : le volume est augmenté 16x à peu prés

ce buzz est présent même avec l'arduino éteint et les capteurs de position débranchés et augmente quand je m'approche de la bécane :|

Staross — 2010-02-02 22:30:07

Hu, j'ai toujours voulu faire la même chose, mais je me suis jamais lancé...

Tu veux utiliser quoi comme capteurs de position ?

Sinon pour le buzz à 50Hz c'est probablement un problème de terre mais je peux pas t'en dire plus. Par contre ce que tu peux faire c'est filtrer ton signal, soit avec un band-stop centré à 50 Hz soit avec un passe-bas.

Ici (http://www.cannibalcaniche.com/forum/do … hp?id=5317) j'avais utilisé un capteur piezo, mais directement branché à la carte son. Et je n'utilisai pas de détection de pique mais directement le son de la frappe comme entrée dans un synthé à base de modélisation physique.

kro — 2010-02-02 23:09:21

Staross a écrit:

Tu veux utiliser quoi comme capteurs de position ?

http://www.interface-z.com/produits/cs1 … souple.htm

Staross a écrit:

Sinon pour le buzz à 50Hz c'est probablement un problème de terre mais je peux pas t'en dire plus. Par contre ce que tu peux faire c'est filtrer ton signal, soit avec un band-stop centré à 50 Hz soit avec un passe-bas.

ya pas de terre c'est un truc à pile (3x LR6)

le truc c'est que je pense pas que le buzz soit généré par le piezo mais carrément par l'arduino
genre j'ai le buzz même en branchant seulement une résistance entre la masse et l'analog in (des valeurs jusqu'à 8 en tout cas)

du coup je pense pas pouvoir filtrer ça

j'ai l'impression d'être mal barré là...

peut-etre en amplifiant un chuia le signal avant d'entrer plutôt
mais j'ai pas trop de place physiquement c'est très serré et j'ai que mon alim de 3 piles
je vais chercher un plan de mini preamp

sinon au pire je prend le duemilanove et je tire un usb de 5m :/

Staross — 2010-02-02 23:54:45

Le problème est certainement l'absence de terre quelque part, mais je pige pas très bien ces trucs :

http://en.wikipedia.org/wiki/Ground_loop_(electricity)

Si c'est un buzz à 50Hz ça vient certainement du réseau éléctrique. Comment est-ce que tu branche l'arduino à ton ordi pour enregistrer le signal que tu montre au dessus ?

Le filtrage, tu peux le faire numériquement sur l'ordi, le signal au dessus est certainement utilisable tel quel.

kro — 2010-02-02 23:55:16

http://www.reconnsworld.com/audio/simplepreamp.gif

j'ai peut-être trouvé mon bonheur
faut encore que je trouve 4 condos et 2 transistors et que j'arrive à faire rentrée tout ce monde dans 5 cm²

kro — 2010-02-03 00:04:00

Staross a écrit:

Le problème est certainement l'absence de terre quelque part

peut-etre un appareil dans ma chambre alors, mais c'est pas de ce côté qu'il faut corriger le problème

Staross a écrit:

Si c'est un buzz à 50Hz ça vient certainement du réseau éléctrique. Comment est-ce que tu branche l'arduino à ton ordi pour enregistrer le signal que tu montre au dessus ?

arduino bt = bluetooth
ça me botte bien un truc wireless, je pensais pas que ça serait plus galère
mais arduino bt a l'air un peu sujet aux parasites ambiants on dirait (le buzz augmente quand j'approche mon bras genre - je dois être branché à la terre :o)

Staross a écrit:

Le filtrage, tu peux le faire numériquement sur l'ordi, le signal au dessus est certainement utilisable tel quel.

en fait non, le débit serial est pas suffisant pour passer un signal audio :/
si j'envoie toute les valeurs que je peux je loupe déjà 3 frappes sur 4, donc de là à traiter de l'audio
d'après ce que je comprends (faut me corriger sinon) arduino peut lire plus de valeurs si il est pas occupé à les envoyer à l'ordi, du coup le traitement doit plutôt se faire en interne et j'envoie seulement les valeurs qui m'intéresse à l'ordi (via serial - bluetooth)

kro — 2010-02-03 00:16:09

Staross a écrit:

Si c'est un buzz à 50Hz ça vient certainement du réseau éléctrique. Comment est-ce que tu branche l'arduino à ton ordi pour enregistrer le signal que tu montre au dessus ?

j'avais pas bien lu ta question

avec des pince crocos j'ai branché le piezo à un jack en entrée micro en + de l'arduino
le buzz pourrait etre dû à la carte son mais en fait si je branche juste le piezo à la carte (en débranchant de l'arduino donc) le buzz et 10x plus faible cqfd

en plus que l'arduino soit alimenté ou pas ne change rien, c'est peut être l'antenne bluetooth qui pourrait être mal isolée ou un truc du genre

Staross — 2010-02-03 11:12:46

Ok, merci des reponses, si je me lance dans un truc similaire je prendrai un arduino usb pour voir si ca va mieux...

kro — 2011-02-04 18:11:23

j'ai à peu près terminé ce projet maintenant je colle des sons là dessus

mais j'ai laissé tomber le bluetooth (usb now)
si c'était à refaire j'essaierai avec des xbee


j'ai pas mal galéré pour fabriquer un preamp à knock qui marche (preamp + redressement + lissage)
voila ce que donne le schéma :
http://www.mindthepressure.org/uk/schema.gif
il faut adapter les resistance 1 et 2 en fonction de la sensibilité recherchée

un arduino shield pour 2 piezos
(attention le shield est à l'envers pour gain de place, composants en dessous, contre ceux du arduino)
http://www.mindthepressure.org/uk/shield.gif

le code donne un truc dans ce goût là
pas celui que j'utilise : l'évitement du crosstrigger est géré de manière assez tordues dans mon cas (vu que les piezos collés au même élément)
pour un piezo individuel c'est plus simple :

const int piezo_0 = 0; // analog input 0

const int trigger_threshold_0 = 2;  // difference with last value so it start to trig
const int delay_0 = 30; // pause to avoid multitriggers for one knock during 30ms

unsigned long now = 0;
unsigned long pause_0 = 0;

int triggerValue_0 = 0;
int previousValue_0 = 0;
int peakValue_0 = 0;
int maxValue_0 = 0;

void setup() {
  Serial.begin(9600);
}

void loop() { 
  now = millis();
  
  if (pause_0 < now - delay_0){ // pause off
    triggerValue_0 = analogRead(piezo_0);
    if (triggerValue_0 >= previousValue_0 + trigger_threshold_0) {
      delayMicroseconds(230); // wait 0.23 ms for peak
      peakValue_0 = analogRead(piezo_0);
      if (peakValue_0 > triggerValue_0){ // be sure peak value is higher
        maxValue_0 = peakValue_0;
      }
      else {
        maxValue_0 = triggerValue_0;
      }
      Serial.print("/piezo_0 ");
      Serial.println(maxValue_0); // send osc message
      previousValue_0 = maxValue_0;
      pause_0 = millis();
    }
    else {
      previousValue_0 = triggerValue_0;
    }
  }
}