Aller au contenu


Photo
- - - - -

Robot tête humanoid arduino


98 réponses à ce sujet

#41 Francky

Francky

    Membre chevronné

  • Membres
  • PipPipPipPip
  • 967 messages
  • Gender:Male

Posté 20 mai 2012 - 10:49

Ce n'est sans doute pas la chose la plus compliquée à faire si on n'a pas besoin de beaucoup de précision. La méthode que j'ai vaguement expliquée génèrera un signal carré. Mais je ne suis pas certain que la période fera précisément 20ms, ni que Ton et Toff seront respectés. (Simplement car il faut un certain temps à l'arduino pour gérer les instructions) Après, si on veut faire plus précis, il faut utiliser les interruptions timers et là, ça commence à devenir plus compliqué pour un débutant.

Je ne dis pas le contraire.

Mais j'espère que tu ne le prends pas mal, ce n'était pas le but.

Non du tout. Un forum est fait pour que chacun exprime son opinion ;)

#42 Esprit

Esprit

    Pilier du forum

  • Membres
  • PipPipPipPipPip
  • 1 503 messages
  • Gender:Male
  • Location:Belgique

Posté 20 mai 2012 - 11:13

Ne te tracasse pas Dydylan, on ne se lance pas de piques, on discute entre gens civilisés. Pas vrai Francky ? ;)

Je viens de lire quelque chose à propos de le bibliothèque Servo : "The Servo library supports up to 12 motors on most Arduino boards". Ce qui veut donc dire qu'on peut l'utiliser sur des broches qui ne supportent pas nativement le PWM et qu'il y a un PWM software intégré à la librairie. Du coup, mon code n'a plus d'intérêt ! :wacko:

Dans l'exemple Sweep, ils disent : "a maximum of eight servo objects can be created".
Ça se contredit. Qui a raison, qui a tort ? :huh: Mais il est quand même question d'utiliser des broches non-prévues pour le PWM tout de même.

Je vais tout de même faire quelques corrections sur ton code.

#include <Servo.h> // Juste "<" et pas "≤"

int pos = 0;

Servo myservos[4];

void setup()
{
  myservos[0].attach(9);     //ATTENTION : Un tableau de 4 "cases" commence à l'indice 0 ! voir "http://www.siteduzero.com/tutoriel-3-14015-les-tableaux.html" (par exemple)
  myservos[1].attach(10);
  myservos[2].attach(11);
  myservos[3].attach(12);// broche non PWM.
}

void loop()
{
  for(pos= 60; pos<120; pos++)
  {
    myservos[0].write(pos);
    delay(15);
  }

  for(pos= 120; pos>60; pos--)
  {
    myservos[0].write(pos);
    delay(15);
  }

  for(pos= 60; pos<120; pos++) //"<" et pas "≤"
  {
    myservos[1].write(pos);
    delay(15);
  }

  for(pos= 120; pos>60; pos--) //">" et ">="
  {
    myservo[1].write(pos);
    delay(15);
  }

  for(pos= 60; pos<120; pos++) //Même corrections dans les conditions et pareil pour la suite
  {
    myservos[2].write(pos);
    delay(15);
  }

  for(pos= 120; pos>60; pos--)
  {
    myservos[2].write(pos);
    delay(15);
  }

  for(pos= 60; pos<120; pos++)
  {
    myservos[3].write(pos);
    delay(15);
  }

  for(pos= 120; pos>60; pos--)
  {
    myservos[3].write(pos);
    delay(15);
  }
}

Essaye ce code. Si ça marche pour le servomoteur qui n'est pas sur une broche PWM, alors ça marchera sur les autres broches digitales également et tu n'auras pas besoin de programmer toi-même un PWM software ! :lol:

Et dernière chose : Pense à l'INDENTATION ! C'est important pour avoir un code bien lisible.

Esprit
*Rêve d'en caser un dans un robot*


#43 dydylan

dydylan

    Membre

  • Membres
  • 66 messages
  • Gender:Male

