Bonjour,
J'ai un projet avec mon école qui est de construire un métallophone pilotable par téléphone. L'idée de notre groupe est un instrument circulaire avec 8 touches réparties en cercle, sur lesquelles un électroaimant viendra taper grâce à un socle tournant à l'aide d'un moteur. J'aurais besoin d'une base de code pour pouvoir piloter le socle et faire en sorte que pour une note donnée, le socle tourne d'un certain angle pour que l'électroaimant se retrouve en face de la bonne touche pour taper dessus. Dans notre groupe pas grand monde s'y connait en Arduino c'est pour cela que je demande votre aide. Merci d'avance et bonne journée à tous !
Bonjour ivlsr
Quel Arduino?
As tu déjà du matériel, moteur pas à pas, driver de moteur pas à pas.
Entre le téléphone portable et l'Arduino c'est en Bluetooth.
A+
Cordialement
jpbbricole
Et vous comptez apprendre ?
pour bien débuter avec l’arduino, un bon point de départ c’est de lire les tutos d’eskimon
Ça ne marche pas comme ça.
Il faut d'abord :
- définir le besoin :
- faut-il des actionneurs (si oui, combien? de quel type?)
- faut-il des capteurs (si oui, combien? de quel type?)
- faire une évaluation des besoins en entrées/sorties et en capacité de calcul pour remplir la fonction afin de pouvoir choisir la carte CPU que vous allez utiliser
- s'il y a du matériel imposé:
- vérifier la compatibilité avec le besoin
- si on identifie des incompatibilités revenir au ① pour voir ce qu'il faudrait modifier pour utiliser ce matériel
- faire une liste du matériel complémentaire nécessaire (à négocier très certainement avec le prof responsable)
- choisir le matériel complémentaire et s'assurer :
- qu'il correspond au besoin
- qu'il existe des circuits capables de piloter ledit matériel
- que les circuits sont compatibles avec la carte Arduino que vous avez retenue
Et là, on peut commencer à se poser des questions sur le code.
Dans toutes les étapes vous trouverez du support ici mais il faut structurer vos demandes en expliquant clairement le besoin, vos choix (ou vos hésitations), les difficultés que vous rencontrez.
On ne fera pas le travail à votre place mais on vous aidera à y arriver si vous de votre coté vous montrer votre implication dans la réussite du projet.
Bonjour ivlsr
Voici une base qui permet de positionner un moteur pas à pas (MPAP), en fonction de 8 notes (DO, RE, MI, FA, SOL, LA, SI, DOH).
La note désirée., s’introduit dans la ligne de commande du moniteur série de l’IDE Arduino, à 115 200 :
et, dans le moniteur, on peut en voir l’exécution :
Execution de : FA
Jouer note 3
Deplacement moteur 75
Commande marteau
Cette base ne gère pas le MPAP, mai calcule, uniquement, son déplacement (pasDeplacement
) et ne fait pas fonctionner le marteau, mais en indique le moment pour (marteauFrapper
();).
Le tableau contenant la position du MPAP en fonction de la note est :
noteMpapPas[] = {0, 25, 50, 75, 100, 125, 150, 175};
C’est basé sur un moteur de type Nema17 qui a 200 pas/tour (mpapPasTour
).
Ce type de montage nécessiterai un contact indiquant la position 0 du plateau et cette position serai recherchée à chaque démarrage du programme.
Tel quel, cette base ne permet de fonctionner que note par note.
Une évolution pourrait être la possibilité de jouer une « partition » tel que DO, SI, LA, SO, FA, MI et ainsi de suite.
Toute la « mécanique » de la ligne de commande peut être supplantée ou utilisée conjointement par des commandes venues du smartphone. L’application smartphone pourrait être développée depuis MIT App Inventor, entre autres.
Il faudrait indiquer de quel matériel tu disposes.
Le programme :
/*
Name: ARDFR_MpapMetallophone.ino
Created: 24.10.2023
Author: jpbbricole
Pilotage d'un métallophone avec un moteur pas à pas
https://forum.arduino.cc/t/aide-code-socle-tournant/1181587
*/
//------------------------------------- Moteur pas à pas (mpap)
const int mpapPasTour = 200; // Nombre de pas au tour
//------------------------------------- Notes
const int noteMpapPas[] = {0, 25, 50, 75, 100, 125, 150, 175}; // Position en pas de chaque note pour un moteur à 200 pas/tour
const int notesNombre = sizeof(noteMpapPas) / sizeof(noteMpapPas[0]); // Nombre de notes en fonction du nombre d'éléments du tableau
//------------------------------------- Ligne de commandes
bool cmdNouvelleRecue = false; // Si une nouvelle commande a été reçue
String cmdTexte = ""; // Texte de la commande
void setup()
{
Serial.begin(115200);
Serial.println("\nMetallophone");
}
void loop()
{
//--------------------------------- Ecoute du port serie
serialReception(); // Ecouter le port série
if (cmdNouvelleRecue) // Si une nouvelle commande depuis le moniteur
{
cmdExecute(cmdTexte); // Traitement de la commande reçue
cmdTexte = "";
cmdNouvelleRecue = false;
}
}
/* ---------------------------------------------------------------------------
Ligne de commandes, le format est la note à jouer
Ce système n'est pas sensible à la casse.
Le paramètre peut être entier ou flottant
Commandes reconnues DO RE MI FA SOL LA SI DOH
'*----------------------------------------------------------------------------
*/
void cmdExecute(String commande)
{
int noteIndex = -1; // -1 = ote inconn
commande.toUpperCase(); // Tout en majuscules
commande.replace(" ", ""); // Supprimer les espaces
Serial.println("\nExecution de : " + commande + "\n");
if (commande == "DO") // Si commande = DO
{
noteIndex = 0;
}
else if (commande == "RE")
{
noteIndex = 1;
}
else if (commande == "MI")
{
noteIndex = 2;
}
else if (commande == "FA")
{
noteIndex = 3;
}
else if (commande == "SOL")
{
noteIndex = 4;
}
else if (commande == "LA")
{
noteIndex = 5;
}
else if (commande == "SI")
{
noteIndex = 6;
}
else if (commande == "DOH")
{
noteIndex = 7;
}
else
{
Serial.print(F("Commande inconnue!!! ")); Serial.println(commande);
}
if (noteIndex != -1) // Si note connue
{
noteJouer(noteIndex);
}
}
void noteJouer(int note)
{
Serial.print("Jouer note " + String(note) + "\n");
static int mpapPosition; // Pour mémoriser la dernière position
int pasDeplacement = noteMpapPas[note] - mpapPosition;
// Pour optimiser le déplacement du moteur
if (abs(pasDeplacement) > (mpapPasTour /2)) // Si déplacement > moitié parcours, optimiser le déplacement
{
//Serial.print("\tOptimise");
if (pasDeplacement > 0)
{
pasDeplacement = -(mpapPasTour - pasDeplacement);
}
else
{
pasDeplacement = mpapPasTour - abs(pasDeplacement);
}
}
mpapPosition = noteMpapPas[note];
Serial.println("Deplacement moteur " + String(pasDeplacement));
marteauFrapper();
}
void marteauFrapper()
{
Serial.println("\tCommande marteau");
}
/*-----------------------------------------------------------------------
Réception de commandes depuis le moniteur
'*------------------------------------------------------------------------
*/
void serialReception()
{
if (Serial.available())
{
cmdTexte = Serial.readStringUntil('\n');
// Nettoyage des caractères indésirables, CR, LF, TAB... et les espace de début et de fin
cmdTexte.trim();
cmdNouvelleRecue = true;
}
}
A+
Cordialement
jpbbricole
This topic was automatically closed 180 days after the last reply. New replies are no longer allowed.