Aller au contenu


Photo
- - - - -

arduino SainSmart Uno pour casque Iron Man


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

#1 Yann et Isa

Yann et Isa

    Nouveau membre

  • Membres
  • 16 messages
  • Gender:Male
  • Interests:Mécanique, électronique, informatique et musique

Posté 18 novembre 2013 - 02:42

Bonjour à tous !

J'ai commençé un projet de casque iron man pour mon fils, le casque est fini je suis sur la partie électronique et la je rencontre un petit problème, j'ai passé des nuits entières sur se programme.

Le but:
-une pression sur le bouton poussoir et les servomoteurs doivent passer de la position 10° à 160°
et les leds s'allume en fading.
-une seconde pression sur le bouton et les leds s'éteignent et les servomoteurs passent de 160° à 10°.

C'est assez simple en gros, sauf que, quand j'appuis les servos font un allé retour les leds s'allument
et si j'appuis pour la fonction "OFF" les leds s'éteignent et les moteurs ne bougent pas, si je l'allume
à nouveau les servomoteurs refont un allé et retour (de 160° à 10° puis retourne à 160°).

Je suis novice j'ai fais un mix de tout se que j'ai pu voir sur le net mais il faut pas oublier que se
n'est pas un arduino de la marque italienne mais un SainSmart UNO !!!

Je n'ai pas réussi à faire fonctionner les servomoteurs avec des appels (myservo.write(160))...

Voici le prog en question:

#include <Servo.h>
//servo 1
Servo myservoR;
Servo myservoL;
int val; // variable for reading the pin status
int val2; // variable for reading the delayed/debounced status
int buttonState;
int pos = 0;
int pos2 = 0;
int servostatus = 0;
int switchPin =2; // Switch connected to digital pin 2
int ledPin = 8;
int ledPin3 = 6;
int ledPin2 = 7;
void setup() // run once, when the sketch starts
{
//servo 1
myservoR.attach(5);
myservoL.attach(4);
pinMode(switchPin, INPUT);
pinMode(ledPin2,OUTPUT);
pinMode(ledPin, OUTPUT);
pinMode(ledPin3, OUTPUT);
buttonState = digitalRead(switchPin);
myservoR.write(10);
myservoL.write(10);
}
void loop() // run over and over again
//servo 1
{

val = digitalRead(switchPin); // read input value and store it in val
delay(10); // 10 milliseconds is a good amount of time
val2 = digitalRead(switchPin); // read the input again to check for bounces
if (val == val2) { // make sure we got 2 consistant readings!
if (val != buttonState) { // the button state has changed!
if (val == LOW) { // check if the button is pressed
if (servostatus == 0) { // is the light off?
for(pos = 10; pos < 160; pos += 1)

{
servostatus = 1; // turn light on!

myservoR.write(pos);
myservoL.write(pos);
delay(10);

}
digitalWrite(ledPin2,HIGH);
digitalWrite(ledPin, HIGH);
digitalWrite(ledPin3, HIGH);
delay(500);
digitalWrite(ledPin2,LOW);
digitalWrite(ledPin, LOW);
digitalWrite(ledPin3, LOW);
delay(00);
digitalWrite(ledPin2,HIGH);
digitalWrite(ledPin, HIGH);
digitalWrite(ledPin3, HIGH);
delay(500);
digitalWrite(ledPin2,LOW);
digitalWrite(ledPin, LOW);
digitalWrite(ledPin3, LOW);
delay(00);// fading
for(int fadeValue = 0 ; fadeValue <= 255; fadeValue +=5) {// sets the value (range from 0 to 255):
analogWrite(ledPin, fadeValue);
analogWrite(ledPin2, fadeValue);
analogWrite(ledPin3, fadeValue);
delay(50);

}
} else {
{
servostatus = 0; // turn light off!
for(pos2 = 160; pos > 10; pos -=1)
myservoR.write(pos2);
myservoL.write(pos2);
delay(10);
digitalWrite(ledPin, LOW);
digitalWrite(ledPin3, LOW);
digitalWrite(ledPin2, LOW);
delay(15);
}


}
}
buttonState = val; // save the new state in our variable

}
}
}

Voilà en espérant que quelqu'un vera mon appel à l'aide, d'avance merci !
:Koshechka_08:/>

#2 olivthill

olivthill

    Membre occasionnel

  • Membres
  • Pip
  • 143 messages
  • Gender:Male
  • Location:Normandie
  • Interests:Robots humanoides.

Posté 18 novembre 2013 - 09:37

Il y a un problème de parenthèse mal placée.

Par exemple, il ne devrait y avoir qu'une seule parenthèse ouvrante après le else.
Et il manque une parenthèse ouvrante après le deuxième for.

#3 Black Templar

