Construction d'un banc de test/mesures pour moteurs brushless

Bonjour tout le monde.
Moi.
Je suis retraité et passionné depuis quelques mois d'Arduino ...
et de modélisme naval depuis 40 ans. Actuellement je monte un Yatch de 1,06 m propulsé par 2 turbines (pas courant !).

Mon projet.
J'ai un projet depuis des décennies : fabriquer un banc de test pour mes ensembles de propulsion.
Chercher le meilleurs ensemble possible : batterie Li-Ion, contrôleur, moteur, hélice ...

Mon matériel.
Pour cela j'ai deux Arduinos (donc 2 sketchs) : le premier sert à piloter le moteur en 5 phases : plateau à vitesse nulle, rampe d'accélération, plateau vitesse max de stabilisation, rampe de décélération et plateau final de stabilisation.
Le deuxième permet d'enregistrer 4 ou 5 voir 6 valeurs (tension, intensité, puissance alim, 1 ou 2 vitesses moteur et accessoirement température(s) sur une carte SD pour les récupérer sous Excel et sortir des courbes caractéristiques.

Mon souci.
J'aimerais pourvoir libérer un Arduino et tout gérer par l'autre.
J'utilise les entrées analogiques du 1er et une entrée numérique pour le démarrage de séquence avec un bouton poussoir et l'autre et pour le 2 ème les sorties numériques pour la carte SD et 1 entrée numérique pour le lancement de l'enregistrement.

Je fournirai mes 2 sketchs et quelques photos si certains peuvent m'aider.

Bonjour,

En attendant les infos promises, pour l'instant sur le principe je dirai :

Relier les deux arduinos en mode I2C avec un maitre et un esclave et faire circuler les valeurs numériques entre les deux.

Serge .D

Bonjour et merci.
Ce serait une solution mais ... je pense qu'il est possible de tout passer sur le même Arduino et c'est plutôt LA solution que je cherche à faire.
De plus je n'ai pas à transférer d'infos du 1er sur le 2éme.
Par contre les deux sont en attente de l'appui sur le BP pour un démarrage simultané.
Merci quand même. :slight_smile:
Dom22

P. S. : Les sketchs sont sur un autre ordi ... mais je les posterai.

bonjour,
tu as fait le compte des pins a utiliser?
sinon, passes sur une mega, tu auras tout ce qu'il te faut

Oui, merci du conseil mais j'ai vérifié.
J'ai

  • de 3 à 6 entrées analogiques (suivant le nombre de capteurs : tension, intensité, température etc..)
  • 1 entrée digitale pour le bouton de démarrage de la séquence
  • 1 ou 2 autres entrées digitales pour la vitesse : fourche optique et/ou à effet hall
  • 1 sortie pour le contrôleur
  • 4 sorties pour la carte SD

Le compte est bon pour un UNO.

En fait mon problème est la répartitions des broches vis à vis des sketchs, exemple pour la carte SD suivant les sketchs que je trouve certains utilisent 10, 11, 12, 13 et d'autres 4, 11,12,13 !! par contre je ne vois pas comment passer de 4 à 10 ou inversement !! Dans la librairie ???

Merci encore.
Dom22

Voilà mes deux sketchs : 

[  /*  Dom22 01-2017
   *  Acquisition de 6 entrées et stockage sur carte SD d'un fichier .csv 
   *  pour la récupération des données sur EXCEL et affichage de courbes
   *  https://tutoarduino.com/les-cartes-sd/
   *  ** MOSI - pin 11
   *  ** MISO - pin 12
   *  ** CLK  - pin 13
   *  ** CS   - pin 4
   */

#include <SPI.h>
#include <SD.h>
 
File fichierSD;
int sensorValue1 ;
int sensorValue2 ;
int sensorValue3 ;
int sensorValue4 ;
int sensorValue5 ;
int sensorValue6 ;
long tension ;
long intensite ;
long puissance ;
int vitesse ;
int option1 ;
int option2 ;
 
void setup() {
  Serial.begin(9600);
  sensorValue1 = analogRead(A0);
  sensorValue2 = analogRead(A1);
  sensorValue3 = analogRead(A2);
  sensorValue4 = analogRead(A3);
  sensorValue5 = analogRead(A4);
  sensorValue6 = analogRead(A5);

  tension = sensorValue1;
  intensite = sensorValue2;
  puissance = tension * intensite;

  //  Initialisation de l'instance
  if(!SD.begin(4)) {
    Serial.println(F("Initialisation impossible !"));
    return;
  }
  Serial.println(F("Initialisation OK"));
}
 
void loop() {
    
  Serial.print(tension);        Serial.print(" ; ");   // Affichage U sur le moniteur série
  Serial.print(intensite);      Serial.print(" ; ");   // Affichage I sur le moniteur série
  Serial.print(puissance);      Serial.print(" ; ");   // P=UI
  Serial.print(vitesse);        Serial.print(" ; ");   // Affichage V sur le moniteur série
  Serial.print(sensorValue4);   Serial.print(" ; ");
  Serial.print(sensorValue5);   Serial.print(" ; ");  
  Serial.print(sensorValue6); Serial.println(" ; ");

  fichierSD = SD.open("domi.csv", FILE_WRITE);                  //  Ouverture du fichier
  
  if(fichierSD) {                                               //  Vérification de présence du fichier 
    fichierSD.print(tension);         fichierSD.print(" ; ");   //  Ecriture de U dans le fichier
    fichierSD.print(intensite);       fichierSD.print(" ; ");   //  Ecriture de I dans le fichier  
    fichierSD.print(puissance);       fichierSD.print(" ; ");   //  Ecriture de P dans le fichier
    fichierSD.print(vitesse);         fichierSD.print(" ; ");   //  Ecriture de V dans le fichier      
    fichierSD.print(sensorValue4);    fichierSD.print(" ; ");  
    fichierSD.print(sensorValue5);    fichierSD.print(" ; ");  
    fichierSD.print(sensorValue6);  fichierSD.println(" ; ");
    fichierSD.close();                            //  Fermeture du fichier
  }
  
  delay(1000);
}]
 Pilotage moteur :
