Aller au contenu


Photo
- - - - -

besoin d'aide programmation arduino


  • Veuillez vous connecter pour répondre
80 réponses à ce sujet

#1 Turboseb77

Turboseb77

    Membre

  • Membres
  • 11 messages

Posté 10 septembre 2018 - 06:03

Bonjour à tous,

j'ai comme projet non pas de faire un robot, mais d'utiliser un arduino nano pour créer un allumage à avance variable pour monter sur une mob de course

 

donc en fait je ne sais pas comment faire mais je suis débrouillard, je dois intégrer la fréquence qui sort de l'alternateur (bobine dans le volant magnétique) et sortir un signal d'environ 3 à 5 volts qui doit suivre de très près le signal d'entrée, mais avec un retard géré en degrés, en gros ce retard par rapport au signal d'entrée doit être programmable et doit pouvoir aller de 30° à 3°  par pas de 1000 tr/mn

l'alternateur sort 2 impulsions par tour, donc en gros à 15000tr/mn l'alternateur sort du 500HZ, le régime max sera à 660HZ inutile d'aller plus loin

 

mon gros problème c'est surtout le code à implanter dans l'arduino, que je puisse modifier via un pc, voir avoir plusieurs courbes activables via un commutateur avec plusieurs positions

 

pour le moment je ne connais que très vaguement le logiciel arduino, il m'a servi à paramétrer et uploader Multiwii dans ma carte cruis aio de mon quadricopter

 

voila, j'espère pouvoir m'en sortir grâce à vous

 

Merci à vous

 



#2 Mike118

Mike118

    Staff Robot Maker

  • Administrateur
  • PipPipPipPipPip
  • 9 963 messages
  • Gender:Male
  • Location:Anglet

Posté 10 septembre 2018 - 09:56

Bienvenue ! 

 

J'ai pas bien compris ce que tu cherches à faire mais en simplifié, de ce que j'ai compris : 

Tu as un signal  Tout ou rien qui à un fréquence de maxi 660 HZ, que tu veux monitorer avec une arduino, et reproduire à l'identique avec l'arduino mais avec un déphasage réglable  compris entre 3° et 30°? C'est bien cela ? 

Et le signal que tu veux produire avec l'arduino est tout ou rien lui aussi ? Ou analogique entre 3 et 5V ?

 

Quand tu dis " plusieurs courbes " tu parles de quoi ? Les différents déphasage possible ou autre chose.? 

 

En tout cas avec le peu d'information que j'ai, monitorer ton signal ça se rapproche de monitorer un encodeur simple. Dans ce cas là je recommande d'utiliser une pin de l'arduino qui possède un compteur hardware => Le pin 2 ou le pin 3 d'une arduino uno. 
Recherche : interruption hardware sur arduino, sur cette page il y a un exemple de code qui gère les pins d'interruptions pour monitorer  un codeur de moteur cc : => Code d'exemple simple pour encodeur 

Hésite pas à confirmer ou à expliciter d'avantage ça nous permettra de t'aider au mieux ! =) 

 


Si mon commentaire vous a plus laissez nous un avis  !  :thank_you:

Nouveau sur Robot Maker ? 

Jetez un oeil aux blogs, aux tutoriels, aux ouvrages, au robotscope  aux articles,  à la boutique  et aux différents services disponible !
En attendant qu'une bibliothèque de fichiers 3D soit mise en place n'hésitez pas à demander si vous avez besoin du fichier 3D d'un des produits de la boutique... On l'a peut être ! 
Si vous souhaitez un robot pilotable par internet n'hésitez pas à visiter www.vigibot.com et à lire le sous forum dédié à vigibot!

 

Les réalisations de Mike118  

 

 

 


#3 Turboseb77

Turboseb77

    Membre

  • Membres
  • 11 messages

Posté 11 septembre 2018 - 08:54

alors, tu à assez bien compris, je vais essayer de mieux me faire comprendre:

- j'ai un signal alternatif (sinusoïde) compris entre 10Hz et 600Hz que je dois pouvoir intégrer dans l'arduino. je dois également par du hardware le limiter à 4 ou 5V pour le pas cramer l'entrée.

- de ce signal et en fonction de la fréquence variable, l'arduino doit (sur une broche de sortie) me sortir un pic bref de 500µS à + 5V, que je vais exploiter pour faire déclencher la "gate" de mon thyristor afin de connecter un condensateur de 0.33µF chargé à 300V sur une bobine haute tension, provoquant une étincelle à la bougie

- le signal de sortie de +5V 500µS doit être légèrement retardé par rapport au signal d'entrée, on va plutôt dire déphasé, ce déphasage doit pouvoir bouger de 3 à 30°  par rapport au signal d'entrée en fonction de la fréquence d'entrée, par palier de 33.33Hz, au pire par palier de 50HZ

le commutateur pour sélectionner plusieurs courbes de déphasage, on vérra plus tard

 

je pense que vous avez mieux compris, j'ai essayé d'être plus explicite

 

je préfèrerai utiliser un arduino nano, si possible, mais si pas le choix j'utiliserai l'arduino adéquat

 

de mon coté je vais essayer d'apprendre les bases de la prog C/C++ pour comprendre un peut ce que je fait, d'ailleurs si vous avez un site sympa je suis preneur

 

Merci :ignat_02:



#4 Mike118

Mike118

    Staff Robot Maker

  • Administrateur
  • PipPipPipPipPip
  • 9 963 messages
  • Gender:Male
  • Location:Anglet

Posté 11 septembre 2018 - 10:19

pour la base on a ce tuto : débuter avec arduino mais il y a d'autres sites intéressants, zeste de savoir, le blog d'eskimon, carnet du maker ...Bref autant ne pas se limiter à une seule source =)


Si mon commentaire vous a plus laissez nous un avis  !  :thank_you:

Nouveau sur Robot Maker ? 

Jetez un oeil aux blogs, aux tutoriels, aux ouvrages, au robotscope  aux articles,  à la boutique  et aux différents services disponible !
En attendant qu'une bibliothèque de fichiers 3D soit mise en place n'hésitez pas à demander si vous avez besoin du fichier 3D d'un des produits de la boutique... On l'a peut être ! 
Si vous souhaitez un robot pilotable par internet n'hésitez pas à visiter www.vigibot.com et à lire le sous forum dédié à vigibot!

 

Les réalisations de Mike118  

 

 

 


#5 Mike118

Mike118

    Staff Robot Maker

  • Administrateur
  • PipPipPipPipPip
  • 9 963 messages
  • Gender:Male
  • Location:Anglet

Posté 11 septembre 2018 - 10:40

alors, tu à assez bien compris, je vais essayer de mieux me faire comprendre:

- j'ai un signal alternatif (sinusoïde) compris entre 10Hz et 600Hz que je dois pouvoir intégrer dans l'arduino. je dois également par du hardware le limiter à 4 ou 5V pour le pas cramer l'entrée.

- de ce signal et en fonction de la fréquence variable, l'arduino doit (sur une broche de sortie) me sortir un pic bref de 500µS à + 5V, que je vais exploiter pour faire déclencher la "gate" de mon thyristor afin de connecter un condensateur de 0.33µF chargé à 300V sur une bobine haute tension, provoquant une étincelle à la bougie

- le signal de sortie de +5V 500µS doit être légèrement retardé par rapport au signal d'entrée, on va plutôt dire déphasé, ce déphasage doit pouvoir bouger de 3 à 30°  par rapport au signal d'entrée en fonction de la fréquence d'entrée, par palier de 33.33Hz, au pire par palier de 50HZ

le commutateur pour sélectionner plusieurs courbes de déphasage, on vérra plus tard

 

je pense que vous avez mieux compris, j'ai essayé d'être plus explicite

 