Posté 20 mai 2012 - 11:36

En gros même pas besoin d'essayer de créer un signal carré? :mellow:
définition de mon robot "un petit bout de vie dans une boite de conserve"

#44 Esprit

Esprit

    Pilier du forum

  • Membres
  • PipPipPipPipPip
  • 1 503 messages
  • Gender:Male
  • Location:Belgique

Posté 20 mai 2012 - 12:29

En gros, la bibliothèque "Servo.h" le fait apparemment. ^_^
Donc oui, plus besoin d'essayer de créer un signal carré à partir de rien. (Les servomoteurs seront quand même pilotés grâce à un signal carrés mais il sera généré grâce aux fonctions internes de la bibliothèque et pas par une fonction que tu aurais créé).

Esprit
*Rêve d'en caser un dans un robot*


#45 dydylan

dydylan

    Membre

  • Membres
  • 66 messages
  • Gender:Male

Posté 20 mai 2012 - 12:37

OK cool!
j'essayerai ça tout à l'heure et je vous tien au courant!
:)
définition de mon robot "un petit bout de vie dans une boite de conserve"

#46 Hexa Emails

Hexa Emails

    Membre passionné

  • Membres
  • PipPipPip
  • 439 messages
  • Gender:Male

Posté 20 mai 2012 - 12:42

je le répète encore: un servo ne se controle pas par PWM.

L'exemple "Sweep" date un peu, en effet une carte arduino basée sur un ATmega328 peu gérer 12 servos (testé et approuvé). Et la librairie permet de se servir de n'importe quel pin (y compris celles qui peuvent servir d'entrées analogiques)

#47 Francky

Francky

    Membre chevronné

  • Membres
  • PipPipPipPip
  • 967 messages
  • Gender:Male

Posté 20 mai 2012 - 12:50

Ne te tracasse pas Dydylan, on ne se lance pas de piques, on discute entre gens civilisés. Pas vrai Francky ?

Oui ! :)

Je viens de lire quelque chose à propos de le bibliothèque Servo : "The Servo library supports up to 12 motors on most Arduino boards". Ce qui veut donc dire qu'on peut l'utiliser sur des broches qui ne supportent pas nativement le PWM et qu'il y a un PWM software intégré à la librairie. Du coup, mon code n'a plus d'intérêt !

Intéressante ta découverte :o


Par contre @MrAlexis44600 :

je le répète encore: un servo ne se controle pas par PWM.

Un servo se contrôle à partir d'un signal carré et il faut (pour changer de sens) changer le rapport cyclique. Je me trompe ? (si c'est le cas merci de me le dire, ça voudrait dire que j'ai rien compris "^^). Si c'est bien le cas, il faut faire une Modulation de Largeur d'Impulsion, autrement dit une PWM.

#48 Esprit

Esprit

    Pilier du forum

  • Membres
  • PipPipPipPipPip
  • 1 503 messages
  • Gender:Male
  • Location:Belgique

Posté 20 mai 2012 - 01:48

Dire qu'un servomoteur se pilote avec un PWM n'est pas faux. Cependant, c'est un PWM un peu particulier, on est d'accord.
Nous devrions dire : "Signal-code modulated signal (Signal modulé en code d'impulsion )" (voir Fribotte)

PWM :
Image IPB

Signal modulé en code d'impulsion :
Image IPB


C'est un PWM avec un Toff < 20 ms et un Ton compris entre 1 et 2 ms.
Mais ça reste un PWM, un peu particulier peut-être parce qu'on va avoir un ton qui sera toujours entre 5 et 10% de la période.
(Par contre, j'ai dis des conneries précédemment... Mon code pour générer un signal de commande est foireux... :rolleyes: ) Code corrigé.

Esprit
*Rêve d'en caser un dans un robot*


#49 dydylan

dydylan

    Membre

  • Membres
  • 66 messages
  • Gender:Male

Posté 20 mai 2012 - 02:00

Oui mais du coup, ça sert à rien d'utilisé ton code non?
définition de mon robot "un petit bout de vie dans une boite de conserve"

#50 Francky

Francky

    Membre chevronné

  • Membres
  • PipPipPipPip
  • 967 messages
  • Gender:Male

Posté 20 mai 2012 - 02:18

Merci pour les infos Esprit ça me sera utile ! :)

