помогите остановить шаговик на нужном шаге

kmk
Offline
Зарегистрирован: 22.09.2015

Помогите скэтчем, как остановить шаговик на шаге при минимальном показании датчика на  аналоговом входе А0.

имею:#include <Stepper.h>

 
Stepper stepper();
 
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.
int swrPin = A0;       // pin that the sensor is attached to
int ledPin = 7;           // pin that the LED is attached to
int indLedPin = 13;
 
int swrMin = 0;     // top value min sensor
int swrMax = 1023;        // low value max sensor
int swr = 0;
 
 
 
boolean q; // фиксируем нажатие на кнопку.
int stepCount = 0;  // number of steps the motor has taken
// установить скорость шагового двигателя.
 
int motorSpeed = 2000;
 
// Кол-во сделанных шагов.
 
int count = 0;
 
// Необходимое количество шагов, для одного полного оборота, на (360 градусов).
 
int countsperrev = 170;
 
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);
pinMode(indLedPin, OUTPUT);
pinMode (ledPin, OUTPUT);
// Одна нога кнопки подключается к GND, другая к Pin № 12
// (никаких внешних резисторов не нужно).
pinMode(buttonPin, INPUT);
digitalWrite(buttonPin, HIGH);
 
 
Serial.begin(9600);
 
}
void loop(){
 
   while (digitalRead(buttonPin) == HIGH) 
  {
    tune();
  }
   // signal the end of the calibration period
  digitalWrite(indLedPin, LOW); 
  swr = analogRead(swrPin); 
   if (swr < swrMax) 
  {
    swrMax = swr;                   
  }
   if (swr > swrMin) 
  {
    swrMin = swr;                   
  }
 // apply the calibration to the sensor reading
  swr = map(swr, swrMax, swrMin, 0, 225);
 // sensor value is outside 
swr = constrain(swr, 0, 255);
 // fade the LED using the calibrated value:
  analogWrite(ledPin, swr);    
 
  
if(count < countsperrev )
clockwise();
else if (count == countsperrev * 2)
count = 0;
else
anticlockwise();
count++;
Serial.println(count);
 
 
}
//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);
//Serial.println(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));
 
}
void tune(){
 
 
int count=0;
  swrMax = 255;
  swr = analogRead(swrPin); 
   if (swr < swrMin) 
  {
    swrMin = swr; 
    count = swr;
     
    Serial.print("SWR ");
    Serial.println(count);
                
 
}
 
}

 

 

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

отформатируй код

вставь его по нормальному

объясни что ты делаешь и что тебе нужно

kmk
Offline
Зарегистрирован: 22.09.2015

Спасибо
Шаговый крутит аналоговый датчик
минимальные показания появляются на каком-то шаге мотора
нужно нужно остановить мотор на этом шаге

#include <Stepper.h>
Stepper stepper();
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.
int swrPin = A0; // pin that the sensor is attached to
int ledPin = 7; // pin that the LED is attached to
int indLedPin = 13;

int swrMin = 0; // top value min sensor
int swrMax = 1023; // low value max sensor
int swr = 0;