Black Templar

    Membre

  • Membres
  • PipPipPipPip
  • 1 430 messages
  • Gender:Male
  • Location:Lille

Posté 18 novembre 2013 - 10:09

Il y a un problème de parenthèse mal placée.

Par exemple, il ne devrait y avoir qu'une seule parenthèse ouvrante après le else.
Et il manque une parenthèse ouvrante après le deuxième for.


Bien vu Image IPB
Il faut prendre l'habitude de bien indenter son code !
ça facilite la relecture et ça aide grandement à trouver les erreurs comme celles-là

#include <Servo.h>
//servo 1
Servo myservoR;
Servo myservoL;
int val; // variable for reading the pin status
int val2; // variable for reading the delayed/debounced status
int buttonState;
int pos = 0;
int pos2 = 0;
int servostatus = 0;
int switchPin =2; // Switch connected to digital pin 2
int ledPin = 8;
int ledPin3 = 6;
int ledPin2 = 7;

void setup() // run once, when the sketch starts
{
	//servo 1
	myservoR.attach(5);
	myservoL.attach(4);
	pinMode(switchPin, INPUT);
	pinMode(ledPin2,OUTPUT);
	pinMode(ledPin, OUTPUT);
	pinMode(ledPin3, OUTPUT);
	buttonState = digitalRead(switchPin);
	myservoR.write(10);
	myservoL.write(10);
}

void loop() // run over and over again
{
	val = digitalRead(switchPin); // read input value and store it in val
	delay(10); // 10 milliseconds is a good amount of time
	val2 = digitalRead(switchPin); // read the input again to check for bounces
	if (val == val2) { // make sure we got 2 consistant readings!
		if (val != buttonState) { // the button state has changed!
			if (val == LOW) { // check if the button is pressed
				if (servostatus == 0) { // is the light off?
				
					for(pos = 10; pos < 160; pos += 1)
					{
						servostatus = 1; // turn light on!

						myservoR.write(pos);
						myservoL.write(pos);
						delay(10);
					}
					
					digitalWrite(ledPin2,HIGH);
					digitalWrite(ledPin, HIGH);
					digitalWrite(ledPin3, HIGH);
					delay(500);
					digitalWrite(ledPin2,LOW);
					digitalWrite(ledPin, LOW);
					digitalWrite(ledPin3, LOW);
					delay(00);
					digitalWrite(ledPin2,HIGH);
					digitalWrite(ledPin, HIGH);
					digitalWrite(ledPin3, HIGH);
					delay(500);
					digitalWrite(ledPin2,LOW);
					digitalWrite(ledPin, LOW);
					digitalWrite(ledPin3, LOW);
					delay(00);// fading
					
					for(int fadeValue = 0 ; fadeValue <= 255; fadeValue +=5) {// sets the value (range from 0 to 255):
						analogWrite(ledPin, fadeValue);
						analogWrite(ledPin2, fadeValue);
						analogWrite(ledPin3, fadeValue);
						delay(50);
					}
				} else {
					servostatus = 0; // turn light off!
					for(pos2 = 160; pos > 10; pos -=1) 
					{
						myservoR.write(pos2);
						myservoL.write(pos2);
						delay(10);
						digitalWrite(ledPin, LOW);
						digitalWrite(ledPin3, LOW);
						digitalWrite(ledPin2, LOW);
						delay(15);
					}

				}
			}
			buttonState = val; // save the new state in our variable
		}
	}
}

Mon site internet : http://ferdinandpiette.com/


#4 Yann et Isa

Yann et Isa

    Nouveau membre

  • Membres
  • 16 messages
  • Gender:Male
  • Interests:Mécanique, électronique, informatique et musique

Posté 18 novembre 2013 - 10:16

tout d'abord merçi de m'avoir répondu , j'ai refais le progr de se que j'ai compris,
voilà :

