Aller au contenu


Photo
- - - - -

Robot tête humanoid arduino


98 réponses à ce sujet

#21 Francky

Francky

    Membre chevronné

  • Membres
  • PipPipPipPip
  • 967 messages
  • Gender:Male

Posté 18 mai 2012 - 01:25

alors je me demandais si je pouvais brancher des servos même sur les broche PWM, 3,5, 10 même si elle sont utilisé car sinon je ne pourrais brancher que 3 servomoteur! ce qui est idiot puisque j'ai 8 servomoteur!

Non tu ne peux pas utiliser 2 sorties pwm pour 2 trucs différents. Au pire, il faut que tu essaies de créer un signal pwm à partir d'une sortie classique (avec des tempos).
  • Keganmi aime ceci

#22 dydylan

dydylan

    Membre

  • Membres
  • 66 messages
  • Gender:Male

Posté 18 mai 2012 - 03:53

Non tu ne peux pas utiliser 2 sorties pwm pour 2 trucs différents. Au pire, il faut que tu essaies de créer un signal pwm à partir d'une sortie classique (avec des tempos).

D'accord mais je ne comprend pas ce que tu m'as dit avant, sur internet il n'y aurait pas un tuto ou un site qui traite de se sujet?
définition de mon robot "un petit bout de vie dans une boite de conserve"

#23 Francky

Francky

    Membre chevronné

  • Membres
  • PipPipPipPip
  • 967 messages
  • Gender:Male

Posté 18 mai 2012 - 04:07

D'accord mais je ne comprend pas ce que tu m'as dit avant, sur internet il n'y aurait pas un tuto ou un site qui traite de se sujet?

Je vais essayer d'être un peu plus clair. Un signal PWM (ou MLI) est un signal carré périodique. Il a un temps pendant lequel il est à l'état haut (ton) et un temps pendant lequel il est à l'état bas (toff). La somme de ces deux temps constituent la période T. Tu peux calculer ce que l'on appelle le rapport cyclique alpha.
alpha = ton / (ton+toff) = ton /T
Tu peux donc créer ce type de signaux à partir d'une sortie classique de ton arduino.

Après des cours tu peux en trouver des tas sur internet. Par contre désolé je n'ai pas une unique référence.

#24 dydylan

dydylan

    Membre

  • Membres
  • 66 messages
  • Gender:Male

Posté 18 mai 2012 - 04:10

En fait, j'imagine qu'il faut programmer tous ça?
déjà que je débute....
définition de mon robot "un petit bout de vie dans une boite de conserve"

#25 Francky

Francky

    Membre chevronné

  • Membres
  • PipPipPipPip
  • 967 messages
  • Gender:Male

Posté 18 mai 2012 - 04:40

D'accord mais je ne comprend pas ce que tu m'as dit avant, sur internet il n'y aurait pas un tuto ou un site qui traite de se sujet?

Oui

déjà que je débute....

Te décourages pas ! C'est le métier qui rentre ;)


Surtout que pour une sortie pwm classique il faut aussi coder ^^ Et puis, pour ce que je te dis de faire, le code n'est pas très compliqué. Il suffit de faire :

sortie à 1
tempo ( = ton)
sortie à 0
tempo (= toff)
on répète tant qu'on en a envie (par exemple en se référant à la valeur d'une variable).

#26 dydylan

dydylan

    Membre

  • Membres
  • 66 messages
  • Gender:Male

Posté 18 mai 2012 - 05:03

heu... pourquoi le répéter? :blush:
et si Ton et Toff sont des variables quel sont leurs valeurs? j'imagine que toff est à 0?
AH oui est combien de temps doit il y avoir entre ton et toff?
:mellow:
et comment choisir la broche?
définition de mon robot "un petit bout de vie dans une boite de conserve"

#27 Francky

Francky

    Membre chevronné

  • Membres
  • PipPipPipPip
  • 967 messages
  • Gender:Male

Posté 18 mai 2012 - 05:59

heu... pourquoi le répéter?

Pour qu'il ait la durée que tu souhaites.