je préfèrerai utiliser un arduino nano, si possible, mais si pas le choix j'utiliserai l'arduino adéquat

 

de mon coté je vais essayer d'apprendre les bases de la prog C/C++ pour comprendre un peut ce que je fait, d'ailleurs si vous avez un site sympa je suis preneur

 

Merci :ignat_02:

 

Du coup j'avais très mal compris ! 
Je pensais que tu avais un signal Tout ou Rien, et tu as un signal analogique sinusoïdale ! C'est pas le même problème ! Les questions de fréquences sont beaucoup plus rapidement "problématique" . 

Il faut que la fréquence d'acquisition soit supérieur à 2 fois la fréquence du signal observé ... ( Théorème de shanon nyquist ) 

 

La fonction analogRead sur arduino prend un certain temps à s'exécuter : 100 us environ je crois => à vérifier  ... ce qui signifie que si ma valeur est bonne tu pourra faire 10000 mesures / secondes  donc 10K ,Hz,  donc ok pour des mesures de 5KHz et moins, mais tout ça c'est en ne faisant rien d'autre ... 

Plus tu vas remplir ton programme d'exécution à faire, plus il va prendre du temps à les faire et moins il fera de mesures par secondes. Donc il te faut absolument pas trop remplir d'execution ta carte entre deux acquisitions pour garder à minima 1400 mesures par secondes ...  


il te faut en effet ajuster la valeur analogique en amont de l'arduino pour qu'elle soit comprise entre 0 et 5V. Pour cela des AOP c'est une bonne solution.

Pour l'usage des AOP il y a ce projet RMAD que j'ai réalisé qui en utilise. 

 

Après une arduino nano c'est une arduino uno plus petite, tu peux faire exactement la même chose avec ;)


Si mon commentaire vous a plus laissez nous un avis  !  :thank_you:

Nouveau sur Robot Maker ? 

Jetez un oeil aux blogs, aux tutoriels, aux ouvrages, au robotscope  aux articles,  à la boutique  et aux différents services disponible !
En attendant qu'une bibliothèque de fichiers 3D soit mise en place n'hésitez pas à demander si vous avez besoin du fichier 3D d'un des produits de la boutique... On l'a peut être ! 
Si vous souhaitez un robot pilotable par internet n'hésitez pas à visiter www.vigibot.com et à lire le sous forum dédié à vigibot!

 

Les réalisations de Mike118  

 

 

 


#6 Forthman

Forthman

    Pilier du forum

  • Membres
  • PipPipPipPipPip
  • 1 382 messages
  • Gender:Not Telling
  • Location:Montauban (82)

Posté 11 septembre 2018 - 11:27

Je ne comprends pas le signal "sinusoïdal" tu dois avoir un capteur inductif (TTL) qui pointe sur PMH non ?

(ou sur une cible avec plusieurs points)

 

Donc :

- Capteur sur PMH (ou ailleurs) qui délivre un signal TTL avec une avance fixe par rapport à la position du piston.

- l'arduino récupère ce signal (une entrée TTL)

- il calcule la vitesse de rotation du moteur par rapport au temps passé depuis signal précédent

- depuis un tableau ou une équation déduit l'avance optimale

- envoie un signal TTL sur le gate de ton thyristor pour effectuer l'allumage

 

donc 1 entreé, et 1 sortie TTL suffisent non ? (par cylindre)

après que l'arduino soit suffisamment rapide pour obtenir une avance précise c'est autre chose

Si tu as 2 impulsions par tour, 660Hz ça veut dire 330 trs/seconde donc 330x360 = 119KHz par degré



#7 Mike118

Mike118

    Staff Robot Maker

  • Administrateur
  • PipPipPipPipPip
  • 9 963 messages
  • Gender:Male
  • Location:Anglet

Posté 11 septembre 2018 - 01:15

Je ne comprends pas le signal "sinusoïdal" tu dois avoir un capteur inductif (TTL) qui pointe sur PMH non ?

(ou sur une cible avec plusieurs points)

 

Donc :

- Capteur sur PMH (ou ailleurs) qui délivre un signal TTL avec une avance fixe par rapport à la position du piston.

- l'arduino récupère ce signal (une entrée TTL)

- il calcule la vitesse de rotation du moteur par rapport au temps passé depuis signal précédent

- depuis un tableau ou une équation déduit l'avance optimale

- envoie un signal TTL sur le gate de ton thyristor pour effectuer l'allumage

 

donc 1 entreé, et 1 sortie TTL suffisent non ? (par cylindre)

après que l'arduino soit suffisamment rapide pour obtenir une avance précise c'est autre chose

Si tu as 2 impulsions par tour, 660Hz ça veut dire 330 trs/seconde donc 330x360 = 119KHz par degré

 

J'avais compris à peu près la même chose que toi avant qu'il ne donne plus de détails ... 
Je n'ai pas compris d'où vient son signal analogique sinusoïdale ...  mais bon si il dit que c'est son entrée ...  Ne connaissant pas tous les capteurs je me suis juste dit qu'il avait un capteur analogique et que vu ce qu'il mesure ça retourne un signal sinusoïdale ...  Si j'ai encore une fois mal compris ce qui a été dit j'ai sans doute dit des choses qui ne vont pas avec les projets de notre ami TurbsoSeb ...

 

 

 

Bref en clair Turboseb : On peut et on veut aider mais on est pas sûr d'avoir bien cerné toutes les données du problème =).  

Tu as bien un signal sinusoïdale de fréquence max 660Hz en entrée ? 
Si oui, quel est sa plage de tension min et max ? 


Si mon commentaire vous a plus laissez nous un avis  !  :thank_you:

Nouveau sur Robot Maker ? 

Jetez un oeil aux blogs, aux tutoriels, aux ouvrages, au robotscope  aux articles,  à la boutique  et aux différents services disponible !
En attendant qu'une bibliothèque de fichiers 3D soit mise en place n'hésitez pas à demander si vous avez besoin du fichier 3D d'un des produits de la boutique... On l'a peut être ! 
Si vous souhaitez un robot pilotable par internet n'hésitez pas à visiter www.vigibot.com et à lire le sous forum dédié à vigibot!

 

Les réalisations de Mike118  

 

 

 


#8 Turboseb77

Turboseb77

    Membre

  • Membres
  • 11 messages

Posté 11 septembre 2018 - 08:10

alors, une petite bobine située dans le volant magnétique de la mob sort une tension sinuzoidale de.. je doit mesurer, on va dire 15 volts, je vais m'occuper de transformer cette sinuzoide en signal TTL 5v de type carré avec un front bien raide, avec un transistor une résistance et des zener pour ne rien cramer, peut être un condo pour lisser d’éventuels parasites

 

bref je n'ai besoin que d'une entrée et une sortie sur l'arduino, rien de plus

 

l'arduino devra calculer la fréquence et en fonction de cette fréquence créer une dérive différente en fonction de la fréquence

à 3000 trs avoir une dérive de 25° de retard

à 5000trs une dérive de 25°

à 7000trs une dérive de 20°

à 9000trs une dérive de 15°

à 11000trs une dérive de 10°

à 13000trs une dérive de 10°

à 15000trs une dérive de 15°

 

la fréquence peut varier de 16hz à 650hz (500trs à 19500trs/mn) c'est un moteur quoi, avec un seul cylindre, mais cet allumage produit 2 étincelles par tours, une étincelle est perdue, au point mort bas



#9 Forthman

Forthman

    Pilier du forum

  • Membres
  • PipPipPipPipPip
  • 1 382 messages
  • Gender:Not Telling
  • Location:Montauban (82)

Posté 11 septembre 2018 - 08:19

ah!!! je sentais bien que tu avais 2 étincelles par tour :yahoo:

 