#include <Servo.h>
//servo 1
Servo myservoR;
Servo myservoL;
int val; // variable for reading the pin status
int val2; // variable for reading the delayed/debounced status
int buttonState;
int pos = 0;
int pos2 = 0;
int servostatus = 0;
int switchPin =2; // Switch connected to digital pin 2
int ledPin1 = 8;
int ledPin2 = 6;
int ledPin3 = 7;
void setup() // run once, when the sketch starts
{
  //servo 1
  myservoR.attach(5);
  myservoL.attach(4);
  pinMode(switchPin, INPUT);
  pinMode(ledPin1,OUTPUT);
  pinMode(ledPin2, OUTPUT);
  pinMode(ledPin3, OUTPUT);
  buttonState = digitalRead(switchPin);
  myservoR.write(0);
  myservoL.write(0);
}
void loop() // run over and over again
//servo 1
{
  val = digitalRead(switchPin); // read input value and store it in val
  delay(10); // 10 milliseconds is a good amount of time
  val2 = digitalRead(switchPin); // read the input again to check for bounces
  if (val == val2) { // make sure we got 2 consistant readings!
    if (val != buttonState) { // the button state has changed!
      if (val == LOW) { // check if the button is pressed
       if (servostatus == 0) { // is the light off?
         
          {
            servostatus = 1; // turn light on!  
            for(pos = 10; pos < 160; pos += 1)
            myservoR.write(pos);
            myservoL.write(pos);
            delay(10);
          }
          digitalWrite(ledPin1, HIGH);
          digitalWrite(ledPin2, HIGH);
          digitalWrite(ledPin3, HIGH);
          delay(50);
          digitalWrite(ledPin1, LOW);
          digitalWrite(ledPin2, HIGH);
          digitalWrite(ledPin3, LOW);
          delay(00);
          digitalWrite(ledPin1, HIGH);
          digitalWrite(ledPin2, HIGH);
          digitalWrite(ledPin3, HIGH);
          delay(50);
          digitalWrite(ledPin1, LOW);
          digitalWrite(ledPin2, LOW);
          digitalWrite(ledPin3, LOW);
          delay(00);// fading
          for(int fadeValue = 0 ; fadeValue <= 255; fadeValue +=2) {// sets the value (range from 0 to 255):
          analogWrite(ledPin1, fadeValue);
          analogWrite(ledPin2, fadeValue);
          analogWrite(ledPin3, fadeValue);
          delay(30);

          }
        } 
         else {
          servostatus = 0; // turn light off!  
          { for(pos2 = 160; pos > 10; pos -=1)
            myservoR.write(pos2);
            myservoL.write(pos2);
            delay(10);       
          digitalWrite(ledPin1, LOW);   
          digitalWrite(ledPin2, LOW);
          digitalWrite(ledPin3, LOW);
          delay(15);
          }
        }
      } 
      buttonState = val; // save the new state in our variable
     }
    }
  }
Ca ne marche toujours pas, meme pire mes servos ne bougent plus, je nage la :Alvarin_07:/>

#5 Yann et Isa

Yann et Isa

    Nouveau membre

  • Membres
  • 16 messages
  • Gender:Male
  • Interests:Mécanique, électronique, informatique et musique

Posté 18 novembre 2013 - 10:25

bon, j'ai fais un copié collé de ta version Black tempar ( PS comme nom j'ai failli mettre Ichigo lol) et j'ai toujours le meme résultat que au dépard, je vous rappel juste que je suis novice et que mon arduino est un sainsmart uno c 'est pas tout à fait pareil du moins visuellement.

#6 Yann et Isa

Yann et Isa

    Nouveau membre

  • Membres
  • 16 messages
  • Gender:Male
  • Interests:Mécanique, électronique, informatique et musique

Posté 18 novembre 2013 - 10:35

meme avec les parenthèses j'ai la meme réaction qu'avec mon programme de départ :
les servomoteurs viennent à 10° puis vont à 160° les leds s'allument, et quand j'appuis à nouveau les leds s'éteignent et les servomoteurs reste à 160°...
En gros le masque s'ouvre mais se referme de suite.

Je ne suis pas un pro mais j'ai beau lire et relire ... ça me semble juste, est ce à cause la marque sainsmart ? je ne sais pas se que ça vaut je ne trouve aucuns renseignement sur les arduino de cette marque.

#7 ChristianR

ChristianR

    Habitué

  • Membres
  • PipPip
  • 474 messages
  • Gender:Male
  • Location:Isère (38)
  • Interests:Arduino, programmation, électronique...

Posté 18 novembre 2013 - 11:05

Indenter c'est décaler la marge de gauche pour regrouper les lignes d'un même bloc, pour rendre le code lisible.
Ta carte est compatible Uno, c'est la même puce ATMEL dessus.

servostatus = 1; // est répété 150 fois pour rien dans une boucle, tu peux le sortir de la boucle.

delay(00); ne sert pas à grand chose.

Le débugage consiste avant tout à insérer dans le code des lignes Serial.print() pour voir ce qui se passe et l'état des variables aux différentes étapes.
http://arduino.cc/en/Serial/Print
Christian

#8 Yann et Isa

Yann et Isa

    Nouveau membre

  • Membres
  • 16 messages
  • Gender:Male
  • Interests:Mécanique, électronique, informatique et musique

Posté 18 novembre 2013 - 11:27

hum... ok, je vois pas comment servostatus = 1 est répété et si je dois le sortir de la boucle ou le mettre ? les delay (00) je vais les supprimer , ça s'est bon , mais les serial print la je capte plus, sincèreement je pensais que se serait plus simple et comme dit je suis novice et un mécanicien sur un pc si c'est pas pour une voiture c'est moins évident pour moi,
ça va faire une semaine que je galère la dessus pour mon fils et la j'arrive plus tout seul.

