Здравствуйте, Я хочу сделать так, чтобы мотор запускался и работал в течении, определенного, отрезка времени (а так же в нужном направлении) в момент, когда pir-сенсор фиксирует движение. Если подробнее, то когда я провожу рукой в левую сторону - мотор крутится влево, в правую - вправо, нет движения - мотор спит. Посему, хотел бы проконсультироваться верны ли мои мысли по части составления скетча. Для управления мотором использую этот скетч: #define SPEED_LEFT 6 #define SPEED_RIGHT 5 #define DIR_LEFT 7 #define DIR_RIGHT 4 void go(int speed, bool reverseLeft, bool reverseRight, int duration) { analogWrite(SPEED_LEFT, speed); analogWrite(SPEED_RIGHT, speed); digitalWrite(DIR_LEFT, reverseLeft ? LOW : HIGH); digitalWrite(DIR_RIGHT, reverseRight ? LOW : HIGH); delay(duration); } void setup() { for(int i = 5; i <= 8; i++) pinMode(i, OUTPUT); } void loop() { // Вращение go(255, false, true, 5000); // Пауза go(0, false, false, 1000); // Вращение go(255, true, false, 5000); // Пауза go(0, false, false, 1000); } Я догадываюсь, что при подключении pir-сенсора, мне нужно прописать его пины в шапке скетча, потом каким-то образом оформить его как звено управляющее мотором и задать направление движения мотора при фиксировании движения влево/вправо. Сейчас у меня мотор включается автоматом, но это и так понятно, потому, что скетч написан немного не по данной теме. Просто взял его за основу, потому что в нем я понимаю, что за что отвечает и с изменениями хочу его расширить. Реально ли это и правильно ли я думаю? Заранее спасибо.
Это полуреально. Смотрите, обычно пироэлектрические датчики в сыром виде умеют сообщать о направлении. Но если говорить о том, что в Амперке, там эта функция зарезана и он просто выдаёт сигнал если есть движение. Поэтому нужно использовать либо 2 датчика, либо сделать свой: поставить каскад из операционных усилителей, фильтр по питанию, линзу и т.п. С точки зрения алгоритма всё достаточно просто: Код (Text): void setup() { pinMode(MOTOR_DIR_PIN, OUTPUT); pinMode(MOTOR_SPEED_PIN, OUTPUT); } void loop() { bool left = !digitalRead(LEFT_PIR_SENSOR); bool right = !digitalRead(RIGHT_PIR_SENSOR); if (!left && !right) return; digitalWrite(MOTOR_DIR_PIN, left ? LOW : HIGH); analogWrite(MOTOR_SPEED_PIN, 255); delay(TIME_TO_SPIN); analogWrite(MOTOR_SPEED_PIN, 0); }
Хотел бы прояснить для себя некоторые моменты: Шапка скетча остается такая?: #define SPEED_LEFT 6 #define SPEED_RIGHT 5 #define DIR_LEFT 7 #define DIR_RIGHT 4 void go(int speed, bool reverseLeft, bool reverseRight, int duration) { analogWrite(SPEED_LEFT, speed); analogWrite(SPEED_RIGHT, speed); digitalWrite(DIR_LEFT, reverseLeft ? LOW : HIGH); digitalWrite(DIR_RIGHT, reverseRight ? LOW : HIGH); delay(duration); } - в строке bool left=!digitalRead(LEFT_PIR_SENSOR); bool right=!digitalRead(RIGHT_PIR_SENSOR); - bool left отвечает за датчик размещенный слева, а bool right - справа, или это параметры для одного датчика? void setup() { pinMode(MOTOR_DIR_PIN, OUTPUT); - тут в скобках касательно моего кода (DIR_LEFT, OUTPUT) ??? pinMode(MOTOR_SPEED_PIN, OUTPUT); - тут в скобках касательно моего кода (SPEED_LEFT, OUTPUT) ??? } void loop() { bool left = !digitalRead(LEFT_PIR_SENSOR); bool right = !digitalRead(RIGHT_PIR_SENSOR); if (!left && !right) return; digitalWrite(MOTOR_DIR_PIN, left ? LOW : HIGH); - тут в скобках касательно моего кода (DIR_LEFT, left ? LOW:HIGH) ??? analogWrite(MOTOR_SPEED_PIN, 255); - тут в скобках касательно моего кода (SPEED_LEFT, 255) ??? delay(TIME_TO_SPIN); - в скобках ставится время задержки, насколько я понял... analogWrite(MOTOR_SPEED_PIN, 0); - в скобках (DIR_LEFT, 0) ??? }
Уф, оф. Пора организовывать ликбез по программированию. Шапка нет: тепеь вам нужно определить только MOTOR_DIR_PIN и MOTOR_SPEED_PIN. Типа: Код (Text): #define MOTOR_DIR_PIN 6 // пин для управления направлением #define MOTOR_SPEED_PIN 5 // пин для управления скоростью bool left и right — это да, 2 датчика. Писал касательно вашего кода.