[Projet] Clavier musical (2 touches)

Bonjour, j'ai actuellement un projet à faire pour dans deux semaines, avec Arduino.
Le probleme étant que c'est tout nouveau pour nos professeurs, qu'ils sont partis voir les stages des licences, que l'on a aucune aide, aucun support, et qu'on a tout ca a faire en trois semaines à peine ...

Voici le SUjet du projet :

But : Programmer un clavier musical à deux touches

Fonctionnalités :

• Deux leds de couleurs différentes seront associés au deux touches. Chaque touche allume une led.
Le toucher sur les deux capteurs génère respectivement un son sinusoïdal de fréquence 82 Hz et 110 Hz (le MI et le LA guitare). La génération des sinus se fera par les tableaux et les pointeurs.
L'appuie sur les deux touches génère un mélange des deux notes

• Un potentiomètre permettra de régler le volume du son généré.
• Le volume sera affiché sur 3 leds suivant la plage dans laquelle il se trouve. Un volume dans le premier tiers allumera une led, le deuxième tiers deux led et le dernier tiers les 3 leds. Dans ce dernier cas, un mail d'alerte sera envoyé.
• On enregistrera dans un tableau de 40 éléments l'ensemble des notes jouées. Ce tableau sera affiché sur la sortie série d’arduino.

Contraintes :
•Le stockage des données se fera dans des tableaux de deux façons différentes : la notation classique et avec les pointeurs.

Toute aide serait la bienvenue, voici le programme que j'ai crée comme ébauche ..

#include "TinkerKit.h"

TKTouchSensor touch0(I0);
TKTouchSensor touch1(I1);

TKLed led(O0);
TKLed led1(O1);
TKLed led2(O3);
TKLed led3(O4);
TKLed led4(O5);

int pot=analogRead(I2);

void setup() {

Serial.begin(9600);
}

void loop(){

if (touch0.get() == HIGH) {
led.on();

float f=80; //en Hz
float w=2PIf;
float volume=analogRead(I2);
float t =millis()/1000.0; //1000.0 pour passer en float
int value=(volume/8)(1+sin(wt)); // 1Hz max doit tre égal à 256
//int value = 128.0*(1+sin(wt)); //sans volume
analogWrite(12,value);
Serial.println(millis()/1000); // temps en secondes
Serial.println(value);

} else {
led.off();

}

if (touch1.get() == HIGH) {
led1.on();

float f=110; //en Hz
float w=2PIf;
float volume=analogRead(I2);
float t =millis()/1000.0; //1000.0 pour passer en float
int value=(volume/8)(1+sin(wt)); // 1Hz max doit tre égal à 256
//int value = 128.0*(1+sin(wt)); //sans volume
analogWrite(12,value);
Serial.println(millis()/1000); // temps en secondes
Serial.println(value);

}
else {
led1.off();
}
if (pot < 330){
led2.on();
led3.off();
led4.off();
}
else if (pot > 330 and pot < 660){
led2.on();
led3.on();
led4.off();
}
else {
led2.on();
led3.on();
led4.on();
}

Serial.println(pot);

}

Mes connaissances sont très limitées, si je ne me trompe pas je suis en mesure :

  • Deux leds de couleurs différentes seront associés au deux touches. Chaque touche allume une led.
  • Le toucher sur les deux capteurs génère respectivement un son sinusoïdal de fréquence 82 Hz et 110 Hz (le MI et le LA guitare).
  • Un potentiomètre permettra de régler le volume du son généré
  • Le volume sera affiché sur 3 leds suivant la plage dans laquelle il se trouve. Un volume dans le premier tiers allumera une led, le deuxième tiers deux led et le dernier tiers les 3 leds.

Reste :

  • La génération des sinus se fera par les tableaux et les pointeurs.
  • L'appuie sur les deux touches génère un mélange des deux notes
  • On enregistrera dans un tableau de 40 éléments l'ensemble des notes jouées. Ce tableau sera affiché sur la sortie série d’arduino.
  • Dans ce dernier cas, un mail d'alerte sera envoyé.

Voici, je manque donc de compétences, toute aide serait la bienvenue, dans l'optique ou il reste très peu de temps je pourrais éventuellement penser a une quelconque rémunération, me contacter pour plus d'informations; Merci :slight_smile:

Bonjour a toi, alors pour commencer, une rémunération ne te sera jamais demandé, ici tu a des pro (je parle pas de moi mais tu va les voir débarquer t’inquiète :stuck_out_tongue: ) après, c'est vrai que tout ça en 3 semaines c'est pas mal ^^ mais si tu fait que ça tu devrais y arriver large, ton programme est une bonne ébauche, pas trop de n'importe quoi malgré quelque truck louche que je n'ai pas bien compris (utilise les balise [ code ] pour ton code c'est plus lisible :wink:

pour ce qui est du reste de ton taff:

  • La génération des sinus se fera par les tableaux et les pointeurs.

la je pense qu'il te faudra calculer toute les valeur de ta sinusoïde avec un pas plus ou moins précis je serais pas te dire le quel choisir, et les mettre dans un tableau qui sera simplement lu à l'appui sur ta touche.

  • L'appuie sur les deux touches génère un mélange des deux notes

La tu utilisera simplement un ou ou un et je ne sais pas trop les pro te dirons, entre le tableau de tes deux sinusoïde donc pas bien compliqué mettre en place
à mon avis

  • On enregistrera dans un tableau de 40 éléments l'ensemble des notes jouées. Ce tableau sera affiché sur la sortie série d’arduino.

alors, la je ne sais pas si par note il entende mi et la ou si il parle des valeurs :s a mon avis ça sera mi ou la ou mi & la et apres l'afficher sdur port série ne devrai pas être trop compliquer, vidé un tableau dans un port série rien de sorcier.

  • Dans ce dernier cas, un mail d'alerte sera envoyé.

Et la ba envoie de mail si volume au max, donc dans ton if tu rajoute une petite partie envoie de mail, je sais pas si c'est compliquer en ARDUINO j'ai pas essayé encore mais tant fait pas les connaisseurs te l’expliquerons en temps voulue

voila voila, donc a mon avis rien d'atroce du devrais pouvoir le faire, après tu à cette ébauche de programme mais est ce que niveau hardware tu est prêt? tu a tout? le ARDUINO la partie son led potar etc? si oui t'es en bonne voie =)

Bon courage, je t'aiderai tant que ça reste dans mes moyen =) ( autant dire que après ce message je viendrai suivre ton évolution mais ça m'étonnerai que ce sois vraiment moi qui t'aide vue la qualité des intervenant du forum ^^ )

Skizo

Il y a quelque chose qui manque dans ce projet... La conversion digital -> analogique.

C'est bien gentil de générer une sinusoide (au passage je vois pas bien pourquoi faire un tableau de valeur car à ces fréquences le CPU peut largement exécuter le calcul à chaque fois. J'ai fait un test sur UNO et il peut calculer 100 000 sinus par seconde) mais comment vas-tu la sortir ?

Tu peux utiliser des ports et mettre un convertisseur en sortie mais il y a peut être une autre astuce qui ne prendrait qu'un seul port et cela sans utiliser l'I2C pour adresser un convertisseur externe.

JLB

lol oui c’est ce que j'entendais par pret niveau hardware ^^ après le coup des tableaux c'est une contrainte des proff laisse tomber je connais ça tu peut pas luté ! ^^

Skizo !

Bonjour,

analogWrite(broche,valeur) est bloqué sur la fréquence 490Hz par construction, "valeur" c'est le rapport HIGH/LOW qui varie, et simule une conversion analogique du signal.

Pour sortir une note voir plutôt l'instruction tone(broche,fréquence,durée) permet une fréquence variable, mais avec un rapport HIGH/LOW bloqué à 50% . (voir dans référence Arduino français)
Attention, c'est une onde carrée, si la sinusoïde est exigée par les profs, là ce n'est plus de mon niveau... ajouter une cellule RC... avec ampliOP (quelque chose dans ce genre????) à la sortie

diieter:
Bonjour, j'ai actuellement un projet à faire pour dans deux semaines, avec Arduino.
Le probleme étant que c'est tout nouveau pour nos professeurs, qu'ils sont partis voir les stages des licences, que l'on a aucune aide, aucun support, et qu'on a tout ca a faire en trois semaines à peine ...

Voici le SUjet du projet :

But : Programmer un clavier musical à deux touches

Fonctionnalités :

• Deux leds de couleurs différentes seront associés au deux touches. Chaque touche allume une led.
Le toucher sur les deux capteurs génère respectivement un son sinusoïdal de fréquence 82 Hz et 110 Hz (le MI et le LA guitare). La génération des sinus se fera par les tableaux et les pointeurs.
L'appuie sur les deux touches génère un mélange des deux notes

• Un potentiomètre permettra de régler le volume du son généré.
• Le volume sera affiché sur 3 leds suivant la plage dans laquelle il se trouve. Un volume dans le premier tiers allumera une led, le deuxième tiers deux led et le dernier tiers les 3 leds. Dans ce dernier cas, un mail d'alerte sera envoyé.
• On enregistrera dans un tableau de 40 éléments l'ensemble des notes jouées. Ce tableau sera affiché sur la sortie série d’arduino.

