Problème entre servos moteur et arduino en utilisant le tlc 5940 de sparkfun.
Répondre à la discussion
Affichage des résultats 1 à 3 sur 3

Problème entre servos moteur et arduino en utilisant le tlc 5940 de sparkfun.



  1. #1
    invited3314900

    Exclamation Problème entre servos moteur et arduino en utilisant le tlc 5940 de sparkfun.


    ------

    Le problème est le suivant :
    Normalement nous pouvons orienté les servosmoteurs de 0 à 180 degrés a partir du programme suivant de la librairie tlc 5940:

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

    #define SERVO_CHANNEL 0
    #define DELAY_TIME 20

    void setup()
    {
    tlc_initServos(); // Note: this will drop the PWM freqency down to 50Hz.
    }

    void loop()
    {
    for (int angle = 0; angle < 180; angle++) {
    tlc_setServo(SERVO_CHANNEL, angle);
    Tlc.update();
    delay(DELAY_TIME);
    }
    for (int angle = 180; angle >= 0; angle--) {
    tlc_setServo(SERVO_CHANNEL, angle);
    Tlc.update();
    delay(DELAY_TIME);
    }
    }

    ______________________________ ______________________________ ______________________________ _

    mon programme:

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

    #define SERVO_CHANNEL 0
    #define DELAY_TIME 20

    void setup()
    {
    tlc_initServos(); // Note: this will drop the PWM freqency down to 50Hz.
    }

    void loop()
    {

    tlc_setServo(SERVO_CHANNEL, 30);
    Tlc.update();
    delay (1000);

    tlc_setServo(SERVO_CHANNEL, 90);
    Tlc.update();
    delay (1000);
    tlc_setServo(SERVO_CHANNEL, 0);
    Tlc.update();
    delay (1000);
    tlc_setServo(SERVO_CHANNEL, 180);
    Tlc.update();
    delay (1000);
    tlc_setServo(SERVO_CHANNEL, 60);
    Tlc.update();
    delay (1000);
    tlc_setServo(SERVO_CHANNEL, 120);
    Tlc.update();
    delay (1000);

    }
    ______________________________ ______________________________ _____________________________

    Cependant quand nous utilisons celui-ci , le servomoteur ne tourne qu'à 90 degrés.
    En augmentant la valeur de 0 a 255 nous pouvons augmenté l'angle , cependant il s'arrête a 255 et on est a peut près à 110°aprés cela il y a un décrochement.

    Pouvez vous m'aider afin de pouvoir atteindre 180° .
    Merci d'avance !

    -----

  2. #2
    invite936c567e

    Re : Problème entre servos moteur et arduino en utilisant le tlc 5940 de sparkfun.

    Bonjour

    La position d'un servo est piloté par des impulsions de largeur déterminée, correspondant à l'angle souhaité, et répétées à une fréquence fixée.

    Toutefois, les valeurs temporelles à fournir dépendent du modèle de servo. Si l'amplitude des déplacements de ton servo ne correspond pas à la commande, c'est parce que ces valeurs sont inadéquates.

    Je ne connais pas la librairie Arduino que tu cites, ni le circuit qui lui est associé, mais il paraît évident que l'un ou l'autre ne convient pas à ton servo (ils ont peut-être été prévus pour d'autres modèles, ou bien il est nécessaire d'en effectuer un paramétrage).


    Note par ailleurs que certains servos actuellement préconisés pour des projets Arduino sont vendus pour une course de 180° (qu'il sont effectivement capables de réaliser), alors que les spécifications du constructeur limitent celle-ci à une valeur inférieure (120°, ou ±60°). En effet, pour des impulsions données, il existe une incertitude sur la position obtenue. Si cette position dépasse les limites mécaniques du servo (au-dessous de 0° ou au-dessus de 180°, du fait d'une commande inadaptée comme ici, ou bien d'un décalage mécanique), celui-ci peut être sérieusement endommagé, voire détruit.

    Lorsque ton problème de commande sera résolu, il sera certainement préférable de réduite la course du servo à une valeur inférieure à 180°, centrée autour de 90°.

  3. #3
    invited3314900

    Unhappy Re : Problème entre servos moteur et arduino en utilisant le tlc 5940 de sparkfun.

    Tout d’abord un grand Merci pour votre aide.


    Cela est tout à fait possible cependant nous avons fait tourner le servos a 180° avec un programme arduino simple, de plus nous avons testé sur un autre type de moteur le problème était le même .
    Ensuite la librairie "Tlc5940.h" que j'utilise dois poser problème ou avoir une ligne de code qui limite l'angle cependant je ne vois pas comment la modifié car le programme indique bien un angle de 180°.

    voici la librairie:

    /* Copyright (c) 2009 by Alex Leone <acleone ~AT~ gmail.com>

    This file is part of the Arduino TLC5940 Library.

    The Arduino TLC5940 Library is free software: you can redistribute it
    and/or modify it under the terms of the GNU General Public License as
    published by the Free Software Foundation, either version 3 of the
    License, or (at your option) any later version.

    The Arduino TLC5940 Library is distributed in the hope that it will be
    useful, but WITHOUT ANY WARRANTY; without even the implied warranty of
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
    GNU General Public License for more details.

    You should have received a copy of the GNU General Public License
    along with The Arduino TLC5940 Library. If not, see
    <http://www.gnu.org/licenses/>. */

    #ifndef TLC_SERVOS_H
    #define TLC_SERVOS_H

    /** \file
    TLC servo functions. */

    #include <avr/io.h>
    #include "Tlc5940.h"

    #ifndef SERVO_MAX_ANGLE
    /** The maximum angle of the servo. */
    #define SERVO_MAX_ANGLE 180
    #endif
    #ifndef SERVO_MIN_WIDTH
    /** The 1ms pulse width for zero degrees (0 - 4095). */
    #define SERVO_MIN_WIDTH 204
    #endif
    #ifndef SERVO_MAX_WIDTH
    /** The 2ms pulse width for 180 degrees (0 - 4095). */
    #define SERVO_MAX_WIDTH 410
    #endif
    #ifndef SERVO_TIMER1_TOP
    /** The top value for XLAT and BLANK pulses. This is with the div8 prescale,
    so
    \f$\displaystyle f_{PWM} = \frac{f_{osc}}{2 * 8 * SERVO\_TIMER1\_TOP} \f$
    The default is 20000, which corresponds to 50Hz. */
    #define SERVO_TIMER1_TOP 20000
    #endif
    #ifndef SERVO_TIMER2_TOP
    /** The top value for GSCLK pulses. Related to SERVO_TIMER1_TOP by
    \f$\displaystyle SERVO\_TIMER2\_TOP =
    \frac{2 * 8 * SERVO\_TIMER1\_TOP}{4096} - 1 \f$
    The default is 77. */
    #define SERVO_TIMER2_TOP 77
    #endif

    void tlc_initServos(uint8_t initAngle = 0);
    void tlc_setServo(TLC_CHANNEL_TYPE channel, uint8_t angle);
    uint8_t tlc_getServo(TLC_CHANNEL_TYPE channel);
    uint16_t tlc_angleToVal(uint8_t angle);
    uint8_t tlc_valToAngle(uint16_t value);

    /** \addtogroup ExtendedFunctions
    \code #include "tlc_servos.h" \endcode
    - void tlc_initServos(uint8_t initAngle = 0) - initializes the tlc for
    servos.
    - void tlc_setServo(TLC_CHANNEL_TYPE channel, uint8_t angle) - sets a
    servo to an angle
    - uint8_t tlc_getServo(TLC_CHANNEL_TYPE channel) - gets the currently set
    servo angle */
    /* @{ */

    /** Initializes the tlc.
    \param initAngle the initial angle to set all servos to
    (0 - SERVO_MAX_ANGLE). */
    void tlc_initServos(uint8_t initAngle)
    {
    Tlc.init(tlc_angleToVal(initAn gle));
    TCCR1B &= ~(_BV(CS12) | _BV(CS11) | _BV(CS10)); // stop timer1
    ICR1 = SERVO_TIMER1_TOP;
    TCNT1 = 0;
    #ifdef TLC_ATMEGA_8_H
    uint8_t oldTCCR2 = TCCR2;
    TCCR2 = 0;
    TCNT2 = 0;
    OCR2 = SERVO_TIMER2_TOP / 2;
    TCCR2 = oldTCCR2;
    #else
    uint8_t oldTCCR2B = TCCR2B;
    TCCR2B = 0;
    TCNT2 = 0;
    OCR2A = SERVO_TIMER2_TOP;
    TCCR2B = oldTCCR2B;
    #endif
    TCCR1B |= _BV(CS11); // start timer1 with div 8 prescale
    }

    /** Sets a servo on channel to angle.
    \param channel which channel to set
    \param angle (0 - SERVO_MAX_ANGLE) */
    void tlc_setServo(TLC_CHANNEL_TYPE channel, uint8_t angle)
    {
    Tlc.set(channel, tlc_angleToVal(angle));
    }

    /** Gets the current angle that channel is set to.
    \param channel which channel to get */
    uint8_t tlc_getServo(TLC_CHANNEL_TYPE channel)
    {
    return tlc_valToAngle(Tlc.get(channel ));
    }

    /** Converts and angle (0 - SERVO_MAX_ANGLE) to the inverted tlc channel value
    (4095 - 0). */
    uint16_t tlc_angleToVal(uint8_t angle)
    {
    return 4095 - SERVO_MIN_WIDTH - (
    ((uint16_t)(angle) * (uint16_t)(SERVO_MAX_WIDTH - SERVO_MIN_WIDTH))
    / SERVO_MAX_ANGLE);
    }

    /** Converts an inverted tlc channel value (4095 - 0) into an angle (0 -
    SERVO_MAX_ANGLE). */
    uint8_t tlc_valToAngle(uint16_t value)
    {
    return SERVO_MAX_ANGLE * (4095 - SERVO_MIN_WIDTH - value)
    / (SERVO_MAX_WIDTH - SERVO_MIN_WIDTH);
    }

    /* @} */

    #endif
    ______________________________ ______________________________ _

    En attente de votre aide , mais remerciement distingué.

Discussions similaires

  1. aff 7segment (sparkfun) + pinguino
    Par invitee67bfe0a dans le forum Électronique
    Réponses: 7
    Dernier message: 28/11/2013, 18h13
  2. Controle moteur DC arduino problème
    Par adrien4607 dans le forum Électronique
    Réponses: 1
    Dernier message: 22/02/2012, 17h04
  3. Servos moteur HX5010 Composant CMS
    Par inviteec5483ba dans le forum Électronique
    Réponses: 0
    Dernier message: 09/03/2009, 13h52
  4. moteur ou servos
    Par invite2c5b501b dans le forum Technologies
    Réponses: 18
    Dernier message: 07/05/2008, 20h16
Dans la rubrique Tech de Futura, découvrez nos comparatifs produits sur l'informatique et les technologies : imprimantes laser couleur, casques audio, chaises gamer...