Est ce que l'un d'entre vous pourrez me le modifier s'ils vous plaient ?

#9 Yann et Isa

Yann et Isa

    Nouveau membre

  • Membres
  • 16 messages
  • Gender:Male
  • Interests:Mécanique, électronique, informatique et musique

Posté 19 novembre 2013 - 12:03

j'essaie de comprendre les sérialprint mais, c'est trop pour moi la...

#10 ChristianR

ChristianR

    Habitué

  • Membres
  • PipPip
  • 474 messages
  • Gender:Male
  • Location:Isère (38)
  • Interests:Arduino, programmation, électronique...

Posté 19 novembre 2013 - 11:57

Dans la boucle void setup() { ....} tu rajoutes Serial.begin(9600);

Dans le code tu rajoutes Serial.println(buttonState); pour pouvoir afficher et contrôler la valeur de tes variables, par exemple ici buttonState.
Le moniteur série s'ouvre sur l'écran du PC et va afficher pendant le déroulement du programme ce qui se passe dans l'Arduino
avec le menu Tools/Serial monitor ou le raccourci Crtl+Maj+M
Christian

#11 Yann et Isa

Yann et Isa

    Nouveau membre

  • Membres
  • 16 messages
  • Gender:Male
  • Interests:Mécanique, électronique, informatique et musique

Posté 19 novembre 2013 - 03:35

ok , je rentre du taf après avoir cherché une panne électrique sur une rena... et j'ai trouvé, alors y a pas de raison que je trouve pas se satané code, y a t'il des personnes dispo le soir ici car la je dois encore aller voir une cliente et je n'aurai le temps que se soir ?

PS: merci à vous tous, mais je vous avoue que je pensais que vous me referiez le code correctement voir meme carrément autrement, d'ailleurs j'ai vu trop compliqué ou il y avait possibilité de faire plus simple car au départ je voyais plutot ça :

#include <Servo.h>
//servo 1
Servo myservoR;
Servo myservoL;
const int buttonPin = 2;
const int pos = 0;
const int pos2 = 0;
const int ledPin1 = 8;
const int ledPin2 = 6;
const int ledPin3 = 7;
int buttonState = 0;

void setup() // run once, when the sketch starts
{
  //servo 1
  myservoR.attach(5);
  myservoL.attach(4);
  pinMode(buttonPIN, INPUT);
  pinMode(ledPin1,OUTPUT);
  pinMode(ledPin2, OUTPUT);
  pinMode(ledPin3, OUTPUT);
  for(pos2 = 160; pos > 10; pos -=1)
  myservoR.write(pos2);
  myservoL.write(pos2);
}
void loop() // run over and over again
//servo 1

      buttonState = digitalRead (buttonPin);
      if (buttonState == HIGH) {
          for(pos = 10; pos < 160; pos += 1)
          myservoR.write(pos);
          myservoL.write(pos);
          delay(10);
          digitalWrite(ledPin1, HIGH);
          digitalWrite(ledPin2, HIGH);
          digitalWrite(ledPin3, HIGH);
          delay(50);
          digitalWrite(ledPin1, LOW);
          digitalWrite(ledPin2, HIGH);
          digitalWrite(ledPin3, LOW);
          delay(00);
          digitalWrite(ledPin1, HIGH);
          digitalWrite(ledPin2, HIGH);
          digitalWrite(ledPin3, HIGH);
          delay(50);
          digitalWrite(ledPin1, LOW);
          digitalWrite(ledPin2, LOW);
          digitalWrite(ledPin3, LOW);
          delay(00);// fading
          for(int fadeValue = 0 ; fadeValue <= 255; fadeValue +=2) {// sets the value (range from 0 to 255):
          analogWrite(ledPin1, fadeValue);
          analogWrite(ledPin2, fadeValue);
          analogWrite(ledPin3, fadeValue);
          delay(30);
        } 
         else {
          digitalWrite(ledPin1, LOW);
          digitalWrite(ledPin2, LOW);
          digitalWrite(ledPin3, LOW);
          delay(15);
          for(pos2 = 160; pos > 10; pos -=1)
          myservoR.write(pos2);
          myservoL.write(pos2);
          delay(10);
        }
      } 
      

Bon ça marche pas non plus , mais s'était une idée.

#12 TitiMoby

TitiMoby

    Membre

  • Membres
  • 73 messages
  • Gender:Male
  • Location:Villeurbanne

Posté 19 novembre 2013 - 04:48

désolé, comme d'autres je répond en étant encore au bureau ;)/>

rapidement j'ai copié ton code dans mon IDE Arduino.
même sans carte sur place, ça permet d'utiliser le bouton qui ne fait que compiler.

Et là :

18: error: ‘buttonPIN’ was not declared in this scope

Tu as déclaré une variable buttonPin mais utilisé buttonPIN.

donc ligne 18 :

pinMode(buttonPin, INPUT);

Je recompile :

22: error: assignment of read-only variable ‘pos2’

effectivement tu déclares pos2 comme une constante.

modifie la ligne 7 :

int pos2 = 0;

et par déduction, le compile suivant te fera modifier la ligne 6 :

int pos = 0;

Comme nous tous ici, nous apprenons.
Personnellement, je galère plus sur les structures mécaniques.
Je me trompe et je recommence.

Continuons un peu, vu que j'ai déjà pris un peu de temps, autant essayer de t'avancer encore un peu ;)/>

la fonction loop() doit commencer par une accolade ouvrante {
les boucles for() {... } également.

Il peut être intéressant de t'aider d'un outil simple mais plus complet, peut être genre http://arduinodev.com/codeblocks/

Je te joins après le code qui compile.

mais ATTENTION !!!

un code qui compile n'est pas forcément un code qui fait ce que tu veux et dans le cas d'Arduino ou tout montage impliquant de l'électronique, une erreur peut griller un composant.

Relis donc ce que je te soumets ci après, je n'ai absolument pas regardé ce que ça faisait, juste corrigé pour que ça compile.

Regardes bien quand tu essaies du code la fenetre qui indique les erreurs avant même que ce soit envoyé à l'Arduino.
Mieux : utilises d'abord le bouton de compilation avant d'envoyer.

Bonne suite, je retourne bosser ;)/>

#include <Servo.h>
//servo 1
Servo myservoR;
Servo myservoL;
const int buttonPin = 2;
int pos = 0;
int pos2 = 0;
const int ledPin1 = 8;
const int ledPin2 = 6;
const int ledPin3 = 7;
int buttonState = 0;

void setup() // run once, when the sketch starts
{
  //servo 1
  myservoR.attach(5);
  myservoL.attach(4);
  pinMode(buttonPin, INPUT);
  pinMode(ledPin1,OUTPUT);
  pinMode(ledPin2, OUTPUT);
  pinMode(ledPin3, OUTPUT);
  for(pos2 = 160; pos > 10; pos -=1)
  myservoR.write(pos2);
  myservoL.write(pos2);
}

void loop() {
  // run over and over again
  //servo 1
  buttonState = digitalRead (buttonPin);
  if (buttonState == HIGH) {
          for(pos = 10; pos < 160; pos += 1) {
          myservoR.write(pos);
          myservoL.write(pos);
          delay(10);
          digitalWrite(ledPin1, HIGH);
          digitalWrite(ledPin2, HIGH);
          digitalWrite(ledPin3, HIGH);
          delay(50);
          digitalWrite(ledPin1, LOW);
          digitalWrite(ledPin2, HIGH);
          digitalWrite(ledPin3, LOW);
          delay(00);
          digitalWrite(ledPin1, HIGH);
          digitalWrite(ledPin2, HIGH);
          digitalWrite(ledPin3, HIGH);
          delay(50);
          digitalWrite(ledPin1, LOW);
          digitalWrite(ledPin2, LOW);
          digitalWrite(ledPin3, LOW);
          delay(00);// fading
          for(int fadeValue = 0 ; fadeValue <= 255; fadeValue +=2) {
            // sets the value (range from 0 to 255):
            analogWrite(ledPin1, fadeValue);
            analogWrite(ledPin2, fadeValue);
            analogWrite(ledPin3, fadeValue);
            delay(30);
          }
        }
        } else {
          digitalWrite(ledPin1, LOW);
          digitalWrite(ledPin2, LOW);
          digitalWrite(ledPin3, LOW);
          delay(15);
          for(pos2 = 160; pos > 10; pos -=1) {
            myservoR.write(pos2);
            myservoL.write(pos2);
            delay(10);
          }
        }
      }


#13 R1D1

R1D1

    Modérateur et Membre passionné

  • Modérateur
  • PipPipPipPip
  • 1 211 messages
  • Gender:Male
  • Location:Autriche

Posté 19 novembre 2013 - 08:57

Salut !

PS: merci à vous tous, mais je vous avoue que je pensais que vous me referiez le code correctement voir meme carrément autrement, d'ailleurs j'ai vu trop compliqué ou il y avait possibilité de faire plus simple car au départ je voyais plutot ça :


Te donner directement le code n'est pas une bonne solution : d'une part, on ne sait pas comment est fait ton montage, d'autre part, tu n'apprendras pas grand chose (et si ton petit veut l'épaulière avec le lance missiles ensuite, c'est mieux si tu as compris comment ça marchait ;)).