@dydylan :

Oui mais du coup, ça sert à rien d'utilisé ton code non?

Apparemment ta bibliothèque fait des pwm sur des pins normales donc tu ne devrais pas à avoir à t'en servir. Par contre, tu aurait pu l'utiliser en le faisant fonctionner une fois.

#51 dydylan

dydylan

    Membre

  • Membres
  • 66 messages
  • Gender:Male

Posté 20 mai 2012 - 02:24

Merci pour les infos Esprit ça me sera utile ! :)

@dydylan :

Apparemment ta bibliothèque fait des pwm sur des pins normales donc tu ne devrais pas à avoir à t'en servir. Par contre, tu aurait pu l'utiliser en le faisant fonctionner une fois.

oui j'essayerai plus tard! ^^
pour le moment j'ai brancher le fil jaune de mon servos sur le pin 12 et deviné quoi?
Ca marche!
définition de mon robot "un petit bout de vie dans une boite de conserve"

#52 Francky

Francky

    Membre chevronné

  • Membres
  • PipPipPipPip
  • 967 messages
  • Gender:Male

Posté 21 mai 2012 - 06:43

pour le moment j'ai brancher le fil jaune de mon servos sur le pin 12 et deviné quoi?
Ca marche!

:)

#53 dydylan

dydylan

    Membre

  • Membres
  • 66 messages
  • Gender:Male

Posté 21 mai 2012 - 06:48

Et pour la partie son j'ai trouvé sur ce site:site ce code:
# Include <FatReader.h>
# Include <SdReader.h>
# Include <avr/pgmspace.h>
# Include "WaveUtil.h" 
# include "WaveHC.h"

SdReader carte;     / / Cet objet contient les informations de la carte 
vol FatVolume;     / / Ceci est l'information pour la partition sur la carte 
racine FatReader;    / / Ceci est l'information pour le système de fichiers sur la carte

dirLevel uint8_t; / / niveau de retrait pour le fichier et les noms de dir (pour prettyPrinting) 
dirBuf dir_t;      / / buffer pour le répertoire lit

WaveHC vague;       / / Il s'agit de la seule vague (audio) objet, puisque nous allons jouer qu'un seul à un moment

/ Définitions / fonction (nous les définissons ici, mais le code est ci-dessous) 
nulle LSR (FatReader & D);
 nulle jeu (FatReader & dir);