et si Ton et Toff sont des variables quel sont leurs valeurs?

Tout dépend du rapport cyclique que tu souhaites et de la période à laquelle tu souhaites travailler. Ces valeurs dépendront des modules que tu souhaites gérer. Un exemple concret : imaginons qu'un servomoteur ait besoin d'une impulsion haute pendant 10ms avec une fréquence de 20hz (je dis n'importe quoi alors ne reprends pas ces valeurs !). Dans ce cas, tu auras : ton = 10ms ; T = 1/f = 0.05s. D'où toff = T - ton = 50 - 10 = 40 ms. Et tu auras un rapport cyclique alpha = 0.2.

j'imagine que toff est à 0?

Tout dépend de alpha. Par exemple, si tu souhaites gérer la vitesse d'un moteur à courant continu avec un L293D (en appliquant sur l'entrée du L293D ta PWM) et que tu souhaites avoir la vitesse maximale, tu voudras alpha = 1. Dans ce cas, tu prendras toff = 0.

et comment choisir la broche?

Aucune importance, il faut juste qu'elle puisse être configurée en sortie (après je ne sais pas s'il y a des pattes avec des limites différentes de fréquence sur aduino ou pas).

#28 dydylan

dydylan

    Membre

  • Membres
  • 66 messages
  • Gender:Male

Posté 18 mai 2012 - 06:01

en Fait c'est quoi le rapport cyclique, doit on le mettre dans notre programme?
et heu donc est ce que je peux mettre

sortie à 1
tempo ( = ton)
sortie à 0
tempo (= toff)

dans une bouche infini?

Merci à tous ce qui m'aide, c'est super!
définition de mon robot "un petit bout de vie dans une boite de conserve"

#29 Francky

Francky

    Membre chevronné

  • Membres
  • PipPipPipPip
  • 967 messages
  • Gender:Male

Posté 19 mai 2012 - 10:11

en Fait c'est quoi le rapport cyclique, doit on le mettre dans notre programme?

Le rapport cyclique sert à faire les calculs. Avec la méthode que je t'ai donné il ne rentre pas dans le code. Par contre, je me demande si ça n'intervient pas dans le programme pour les sorties PWM (à vérifier).

et heu donc est ce que je peux mettre
Citation
sortie à 1
tempo ( = ton)
sortie à 0
tempo (= toff)

dans une bouche infini?

Tu peux mais je vois pas trop l'intérêt... Mets le plutôt dans une boucle du type if else.

#30 dydylan

dydylan

    Membre

  • Membres
  • 66 messages
  • Gender:Male

Posté 19 mai 2012 - 10:50

Le rapport cyclique sert à faire les calculs. Avec la méthode que je t'ai donné il ne rentre pas dans le code. Par contre, je me demande si ça n'intervient pas dans le programme pour les sorties PWM (à vérifier).


Tu peux mais je vois pas trop l'intérêt... Mets le plutôt dans une boucle du type if else.

d'accord donc pour résumé dans mon programme, il y aura:
des variables
ton, toff, et un tempo.
une boucle if else qui fera tourner en continue cette opération:

sortie à 1
tempo ( = ton)
sortie à 0
tempo (= toff)


est ce bien cela?

Merci beaucoup Francky tu m'aide vraiment beaucoup ;)
définition de mon robot "un petit bout de vie dans une boite de conserve"

#31 Francky

Francky

    Membre chevronné

  • Membres
  • PipPipPipPip
  • 967 messages
  • Gender:Male

Posté 19 mai 2012 - 12:57

ton, toff, et un tempo.

ton et toff sont des temporisations.

une boucle if else qui fera tourner en continue cette opération:

Pas en continue ou alors utilises une boucle infinie, ça dépend de ce que tu veux faire. Je te disais de mettre une if else pour dire : fais tourner le moteur jusqu'à tel évènement.

Merci beaucoup Francky tu m'aide vraiment beaucoup

Attends de voir si ce que je te dis fonctionne avant de me remercier xD

#32 dydylan

dydylan

    Membre

  • Membres
  • 66 messages
  • Gender:Male

