Игнорируются операции с мотор-редукторами

Andrey4849
Offline
Зарегистрирован: 28.11.2018

При одновременном кодировании сервы и мотор-редукторов, работает только серва.

Отдельно всё работает.


#include <Servo.h> 
#define Trig A0
#define Echo A1 
Servo myservo;


int Left_motor=8;     
int Left_motor_pwm=9;     

int Right_motor_pwm=10; 
int Right_motor=11;  

int key=A2;
int beep=A3;

const int SensorRight = 3;   
const int SensorLeft = 4;     	

int SL;    
int SR;    

void setup()
{
  myservo.attach(12);
  myservo.write(0);
  pinMode(Trig,OUTPUT);
  pinMode(Echo,INPUT);
  pinMode(Left_motor,OUTPUT); 
  pinMode(Left_motor_pwm,OUTPUT); 
  pinMode(Right_motor_pwm,OUTPUT);
  pinMode(Right_motor,OUTPUT);
  pinMode(13, OUTPUT);
  Serial.begin(9600);  
}
void hod()     
{
digitalWrite(Right_motor,HIGH);  
digitalWrite(Right_motor_pwm,LOW);      
   analogWrite(Right_motor_pwm,150);
  
  
digitalWrite(Left_motor,HIGH);  
digitalWrite(Left_motor_pwm,HIGH);     
   analogWrite(Left_motor_pwm,150);
}
void levo()         
{
  digitalWrite(Right_motor,LOW);  
  digitalWrite(Right_motor_pwm,HIGH);       
  analogWrite(Right_motor_pwm,250);
  
  digitalWrite(Left_motor,HIGH);  
  digitalWrite(Left_motor_pwm,HIGH);     
  analogWrite(Left_motor_pwm,250);  
}
void pravo()      
{
  digitalWrite(Right_motor,HIGH);  
  digitalWrite(Right_motor_pwm,HIGH);      
  analogWrite(Right_motor_pwm,250);
  
  digitalWrite(Left_motor,LOW);  
  digitalWrite(Left_motor_pwm,HIGH);     
  analogWrite(Left_motor_pwm,250); 
}
void keysacn()
{
  int val;
  val=digitalRead(key);
  while(!digitalRead(key))
  {
    val=digitalRead(key);
  }
  while(digitalRead(key))
  {
    delay(10);	//
    val=digitalRead(key);
    if(val==HIGH)  
    {
      digitalWrite(beep,HIGH);		
      while(!digitalRead(key))	
        digitalWrite(beep,LOW);	
    }
    else
      digitalWrite(beep,LOW);
  }
  
  }
  
  int zamer1()
  { myservo.write(0);
  digitalWrite(Trig,HIGH);
  delayMicroseconds(500);
  digitalWrite(Trig, LOW);
  unsigned int impulseTime1=pulseIn(Echo, HIGH);
  unsigned int distance_sm1=impulseTime1/58.65;
  return distance_sm1;
  }
  int zamer2()
  { myservo.write(45);
  digitalWrite(Trig,HIGH);
  delayMicroseconds(500);
  digitalWrite(Trig, LOW);
  unsigned int impulseTime2=pulseIn(Echo, HIGH);
  unsigned int distance_sm2=impulseTime2/58.65;
  return distance_sm2;
  }
  int zamer3()
  { myservo.write(135);
  digitalWrite(Trig,HIGH);
  delayMicroseconds(500);
  digitalWrite(Trig, LOW);
  unsigned int impulseTime3=pulseIn(Echo, HIGH);
  unsigned int distance_sm3=impulseTime3/58.65;
  return distance_sm3;
  }
   int zamer4()
  { myservo.write(180);
  digitalWrite(Trig,HIGH);
  delayMicroseconds(500);
  digitalWrite(Trig, LOW);
  unsigned int impulseTime4=pulseIn(Echo, HIGH);
  unsigned int distance_sm4=impulseTime4/58.65;
  return distance_sm4;
  }
  

void loop()
{
  hod();
 unsigned int  distance_sm1=zamer1();
  delay(1000);
 unsigned int  distance_sm2=zamer2();
  delay(1000);
  unsigned int distance_sm3=zamer3();
  delay(1000);
 unsigned int  distance_sm4=zamer4();
  delay(1000);
  if (distance_sm2-distance_sm3>2)
  {levo();
  delay(100);
  }
  else if (distance_sm3-distance_sm2>2)
  {pravo();
  delay(100);
  }
  else {
    hod();
    delay(100);
  }
  }

 

b707
Offline
Зарегистрирован: 26.05.2017

и не должно. Библиотека Servo занимает тот же таймер, что управляет PWM на пинах 9 и 10.

Цитата из описания Servo.h :

On boards other than the Mega, use of the library disables analogWrite() (PWM) functionality on pins 9 and 10, whether or not there is a Servo on those pins.

Иногда полезно читать мануалы :)

sadman41
Offline
Зарегистрирован: 19.10.2016

Она еще, мерзавка, с софтсериалом конфликтует... В результате чего, если жить на либах, сервы+dfplayer=приключение

Andrey4849
Offline
Зарегистрирован: 28.11.2018

Спасибо большое за ответ, я все понял