Pages: 1 [2] 3   Go Down
Author Topic: utiliser un atmega sans arduino  (Read 4465 times)
0 Members and 1 Guest are viewing this topic.
0
Offline Offline
Jr. Member
**
Karma: 0
Posts: 90
Arduino rocks
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Si c'est pour lire rapidement toutes les valeurs des servos, la solution que je te propose le permet. Tout dépend de la fréquence où l'ordre de sélection de la sortie est envoyée.
Par ailleurs, tu peux utiliser 6 entrées analogiques, et diviser tes potars en 6 groupes .
6 potars ( soit un potar par groupe)  ont alors leurs entrée et sortie en commun (tous sur la meme sortie de registre donc) et leur curseur a une entrée analogique
Tu vas alors 6 fois plus vite dans la lecture des données, et n'a besoin que de 3 registres (2 si tu arrives a n'utiliser "que" 96 potars  smiley-wink )
« Last Edit: November 05, 2010, 03:09:16 pm by erlik » Logged

0
Offline Offline
Sr. Member
****
Karma: 0
Posts: 339
Arduino rocks
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

c'est possible mais bon joré préféré du multiplexing ^^
histoire de les avoir en temps réelle xD
je sais je fait chié avec mon multiplexing mais bon
une idée de composants disposant du max d'entrée pour multiplexé ?
Logged

0
Offline Offline
Sr. Member
****
Karma: 0
Posts: 339
Arduino rocks
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

désolé mal vu ^^
en gros je pourré faire comme si il été en temps réelle ?
mais faut voir le taux de rafraichissement et si l'arduino arivera a suivre xD
en sachant que yora déja toute les commande de servo ( 100 pour commencé ) + les valeurs renvoyés par les potars ^^
imagine la geule du code mdr
Logged

0
Offline Offline
Jr. Member
**
Karma: 0
Posts: 90
Arduino rocks
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Si tu veux du "vrai" temps reel, il existe des montages simples pour générer un signal PWM dont la valeur est définie par un potentiometre:
http://www.sonelec-musique.com/electronique_realisations_gene_pwm_001.html
Tu dépasses alors la limite des 148 servos, mais cela signifie un montage par servo ...

Cela dit, j'ai fait un code basique, pour simuler la lecture des valeurs des potentiometres, et la mise a jour de l'angle des servos. J'obtiens un temps total de 50ms par cycles, soit environ 20 lectures/écritures par secondes..

Code:

#include "Tlc5940.h"
#include "tlc_servos.h"


int analogPin = 0;

//Broche connectée sur ST_CP du 74HC595
int latchPin = 8;
//Broche connectée sur SH_CP du 74HC595
int clockPin = 12;
//Broche connectée sur DS of 74HC595
int dataPin = 11;

//Nombre total de canaux
long nbChannel = 120; // 140 max

//Nombre total de registres
int nbRegister = nbChannel/8  + 1 ;


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

  //Configure les broches en sortie
  pinMode(latchPin, OUTPUT);
  pinMode(clockPin, OUTPUT);
  pinMode(dataPin, OUTPUT);
  tlc_initServos();    
}

void loop() {
  unsigned long currentMillis = millis();  
  
  //séquence de comptage
  for(int selectedChannel = 0; selectedChannel < nbChannel; selectedChannel++){

    //mise à 0 de la broche latchpin maintenue basse pour toute la durée de la transmission
    digitalWrite(latchPin, LOW);

    // calcule de la sortie de registre active
    int selectedRegister = nbRegister / selectedChannel; // selection du registre
    int selectedOut = 1 << (selectedChannel % 8) ; // selection de la sortie

    // passage des registres non concernés a 0
    for (int i = 0; i < selectedRegister - 1; i++)
      shiftOut(dataPin, clockPin, LSBFIRST, 0 );  

    // activation de la sortie du registre séléctionné
    shiftOut(dataPin, clockPin, LSBFIRST, selectedOut );


    //remise à 1 de la broche latchpin pour signaler au CI
    //qu'il n'est plus nécessaire d'attendre de l'information
    digitalWrite(latchPin, HIGH);


    // lecture de la valeur du potar et calcule de l'angle correspondant
    int analogValue = analogRead(analogPin);
    int angle = map(analogValue, 0, 1023, 0, 180);
    
    // mise a jour de la valeur du servo correcpondant
    tlc_setServo(selectedChannel, angle);
  }
    // update de tous les servos en même temps
    Tlc.update();
    
  Serial.println( millis() - currentMillis );  

}



