Управление одним джойстиком двумя шаговиками.

КонстантинБ
Offline
Зарегистрирован: 02.11.2017

 Здравствуйте жители форума.

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

Моторы 28BYJ-48 5в с драйверами ULN2003 по две штуки, джойстик самый обычный из набора Ардуино.

Алгоритм вращения моторов на картинке. Стрелки побольше - направление джойстика, парные стрели - моторы, соответственно правый и левый. Знак "-" мотор стоит.

С джойстика считываю: >510 -вперед, <500 -назад, от 500 до 510 "-".

Хочу сделать библиотеку и пихать её потом в разные поделки.

У меня получается восемь блоков проверяющих последовательно каждое направление джойстика. Все построено на функциях If else. При совпадении выдается 32 строки кода (4х8 (четыре обмотки, восемь шагов)) которые задают состояния выводов и соответственное состояние обмоток мотора.

И эта конструкция получается очень громоздкая, и я думаю работать будет очень медленно, а скорее всего работать вообще не будет :)

Товарищи программисты, подскажите пожалуйста более эффективный способ решения.

п.с. Я не очень еще в программировании разбираюсь, мне если не трудно, по подробнее.

п.п.с. Очень прошу над картинкой не ржать.

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

КонстантинБ пишет:

У меня получается восемь блоков проверяющих последовательно каждое направление джойстика. Все построено на функциях If else. При совпадении выдается 32 строки кода (4х8 (четыре обмотки, восемь шагов)) которые задают состояния выводов и соответственное состояние обмоток мотора.

И эта конструкция получается очень громоздкая, 

Нормальная

КонстантинБ пишет:

и я думаю работать будет очень медленно, 

Что заставляет Вас так думать? Оно, конечно, "как напишете", но объективных причин для медленности не вижу.

КонстантинБ пишет:

а скорее всего работать вообще не будет :)

Это как напишете.

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

товарищи программисты пока не увидели правильно вставленного отформатированного кода,

над картинкой не ржал.

КонстантинБ
Offline
Зарегистрирован: 02.11.2017

vvadim пишет:

товарищи программисты пока не увидели правильно вставленного отформатированного кода,

над картинкой не ржал.

Да кода как такового нет.

Вот такой пока набросок.