vide  de configuration () {
   série . commencer (9600);            / / Mise en place de bibliothèque série à 9600 bps pour le débogage
  
  putstring_nl ( "test \ nWave!" );   / / dire nous nous sommes réveillés!
  
  putstring ( "Free RAM:" );        / / Ceci peut faciliter le débogage, à court de RAM est mauvaise 
  série . println (FreeRAM ());  
 
  / / Définit les broches de sortie pour le contrôle du CAD. Cette repères sont définis dans la bibliothèque 
  pinMode (2, SORTIE );
   pinMode (3, SORTIE );
   pinMode (4, SORTIE );
   pinMode (5, SORTIE );
  
  / / If (! Card.init (true)) {/ / lecture avec 4 MHz spi si 8MHz ne fonctionne pas pour vous 
  , si (! card.init ()) {          / / jeu avec 8 MHz spi (par défaut plus rapide!)   
    putstring_nl ( "Échec de l'initialisation de carte.!" );   / / Quelque chose s'est mal passé, permet d'imprimer les raisons pour lesquelles
    sdErrorCheck ();
    alors (1);                             / / puis «arrêt» - ne rien faire!
  }
  
  / / Enable optimiser lire - Certaines cartes peuvent timeout. Désactiver si vous rencontrez des problèmes 
  card.partialBlockRead ( vrai );
  
  / / Maintenant nous allons regarder pour une partition FAT!
  partie uint8_t;
  pour (une partie = 0; partie <5; partie + +) {      / / nous avons jusqu'à 5 emplacements pour regarder dans 
    le cas (vol.init (carte, qui fait partie))
      break;                              / / nous avons trouvé un, permet de renflouer
  }
  si (partie == 5) {                        / / si nous avons fini par ne pas trouver un: ( 
    putstring_nl ( "Pas de partition FAT valide!" );
    sdErrorCheck ();       / / Quelque chose s'est mal passé, permet d'imprimer les raisons pour lesquelles 
    tout (1);                             / / puis «arrêt» - ne rien faire!
  }
  
  / / Permet de dire à l'utilisateur de ce nous avons trouvé 
  putstring ( «Utilisation de la partition" );
   série . d'impression (partie, décembre );
  putstring ( ", le type est FAT" );
   série . println (vol.fatType (), décembre );      / / FAT16 ou FAT32?
  
  / / Essayez d'ouvrir le répertoire racine 
  si (! root.openRoot (vol)) {
    putstring_nl ( "! Impossible d'ouvrir le répertoire racine" ); / / Quelque chose s'est mal passé, 
    alors que (1);                              / / puis «arrêt» - ne rien faire!
  }
  
  / / Ouf! Nous avons passé les parties dures. 
  putstring_nl ( "Fichiers trouvés:" );
  dirLevel = 0;
  / / Imprimer tous les fichiers dans tous les répertoires.
  LSR (racine);
}

/ / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / LOOP 
vide  boucle () {
  root.rewind ();
  jouer (racine);
}

/ / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / AIDANTS

/ / Cette fonction pratique vous renvoyer le nombre d'octets actuellement libres dans la mémoire RAM, idéal pour le débogage!    
int FreeRAM ( vide )
{
  extern int   __bss_end;
  extern int   * __brkval; 
   int free_memory; 
   si (( int ) __brkval == 0) {
    free_memory = (( int ) & free_memory) - (( int ) & __bss_end);
  }
  d'autre {
    free_memory = (( int ) & free_memory) - (( int ) __brkval);
  }
  retourner free_memory;
} 

/ * 
* message d'erreur d'impression et de halte si une carte SD I / O error, grande pour le débogage! 
* / 
vide sdErrorCheck ( vide )
{
  si (card.errorCode ()!) retour ;
  putstring ( "\ n \ RSD I / O error:" );
   série . d'impression (card.errorCode (), HEX );
  putstring ( "," );
   série . println (card.errorData (), HEX );
   tandis que (1);
}
/ * 
print * champ Nom dir_t. La sortie est au format 8.3, si semblable à Sound.wav ou nom_fichier.dat 
* / 
vide printName (dir_t & dir)
{
  pour (uint8_t i = 0; i <11; i + +) {      / / format 8.3 dispose de 8 +3 = 11 lettres dans l' 
    , si (dir.name [i] == '' )
        continuer;          / / n'est plus imprimer les espaces dans le nom 
    , si (i == 8) 
         de série . d'impression ( '.' );            / / après la lettre du 8, placer un point 
    de série . d'impression (dir.name [i]);       / / imprimer le n-ième chiffre
  }
  si (DIR_IS_SUBDIR (dir)) 
     de série . d'impression ( '/' );        / / répertoires obtenir un / à la fin
}
/ * 
liste * de manière récursive - débordement de pile possible que si les sous-répertoires imbriqués trop 
* / 
vide LSR (FatReader & D)
{
  r int8_t;                      / / indique le niveau de récursivité
  
  tandis que ((r = d.readDir (dirBuf))> 0) {      / / lire le fichier suivant dans le répertoire 
    / / sous-répertoires saut. et .. 
    si (dirBuf.name [0] == '.' )
      continuer;
    
    pour (uint8_t i = 0; i <dirLevel; i + +) 
       de série . d'impression ( ' );         / / c'est pour prettyPrinting, mis des espaces à l'avant 
    printName (dirBuf);           / / imprimer le nom du fichier que nous venons de trouver 
    de série . println ();            / / et une nouvelle ligne
    
    si (DIR_IS_SUBDIR (dirBuf)) {    / / Nous allons recurse sur n'importe quel direcory 
      s FatReader;                  / / créer un objet nouveau répertoire pour stocker les informations 
      dirLevel + = 2;                / / tiret 2 places pour des tirages futurs 
      si (s.open (vol, dirBuf))
        LSR (s);                     ! / / lister tous les fichiers dans ce répertoire maintenant 
      dirLevel - = 2;                 / / supprimer l'indentation supplémentaire
    }
  }
  sdErrorCheck ();                   / / sommes-nous doign OK?
}
/ * 
* jouer de manière récursive - débordement de pile possible que si les sous-répertoires imbriqués trop 
* / 
vide jeu (FatReader & dir)
{
  Fichier FatReader;
  tandis que (dir.readDir (dirBuf)> 0) {     / / lire tous les fichiers dans le répertoire un à la fois 
    / / sauter. et .. répertoires 
    si (dirBuf.name [0] == '.' )
      continuer;
    
    Série . println ();             / / efface une nouvelle ligne
    
    pour (uint8_t i = 0; i <dirLevel; i + +) 
        de série . d'impression ( ' );        / / c'est pour prettyPrinting, mis des espaces à l'avant

    si {(File.Open (vol, dirBuf)!)        / / ouvrir le fichier dans le répertoire 
      de série . println ( "File.Open a échoué" );   / / quelque chose n'allait pas: ( 
      tout en (1);                             / / halt
    }
    
    si (file.isDir ()) {                     / / vérifier si nous avons ouvert un nouveau répertoire 
      putstring ( "Subdir:" );
      printName (dirBuf);
      dirLevel + = 2;                        / / ajouter d'autres espaces 
      / Les Dossiers / jeux en sous-répertoire 
      de jeu (fichier);                          / / récursive!
      dirLevel - = 2;    
    }
    d'autre {
       / / Ah! nous avons trouvé un fichier qui n'est pas un répertoire 
      putstring ( "Lecture en cours» ); printName (dirBuf);        / / l'imprimer 
      si (! wave.create (fichier)) {             / / Figure dehors, est-ce un bon WAV? 
        putstring ( " Pas valable WAV " );      / / ok, il ignorer 
      } autre {
         série . println ();                   ! / / Hourra il EST un bon WAV 
        wave.play ();                        / / faire du bruit!
       
        tandis que (wave.isplaying) {            / / playing se produit des interruptions, afin que nous imprimer des points en temps réel 
          putstring ( "." );
           retard (100);
        }
        sdErrorCheck ();                     ? / / tout est OK 
/ / if (wave.errors) Serial.println (wave.errors) / / vague des erreurs de décodage
      }
    }
  }
}



