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

crecker
Offline
Зарегистрирован: 15.12.2013

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

Такой вопрос.  Нужно запрограммировать мотор, с помощью светового барьера http://www.ia.omron.com/data_pdf/data_sheet/ee-spx-w_dsheet_csm474.pdf следить за его вращением. Если контакт  с фототранзистором теряется. тоесть счет циклов прикращается программа останавливает мотор.

Пока программа выглядит так:

int Motor=3;   //  Две ноги для управления мотором с помощью шим
int PWM=4;    // 
int duty cycle;
int Phototransistor=2;
int Zyklus;
volatile long x=0;

void setup(){
  Serial.begin(9600);
  pinMode(2, INPUT); // фотосенсор, цифровой вход
 pinMode(3, OUTPUT); //  мотор привязан к цыфровым выходам 3,4
 pinMode(4, OUTPUT);
 duty cycle=90;
attachInterrupt(0,count,RISING); // для фиксации циклов
}

void loop()
{
  digitalWrite(4,LOW);   // Направление вращения мотора
  //digitalWrite(3, HIGH);
  analogWrite(3, duty cycle);
   

}

void count()             //  функция для подсчета циклов
{
  long value = x++;        // или  x++;  для
  Serial.println(value);  //
 
}

Как можно написать функцию для того,чтобы мотор  остановился ( duty cycle =0 ), если счет  циклов больше не возможен. К мотору прикрепится шайба с отсутствующим сегментом, которая будет проходить через световой барьер

 

maksim
Offline
Зарегистрирован: 12.02.2012
void loop()
{
  if(millis()-x > 100)
  {
    // стоп машина!
  }
.....
}

void count()             
{
  x = millis();      
}

 

crecker
Offline
Зарегистрирован: 15.12.2013

что значит  > 100)  ?

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

void loop()
{
if(millis()-x > 100)
{
// стоп машина!
}
.....
}

void count()
{
x = millis();
}

x это же не время, а количество циклов. А если просто взять и убрать рукой фототранзистор, тоесть контакт с мотором пропал. Эта функция сработает ?

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

Да, так как attachInterrupt(0,count,RISING); ловит именно фронт сигнала, то есть изменеие с 0 на 1, а значит если отключить датчик изменеий не будет.

crecker
Offline
Зарегистрирован: 15.12.2013

Тоесть вот так правильно ( весь код)

int Motor=3;   //
int PWM=4;
int duty cycle;
int Lichtschranke=2;
//int Zyklus;
volatile long x=0;

void setup(){
  Serial.begin(9600);
  pinMode(2, INPUT);
  pinMode(3, OUTPUT);
  pinMode(4, OUTPUT);
  //digitalWrite(4,LOW);
  //digitalWrite(3, HIGH);
  duty cycle=90;
attachInterrupt(0,count,RISING);
}

void loop ()

