помогите остановить шаговик на нужном шаге
- Войдите на сайт для отправки комментариев
Втр, 22/09/2015 - 20:08
Помогите скэтчем, как остановить шаговик на шаге при минимальном показании датчика на аналоговом входе А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);
}
}
отформатируй код
вставь его по нормальному
объясни что ты делаешь и что тебе нужно
Спасибо
Шаговый крутит аналоговый датчик
минимальные показания появляются на каком-то шаге мотора
нужно нужно остановить мотор на этом шаге
#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);
}
}
Задача некорректная:
1. О том, что был минимум, можно узнать только после того, как минимум пройден. Т.е. самое раннее - на шаг после прохождения минимума.
2. Чтобы найти минимум (глобальный) нужно просмотреть весь доступный диапазон, иначе возможно, что мы окажемся в локальном минимуме.
3. Аналоговый датчик неизбежно шумит. Поэтому высока вероятность ложного срабатывания при поиске локального минимума.
Из всего сказанного следует, что минимум следует искать за "полтора" прохода: сначала исследуется весь доступный диапазон, при этом запоминается положение минимума. И только потом шаговик возвращается в найденную ранее позицию.
PS. А код, все-таки, следует вставить, как положено.
Спасибо за участие
Всё правильно, на кнопку жмёшь ШД крутится, на первом обороте определение, а на втором остановка, кнопку отпускаешь.
к сожалению код изменить не могу, наверно потому. что XP.
к сожалению код изменить не могу, наверно потому. что XP.
Всё правильно, на кнопку жмёшь ШД крутится, на первом обороте определение, а на втором остановка, кнопку отпускаешь.
Продумайте чёткий алгоритм работы.
Спасибо
с кодом я так и делал, но сайт не хочет преобразовывать, наверно длинный код, наверно нужно маленькими кусочками.
Шума не будет, проверено, на первом круге определение - считывание, на втором стоп на определённом шаге, который соответствует минимальному показанию. Следующая настройка после очередного нажатия. Хорошо бы не держать кнопку а нажать и отпустить, а оно само настроилось и остановилось.
Так у Вас проблема в том, чтобы кнопку не держать, или в том, чтобы шаговик вовремя остановить?
проблема определить шаг степ мотора на который приходится минимальные показания аналогово датчика и остановить мотор на этотм номере шага. Мотор крутится по кругу определяет номер шага и на следующем обороте останавливается на этом номере.
лучше когда кнопку нажал и отпустил, а мотор пошёл и остановился до следущего нажатия.
Если в лоб, то:
1) резервируем массив размерностью равной количеству шагов для полного оборота;
2) делаем шаг;
3) несколько раз в разные переменные считываем показания с датчика;
4) определяем среднее показание из этих переменных (попутно можно отсеять сильно отличающиеся данные) и записываем в первую ячейку массива;
5) повторяем п.п.2 - 4 столько раз, сколько шагов в полном обороте, записывая данные в соответствующие ячейки массива;
6) определяем минимальное значение массива;
7) делаем количество шагов соответствующее номеру ячейки с найденным минимальным значением.
Вобщем, както так.
Спасибо
А вот как это оформить в скэтче
Мотор крутится, шаги считаются их видно. но как это связать с аналоговым входом?