Cela dit, il est possible d'aller plus vite, avec un cd4051 et un CD4067
Il s'agit de multiplexer qui peuvent fonctionner en entrée et sortie. Ce montage nécessite 7 pins Arduino.
Pour selectionner une des entrées/sorties de ces circuits, ils disposent de pins d'adressages ( 3 pour le cd4051 et 4 pour le CD4067). Suivant leurs valeurs (0 ou 1), on peut selectionner une I/O
Si je prend le cd4051 pour exemple, on a les pins d'adresse A, B et C:
A=0, B=0, C=0 => Entrée/sortie 0 sélectionnée
A=1, B=0, C=0 => Entrée/sortie 1 sélectionnée
A=0, B=1, C=0 => Entrée/sortie 2 sélectionnée
A=1, B=1, C=0 => Entrée/sortie 3 sélectionnée
Etc Etc

C'est donc tout bêtement du binaire

Par facilité, on va les utiliser en matrice, selon ce schéma (version de gauche ) :
http://tomekness.files.wordpress.com/2007/05/4051_examples_72dpi.jpg

Montage adapté :


Le principe est de faire 16 "groupes" de 8 potars où leur entrée est relié au CD4067 (fonctionne en sorti), et leur curseur a une entrée du cd4051 (fonctionne en entrée ). On passe des données d'adressage par manipulation de ports (bien plus rapide que digitalWrite(), mais plus complexe)

Code:
#include "Tlc5940.h"
#include "tlc_servos.h"

int analogPin = 0;

void setup() {
  Serial.begin(9600);    
  
  //initialisation des servos
  tlc_initServos();    
  
  // définition des pins 4, 5, 6 et 7 en sortie
  DDRD |= B1111000;
  // définition des pins 17, 18 et 19 en sortie
  DDRC |= B111000;

  //toutes les sorties a 0;
  PORTD = 0;
  PORTC = 0;

}

void loop() {
  unsigned long currentMillis = millis();  

  //selection d'un groupe
  for(int selectedGroupe = 0; selectedGroupe < 16; selectedGroupe++){
    //
    PORTD = selectedGroupe << 3;

    //selection d'un potar
    for (int selectedPotar = 0; selectedPotar < 8 ; selectedPotar++){
      PORTC = selectedPotar << 3;

      // lecture de la valeur du selectedPotar et calcule de l'angle correspondant
      int analogValue = analogRead(analogPin);
      int angle = map(analogValue, 0, 1023, 0, 180);

      // mise a jour de la valeur du servo correcpondant
      int selectedChannel = selectedPotar * selectedGroupe + selectedPotar ;
      tlc_setServo(selectedChannel, angle);
    }
  }
  // update de tous les servos en même temps
  Tlc.update();

  Serial.println( millis() - currentMillis );  

}

On tombe, avec ça, a 25ms/cycles de lecture écriture, soit 40 cycles par secondes, mais la mise en oeuvre est plus délicate

Attention, j'ai fait ces codes rapidement, il n'y a aucune certitude qu'ils fonctionnent tel quel !
« Last Edit: November 06, 2010, 07:13:50 am by erlik » Logged

0
Offline Offline
Sr. Member
****
Karma: 0
Posts: 339
Arduino rocks
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

perso j'opterai bien pour ton premier code la ^^
a voir ce qu'il me faut comme matos ^^
si ta un lien pour en commandé ? et une idée de câblage je pense que je vais me lancé sur celui la
merci a toi
Logged

0
Offline Offline
Jr. Member
**
Karma: 0
Posts: 90
Arduino rocks
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Pour ce qui est du cablage et du codage, je te conseille le tres bon tuto sur le 74HC595
http://www.arduino.cc/en/Tutorial/ShiftOut
Coté achat, farnell et gotronic sont des références
Logged

0
Offline Offline
Sr. Member
****
Karma: 0
Posts: 339
Arduino rocks
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

je viens de capté que je suis pas dans la merde mdr ^^
8 pins donc 8 potars xD il men faut environ 100 ^^
donc me faut 12 74HC595 ca va etre sympathique xD
Logged

