код для Ардуино UNO
изменить код для открытия закрытия раздвижных дверей
необходимо чтобы только при закрытии, датчик ультразвуковой( при повторном приближении) или датчик инфракрасный (при разрыве ) двигатель возвращался назад на то количество шагов которые он уже при закрытий прошел
На данный момент при приближении к датчику ультразвука двери открываются на заданное количество шагов двигателя, затем задержка и двери закрываются на тоже количество шагов двигателя.
#include <Ultrasonic.h>
int sound = 500;
int distance = 0;
Ultrasonic ultrasonic(7, 8);
//Пины управления шаговиком
#define STEP_PIN 2
#define DIR_PIN 3
#define ENABLE_PIN 4
//Здесь можно настроить время поворота и паузы
#define move_forward_time 3000 //время прямого хода в мсек
#define move_back_time 3000 //время обратного хода в мсек
#define pause_time 4000 //время паузы в мсек
#define frequency 1000 //Время между импульсами в мксек. 1000 мксек = 1 мсек = 0.001 сек. Частота следования импульсов 1/0.001 = 1 кГц,
//Не рекомендуется устанавливать время меньше 100 мсек, т.к. частота будет 10 кГц
uint32_t timer = 0;//Таймер для millis()
//Логический флаг для рабочего режима
bool flag = 0;
void setup()
{
pinMode(STEP_PIN , OUTPUT); //Настраиваем пины управления
pinMode(DIR_PIN , OUTPUT);
pinMode(ENABLE_PIN , OUTPUT);
digitalWrite(ENABLE_PIN , HIGH); //Выключаем мотор, чтобы не грелся
}
void loop ()
{ distance = ultrasonic.distanceRead();
if (distance < 40 ) { //Если нажали на кнопку
digitalWrite(ENABLE_PIN , LOW); //Включаем мотор
flag = 1; //Активируем флаг рабочего режима
timer = millis(); //Запускаем таймер
}
if (flag) { //Если флаг активирован
digitalWrite(DIR_PIN , HIGH); //Задаем направление вращения
for (int i = 0; i < 3200; i++) { //Выполняем нужное число шагов 200*16 = 3200 шагов оборот
digitalWrite(STEP_PIN , HIGH);
delayMicroseconds(frequency);
digitalWrite(STEP_PIN , LOW);
}
delay(pause_time); //Пауза pause_time мсек
digitalWrite(DIR_PIN , LOW); //Крутим движок move_back_time мсек
for (int i = 0; i < 3200; i++) { //Выполняем нужное число шагов 200*16 = 3200 шагов оборот
digitalWrite(STEP_PIN , HIGH);
delayMicroseconds(frequency);
digitalWrite(STEP_PIN , LOW);
}
flag = 0;
digitalWrite(ENABLE_PIN , HIGH); //Выключаем движок, чтобы не грелся
}
}
введите или вставьте сюда код
#include <Ultrasonic.h>
int sound = 500;
int distance = 0;
Ultrasonic ultrasonic(7, 8);
//Пины управления шаговиком
#define STEP_PIN 2
#define DIR_PIN 3
#define ENABLE_PIN 4
//Пин ИК датчик
#define start_button 6
//Здесь можно настроить время поворота и паузы
#define move_forward_time 3000 //время прямого хода в мсек
#define move_back_time 3000 //время обратного хода в мсек
#define pause_time 4000 //время паузы в мсек
#define frequency 1000 //Время между импульсами в мксек. 1000 мксек = 1 мсек = 0.001 сек. Частота следования импульсов 1/0.001 = 1 кГц,
//Не рекомендуется устанавливать время меньше 100 мсек, т.к. частота будет 10 кГц
uint32_t timer = 0;//Таймер для millis()
//Логический флаг для рабочего режима
bool flag = 0;
void setup()
{
pinMode(start_button, INPUT_PULLUP); //Подтягиваем ИК датчик к питанию
pinMode(STEP_PIN , OUTPUT); //Настраиваем пины управления
pinMode(DIR_PIN , OUTPUT);
pinMode(ENABLE_PIN , OUTPUT);
digitalWrite(ENABLE_PIN , HIGH); //Выключаем мотор, чтобы не грелся
}
void loop ()
{ distance = ultrasonic.distanceRead();
if (distance < 40 || !digitalRead(start_button)) { //Если УЗД меньше 40 см || ИК датчик поставил на включение потому что не знаю куда его поставить на этом задании
digitalWrite(ENABLE_PIN , LOW); //Включаем мотор
flag = 1; //Активируем флаг рабочего режима
timer = millis(); //Запускаем таймер
}
if (flag) { //Если флаг активирован
digitalWrite(DIR_PIN , HIGH); //Задаем направление вращения
for (int i = 0; i < 3200; i++) { //Выполняем нужное число шагов 200*16 = 3200 шагов оборот
digitalWrite(STEP_PIN , HIGH);
delayMicroseconds(frequency);
digitalWrite(STEP_PIN , LOW);
}
delay(pause_time); //Пауза pause_time мсек
digitalWrite(DIR_PIN , LOW); //Крутим движок move_back_time мсек
for (int i = 0; i < 3200; i++) { //Выполняем нужное число шагов 200*16 = 3200 шагов оборот
digitalWrite(STEP_PIN , HIGH);
delayMicroseconds(frequency);
digitalWrite(STEP_PIN , LOW);
}
flag = 0;
digitalWrite(ENABLE_PIN , HIGH); //Выключаем движок, чтобы не грелся
}
}
Вот скейтч с ИК датчиком только я его добавил во включение двигателя открытие так как не знаю куда его поставить же
не успели
Я уже написал код с Ультрасоником без датчика
#include <Ultrasonic.h>
int sound = 500;
int distance = 0;
Ultrasonic ultrasonic(7, 8);
//Пины управления шаговиком
#define STEP_PIN 11
#define DIR_PIN 3
#define ENABLE_PIN 4
// уровни пина DIR для открывания и закрывания
#define OPEN_DOOR HIGH
#define CLOSE_DOOR LOW
//Здесь можно настроить число шагов и время паузы
#define STEPS 3200 //число шагов для открывания или закрывания
#define pause_time 4000 //время паузы в мсек
//#define frequency 1000 //Время между импульсами в мксек - ФИКСИРОВАНО!!
//Логический флаг для рабочего режима
bool flag = 0;
//Флаг "мотор в работе"
volatile bool stepper_in_progress = 0;
volatile uint16_t step_cnt = 0;
// настройка таймера2 на генерацию импульсов с частотой 1 Кгц на пине 11
void setup_timer2() {
// stop the timer
TCCR2B = 0; TCNT2 = 0;
// set PWM for 50% duty cycle
OCR2A = 128;
// set fast PWM Mode
TCCR2A = (1 << WGM21) | (1 << WGM20);
// set none-inverting mode
TCCR2A |= (1 << COM2A1);
/* Clear pending interrupts */
TIFR2 = 1 << TOV2;
/* Enable Timer 2 Overflow Interrupt */
TIMSK2 = 1 << TOIE2;
// set prescaler 64 and start the timer
TCCR2B |= (1 << CS22);
}
// обработчик прерывания по переполнению таймера2
// при каждом прерывании уменьшаем счетчик, по достижении нуля выключаем ШИМ
ISR(TIMER2_OVF_vect)
{
if (step_cnt) step_cnt--;
else {
TCCR2B = 0; // stop the timer
stepper_in_progress = 0;
}
}
// двигать шаговый в фоне на заданное число шагов в заданном направлении
// на время движения выставить флаг stepper_in_progress = 1
void move_stepper_async(uint8_t dir, uint16_t steps) {
digitalWrite(DIR_PIN , dir);
step_cnt = steps;
stepper_in_progress = 1;
setup_timer2();
}
// остановить шаговый и вернуть НЕПРОЙДЕННОЕ число шагов
uint16_t stop_stepper() {
if (stepper_in_progress) {
TCCR2B = 0; // stop the timer
}
uint16_t tmp = step_cnt;
step_cnt = 0;
stepper_in_progress = 0;
return tmp;
}
void setup()
{
pinMode(STEP_PIN , OUTPUT); //Настраиваем пины управления
pinMode(DIR_PIN , OUTPUT);
pinMode(ENABLE_PIN , OUTPUT);
digitalWrite(ENABLE_PIN , HIGH); //Выключаем мотор, чтобы не грелся
}
void loop ()
{
distance = ultrasonic.distanceRead();
if (distance < 40 ) { //Если нажали на кнопку
digitalWrite(ENABLE_PIN , LOW); //Включаем мотор
flag = 1; //Активируем флаг рабочего режима
}
if (flag) { //Если флаг активирован
move_stepper_async(OPEN_DOOR, STEPS); //Включаем мотор в направлении OPEN_DOOR на STEPS шагов
while (stepper_in_progress) {
delay(10); //ждем окончания движения,
//в это время можно делать что-то полезное
}
delay(pause_time); //Пауза pause_time мсек
move_stepper_async(CLOSE_DOOR, STEPS); //Включаем мотор в направлении CLOSE_DOOR на STEPS шагов
while (stepper_in_progress) { // пока мотор движется
distance = ultrasonic.distanceRead(); //проверяем дистанцию
if (distance < 40 ) { // если есть препятствие
uint16_t steps_to_close = stop_stepper(); // останавливаем мотор и запоминаем число шагов
move_stepper_async(OPEN_DOOR, STEPS - steps_to_close); //откатываем мотор обратно на пройденные шаги
while (stepper_in_progress) delay(10); //ждем окончания движения
}
}
}
flag = 0;
digitalWrite(ENABLE_PIN , HIGH); //Выключаем движок, чтобы не грелся
}
Пояснение - управление шаговиком асинхронно (то есть независимо от основного кода) посредством ШИМ на таймере2.
Пин STEP шаговика должен быть на пине 11
Частота шагов фиксирована, примерно 1 кГЦ
Update - исправил опечатку в 61 строке
Дополнение2 - еще раз исправил
Кажется допер внизу ведь просто прописать на закрытие move_stepper_async(CLOSE_DOOR, STEPS);
и работает . Спасибо!!! все равно я должен отблагодарить .