Tu en as besoin pour cramer d'éventuels résidus ? ou tu peux t'en passer ? (ça divise quand-même par deux la vitesse nécessaire )



#10 Turboseb77

Turboseb77

    Membre

  • Membres
  • 11 messages

Posté 11 septembre 2018 - 09:30

c'est surtout que j'ai pas le choix d'avoir 2 étincelles par tours, d'ailleurs beaucoup d'allumages font de même

si le palpeur etait en dehors du volant magnétique il ne produirait qu'une impulsion par tour



#11 Mike118

Mike118

    Staff Robot Maker

  • Administrateur
  • PipPipPipPipPip
  • 9 963 messages
  • Gender:Male
  • Location:Anglet

Posté 12 septembre 2018 - 05:00

alors, une petite bobine située dans le volant magnétique de la mob sort une tension sinuzoidale de.. je doit mesurer, on va dire 15 volts, je vais m'occuper de transformer cette sinuzoide en signal TTL 5v de type carré avec un front bien raide, avec un transistor une résistance et des zener pour ne rien cramer, peut être un condo pour lisser d’éventuels parasites

 

bref je n'ai besoin que d'une entrée et une sortie sur l'arduino, rien de plus

 

l'arduino devra calculer la fréquence et en fonction de cette fréquence créer une dérive différente en fonction de la fréquence

à 3000 trs avoir une dérive de 25° de retard

à 5000trs une dérive de 25°

à 7000trs une dérive de 20°

à 9000trs une dérive de 15°

à 11000trs une dérive de 10°

à 13000trs une dérive de 10°

à 15000trs une dérive de 15°

 

la fréquence peut varier de 16hz à 650hz (500trs à 19500trs/mn) c'est un moteur quoi, avec un seul cylindre, mais cet allumage produit 2 étincelles par tours, une étincelle est perdue, au point mort bas

 

Ok donc maintenant je pense avoir parfaitement compris ! 

Tu as un signal TTL 5V ( après "adaptation" ) qui a une fréquence entre 16 Hz et 650 Htz. 
Tu veux réaliser un signal TTL de sortie de même fréquence avec un déphasage variable en fonction de la fréquence. 

(Petite question : tu veux un rectangulaire du même format que l'entré ou tu veux des pulses ? ) 

Dans ton cas qui se rapproche de ce que j'avais compris au tout début je te recommande d'utiliser le pin 2 ( ou le pin 3) de l'arduino  car tu as une interruptions hardware dessus. 

En reprenant le code que je t'avais donné tu peux faire un truc du style à chaque interruption mesure du temps écoulé en micro secondes depuis la dernière fois et en fonction de cela ajuster le déphasage. 


Si mon commentaire vous a plus laissez nous un avis  !  :thank_you:

Nouveau sur Robot Maker ? 

Jetez un oeil aux blogs, aux tutoriels, aux ouvrages, au robotscope  aux articles,  à la boutique  et aux différents services disponible !
En attendant qu'une bibliothèque de fichiers 3D soit mise en place n'hésitez pas à demander si vous avez besoin du fichier 3D d'un des produits de la boutique... On l'a peut être ! 
Si vous souhaitez un robot pilotable par internet n'hésitez pas à visiter www.vigibot.com et à lire le sous forum dédié à vigibot!

 

Les réalisations de Mike118  

 

 

 


#12 Turboseb77

Turboseb77

    Membre

  • Membres
  • 11 messages

Posté 12 septembre 2018 - 08:14

non pas de signal carré, mais des pulses de 500µs maxi, sinon le condensateur ne pourra pas se recharger pour la prochaine étincelle à haut régime moteur

 

bon je vais acheter un arduino nano, une carte avec des bornier à visser, et attaquer

puis faire un bloc CDI moi même, mais ça c'est rien à faire

je ferai des essais à l'oscillo double trace



#13 Forthman

Forthman

    Pilier du forum

  • Membres
  • PipPipPipPipPip
  • 1 382 messages
  • Gender:Not Telling
  • Location:Montauban (82)

Posté 12 septembre 2018 - 08:25

tu devrais attendre que Mike te confirme que l'arduino sera suffisamment rapide... (moi j'en sais rien :pardon:)



#14 cocothebo

cocothebo

    Membre passionné

  • Membres
  • PipPipPip
  • 341 messages
  • Gender:Male

Posté 12 septembre 2018 - 09:31

Salut,

 

Si je reprends ce que dit Forthman, on a: (après si il faut bien les deux étincelles, alors faut diviser les temps par 2)

  • 15 000 trs/min: 250*360/15 de retard à ajouter => 167µs
  • 13 000 trs/min: 217*360/10 de retard à ajouter => 128µs

Donc c'est à 13 000 trs que le retard sera le plus faible, 128µs à ajouter.

Comme c'est variable tu ne pourras pas utiliser directement les timers/PWM à mon avis. Il reste à générer le pulse "à la main", et donc faut voir si le temps pour faire cela est bien inférieur à 128µs (quand je dis bien c'est franchement inférieur sinon on peut rien faire d'autre).

 

Je ne suis pas trop sur mais il me semble que j'avais déjà vu des tests et que le temps de commutation d'un PIN arduino est en desous de la µs (genre même plutôt vers 20/30 ns) et le temps d'éxécution d'une commande genre digitalWrite c'est environ 10µs.

(il existe des bibliothèque pour aller plus vite, on doit descendre pour la commande sous les 200ns)

 

Bref ça semble compatible, à voir si la détection de la fréquence par contre ne coute pas trop de calcul...

 

Pour le reste il faut faire à mon avis une table de correspondance, telle fréquence => hop tant de retard.

 

 

 

Après je connais pas trop, mais si ce retard à l'allumage n'est pas primordiale sur 2 ou 3 périodes, c'est je pense facile, si à chaque allumage il faut être précis je doute que l'arduino y arrivera.

Quand je dis sur 2/3 période c'est à dire que le retard est remis à jour toutes les 2 ou 3 périodes ce qui permet d'avoir bcp de temps pour le faire, la gestion du retard elle passe nécessairement par une interruption sinon la précision va en pâtir.



#15 Mike118

Mike118

    Staff Robot Maker

  • Administrateur
  • PipPipPipPipPip
  • 9 963 messages
  • Gender:Male
  • Location:Anglet

Posté 12 septembre 2018 - 04:56

Si tu acceptes des écarts de 4 µs et que l'arduino ne fais rien d'autre je pense qu'il n'aura aucun mal à faire le taff  ...

 

Le tout calculé à chaque periode ...pour le plus de réactivité. 

 

Je vais voir pour proposer un bout de code un peu plus tard =) 
 


Si mon commentaire vous a plus laissez nous un avis  !  :thank_you:

Nouveau sur Robot Maker ? 

Jetez un oeil aux blogs, aux tutoriels, aux ouvrages, au robotscope  aux articles,  à la boutique  et aux différents services disponible !
En attendant qu'une bibliothèque de fichiers 3D soit mise en place n'hésitez pas à demander si vous avez besoin du fichier 3D d'un des produits de la boutique... On l'a peut être ! 
Si vous souhaitez un robot pilotable par internet n'hésitez pas à visiter www.vigibot.com et à lire le sous forum dédié à vigibot!

 

Les réalisations de Mike118  

 

 

 


#16 Turboseb77

Turboseb77

    Membre

  • Membres
  • 11 messages

Posté 12 septembre 2018 - 06:39

merci, c'est super cool

donc on ne peut pas calculer un angle de déphasage mais plutot un retard en µs si j'ai bien compris

dans ce cas je vais éssayer de comprendre le code, le modifier à ma sauce et faire un paramétrage tous les 1000trs puis  essayer 500tr/min

 

--------------------------------------------------------------------------

 

je suis passionné de sono si l'un d'entre vous veut se construire des enceintes de qualité à prix abordable je vous donnerai des plans que j'ai élaboré moi même, équivalent à du haut de gamme bien plus cher



#17 Forthman

Forthman

    Pilier du forum

  • Membres
  • PipPipPipPipPip
  • 1 382 messages
  • Gender:Not Telling
  • Location:Montauban (82)

Posté 12 septembre 2018 - 07:48

ça revient au même mais ou :

- on a un tableau avec les angles et  l'arduino doit effectuer le calcul en temps réel (ça prend du temps)

- on a un tableau avec les µs et l'arduino n'a pas de calcul à effectuer (ça va plus vite)

 

Mais il est possible de donner le tableau des angles (plus simple pour l'utilisateur)

Il faudra juste que le programme de l'arduino soit en 2 étapes, la première étant de convertir ce tableau en tableau de µs



#18 Mike118

Mike118

    Staff Robot Maker

  • Administrateur
  • PipPipPipPipPip
  • 9 963 messages
  • Gender:Male
  • Location:Anglet

Posté 13 septembre 2018 - 01:13

Bon comme promis voici un petit bout de code rédigé de manière " Simple "  pour le moment ( qui pourra être optimisé pour gagner du temps sur l'arduino si besoin, c'est juste que la manière simple c'est plus facile pour le comprendre au début)  

 

après réflexion finalement j'ai même pas utilisé l'interruption hardware disponible pour la lecture ... et j'ai tout mis directement dans le loop, sauf la fonction qui calcule le temps en microseconde de déphasage à appliquer en fonction du temps en microseconde entre les deux précédents changement sur l'entré ... 

Le code :

#define INPUTPIN 2
#define OUTPUTPIN 3

#define DELAISPULSE 500 // 500us

bool nouveauPulse = false;
bool pulseEnCours = false;
uint32_t tempsProchainPulse = 0;
bool oldEtat = LOW;
uint32_t oldTemps = 0;

void setup()
{
  pinMode(INPUTPIN, INPUT);
  pinMode(OUTPUTPIN, OUTPUT);
}

void loop()
{
  uint32_t temps = micros();
  if ( !nouveauPulse ) {   
    bool etat = digitalRead(INPUTPIN);
    if( etat != oldEtat ) {
      uint32_t delaisInterChange = temps - oldTemps;
      tempsProchainPulse = temps + decalagePulse(delaisInterChange);
      oldEtat = etat;
      oldTemps = temps;
      nouveauPulse = true;
    } 
  }
  else { 
    if ( temps >= tempsProchainPulse ) {  
      if (!pulseEnCours) {
        digitalWrite(OUTPUTPIN, HIGH);
        pulseEnCours = true;
      }
      else if ( temps >= tempsProchainPulse + DELAISPULSE) {
        digitalWrite(OUTPUTPIN, LOW);
        nouveauPulse = false;
        pulseEnCours = false;
      }
    }
  }
}

uint32_t decalagePulse (uint32_t delaisInterChange) {
  if ( delaisInterChange < XX ) 
    return XXXX ;
  else if ( delaisInterChange < XX ) 
    return XXXX ;
  else if ( delaisInterChange < XX ) 
    return XXXX ;
}

Il reste à modifier la fonction  " decalagePulse "  en remplaçant les XX par des valeurs en microsecondes correspondant à la fréquence de l'entrée du cas que tu veux gérer, et à remplacer les XXXX par le déphasage de sortie que tu veux faire en microseconde dans le cas traité. 

 

Tu dois mettre les valeurs XX par ordre croissant, et tu peux mettre autant de if else  en plus que tu veux pour traiter autant de cas que nécessaire.

 

Par contre attention ce code ne fonctionne que pendant environ 71 minutes et 35 seconds après l'allumage de l'arduino... Car la gestion de l'overflow sur micros() et les differentes variables de temps ne sont pas encore traités. Une fois que ce code sera bien compris et validé comme répondant à ton besoin on pourra l'optimisé d'une part pour éviter d'utiliser les fonctions arduino et gagner un peu de temps, et le complexifier d'autre part pour traiter le cas d'overflow. 

 

@turboSeb si tu as des questions hésites pas à les poser, ou à me dire si j'ai mal interprété ce que tu souhaitais. 

 

Et les autres n'hésitez pas à critiquer / faire des remarques  sur ce que je propose là. Si vous avez mieux ou plus simple, ou tout simplement différent n'hésitez pas à proposer. 

Ah et j'oubliais ... Si jamais tu as besoin de quoi que ce soit hésite pas à faire un tour sur la boutique =) 
On propose entre autre les arduino nano =) 

 

@+ 


Si mon commentaire vous a plus laissez nous un avis  !  :thank_you:

Nouveau sur Robot Maker ? 

Jetez un oeil aux blogs, aux tutoriels, aux ouvrages, au robotscope  aux articles,  à la boutique  et aux différents services disponible !
En attendant qu'une bibliothèque de fichiers 3D soit mise en place n'hésitez pas à demander si vous avez besoin du fichier 3D d'un des produits de la boutique... On l'a peut être ! 
Si vous souhaitez un robot pilotable par internet n'hésitez pas à visiter www.vigibot.com et à lire le sous forum dédié à vigibot!

 

Les réalisations de Mike118  

 

 

 


#19 Turboseb77

Turboseb77

    Membre

  • Membres
  • 11 messages

Posté 13 septembre 2018 - 03:15

il y a un truc qui me chifonne

 

si il fonctionne sur la fréquence exacte que je lui envoi, en gros je lui dit 3333µs de retard à 1000 tours par minute:

-----------------------------------------------------

// à 1000 tours par minute (soit 60000002µs par tours), un retard de 20° occasionne un délais de 0,0033333334666667 secondes soit 3333µs
uint32_t decalagePulse (uint32_t delaisInterChange) {
  if ( delaisInterChange < 60000002 )
    return 3333 ;

-----------------------------------------------------

donc quand le moteur tournera à (par exemple) 1251 tours par minute rien ne sortira de la pin 3?

ou fonctionnera t-il sur une plage de fréquence allant jusqu’à la prochaine ligne de code?



#20 Mike118

Mike118

    Staff Robot Maker

  • Administrateur
  • PipPipPipPipPip
  • 9 963 messages
  • Gender:Male
  • Location:Anglet

Posté 13 septembre 2018 - 04:43

Alors du coup ça fonction par plage , vu qu'on a mis un < et pas un == . 

Donc tant que tu seras entre 0 et XX de retard, c'est à dire entre une fréquence " infinie" et la fréquence cité, tu auras XXXX de retard. 

 

ensuite entre la dernière fréquence cité et la nouvel fréquence XX cité tu auras la nouvelle valeurs XXXX fixe de retard. 

Après on peut faire une fonction différentes ... Mais il me semblait que c'est comme cela que tu avais défini tes plages ... 

 

Par contre tu dois commencer par définir les délais les plus court / les nombres de tours par minutes les plus rapides , ou il faut changer le sens des inégalités pour le test ... 


Si mon commentaire vous a plus laissez nous un avis  !  :thank_you:

Nouveau sur Robot Maker ? 

Jetez un oeil aux blogs, aux tutoriels, aux ouvrages, au robotscope  aux articles,  à la boutique  et aux différents services disponible !
En attendant qu'une bibliothèque de fichiers 3D soit mise en place n'hésitez pas à demander si vous avez besoin du fichier 3D d'un des produits de la boutique... On l'a peut être ! 
Si vous souhaitez un robot pilotable par internet n'hésitez pas à visiter www.vigibot.com et à lire le sous forum dédié à vigibot!

 

Les réalisations de Mike118  

 

 

 





0 utilisateur(s) li(sen)t ce sujet

0 members, 0 guests, 0 anonymous users