написание скетча для управления оборотами двигателя
- Войдите на сайт для отправки комментариев
Ср, 18/12/2013 - 15:19
помогите написать скетч для управления двигателем
при достижении двигателем 300 оборотов подавался сигнал на размыкание реле длительностью 30 сек которое будет отключать двигатель на это время
у меня есть индуктивный датчик оборотов который установлен на двигателе. плата ардуино Нано 2. реле
спасибо
К сожалению просто так не получится подключить датчик к дуине, а дуиной просто так не получится управлять реле. Для первого нужна схема согласования (на делителе и стабилитроне, ОУ или оптроне например) ,а для второго как минимум транзистор, резистор и диод (да и тоже опторазвязка не помешала бы).
если объединить чтение кода грея с датчика (энкодера) с его декодированием
ну если автор теперь знает как подключать, можно сделать так например
01
// 300 об/мин = 5 об/сек. Время одного оборота 0,2с или 200мс
02
#define rele 10 // вывод для управления реле, не напрямую,
03
// а через развязывающее и согласующее устройство
04
volatile unsigned
long
time = 0;
//Время срабатывания датчика
05
volatile boolean flag = 0;
06
unsigned
long
time_old = 0;
//предыдущее время
07
int
speed = 0;
08
09
10
void
setup
(){
11
attachInterrupt(0, impuls, RISING);
//Прерывание по нарастающему фронту на D0
12
pinMode(rele, OUTPUT);
13
digitalWrite(rele, LOW);
14
}
15
16
void
loop
(){
17
18
if
(flag == 1){
19
speed = 60000/(time-time_old);
//вычисляем скорость в об/мин, может вы захотите знать текущую скорость и выводить на дисплей
20
time_old = time;
21
flag = 0;
22
}
23
if
(speed >= 300){
24
digitalWrite(rele, HIGH);
25
}
26
else
{
27
digitalWrite(rele, LOW);
28
}
29
}
30
31
void
impuls(){
// сработал датчик
32
time = millis();
33
flag = 1;
34
}
только ищу исполнителя это подразумевается за деньги. вы просили просто так, значит соответственно или я затупил и рано дал код))) или вы не собирались платить. а это я к тому что можно было просто создать тему в разделе програмирование
и еще. millis переполняется через 50 дней. имейте в виду
спасибо
К сожалению просто так не получится подключить датчик к дуине, а дуиной просто так не получится управлять реле. Для первого нужна схема согласования (на делителе и стабилитроне, ОУ или оптроне например) ,а для второго как минимум транзистор, резистор и диод (да и тоже опторазвязка не помешала бы).
Смотря какая дуина, на Carduino Nano V.7 есть высовольтный вход и силовой выход 500мА
забыл кстати добавить 30 сек задержки/ немного подкорректировал программу. избавился от флага. надеюсь ничего не напутал
01
// 300 об/мин = 5 об/сек. Время одного оборота 0,2с или 200мс
02
#define rele 10 // вывод для управления реле, не напрямую,
03
// а через развязывающее и согласующее устройство
04
volatile unsigned
long
time = 0;
//Время срабатывания датчика
05
volatile unsigned
long
time_old = 0;
//предыдущее время
06
int
speed = 0;
07
08
09
void
setup
(){
10
attachInterrupt(0, impuls, RISING);
//Прерывание по нарастающему фронту на D0
11
pinMode(rele, OUTPUT);
12
digitalWrite(rele, LOW);
13
delay(5000);
//подождем 5 сек в начальном этам на всякий случай
14
}
15
void
loop
(){
16
speed = 60000/(time-time_old);
//вычисляем скорость в об/мин,
17
// может вы захотите знать текущую скорость и выводить на дисплей
18
if
(speed >= 300){
19
digitalWrite(rele, HIGH);
20
}
21
else
{
22
digitalWrite(rele, LOW);
23
}
24
delay(30000);
25
}
26
void
impuls(){
// сработал датчик
27
time_old = time;
28
time = millis();
29
}
Только задержку переместите в условие иначе условие будет проверяться раз в 30 секунд.
да кстати. спасибо максим
спасибо
спасибо
а деньги?
спасибо
а деньги?
да забей
спасибо
а деньги?
да забей
Это дело принципа - каждый труд должен быть оплачен.
Причем достойно:
Бери всю пачку - "я себе еще напечатаю" (c)
а плата может быть только в деньгах?
если у тебя есть дети сомневаюсь что ты просишь с них деньги за то что ты для них делаешь. это если в общем. автор не мой ребенок конечно. но в принципе если бы тебе сейчас дали 100 рублей ты был бы счастливее?
можешь связаться со мной по эл почте sloutskypavel@gmail.com по вопросу проекта и стоимости спасибо
можешь связаться со мной по электронке
нужна полная схема твоих подлючений. а также твоего датчика оборотов. будем выяснять почему не работает
01
// 300 об/мин = 5 об/сек. Время одного оборота 0,2с или 200мс
02
#define rele 10 // вывод для управления реле, не напрямую,
03
// а через развязывающее и согласующее устройство
04
volatile unsigned
long
time = 0;
//Время срабатывания датчика
05
volatile unsigned
long
time_old = 0;
//предыдущее время
06
int
speeed = 0;
07
08
09
void
setup
(){
10
Serial
.begin(9600);
11
attachInterrupt(0, impuls, RISING);
//Прерывание по нарастающему фронту на D2
12
pinMode(rele, OUTPUT);
13
digitalWrite(rele, LOW);
14
delay(5000);
//подождем 5 сек в начальном этам на всякий случай
15
}
16
void
loop
(){
17
speeed = 60000/(time-time_old);
//вычисляем скорость в об/мин,
18
// может вы захотите знать текущую скорость и выводить на дисплей
19
if
(speeed >= 300){
20
digitalWrite(rele, HIGH);
21
delay(30000);
22
}
23
else
{
24
digitalWrite(rele, LOW);
25
}
26
Serial
.println(speeed);
27
}
28
void
impuls(){
// сработал датчик
29
time_old = time;
30
time = millis();
31
}
будем отправлять в терминал текущие значения скорости
датчик подключен к входу D2 выход реле к D10. питание на реле от 5В и GND c платы. от датчика только 1 провод сигнала на D2. датчик получает питание от АКБ 12В.
землю датчика подключали к земле ардуины? на выходе датчика какая амплитуда? не 12В?
8 В
вы 8 В подаете на вход ардуины без делителя?
да
вы читали описание? сколько можно максимум подавать на вход. вход скорее всего сдох. но навсякий случай через digitalread проверьте вход. может еще живой
вставил этот скетч на мониторе показывает ON OFF
считывает и передает
при подводе магнита к датчику
простотите, что сую свой нос в разговор..
сигна напрямую от датчика на плату
нет напрямую нельзя. повезло что работает. а то что вы привели это что можно подавать на внешнее питание
сделайте делитель на входе чтобы получилось около 5 вольт. можно меньше
ошибся выходной сигнал 3,5В
на VIN подал 5В с выхода табло
на vin нельзя подавать меньше 7В, лучше подай с аккамулятора. а до этого чем питал? с USB? реле питаешь от ардуины?
каким образом измерял амплитуду сигнала с датчика?
сначала от USB потом от 5В с табло на VIN. питание реле от ардуины. вольтметром
на vin подай с аккамулятора
как можно точнее как измерял?
пришли параметры реле которое используешь
New 5V 2-Channel Relay Module Shield for Arduino ARM PIC AVR DSP Electronic 10A
+ на сигнальный провод -GND получил 3,35В когда поднес к датчику магнит получил 0,66В DC
сделайте то что говорил ранее про питание и попробуйте снова. в терминале смотрите скорость
включил двигатель поднес датчик на табло обороты.
на мониторе ничего. когда загорается лампочка на реле на мониторе показывает обороты. через некоторое время лампочка гаснет выключаеться реле и обороты на мониторе зависают(как старт-стоп).
в обычном режиме схема подключена к АКБ реле срабатывает само. долго горит лампа(контакт реле замкнут) потом отключаеться сек 20 и потом снова вкл. это при неподключенном датчике
возможно что временной порог действует не так
если сделать скетч без времени чисто на обороты превысил порог 300 включил реле упали выключил
закоментируй задержку на 30 сек и тестируй
провел испытание с актуатором
уберите первую задержку на 5 сек чтобы не мешало
что значит срабатывает вперед назад? включается выключается?
да
убрал задержку 5000 и( 30000 уменьшил до 10000)
когда обороты доходят до нуля и включаю обороты срабатывает нормально
если уменьшаю обороты до 220 начинает пульсировать (вкл-выкл)
задержка в 5 сек впринципе нужна только при запуске как контроль работы
осциллограф есть? надо посмотреть что по входу с датчика. странно ведет себя ардуина. реле управляется высоким уровнем? точнее при подаче высокого уровня у вас замыкается или размыкается цепь?
01
#define rele 10
02
volatile unsigned
long
time = 0;
//Время срабатывания датчика
03
volatile unsigned
long
time_old = 0;
//предыдущее время
04
int
speeed = 0;
05
06
void
setup
(){
07
Serial
.begin(9600);
08
attachInterrupt(0, impuls, RISING);
//Прерывание по нарастающему фронту на D2
09
pinMode(rele, OUTPUT);
10
digitalWrite(rele, LOW);
11
//delay(5000); //подождем 5 сек в начальном этам на всякий случай
12
}
13
void
loop
(){
14
speeed = 60000/(time-time_old);
//вычисляем скорость в об/мин
15
if
(speeed >= 300){
16
digitalWrite(rele, LOW);
17
//delay(30000);
18
}
19
else
{
20
digitalWrite(rele, HIGH);
21
}
22
Serial
.println(speeed);
23
}
24
void
impuls(){
// сработал датчик
25
time_old = time;
26
time = millis();
27
}
пробуйте так
вроде первый запуск прошел нормально циркулирует в пределах 300+-15 оборотов реле пульсирует вперед назад за пределами этого порога идет нормально
добавь задержку 5 сек и тестируй
спасибо
когда будет задержка 30 секунд пульсаций вроде не должно быть