Помогите Подправить код.
- Войдите на сайт для отправки комментариев
Сб, 16/02/2019 - 17:35
Нужно добавить в скетч возможность плавно стартовать и останавливать 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);
}
}
Стесняюсь спросить у такого продвинутого кодера - а чего делаем-то? Схема есть или это выше Ваших пониманий? А алгоритм? (ну тут наверное совсем не в кассу...)
Прикольный мотор. По чему-то типа RS232/RS485 управляется? Помню, что с похожим тринамиком мы долго долбались, пока поняли что и как надо делать ))
Ну не уверен что этот код вам поможет
//---кнопки----------------------------- 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 ();//<-похоже это я потерял }Вместо ЛЕД мотор ?
https://www.youtube.com/watch?v=VVQHvDu9Ohk
Извиняюсь, отсутствовал.
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 аппаратурой, будет кататься по горизонтально натянутому канату. Задача избавиться от резких стартов и остановок, которые паразитно сказываются на работе всей системы в целом. Из за резкого торможения и набора скорости, канат начинает колбасить, что сводит на нет всю работу системы. Собственно это все.
А с 25 по 30 строку это что и зачем, по Вашему? Если сами не знаете, то спросите у приятеля. По мне - так сущий бред.
Прямо сейчас убрал эти строки, скетч компилируется, но мотор на команды не реагирует. Я так понимаю это привязка к приемнику. Приятель тоже не силен в программировании. Он где-то на просторах инета его раздобыл.
Замечательно! Теперь смотрим на строки 37-38. Они тоже ничего не делают.
Да и вообще - Ваша программа ничего не делает. Она должна изменять скорость по каким-то условиям, но по факту скорость (speed) зависит от rc1_val, которая никак не изменяется, да и вообще ее значение не определено. Короче - пустышка.
Советую Вам до программирования расписать алгоритм работы Вашего устройства, но не как вначале "на отвали", а вдумчиво. Такой-то датчик (или кнопка) подает сигнал туда-то, если сигнал такой, то скорость снижается на столько-то за такой-то промежуток времени, если сигнал такой, то ускоряется до - за... И т.д. Программа пишется на основании алгоритма работы, а не на том, что Вы где-то скопировали не понимая что.
Кстати, не могу не упомянуть, что на тринамике, с которым я имел дело, акселерация задается отдельной командой и извращений с разгоном через МК не требуется. Не исключено, что нужно несколько раз прочесть документацию на движок.
Вот и я о том же. В примерах драйвера эти команды имеются и прекрасно сами по себе работают, вот только внедрить их в имеющийся скетч никак у меня не выходит.
Для mykaida Я вообще ни капли не программист, немного почитал форум и попробовал некоторые безделушки сделать самостоятельно, но все это начальный уровень. То что мне нужно, хорошо показано в нижеприведенном ролике. Смотрите с 3:06 по 3:18. Скетч что выше работает линейно, а надо с акселерацией как на ролике.
https://www.youtube.com/watch?v=zwbO7pN-BA4
На видео мотор управляется через L298N, а не через RS232 или типа того. Это может оказаться совершенно разными вещами.
Моё мнение: простые советы Вам могут не помочь, нужны специфические знания о том, чем Вы пытаетесь рулить.
Вы абсолютно правы. Ролик я привел в пример для того, чтобы было понятно о чем идет речь. ПДФ используемого мною в этом проекте драйвера можно посмотреть по ссылке: https://www.dimensionengineering.com/datasheets/SyRen50.pdf
Скачать к нему необходимые библиотеки с примерами можно тут: https://www.dimensionengineering.com/info/arduino
Скажите, а зачем смотреть PDF и устанавливать библиотеки. Это ведь вам нужно, а не нам. И что означает единица в строке ST.motor(1, power);. Кажется адрес задавали 128 или это так надо?