Posté 19 mai 2012 - 01:03

Oui, mais alors je code ça comment?
:blink:
définition de mon robot "un petit bout de vie dans une boite de conserve"

#33 Esprit

Esprit

    Pilier du forum

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

Posté 19 mai 2012 - 05:02

Ils sont comiques les gens qui t'orientent vers du PWM software dès le départ... :rolleyes:
Disons qu'on commence généralement pas par ça.

Je ne l'ai jamais fait (j'ai une arduino Mega...) mais si j'avais à le faire, je pense que je créerais une fonction qui s'en occupe.
Il faudra déclarer une broche digitale en sortie.

/*Déclaration de la broche digitale numéro X en sortie*/
int nomBroche = 12;

void setup() 
{                
  /*La broche est une sortie*/
  pinMode(nomBroche, OUTPUT);    
}

void loop() 
{
  /*Utilisation de la fonction PWM software*/
  pwm(10); //génère un signal carré avec une période de 20ms, ton = 10ms et toff = 10ms
}

/*Fonction PWM software*/
void pwm(int ton)
{
  if(ton < 1000)         /*Rajout pour éviter de dépasser les temps admissibles pour ton */
    ton = 1000;
  else if(ton > 2000)
    ton = 2000;

  for(short i=0, i<5, i++)
  {
    digitalWrite(nomBroche, HIGH);
    delayMicroseconds(ton);         /*Pour augmenter la précision*/
    digitalWrite(nomBroche, LOW);
    delay(20);
  }
}

C'est un exemple vite fait, que je n'ai pas le temps de tester pour le moment. Mais ça me plairait d'essayer ça un peu plus tard tient, juste pour le fun. :rolleyes: Ça ne doit pas être extrèmement précis (rien qu'à cause du temps d'exécution des instructions). Il doit y avoir moyen de faire ça mieux, avec des interruptions par exemple. Mais dans ton cas, ça devrait suffire. Il faut évidemment adapter le code à ton utilisation!

Un peu de lecture sur le pwm : (si tu ne connais pas du tout l'anglais, mets-toi y au plus vite, c'est important dans le monde technique. ;) )
Arduino - PWM (anglais)
t-o-f - PWM (français)


Autre chose. Ton montage fait un peu peur... :mellow:
Tu ne devrais pas utiliser des câbles multi-brins sur une arduino, en les entourant autour d'un fil mono-brin comme tu le fais... C'est pas terrible et tu risque d'avoir des court-circuits assez rapidemment. Tu ferais mieux d'essayer de te procurer des câbles dans ce genre là : Jumper Cables. C'est encore mieux si tu sais avoir des câbles avec des bouts "carrés" comme ceux-ci sur ebay.

Et aussi, si tu veux alimenter 8 servomoteurs en même temps, ton arduino risque d'avoir un peu de mal. Tu peux les faire bouger un par un (et ça ira), ou alors ajouter une alimentation externe.


Bon courage et bonne continuation!

Modifié par Esprit, 20 mai 2012 - 01:52 .

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


#34 dydylan

dydylan

    Membre

  • Membres
  • 66 messages
  • Gender:Male

Posté 19 mai 2012 - 05:50

Merci Esprit, par contre, j'habite dans la municipalité de l'ardèche <_< autrement dit pas facile de trouver ce genre de choses, je sais pas ça existe pas dans les magazins Mr Bricolage?

Ah et heu, dans mon code je met ce que tu as mis, puis le code normal pour faire tourner un servomoteur?
définition de mon robot "un petit bout de vie dans une boite de conserve"

#35 Esprit

Esprit

    Pilier du forum

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

Posté 20 mai 2012 - 07:42