alors peut il être utilisé directement? donc il vas lire tous les fichiers de la carte?
la bibliothèque qu'est ce que je dois faire après l'avoir téléchargé ou la déplacer?
définition de mon robot "un petit bout de vie dans une boite de conserve"

#54 seb03000

seb03000

    @pump_upp - best crypto pumps on telegram !

  • Membres
  • PipPipPipPipPip
  • 1 193 messages
  • Location:https://t.me/pump_upp

Posté 21 mai 2012 - 10:41

Pour répondre a ta question /

la bibliothèque qu'est ce que je dois faire après l'avoir téléchargé ou la déplacer?


La bibliothèque , tu vas dans ton logiciel Arduino , tu vas dans librairies et tu colle ton fichier que tu a télécharger ,

dans la librairie.

#55 Esprit

Esprit

    Pilier du forum

  • Membres
  • PipPipPipPipPip
  • 1 503 messages
  • Gender:Male
  • Location:Belgique

Posté 21 mai 2012 - 11:09

Il ne faut pas non plus oublier ton ami Google ni le fait qu'il y a déjà beaucoup de tutoriels sur ce site.
(Par exemple : bibliothèque arduino)

Dans ce tutoriel, il est mis :

Installer la bibliothèque

Dans le dossier du logiciel Arduino se trouve un sous dossier nommé "libraries". Chaque dossier à l'intérieur de libraries représente une bibliothèque. Pour ajouter la nôtre à celles officielles, on crée un dossier au nom de notre bibliothèque. Dans notre exemple, le dossier c'est Morse et on y met les deux fichiers qu'on vient de créer soit Morse.h et Morse.cpp.


