написание скетча для управления оборотами двигателя

Pavlo
Offline
Зарегистрирован: 18.12.2013

помогите написать скетч для управления двигателем

при достижении двигателем 300 оборотов подавался сигнал на размыкание реле длительностью 30 сек которое будет отключать двигатель на это время

у меня есть индуктивный датчик оборотов который установлен на двигателе. плата ардуино Нано 2. реле

спасибо

maksim
Offline
Зарегистрирован: 12.02.2012

К сожалению просто так не получится подключить датчик к дуине, а дуиной просто так не получится управлять реле. Для первого нужна схема согласования (на делителе и стабилитроне, ОУ или оптроне например) ,а для второго как минимум транзистор, резистор и диод (да и тоже опторазвязка не помешала бы).

Pavlo
Offline
Зарегистрирован: 18.12.2013

если объединить чтение кода грея с датчика (энкодера) с его декодированием

jeka_tm
jeka_tm аватар
Offline
Зарегистрирован: 19.05.2013

ну если автор теперь знает как подключать,  можно сделать так например

// 300 об/мин = 5 об/сек. Время одного оборота 0,2с или 200мс
#define rele 10                         // вывод для управления реле, не напрямую,
                                        // а через развязывающее и согласующее устройство
volatile unsigned long time = 0;        //Время срабатывания датчика
volatile boolean flag = 0;
unsigned long time_old = 0;             //предыдущее время
int speed = 0;


void setup(){
  attachInterrupt(0, impuls, RISING);   //Прерывание по нарастающему фронту на D0
  pinMode(rele, OUTPUT);
  digitalWrite(rele, LOW);
}

void loop(){
  
  if (flag == 1){
    speed = 60000/(time-time_old);         //вычисляем скорость в об/мин, может вы захотите знать текущую скорость и выводить на дисплей
    time_old = time;
    flag = 0;
  }
  if(speed >= 300){
    digitalWrite(rele, HIGH);
  }
  else{
    digitalWrite(rele, LOW);
  }
}

void impuls(){          // сработал датчик
  time = millis();
  flag = 1;
}

только ищу исполнителя это подразумевается за деньги. вы просили просто так, значит соответственно или я затупил и рано дал код))) или вы не собирались платить. а это я к тому что можно было просто создать тему в разделе програмирование

и еще. millis переполняется через 50 дней. имейте в виду

Pavlo
Offline
Зарегистрирован: 18.12.2013

спасибо

carduino.ru
Offline
Зарегистрирован: 06.12.2011

maksim пишет:

К сожалению просто так не получится подключить датчик к дуине, а дуиной просто так не получится управлять реле. Для первого нужна схема согласования (на делителе и стабилитроне, ОУ или оптроне например) ,а для второго как минимум транзистор, резистор и диод (да и тоже опторазвязка не помешала бы).

Смотря какая дуина, на Carduino Nano V.7 есть высовольтный вход и силовой выход 500мА

jeka_tm
jeka_tm аватар
Offline
Зарегистрирован: 19.05.2013

забыл кстати добавить 30 сек задержки/ немного подкорректировал программу. избавился от флага. надеюсь ничего не напутал

// 300 об/мин = 5 об/сек. Время одного оборота 0,2с или 200мс
#define rele 10                         // вывод для управления реле, не напрямую,
// а через развязывающее и согласующее устройство
volatile unsigned long time = 0;        //Время срабатывания датчика
volatile unsigned long time_old = 0;             //предыдущее время
int speed = 0;


void setup(){
  attachInterrupt(0, impuls, RISING);   //Прерывание по нарастающему фронту на D0
  pinMode(rele, OUTPUT);
  digitalWrite(rele, LOW);
  delay(5000); //подождем 5 сек в начальном этам на всякий случай
} 
void loop(){ 
  speed = 60000/(time-time_old);          //вычисляем скорость в об/мин, 
  // может вы захотите знать текущую скорость и выводить на дисплей 
  if(speed >= 300){ 
    digitalWrite(rele, HIGH); 
  } 
  else{ 
    digitalWrite(rele, LOW); 
  } 
  delay(30000); 
}
void impuls(){ // сработал датчик 
  time_old = time; 
  time = millis(); 
}

 

 