Comment ça marche une Arduino (ou équivalent) en termes de code ? Contrairement au C/C++ classique, la fonction "main" du programme (qui est exécutée au lancement du programme) est cachée. Tu as, à la place, deux fonctions principales : setup() et main().
setup() est exécutée une fois lorsque ta carte démarre : elle permet de configurer les ports entrées/sorties, la communication série, etc.
loop() est ensuite exécutée jusqu'à reset de la carte (ou coupure de l'alimentation). Ca veut dire que le code dans loop() est répété indéfiniment, à la vitesse du microprocesseur.

Qu'est-ce qui se passe dans ton code, dans l'ordre ?
- La carte démarre, les variables sont déclarées et initialisées.
- setup est exécuté : les broches 4 et 5 sont liées aux variables de type "Servo" (ce sont des "implémentations" de la "classe" Servo : deux objets de type Servo). Tu configures le sens de communication des broches (avec pinMode), puis tu demandes à tes servomoteurs d'aller à 160° puis à toutes les positions de 160 à 10 en variant l'angle d' 1 degré.
MAIS ! ta boucle for ne fait pas ce que tu veux : vérifie la syntaxe. Lorsque tu veux exécuter plusieurs instructions dans une boucle, il ne faut pas oublier les accolades qui définissent un bloc d'instructions. Tu dois donc écrire quelque chose comme :
for( initialisation de la variable de boucle ; condition de bouclage ; instruction)
{
     bloc d'instructions
}
sans oublier d'indenter ! Le seul cas où tu peux ne pas mettre les accolades, c'est s'il n'y a qu'une instruction dans la boucle, mais je te conseille de les mettre quand même (lisibilité et clarté du code).

- tu rentres dans loop() : tu lis l'état du bouton. Ici, c'est ta condition qui n'est pas adapté à ce que tu veux faire. Rappelle-toi : le code de loop est exécuté à la vitesse du microprocesseur ! Ca veut dire que tant que tu appuies, tu rentres dans la première condition : les servos commencent à bouger et les leds à s'allumer. Mais dès que tu lâches le bouton, la condition est fausse et tu fais les instructions qui sont entre les accolades du "else" : donc tes LEDs s'éteignent et ton casque se ferme.

Comment corriger le problème ? Il y a deux phases de fonctionnement : "le casque est fermé" ou "le casque est ouvert". Dans la première phase, si on appuie, le casque doit s'ouvrir et les LEDs s'allumer. Dans le deuxième, si on appuie, le casque doit se fermer et les LEDs s'éteindre. Je te laisse faire le code qui va bien. Je ne pense pas que tu auras de souci parce que ça n'est pas purement une Arduino. Mais quand tu dois coder un programme, il faut d'abord bien réfléchir à ce que tu veux faire, et bien le séparer en cas différents.

Dernier conseil : si tu as un doute sur le fonctionnement d'un truc en particulier, regarde les exemples de code fournis, et teste un cas très simple. Il y a plein de ressources sur le site d'Arduino.
N'hésite pas à poser une question si quelque chose n'est pas clair, et à nous montrer le résultat une fois que tu auras réussi ! :)
R1D1 - Calculo Sed Ergo Sum -- en ce moment, M.A.R.C.E.L.
Avatar tiré du site bottlebot

#14 Yann et Isa

Yann et Isa

    Nouveau membre

  • Membres
  • 16 messages
  • Gender:Male
  • Interests:Mécanique, électronique, informatique et musique

Posté 19 novembre 2013 - 11:16

déjà merci, ensuite pour titimoby et R1D1 , vous parlez du dernier programe tapé ? c'était juste mon idée de départ, histoire de montrer si je vais dans la bonne voie le vrai prog actuel c'est celui plus haut avec les "Val", pour moi en ayant justement repiqué sur celui de Devilflash, je pensais l'injecter dans la carte et continuer le reste de l'armure qui est déjà un travail énorme , sans compter que la mon fils n'as que 8 ans
et qu'il grandit , donc entre le moment ou je commence et celui ou je vais finir, je veux qu'il puisse le mettre, mon but n'ais pas de devenir programmeur loin de la c'est mon premier projet et la j'aimerai juste que ça marche...

A la base j'ai reçu ça de Devilflash:

#include <Servo.h>
//servo 1
Servo myservo;
Servo myservo1;
int val; // variable for reading the pin status
int val2; // variable for reading the delayed/debounced status
int buttonState;
int pos = 5;
int pos1 = 165;
int servostatus = 0;
int switchPin =2; // Switch connected to digital pin 2
int ledPin = 5;
int ledPin3 = 6;
int ledPin2 = 18;
void setup() // run once, when the sketch starts
{
//servo 1
myservo.attach(9);
myservo1.attach(10);
pinMode(switchPin, INPUT);
pinMode(ledPin, OUTPUT);
pinMode(ledPin3, OUTPUT);
buttonState = digitalRead(switchPin);
myservo.write(5);
myservo1.write(165);
pinMode(ledPin2, OUTPUT);
}
void loop() // run over and over again
//servo 1
{
val = digitalRead(switchPin); // read input value and store it in val
delay(10); // 10 milliseconds is a good amount of time
val2 = digitalRead(switchPin); // read the input again to check for bounces
if (val == val2) { // make sure we got 2 consistant readings!
if (val != buttonState) { // the button state has changed!
if (val == LOW) { // check if the button is pressed
if (servostatus == 0) { // is the light off?
servostatus = 1; // turn light on!
myservo.write(5);
myservo1.write(165);
delay(1000);
digitalWrite(ledPin, HIGH);
digitalWrite(ledPin3, HIGH);
delay(50);
digitalWrite(ledPin, LOW);
digitalWrite(ledPin3, LOW);
delay(00);
digitalWrite(ledPin, HIGH);
digitalWrite(ledPin3, HIGH);
delay(50);
digitalWrite(ledPin, LOW);
digitalWrite(ledPin3, LOW);
delay(00);
// fading
for(int fadeValue = 0 ; fadeValue <= 255; fadeValue +=5) {
// sets the value (range from 0 to 255):
analogWrite(ledPin, fadeValue);
analogWrite(ledPin3, fadeValue);
delay(30);
}
} else {
servostatus = 0; // turn light off!
digitalWrite(ledPin, LOW);
digitalWrite(ledPin3, LOW);
delay(15);
digitalWrite(ledPin2, LOW);
myservo.write(165);
myservo1.write(5);
}
}
}
buttonState = val; // save the new state in our variable
}
}

le liens vers ça vidéo :

http://www.youtube.com/watch?feature=player_detailpage&v=gXJqar_3tLM

Et ça marche chez lui , alors pourquoi chez moi ca marche pas ?

PS: mon cablage est correct, en informatique je débute mais en électricité je touche, je suis dans l'automobile et ont voie des pannes de folie croyez moi !

#15 Yann et Isa

Yann et Isa

    Nouveau membre

  • Membres
  • 16 messages
  • Gender:Male
  • Interests:Mécanique, électronique, informatique et musique

Posté 21 novembre 2013 - 12:16

C'est bon, j'ai réussi !!! :Koshechka_08:

en relisant et grace aussi à un ami qui voulait (du coup il trouve ça trop dur) se mettre à l'arduino.

J'ai suivi tous vos conseils, j'avoue, c'était le bordel dans ma tete , et le lien de téléchargement de codec de Titymoby à fait paniqué Avast du coup j'ai éteint mon pc et j'ai repris hier à tete reposé, et la "pos3" je l'ais supprimer et j'ai replacer mes parenthèses ...

#include <Servo.h>
//servo 1
Servo myservoR;
Servo myservoL;
int val; // variable for reading the pin status
int val2; // variable for reading the delayed/debounced status
int buttonState;
int pos = 0;
int servostatus = 0;
int switchPin =2; // Switch connected to digital pin 2
int ledPin = 8;
int ledPin3 = 6;
int ledPin2 = 7;

void setup() // run once, when the sketch starts
{
        //servo 1
        myservoR.attach(5);
        myservoL.attach(4);
        pinMode(switchPin, INPUT);
        pinMode(ledPin2,OUTPUT);
        pinMode(ledPin, OUTPUT);
        pinMode(ledPin3, OUTPUT);
        buttonState = digitalRead(switchPin);
        myservoR.write(30);
        myservoL.write(30);
}

void loop() // run over and over again
{
        val = digitalRead(switchPin); // read input value and store it in val
        delay(10); // 10 milliseconds is a good amount of time
        val2 = digitalRead(switchPin); // read the input again to check for bounces
        if (val == val2) { // make sure we got 2 consistant readings!
                if (val != buttonState) { // the button state has changed!
                        if (val == LOW) { // check if the button is pressed
                                if (servostatus == 0) { // is the light off?
                                
                                        for(pos = 30; pos < 160; pos += 1)
                                        {
                                                servostatus = 1; // turn light on!

                                                myservoR.write(pos);
                                                myservoL.write(pos);
                                                delay(10);
                                        }
                                        
                                        digitalWrite(ledPin2,HIGH);
                                        digitalWrite(ledPin, HIGH);
                                        digitalWrite(ledPin3, HIGH);
                                        delay(1);
                                        digitalWrite(ledPin2,LOW);
                                        digitalWrite(ledPin, LOW);
                                        digitalWrite(ledPin3, LOW);
                                        digitalWrite(ledPin2,HIGH);
                                        digitalWrite(ledPin, HIGH);
                                        digitalWrite(ledPin3, HIGH);
                                        delay(500);
                                        digitalWrite(ledPin2,LOW);
                                        digitalWrite(ledPin, LOW);
                                        digitalWrite(ledPin3, LOW);
                                        // fading
                                        
                                        for(int fadeValue = 0 ; fadeValue <= 255; fadeValue +=5) {// sets the value (range from 0 to 255):
                                                analogWrite(ledPin, fadeValue);
                                                analogWrite(ledPin2, fadeValue);
                                                analogWrite(ledPin3, fadeValue);
                                                delay(50);
                                        }
                                } else {
                                        servostatus = 0; // turn light off!
                                        for(pos = 160; pos > 30; pos -=1) 
                                        {
                                                myservoR.write(pos);
                                                myservoL.write(pos);
                                                delay(10);
                                                digitalWrite(ledPin, LOW);
                                                digitalWrite(ledPin3, LOW);
                                                digitalWrite(ledPin2, LOW);
                                                
                                        }

                                }
                        }
                        buttonState = val; // save the new state in our variable
                }
        }
}