if (data [0] <500 ){{

// выполняется блок команд «движение назад»}

if (data [1] <500 ){

//выполняется блок команд «движение назад и в лево» }

else if (data [1]>510 ){

//выполняется блок команд «движение назад и в право» }}

else if (data [0] >510){{

// выполняется блок команд «движение вперед»}

if (data [1] <500 ){

// выполняется блок команд «движение вперед и в лево» }

else if (data  [1] >510){

// выполняется блок команд «движение вперед и в право» }}

Блоки команд я с планшета устану писать, дома оформлю в ИДЕ выложу в нормальном варианте.

 

Будет работать?

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

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

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

КонстантинБ пишет:

Вот такой пока набросок.

Вам же как человеку написали "правильно вставленного отформатированного кода", А Вы что выложили?

КонстантинБ пишет:

Будет работать?

Не знаю будет ли этот код работать, но читать его здесь никто не будет - это точно.

КонстантинБ
Offline
Зарегистрирован: 02.11.2017

ЕвгенийП пишет:

КонстантинБ пишет:

Вот такой пока набросок.

Вам же как человеку написали "правильно вставленного отформатированного кода", А Вы что выложили?

КонстантинБ пишет:

Будет работать?

Не знаю будет ли этот код работать, но читать его здесь никто не будет - это точно.

На планшете тяжело набирать, дома в IDE сделаю - выложу.

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

:) да умею я код вставлять, я на работе пишу на планшете, и очень не удобно на нем писать. Дома на ноуте сделаю и выложу нормально, кнопкой «вставка кода».

КонстантинБ
Offline
Зарегистрирован: 02.11.2017
void setup() {}

void loop() {

if (data [0] <500 ) //ось X джойстика
{
//моторR назад
digitalWrite (2,1);
digitalWrite (3,0);
digitalWrite (4,0);
digitalWrite (5,1);

digitalWrite (2,0);
digitalWrite (3,0);
digitalWrite (4,0);
digitalWrite (5,1);

digitalWrite (2,0);
digitalWrite (3,0);
digitalWrite (4,1);
digitalWrite (5,1);

digitalWrite (2,0);
digitalWrite (3,0);
digitalWrite (4,1);
digitalWrite (5,0);

digitalWrite (2,0);
digitalWrite (3,1);
digitalWrite (4,1);
digitalWrite (5,0);

digitalWrite (2,0);
digitalWrite (3,1);
digitalWrite (4,0);
digitalWrite (5,0);

digitalWrite (2,1);
digitalWrite (3,1);
digitalWrite (4,0);
digitalWrite (5,0);

digitalWrite (2,1);
digitalWrite (3,0);
digitalWrite (4,0);
digitalWrite (5,0);

//моторL назад
digitalWrite (14,1);
digitalWrite (15,0);
digitalWrite (16,0);
digitalWrite (17,1);

digitalWrite (14,0);
digitalWrite (15,0);
digitalWrite (16,0);
digitalWrite (17,1);

digitalWrite (14,0);
digitalWrite (15,0);
digitalWrite (16,1);
digitalWrite (17,1);

digitalWrite (14,0);
digitalWrite (15,0);
digitalWrite (16,1);
digitalWrite (17,0);

digitalWrite (14,0);
digitalWrite (15,1);
digitalWrite (16,1);
digitalWrite (17,0);

digitalWrite (14,0);
digitalWrite (15,1);
digitalWrite (16,0);
digitalWrite (17,0);

digitalWrite (14,1);
digitalWrite (15,1);
digitalWrite (16,0);
digitalWrite (17,0);

digitalWrite (14,1);
digitalWrite (15,0);
digitalWrite (16,0);
digitalWrite (17,0);
}// выполняется блок команд «движение назад» (оба мотора назад)

if (data [1] <500 ) //ось Y джойстика
{
//моторR назад
digitalWrite (2,1);
digitalWrite (3,0);
digitalWrite (4,0);
digitalWrite (5,1);

digitalWrite (2,0);
digitalWrite (3,0);
digitalWrite (4,0);
digitalWrite (5,1);

digitalWrite (2,0);
digitalWrite (3,0);
digitalWrite (4,1);
digitalWrite (5,1);

digitalWrite (2,0);
digitalWrite (3,0);
digitalWrite (4,1);
digitalWrite (5,0);

digitalWrite (2,0);
digitalWrite (3,1);
digitalWrite (4,1);
digitalWrite (5,0);

digitalWrite (2,0);
digitalWrite (3,1);
digitalWrite (4,0);
digitalWrite (5,0);

digitalWrite (2,1);
digitalWrite (3,1);
digitalWrite (4,0);
digitalWrite (5,0);

digitalWrite (2,1);
digitalWrite (3,0);
digitalWrite (4,0);
digitalWrite (5,0);

//моторL стоит
}//выполняется блок команд «движение назад и влево» 

else if (data [1]>510 ) //ось Y джойстка
{
//моторR стоит

//моторL назад
digitalWrite (14,1);
digitalWrite (15,0);
digitalWrite (16,0);
digitalWrite (17,1);

digitalWrite (14,0);
digitalWrite (15,0);
digitalWrite (16,0);
digitalWrite (17,1);

digitalWrite (14,0);
digitalWrite (15,0);
digitalWrite (16,1);
digitalWrite (17,1);

digitalWrite (14,0);
digitalWrite (15,0);
digitalWrite (16,1);
digitalWrite (17,0);

digitalWrite (14,0);
digitalWrite (15,1);
digitalWrite (16,1);
digitalWrite (17,0);

digitalWrite (14,0);
digitalWrite (15,1);
digitalWrite (16,0);
digitalWrite (17,0);

digitalWrite (14,1);
digitalWrite (15,1);
digitalWrite (16,0);
digitalWrite (17,0);

digitalWrite (14,1);
digitalWrite (15,0);
digitalWrite (16,0);
digitalWrite (17,0);
}//выполняется блок команд «движение назад и в право» 

else if (data [0] >510) //ось X джойстика
{
//моторR вперед
digitalWrite (2,1);
digitalWrite (3,0);
digitalWrite (4,0);
digitalWrite (5,0);

digitalWrite (2,1);
digitalWrite (3,1);
digitalWrite (4,0);
digitalWrite (5,0);

digitalWrite (2,0);
digitalWrite (3,1);
digitalWrite (4,0);
digitalWrite (5,0);

digitalWrite (2,0);
digitalWrite (3,1);
digitalWrite (4,1);
digitalWrite (5,0);

digitalWrite (2,0);
digitalWrite (3,0);
digitalWrite (4,1);
digitalWrite (5,0);

digitalWrite (2,0);
digitalWrite (3,0);
digitalWrite (4,1);
digitalWrite (5,1);

digitalWrite (2,0);
digitalWrite (3,0);
digitalWrite (4,0);
digitalWrite (5,1);

digitalWrite (2,1);
digitalWrite (3,0);
digitalWrite (4,0);
digitalWrite (5,1);

//моторL вперед
digitalWrite (14,1);
digitalWrite (15,0);
digitalWrite (16,0);
digitalWrite (17,0);

digitalWrite (14,1);
digitalWrite (15,1);
digitalWrite (16,0);
digitalWrite (17,0);

digitalWrite (14,0);
digitalWrite (15,1);
digitalWrite (16,0);
digitalWrite (17,0);

digitalWrite (14,0);
digitalWrite (15,1);
digitalWrite (16,1);
digitalWrite (17,0);

digitalWrite (14,0);
digitalWrite (15,0);
digitalWrite (16,1);
digitalWrite (17,0);

digitalWrite (14,0);
digitalWrite (15,0);
digitalWrite (16,1);
digitalWrite (17,1);

digitalWrite (14,0);
digitalWrite (15,0);
digitalWrite (16,0);
digitalWrite (17,1);

digitalWrite (14,1);
digitalWrite (15,0);
digitalWrite (16,0);
digitalWrite (17,1);
}// выполняется блок команд «движение вперед» (оба мотора вперед)

if (data [1] <500 )
{
//моторR вперед
digitalWrite (2,1);
digitalWrite (3,0);
digitalWrite (4,0);
digitalWrite (5,0);

digitalWrite (2,1);
digitalWrite (3,1);
digitalWrite (4,0);
digitalWrite (5,0);

digitalWrite (2,0);
digitalWrite (3,1);
digitalWrite (4,0);
digitalWrite (5,0);

digitalWrite (2,0);
digitalWrite (3,1);
digitalWrite (4,1);
digitalWrite (5,0);

digitalWrite (2,0);
digitalWrite (3,0);
digitalWrite (4,1);
digitalWrite (5,0);

digitalWrite (2,0);
digitalWrite (3,0);
digitalWrite (4,1);
digitalWrite (5,1);

digitalWrite (2,0);
digitalWrite (3,0);
digitalWrite (4,0);
digitalWrite (5,1);

digitalWrite (2,1);
digitalWrite (3,0);
digitalWrite (4,0);
digitalWrite (5,1);

//моторL стоит
}// выполняется блок команд «движение вперед и в лево»

else if (data  [1] >510)
{
//моторR стоит

//моторL вперед
digitalWrite (14,1);
digitalWrite (15,0);
digitalWrite (16,0);
digitalWrite (17,0);

digitalWrite (14,1);
digitalWrite (15,1);
digitalWrite (16,0);
digitalWrite (17,0);

digitalWrite (14,0);
digitalWrite (15,1);
digitalWrite (16,0);
digitalWrite (17,0);

digitalWrite (14,0);
digitalWrite (15,1);
digitalWrite (16,1);
digitalWrite (17,0);

digitalWrite (14,0);
digitalWrite (15,0);
digitalWrite (16,1);
digitalWrite (17,0);

digitalWrite (14,0);
digitalWrite (15,0);
digitalWrite (16,1);
digitalWrite (17,1);

digitalWrite (14,0);
digitalWrite (15,0);
digitalWrite (16,0);
digitalWrite (17,1);

digitalWrite (14,1);
digitalWrite (15,0);
digitalWrite (16,0);
digitalWrite (17,1);
}// выполняется блок команд «движение вперед и в право»

}

 

КонстантинБ
Offline
Зарегистрирован: 02.11.2017

Ну вот так.
В IDE выдает ошибки.

xDriver
xDriver аватар
Offline
Зарегистрирован: 14.08.2015

правильно выдает, где определение data[]

DetSimen
DetSimen аватар
Offline
Зарегистрирован: 25.01.2017

Секретные?

КонстантинБ
Offline
Зарегистрирован: 02.11.2017

xDriver пишет:

правильно выдает, где определение data[]

#include <SPI.h> 
#include <nRF24L01.h> 
#include <RF24.h> 
RF24 radio(9, 10); 
int data[2]; 

вот оно. 
Вопрос не в нем, мне само управление не нравится. 

Можно все If else заменить на что-то более "красивое"?

КонстантинБ
Offline
Зарегистрирован: 02.11.2017

DetSimen пишет:

Секретные?

ну да, с определением IDE ошибку не выдает.

xDriver
xDriver аватар
Offline
Зарегистрирован: 14.08.2015

можно, читаем про массивы.

 

qwone
qwone аватар
Offline
Зарегистрирован: 03.07.2016

КонстантинБ пишет:
Можно все If else заменить на что-то более "красивое"?

А красивое вы не потяните . У вас это ...как его.. знаний маловато. А без знаний в голове ... ничего не выйдет. А на форуме вам курсы повышиния квалификации индивидуально никто устраивать не будет. Геморойно это.

КонстантинБ
Offline
Зарегистрирован: 02.11.2017

qwone пишет:

КонстантинБ пишет:
Можно все If else заменить на что-то более "красивое"?

А красивое вы не потяните . У вас это ...как его.. знаний маловато. А без знаний в голове ... ничего не выйдет. А на форуме вам курсы повышиния квалификации индивидуально никто устраивать не будет. Геморойно это.

Вы убили детскую мечту :(((

КонстантинБ
Offline
Зарегистрирован: 02.11.2017

xDriver пишет:

можно, читаем про массивы.

 

Что-то я не догоняю, можно чуть подробнее.

С самим массивом понятно, а что в него прятать?

xDriver
xDriver аватар
Offline
Зарегистрирован: 14.08.2015

int8_t motor_backward[8][4] = {1, 0, 0, 1,
                               0, 0, 0, 1,
                               0, 0, 1, 1,
                               0, 0, 1, 0,
                               0, 1, 1, 0,
                               0, 1, 0, 0,
                               1, 1, 0, 0,
                               1, 0, 0, 0
                              };

int8_t motor_forward[8][4]; // тут забить нули и единицы для движения вперед и т.д
int8_t motor_left[8][4];
int8_t motor_right[8][4];


void right_motor_backward() // правый назад
{
  for (int8_t i = 0; i < 8; i++)
  {
    digitalWrite (2, motor_backward[i][0]);
    digitalWrite (3, motor_backward[i][1]);
    digitalWrite (4, motor_backward[i][2]);
    digitalWrite (5, motor_backward[i][3]);
  }
}
void left_motor_backward() // левый назад
{
  for (int8_t i = 0; i < 8; i++)
  {
    digitalWrite (14, motor_backward[i][0]);
    digitalWrite (15, motor_backward[i][1]);
    digitalWrite (16, motor_backward[i][2]);
    digitalWrite (17, motor_backward[i][3]);
  }
}
//создать еще по три функции для каждого мотора......


void setup() {
  // тут ноги на выход все таки проинициализировать.
  }

void loop() {

  if (data [0] < 500 ) //ось X джойстика
  {
    //моторR назад
    right_motor_backward();
    //моторL назад
    left_motor_backward();
  }// выполняется блок команд «движение назад» (оба мотора назад)

  if (data [1] < 500 ) //ось Y джойстика
.........
  {

можно и еще оптимизировать, но не хочется вам голову забивать.

КонстантинБ
Offline
Зарегистрирован: 02.11.2017

Спасибо, пошел читать.

КонстантинБ
Offline
Зарегистрирован: 02.11.2017

Вот такая программа у меня получилась.

//Приемник танк

#include <SPI.h> 
#include <nRF24L01.h> 
#include <RF24.h> 
RF24 radio(9, 10); 
int data[2];

int8_t motor_forward [8][4] = {1, 0, 0, 0,
                               1, 1, 0, 0,
                               0, 1, 0, 0,
                               0, 1, 1, 0,
                               0, 0, 1, 0,
                               0, 0, 1, 1,
                               0, 0, 0, 1,
                               1, 0, 0, 1}; 

int8_t motor_backward[8][4] = {1, 0, 0, 1,
                               0, 0, 0, 1,
                               0, 0, 1, 1,
                               0, 0, 1, 0,
                               0, 1, 1, 0,
                               0, 1, 0, 0,
                               1, 1, 0, 0,
                               1, 0, 0, 0};

void right_motor_forward () // правый вперед
{
  for (int8_t i = 0; i < 8; i++)
  {
    digitalWrite (2, motor_backward[i][0]);
    digitalWrite (3, motor_backward[i][1]);
    digitalWrite (4, motor_backward[i][2]);
    digitalWrite (5, motor_backward[i][3]);
  }
}
void right_motor_backward() // правый назад
{
  for (int8_t i = 0; i < 8; i++)
  {
    digitalWrite (2, motor_backward[i][0]);
    digitalWrite (3, motor_backward[i][1]);
    digitalWrite (4, motor_backward[i][2]);
    digitalWrite (5, motor_backward[i][3]);
  }
}
void left_motor_forward () // левый вперед
{
  for (int8_t i = 0; i < 8; i++)
  {
    digitalWrite (14, motor_backward[i][0]);
    digitalWrite (15, motor_backward[i][1]);
    digitalWrite (16, motor_backward[i][2]);
    digitalWrite (17, motor_backward[i][3]);
  }
}
void left_motor_backward() // левый назад
{
  for (int8_t i = 0; i < 8; i++)
  {
    digitalWrite (14, motor_backward[i][0]);
    digitalWrite (15, motor_backward[i][1]);
    digitalWrite (16, motor_backward[i][2]);
    digitalWrite (17, motor_backward[i][3]);
  }
}
                               
void setup() 
{ 
radio.begin(); 
radio.setChannel(5); 
radio.setDataRate (RF24_1MBPS); 
radio.setPALevel (RF24_PA_HIGH); 
radio.openReadingPipe (1, 0x1234567890LL); 
radio.startListening (); 

 pinMode (2, OUTPUT);
 pinMode (3, OUTPUT);
 pinMode (4, OUTPUT);
 pinMode (5, OUTPUT);

 pinMode (14, OUTPUT);
 pinMode (15, OUTPUT);
 pinMode (16, OUTPUT);
 pinMode (17, OUTPUT);
 
Serial.begin (9600);
} 

void loop() 
{ 
if(radio.available()) 
 { 
 radio.read(&data, sizeof(data)); 
 }
if (data[0] >510 && data[1] >500 && data[1] <510){ //север
    right_motor_forward();
    left_motor_forward ();}// выполняется блок команд «движение вперед» (оба мотора вперед)

  if (data[0] >510 && data[1] >510){ //северо-восток
    left_motor_forward ();}//вперед и в право
  
  if (data[0] >500 && data[0] <510 && data[1] >510){//восток
    right_motor_backward();    
    left_motor_forward  ();}//поворот на право

  if (data[0] <500 && data[1] >510){//юго-восток
    left_motor_backward ();}//назад и в лево

  if (data[0] <500 && data[1] >500 && data[1] <510){//юг
    right_motor_backward();
    left_motor_backward ();}//оба назад

  if (data[0] <500 && data[1] <500){//юго-запад
    right_motor_backward();}//правый назад

  if (data[0] >500 && data[0] <510 && data[1] <500){//запад
    right_motor_forward ();
    left_motor_backward ();}//поворот на лево

  if (data[0] >510 && data[1] <500){ //северо-запад
    right_motor_forward ();}//влево вперед

Serial.print (data[0]);
Serial.println (data[1]);
}

Вы писали что нужно создать еще по три функции для каждого мотора, видимо имелось ввиду ВЛЕВО, ВПРАВО и ВПЕРЕД. НАЗАД вы сделали. Но поворот осуществляется комбинацией ВПЕРЕД,  НАЗАД на двух моторах, по этому сделал по одной.

xDriver
xDriver аватар
Offline
Зарегистрирован: 14.08.2015

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

еще чуток "оптимизации"

вместо

void right_motor_forward () // правый вперед
{
  for (int8_t i = 0; i < 8; i++)
  {
    digitalWrite (2, motor_backward[i][0]);
    digitalWrite (3, motor_backward[i][1]);
    digitalWrite (4, motor_backward[i][2]);
    digitalWrite (5, motor_backward[i][3]);
  }
}

пишем

void right_motor_forward () // правый вперед
{
  for (int8_t i = 0; i < 8; i++)
  {
    for (int8_t j = 0; j < 4; j++) {
       digitalWrite (j+2, motor_backward[i][j]);
   }
  }
}

ну и для левого мотора анологично.

qwone
qwone аватар
Offline
Зарегистрирован: 03.07.2016

Если оптимизировать, то как минимум так 

/*движение*/
void move (byte pin1, byte pin1, byte pin1, byte pin1, bool dir) {
  if (!dir)
    for (int8_t i = 0; i < 8; ++i) {
      digitalWrite (pin1, motor_backward[i][0]);
      digitalWrite (pin2, motor_backward[i][1]);
      digitalWrite (pin3, motor_backward[i][2]);
      digitalWrite (pint, motor_backward[i][3]);
    }
  else
    for (int8_t i = 7; i >= 0; --i) {
      digitalWrite (pin1, motor_backward[i][0]);
      digitalWrite (pin2, motor_backward[i][1]);
      digitalWrite (pin3, motor_backward[i][2]);
      digitalWrite (pint, motor_backward[i][3]);
    }
}

void setup() {
  /*правый вперед*/
  move(/*пин*/2,/*пин*/3,/*пин*/4,/*пин*/5,/*направ*/0);
  /*правый назад*/
  move(/*пин*/2,/*пин*/3,/*пин*/4,/*пин*/5,/*направ*/1);
  /*левый вперед*/
  move(/*пин*/6,/*пин*/7,/*пин*/8,/*пин*/9,/*направ*/0);
  /*левый назад*/
  move(/*пин*/6,/*пин*/7,/*пин*/8,/*пин*/9,/*направ*/1);
}

void loop() {
}

 

xDriver
xDriver аватар
Offline
Зарегистрирован: 14.08.2015
Я в тебе не сомневался, по этому слово оптимизация взял в кавычки, только почему, предложенный мной, второй цикл не применил ?
 
И вообще, я ожидал класс motor. :)
qwone
qwone аватар
Offline
Зарегистрирован: 03.07.2016

xDriver пишет:
И вообще, я ожидал класс motor. :)
Самое сложное это "кривые заказчики" с их "кривыми задумками". Поэтому если делать правильно, то надо не только править программы, но переписывать ТЗ и составлять мануал для юзеров. Что очень много времени занимает.

xDriver
xDriver аватар
Offline
Зарегистрирован: 14.08.2015

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

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

а твой move, я бы "оптимизировал" в качестве последнего параметра задав четкое направление, вперед,назад,вперед-лево, вперед-право и т.д

КонстантинБ
Offline
Зарегистрирован: 02.11.2017

xDriver, огромное Вам спасибо за помошь.

Я не то чтобы «в теме», но изучаю по маленьку:)

Я понимаю каждую строку кода и могу объяснить ее назначение (может не по научному, но по лузерски объяснить смогу), а вот целиком, с нуля скетч написать не могу.

У меня к вам еще одна прозьба, посоветуйте что почитать по теме. По структуре программ, по последовательности действий. Только не сильно заумное, написаное доступным языком. Еще раз большое спасибо.

П.С. про адекватность согласен - тут я на высоте :)))

КонстантинБ
Offline
Зарегистрирован: 02.11.2017

qwone пишет:

xDriver пишет:
И вообще, я ожидал класс motor. :)
Самое сложное это "кривые заказчики" с их "кривыми задумками". Поэтому если делать правильно, то надо не только править программы, но переписывать ТЗ и составлять мануал для юзеров. Что очень много времени занимает.

Дайте пожалуйста ссыль на вашу ветку о «Правильном программировании». 

И мануал для юзеров/лузеров - было бы очень круто.

Еще пару слов хотелось бы сказать про задумку.

Обусловлена она ...малым количеством рук у человека. У нас есть танк с р/у. Два рычага управляют движением, две кнопки поворотом башни, еще одна делает выстрел, вверх/вниз пушка не регулируется. Управлять такой игрушкой не очень удобно. Еще я видел р/у экскаватор. Там переключатель. В одном положении управляет движением, в другом ковшом. Управлять ковшом в движении нельзя. Т.е. имеем ограниченный функционал. В моем варианте одна рука будет управлять движением, а вторая, в перспективе, будет управлять пушкой, отвалом, ковшом, манипулятором и т.д.

qwone
qwone аватар
Offline
Зарегистрирован: 03.07.2016

КонстатинБ,тема она вот. Я не скрываю ее. Разумеется ее надо было прикрепить. Но..

http://arduino.ru/forum/programmirovanie/klassy-arduino-po-qwone-dlya-ch...

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

  Вот и у меня. Хотя я и придумал простой метод проектирования программ на Ардуине,который можно легко тестировать, объединять скетчи написаные в этом стиле и даже осуществлять "параллельные задачи". Я оказался плохим "учителем" и плохим "писателем мануалов для новичков". Побеждает то программирование , мануалы которые распростанены и понятны большинству, каков бы уровень их низок.

qwone
qwone аватар
Offline
Зарегистрирован: 03.07.2016

ПС: Вот каркас по моему стилю. И что? Вам там будет сложно понять что-то. А значить изменить и поставить под вашие текущие задачи. Вот и выходит что мой скетч "бессысленен"

/**/
unsigned long mill; // переменная под millis()
/**/
class Cl_Motor {
  protected:
    byte pin1, pin2, pin3, pin4;
    int period;//длительность шага
    unsigned long past;
  public:
    /*компоновка*/
    Cl_Motor(byte pin1_, byte pin2_, byte pin3_, byte pin4_)
      : pin1(pin1_), pin2(pin2_), pin3(pin3_), pin4(pin4_) {}
    /*вставить в setup()*/
    void init() {
      pinMode(pin1, OUTPUT);
      pinMode(pin2, OUTPUT);
      pinMode(pin3, OUTPUT);
      pinMode(pin4, OUTPUT);
    }
    /*вставить в loop()*/
    void run() {
      if (mill - past >= period) {
        past = mill;
        /*сделать шаг*/
      }
    }
    /**/
    void input(int period_) {
      period = period_;
    }
};
//--------------------------------
// класс джойстик
class Cl_Joystic {
  protected:
    byte pin1, pin2;
    void (*Do)();//обработчик
  public:
    /*значение на джойстике*/
    int valX, valY;
    /*компоновка*/
    Cl_Joystic(byte pin1_, byte pin2_, void (*Do_)())
      : pin1(pin1_), pin2(pin2_), Do(Do_) {}
    /*вставить в setup()*/
    void init() {}
    /*вставить в loop()*/
    void run() {}
};
//---Компоновка-----------------------------
Cl_Motor MotorLeft(/*пин1*/2,/*пин2*/3,/*пин3*/4,/*пин4*/5);
Cl_Motor MotorRight(/*пин1*/6,/*пин2*/7,/*пин3*/8,/*пин4*/9);
void DoJoystic();
Cl_Joystic Joystic(/*пин1*/A0,/*пин2*/A1,/*обработчик*/&DoJoystic);
void DoJoystic() {
  MotorLeft.input(Joystic.valX);
  MotorRight.input(Joystic.valY);
}
//---main-----------------------------
void setup() {
  MotorLeft.init();
  MotorRight.init();
  Joystic.init();
}

void loop() {
  mill = millis();
  MotorLeft.run();
  MotorRight.run();
  Joystic.run();
}
/**/

 

КонстантинБ
Offline
Зарегистрирован: 02.11.2017

qwone, я бы разделил программирование на профессиональное и на любительское. И методы есть массово применяемые (читай протестированные в разных вариантах, ситуациях, многократно описанные и разжеванные), и есть новые которые надо изучать, в которые надо вникать, вдумываться и если у юзера не математический склад ума, то это становится серьезной проблемой. А еще есть консерватизм и пассивность у людей. Когда человек владеет каким либо методом, ему тяжело внедрять что-то новое. Да, он знает что новый метод более совершенный, более быстрый, более прогрессивный, но... Ну и в конце концов есть обычная лень.

Я себя еще даже к любителям не отношу, прочитал первые посты в вашей теме, сходу не вьехал :), изучаю скетч (каркас вы его назвали).

Да, еще важное замечание.

Шаговики я использую потому, что они есть. Точность шага не критична.

qwone
qwone аватар
Offline
Зарегистрирован: 03.07.2016

КонстантинБ, я бы тоже не вьехал если я впервые встретился со своим способом . Да и этот способ это результат работы 1 года исследований. И что бы внятно расжевано описать все надо написать книгу толщиной как у Страуструппа(для Кнута пока маловато материала), нарисовать 25 различных подключаемых библиотек. И в этом я ничего нового не предложу.Банально синтез существующих знаний.

  Каркас . Ну я просто не хочу вводить слово фраймворк(анл framework ). Это основа к которой можно подключить уже отлаженые кубики. Пример Лего. Но если из Кубиков Лего можно собрать различную конструкцию, недостатком Лего является то что это должны быть кубики из Лего. Так и в моем способе.  Но писать все эти кубики библиотеки, писать к ним мануалы, проводить усиленную рекламу мне это не по силам. Тем более надо подымать уровень новичков, которые не хотят этот уровень подымать.

Шаговые двигатели (ШД)это замечательно. Но в отличии от двигателей постоянного тока , где подал напряжение и ШИМ , и двигатель работает долго. В ШД нужно проводить тактирование программно. А это лишний модуль или куча строк, которые или могут запутать понимание и работу программы, где работу выполняет один процессор.

ПС: Вот еще немного дописал. Но там есть еще косяки.

/**/
unsigned long mill; // переменная под millis()
/**/
const byte MAP[] = {0x09, 0x01, 0x03, 0x02, 0x06, 0x04, 0x0C, 0x08};
class Cl_Motor {
  protected:
    byte pin1, pin2, pin3, pin4;
    int period;//длительность шага /0 стоим/ + движение вперед / - движение назад
    unsigned long past;
    int stat;// 0-7  одно из 8 возможных положений ШВ
    /*поставить ШД в одно из положений*/
    void write(byte pos) {
      digitalWrite (pin1, (MAP[pos] >> 3) && 0x01);
      digitalWrite (pin2, (MAP[pos] >> 2) && 0x01);
      digitalWrite (pin3, (MAP[pos] >> 1) && 0x01);
      digitalWrite (pin4, MAP[pos] && 0x01);
    }
  public:
    /*компоновка*/
    Cl_Motor(byte pin1_, byte pin2_, byte pin3_, byte pin4_)
      : pin1(pin1_), pin2(pin2_), pin3(pin3_), pin4(pin4_) {}
    /*вставить в setup()*/
    void init() {
      pinMode(pin1, OUTPUT);
      pinMode(pin2, OUTPUT);
      pinMode(pin3, OUTPUT);
      pinMode(pin4, OUTPUT);
    }
    /*вставить в loop()*/
    void run() {
      if (period == 0) return; // двигатель стоит
      if (period > 0 && mill - past >= period) { // если идет движение вперед
        past = mill;
        /*сделать шаг вперед*/
        ++stat;
        if (stat >= 8) stat = 0;
        write(stat);
      }
      if (period < 0 && mill - past >= -period) { // если идет движение назад
        past = mill;
        /*сделать шаг назад*/
        --stat;
        if (stat < 0) stat = 7;
        write(stat);
      }
    }
    /**/
    void input(int period_) {
      period = period_;
    }
};
//--------------------------------
// класс джойстик
class Cl_Joystic {
  protected:
    byte pin1, pin2;
    void (*Do)();//обработчик
    unsigned long past = 0;
  public:
    /*значение на джойстике*/
    int valX = 0, valY = 0;
    /*компоновка*/
    Cl_Joystic(byte pin1_, byte pin2_, void (*Do_)())
      : pin1(pin1_), pin2(pin2_), Do(Do_) {}
    /*вставить в setup()*/
    void init() {}
    /*вставить в loop()*/
    void run() {
      if (mill - past >= 200) {
        past = mill;
        valX = analogRead(pin1);
        valY = analogRead(pin2);
        Serial.print("valX:");
        Serial.print(valX);
        Serial.print("  valY:");
        Serial.print(valY);
        Serial.println();
      }
    }
};
//---Компоновка-----------------------------
Cl_Motor MotorLeft(/*пин1*/2,/*пин2*/3,/*пин3*/4,/*пин4*/5);
Cl_Motor MotorRight(/*пин1*/6,/*пин2*/7,/*пин3*/8,/*пин4*/9);
void DoJoystic();
Cl_Joystic Joystic(/*пин1*/A0,/*пин2*/A1,/*обработчик*/&DoJoystic);
void DoJoystic() {
  int valX = 512 - Joystic.valX;
  int valY = 512 - Joystic.valY;
  MotorLeft.input(valX);
  MotorRight.input(valY);
}
//---main-----------------------------
void setup() {
  Serial.begin(9600);
  MotorLeft.init();
  MotorRight.init();
  Joystic.init();
}

void loop() {
  mill = millis();
  MotorLeft.run();
  MotorRight.run();
  Joystic.run();
}
/**/