boolean q; // фиксируем нажатие на кнопку.
int stepCount = 0; // number of steps the motor has taken
// установить скорость шагового двигателя.
int motorSpeed = 2000;
// Кол-во сделанных шагов.
int count = 0;
// Необходимое количество шагов, для одного полного оборота, на (360 градусов).
int countsperrev = 170;
int lookup[8] = {
B01000, B01100, B00100, B00110, B00010, B00011, B00001, B01001};
void setup() {
pinMode(motorPin1, OUTPUT);
pinMode(motorPin2, OUTPUT);
pinMode(motorPin3, OUTPUT);
pinMode(motorPin4, OUTPUT);
pinMode(indLedPin, OUTPUT);
pinMode (ledPin, OUTPUT);
pinMode(buttonPin, INPUT);
digitalWrite(buttonPin, HIGH);
Serial.begin(9600);
}
void loop(){
while (digitalRead(buttonPin) == HIGH)
{
tune();
}
digitalWrite(indLedPin, LOW);
swr = analogRead(swrPin);
if (swr < swrMax)
{
swrMax = swr;
}
if (swr > swrMin)
{
swrMin = swr;
}
// apply the calibration to the sensor reading
swr = map(swr, swrMax, swrMin, 0, 225);
// sensor value is outside
swr = constrain(swr, 0, 255);
// fade the LED using the calibrated value:
analogWrite(ledPin, swr);
if(count < countsperrev )
clockwise();
else if (count == countsperrev * 2)
count = 0;
else
anticlockwise();
count++;
Serial.println(count);
}
void anticlockwise()
{
for(int i = 0; i < 8; i++)
{
setOutput(i);
delayMicroseconds(motorSpeed);
//Serial.println(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));

}
void tune(){
int count=0;
swrMax = 255;
swr = analogRead(swrPin);
if (swr < swrMin)
{
swrMin = swr;
count = swr;
Serial.print("SWR ");
Serial.println(count);
}
}

andriano
andriano аватар
Offline
Зарегистрирован: 20.06.2015

Задача некорректная:

1. О том, что был минимум, можно узнать только после того, как минимум пройден. Т.е. самое раннее - на шаг после прохождения минимума.

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

3. Аналоговый датчик неизбежно шумит. Поэтому высока вероятность ложного срабатывания при поиске локального минимума.

Из всего сказанного следует, что минимум следует искать за "полтора" прохода: сначала исследуется весь доступный диапазон, при этом запоминается положение минимума. И только потом шаговик возвращается в найденную ранее позицию.

 

PS. А код, все-таки, следует вставить, как положено.

kmk
Offline
Зарегистрирован: 22.09.2015

Спасибо за участие

Всё правильно, на кнопку жмёшь ШД крутится, на первом обороте определение, а на втором остановка, кнопку отпускаешь.

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

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

kmk пишет:

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

Нет, не поэтому. Наверное потому, что лень почитать правила форума и инструкции по его (форума) использованию - http://arduino.ru/forum/obshchii/vstavka-programmnogo-koda-v-temukommentarii

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

kmk пишет:

Всё правильно, на кнопку жмёшь ШД крутится, на первом обороте определение, а на втором остановка, кнопку отпускаешь.

Не понял, т.е. на первом круге ничего не делаем, а запоминаем мнимальное значение? А потом на втором ловим это значение? Так его может и не быть - шум всегда пристутствует. А может на втором круге минимальное оказаться меньше, чем было на первом - опять эе из-за шума.

Продумайте чёткий алгоритм работы.

kmk
Offline
Зарегистрирован: 22.09.2015

Спасибо

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

Шума не будет, проверено, на первом круге определение - считывание, на втором стоп на определённом шаге, который  соответствует минимальному показанию. Следующая настройка после очередного нажатия. Хорошо бы не держать кнопку а нажать и отпустить, а оно само настроилось и остановилось.

andriano
andriano аватар
Offline
Зарегистрирован: 20.06.2015

Так у Вас проблема в том, чтобы кнопку не держать, или в том, чтобы шаговик вовремя остановить?

kmk
Offline
Зарегистрирован: 22.09.2015

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

лучше когда кнопку нажал и отпустил, а мотор пошёл и остановился до следущего нажатия.

vk007
Offline
Зарегистрирован: 16.06.2015

Если в лоб, то:

1) резервируем массив размерностью равной количеству шагов для полного оборота;

2) делаем шаг;

3) несколько раз в разные переменные считываем показания с датчика;

4) определяем среднее показание из этих переменных (попутно можно отсеять сильно отличающиеся данные) и записываем в первую ячейку массива;

5) повторяем п.п.2 - 4 столько раз, сколько шагов в полном обороте, записывая данные в соответствующие ячейки массива;

6) определяем минимальное значение массива;

7) делаем количество шагов соответствующее номеру ячейки с найденным минимальным значением.

Вобщем, както так.

kmk
Offline
Зарегистрирован: 22.09.2015

Спасибо
А вот как это оформить в скэтче
Мотор крутится, шаги считаются их видно. но как это связать с аналоговым входом?