Go Down

Topic: Problème avec les fonctions Servo, Softservo et Servo 8 bit sur ATtiny85. (Read 4605 times) previous topic - next topic

croustipizza49

Bonsoir,

Je me permet de poser une question sur le forum par rapport à un programme sur un ATtiny85.
Je suis débutant en électronique et en arduino.
Je possède une carte arduino UNO derniere génération.
Les ATtiny 85 sont des : ATTINY 85 20PU

Mon problème ou plutot ce que je voudrais réaliser:
C'est pour commander un servo qui actionne un moteur thermique de 4 cm3 pour un avion de vol circulaire (aéromodélisme).

C'est une "simple" minuterie :
Au repos, position normale, le servo est  dans un sens (0 degrés) puis apres l'action sur un bouton, il passe a 180 degrés (moteur a fond) pour 90 secondes puis revient a 0 degrés pour  couper le moteur.

Ce que j'ai réussi à faire :

J ai réussi a le faire fonctionner , assez facilement , sur la carte uno.
J ai meme réussi a y mettre des "options" : train rentrant avec un second servo, temps de vol réglable avec des inters, réglage de la puissnce du moteur avec un potar...
Bref, j ai cherché et en y passant du temps, j ai réussi... (comme tout le monde quoi...) Le programme est énorme mais bon ça marche ....

Donc ensuite, le composant de la carte UNO étant trop gros, je me suis dis que l on pouvait miniaturiser.
J ai trouvé les ATtiny.
Le 85 me parait pas mal car il peut commander (apparement) des servos.
j ai trouvé sur internet des exemples de servo testeur a base de 85. tous ce qu'il me faut.

Mais  ca ne marche pas .

J ai tout essayé:

Les librairies : Servo, Softservo et Servo8Bit.

Pour servo8bit, que ce soit en 1,8,16 mhz, il ne ce passe rien.

Pour les deux autres, en 16 mhz ca ne marche pas.

En 1,8 mhz, le servo va en buté d'un coté en fait clac clac.

J,ai trouvé un servo futaba S148 comme sur les vidéos, mais c'est pareil.

Pour voir si j'avais un probleme sur mes ATtiny, j,ai généré un signal carré avec les fonction LOW et HIGH sur le principe de la led clignotante (20 ms et 2 ms) et là, le servo se positionnne en fonction de la valeur la plus petite ( de 1 a 2ms).
J'ai meme fait un servo a deux positions : inter relaché une position et appuyer une autre.
aucun problème, là ca marche.
Donc mes ATtiny arrive bien a "fabriquer" le signal pour les servos.
Je voudrais faire fonctionner une des deux librairies sur mes ATtiny car il me faut une tempo, que je n'arrive pas a faire avec le programme LOW et HIGH.

Voilà, j'espere que j'ai été assez clair.

Merci par avance.


B@tto

Salut,

Tu passes par quoi pour faire l'upload ? Est-ce que tu as bien configuré les fuses ?
Blog électronique : battomicro.wordpress.com
Photographie : www.interactive-celebration.fr
Fablab de Montpellier : www.labsud.org

skywodd

Bonjour,

C'est surement un problème de fusibles (fuses).
Tu n'as pas un oscilloscope par hasard ? ça serait pratique.
Des news, des tutos et plein de bonnes choses sur http://skyduino.wordpress.com !

croustipizza49

Bonsoir,

Merci de me repondre.

Pour la programmation, j'utilise ma carte arduino en programmateur.

Heu, je regarde mes deux livres (maitrisez les microcontroleurs a l'aide d'arduino et Maitrisez sa programmation) et je ne vois rien qui parle de "fusibles"....

Oui, j'ai un oscilloscope.


croustipizza49


B@tto

Même s'il n'y a pas de bootloader, il faut au préalable faire "graver la sequence d'initialisation" (sur tu as la version française). Les fuses permettent de faire la configuration de certaines fonctions du µC, notamment sa frequence.
Blog électronique : battomicro.wordpress.com
Photographie : www.interactive-celebration.fr
Fablab de Montpellier : www.labsud.org

croustipizza49

Oui B@tto j'ai bien fait "graver la séquence d'initiallisation".

J'ai meme essayer toutes les fréquences en faisant "graver la séquence d'initiallisation" a chaque fois.

Et cela ne change rien.

Mais il y a peut etre un autre menu de réglage que je n'ai pas fait.


Est ce que dans la (les) commande (s) , il n'y aurait pas un "truc" qui envairrait le servo hors de sa course?
Du style 0,2ms alors que le servo accepte au max 0,4ms.
Je pense a cela car quand le servo est sous tension, on entend le tactac au meme ryhtme que sur les vidéos des sites internets.
J'en déduit qu'il y a bien une "tempo" qui fonctionne.
Je suis allé dans les fichiers servo et softservo pour voir si il avait un endroit ou l'on pouvait modifier les valeurs en millisecondes pour modifier la course du servo mais je n'ai rien vu...
En meme temps c'est un peu (beaucoup ) complexe a lire et j'ai pas le niveau pour "bricoler " la librairie.

B@tto

Dans ce cas je penche pour un conflit de timer. Poste ton code on saura
Blog électronique : battomicro.wordpress.com
Photographie : www.interactive-celebration.fr
Fablab de Montpellier : www.labsud.org

skywodd