0
Offline Offline
Jr. Member
**
Karma: 0
Posts: 90
Arduino rocks
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

En effet, sachant que le fonctionnement d'une telle usine a gaz est loin d'etre garantie. d'où ma question première: a quoi te servira tout ça ?
Sinon le petit générateur que je t'avais proposé est quasiment sur de marcher du 1er coups, sans programmation ni composants complexes. Et bien qu'il faille en fabriquer 100, ça te reviendra moins cher:
  • 12 74HC595 + 7 TLC5940 reviennent à 47,6€ chez Farnell
(
  • 100 CD4093 + 100 resistances + 200 diodes reviennent a 36,5€
« Last Edit: November 06, 2010, 03:06:20 pm by erlik » Logged

0
Offline Offline
Sr. Member
****
Karma: 0
Posts: 339
Arduino rocks
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

les LTC5940 sont déja commandé ^^
et idem pour les 74HC595 lol
et je me voit pas faire 100 fois le montages xD ^^
et oui la solution avec les CD4093 peut etre interessante mais je vais surement avoir besoin d'une liaison sans fils donc la ca va foutre la merde ^^
ensuite j'ai pas vérifié si j'aurez assez de sorties pour connecter tout ca ^^
les 74HC595 sont chainables d'aprés ce que tu ma dit
les LTC5940 aussi donc déja ca réduit un peut ^^
combien de 74HC595 je peux mettre a la suite ? ( j'en est commandé 12 )
sinon mon projet ^^ comment expliké ^^
un gros bordel taille humaine qui reproduit chaque mouvement que je fait ^^
ca devrez pas mal t'indiquer ^^
je recherche un peu d'aide si tu veux
Logged

0
Offline Offline
Jr. Member
**
Karma: 0
Posts: 90
Arduino rocks
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Ha oui, je vois, des potars au niveau d'articulations pour reproduire les mouvement sur un mannequin. Ambitieux projet.  J'espère que tu as de bonnes connaissances en anatomie (surtout dynamique du solide), ça te sera utile pour la décomposition et l'amplitude des mouvements.
Néanmoins, tu aurais dù attendre avant de commander. D'autres voies peuvent etre étudiées, comme les convertisseurs analogique/digital .... ou juste te contenter d'un LTC5940, un 74HC595 et 8 servos pour commencer. Avec ça, tu peux reproduire facilement les postures d'un bras.
Par contre, le nombre de servos et le coté wireless m'interroge. Si tu veux reproduire tous les mouvements humains, y compris la marche, tu peux déjà oublier.
Logged

0
Offline Offline
Sr. Member
****
Karma: 0
Posts: 339
Arduino rocks
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

oui tu a comprit le projet ^^
la marche pour le moment j'en suis pas la
j'ai pas de soucis au niveau de l'anatomie
et tu a bien comprit le principe
mon soucis c'est au niveau de la main xD
me faut beaucoup de servo pour une main car beaucoup d'articulation ^^
et je prefere partir sur de bonne base en achetant pas mal de matos car je le paye moins cher quand je commande en gros et dans tout les cas c'est pas perimable et je m'en reserviré pour autre chose ^^
j'ai déja commencé le code ^^
mais déja déclaré tout les servo ca prends quelque lignes ^^
ensuite faut que je déclare tout les potars ^^ mais sur un autre code donc ca devré allé ^^
sinon as tu une idée pour permettre la transmision des infos ??
xbee mais un peu court au niveau distance je pense mais ca peut etre un bon début
je pensez a des modules en 433MhZ qui porte a environ 3Km
aprés je sais pas du tout si je met le code pour convertir sur l'arduino ou ya les potar ou sur celui des servos ^^
je pourrez séparé en deux mais la ca devient chiants si ya un soucis ^^
ensuite pour l'alim tu imagine la puissance qu'il ya ^^
100 servo a 200mA le servo ca nous fait du 20A
batteries de voiture bonsoir ^^
tu pense que je peux séparé les batteries ?
genre au lieu de prendre une grosse prendre plusieurs plus petites
en théorie je pense qu'il ni ya pas de soucis mais en pratique ^^
ensuite le soucis des régulateurs ^^
20A ca fait 20 regul 5V ca vaut pas trop cher mais voila la carte de puissance ^^
donc aprés des fils de partout pour dispatché tout ca et pour le fil de commande du servo aussi ^^
enfin bon ^^
gros projet mais j'espere que ca marchera nikel ca ferez plaisir ^^
la grande question qui me vient a lesprit ^^
as tu une idée pour l'épaule ?
je voit bien 2 servo pour faire un truc complet mais au niveau des potars suis un peu coincé ^^
merci
Logged

0
Offline Offline
Jr. Member
**
Karma: 0
Posts: 90
Arduino rocks
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

C'est bien ce que je pensais, tu vises grand... Trop grand. Meme en théorie. J'y avais aussi réfléchie à une époque, et bien qu'a l'échelle qu'un membre, ça ne pose aucun reel problème, il est impossible de produire un tout cohérent et fonctionnel, ou alors en dépensant qlq milliers d'euros ...

Il est interessant de s'inspirer de la nature, mais très dure de la copier.
Prenons l'exemple de la main. Tu parles de pleins d'articulations, donc pleins de servos. Or pas la peine de beaucoup de servos pour une main, 5 suffisent ( un par doigt ). Mais tu parts d'un postula erroné : une articulation = un servo.
L'articulation de la main est en effet complexe, mais ce n'est qu'un système de poulies et de cordages. Tu as 2 groupes musculaires, les fléchisseurs et les extenseurs des doigts. Les fléchisseurs sont eux mêmes divisés en 2, les profonds (qui permettent de mouvoir l'articulation metacarpo-phalangienne, cad fléchir le doigt en le gardant droit) et les superficiels ( pour recourber le doigt en "crochet" ).
Ces 15 muscles sont remplaçables par 5 servos et 10 cordages  pour la tringlerie. Ou encore mieux, 2 servos pour reproduire une pince (le pouce et les 4 autres doigts en opposition)
http://www.active-robots.com/products/robots/lynxmotion/lg-kt/rh01-500.jpg

Tu noteras dans cette vidéo que le principe n'est pas de plaquer un potentiomètre sur chaque articulation du bras, mais de bouger un "faux" bras pour capter les mouvements. Ce principe résout par là même ton problème d'épaule

Donc, avant de commencer les soudures, je te conseille d'étudier qlq planches anatomiques.

Sinon, comme dit, tu peux oublier la marche. La simple posture debout requière au minimum 2 sens (l'équilibre et la proprioception) et une batterie d'arcs réflexes pour "mettre à jour" en continu notre position. Les robots marcheurs utilisent d'ailleurs cela, via des gyroscopes et des detecteurs, et des algro très complexes.

De même que le wireless, surtout 3km, oublie. Il faudra passer par du filiaire ou de très bon accus.

En conclusion, travaille d'abord sur un bras. Quand tu auras fini, tu pourras tenter de reproduire toute la partie superieur du corps humains (bras, thorax, cou et tete). Les jambes sont comparativement bien plus simple. Mais je doute que tu arrives a qlq chose de réaliste, désolé
Logged

0
Offline Offline
Sr. Member
****
Karma: 0
Posts: 339
Arduino rocks
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

ne tinquiete pas je vais pas attaqué directement par faire les jambes ^^
je voulais ataqué a partir de la main puis remonté le bras et aprés redescendre
étant étudiants le coté financier va un peu me bloquer donc je vais faire ca au fur et a mesure que je peux
merci quand meme des conseils
Logged

0
Offline Offline
Sr. Member
****
Karma: 0
Posts: 339
Arduino rocks
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

de retour
donc j'ai recu les TLC et les 74HC595 arrive demain
je voulais faire mon pcb via eagle mais je trouve pas les librairies
enfin
j'en est trouvé une pour le TLC mais il arrive pas a me sortir le composants
une idée ?
Logged

France, Nice
Offline Offline
Full Member
***
Karma: 3
Posts: 194
www.Zartronic.fr
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

Pour Eagle, va voir :
http://www.opencircuits.com/SFE_Footprint_Library_Eagle

Il y a plein de footprint pour les composants intéressants.

A+ Teiva,

www.Zartronic.fr : Votre source Arduino en France
Logged


www.Zartronic.fr : Arduino & Robotique

Pages: 1 [2] 3   Go Up
Jump to: