Programme infonctionnel avec ATtiny85

Bonjour,
J'ai créer un programme me permettant de gérer un capteur ultrason (HC-SR04) et un micro-servomoteur avec un microcontrôleur ATtiny85. Lorsque que je téléverse le programme sur l'ATtiny85, deux messages d'erreur apparaissent et me refusent les termes Serial.begin(9600) et if (digitalRead(12)==HIGH) {servo.write(0);} Je ne comprends donc pas et quelles sont les modifications à apporter à mon programme ci-dessous.

#include "Ultrasonic.h"
#include "Servo.h"
Servo servo;
Ultrasonic ultrasonic (3, 4); //Trig et Echo

void setup() {
  pinMode(1,INPUT);
  pinMode(2,INPUT);
  servo.attach(0);
  Serial.begin(9600);

}

void loop() {
  int dist=ultrasonic.read();
  if (dist<=20) {servo.write(90); delay(10000); servo.write(0);}
  if (digitalRead(1)==HIGH) {servo.write(90);}
  if (digitalRead(2)==HIGH) {servo.write(0);}

Merci par avance pour votre aide

Bonjour
Il n y a pas de serial sur attiny sauf a installer un truc special
Et a priori sauf erreur de frappe pas d entree 12 non plus

Effectivement c'est un erreur de frappe de ma part ce n'est pas l'entrée 12 mais 2

Est il possible de remplacer serial par autre chose ?

Virez la ligne puique le serial est pas utilisé

Je viens de tester le programme sans Serial et un message d'ereur apparaît

/home/chams/Arduino/libraries/Servo/src/avr/Servo.cpp: In function 'void __vector_3()':
/home/chams/Arduino/libraries/Servo/src/avr/Servo.cpp:82:44: error: cannot convert 'volatile uint8_t* {aka volatile unsigned char*}' to 'volatile uint16_t* {aka volatile unsigned int*}' for argument '2' to 'void handle_interrupts(timer16_Sequence_t, volatile uint16_t*, volatile uint16_t*)'
   handle_interrupts(_timer1, &TCNT1, &OCR1A);
                                            ^
/home/chams/Arduino/libraries/Servo/src/avr/Servo.cpp: In function 'void initISR(timer16_Sequence_t)':
/home/chams/Arduino/libraries/Servo/src/avr/Servo.cpp:129:5: error: 'TCCR1B' was not declared in this scope
     TCCR1B = _BV(CS11);     // set prescaler of 8
     ^~~~~~
/home/chams/Arduino/libraries/Servo/src/avr/Servo.cpp:129:5: note: suggested alternative: 'TCCR0B'
     TCCR1B = _BV(CS11);     // set prescaler of 8
     ^~~~~~
     TCCR0B
/home/chams/Arduino/libraries/Servo/src/avr/Servo.cpp:136:5: error: 'TIFR1' was not declared in this scope
     TIFR1 |= _BV(OCF1A);     // clear any pending interrupts
     ^~~~~
/home/chams/Arduino/libraries/Servo/src/avr/Servo.cpp:136:5: note: suggested alternative: 'TIFR'
     TIFR1 |= _BV(OCF1A);     // clear any pending interrupts
     ^~~~~
     TIFR
/home/chams/Arduino/libraries/Servo/src/avr/Servo.cpp:137:5: error: 'TIMSK1' was not declared in this scope
     TIMSK1 |=  _BV(OCIE1A) ; // enable the output compare interrupt
     ^~~~~~
/home/chams/Arduino/libraries/Servo/src/avr/Servo.cpp:137:5: note: suggested alternative: 'TIMSK'
     TIMSK1 |=  _BV(OCIE1A) ; // enable the output compare interrupt
     ^~~~~~
     TIMSK
Multiple libraries were found for "Servo.h"
  Used: /home/chams/Arduino/libraries/Servo
  Not used: /home/chams/.arduino15/libraries/Servo
exit status 1

Compilation error: exit status 1

Bonjour,

Si tu veux utiliser une liaison série je te conseille d'installer le attiny core de Steve Konde qui émule la liaison série Serial

outre le Serial.begin() qui ne sert à rien puisque vous n'imprimez rien, l'autre souci c'est

et l'usage de Servo car la bibliothèque Servo n'est pas compatible avec l'ATTINY.

regardez du côté de TinyServo éventuellement


Sinon Merci d'éditer votre premier post en utilisant le :pencil2: dans la barre d'outil juste sous votre post et rajoutez les balises de de code :

  • sélectionner la partie du texte qui correspond au code
  • appuyez sur l'icône <code/> dans la barre d'outils pour indiquer que c'est du code

(Assurez vous aussi d'indenter le code correctement dans l'IDE avant de le copier pour le coller ici. Cela se fait en pressant ctrlT sur PC ou cmdT sur un Mac)

il serait bon de (re)lire les recommandations listées dans "Les bonnes pratiques du Forum Francophone”

Ok merci pour ta réponse je vais essayer

Ok merci je vais également essayer.
Merci pour l'information (éditer un code) je ne le savais pas

faudrait le faire sur votre premier post...

J'ai commencé à utilisé la bibliothèque Tinyservo85 et est-il possible de déplacer le servomoteur à 90° ?

Regardez les codes d’exemples - en commençant par

Je l'ai étudié, mais je n'ai pas très bien compris

la doc dit

The functions available in the library include:

attachServo(byte servo_num); // to attach the servo
detachServo(byte servo_num); // to detach the servo, which also sets the corresponding signal pin to INPUT mode
setServo(byte servo_num, int angle); // to set the servo to a specific angle
homeServos(); // routine to home the servos
setCTC(); // sets the timer to CTC mode at 50Hz rollover
enableTimerInterrupt(); // re-enable the timer
disableTimerInterrupt(); // disable the timer
servo_timeout_check(); // a timer for servo inactivity to temporarily disable the timer

Donc si j'ai bien compris il me suffit d'écrire cette ligne :
setServo(byte servo_num, int angle);
Et le servomoteur se déplacera à l'angle voulu ?

il suffit d'essayer :slight_smile:

Merci beaucoup j'ai enfin réussi à résoudre le problème.

Serait-il possible de m'expliquer la signification de cette ligne ?

servo.setCTC();

La fonction setCTC() configure le Timer1 de l’ATtiny85 en mode CTC. Dans ce mode, le timer compte jusqu’à une valeur définie puis se remet à zéro, ce qui permet d’obtenir une base de temps précise.

La fonction règle cette valeur pour que le timer se réinitialise toutes les 20 millisecondes, soit une fréquence de 50 Hz. Cette cadence est indispensable car les servomoteurs pour bidouilleurs attendent une impulsion toutes les 20 millisecondes généralement.

➜ en utilisant le mode CTC, la bibliothèque tinyServo85 vous permet de générer des impulsions régulières pour garantir un positionnement fiable des servomoteurs.

#include "Ultrasonic.h"
#include "tinyServo85.h"
byte servo1 = 0;
tinyServo85 servo;
Ultrasonic ultrasonic (3, 4); //Trig et Echo

void setup() {
  pinMode(1,INPUT);
  pinMode(2,INPUT);
  servo.attachServo(servo1);
  

}

void loop() {
  int dist=ultrasonic.read();
  if (dist<=20) {servo.setServo(servo1, 90); delay(10000); servo.setServo(servo1, 0);}
  if (digitalRead(1)==HIGH) {servo.setServo(servo1, 90);}
  if (digitalRead(2)==HIGH) {servo.setServo(servo1, 0);}
}

Voici mon code, et est-il nécessaire d'utiliser cette ligne ?

servo.setCTC();