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);}
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
Sinon Merci d'éditer votre premier post en utilisant le 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)
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
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.