incompatibilité entre servo.attach et analog.Write?

Bonjour à tous,
Je suis en train de faire une distributeur de croquette pour chat. J’utilise un moteur pour entraîner une vis sans fin et un servomoteur pour faire basculer une balance.
Pin 9 d’une arduino micro pour le servo et pin 10 pour le moteur au travers d’un montage avec un mosfet.
Au départ, je pilotais le moteur en tout ou rien avec la commande digital.Write(mot, HIGH), mais je voudrais ralentir un peu la vis. Du coup, j’ai voulu utiliser analog.write(mot, 125).
Mais la commande analog.write ne fonctionne que quand j’utilise 255 comme ratio, du coup, ça tourne au max, ça perd son intérêt.
Après quelques modifications dans mon code, il s’avère que la commande analog.write fonctionne correctement avec tout les ratios si je commente la ligne myservo.attach(9) dans le setup du code… du coup, mon servo ne fonctionne plus… On dirait que myservo.attach écrase quelquechose qui empêche analog.write de fonctionne correctement.

Une idée? (ci-dessous le code)

///////////////////////////////////////////////////
#include “Wire.h”
#include <Servo.h>
#include “HX711.h”

#define DS1307_ADDRESS 0x68
byte zero = 0x00; //workaround for issue #527
Servo myservo;
int pos = 20;
int mot = 10;
int bas = 0;
int bas_b=20;
int haut = 160;
int LEDr = 5;
int LEDj = 6;
int LEDv = 7;
int ON = 8;
bool distrib;
bool go_distrib;
float pese;
float pese_tot;
float dose_quot = 68.0;
float dose = 7.0;
HX711 scale(A0, A1); // HX711.PD_SCK - pin #A1 HX711.DOUT - pin #A0
int h1[3]; int h2[3]; int h3[3]; int h4[3]; int h5[3]; int h6[3]; int h7[3]; int h8[3]; int h9[3]; int h10[3];
namespace {
//tableau contenant heure[0]=heure / heure[1]=minute / heure[2]=seconde
int heure[3];
}

void setup(){
Wire.begin();
Serial.begin(9600);
myservo.attach(9); // attaches the servo on pin 9 to the servo object
pinMode(mot,OUTPUT);
analogWrite(mot,0);
pinMode(LEDr,OUTPUT);
digitalWrite(LEDr, HIGH);
pinMode(LEDj,OUTPUT);
digitalWrite(LEDj, LOW);
pinMode(LEDv,OUTPUT);
digitalWrite(LEDv, LOW);
pinMode(ON,INPUT);
scale.set_scale(2008.f); // this value is obtained by calibrating the scale with known weights; see the README for details
scale.tare(); // reset the scale to 0
vidange(myservo);
myservo.write(haut);
delay(2000);
pese=0.0;
distrib = 0;
go_distrib=0;
h1[0]=23; h1[1]=40; h1[2]=0;
h2[0]=23; h2[1]=40; h2[2]=30;
h3[0]=23; h3[1]=41; h3[2]=0;
h4[0]=23; h4[1]=41; h4[2]=30;
h5[0]=23; h5[1]=42; h5[2]=0;
h6[0]=23; h6[1]=42; h6[2]=30;
h7[0]=23; h7[1]=37; h7[2]=0;
h8[0]=23; h8[1]=37; h8[2]=30;
h9[0]=23; h9[1]=38; h9[2]=0;
h10[0]=23; h10[1]=38; h10[2]=30;
// setDateTime();
}

void loop(){

gettps(heure);
Serial.print(heure[0]);
Serial.print(":");
Serial.print(heure[1]);
Serial.print(":");
Serial.println(heure[2]);

if(distrib == 0){
if(digitalRead(ON) == 1 ||
(heure[0] == h1[0] && heure[1]== h1[1] && heure[2] == h1[2]) ||
(heure[0] == h2[0] && heure[1]== h2[1] && heure[2] == h2[2]) ||
(heure[0] == h3[0] && heure[1]== h3[1] && heure[2] == h3[2]) ||
(heure[0] == h4[0] && heure[1]== h4[1] && heure[2] == h4[2]) ||
(heure[0] == h5[0] && heure[1]== h5[1] && heure[2] == h5[2]) ||
(heure[0] == h6[0] && heure[1]== h6[1] && heure[2] == h6[2]))
{
go_distrib = 1;
}
else{
go_distrib = 0;
}
}

if( go_distrib == 1 && pese_tot<=dose_quot && distrib == 0){
distrib = 1;
Serial.println(“Démarrage balance”);
delay(100);
Serial.println(“Tarage balance”);
scale.tare();
Serial.println(“Démarrage moteur”);
analogWrite(mot,255);
digitalWrite(LEDr, LOW);
digitalWrite(LEDv, HIGH);
}

pese=scale.get_units(5);

if((pese>=dose && distrib == 1)||(pese>=dose_quot && distrib == 1)){
Serial.println(“Extinction moteur”);
analogWrite(mot,0);
digitalWrite(LEDv, LOW);
digitalWrite(LEDr, HIGH);
Serial.print(pese);
Serial.println(“g”);
pese_tot=pese_tot+pese;
Serial.print(“Total jour:”);
Serial.print(pese_tot);
Serial.println(“g”);
vidange(myservo);
myservo.write(haut);
distrib = 0;
scale.tare();
}

/* gettps(tps);
int jour=tps[4];
int mois=tps[5];
int annee=tps[6];
int heure=tps[2];
int min=tps[1];
int sec=tps[0];
Serial.print(jour);
Serial.print("/");
Serial.print(mois);
Serial.print("/");
Serial.print(annee);
Serial.print(" “);
Serial.print(heure);
Serial.print(”:");
Serial.print(min);
Serial.print(":");
Serial.println(sec);

scale.tare();
Serial.print(scale.get_units(), 1);
Serial.println(scale.get_units(10), 1);

scale.power_down(); // put the ADC in sleep mode
delay(1000);
scale.power_up();
*/
}

