Problème avec les fonctions Servo, Softservo et Servo 8 bit sur ATtiny85.

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.

Salut,

Tu passes par quoi pour faire l'upload ? Est-ce que tu as bien configuré les fuses ?

Bonjour,

C'est surement un problème de fusibles (fuses).
Tu n'as pas un oscilloscope par hasard ? ça serait pratique.

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.

Et j'utitlise le logiciel Arduino 1.0.5r2.

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.

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.

Dans ce cas je penche pour un conflit de timer. Poste ton code on saura

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.

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.

Bonjour,

Je reviens vers vous avec des mesures:

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.


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

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.

Bonjour,

Personne n'a d'idées pour mon problème?

Est ce que ca pourrait venir du type de l'ATtiny85 (ici des 20 PU) ?

Quel type alors pour commander des servos?

Merci pour votre aide.

Bonjour,

je suis dans le meme cas, rien de fonctionne, je ne peux pas compiler le code sans avoir une erreur avec servo8bit.
voila mon code

#include "Servo8Bit.h"

int main()
{
Servo8Bit myServo; //create a servo object.
//a maximum of five servo objects can be created

myServo.attach(1); //attach the servo to pin PB1

//sweep the servo
while(1)
{
for(int pos = 0; pos < 180; pos++) // 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(15); // waits 15ms for the servo to reach the position
}

for(int pos = 180; pos > 1; pos--) // goes from 180 degrees to 0 degrees
{
myServo.write(pos); // tell servo to go to position in variable 'pos'
delay(15); // waits 15ms for the servo to reach the position
}
}
}

et les messages d'erreurs
Arduino : 1.6.11 (Windows 7), Carte : "ATtiny85 @ 16 MHz (internal PLL; 4.3 V BOD)"

Warning: Board tiny:avr:attiny24at16 doesn't define a 'build.board' preference. Auto-set to: AVR_ATTINY24AT16
Warning: Board tiny:avr:attiny2313at1 doesn't define a 'build.board' preference. Auto-set to: AVR_ATTINY2313AT1
Warning: Board tiny:avr:attiny44at1 doesn't define a 'build.board' preference. Auto-set to: AVR_ATTINY44AT1
Warning: Board tiny:avr:attiny25at8 doesn't define a 'build.board' preference. Auto-set to: AVR_ATTINY25AT8
Warning: Board tiny:avr:attiny85at16p doesn't define a 'build.board' preference. Auto-set to: AVR_ATTINY85AT16P
Warning: Board tiny:avr:attiny84at8 doesn't define a 'build.board' preference. Auto-set to: AVR_ATTINY84AT8
Warning: Board tiny:avr:attiny4313at1 doesn't define a 'build.board' preference. Auto-set to: AVR_ATTINY4313AT1
Warning: Board tiny:avr:attiny45at8 doesn't define a 'build.board' preference. Auto-set to: AVR_ATTINY45AT8
Warning: Board tiny:avr:attiny84at1 doesn't define a 'build.board' preference. Auto-set to: AVR_ATTINY84AT1
Warning: Board tiny:avr:attiny85at128 doesn't define a 'build.board' preference. Auto-set to: AVR_ATTINY85AT128
Warning: Board tiny:avr:attiny85at1 doesn't define a 'build.board' preference. Auto-set to: AVR_ATTINY85AT1
Warning: Board tiny:avr:attiny85at16e doesn't define a 'build.board' preference. Auto-set to: AVR_ATTINY85AT16E
Warning: Board tiny:avr:attiny2313at8 doesn't define a 'build.board' preference. Auto-set to: AVR_ATTINY2313AT8
Warning: Board tiny:avr:attiny45at1 doesn't define a 'build.board' preference. Auto-set to: AVR_ATTINY45AT1
Warning: Board tiny:avr:attiny44at8 doesn't define a 'build.board' preference. Auto-set to: AVR_ATTINY44AT8
Warning: Board tiny:avr:attiny25at1 doesn't define a 'build.board' preference. Auto-set to: AVR_ATTINY25AT1
Warning: Board tiny:avr:attiny84at16 doesn't define a 'build.board' preference. Auto-set to: AVR_ATTINY84AT16
Warning: Board tiny:avr:attiny4313at8 doesn't define a 'build.board' preference. Auto-set to: AVR_ATTINY4313AT8
Warning: Board tiny:avr:attiny85at8 doesn't define a 'build.board' preference. Auto-set to: AVR_ATTINY85AT8
Les options de compilation ont été modifiées, tout sera recompilé
Attention: platform.txt du cœur 'Arduino Tiny' contiens tools.avrdude.cmd.path={runtime.ide.path}/hardware/tools/avr/bin/avrdude dépassé, converti automatiquement en tools.avrdude.cmd.path={path}/bin/avrdude. La mise a niveau de ce cœur est conseillée.
Attention: platform.txt du cœur 'Arduino Tiny' contiens tools.avrdude.config.path={runtime.ide.path}/hardware/tools/avr/etc/avrdude.conf dépassé, converti automatiquement en tools.avrdude.config.path={path}/etc/avrdude.conf. La mise a niveau de ce cœur est conseillée.
Attention: platform.txt du cœur 'Arduino Tiny' contiens recipe.ar.pattern="{compiler.path}{compiler.ar.cmd}" {compiler.ar.flags} "{build.path}/{archive_file}" "{object_file}" dépassé, converti automatiquement en recipe.ar.pattern="{compiler.path}{compiler.ar.cmd}" {compiler.ar.flags} "{archive_file_path}" "{object_file}". La mise a niveau de ce cœur est conseillée.
Attention: platform.txt du cœur 'Arduino Tiny' contiens recipe.c.combine.pattern="{compiler.path}{compiler.c.elf.cmd}" {compiler.c.elf.flags} -mmcu={build.mcu} -o "{build.path}/{build.project_name}.elf" {object_files} "{build.path}/{archive_file}" "-L{build.path}" -lm dépassé, converti automatiquement en recipe.c.combine.pattern="{compiler.path}{compiler.c.elf.cmd}" {compiler.c.elf.flags} -mmcu={build.mcu} -o "{build.path}/{build.project_name}.elf" {object_files} "{archive_file_path}" "-L{build.path}" -lm. La mise a niveau de ce cœur est conseillée.
libraries\Servo8Bit-master\example.cpp.o: In function `main':

C:\Program Files (x86)\Arduino\libraries\Servo8Bit-master/example.cpp:14: multiple definition of `main'

sketch\SerialServo.pde.cpp.o:C:\Users\tweedy\AppData\Local\Temp\arduino_modified_sketch_439548/SerialServo.pde:4: first defined here

collect2.exe: error: ld returned 1 exit status

exit status 1
Erreur de compilation pour la carte ATtiny85 @ 16 MHz (internal PLL; 4.3 V BOD)
Bibliothèque non valide trouvée dans C:\Program Files (x86)\Arduino\libraries\arduino-nrf24l01-master : C:\Program Files (x86)\Arduino\libraries\arduino-nrf24l01-master
Bibliothèque non valide trouvée dans C:\Program Files (x86)\Arduino\libraries\arduino-nrf24l01-master : C:\Program Files (x86)\Arduino\libraries\arduino-nrf24l01-master

merci d'avance