
Animation pilote dans une maquette
#41
Posté 24 décembre 2011 - 09:08
Pour l'utilisation d'une télécommande IR cela peut-être (pour un débutant) très simple comme assez compliquée.
Tout dépend de ce que tu comptes faire et avec quoi.
Si tu achètes un module de télécommande IR spécialement conçue pour Arduino, c'est tout ce qu'il y a de plus simple aussi bien pour l’électronique que pour le code.
Si par contre, tu souhaites récupérer la télécommande d'un vieux téléviseur par exemple, cela se complique, un peut
Dans le 1er cas, il existe des modules tout faits avec un code parfaitement expliqué.
Par exemple ce modèle DFRobot
Il comporte 21 boutons que tu peux affecter à n importe quelle fonction chancelante de ton µC. Tu n'as pas besoin de calculer les séquences IR envoyées et n'a plus qu'a adapter un code déjà fait ou tu n'as plus qu'a insérer les actions que tu souhaites affecter à chaque bouton. (Nous serons là ne t’inquiète pas)
Dans le 2em cas (et c'est bien sûr un cas que je te déconseille pour le moment) tu dois avec un code C apprendre la séquence IR envoyée par ta télécommande oui d'utiliser chacune des ces séquence pour les affecter aux enclenchements d'actions.
Donc si nous éliminons la seconde solution, et que tu te constante d'une télécommande telle que celle dont je t'ai donné le lien, tout reste silmple et même un débutant arriverait à comprendre le code.
Comment cela se passe.
Tu as une télécommande qui comporte 21 boutons
Chaque bouton envoie une séquence lumineuse infrarouge au récepteur.
Ces séquences sont des phases ou la LED émettrice est allumée et d'autre ou elle est éteinte.
Le récepteur reçoit ces séquences
les décrypte
Et si elle correspond à une action programmée dans ton code, elle la déclenche.
Côté câblage
Sur le modèle présent, rien de plus simple, car le module est livré avec in câble 3 fils (le même que celui de ton servomoteur, mais numérique avec le même connecteur 3 conducteur)
La différence entre un fil analogique et un câble analogique et un câble numérique est simplement l'ordre des fils. (Data, +5v, GND pour le numérique et Data, GND, +5v pour l'analogique)
Donc tu n'a cas enficher ce connecteur sur ta carte en regardant à quelle Pin numérique il correspond (comme tu l'as fait pour tes servomoteurs)
Ce Pin sera celui à déclarer dans ton code. (toujours comme tu l'as fait pour tes servomoteurs)
Ensuite, tu vas devoir récupérer le code qui fait tourner tes servomoteurs
télécharger le code livré avec le module de ta télécommande.
Télécharger la Librairie
Copier le code de l'un vers l'autre en respectant la position de chaque ligne
Je m' explique
Copier tout ce qui se trouve avant "voidsetup()" d'un code avant "voidsetup()" de l'autre code
Copier tout ce qui se trouve entre "{ et } de "voidsetup()" d'un code entre "{ et } de "voidsetup()" de l'autre code
Copier tout ce qui se trouve entre "{ et } de "voidloop()" d'un code entre "{ et } de "voidloop()" de l'autre code
Mais nous t'aiderons
Car tu vas devoir ensuite soit avec des If mais plutôt avec des "case" décider ce que fera chaque bouton.
Voilà ne soit pas effrayé, c'est très simple et soit nous te guiderons pas a pas, soit je t'écrirais un code que tu n'aura plus qu'à envoyer vers ton µC
Cdlt
Yves
#42
Posté 24 décembre 2011 - 01:57
Il y a le Jack qui supporte entre 6 et 12v (les régulateurs (7805 et le régulateur 3.3v te donneront un courant régule)
Si tu mets le cavalier Ccc +5v, le jack alimente les connecteurs Vcc en 5v (sans que tu ai besoin d'alimenter le bornier "Servos PWR" Les Pins marquées Vcc seront alimentées en 5v
Si tu ne le met pas, tu dois mettre une alimentation au bornier Servo PWR et la tension que tu y applique sera aux Pins marquées Vcc
Voilà désolé du retard
Cdlt
Yves
#43
Posté 24 décembre 2011 - 02:05
J'avais anticipé en achetant celle ci, que j'ai reçu

Quand tu parles de pin numérique, sur mon shield c'est ce qui est marqué "digital pin 7 8"? juste a côté des pwm des servos?
j'ai installé la librairie IRremote, mais je veux bien que tu me donnes un code d'exemple pour juste déclencher la mise en marche d'un servo. Avec la telecommande, donc j'aurais pu juste me servir du bouton vert play/pause pour mettre en marche et arrêter l'animmation
#45
Posté 24 décembre 2011 - 02:56
Bonjour à tous,
J'avais anticipé en achetant celle ci, que j'ai reçu
Quand tu parles de pin numérique, sur mon shield c'est ce qui est marqué "digital pin 7 8"? juste a côté des pwm des servos?
j'ai installé la librairie IRremote, mais je veux bien que tu me donnes un code d'exemple pour juste déclencher la mise en marche d'un servo. Avec la telecommande, donc j'aurais pu juste me servir du bouton vert play/pause pour mettre en marche et arrêter l'animmation
Bien
Nous allons faire ca en deux temps. Commençons par contrôler les codes envoyés par ta télécommande.
Donc,
Si elle n'y est pas déja
Télécharges la Librairie "servo.h"
Copie la dans le dossier Librairie de ton application Arduino
Tu dois ensuite impérativement refermer toutes les fenêtres Arduino pour que ta librairie soit prise en charge
Une fois que c'est fait,
Tu connectes ton récepteur sur la Pin numérique 11 (sur ton shield Nono les Pins numériques sont nommées Digital et effectivement les PWM sont des Pins numériques) (Les Pins Analogiques sont nommées Analog IN)
Tu laisse le Jumper Servo PWR en place
Tu alimente ta carte par le Jack (si tu as une autre forme d'alimentation, dit moi laquelle)
Tu copie le code que j'ai mis ci-dessous dans ta fenêtre code)
Tu compiles et tu envoi le code vers la carte
Tu ouvre la fenêtre "SerialMonitor"
Tu appuis Une fois sur chaque bouton de ta télécommande en la dirigeant vers le recepteur (dans le serialMonitor tu devrais avoir un nombre different pour chaque bouton)
Tu notes précieusement le code que tu obtiens pour chaque bouton
Tu me copies ces nombres dans ton prochain message
Le code de contrôle
#include <IRremote.h> int RECV_PIN = 11; IRrecv irrecv(RECV_PIN); decode_results results; void setup() { Serial.begin(9600); irrecv.enableIRIn(); // Start the receiver } void loop() { if (irrecv.decode(&results)) { Serial.println(results.value, HEX); irrecv.resume(); // Receive the next value } }
Si tu as des questions n’hésites pas.
Mais je dois me préparer pour mon réveillon donc nous avons 1 H qui peut être largement suffisant pour terminer. Sinon, nous finirons demain
Cdlt
Yves
#46
Posté 24 décembre 2011 - 03:07
Oui c'est une erreur de ma part désolée je suis dyslexique

Il s'agit effectivement du bornier en haut a gauche et il 's'agit bien de Vcc et pas Ccc
Comme tu as besoin de 5v tu met le cavalier (pour renier les deux Pins au dessus de l'indication PWR_Sel
Si ce Jumper est en place, tu n'es pas obligé de mettre une alimentation sur le Jack La logique sera alimenté en 5v et les Pins Numérique seront alimentées avec la tension appliquée aux bornier
ATTENTION, car la tension appliquée aux Pins marquées Vcc sera la tension appliquée au bornier.
Pour être plus clair
Si tu mets le Jumper la logique (et donc le µC seront alimenté en 5v Pins Vcc seront alimentées avec la tension appliquée au bornier
Si tu ne le mets pas le jumper, tu dois alimenter la logique (et donc le µC avec une tenssion de 5v Les Pin Vcc seront alimentées (et recevront) la tension appliquée au bornier.
Quoi q'il arrive, les Pin Analogique seront alimentées en 5v
#47
Posté 24 décembre 2011 - 03:14
Cette carte ne travaille pas comme les autres ATTENTION
Désolé mais j'ai relu la Doc de ton shield (Shield que je n'ai pas donc je ne connaissais pas ses spécificités et ne savais pas qu'il était différents des autres Shields
#49
Posté 24 décembre 2011 - 03:58
CH-
FFA25D
FFFFFFFF
CH
FF629D
FFFFFFFF
CH+
FFE21D
FFFFFFFF
<<
FF22DD
FFFFFFFF
>>
FF02FD
FFFFFFFF
>II
FFC23D
FFFFFFFF
-
FFE01F
FFFFFFFF
+
FFA857
FFFFFFFF
EQ
FF906F
FFFFFFFF
0
FF6897
FFFFFFFF
100+
FF9867
FFFFFFFF
200+
FFB04F
FFFFFFFF
1
FF30CF
FFFFFFFF
2
FF18E7
FFFFFFFF
3
FF7A85
FFFFFFFF
4
FF10EF
FFFFFFFF
5
FF38C7
FFFFFFFF
6
FF5AA5
FFFFFFFF
7
FF42BD
FFFFFFFF
8
FF4AB5
FFFFFFFF
9
FF52AD
FFFFFFFF
#50
Posté 24 décembre 2011 - 04:39
Tu vois que ce n'est pas si compliqué que ça

Malheureusement, je n'ai pas le temps de t'écrire le code aujourd'hui je dois prendre la route pour mon réveillon (Désolé)
MA femme n'est pas patiente et mon fils a hâte d'ouvrir ces cadeaux

Mais je te mets le code demain ça te vas ?
En attendant, tu peux juste me dire quelles sont les actions que tu souhaites déclencher et avec quel bouton.
en attendant, je te souhaites un joyeux Noël
Cdlt
Yves
#52
Posté 26 décembre 2011 - 10:13
j'ai fait mes essais de reglages de courses/vitesses pour mes 3 servos pour le pilote. J'ai d'ailleurs réouvert ma tête et enlevé le servo modifié a rotation continu qui avait un bruit désagréable et j'ai remplacé par un servo classique qui fait moins de bruit.
Là je vous mets le code, si jamais il y a des choses pas "propres" merci de me les indiquer, j'ai tatonné pour la boucle while de la bouche, mais maintenant ça marche et j'ai compris le principe
Donc si tu peux Yves, me dire (integrer le code dans le mien) pour mettre en route cette annimation avec le bouton play de la telecommande, merci
#include <Servo.h> Servo bras, tete, machoire; int pos1 = 0; int pos2 = 0; int pos3 = 0; void setup() { bras.attach(3); tete.attach(5); machoire.attach(6); } void loop() { for(pos1 = 0; pos1 < 50; pos1 += 1) { bras.write(pos1); delay(20); } delay(4000); //temps de pause entre 2 actions for(pos1 = 50; pos1>=1; pos1-=1) { bras.write(pos1); delay(20); } delay(1000); //temps de pause entre 2 actions for(pos1 = 0; pos1 < 100; pos1 += 1) { tete.write(pos2); delay(10); } for(pos2 = 100; pos2>=1; pos2-=1) { tete.write(pos2); delay(10); } int compteur = 0; while (compteur < 30) { for(pos3 = 0; pos3 < 45; pos3 += 1) { machoire.write(pos3); delay(5); } for(pos3 = 40; pos3>=1; pos3-=1) { machoire.write(pos3); delay(5); } compteur++; } while(1); }
#53
Posté 26 décembre 2011 - 11:59
Je suis désolé, mais je ne t'ai pas oublié
Je voulais te donner un code prêt à l'emploi et donc testé. Si rien ne vient me perturber aujourd'hui, il devrait être prêt ce soir.
Pour tes erreurs.
Il y a une redéfinition de void setup pas très compliqué à réparer
Par contre, le code de la télécommande que tu utilises correspond au code d'une télécommande free.
Si tu ne changes pas les codes boutons, cela ne marchra pas.
Dernière chose, je vois le code d'un Eternet shield"
Je ne savais pas que tu en avais un et a quoi te sert il ?
De toute façon, tu déclares du code de ce Shield sans déclarer sa Librairie.
Si quelqu'un d'autre que moi (Seb peut être, car il c'est pas mal cassé la tête avec les télécommandes et doit bien les connaitre)en plus il a le même module que toi donc pourrait t'aider.
Sinon, attends ce soir.
Encore désolé
Cdlt
Yves
#54
Posté 26 décembre 2011 - 12:17
Bonjour Yves,Dernière chose, je vois le code d'un Eternet shield"
Je ne savais pas que tu en avais un et a quoi te sert il ?
c'est où que l'on voit ça, le code d'un Eternet shield? mais c'est involontaire de ma part
je voulais commencer cet aprem mon annim, mais je dans ce cas je vais attendre d'avoir ton code, mais y'a pas le feu
#55
Posté 26 décembre 2011 - 08:22

J'zai mis to,n code sur la touche 0 Mais tu peux bien sur la mettre ou tu veux en changeant simplement le code de la touche
Comme nous travaillons avec un code en Hexadécimale, pour que le compileur sache que c'est de l'exa tu dois obligatoirement mettre avant le code 0x suivi du code
Idem, j'ai repris ton code avec tes delais
Je ne sais pas si cela fponctionne avec ton animation mais je le suppose
Idem, j'ai gardé tes 3 servos (brax, tete, machoir (sans e) dessolé pour la faute

Voila le code
#include <IRremote.h> // Déclaration de la Librairie IPemote.h #include <Servo.h> // Declaration de la Librairie Servo.h int RECV_PIN = 11; // declaration de la Pin 11 xpour le receveur IRrecv irrecv(RECV_PIN); decode_results results; Servo bras; // Declare un onjet Servo ce qui est assez pratique puiseque tu n'aura qu'a appeler ce cervo pour agir dessus Servo tete; // Voila, nous avons desormais 2 servos un que tu appellera par l'objet servo1 et l'autre que tu appellera par servo2 Servo machoir; int pos1 = 0; int pos2 = 0; int pos3 = 0; void setup() { bras.attach(3); tete.attach(5); machoir.attach(6); Serial.begin(9600); // Ouvre le Port serie irrecv.enableIRIn(); // Start the receiver } void loop() { if (irrecv.decode(&results)) { //Serial.println(results.value, HEX); if(results.value == 0xFF30CF) // Code pour la touche 0 { // démarrer le programme que t uveux /* bras.write(50); // Nous envoyons servo1 a 180 delay(4000); bras servo2.write(150); // Nous envoyons servo2 à 150 delay(100); // Nous attendons 100ms (mais a voir si c'est suffisant (ou si tu veux donner un temps d'attente avant la suite) */ for(pos1 = 0; pos1 < 50; pos1 += 1) { bras.write(pos1); delay(20); } delay(4000); //temps de pause entre 2 actions for(pos1 = 50; pos1>=1; pos1-=1) { bras.write(pos1); delay(20); } delay(1000); //temps de pause entre 2 actions for(pos1 = 0; pos1 < 100; pos1 += 1) { tete.write(pos2); delay(10); } for(pos2 = 100; pos2>=1; pos2-=1) { tete.write(pos2); delay(10); } int compteur = 0; while (compteur < 30) { for(pos3 = 0; pos3 < 45; pos3 += 1) { machoir.write(pos3); delay(5); } for(pos3 = 40; pos3>=1; pos3-=1) { machoir.write(pos3); delay(5); } //compteur++; } irrecv.resume(); // Receive the next value } } }
Si tu avais le moindre probleme dit le moi
il est possible que nous ayons besoin de faire des ajustements
#56
Posté 26 décembre 2011 - 08:28
mais en te relisant je me suis rendu compote que tu n'en utilisais qu'une pour démarrer l'animation
Si tu voulais changer cela et avoir plus d'une touche, nous devrons le faire autrement avec des cases et des constantes pour les valeurs
Le code est presque fait c'est l'avantage

#57
Posté 26 décembre 2011 - 09:18
Mon code est différent du tien , chacun a ça méthode pour programmé , enfin en tous cas ça été un grand plaisir d'avoir pu l'aidé.
Ça a pu me permettre de me remettre dans le bain , car ça fait un moment que je n'est pas fait du code.
En tout cas , continue comme ça VincentB , car ton projet et très intéressent , et je le suis de très près , j'ai hâte de voire la suite de ton avancé.
Et sur tout hésite pas a posé tes questions si tu rencontres des problèmes , on serra ravie de t'aider , et ça sera un plaisir.
#59
Posté 27 décembre 2011 - 12:01
Désolé si j'ai pu travaillé avec VincentB en MP mes c'est tes pour évité de polluer le sujet , voir son sujet.
Car j'ai fait pas mal de teste de code pour arrivé a un résulta concret.
Donc voici les code Jbot , que j'ai pu apporté à VincentB.
Ça, c'est un des premiers codes que je lui et fait avec un servo pour qu'il comprenne le fonctionnement avec la télécommande.
#include <Servo.h> #include <IRremote.h> //Servomoteur // Créer un objet pour contrôler un servomoteur Servo myservo; int pos = 0; // IR PIN module récepteur et variable lire le récepteur sur la broche 11 digitale int RECV_PIN = 11; IRrecv irrecv(RECV_PIN); decode_results results; //mode d'execution const int MODE_AUTO = 0; const int MODE_MANUEL = 1; int mode = MODE_MANUEL; const int MODE_STOP = 10; int sous_mode_manuel = MODE_STOP; void setup() { myservo.attach(3); Serial.begin(9600); // début de récepteur IR irrecv.enableIRIn(); } void loop() { // Signal IR reçu if (irrecv.decode(&results)) { // changement de mode par le bouton rouge de la télécommande (play/pause) //automatique ou manuel if(results.value==16761405) { if (mode == MODE_AUTO) mode = MODE_MANUEL; else mode = MODE_AUTO; } else if(mode == MODE_MANUEL) { // Stop (play/pause) bouton de la télécommande if(results.value==16761405) sous_mode_manuel = MODE_STOP; } // recevoir la prochaine valeur irrecv.resume(); // court délai d'attente pour répéter le signal IR // (L'empêcher d'arrêter si aucun signal reçu) delay(300); } // mode automatique touche ( play/pause ) if(mode == MODE_AUTO) { for(pos = 0; pos < 180; pos += 1) { myservo.write(pos); delay(15); } for(pos = 180; pos>=1; pos-=1) { myservo.write(pos); delay(15); } } else // Mode Manuel controle le robot avec la télécommande touche( play/pause ) { Serial.println(results.value, DEC); switch (sous_mode_manuel) { break; // Stop (play/pause) bouton de la télécommande case MODE_STOP: digitalWrite(pos,LOW); break; } } }
Après il a voulu que je compile son code avec la télécommande
Donc celui si:
#include <Servo.h> Servo bras, tete, machoire; int pos1 = 0; int pos2 = 0; int pos3 = 0; void setup() { bras.attach(3); tete.attach(5); machoire.attach(6); } void loop() { for(pos1 = 0; pos1 < 50; pos1 += 1) { bras.write(pos1); delay(20); } delay(4000); //temps de pause entre 2 actions for(pos1 = 50; pos1>=1; pos1-=1) { bras.write(pos1); delay(20); } delay(1000); //temps de pause entre 2 actions for(pos2 = 0; pos2 < 100; pos2 += 1) { tete.write(pos2); delay(10); } for(pos2 = 100; pos2>=1; pos2-=1) { tete.write(pos2); delay(10); } int compteur = 0; while (compteur < 6) { for(pos3 = 0; pos3 < 45; pos3 += 1) { machoire.write(pos3); delay(5); } for(pos3 = 40; pos3>=1; pos3-=1) { machoire.write(pos3); delay(5); } compteur++; } while(1); }
Et donc voici la compilation finale:
// Créer un objet de servo pour contrôler un servo #include <Servo.h> #include <IRremote.h> Servo bras, tete, machoire; int pos1 = 0; int pos2 = 0; int pos3 = 0; // IR PIN module récepteur et variable lire le récepteur sur la broche 11 digitale int RECV_PIN = 11; IRrecv irrecv(RECV_PIN); decode_results results; //mode d'execution const int MODE_AUTO = 0; const int MODE_MANUEL = 1; int mode = MODE_MANUEL; const int MODE_STOP = 10; int sous_mode_manuel = MODE_STOP; void setup() { bras.attach(3); tete.attach(5); machoire.attach(6); Serial.begin(9600); // début de récepteur IR irrecv.enableIRIn(); } void loop() { // Signal IR reçu if (irrecv.decode(&results)) { // changement de mode par le bouton de la télécommande (play/pause) //automatique ou manuel if(results.value==16761405) { if (mode == MODE_AUTO) mode = MODE_MANUEL; else mode = MODE_AUTO; } else if(mode == MODE_MANUEL) { // Stop (play/pause) bouton de la télécommande if(results.value==16761405) sous_mode_manuel = MODE_STOP; } // recevoir la prochaine valeur irrecv.resume(); // court délai d'attente pour répéter le signal IR // (L'empêcher d'arrêter si aucun signal reçu) delay(300); } // mode automatique touche ( play/pause ) if(mode == MODE_AUTO) { for(pos1 = 0; pos1 < 50; pos1 += 1) { bras.write(pos1); delay(20); } //temps de pause entre 2 actions delay(4000); for(pos1 = 50; pos1>=1; pos1-=1) { bras.write(pos1); delay(20); } //temps de pause entre 2 actions delay(1000); for(pos2 = 0; pos2 < 100; pos2 += 1) { tete.write(pos2); delay(10); } for(pos2 = 100; pos2>=1; pos2-=1) { tete.write(pos2); delay(10); } int compteur = 0; while (compteur < 6) { for(pos3 = 0; pos3 < 45; pos3 += 1) { machoire.write(pos3); delay(5); } for(pos3 = 40; pos3>=1; pos3-=1) { machoire.write(pos3); delay(5); } compteur++; } while(1); } else // Mode Manuel controle le robot avec la télécommande touche( play/pause ) { Serial.println(results.value, DEC); switch (sous_mode_manuel) { break; // Stop (play/pause) bouton de la télécommande case MODE_STOP: digitalWrite(pos1,LOW); digitalWrite(pos2,LOW); digitalWrite(pos3,LOW); break; } } }
édité:a 13h50 le 27/12/2011
#60
Posté 27 décembre 2011 - 12:55
J'avais laissé le code de Vincent mais pas de PB au contraire
Idem pour la touche comme quoi
Le tout est de savoir si cela conviens a Vincent ou pas ?
Je suppose que cela marche et que Vincent est contant ?
Il ne vas pas tarder à nous je dire.
Cdlt
Yves
Répondre à ce sujet

1 utilisateur(s) li(sen)t ce sujet
0 members, 1 guests, 0 anonymous users