Помогите Подправить код.

NVN Plus
Offline
Зарегистрирован: 04.12.2017

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

#include <SoftwareSerial.h>
#include <Sabertooth.h>

SoftwareSerial SWSerial(NOT_A_PIN, 11); // RX on no pin (unused), TX on pin 11 (to S1).
Sabertooth ST(128, SWSerial); // Address 128, and use SWSerial as the serial port.

void setup()
{
  SWSerial.begin(9600);
  ST.autobaud();
}

void loop()
{
  int power;
  
  // Ramp from -127 to 127 (full reverse to full forward), waiting 20 ms (1/50th of a second) per value.
  for (power = -127; power <= 127; power ++)
  {
    ST.motor(1, power);
    delay(20);
  }
  
  // Now go back the way we came.
  for (power = 127; power >= -127; power --)
  {
    ST.motor(1, power);
    delay(20);
  }
}

 

 

mykaida
mykaida аватар
Offline
Зарегистрирован: 12.07.2018

Стесняюсь спросить у такого продвинутого кодера - а чего делаем-то? Схема есть или это выше Ваших пониманий? А алгоритм? (ну тут наверное совсем не в кассу...)

sadman41
Offline
Зарегистрирован: 19.10.2016

Прикольный мотор. По чему-то типа RS232/RS485 управляется? Помню, что с похожим тринамиком мы долго долбались, пока поняли что и как надо делать ))

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

Ну не уверен что этот код вам поможет

//---кнопки-----------------------------
typedef void (*pDo)();
class Cl_btn {
  protected:
    byte pin;
    bool state;
    unsigned long past;
    void set(bool s) {
      state = s;
      past = millis();
      switch (s) {
        case false:
          break;
        case true:
          Do();
          break;
      }
    }
  public:
    Cl_btn(byte p): pin(p) {}
    pDo Do = [] {};
    void init() {
      pinMode(pin, INPUT_PULLUP);
      set(false);
    }
    void run() {
      if (millis() - past >= 100)
        switch (state) {
          case false:
            if (!digitalRead(pin))set(true);
            break;
          case true:
            if (digitalRead(pin))set(false);
            break;
        }
    }
};
const int numBtn = 2;
Cl_btn Btn[numBtn] = {
  Cl_btn(/*пин*/2),  //кнопка верх
  Cl_btn(/*пин*/3)   //кнопка вниз
};
//------------Motor--------------------------------------------------------
typedef void (*pDo)();
pDo run = [] {};
// состояние
const byte sRun  = 0;
const byte sStop = 1;
const byte sUp   = 2;
const byte sDown = 3;
byte state;
const unsigned long time002s = 20;
void set(byte s) {
  static int power;
  static unsigned long past;
  past = millis();
  state = s;
  switch (s) {
    case sRun:
      power = 127;
      run = [] {};
      break;
    case sStop:
      power = -127;
      run = [] {};
      break;
    case sUp:
      run = [] {
        if (millis() - past >= time002s) {
          if (power < 127) {
            power++;
            set(sUp);
          }
          else set(sRun);
        }
      };
      break;
    case sDown:
      run = [] {
        if (millis() - past >= time002s) {
          if (power > -127) {
            power--;
            set(sDown);
          }
          else set(sStop);
        }
      };
      break;
  }
}
//--------------------------------------------------------------------
void setup() {
  for (int i = 0; i < numBtn; i++)Btn[i].init();
  Btn[0].Do = [] {set(sUp);}; // команда на разгон
  Btn[1].Do = [] {set(sDown);};// команда на торможенипе
}

void loop() {
  for (int i = 0; i < numBtn; i++)Btn[i].run();
  run ();//<-похоже это я потерял
}

 

gena321
Offline
Зарегистрирован: 19.01.2019

Вместо ЛЕД мотор ?

https://www.youtube.com/watch?v=VVQHvDu9Ohk

 

NVN Plus
Offline
Зарегистрирован: 04.12.2017

Извиняюсь, отсутствовал.

qwone, спасибо что откликнулись и за попытку помочь. У вас что-то близкое к решению моей задачи. Не хотел публиковать скетч, т.к. одолжил его у приятеля, но думаю не велика его ценность, публикую..

 // Software Serial Sample for Packet Serial
