Go Down

Topic: servo moteur halloween (Read 1 time) previous topic - next topic

neusindam

bonjour,

J'aimerai faire de l'animatronic pour halloween.

Pour ce faire, j'ai besoin que l arduino recoivent une implusion et lancer le servo moteur en delay 5 en angle 90 degre. ( pour bouger une machoire non stop jusqu'a une autre impulsion)

Mais je patauge un peu et rien ne marche.

Pouvez vous m'aider? ce serait genial.

merci beaucoup

J-M-L

Et votre code même buggy est....
Hello - Please do not PM me for help,  others will benefit as well if you post your question publicly on the forums.
Bonjour Pas de messages privés SVP, postez dans le forum directement pour que ça profite à tous

neusindam

Bonjour,

Desolé mais je n'ai pas recu de notifs suite a votre réponse.

Justement, le code...

Comme je cherche à attacher 1 servo 1 bouton qui ne sert que a allumer et eteindre le mouvement donné, je ne trouve rien...

Je trouve plein d'exemple sur 2 boutons 1 servo mais aucun dans le sens que je recherche.

Si je fais un organigramme:

- PIN recoit une impulsion
- Servo fonctionne dans l'angle donné 0,90 et vice versa sans arreter
- PIN recoit une 2eme implusion
- Servo se stoppe a son ZERO

Etant novice, commencant des cours sur internet, cela est un peu fort pour moi. Du coup, je me suis dis qu'ici on pourrait m'aider...

Mon projet est bien plus grand encore mais cela me mettrai sur la voie pour d'autres applications que je prevois aussi lol

PS : je ne demande pas un code mais deja un demarrage ce serait super genial

Merci

J-M-L

#3
Sep 24, 2017, 01:09 pm Last Edit: Sep 24, 2017, 01:10 pm by J-M-L
Vous pourriez commencer par lire les tutos d'eskimons

par exemple celui sur les boutons et celui sur les moteurs et plus particulièrement sur les Servo-Moteurs si vous voulez aller vite (mais je conseille de tout lire)

ça devrait vous mettre sur le bon chemin!
Hello - Please do not PM me for help,  others will benefit as well if you post your question publicly on the forums.
Bonjour Pas de messages privés SVP, postez dans le forum directement pour que ça profite à tous

infobarquee

bonjour,
Quote
Si je fais un organigramme:

- PIN recoit une impulsion
- Servo fonctionne dans l'angle donné 0,90 et vice versa sans arreter
- PIN recoit une 2eme implusion
- Servo se stoppe a son ZERO
rien de bien compliqué
fonction boolean pour le bouton
un servo est piloté en degré
style
Code: [Select]
servo.write(90);
AUCUNE AIDE PAR MP

neusindam

hello,

Alors j'ai mis de nouveau longtemps a revenir mais c'est pour une bonne raison lol

Mon ami et moi avons beaucoup travailler notre programme.

Pour vous expliquer, nous recevons une information exterieur qui est censée mettre en route le servo moteur lorsque je le lui demande.

Sauf que, au point ou nous en sommes, mon moteur tourne sans arret.... il demarre bien quand je le lui demande mais ne s'arrete pas :-(

pourriez vous m aider ? ce serait super sympa, je vous colle mon code ci dessous:

#include <Servo.h>

Servo myservo;  // create servo object to control a servo
               // a maximum of eight servo objects can be created

int pos = 0;    // variable to store the servo position
int F = 6;
int G = 7;
int H = 8;
int I = 9;
int J = 10;
int K = 11;
int valI = 0;
int valJ = 0;
int valK = 0;
int led2 = 41;
int led3 = 42;


int i = 0;
int incomingByte[3];

void setup()
{
 Serial.begin(57600);

  myservo.attach(40);
 pinMode(F, OUTPUT);
 pinMode(G, OUTPUT);
 pinMode(H, OUTPUT);
 pinMode(I, INPUT);
 pinMode(J, INPUT);
 pinMode(K, INPUT);

 pinMode(led2, OUTPUT);
 pinMode(led3, OUTPUT);



}

void loop()
{
 if (Serial.available() >= 3)
 {
   for (int i = 0; i < 3; i++)
   {
     incomingByte = Serial.read();
   }                                       // Arduino pins
   digitalWrite(F, incomingByte[0]);  // guirlande rouge
   digitalWrite(G, incomingByte[1]);  // visage mannequin
   digitalWrite(H, incomingByte[2]);  // mannequin volant
   }
   valI = digitalRead(I);
   valJ = digitalRead(J);
   valK = digitalRead(K);
   
   while (valI == HIGH)
   {servo1();}
   
   
 
}
void servo1(){
 for(pos = 70; pos < 130; pos += 1)  // goes from 0 degrees to 180 degrees
 {                                  // in steps of 1 degree
   myservo.write(pos);              // tell servo to go to position in variable 'pos'
   delay(50);                       // waits 15ms for the servo to reach the position
 }
 myservo.write(130);
 delay (2000);
 for(pos = 130; pos > 70; pos -= 1)     // goes from 180 degrees to 0 degrees
 {                                
   myservo.write(pos);              // tell servo to go to position in variable 'pos'
   delay(50);                       // waits 15ms for the servo to reach the position
 }
  }