Trouver du câble mono-brin n'est pas le plus compliqué. Il y en a dans pas mal d'appareils. (Ne démonte rien sans l'accord de tes parents...)
Tu peux par exemple ouvrir un câble de téléphone et récupérer tout le câble dont tu as besoin. (Photo) Sinon, n'hésite pas à récupérer tous les appareils que tu trouves. Il y a du câble dans tout et on trouve très souvent des petits moteurs qui peuvent être utiles (dans les lecteurs CD, lecteurs disquettes, imprimantes, scanners, ...). Et sinon, acheter sur ebay permet d'être livré chez sois. (Mais faut 18 ans pour y acheter...)

Pour le code... Fais une copie de ton code ici et je te montrerai où l'insérer.

Mais je ne pourrais que te conseiller de lire et d'essayer d'appliquer un maximum de tutoriels sur l'arduino.
-Arduino.cc/fr/
-T-o-f wiki - Arduino (et aussi T-o-f wiki - Électronique)
-Mon Club Elec

C'est comme tout, pour bien comprendre ce qu'on fait il faut quand même passer par une phase d'apprentissage et de lecture. ;)

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


#36 Francky

Francky

    Membre chevronné

  • Membres
  • PipPipPipPip
  • 967 messages
  • Gender:Male

Posté 20 mai 2012 - 08:44

Ils sont comiques les gens qui t'orientent vers du PWM software dès le départ...

Je ne pense pas que ce soit la chose qui soit la plus compliquée à faire. De toutes manières c'était soit lui dire de faire ça, soit de lui dire d'abandonner son projet pour en avoir un avec moins de servomoteurs...
Et sinon, oui je suis comique ! :lol:

#37 dydylan

dydylan

    Membre

  • Membres
  • 66 messages
  • Gender:Male

Posté 20 mai 2012 - 08:50

Oui bon, maintenant que grâce a vous j'ai la solution, je vais pouvoir utilisé tous mes servos, et programmer tous ça après avoir fini les branchements!

Mon code:
#include ≤Servo.h>


int pos = 0;

Servo myservos[4];

void setup()
{
myservos[1].attach(9);
myservos[2].attach(10);
myservos[3].attach(11);
myservos[4].attach(12);// broche non PWM.
}

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

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

for(pos= 60; pos ≤120; pos++)
{
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);
}

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

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

voilà pour le code, par contre il se peut qu'il y est des erreur de je n'ai pas le code devant les yeux... -_-

Merci à ceux qui m'ont aidés! :)
définition de mon robot "un petit bout de vie dans une boite de conserve"

#38 Francky

Francky

    Membre chevronné

  • Membres
  • PipPipPipPip
  • 967 messages
  • Gender:Male

Posté 20 mai 2012 - 08:59

Bon courage ! Et fais nous part de tes avancées/problèmes ;)

#39 Esprit

Esprit

    Pilier du forum

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

Posté 20 mai 2012 - 09:26

Je ne pense pas que ce soit la chose qui soit la plus compliquée à faire. De toutes manières c'était soit lui dire de faire ça, soit de lui dire d'abandonner son projet pour en avoir un avec moins de servomoteurs...
Et sinon, oui je suis comique ! :lol:


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.

Donc oui, je trouve ça comique d'orienter un jeune de 13 ans qui débute vers cette solution. Maintenant, c'est clair qu'il n'y a pas mille autres solutions. C'est soit ça, soit l'achat d'une arduino Mega (ou autre...). Au niveau simplicité il y a pas photo, c'est plus facile de travailler avec du matériel adapté.

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

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


#40 dydylan

dydylan

    Membre

  • Membres
  • 66 messages
  • Gender:Male

Posté 20 mai 2012 - 09:38

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.

Donc oui, je trouve ça comique d'orienter un jeune de 13 ans qui débute vers cette solution. Maintenant, c'est clair qu'il n'y a pas mille autres solutions. C'est soit ça, soit l'achat d'une arduino Mega (ou autre...). Au niveau simplicité il y a pas photo, c'est plus facile de travailler avec du matériel adapté.

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


ok c'est cool bon vous arrêtez de vous lancer des pics ou je ce pas quoi!
Non plus sérieusement mon code est il bon? et où faut il mettre ton code, Esprit? :)
définition de mon robot "un petit bout de vie dans une boite de conserve"



Répondre à ce sujet



  


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

0 members, 0 guests, 0 anonymous users