Игнорируются операции с мотор-редукторами
- Войдите на сайт для отправки комментариев
Ср, 28/11/2018 - 23:14
При одновременном кодировании сервы и мотор-редукторов, работает только серва.
Отдельно всё работает.
#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);
}
}
и не должно. Библиотека 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.
Иногда полезно читать мануалы :)
Она еще, мерзавка, с софтсериалом конфликтует... В результате чего, если жить на либах, сервы+dfplayer=приключение
Спасибо большое за ответ, я все понял