Игнорируются операции с мотор-редукторами
- Войдите на сайт для отправки комментариев
Ср, 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=приключение
Спасибо большое за ответ, я все понял