et la , enfin ça marche , j'y croyais plus, maintenant j'ai juste un petit souci de réglage ,pour une histoire d'esthétique et de symétrie, sur une des 2 servomoteurs j'ai inverser les poles (interne avec les conseils d'un revendeur modéliste) et là, j'ai un léger décalage quand ils vont au point 30° .

Donc, je pensais faire une ligne "for" pour un servo et une autre pour le second servo...
Je vais prendre des photos de tout ca .

ENCORE MERCI A TOUS POUR VOTRE AIDE !!!

#16 TitiMoby

TitiMoby

    Membre

  • Membres
  • 73 messages
  • Gender:Male
  • Location:Villeurbanne

Posté 21 novembre 2013 - 12:28

Tant mieux !
par contre tu as eu un probleme pour la page de CodeBlock ? bizarre mais bon.

très content que ça fonctionne ;)

#17 Yann et Isa

Yann et Isa

    Nouveau membre

  • Membres
  • 16 messages
  • Gender:Male
  • Interests:Mécanique, électronique, informatique et musique

Posté 22 novembre 2013 - 12:39

merci mais c'est pas fini, pour que ça fonctionne il faut que les servos soyvent synchro et pour cela que faire ? programmer deux lignes "for" genre :

for(pos = 40; pos < 160; pos += 1)
                                        {
                                                servostatus = 1; // turn light on!

                                                myservoR.write(pos);
                                                delay(10);
                                        }
                                        for(pos = 20; pos < 160; pos += 1)
                                        {
                                          myservoL.write(pos);
                                          delay(10);
                                        }

Non cela fait bouger un servomoteur après l'autre, il me faut des positions décalées genre :

myservoR 20°>160°
myservoL 40°>160°

Alors poussons le truc plus loin, comment faire ça ? :tatice_03:/>/>

#18 Yann et Isa

Yann et Isa

    Nouveau membre

  • Membres
  • 16 messages
  • Gender:Male
  • Interests:Mécanique, électronique, informatique et musique

Posté 22 novembre 2013 - 12:43

pour le code book pas grave j'ai eu une partie quand meme :drinks:/>

#19 TitiMoby

TitiMoby

    Membre

  • Membres
  • 73 messages
  • Gender:Male
  • Location:Villeurbanne

Posté 22 novembre 2013 - 07:03

Les 2 servos n'ont pas le même mouvement ?
L'un bouge de 20 à 160 l'autre de 40 à 160 ?

Est ce qu'ils doivent partir au même moment et finir au même moment ?

#20 Yann et Isa

Yann et Isa

    Nouveau membre

  • Membres
  • 16 messages
  • Gender:Male
  • Interests:Mécanique, électronique, informatique et musique

Posté 10 juillet 2014 - 01:58

Re bonjour à tous , j'ai eu beaucoup de choses à faire ses derniers mois et je ne trouvais plus le forum, mais enfin j'ai remis la main dessus...

Bref, depuis j'ai fini les parties mécanique (que j'ai repris a zéro) , la finition , la peinture, les leds et verres solaire avec un film en carbone blanc, mais... j'ai rencontrer un gros problème, la fiabilité des servomoteurs de départ, je les ais donc remplaçer par des pro tronik 7495mg-d qui sont a engrenage acier et roulements à billes avec un couple plus important, ses servomoteurs sont a course continus et bizarrement ils marche avec le servo tester mais pas avec l'arduino , ils saccadent et mettent l'arduino en défauts...

cela fait plusieurs semaines que je cherche et à priori il faudrait un code en PWM... cela complique tout à nouveau

Je ne sais plus quoi faire , je veux juste finir se casque c'est tout , hors de question de faire l'armure complète c'est trop de travail et d'investissement

vidéo du casque

désolé pour la qualitée de la vidéo je l'ais faites pour montrer a des amis sur facebook




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

0 members, 2 guests, 0 anonymous users