ARDUINO Наливатор. Обсуждение проекта

Старик Похабыч

★★★★★★★
14 Авг 2019
4,267
1,303
Москва
@konoev, Хороший вопрос.. я только приступил к изучению темы..
вот в коде описаны шаги мотора 28byj :
C++:
const int stepsLookup[8] = { B1000, B1100, B0100, B0110, B0010, B0011, B0001, B1001 };
если считать ,что эти 8 этапов 1 шаг, то дробить можно на 8 частей. Или там какая то иная шкала дробления
 

VICLER

★★★★★★✩
9 Дек 2019
801
662
Hamburg
@Старик Похабыч, если использовать драйвер типа a4988 или подобный, там дробление происходит просто выбором перемычек от 1/2 до 1/256 на некоторых драйверах. Шаг делается подачей одного импульса на пин STEP драйвера. Намного удобнее управлять мотором такими драйверами. К тому же из-за использования только одного импульса на шаг можно добиться бо́льшей скорости вращения двигателя и плюс это разгрузит процессор при использовании микрошага.
 
  • Лойс +1
Реакции: konoev

Старик Похабыч

★★★★★★★
14 Авг 2019
4,267
1,303
Москва
@VICLER, это все замечательно как это сделать на драйвере это понятно... у меня непонимание возникает при передаче сигнала от драйвера к шаговику - что передается ? как на двигателе с определенным шагом добиться деления на 256. что передается на двигатель?
4 контакта, на которые передаются 0 или 1 это 2 в 4 степени, т.е. 16 вариантов в принципе. Как добиваются выше не понимаю. Или там уже идут не 0 и 1 , а дробные части ? типа 0.1 и 0.9 ? это вариант, тогда мотор может встать в какое то промежуточное положение.
Хм.. тогда есть возможность интересного управления путем подключения к аналоговым выходам. Чисто ради понимания
 

konoev

✩✩✩✩✩✩✩
24 Фев 2020
38
6
@VICLER, это все замечательно как это сделать на драйвере это понятно... у меня непонимание возникает при передаче сигнала от драйвера к шаговику - что передается ? как на двигателе с определенным шагом добиться деления на 256. что передается на двигатель?
4 контакта, на которые передаются 0 или 1 это 2 в 4 степени, т.е. 16 вариантов в принципе. Как добиваются выше не понимаю. Или там уже идут не 0 и 1 , а дробные части ? типа 0.1 и 0.9 ? это вариант, тогда мотор может встать в какое то промежуточное положение.
Хм.. тогда есть возможность интересного управления путем подключения к аналоговым выходам. Чисто ради понимания
Так а какая разница что передаётся на двигатель. Важно знать что при установленом дроблении на драйвере 1/1 - каждый импульс приходящий на пин step будет поворачивать двигатель на один шаг (чаще всего 1.8 градуса). Если на драйвере установить дробление шага например 1/2 - то каждый импульс приходящий на step будет поворачивать двигатель на половину его шага, при дроблении 1/2 получается на 0.9 градуса (чаще всего). Как-то так. Но я непредставляю как это делается в прошивке:)
 

VICLER

★★★★★★✩
9 Дек 2019
801
662
Hamburg
Парни а если шаговик от принтака использовать? например такой
Такой движок можно попробовать использовать, но возможно момент у него будет меньше, чем у серводвигателя и его просто будет недостаточно для передвижения крана со шлангом. Есть много шаговых двигателей, но именно 28byj показался мне идеальным вариантом из-за компактности и достаточного момента.
 

Старик Похабыч

★★★★★★★
14 Авг 2019
4,267
1,303
Москва
@konoev, ага, так же многие наливатор собирают, какая разница что там происходит, в этой коробочке, я вот нажимаю кнопку и мне наливают, а потом я в рот пью :D
 

VICLER

★★★★★★✩
9 Дек 2019
801
662
Hamburg
@VICLER, это все замечательно как это сделать на драйвере это понятно... у меня непонимание возникает при передаче сигнала от драйвера к шаговику - что передается ? как на двигателе с определенным шагом добиться деления на 256. что передается на двигатель?
4 контакта, на которые передаются 0 или 1 это 2 в 4 степени, т.е. 16 вариантов в принципе. Как добиваются выше не понимаю. Или там уже идут не 0 и 1 , а дробные части ? типа 0.1 и 0.9 ? это вариант, тогда мотор может встать в какое то промежуточное положение.
Хм.. тогда есть возможность интересного управления путем подключения к аналоговым выходам. Чисто ради понимания
Думаю это Вам поможет немногоExperimental-results-the-phase-currents-of-a-two-phase-bipolar-stepper-motor-2-4-8-16.png
 