maksim
Offline
Зарегистрирован: 12.02.2012

Только задержку переместите в условие иначе условие будет проверяться раз в 30 секунд.

jeka_tm
jeka_tm аватар
Offline
Зарегистрирован: 19.05.2013

да кстати. спасибо максим

Pavlo
Offline
Зарегистрирован: 18.12.2013

спасибо

 

Puhlyaviy
Puhlyaviy аватар
Offline
Зарегистрирован: 22.05.2013

Pavlo пишет:

спасибо

 

а деньги?

jeka_tm
jeka_tm аватар
Offline
Зарегистрирован: 19.05.2013

Puhlyaviy пишет:

Pavlo пишет:

спасибо

 

а деньги?

да забей

step962
Offline
Зарегистрирован: 23.05.2011

jeka_tm пишет:

Puhlyaviy пишет:

Pavlo пишет:

спасибо

 

а деньги?

да забей

Это дело принципа - каждый труд должен быть оплачен.

Причем достойно:

Бери всю пачку - "я себе еще напечатаю" (c)

jeka_tm
jeka_tm аватар
Offline
Зарегистрирован: 19.05.2013

а плата может быть только в деньгах?

если у тебя есть дети сомневаюсь что ты просишь с них деньги за то что ты для них делаешь. это если в общем. автор не мой ребенок конечно. но в принципе если бы тебе сейчас дали 100 рублей ты был бы счастливее?

Pavlo
Offline
Зарегистрирован: 18.12.2013

можешь связаться со мной по эл почте sloutskypavel@gmail.com по вопросу проекта и стоимости спасибо

Pavlo
Offline
Зарегистрирован: 18.12.2013

можешь связаться со мной по электронке

jeka_tm
jeka_tm аватар
Offline
Зарегистрирован: 19.05.2013

нужна полная схема твоих подлючений. а также твоего датчика оборотов. будем выяснять почему не работает

// 300 об/мин = 5 об/сек. Время одного оборота 0,2с или 200мс
#define rele 10                         // вывод для управления реле, не напрямую,
// а через развязывающее и согласующее устройство
volatile unsigned long time = 0;        //Время срабатывания датчика
volatile unsigned long time_old = 0;             //предыдущее время
int speeed = 0;


void setup(){
  Serial.begin(9600);
  attachInterrupt(0, impuls, RISING);   //Прерывание по нарастающему фронту на D2
  pinMode(rele, OUTPUT);
  digitalWrite(rele, LOW);
  delay(5000); //подождем 5 сек в начальном этам на всякий случай
} 
void loop(){ 
  speeed = 60000/(time-time_old);          //вычисляем скорость в об/мин, 
  // может вы захотите знать текущую скорость и выводить на дисплей 
  if(speeed >= 300){ 
    digitalWrite(rele, HIGH); 
    delay(30000); 
  } 
  else{ 
    digitalWrite(rele, LOW); 
  } 
  Serial.println(speeed);
}
void impuls(){ // сработал датчик 
  time_old = time; 
  time = millis(); 
}

будем отправлять в терминал текущие значения скорости

Pavlo
Offline
Зарегистрирован: 18.12.2013

датчик подключен к входу D2 выход реле к D10. питание на реле от 5В и GND c платы. от датчика только 1 провод сигнала на D2. датчик получает питание от АКБ 12В.

jeka_tm
jeka_tm аватар
Offline
Зарегистрирован: 19.05.2013

землю датчика подключали к земле ардуины? на выходе датчика какая амплитуда? не 12В?

Pavlo
Offline
Зарегистрирован: 18.12.2013

8 В

 

jeka_tm
jeka_tm аватар
Offline
Зарегистрирован: 19.05.2013

вы 8 В подаете на вход ардуины без делителя?

Pavlo
Offline
Зарегистрирован: 18.12.2013

да

 

jeka_tm
jeka_tm аватар
Offline
Зарегистрирован: 19.05.2013

вы читали описание? сколько можно максимум подавать на вход. вход скорее всего сдох. но навсякий случай через digitalread проверьте вход. может еще живой

 

Pavlo
Offline
Зарегистрирован: 18.12.2013
Microcontroller Atmel ATmega328
Operating Voltage (logic level) 5 V
Input Voltage (recommended) 7-12 V
Input Voltage (limits) 6-20 V
Digital I/O Pins 14 (of which 6 provide PWM output)
Analog Input Pins 8
DC Current per I/O Pin 40 mA
Flash Memory 32 KB (of which 2KB used by bootloader)
SRAM 2 KB
EEPROM 1 KB
Clock Speed 16 MHz
Dimensions 0.70" x 1.70"
 
это его характеристики
Pavlo
Offline
Зарегистрирован: 18.12.2013
void setup()
{
 Serial.begin(9600);
}

void loop()
{
 static uint8_t prev_state = LOW;

 uint8_t state = digitalRead(2);

 if (state != prev_state)
 {
    prev_state = state;
    Serial.println(state == LOW ? "OFF" : "ON");
 }
}

 

вставил этот скетч на мониторе показывает ON OFF

Pavlo
Offline
Зарегистрирован: 18.12.2013

считывает и передает

Pavlo
Offline
Зарегистрирован: 18.12.2013

при подводе магнита к датчику

 

Life23
Offline
Зарегистрирован: 10.08.2013

простотите, что сую свой нос в разговор..

Input Voltage (recommended) 7-12 V
Input Voltage (limits) 6-20 V
 
Это ДО стабилизатора Ардуины.
 
Operating Voltage (logic level) 5 V
 
а это логика и анологовые входы!
 
Pavlo
Offline
Зарегистрирован: 18.12.2013

сигна напрямую от датчика на плату

 

jeka_tm
jeka_tm аватар
Offline
Зарегистрирован: 19.05.2013

нет напрямую нельзя. повезло что работает. а то что вы привели это что можно подавать на внешнее питание

сделайте делитель на входе чтобы получилось около 5 вольт. можно меньше

Pavlo
Offline
Зарегистрирован: 18.12.2013

ошибся выходной сигнал 3,5В

Pavlo
Offline
Зарегистрирован: 18.12.2013

на VIN подал 5В с выхода табло

jeka_tm
jeka_tm аватар
Offline
Зарегистрирован: 19.05.2013

на vin нельзя подавать меньше 7В, лучше подай с аккамулятора. а до этого чем питал? с USB? реле питаешь от ардуины?

каким образом измерял амплитуду сигнала с датчика?

Pavlo
Offline
Зарегистрирован: 18.12.2013

сначала от USB потом от 5В с табло на VIN. питание реле от ардуины. вольтметром

jeka_tm
jeka_tm аватар
Offline
Зарегистрирован: 19.05.2013

на vin подай с аккамулятора

как можно точнее как измерял? 

пришли параметры реле которое используешь

Pavlo
Offline
Зарегистрирован: 18.12.2013

New 5V 2-Channel Relay Module Shield for Arduino ARM PIC AVR DSP Electronic 10A

это реле с EBAY
  • Brand new and high quality.
  • 2-Channel Relay interface board,
  • Just use 5V input signal to control.
  • You can do some simple design about it.
  • This module can be used with Arduino Special Sensor Shield V4.0.
  • Each relay has a normally open, normally closed contact group.
  • It can control various appliances and other equipments with large current.
  • Equiped with high-current relay, AC250V 10A, AC150V 10A,DC30V 10A,DC28V 10A.
  • This is a 2-Channel 5V Relay Module Shield can be controlled directly by a wide range of microcontrollers such as Arduino PIC ARM AVR DSP.
  • Easy to be controlled by a lots of Microcontrollers( Such as Arduino , 8051, AVR, PIC, DSP, ARM, ARM, MSP430, PLC,TTL logic).

 

Pavlo
Offline
Зарегистрирован: 18.12.2013

