Контроллер аттракциона вейкбординга

valera321
Offline
Зарегистрирован: 07.03.2019

Доброго всем времени суток!

В програмировании только начинаю, по примерах чото както получается и то не всегда), примера подобного не отыскал, потому прошу помощи!

Имеется: 3х-фазный движок, частотник, сейчас ручное управление.

Нужно: на контроллере сделать автоматическое вращение двигателя в заданных областях с помощу энкодера (увы концевики не подходяк). Например от 0 до 100 - вращение по часовой; и обратно от 100 к 0 - вращение против часовой; а также повторения данного цикла сколько то раз.

 

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

Ошиблись разделом, нужно - в "Ищу исполнителя".

Когда будете размещать, постарайтесь сформулировать задачу как можно подробнее и желательно сразу указать бюджет.

valera321
Offline
Зарегистрирован: 07.03.2019

andriano пишет:

Ошиблись разделом, нужно - в "Ищу исполнителя".

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

Без "исполнителей" делал например управление релюхами из компа самонаписанной прогамкой в процесинге.

bwn
Offline
Зарегистрирован: 25.08.2014

Для прояснения вопросов перемещаю в песочницу. Прочитайте начало первой темы в разделе.

valera321
Offline
Зарегистрирован: 07.03.2019

Вот что имеется сейчас, движок доезжает до установленной точки и удерживает её.

#define CLK 6
#define DT 5
#define SW 4
#include "GyverEncoder.h"
Encoder enc1(CLK, DT, SW);
int value = 0;
int Rotor = 10;
void setup() {
Serial.begin(9600);
pinMode(11, OUTPUT);
pinMode(12, OUTPUT);
enc1.setType(TYPE1);    // тип энкодера TYPE1 одношаговый, TYPE2 двухшаговый. Если ваш энкодер работает странно, смените тип
}
void loop() {
// обязательная функция отработки. Должна постоянно опрашиваться
enc1.tick();
if (enc1.isRight()) value++;      // если был поворот направо, увеличиваем на 1
if (enc1.isLeft()) value--;     // если был поворот налево, уменьшаем на 1
if (enc1.isRightH()) value += 5;  // если было удержание + поворот направо, увеличиваем на 5
if (enc1.isLeftH()) value -= 5; // если было удержание + поворот налево, уменьшаем на 5  
if (enc1.isTurn()) {       // если был совершён поворот (индикатор поворота в любую сторону)
Serial.println(value);   // выводим значение при повороте
} 

if (value < Rotor)
    {
      digitalWrite(12, HIGH);
      digitalWrite(11, LOW);  
    
    }
    else if (value > Rotor)
    {
      digitalWrite(12, LOW);
      digitalWrite(11, HIGH);  
    
    }
    else if( (abs(value) - abs( Rotor)) == 0)
    {
    digitalWrite(12, LOW);
      digitalWrite(11, LOW);  
    }
  }

 

valera321
Offline
Зарегистрирован: 07.03.2019

bwn пишет:

Для прояснения вопросов перемещаю в песочницу. Прочитайте начало первой темы в разделе.

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

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

valera321 пишет:

andriano пишет:

Ошиблись разделом, нужно - в "Ищу исполнителя".

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

Теперь Вы ошиблись еще, минимум, дважды:

- то, что я напсал в сообщении №1, - единственно возможная реакция на Ваш исходный пост,

- Вы напрасно проигнорировали мой намек на то, что Вам необходимо внятно изложить задачу: именно с этого нужно начинать люой проект. А у Вас, похоже, уже на этом этапе проблемы.

valera321
Offline
Зарегистрирован: 07.03.2019

Пока получилось вот так, после нажатия вертим движком пока энкоднр не отсчитает до 100, потом возврат в 0. Код может и кривой, но хотяб начал работать. Дальше буду подключать экран и делать ввод значений с клавиш.

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

#define CLK 6
#define DT 5
#define SW 4
#include "GyverEncoder.h"
Encoder enc1(CLK, DT, SW);
int value = 0;
int Rotor = 100;
int Rotor0 = 0;
int encoder;
int var=0;
void setup() {
Serial.begin(9600);
pinMode(11, OUTPUT);
pinMode(12, OUTPUT);
enc1.setType(TYPE1);    // тип энкодера TYPE1 одношаговый, TYPE2 двухшаговый. Если ваш энкодер работает странно, смените тип
}
void loop() {
// обязательная функция отработки. Должна постоянно опрашиваться
enc1.tick();
if (enc1.isRight()) value++;      // если был поворот направо, увеличиваем на 1
if (enc1.isLeft()) value--;     // если был поворот налево, уменьшаем на 1
if (enc1.isRightH()) value += 5;  // если было удержание + поворот направо, увеличиваем на 5
if (enc1.isLeftH()) value -= 5; // если было удержание + поворот налево, уменьшаем на 5  
if (enc1.isTurn()) {       // если был совершён поворот (индикатор поворота в любую сторону)
Serial.println(value);   // выводим значение при повороте
} 
if (enc1.isPress()) {
var=1;
Serial.println(var); 
}

int encoder = value;

while (var==1){
 if (encoder < Rotor) {
   digitalWrite(12, HIGH);
   digitalWrite(11, LOW);  
 }
 else if (value > Rotor) {
   digitalWrite(12, LOW);
   digitalWrite(11, HIGH); 
 }
 else if( (abs(value) - abs( Rotor)) == 0) {
   digitalWrite(12, LOW);
   digitalWrite(11, LOW); 
   var++;
   delay(1000);
 } 
break;
}
 
while (var==2){
 if (encoder > Rotor0) {
   digitalWrite(11, HIGH);
   digitalWrite(12, LOW);  
 }
 else if (value > Rotor0) {
   digitalWrite(11, LOW);
   digitalWrite(12, HIGH); 
 }
 else if( (abs(value) - abs( Rotor0)) == 0) {
   digitalWrite(11, LOW);
   digitalWrite(12, LOW);
   var=0;
   delay(1000);
 } 
break;
}

}

 

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

схема?