ILS, pas à pas et servo, LED

Galère de dernière minute

a marqué ce sujet comme résolu.

Salut, Pour un projet de TSI, nous avons conçu une base rechargeant un stylo plume. La personne chargée de la programmation n’a rien fait de l’année, ce qui fait que nos solutions mécaniques ne peuvent être testées … Il faudrait faire en sorte qu’un ILS lance le programme faisant tourner le pas à pas, le servo a 180° dans un sens puis dans l’autre, et de nouveau le pas à pas, le tout avec des pauses. On n’y connait pas grand chose, et l’autre se moque de ne rien avoir à présenter pour le bac. Sauf que nous on en a besoin pour nos mesures et notre présentation. Pourriez-vous vérifier ce programme (dans le post suivant) qui ne devra s’exécuter qu’une fois par contact de l’ILS ? Ça serait vraiment sympa. Merci !

Salut,
C’est vraiment dommage que ce genre de scénario puisse se produire, cependant vous devriez pouvoir tester vos solutions mécaniques sans avoir le programme, en appliquant une commande directe et en relevant avec des appareils de mesure (oscillo …)

En attente du post du code source annoncé, je souhaite vous signaler que pour pouvoir faire une vérification complète, il faudra compléter avec les références du matériel utilisé (voire la documentation associée), ainsi que le schéma électronique du système.

Veuillez donc préciser quel contrôleur vous utilisez (probablement un arduino ? lequel ?), quel moteur pas à pas et quel servomoteur (quelles sont les commandes) et quel capteur ILS (car tous ne renvoie pas le même signal) ?

EDIT : et ça peut être pas mal d’avoir également le cahier des charges pour connaitre le comportement attendu avec précision (parce que "tourner dans un sens puis dans l’autre le tout avec des pauses", ça n’est pas très clair)

+1 -0

Merci pour votre réponse ! Une des mesures consiste à évaluer le temps total de fonctionnement… donc bon :D Voici la liste du matériel que nous utilisons;


Moteur pas à pas 5V : Moteur 28BYJ-48-5: http://www.gotronic.fr/art-moteur-28byj-48-5-21213.htm; Interrupteur ILS: http://www.gotronic.fr/art-interrupteur-ils-1-t-19990.htm; Panneau solaire: Cellule solaire SOL2W: http://www.gotronic.fr/art-cellule-solaire-sol2w-18995.htm. Carte Arduino UNO servo moteur: HS422


Pour ce qui est du cahier des charges je pense que la cinématique du sytème serait bien appropriée. si ils état haut alors: -moteur pas a pas 1/2 tour; il ne bouge plus jusqu’à la prochaine commande -delay 1 sec; -servomoteur 180°; -delay 20s; -servomoteur -180°; -delay 20s; -pas a pas -1/2 tour; Fin du programme ^^

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
#include <Stepper.h>
#include <Servo.h>
const int NombrePas=64; // Nombre de pas du servomoteur 
const int Pas_1=5; //declaration constante de broche 
const int Pas_2=4; //declaration constante de broche 
const int Pas_3=3; //declaration constante de broche 
const int Pas_4=2; //declaration constante de broche
Stepper stepper(NombrePas, Pas_1, Pas_3, Pas_2, Pas_4);
Servo monServomoteur;
//intialisation leds état
int ledvert1 = 13;
 int timer = 100; // The higher the number, the slower the timing.
 //initialisation programme ILs 
 int etat_ils = 0;
const int ils = 7;

unsigned char configuration_ils = 0; // ou 1, dépend du câblage de l'ILS selon les schémas précédents
 //programme 
 void setup() {
   stepper.setSpeed(200);  
   pinMode(ils,INPUT);


// ------- Broches en sortie -------  

pinMode(Pas_1, OUTPUT); //met la broche en sortie 
pinMode(Pas_2, OUTPUT); //met la broche en sortie 
pinMode(Pas_3, OUTPUT); //met la broche en sortie 
pinMode(Pas_4, OUTPUT); //met la broche en sortie 

    monServomoteur.attach(6);

 }