Contraintes :
•Le stockage des données se fera dans des tableaux de deux façons différentes : la notation classique et avec les pointeurs.

bonjour
Il manque déjà des infos en ce qui concerne le convertisseur D/A de generation des sinusoides
de quel matériel hardware dispose tu exactement ?
le DAC peut etre realisé en utilisant un reseau R/2R en passif ou un DAC actif

Voici un procédé élégant pour générer une belle sinusoide :

  1. Intégrer un signal PWM afin qu'il donne une tension fonction du rapport cyclique. En théorie il suffit d'un réseau RC mais avec un OP ca ira mieux.

  2. Changer l'horloge du compteur 0 en écrivant directement dans les registres. Il est possible de sélectionner différentes horloges et prescaler. On peut aller jusqu'à l'horloge système non divisée soit 16 MHz. D'origine cette horloge est entre 470 et 490 Hz ce qui ne suffit pas pour cette application (c'est une fréquence qui convient pour le contrôle des moteurs et des leds uniquement).

Il suffit ensuite d'écrire successivement les valeurs de sinus (mis à l'échelle 0 à 255) pour le PWM.

Si nécessaire je ferai un test de réécriture de ces registres du compteur et te fournirai les 2 lignes de code nécessaire.

JLB

Dieeter,

Un truc qui peut t'aider à mettre au point ton projet. Je l'ai mis à disposition dans un autre post.

http://arduino.cc/forum/index.php/topic,107824.0.html

JLB

Wow, autant de réponses en si peu de temps, je suis impressionné o:

Tout d'abord merci pour vos conseils et votre aide (ainsi que du temps que vous avez accordé à ma requête).

Pour le hardware, je dispose d'une carte arduino "uno" ainsi que d'une carte tinkerkit (+ des composants comme les leds, le buzzeur, le potentiometre et les deux boutons pression)

Je n'ai nullement eu vent d'un quelconque convertisseur, et je n'aurais pas eu l'idée d'en mettre un ^^'

A vrai dire, je suis vraiment bloqué j'ai passé deux heures a bucher dessus hier, je n'avance vraiment plus, un manque de compétences flagrant ..

Pour ceux que ca interesserait eventuellement de bucher sur ce petit projet, je vous laisse m'envoyer un message privé pour vous donner un support de communication (mail, skype), afin de travailler sur ce travail :slight_smile:

Pour les plus évasifs, toute aide sur le forum sera toujours bonne à prendre et ne pourra que m'être utile et bénéfique :smiley:

Merci de votre soutien

Bonjour,

diieter:
• Deux leds de couleurs différentes seront associés au deux touches. Chaque touche allume une led.
Le toucher sur les deux capteurs génère respectivement un son sinusoïdal de fréquence 82 Hz et 110 Hz (le MI et le LA guitare). La génération des sinus se fera par les tableaux et les pointeurs.
L'appuie sur les deux touches génère un mélange des deux notes

Bon pour l'association touche -> led aucun probléme, tu lit l'état du bouton puis tu assigne l'état de la led, trés simple.

Pour la génération du son sinusoïdal je crois que ton prof a (un peu) fumé la moquette.
Étant donné qu'il te demande d'utiliser un tableau c'est quasi certain qu'il veut que tu fasse de la DDS (Direct Digital Synthetiser).
Je vais même pas chercher à t'expliquer le principe ce serait mégaaaa long :wink:
-> http://interface.khm.de/index.php/lab/experiments/arduino-dds-sinewave-generator/

diieter:
• Un potentiomètre permettra de régler le volume du son généré.

Bon no problém -> analogRead()

diieter:
• Le volume sera affiché sur 3 leds suivant la plage dans laquelle il se trouve. Un volume dans le premier tiers allumera une led, le deuxième tiers deux led et le dernier tiers les 3 leds. Dans ce dernier cas, un mail d'alerte sera envoyé.

Pareil no problem c'est juste un peu de réflexion, des if() et des digitalWrite() :wink:

Pour le "mail d'alerte" je ne comprend vraiment pas :astonished:
Ton prof veut pouvoir envoyer un mail !? Woo ... passons.

diieter:
• On enregistrera dans un tableau de 40 éléments l'ensemble des notes jouées. Ce tableau sera affiché sur la sortie série d’arduino.

Je vois pas bien ce que veut faire ton prof ...
Stocker juste les notes est stupide si tu ne pas de notion de temps associé ...

Bon déja si tu arrive à gérer les touches / led / potentiométre c'est un bon début.
SI tu arrive ensuite à intégré le morceau de programme pour la DDS tu auras quasiment finit :wink: