Aide code socle tournant

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 :

  1. 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
  2. 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)
  3. 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 :
image

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.