Помогите новичку разобраться

Использование Arduino/CraftDuino (Freeduino, Seeduino, ...).

Помогите новичку разобраться

Сообщение Bars22Rus » 02 мар 2016, 20:51

Приветствую!
В общем начал осваивать потихому - уткнулся, не понимаю как обойти.
Запустил двиг шаговый, регулирую скорость врашения потенциометром, меняю направление кнопкой, всё в порядке. Захотел посмотреть значение скорости, да так что бы данные не бомбили постоянно а к примеру ч/з 0.5 сек. Забиваю функцию, а движок подаёт импульсы ч/з эти 0.5 сек. Как решить грамотно проблему?
Спасибо!
Код: Выделить всё
int motorPin1 = 8; // Blue / Синий - 28BYJ48 pin 1

int motorPin2 = 9; // Pink / Розовый - 28BYJ48 pin 2

int motorPin3 = 10; // Yellow / Желтый - 28BYJ48 pin 3

int motorPin4 = 11; // Orange / Оранжевый - 28BYJ48 pin 4

int buttonPin = 12; // кнопку подключаем к Pin 12.

boolean q; // фиксируем нажатие на кнопку.

// установить скорость шагового двигателя.

//variable to set stepper speed.

int motorSpeed = 1200;

int lookup[8] = {

B01000, B01100, B00100, B00110, B00010, B00011, B00001, B01001};

/////////////////////////////////////////////////////////////////

void setup() {

// declare the motor pins as outputs.

pinMode(motorPin1, OUTPUT);

pinMode(motorPin2, OUTPUT);

pinMode(motorPin3, OUTPUT);

pinMode(motorPin4, OUTPUT);

// Одна нога кнопки подключается к GND, другая к Pin № 12

// (никаких внешних резисторов не нужно).

pinMode(buttonPin, INPUT);

digitalWrite(buttonPin, HIGH);

 Serial.begin(9600);

}

void loop(){

// переменный резистор, крутим резистор меняем скорость вращения.


 int VariableResistor = analogRead(A0);

  motorSpeed = map(VariableResistor, 0, 1023, 10000, 1100);


if (digitalRead(buttonPin) == LOW) // если кнопка нажата.

{

q = !q; // меняем значение q на противоположное 0 на 1 или 1 на 0.

                  delay(300); // защита от дребезга кнопки.
 
}

{
  Serial.println(motorSpeed);
 
  delay(500);
}



if (q == 1)anticlockwise(); // крутим влево.

else clockwise(); // крутим вправо.

}

// --------------------------------

//set pins to ULN2003 high in sequence from 1 to 4

//delay "motorSpeed" between each pin setting (to determine speed)

// функция поворачивает мотор против часовой стрелки.

void anticlockwise()

{

for(int i = 0; i < 8; i++)

{

setOutput(i);

delayMicroseconds(motorSpeed);


}

}

// функция поворачивает мотор по часовой стрелке.

void clockwise()

{

for(int i = 7; i >= 0; i--)

{

setOutput(i);

delayMicroseconds(motorSpeed);


}
 
}

void setOutput(int out)

{

digitalWrite(motorPin1, bitRead(lookup[out], 0));

digitalWrite(motorPin2, bitRead(lookup[out], 1));

digitalWrite(motorPin3, bitRead(lookup[out], 2));

digitalWrite(motorPin4, bitRead(lookup[out], 3));

}


Bars22Rus
 
Сообщения: 4
Зарегистрирован: 10 июл 2015, 19:29

Re: Помогите новичку разобраться

Сообщение Bars22Rus » 03 мар 2016, 08:39

Было поздно написал не совсем понятно :)
Дело так обстоит после ввода команды
Код: Выделить всё
{
  Serial.println(motorSpeed);
 
  delay(500);
}

двигатель прекращает своё вращение и как паралитик дёргается каждые 0.5 сек.
Bars22Rus
 
Сообщения: 4
Зарегистрирован: 10 июл 2015, 19:29

Re: Помогите новичку разобраться

Сообщение admin » 03 мар 2016, 10:15

Всё правильно - вы же ставите задержку в главный цикл - вот он и прерывается на пол-секунды.
Чтобы такого не было - можно воспользоваться приёмом описанным в заметке Blink без delay.
В вашем случае:
Код: Выделить всё
long previousMillis = 0; // здесь будет храниться время последнего выполнения операции
// ...
int motorSpeed = 1200;

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

void loop() {
  // код для постоянного выполнения
  // ...

  // проверяем – настало ли время выполнения операции
  // для этого берём разность между текущим временем и
  // временем последнего изменения
  if (millis() - previousMillis > 500) {
    previousMillis = millis();  // запоминаем текущее время
    Serial.println(motorSpeed);
  }
}


Либо, можно воспользоваться библиотекой TimerOne.
Аватара пользователя
admin
Администратор
 
Сообщения: 315
Зарегистрирован: 05 май 2011, 14:57
Откуда: Калининград

Re: Помогите новичку разобраться

Сообщение Bars22Rus » 03 мар 2016, 12:22

Премного благодарен! :a_g_a:
Bars22Rus
 
Сообщения: 4
Зарегистрирован: 10 июл 2015, 19:29

Re: Помогите новичку разобраться

Сообщение NikolaKoren » 04 июн 2016, 00:08

Не могу понять как программно наклонять кривую зависимости одного параметра от другого, например температуры в батареях от температуры на улице. Кто может помочь разобраться?
NikolaKoren
 
Сообщения: 1
Зарегистрирован: 04 июн 2016, 00:04
programming: с++


Вернуться в Общие вопросы

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 4

cron
© 2009-2017 |  О проекте  |  Политика Конфиденциальности  |