void loop() {
           etat_ils = digitalRead(ils);

        if(etat_ils == HIGH) {
          //* mot pas a pas
          //*  pause 
          //*  vider 
          //*  remplir
          //*  pas a pas 

digitalWrite ( ledvert1, LOW);
  for (int i=1; i<=NombrePas; i++){ // boucle de défilement du nombre de pas
  stepper.step(16); // un pas en sens positif
  }
delay(1000);

 // Fait bouger le bras de 0° à 180°
  for (int position = 0; position <= 180; position++) {
    monServomoteur.write(position);
     }
    delay(20000);
//  Fait bouger le bras de 180° à 0°
  for (int position = 180; position >=0; position++) {
    monServomoteur.write(position); 
    }
 delay (20000);

for (int i=1; i<=NombrePas; i++){ // boucle de défilement du nombre de pas
  stepper.step(-16); // un pas en sens positif
  }
digitalWrite(ledvert1, HIGH); 
        }
}

`

Nous avons déjà un peu regardé ce qu’il a "fait" nous avons déjà enlevé les plus grosses aberrations. Nous sommes très reconnaissant de l’intérêt que vous portez à notre post ! MERCI :)

PS: si il manque des doc n’hésitez surtout pas !!

Salut !

Je n’ai pas touché aux Arduinos depuis longtemps, donc je vais laisser mes camarades vérifier. J’ai juste corrigé un peu l’indentation du code. Son contenu est quasi-identique, mais il sera plus facile à lire. Bon courage pour ton projet. ;)

  • Je me suis permis de modifier quelques commentaires pour les rendre plus explicites1.
  • J’ai déplacé (et rendu constante) la déclaration de la broche de la led verte un peu plus haut pour rassembler les déclarations de broches ensembles.
  • La variable timer (initialisée à 100) n’est pas utilisée dans ton programme. C’est pour un futur ajout ?
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
#include <Stepper.h>
#include <Servo.h>

const int NombrePas=64; // Nombre de pas du servomoteur 
// Constantes des broches
const int Pas_1 = 5;
const int Pas_2 = 4;
const int Pas_3 = 3;
const int Pas_4 = 2;
const int ledvert = 13; // Led témoin

Stepper stepper(NombrePas, Pas_1, Pas_3, Pas_2, Pas_4);
Servo monServomoteur;

int timer = 100; // The higher the number, the slower the timing.
// Variables pour ILS
int etat_ils = 0;
const int ils = 7;
unsigned char configuration_ils = 0; // ou 1, dépend du câblage de l'ILS selon les schémas précédents

// Programme 
void setup() {
    stepper.setSpeed(200);  
    pinMode(ils,INPUT);

    // ------- Broches en sortie -------  

    pinMode(Pas_1, OUTPUT);
    pinMode(Pas_2, OUTPUT);
    pinMode(Pas_3, OUTPUT);
    pinMode(Pas_4, O;UTPUT);

    monServomoteur.attach(6);
}

void loop() {
    etat_ils = digitalRead(ils);

    if(etat_ils == HIGH) {
        //* mot pas a pas
        //*  pause 
        //*  vider 
        //*  remplir
        //*  pas a pas 

        digitalWrite(ledvert1, LOW);
        for (int i=1; i<=NombrePas; i++) { // Défilement du nombre de pas
            stepper.step(16); // Un pas en sens positif
        }

        delay(1000);

        // Fait bouger le bras de 0° à 180°
        for (int position = 0; position <= 180; position++) {
            monServomoteur.write(position);
        }

        delay(20000); // Temps de rechargement

        // Fait bouger le bras de 180° à 0°
        for (int position = 180; position >=0; position++) {
            monServomoteur.write(position); 
        }

        delay (20000);

        for (int i=1; i<=NombrePas; i++) { // boucle de défilement du nombre de pas
            stepper.step(-16); // un pas en sens positif
        }

        digitalWrite(ledvert1, HIGH); 
    }
}

  1. Désolé, depuis que j’ai lu la PEP8 Python, je peux plus m’en empêcher. :D 

+2 -0

Merci pour ce coup de propre ! ;) La valeur timer était enfaite utilisée pour un chenilard mis au pif par notre valeureux collègue. Ducoup on l’a viré (le chenilard pas le collègue hein !;) ) On a juste oublié ce petit bout ! Dans l’attente d’autres réponses merci beaucoup !

J’ai jamais touché à un arduino, cependant j’ai l’impression que les moteurs sont pilotés n’importe comment.
Avec la documentation de Servo et de Stepper :

  • le servomoteur est piloté en position, donc il n’y a pas à faire une boucle, envoyer la consigne monservomoteur.write(180) pilotera le moteur jusqu’à la position d’angle 180°
  • pas besoin de boucle pour le moteur pas à pas non plus, on peut donner directement le bon nombre de pas (1/2 tour = la moitié de la totalité des pas). on peut donc faire stepper.step(NombrePas/2) et stepper.step(-NombrePas/2) pour faire des demi-tours (d’ailleurs j’ai pas compris la boucle actuelle, pourquoi 64*16 pas pour faire un demi-tour)

Autres remarques :

  • piloter le moteur pas à pas est une instruction bloquante d’après la doc, ce qui veut dire que votre programme ne continuera pas tant que le demi-tour n’a pas été effectuer, si le timing du programme est important, il faut y faire attention.
  • Il faudrait piloter le système pour le mettre dans une position initiale au démarrage car si on le coupe électriquement pendant que le moteur pas à pas effectue son demi-tour, il ne sera jamais dans la bonne position.
+2 -0

Le fait qu’ils soient pilotés n’importe comment peut expliquer le fait qu ils fassent n’importe quoi !! Ravi d’apprendre que le code d’un pas à p as soit si simple :D ! Merci ! Pour ce qui est de la deuxième remarque nous supposons qu’il n’y aura jamais de panne d’électricité 😂 !! Afin de simplifier au maximum le programme .. Ah et ! … Pour le nombre de pas =16 … On a pas compris la logique mais toujours est il que nous avons dans un premier temps essayé avec 32 pas (64/2 logique pour un demi tour ^^ ). Le résultat était pas concluant, avec le moteur qui faisait juste pas un demi tour, donc nous avons mis 16 … Pour voir et là miracle ! Ça a marché .. je pense que c’est du au fait que ce soit un moteur unipolaire . Voilà voilà !

+0 -0

"le servomoteur est piloté en position, donc il n’y a pas à faire une boucle, envoyer la consigne monservomoteur.write(180) pilotera le moteur jusqu’à la position d’angle 180°" Ducoup en suivant la logique si je veux que le moteur retourne à sa position initiale je fais monservomoteur.write(0) car il est parti de 0 ? la logique est bonne ?

C’est ce qu’à l’air de dire la doc en tout cas, à part si c’est un servomoteur à rotation continue, auquel cas le système de pilotage est différent (90 ne fait pas bouger le moteur, 90 à 180 le fait bouger dans un sens, à différentes vitesse et 0 à 90 dans l’autre sens)

Merci pour toutes vos réponses ! Et je suis vraiment désolé de revenir vers vous si tard … Pour la fin de l’histoire j’ai réussi grâce à vous à bricoler un programme en 12D. IL fonctionne, ça m’a pris 2h en reprenant le programme de 0. Au final mon travail sur ce programme n’a pas pu être valorisé puisque ce n’était pas ma partie, j’ai eu un 14,5 sur ma partie (décevant au vu du temps investi dans le projet ) et j’ai eu mon BAC. La machine fonctionne relativement bien. Le Guignole de l’équipe s’est fait démonté dans son oral par le jury et a par miracle aussi eu son BAC. En somme je vous remercie encore une fois tous car j’ai appris des truc grâce à vous !

Connectez-vous pour pouvoir poster un message.
Connexion

Pas encore membre ?

Créez un compte en une minute pour profiter pleinement de toutes les fonctionnalités de Zeste de Savoir. Ici, tout est gratuit et sans publicité.
Créer un compte