Bref, tu télécharges le fichier "wavehc20110919.zip" qui est ici. Tu le décompresses (avec Winzip ou équivalent). Et tu copies le dossier "WaveHC" dans le dossier "libraries" (qui est dans ton dossier "arduino"). Tu redémarres ensuite l'IDE (le programme arduino) et tu pourrais ensuite l'utiliser dans ton code.

Je n'ai pas le temps d'analyser tout et te dire si le code que tu as donné est directement utilisable ou non. Faut essayer de bien le comprendre, de lire petit à petit. Et puis il faut tester. ^_^

Esprit
*Rêve d'en caser un dans un robot*


#56 dydylan

dydylan

    Membre

  • Membres
  • 66 messages
  • Gender:Male

Posté 21 mai 2012 - 06:07

Hey, comment ça va?
j'ai commencer un buste pour mon robot avec des formes aériennes!

et j'ai trouvé une main pas mal?

Image(s) jointe(s)

  • fingers1.jpg

définition de mon robot "un petit bout de vie dans une boite de conserve"

#57 dydylan

dydylan

    Membre

  • Membres
  • 66 messages
  • Gender:Male

Posté 28 mai 2012 - 12:29

Hello je suis de retour!!

je suis en ce moment en train d'éplucher le code du son...
mais j'ai décidé de me pencher encore plus en détail sur le déplacement, je m'explique j'ai un budget limité... 50€ donc je pense que mon robot de ne sera pas bipède, j'aimerais bien mais bon... est ce possible?...

si ça ne l'ai pas mon robot roulera, comme mon robot est assez grand(1 mettre 20 ou 50 et je ne sais pas combien il pèse) ben quel moteurs utilisé?

merci pour vos réponses et commentaire très appréciés! :rolleyes:
définition de mon robot "un petit bout de vie dans une boite de conserve"

#58 Esprit

Esprit

    Pilier du forum

  • Membres
  • PipPipPipPipPip
  • 1 503 messages
  • Gender:Male
  • Location:Belgique

Posté 28 mai 2012 - 02:02

Budget insuffisant.

Ça pèse lourd un robot d'un mètre. Il te faudra des gros moteurs et du coup, ça se paie.
Sans parler du matériel pour le construire et des toutes les fournitures en plus (câbles, contrôleurs moteurs, ...)

Et pour la marche bipède, des labos du monde entiers y travaillent. C'est du costaud et ça s'improvise pas. Rien à voir avec la compréhension d'une librairie pour jouer des mp3. Donc pas une bonne idée.


Et si tu n'as que 50€ à lui consacrer, oublie. Ou attends et économise.

Esprit
*Rêve d'en caser un dans un robot*


#59 dydylan

dydylan

    Membre

  • Membres
  • 66 messages
  • Gender:Male

Posté 29 mai 2012 - 05:40

et a ton avis, c'est quoi le prix et le nombres de moteur pour un robot qui roule?
définition de mon robot "un petit bout de vie dans une boite de conserve"

#60 julkien

julkien

    Pilier du forum

  • Membres
  • PipPipPipPipPip
  • 1 032 messages
  • Gender:Male

Posté 29 mai 2012 - 06:03

Les moteur de visseuse 15€ sont bon marché mais les driver sont pas donné 100€



Répondre à ce sujet



  


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

0 members, 0 guests, 0 anonymous users