// Copyright (c) 2012 Dimension Engineering LLC
// See license.txt for license details.

#include <SoftwareSerial.h>
#include <Sabertooth.h>

SoftwareSerial SWSerial(NOT_A_PIN, 11); // RX on no pin (unused), TX on pin 11 (to S1).
Sabertooth ST(128, SWSerial); // Address 128, and use SWSerial as the serial port.

int speed;
int ppm1 = 20;

unsigned long rc1_PulseStartTicks;        
volatile int rc1_val;  

void setup() {
         SWSerial.begin(9600);
         pinMode(ppm1, INPUT); 
         attachInterrupt(3, rc1, CHANGE);   
         Serial.begin(9600);
        
 }

void rc1() {
         if (digitalRead( ppm1 ) == HIGH)
                 rc1_PulseStartTicks = micros();    
         else
                 rc1_val = micros() - rc1_PulseStartTicks; 
}

void loop() {
        
        if(rc1_val > 0 && rc1_val < 2000){
        speed = map(rc1_val,990,1980,-127,127);
        ST.motor(1, speed);
        if (speed < -5);
        else if (speed > 5);
        delay(30);
     }
  }

Кратко о проекте. Телега управляемая RC аппаратурой, будет кататься по горизонтально натянутому канату. Задача избавиться от резких стартов и остановок, которые паразитно сказываются на работе всей системы в целом. Из за резкого торможения и набора скорости, канат начинает колбасить, что сводит на нет всю работу системы. Собственно это все.

 

 

mykaida
mykaida аватар
Offline
Зарегистрирован: 12.07.2018

А с 25 по 30 строку это что и зачем, по Вашему? Если сами не знаете, то спросите у приятеля. По мне - так сущий бред.

NVN Plus
Offline
Зарегистрирован: 04.12.2017

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

mykaida
mykaida аватар
Offline
Зарегистрирован: 12.07.2018

Замечательно! Теперь смотрим на строки 37-38. Они тоже ничего не делают.

Да и вообще - Ваша программа ничего не делает. Она должна изменять скорость по каким-то условиям, но по факту скорость (speed) зависит от rc1_val, которая никак не изменяется, да и вообще ее значение не определено. Короче - пустышка.

Советую Вам до программирования расписать алгоритм работы Вашего устройства, но не как вначале "на отвали", а вдумчиво. Такой-то датчик (или кнопка) подает сигнал туда-то, если сигнал такой, то скорость снижается на столько-то за такой-то промежуток времени, если сигнал такой, то ускоряется до - за... И т.д. Программа пишется на основании алгоритма работы, а не на том, что Вы где-то скопировали не понимая что.

sadman41
Offline
Зарегистрирован: 19.10.2016

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

NVN Plus
Offline
Зарегистрирован: 04.12.2017

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

Для mykaida Я вообще ни капли не программист, немного почитал форум и попробовал некоторые безделушки сделать самостоятельно, но все это начальный уровень. То что мне нужно, хорошо показано в нижеприведенном ролике. Смотрите с 3:06 по 3:18. Скетч что выше работает линейно, а надо с акселерацией как на ролике.

https://www.youtube.com/watch?v=zwbO7pN-BA4

sadman41
Offline
Зарегистрирован: 19.10.2016

На видео мотор управляется через L298N, а не через RS232 или типа того. Это может оказаться совершенно разными вещами. 

Моё мнение: простые советы Вам могут не помочь, нужны специфические знания о том, чем Вы пытаетесь рулить.

 

NVN Plus
Offline
Зарегистрирован: 04.12.2017

Вы абсолютно правы. Ролик я привел в пример для того, чтобы было понятно о чем идет речь. ПДФ используемого мною в этом проекте драйвера можно посмотреть по ссылке: https://www.dimensionengineering.com/datasheets/SyRen50.pdf

Скачать к нему необходимые библиотеки с примерами можно тут: https://www.dimensionengineering.com/info/arduino

 

nik182
Offline
Зарегистрирован: 04.05.2015

Скажите, а зачем смотреть PDF и устанавливать библиотеки. Это ведь вам нужно, а не нам.  И что означает единица в строке ST.motor(1, power);. Кажется адрес задавали 128 или это так надо?