J-M-L

#6
Sep 28, 2017, 11:31 pm Last Edit: Sep 28, 2017, 11:35 pm by J-M-L
Votre code est à moitié en italique parce que le logiciel du forum a interprété une partie de votre code (un [i]) comme étant une instruction de formatage ce qui rend le tout illisible

Lisez les posts épinglés en haut du forum et corrigez votre post en utilisant les balises de code


Sinon pour votre question c'est assez simple
Code: [Select]
while (valI == HIGH)
   {servo1();}
comme rien dans l'exécution de servo1() ne modifie valI, une fois rentré dans la boucle vous n'en sortez plus jamais...
Hello - Please do not PM me for help,  others will benefit as well if you post your question publicly on the forums.
Bonjour Pas de messages privés SVP, postez dans le forum directement pour que ça profite à tous

mickali

bonjour à tous,

je travail avec damien sur son projet et je vais essayé d'expliqué de manière plus claire ce que l'on veut faire et où on veut allé :-)

donc à la base nous avons un sketch qui fonctionne bien, celui-ci nous à recevoir des données en generical serial depuis une raspberrypi, l'arduino reçoit les info et il allume des led.

voici le code:
Code: [Select]

int F = 6;
int G = 7;
int H = 8;



int i = 0;
int incomingByte[3];

void setup()
{
  Serial.begin(57600);

 
  pinMode(F, OUTPUT); // sortie digital sur la pin6
  pinMode(G, OUTPUT); // sortie digital sur la pin7
  pinMode(H, OUTPUT); // sortie digital sur la pin8




}

void loop()
{
  if (Serial.available() >= 3)
  {
    for (int i = 0; i < 3; i++)
    {
      incomingByte[i] = Serial.read();
    }                                     
    digitalWrite(F, incomingByte[0]);  // led1
    digitalWrite(G, incomingByte[1]);  // led2
    digitalWrite(H, incomingByte[2]);  // led3
    }
  }


maintenant le but et de pouvoir transformer les infos reçue en incomingbyte pour déclencher un sketch qui contrôle des servomoteur.

voici le code que j'avais essayé au départ (car celui de damien est une alternative en essayant de faire des boutons digital par des pontages entre pin) mais je pense qu'il y a moyen de faire beaucoup plus simple, c'est juste que nous sommes encore débutant avec l'arduino.

Code: [Select]
#include <Servo.h>
 
Servo myservo;  // créer un object servo pour controler le servo
               
 
int pos = 0;    // variable pour controler la position du servo

int A = 0;      // déclaration de la variable A

int led2 = 7;    // affectation de la led2 à la pin7
int led3 = 8;    // affectation de la led2 à la pin8


int i = 0;
int incomingByte[3];

void setup()
{
  Serial.begin(57600);

   myservo.attach(6);
 
  pinMode(led2, OUTPUT);
  pinMode(led3, OUTPUT);



}

void loop()
{
  if (Serial.available() >= 3)
  {
    for (int i = 0; i < 3; i++)
    {
      incomingByte[i] = Serial.read();
    }                                       // Arduino pins
    A = incomingByte[0];  // affectation des données incomingbyte[0] à la variable A
    digitalWrite(led2, incomingByte[1]);  // led2
    digitalWrite(led3, incomingByte[2]);  // led3
    }
   
   
    if (A == HIGH)
    {servo1();}
   
   
   
}
void servo1(){
  for(pos = 70; pos < 130; pos += 1)  // goes from 0 degrees to 180 degrees
  {                                  // in steps of 1 degree
    myservo.write(pos);              // tell servo to go to position in variable 'pos'
    delay(50);                       // waits 15ms for the servo to reach the position
  }
  myservo.write(130);
  delay (2000);
  for(pos = 130; pos > 70; pos -= 1)     // goes from 180 degrees to 0 degrees
  {                               
    myservo.write(pos);              // tell servo to go to position in variable 'pos'
    delay(50);                       // waits 15ms for the servo to reach the position
  }
   }



voilà le problème, dés que le moteur s'enclenche, le reste ne suis pas et le moteur ne s'arrête pas.

j'espère avoir pu être claire et espérant avoir de l'aide pour nous aider à grandir dans le monde l'arduino.

un grand merci d'avance.

mick

 

jfs59

bonjour

faire un traçage de la variable A sur la sortie série ... vous allez surement comprendre
Si tu donnes un poisson à un homme, il mangera un jour. Si tu lui apprends à pêcher, il mangera toujours.

Lao Tseu.

mickali

bonjour jfs59,