konoev

✩✩✩✩✩✩✩
24 Фев 2020
38
6
Такой движок можно попробовать использовать, но возможно момент у него будет меньше, чем у серводвигателя и его просто будет недостаточно для передвижения крана со шлангом. Есть много шаговых двигателей, но именно 28byj показался мне идеальным вариантом из-за компактности и достаточного момента.
У меня первый лазерный выжигатель был собран на двигах от принтера, прекрасно тянул 2-х ватный лазер... Правда грелся, трохи.
 

konoev

✩✩✩✩✩✩✩
24 Фев 2020
38
6
@konoev, ага, так же многие наливатор собирают, какая разница что там происходит, в этой коробочке, я вот нажимаю кнопку и мне наливают, а потом я в рот пью :D
Да, вы правы. Так и есть. Я повторяю то что сделали другие, потому что сам не умею программы составлять. Таких как я много,... В конце концов кто ещё проверит то что выкладывают бОлее грамотные люди ;)
 

VICLER

★★★★★★✩
9 Дек 2019
801
662
Hamburg
@konoev, ну я не говорю, что не потянет. Просто с редуктором лучше хотя бы из-за соображений энергоэффективности. Маленький мотор меньше потребляет и греется, а за счёт редуктора момент больше. Если собирать автономный вариант, то тут выбор очевиден
 

Старик Похабыч

★★★★★★★
14 Авг 2019
4,267
1,303
Москва
@VICLER, Ну , в общем , я угадал. Если шаги записать пропорционально, то вполне можно на аналоговых выхода сделать дробление шагов. У меня , к сожалению , сейчас только транзисторный ключ к такому шаговику, пока сделал для тест вот такую штуку https://yadi.sk/i/GxrMGjarloUuGA
Кнопка щелкает, но не подключена, когда она щелкает, то я замыкаю пару контактов , прерывание на 2-ом пине. Это 0. Инициация . Далее отскок от кнопки на 2 градуса, а потом вполне четко бегает по 30 градусов в одну и другую сторону. Код для примера вставил. Правил прям пример из библиотеки. Ниже моя "фирменная" функция, которая показывает кол-во циклов в секунду, что выполняет цикл loop. По нему можно судить об отзывчивости скетча, если менее 10к , то энкодер без прерываний уже будет работать с трудом.

C++:
/***************************************************
  Copyright (c) 2017 Luis Llamas
  (www.luisllamas.es)

  Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0

  Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License
 ****************************************************/

#include "AsyncStepperLib.h"
#include <Stepper.h>

const int motorPin1 = 8;
const int motorPin2 = 9;
const int motorPin3 = 10;
const int motorPin4 = 11;
const int numSteps = 8;
const int stepsLookup[8] = { B1000, B1100, B0100, B0110, B0010, B0011, B0001, B1001 };
int stepCounter = 0;


bool is_stop = false;

void clockwise()
{
  stepCounter++;
  if (stepCounter >= numSteps) stepCounter = 0;
  setOutput(stepCounter);
}

void anticlockwise()
{
  stepCounter--;
  if (stepCounter < 0) stepCounter = numSteps - 1;
  setOutput(stepCounter);
}

void setOutput(int step)
{
  digitalWrite(motorPin1, bitRead(stepsLookup[step], 0));
  digitalWrite(motorPin2, bitRead(stepsLookup[step], 1));
  digitalWrite(motorPin3, bitRead(stepsLookup[step], 2));
  digitalWrite(motorPin4, bitRead(stepsLookup[step], 3));
}

const int stepsPerRevolution = 4076;
AsyncStepper stepper1(stepsPerRevolution,
[]() {
  clockwise();
},
[]() {
  anticlockwise();
}
                     );

void rotateCW()
{
  delay(500);
  stepper1.Rotate(30, AsyncStepper::CW, rotateCCW);
}

void rotateCCW()
{
  delay(500);
  stepper1.Rotate(30, AsyncStepper::CCW, rotateCW);
}

void StopStepper()
{
  if (is_stop) return;
  stepper1.Stop();
  is_stop = true;
}