{

digitalWrite(4,LOW);
analogWrite(3,duty cycle);
if (millis()-x>100)
{duty cycle=0}

void count()
{
  x=millis();
 
}

а если Serial.print (x) то количество  циклов не будет видно ?

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

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

http://arduino.ru/forum/obshchii/vstavka-programmnogo-koda-v-temukommentarii

а то читается тяжеловато да и принято так

crecker
Offline
Зарегистрирован: 15.12.2013
void loop()
{
  if(millis()-x > 100)
  {
    // стоп машина!
  }
.....
}

void count()             
{
  x = millis();      
}

не работает :(

crecker
Offline
Зарегистрирован: 15.12.2013

Народ. подкиньте еще идейку  ппиз

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

crecker пишет:

void loop()
{
  if(millis()-x > 100)
  {
    // стоп машина!
  }
.....
}

void count()             
{
  x = millis();      
}

не работает :(

Это как раз таки работает, "не работает" ваш код из #6 сообщения. Нет такой неисправности "не работает", все работает только не так как вы это себе представляете. А так как что у вас происходит вы не пишите то думайте сами что у вас "не работает".

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

Опишите или покажите схему подключения датчика и двигателя.

crecker
Offline
Зарегистрирован: 15.12.2013

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

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

За какое время двигатель набирает рабочие обороты и вообще на каких оборотах работает двигатель?

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

crecker пишет:

отключил датчик, но мотор продолжает крутится.

Отключение датчика не есть обрыв провода. В сетап добавьте строку digitalWrite(2, HIGH);

crecker
Offline
Зарегистрирован: 15.12.2013
void loop()
{
  if(millis()-x > 100)
  {
    // стоп машина!
  }
.....
}

void count()             
{
  x = millis();      
}

ну попробую, я извеняюсь, конечно, а что это  счет времени в  if условии. Можно в двух словах?

 

maksim
Offline
Зарегистрирован: 12.02.2012
#define PWM_pin   3
#define Motor_pin 4

volatile unsigned long x = 0;
byte pwm = 90;

void setup()
{
  Serial.begin(9600);

  pinMode(PWM_pin, OUTPUT);
  pinMode(Motor_pin, OUTPUT);

  digitalWrite(2, HIGH);
  attachInterrupt(0, count, RISING);
}

void loop ()
{
  static bool work = 0;
  if(!work && millis() > 3000) work = 1;

  if(work && millis()-x > 100) pwm = 0;
  analogWrite(PWM_pin, pwm);

  static byte prev_x = 0;
  if(x != prev_x) Serial.println(x);
  prev_x = x;
}

void count()
{
  x = millis();
}

Скопируйте начальные значения из монитора порта и вставьте сюда как код.

crecker
Offline
Зарегистрирован: 15.12.2013

А что значит больше 3000? Если это важно мотор должен крутится 400 раз в минуту, поддерживая это количество оборотов.

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

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

crecker
Offline
Зарегистрирован: 15.12.2013

А почему именно 3 секунды, просто не совсем уловил Вашу мысль.

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

А потому что вы на задаваеваемые вам вопросы не отвечаете.

crecker
Offline
Зарегистрирован: 15.12.2013

Ну я ж говорю у меня мотор. расчитан на  4000 оборотов  в холостую,  при нагрузке  на  400. Cкорость  разбега зависит от скважности, да и в принципе не важна.

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

Ну так если вы знаете что важно, а что нет, то зачем тогда тему создавали?

Не хотите давать нужную информацию, тогда варитесь дальше сами, мне надоело просто так по клавиатуре стучать. Удаляюсь. Ожидайте телепатов и экстрасенсов, они помогут.

crecker
Offline
Зарегистрирован: 15.12.2013

Ладно, скажите еще раз. какие параметры Вас интересуют?  Количество оборотов 400 в минуту, с помощью сенсора считаются циклы, при потере связи с сенсором мотор останавливается.

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

#16

crecker
Offline
Зарегистрирован: 15.12.2013

ок, спасиб. А можно как-то вставить условие  для регулирования вращения. Ну, например каждые 5 секунд. Если крутится быстрее. замедляется, если медленнее, то ускоряется? Ну что-то типо  (if Period-LOW>HIGH)  { duty cycle=duty cycle+1);

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

crecker пишет:

ок

Что ок??? Прочтите сообщение #16 что в нем написано???

com
Offline
Зарегистрирован: 06.09.2013

о! новая серия бесконечного сериала "летят два крокодила один зеленый другой в африку сколько ёжику лет"

:)

vvadim
Offline
Зарегистрирован: 23.05.2012

crecker, вам бесплатно помогают и тратят на это своё время. Вы или адекватно сотрудничайте с ПОМОГАЮЩИМ или ваши вопросы останутся без ответов. Здесь  никто никому ничего не должен.

crecker
Offline
Зарегистрирован: 15.12.2013
43439
19439
19439
19439
19439
19439
19439
19439
19439
19439
19439
19439
19439
19439
19439
19439
19439
19439
19439
 
Это то что, выдает монитор порта

 

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

Еще разок:

#define PWM_pin   3
#define Motor_pin 4

volatile unsigned long x = 0;
byte pwm = 90;

void setup()
{
  Serial.begin(9600);

  pinMode(PWM_pin, OUTPUT);
  pinMode(Motor_pin, OUTPUT);

  digitalWrite(2, HIGH);
  attachInterrupt(0, count, RISING);
}

void loop ()
{
  static bool work = 0;
  if(!work && millis() > 3000) work = 1;

  if(work && millis()-x > 100) pwm = 0;
  analogWrite(PWM_pin, pwm);

  static uint32_t prev_x = 0;
  if(x != prev_x) Serial.println(x);
  prev_x = x;
}

void count()
{
  x = millis();
}

Теперь что в мониторе?

crecker
Offline
Зарегистрирован: 15.12.2013
48
99
102
125
134
146
153
161
162
180
196
202
208
209
217
238
248
249
263
275
284
291
297
313
318
329
340
349
370

 

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

Ну вот теперь видно, что двигатель довольно быстро набирает обороты, поэтому можно задержку снизить с 3 секунд до 1 или даже полусекунды. И видно что за оборот (одно срабатывание датчика) проходит около 10-20 миллисекунд. Если остановить двигатель или отключить датчик, то через 1 десютую секунды на 3 выводе дуины будет 0. Ну а на вопрос почему у вас не останавливается двигатель ответить можете только вы все по тем же причинам. 

Про регулирование оборотов двигателя читайте тут.

 

crecker
Offline
Зарегистрирован: 15.12.2013

Теперь срабатывает, большое спасибо.  Добавил в  interrupt  еще y++, чтобы считать циклы паралельно с времени, вот тогда не срабатывает, то есть мотор крутится дальше.