+ на сигнальный провод -GND получил 3,35В когда поднес к датчику магнит получил 0,66В DC

jeka_tm
jeka_tm аватар
Offline
Зарегистрирован: 19.05.2013

сделайте то что говорил ранее про питание и попробуйте снова. в терминале смотрите скорость

Pavlo
Offline
Зарегистрирован: 18.12.2013

включил двигатель поднес датчик на табло обороты.

на мониторе ничего. когда загорается лампочка на реле на мониторе показывает обороты. через некоторое время лампочка гаснет выключаеться реле и обороты на мониторе зависают(как старт-стоп).

в обычном режиме схема подключена к АКБ реле срабатывает само. долго горит лампа(контакт реле замкнут) потом отключаеться сек 20 и потом снова вкл. это при неподключенном датчике

Pavlo
Offline
Зарегистрирован: 18.12.2013

возможно что временной порог действует не так

если сделать скетч без времени чисто на обороты превысил порог 300 включил реле упали выключил

jeka_tm
jeka_tm аватар
Offline
Зарегистрирован: 19.05.2013

закоментируй задержку на 30 сек и тестируй

Pavlo
Offline
Зарегистрирован: 18.12.2013

провел испытание с актуатором 

в начале делает ход вперед назад в течении 5 сек потом переходит в рабочий режим. когда обороты доходят до 300 стабатывает реле уводит актуатор. после этого понижаю обороты меньше 300 ничего не происходит. но через некоторое время начинает импульсивно сработывать вперед назад с задержкой 1-2 сек
 
 
 
jeka_tm
jeka_tm аватар
Offline
Зарегистрирован: 19.05.2013

уберите первую задержку на 5 сек чтобы не мешало

что значит срабатывает вперед назад? включается выключается?

Pavlo
Offline
Зарегистрирован: 18.12.2013

да

 

Pavlo
Offline
Зарегистрирован: 18.12.2013

 

убрал задержку 5000 и( 30000 уменьшил до 10000)

когда обороты доходят до нуля и включаю обороты срабатывает нормально

если уменьшаю обороты до 220 начинает пульсировать (вкл-выкл)

 

Pavlo
Offline
Зарегистрирован: 18.12.2013

задержка в 5 сек впринципе нужна только при запуске как контроль работы

jeka_tm
jeka_tm аватар
Offline
Зарегистрирован: 19.05.2013

осциллограф есть? надо посмотреть что по входу с датчика. странно ведет себя ардуина. реле управляется высоким уровнем? точнее при подаче высокого уровня у вас замыкается или размыкается цепь?

#define rele 10 
volatile unsigned long time = 0;        //Время срабатывания датчика
volatile unsigned long time_old = 0;             //предыдущее время
int speeed = 0;

void setup(){
  Serial.begin(9600);
  attachInterrupt(0, impuls, RISING);   //Прерывание по нарастающему фронту на D2
  pinMode(rele, OUTPUT);
  digitalWrite(rele, LOW);
  //delay(5000); //подождем 5 сек в начальном этам на всякий случай
} 
void loop(){ 
  speeed = 60000/(time-time_old);          //вычисляем скорость в об/мин
  if(speeed >= 300){ 
    digitalWrite(rele, LOW); 
    //delay(30000); 
  } 
  else{ 
    digitalWrite(rele, HIGH); 
  } 
  Serial.println(speeed);
}
void impuls(){ // сработал датчик 
  time_old = time; 
  time = millis(); 
}

пробуйте так

Pavlo
Offline
Зарегистрирован: 18.12.2013

вроде первый запуск прошел нормально циркулирует в пределах 300+-15 оборотов реле пульсирует вперед назад за пределами этого порога идет нормально

jeka_tm
jeka_tm аватар
Offline
Зарегистрирован: 19.05.2013

добавь задержку 5 сек и тестируй

Pavlo
Offline
Зарегистрирован: 18.12.2013

спасибо

jeka_tm
jeka_tm аватар
Offline
Зарегистрирован: 19.05.2013

когда будет задержка 30 секунд пульсаций вроде не должно быть