void setup()
{
  Serial.begin(115200);

  pinMode(2, INPUT_PULLUP);

  pinMode(motorPin1, OUTPUT);
  pinMode(motorPin2, OUTPUT);
  pinMode(motorPin3, OUTPUT);
  pinMode(motorPin4, OUTPUT);

  stepper1.SetSpeedRpm(12);
  stepper1.RotateContinuos(AsyncStepper::CCW);

  attachInterrupt(0, StopStepper, FALLING );

  while (!is_stop)
  {
    stepper1.Update();
  }
  Serial.println("END");
  delay(1000);
  stepper1.Rotate(2, AsyncStepper::CW,rotateCW);
}



void loop()
{
  stepper1.Update();
}

//========================================================================================================================//
void ShowFPS()
{
  static uint32_t tm_m = 0;
  static uint32_t cnt_m = 0;
  cnt_m++;
  if ((millis() - tm_m) > 1000)
  {
    Serial.print("loop per sec: "); Serial.println(cnt_m);
    cnt_m = 0;
    tm_m = millis();
  }
}
 

VICLER

★★★★★★✩
9 Дек 2019
801
662
Hamburg
@Старик Похабыч, вполне можно, только делать это лучше на каком-нибудь dsp или fpga.
А сколько у Вас получается циклов loop в секунду стаким управлением шаговика?

Я вот потихоньку доделываю всю механику. Нашёл микро концевик для мотора, тесты показали, что всё работает идеально)
IMG_20200319_135827.jpg

upd:
попробовал вашу "фирменную" функцию. 2048 шагов на оборот двигателя, при скорости 20 об/мин функция выдаёт
1/16 микрошаг - 35,8 kHz
1/8 микрошаг - 38,5kHz
1/4 микрошаг - 38,8kHz
1/2 микрошаг - 38,5kHz
 
Изменено:

Старик Похабыч

★★★★★★★
14 Авг 2019
4,267
1,303
Москва
@VICLER, больш 200 000 циклов.
Микроконцевик класс. Ну я поставил то, что есть , это от мышкиной кнопки. самое мелкое что есть

а 20 обороторв в минуту не выдает. Я 12 оставил , 14 уже не работает, но стоит 4к шагов
 

VICLER

★★★★★★✩
9 Дек 2019
801
662
Hamburg
@Старик Похабыч, попробовал я пример из AsyncStepper. 4076 шагов на оборот, скорость 20об/мин. Частота выполнения loop() получается 106,8kHz. Как у Вас получилось >200кHz? Пробовал на Nano и Micro, разница только в одну тысячу в пользу нано.
Немного оптимизировал свою библиотеку и теперь получается быстрее, чем AsyncStepper с одинаковыми параметрами. При тех же 4076 шагах на оборот и 20об/мин получилось 110kHz свободных для loop()
 

Старик Похабыч

★★★★★★★
14 Авг 2019
4,267
1,303
Москва
Наврал :D Был значит какой то другой пример, на каком я увидел эту скорость, я ее смотрю постоянно, а тут не проверил, перезагрузил пример и получил 44-45 к, скорость 12

Это пустой скетч.
loop per sec: 289155
loop per sec: 289450
loop per sec: 289155
 

Gusech

✩✩✩✩✩✩✩
28 Дек 2019
2
0
Столкнулся с проблемой, горят только первые 2 светодиода, остальные не работают.
Менял провода, и доп питание подавал, и по направлению стрелочки соединено, пробовал ставить старые прошивки.. Все детали работают (серво, кнопки, дисплей) и только первые 2 диода работают как надо, остальные не горят. Помогите в чем проблема?
 

Praporatorr

★★★✩✩✩✩
8 Дек 2019
86
108
@Хирург, высокотехнологичный инструмент для снятия фаски. Уголок+ лезвие канцелярского ножа :)
 

Вложения

Gusech

✩✩✩✩✩✩✩
28 Дек 2019
2
0
@VICLER, спасибо, все работает. Чет не подумал на замену диода)

У меня система ждет 15 секунд и выключается. Как мне отключить эту функцию или может продлить?
 

VICLER

★★★★★★✩
9 Дек 2019
801
662
Hamburg
У меня система ждет 15 секунд и выключается. Как мне отключить эту функцию или может продлить?
в файле gyverdrink:
timerMinim TIMEOUTtimer(15000); // таймаут дёргания приводом
можете продлить, либо для того, чтобы совсем убрать закомментируйте строку timeoutTick(); в файле b_loop
 
  • Лойс +1
Реакции: konoev и Хирург