[  /*  Dom22  01-2017
   *  Créé entièrement puisque pas trouvé d'exemple après de longues heures de recherche
   *  Essai 2 : donner directement à i la valeur de la durée d'impulsion
   *  Gestion Accélération / Vitesse Max / Décélération moteur brushless
   *  Déblocage du controleur avec une impulsion à 50% ????
   *  Sans delay la rampe dure environ 7 sec d'accéleration + 3 sec de plateau + 7 sec de décélération
   *  
   */

#include <Servo.h>  // Appel de la library Servo.h
const int APPUI=0; // constante état du BP - appui sur niveau bas
const int PAS_APPUI=1; // constante état du BP - relâché sur niveau haut
const int BP=3; //declaration constante de broche 
int ETAT_BP; // variable d'état du bouton poussoir
Servo esc ;         // Créé une variable de type Servo et on lui attribue comme nom : esc

void setup()
{
  esc.attach(8);                    // On attribue la broche 8 à la variable esc
  esc.writeMicroseconds(1400);      // On attribue la valeur min
  Serial.begin(9600);
}
void loop()

{

ETAT_BP=digitalRead(BP); // lit l'état du BP et met la valeur 0/1 dans la variable

if (ETAT_BP==APPUI){ // si l'état du BP est appuyé (càd si variable état BP = 0) 

  {
  Serial.print("ETAT_BP : ");  Serial.println("Appuye !"); // on l'affiche sur le moniteur
  Serial.println("Acceleration pendant 12 secondes !");                // Affiche sur le moniteur la durée de l'impulsion
  for(int i=1400;i<1700;i++)        // Accélération

    {
  esc.writeMicroseconds(i);         // On génère directement la durée
Serial.print("|");
  delay(40);                          // Rampe d'accélération
    }
  Serial.println( );  
  Serial.println("Stabilisation pendant 3 secondes !");                // Affiche sur le moniteur 
  esc.writeMicroseconds(1700);      // Palier à vitesse max

  delay(3000);                      // Durée du palier

  Serial.println("Deceleration pendant 12 secondes");                // Affiche sur le moniteur la durée de l'impulsion  
  for(int i=1700;i>1400;i--)        // Décélération
    {
  esc.writeMicroseconds(i);         // On génère directement la durée

  delay(40);                          // Rampe de décélération
    }
  Serial.println("Arret moteur !");  
    Serial.print("ETAT_BP : ");  Serial.println("Relache !");

}

  }
}]

A propos du bus SPI qui contrôle la carte SD :

Pour l'affectation des bornes ( remplacer la borne 4 par la borne 10) :

Je remplacerais :
if(!SD.begin(4)) ...

par :

const int ChipSelect = 10;
.....

puis dans le setup :
if (!SD.begin(ChipSelect)) ....

Serge .D

Merci beaucoup Serge.
J'aurais tendance à créer des nappes pour relier mes modules aux cartes et du coup je peux m'en faire une spécifique avec mes 4 broches contiguës et juste deux brins plus long pour le +5V et le GND.
Merci encore.
Dom22

Bonjour.
J'ai avancé un peu cette nuit et tout réuni sur la même carte ;
J'ai gardé mon Arduino avec le câblage "mesures" et j'ai ajouté sans problème le câblage "pilotage moteur".
Ça donne ça :
13 SCK
12 MOSI
11 MISO

9 ESC
8 Vitesse 1 (hall)
7 Vitesse 2 (fourche optique)

4 CS (pour le moment que j'essaierai de basculer en 10 plus tard grâce à Aligote)
3 Bouton Poussoir

Coté Analogique :
A0 Tension accus
A1 Intensité accus
A2 Température 1
A3 Autre mesure
Etc...

Il ne reste plus qu'à concaténer les deux sketchs ! (n'en faire plus qu'un !!!)