//Fonction qui relève heure/date et remplit le tableau date[5] avec jour/mois/heure/minute/seconde

void vidange(Servo bascule){
bascule.write(bas);
delay(100);
bascule.write(bas_b);
delay(100);
bascule.write(bas);
delay(100);
bascule.write(bas_b);
delay(100);
bascule.write(bas);
delay(100);
bascule.write(bas_b);
delay(100);
bascule.write(bas);
delay(100);
bascule.write(bas_b);
delay(100);
bascule.write(bas);
delay(100);
bascule.write(bas_b);
delay(100);
bascule.write(bas);
delay(100);
bascule.write(bas_b);
delay(100);
}

void gettps(int h[3]){

int tps[7];
Wire.beginTransmission(DS1307_ADDRESS);
Wire.write(zero);
Wire.endTransmission();

Wire.requestFrom(DS1307_ADDRESS, 7);

tps[0] = bcdToDec(Wire.read());
tps[1] = bcdToDec(Wire.read());
tps[2] = bcdToDec(Wire.read() & 0b111111); //24 hour time
tps[3] = bcdToDec(Wire.read()); //0-6 → sunday - Saturday
tps[4] = bcdToDec(Wire.read());
tps[5] = bcdToDec(Wire.read());
tps[6] = bcdToDec(Wire.read());
h[0]=tps[2];
h[1]=tps[1];
h[2]=tps[0];
}

//////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////
/*
void setDateTime(){

byte second = 0; //0-59
byte minute = 49; //0-59
byte hour = 17; //0-23
byte weekDay = 5; //1-7
byte monthDay = 27; //1-31
byte month = 3; //1-12
byte year = 16; //0-99

Wire.beginTransmission(DS1307_ADDRESS);
Wire.write(zero);

Wire.write(decToBcd(second));
Wire.write(decToBcd(minute));
Wire.write(decToBcd(hour));
Wire.write(decToBcd(weekDay));
Wire.write(decToBcd(monthDay));
Wire.write(decToBcd(month));
Wire.write(decToBcd(year));

Wire.write(zero); //start

Wire.endTransmission();

}

//////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////

byte decToBcd(byte val){
// Convert normal decimal numbers to binary coded decimal
return ( (val/10*16) + (val%10) );
}
*/
//////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////

byte bcdToDec(byte val) {
// Convert binary coded decimal to normal decimal numbers
return ( (val/16*10) + (val%16) );
}

//////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////
/*
void printDate(){

// Reset the register pointer
Wire.beginTransmission(DS1307_ADDRESS);
Wire.write(zero);
Wire.endTransmission();

Wire.requestFrom(DS1307_ADDRESS, 7);

int second = bcdToDec(Wire.read());
int minute = bcdToDec(Wire.read());
int hour = bcdToDec(Wire.read() & 0b111111); //24 hour time
int weekDay = bcdToDec(Wire.read()); //0-6 → sunday - Saturday
int monthDay = bcdToDec(Wire.read());
int month = bcdToDec(Wire.read());
int year = bcdToDec(Wire.read());

//print the date EG 3/1/11 23:59:59
Serial.print(monthDay);
Serial.print("/");
Serial.print(month);
Serial.print("/");
Serial.print(year);
Serial.print(" “);
Serial.print(hour);
Serial.print(”:");
Serial.print(minute);
Serial.print(":");
Serial.println(second);

}
*/

peut-être parce que les pins 9 et 10 utilisent le même timer ? Essaie en mettant ton moteur sur la pin 6 par exemple.

Merci pour ta réponse, ça fonctionne maintenant! Bonne journée!

super ! Bonne journée à toi aussi.