Wait.

Tu choisis quoi comme carte dans l'ide avant de faire la prog du bootloader ?
Les fusibles c'est pas génériques, ça dépend du µc cible (ici attiny85).

Si tu as un oscillo utilise le pour voir la forme du signal généré et ses timings.
Des news, des tutos et plein de bonnes choses sur http://skyduino.wordpress.com !

croustipizza49

Bonsoir,

Donc pour le programme, c'est celui du logiciel Arduino par exemple (il y en a aucun qui marche):

// Sweep
// by BARRAGAN <http://barraganstudio.com>
// Adapted to SoftwareServo library by RC Navy (http://p.loussouarn.free.fr)
// This sketch can work with ATtiny and Arduino UNO, MEGA, etc...
// This example code is in the public domain.

#include <SoftwareServo.h>

SoftwareServo myservo;  // create servo object to control a servo
                        // a maximum of eight servo objects can be created
#define SERVO_PIN         3

#define REFRESH_PERIOD_MS 20

int pos = 0;    // variable to store the servo position

void setup()
{
  myservo.attach(SERVO_PIN);  // attaches the servo on pin defined by SERVO_PIN to the servo object
}


void loop()
{
  for(pos = 0; pos < 180; pos += 1)  // goes from 0 degrees to 180 degrees
  {                                  // in steps of 1 degree
    myservo.write(pos);              // tell servo to go to position in variable 'pos'
    delay(REFRESH_PERIOD_MS);        // waits 20ms for refresh period
    SoftwareServo::refresh();        // generates the servo pulse
  }
  for(pos = 180; pos>=1; pos-=1)     // goes from 180 degrees to 0 degrees
  {                               
    myservo.write(pos);              // tell servo to go to position in variable 'pos'
    delay(REFRESH_PERIOD_MS);        // waits 20ms for for refresh period
    SoftwareServo::refresh();        // generates the servo pulse
  }
}


Et pour le matériel , la carte sélectionnée est "ATtiny 8 mhz (internal oscillator BOD disabled)"

Je les ai toutes essayées et aucune ne marche (en ATtiny 85).

Et je suis en arduino as ISP.

Voila.

Je regarde pour prendre le signal en sortie  de composant sur la broche qui va au servo.

Merci pour l'aide.

croustipizza49

Bonjour,

Je reviens vers vous avec des mesures:

[/URL][/img]

Voici le programme:

const int buttonPin = 3;     // the number of the pushbutton pin
const int ledPin =  1;      // the number of the LED pin

// variables will change:
int buttonState = 0;         // variable for reading the pushbutton status

void setup() {
  // initialize the LED pin as an output:
  pinMode(ledPin, OUTPUT);     
  // initialize the pushbutton pin as an input:
  pinMode(buttonPin, INPUT);     
}

void loop(){
  // read the state of the pushbutton value:
  buttonState = digitalRead(buttonPin);

  // check if the pushbutton is pressed.
  // if it is, the buttonState is HIGH:
  if (buttonState == HIGH) {     
    // turn LED on:   
    digitalWrite(ledPin, HIGH);
   delay(1.3);               // wait for a second
  digitalWrite(ledPin, LOW);    // turn the LED off by making the voltage LOW
  delay(15);
 
  }
  else {
    // turn LED off:
    digitalWrite(ledPin, HIGH);
     delay(2);               // wait for a second
  digitalWrite(ledPin, LOW);    // turn the LED off by making the voltage LOW
  delay(15);
  }
}





Et l autre mesure:



Avec le programme suivant:


// Sweep
// by BARRAGAN <http://barraganstudio.com>
// Adapted to SoftwareServo library by RC Navy (http://p.loussouarn.free.fr)
// This sketch can work with ATtiny and Arduino UNO, MEGA, etc...
// This example code is in the public domain.

#include <SoftwareServo.h>
 
SoftwareServo myservo;  // create servo object to control a servo
                        // a maximum of eight servo objects can be created
#define SERVO_PIN         3

#define REFRESH_PERIOD_MS 20

int pos = 0;    // variable to store the servo position
 
void setup()
{
  myservo.attach(SERVO_PIN);  // attaches the servo on pin defined by SERVO_PIN to the servo object
}
 
 
void loop()
{
  for(pos = 0; pos < 180; pos += 1)  // goes from 0 degrees to 180 degrees
  {                                  // in steps of 1 degree
    myservo.write(pos);              // tell servo to go to position in variable 'pos'
    delay(REFRESH_PERIOD_MS);        // waits 20ms for refresh period
    SoftwareServo::refresh();        // generates the servo pulse
  }
  for(pos = 180; pos>=1; pos-=1)     // goes from 180 degrees to 0 degrees
  {                               
    myservo.write(pos);              // tell servo to go to position in variable 'pos'
    delay(REFRESH_PERIOD_MS);        // waits 20ms for for refresh period
    SoftwareServo::refresh();        // generates the servo pulse
  }
}


On voit que le ATtiny avec le 2eme programme ne génère plus le signale correctement.

excusé moi pour le délai un peu long pour la réponse.

croustipizza49

[/URL][/img]
[/url][/img]

La premiere image n'est pas bien passée.


croustipizza49

Euh bon j'arrête parce que j y arrive pas avec la première image...

Mais le signale est bien carré pour commander un servo.


Go Up