faire le traçage de la variable A, je crois comprendre, je dois donc sortir les lectures de données de serial.begin  par seria1.begin. mais pour connecter serial1.begin à mon pc j'utilise un adaptateur rs232?
ou il y a un notre moyen?

merci

J-M-L

#10
Sep 29, 2017, 10:21 pm Last Edit: Sep 29, 2017, 10:22 pm by J-M-L
Même problème que je vous ai déjà mentionné en #6 - changer le nom de la variable ne fixe pas le problème..
Hello - Please do not PM me for help,  others will benefit as well if you post your question publicly on the forums.
Bonjour Pas de messages privés SVP, postez dans le forum directement pour que ça profite à tous

neusindam

Et moi pour ma part, vu que je n'ai pas le niveau pour commencer les serial print,  j'ai beau tenter de modifier le code

while (valI == HIGH)
  {servo1();}

de mille et une facon mais  rien ne se passe grrrrrrrrrr

j'ai tenter 30 facons differente de lui dire de se stopper mais rien n'y fait... toujours en me disant que la suivante sera la bonne mdr mais non concluant...

il ne nous manque que cela pour mettre enfin notre projet a execution  tout en ayant les enfants du quartier sur le dos mdr. Je sais que donner la solution n'est pas dans vos habitudes, je sais que la meilleur facon d'apprendre est de rechercher , encore et encore ;-)

Mais une facon d'apprendre est aussi de recevoir la réponse avec les explications qui vont avec ce qui permet aussi de comprendre notre erreur et en tenir la lecon ;-)

alors si qq a ce niveau et se sent l'ame généreuse, se sentant l'envie d'aider deux pauvres petits malheureux mdr, ce serait , SUPER MEGA TROP TOP GENIAL mdr

allez, deja un grand merci de votre suivi et de votre aide deja apportée ;-)

J-M-L

#12
Sep 30, 2017, 06:48 am Last Edit: Sep 30, 2017, 07:05 am by J-M-L
Désolé j'avais mal lu hier soir et pas vu le if au lieu de while - vous relisez bien la donnée

La question est plutôt de savoir si c'est la bonne donnée versus  ce que vous envoyez : des octets ou de entiers ? un entier c'est plusieurs octets donc si côté emettteur vous envoyez deux ou 4 octets pour un int, là côté récepteur vous n'en lisez qu'un seul par entier émis

La seconde question est sur le timing. si pour une raison quelconque votre arduino rate le premier octet envoyé il est décalé « à vie » sur la réception. il est généralement clé dans un protocole de communication d'indiquer le début (et éventuellement la fin) d'une trame de données. par exemple envoyer ['#' V1 V2 V3] et vous attendez d'avoir reçu le '#' avant de lire les 3 valeurs dans l'ordre

Pouvez vous expliquer pourquoi vous avez besoin de RPI et de l'arduino?
Hello - Please do not PM me for help,  others will benefit as well if you post your question publicly on the forums.
Bonjour Pas de messages privés SVP, postez dans le forum directement pour que ça profite à tous

mickali

#13
Sep 30, 2017, 07:38 am Last Edit: Sep 30, 2017, 07:58 am by mickali
bonjour j-m-l ,

ça fait plaisir de voir que je ne suis pas le seul matinal :-D

la rpi envoit des infos de type séquenceur musical.
dans notre cas, c'est configurer pour des guirland normal donc normalement on/off il est possible que le programme envoie 255 pour ON est du 0 pour OFF car il possible avec d'autre configuration d'utiliser des guirlande rgb.

mais comment le savoir?

pour le timing le programme est 50 fps.

maintenant quand exécute le programme en enlevant le servo et faire fonctionné qu'avec des leds ça tourne nickel(bon timing) -> arduino reçoit l'info et il allume aussi vite les leds. mais dés que je remplace la led par le servo, il me fait la séquence servo1 quand on lui demande mais le programme ne s'arrête pas et il n'envoie pas l'info à la led2 ni led3...

voilà toutes les infos ;-)

merci à vous

jfs59

rebonjour

encore une fois et cela a été dit plus haut il faut s'intéresser a ce que vous envoyé et a ce que vous recevez (type de la donnée) une lettre un groupe de lettre un chiffre ou autre chose (code hexa ....)
et évidemment dans la comparaison ne pas comparer des cerises avec des bananes car même s'il y en a 1 kg de chaque c'est pas pour autant que la comparaison va donner une valeur vraie ou fausse ! il faut donc tracer le résultat de cette comparaison car a mon avis c'est la que ce trouve le problème des que vous recevez qq chose ca boucle et ca ne peut plus sortir car le résultat de la comparaison est toujours le même ...

if (A == HIGH)


qu' est ce que A ?

qu' est ce que HIGH ?
Si tu donnes un poisson à un homme, il mangera un jour. Si tu lui apprends à pêcher, il mangera toujours.

Lao Tseu.

Go Up