Управление шаговым двигателем через аппаратуру радиоуправления.

dmitrych
Offline
Зарегистрирован: 13.01.2020

Приветствую вас! Помогите пожалуйста, есть плата arduino leonardo, драйвер a4988, и шаговый двигатель от DVD, и аппаратура управления Taranis c приемником x8r 8 каналов. Идея такая управлять скоростью и направлением вращения мотора через PWM сигнал. В интернете вообще ни какой инфы не нашел. 

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

А помощь какая нужна - в чём именно?

dmitrych
Offline
Зарегистрирован: 13.01.2020

Что бы драйвер шагового двигателя понимал сигнал PWM и мог совершать поворот в ту или иную сторону при отклонении стика на радиоаппаратуре

b707
Offline
Зарегистрирован: 26.05.2017

а PWМ тут зачем? у вас драйвер 4988, он работает не через PWM, а через импульсы. Может вы именно поэтому и не можете найти примеров в гугле, что так никто не делает?

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

Вы не поняли моего вопроса.

Я Вас спросил

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

А помощь какая нужна - в чём именно?

А Вы мне что?

dmitrych пишет:

Что бы драйвер шагового двигателя понимал сигнал PWM и мог совершать поворот в ту или иную сторону при отклонении стика на радиоаппаратуре

И что? Я опять не понял, а от нас Вы чего именно ждёте?

Ответьте пожалуйста что-то типа:

1) нужно, чтобы кто-то сделал это под ключ;
2) нужно, чтобы кто-то написал скетч под мою схему подключения ;
3) нужно чтобы кто-то посмотрел на мои скетч и схему подключения и подсказал что не так;
4) нужно, чтобы мне посоветовали литературу и ссылки;
5) нужно, чтобы мне пожелали удачи.

Ну, или что-то типа того, чтобы было понятно, что именно Вам нужно.

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

Напиши программу. Принимай ардуиной с помощью функции pulseIn сигнал с пульта. Крайние положения стика соответствуют получаемым значениям 800 и 2400. Пересчитай полученное значение в шаги и скорость и отправляй в А4988 команды на поворот двигателя. В интернете есть отдельно про первую и про вторую задачу. Тебе надо объединить их.

Onkel
Offline
Зарегистрирован: 22.02.2016

на 8 каналов нужно использовать "родные" для мк внешние прерывания, чтобы определять длительность импульсов радиоуправления.  В форуме обсуждался прием сигналов от RF пультов, думаю где-то год назад. Нужно уметь работать с "родными" прерываниями, котоорых у мк 24, а у Arduino IDE только 2.  

Я это делал и на atmega328 и описывал на английском если разберетесь https://hackaday.io/project/158463-multi-purpose-remote-control-interface-set

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

Штозачушь, онкель? Ардуино IDE запрещает пользоваться PCINT или Честный Си более лучше работает с ISR? Али, мошт магическим образом увеличивает количество External Interrupt на 328-м МК до двух десятков? 

dmitrych
Offline
Зарегистрирован: 13.01.2020

Добрый день! Просто интересуют литературы и ссылки. Может кто то делал уже такое. Есть скетч. Приемник с двух каналом отправляет частоту 800-2400, а регулятор оборотов через ардуинку меняет скорость и направление. Я вечером выложу его

Onkel
Offline
Зарегистрирован: 22.02.2016

dmitrych пишет:

Добрый день! Просто интересуют литературы и ссылки. Может кто то делал уже такое. Есть скетч. Приемник с двух каналом отправляет частоту 800-2400, а регулятор оборотов через ардуинку меняет скорость и направление. Я вечером выложу его

У Вас же 8 каналов? Вот на пример с 3 каналами я и дал ссылку выше. Увеличить до 8 каналов можно и нетрудно, когда разберетесь как работает с 3.  Вот эта штука в работе
https://youtu.be/vy2QW-3iN0o

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

dmitrych пишет:

Добрый день! Просто интересуют литературы и ссылки. Может кто то делал уже такое. Есть скетч. Приемник с двух каналом отправляет частоту 800-2400, а регулятор оборотов через ардуинку меняет скорость и направление. Я вечером выложу его

а сколько каналов думаете задействовать?

Я тут тележкой управляю по двум каналам, пульт правда не такой крутой как у Вас, флайскай (три типа их есть у меня)
 

Onkel
Offline
Зарегистрирован: 22.02.2016

Во-во, как раз тему управления мы в теме уважаемого ua6em и обсуждали, там и примеры для 3 и более каналов для atmega328.

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

Onkel пишет:

Во-во, как раз тему управления мы в теме уважаемого ua6em и обсуждали, там и примеры для 3 и более каналов для atmega328.

я то пошёл дальше, 8 каналов принимаю по одному цифровому пину )))

Onkel
Offline
Зарегистрирован: 22.02.2016

ua6em пишет:

 

я то пошёл дальше, 8 каналов принимаю по одному цифровому пину )))

Да, дальше некуда "меньше 1 нет смысла", но не все пульты дают цифровой канал. У вас какой- FlySky?

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

Onkel пишет:

ua6em пишет:

 

я то пошёл дальше, 8 каналов принимаю по одному цифровому пину )))

Да, дальше некуда "меньше 1 нет смысла", но не все пульты дают цифровой канал. У вас какой- FlySky?

у меня их три, один перешит на 14 каналов, его для SBUS и использую, есть еще и Футаба, старенькая, но 2.4ггц

dmitrych
Offline
Зарегистрирован: 13.01.2020

Да там одного будет принципе достаточно. На работе ютуб не открывается, сегодня гляну. Спасибо всем кто откликнулся. Если что на пишу и фото выложу проекта

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

dmitrych пишет:

Да там одного будет принципе достаточно. На работе ютуб не открывается, сегодня гляну. Спасибо всем кто откликнулся. Если что на пишу и фото выложу проекта

ну для одного канала вообще есть классная библиотека с точностью до 0,01мксек, не знаю как на таранисе, а иные моросят значительно (на порядки) сильнее

Onkel
Offline
Зарегистрирован: 22.02.2016

ua6em пишет:

   т на 14 каналов, его для SBUS и использую..

Сами писали? Есть протокол? Или использовали библиотеку? Мне интересно самому написать.

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

Onkel пишет:

ua6em пишет:

   т на 14 каналов, его для SBUS и использую..

Сами писали? Есть протокол? Или использовали библиотеку? Мне интересно самому написать.

это вы мне польстили, содрал из простор интернета )))

Onkel
Offline
Зарегистрирован: 22.02.2016

ua6em пишет:

 

это вы мне польстили, содрал из простор интернета )))

Ну хорошему человеку раз в год можно и польстить.  А то у меня есть пара пультов с этим sbus, руки не доходят, да и пока некуда вставить. 

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

Onkel пишет:

  А то у меня есть пара пультов с этим sbus, руки не доходят, да и пока некуда вставить. 

находил несколько реализаций, в одной была ссылка на ролик, там осциллограммы показывали, как это работает, не сохранил, свой код содрал с ардупилота по моему, но сейчас интересно было бы самому написать...

когда таймера по изучал...

dmitrych
Offline
Зарегистрирован: 13.01.2020
byte PWM_PIN_S = 7; //steering(руль)ch1/ d7
int pwm_value_s; //что получаем с канала 1
byte PWM_PIN_T = 8; //throttle(газ)ch2/ d8
int pwm_value_t; //что получаем с канала 2

byte Ain1 = 5;
byte Ain2 = 6;
byte Bin1 = 9;
byte Bin2 = 10;

int pwm_front = 0;
int pwm_back = 0;
int pwm_right = 0;
int pwm_left = 0;

void setup() {
  pinMode(PWM_PIN_T, INPUT);
  pinMode(PWM_PIN_S, INPUT);

  pinMode(Ain1, OUTPUT);
  pinMode(Ain2, OUTPUT);
  pinMode(Bin1, OUTPUT);
  pinMode(Bin2, OUTPUT);

  Serial.begin(9600);
}
 
void loop() {
  pwm_value_t = pulseIn(PWM_PIN_T, HIGH);
  pwm_value_s = pulseIn(PWM_PIN_S, HIGH);

  if(pwm_value_t>700){
    pwm_front = map(constrain(pwm_value_t,1000,1500),1000,1500,255,0); 
  }
  else pwm_front=0;

  pwm_back = map(constrain(pwm_value_t,1600,1980),1600,1980,0,255);
  
  if(pwm_value_s>700){
    pwm_right = map(constrain(pwm_value_s,920,1400),920,1400,255,0);
  }
  else pwm_right=0;
 
  pwm_left = map(constrain(pwm_value_s,1430,1890),1430,1890,0,255);

  int d_right=0;
  int d_left=0;
  

if(pwm_front>25){
  d_right=map(pwm_right,0,255,0,pwm_front);
  d_left=map(pwm_left,0,255,0,pwm_front);
    if(pwm_right>25){
      analogWrite(Ain2, pwm_front);
      analogWrite(Ain1,0);
      analogWrite(Bin2, pwm_front-d_right);
      analogWrite(Bin1, 0);
    }
    else if(pwm_left>25){
      analogWrite(Ain2, pwm_front-d_left);
      analogWrite(Ain1, 0);
      analogWrite(Bin2,pwm_front);
      analogWrite(Bin1, 0);
    }
    else{
      analogWrite(Ain2, pwm_front);
      analogWrite(Ain1, 0);
      analogWrite(Bin2,pwm_front);
      analogWrite(Bin1, 0);
    }
  }
  else if(pwm_back>25){
    d_right=map(pwm_right,0,255,0,pwm_back);
    d_left=map(pwm_left,0,255,0,pwm_back);
    if(pwm_right>25){ 
      analogWrite(Ain2,0);
      analogWrite(Ain1, pwm_back);
      analogWrite(Bin2, 0);
      analogWrite(Bin1, pwm_back-d_right);
    }
    else if(pwm_left>25){
      analogWrite(Ain2,0);
      analogWrite(Ain1, pwm_back-d_left);
      analogWrite(Bin2, 0);
      analogWrite(Bin1, pwm_back);
    }
    else{
      analogWrite(Ain2,0);
      analogWrite(Ain1, pwm_back);
      analogWrite(Bin2, 0);
      analogWrite(Bin1, pwm_back);
    }
  }
  else{
      analogWrite(Ain1,0);
      analogWrite(Ain2, 0);
      analogWrite(Bin1, 0);
      analogWrite(Bin2, 0);
  }

  Serial.print("accelerate: ");
  Serial.print(pwm_value_t);
  Serial.print(" | steering: ");
  Serial.print(pwm_value_s);
  Serial.print(" | front: ");
  Serial.print(pwm_front);
  Serial.print(" | back: ");
  Serial.print(pwm_back);
  Serial.print(" | right: ");
  Serial.print(pwm_right);
  Serial.print(" | left: ");
  Serial.println(pwm_left);

}

 

dmitrych
Offline
Зарегистрирован: 13.01.2020

Вообщем такой скетч. Идея постройки робота Wall-E. С канала PWM 2 и 3 приходит сингал шим на порты d7 и d8. При отколонении стиков все движется как и задумано. А с канала 1 приемника радиоаппаратуры идея принимать шим сингал на ардунку, конвертировать в понятный сигнал для  драйвера шагового двигателя ни робот будет делать захват предметов.

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

а проверку на вхождение сигнала в нужный диапазон PWM и защиту от искровой и наводок 50 герц ? )))

PS пульсеин не использовал, как у него с этим не знаю, чисто теоретически так сказать )))

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

Я pulseIn использовал. Точно так же. Влито в тиньку25 и крутит лебёдку, включает ходовые огни и фонарь заднего хода в зависимости от положения и направления перемещения стика. Всё на соревнованиях на копиях военных машин. Никаких искровых наводок и 50 Гц никогда не мешало.

dmitrych
Offline
Зарегистрирован: 13.01.2020

Вообщем чуть подправил. С третьего канала приемника принимает шим сигнал. В голове не укладывается как это сигнал сделать так что бы понимал драйвер шагового двигателя. Вообще ни где не нешл

 

byte PWM_PIN_S = 7; //steering(руль)ch1/ d7
int pwm_value_s; //что получаем с канала 1
byte PWM_PIN_T = 8; //throttle(газ)ch2/ d8
int pwm_value_t; //что получаем с канала 2
byte PWM_PIN_U = 4; //up(вверх)ch3/ d4
int pwm_value_u; //что получаем с канала 3

byte Ain1 = 5;
byte Ain2 = 6;
byte Bin1 = 9;
byte Bin2 = 10;

int pwm_front = 0;
int pwm_back = 0;
int pwm_right = 0;
int pwm_left = 0;
int pwm_up = 0;

void setup() {
  pinMode(PWM_PIN_T, INPUT);
  pinMode(PWM_PIN_S, INPUT);
  pinMode(PWM_PIN_U, INPUT);

  pinMode(Ain1, OUTPUT);
  pinMode(Ain2, OUTPUT);
  pinMode(Bin1, OUTPUT);
  pinMode(Bin2, OUTPUT);

  Serial.begin(9600);
}
 
void loop() {
  pwm_value_t = pulseIn(PWM_PIN_T, HIGH);
  pwm_value_s = pulseIn(PWM_PIN_S, HIGH);
  pwm_value_u = pulseIn(PWM_PIN_U, HIGH);

    if(pwm_value_t>700){
    pwm_front = map(constrain(pwm_value_t,1000,1500),1000,1500,255,0); 
  }
  else pwm_front=0;

  pwm_back = map(constrain(pwm_value_t,1600,1980),1600,1980,0,255);
  
  if(pwm_value_s>700){
    pwm_right = map(constrain(pwm_value_s,920,1400),920,1400,255,0);
  }
  else pwm_right=0;
 
  pwm_left = map(constrain(pwm_value_s,1430,1890),1430,1890,0,255);
  pwm_up = map(constrain(pwm_value_u,1430,1890),1430,1890,0,255);    

  int d_right=0;
  int d_left=0;
  int d_up=0;

  

if(pwm_front>25){
  d_right=map(pwm_right,0,255,0,pwm_front);
  d_left=map(pwm_left,0,255,0,pwm_front);
    if(pwm_right>25){
      analogWrite(Ain2, pwm_front);
      analogWrite(Ain1,0);
      analogWrite(Bin2, pwm_front-d_right);
      analogWrite(Bin1, 0);
    }
    else if(pwm_left>25){
      analogWrite(Ain2, pwm_front-d_left);
      analogWrite(Ain1, 0);
      analogWrite(Bin2,pwm_front);
      analogWrite(Bin1, 0);
    }
    else{
      analogWrite(Ain2, pwm_front);
      analogWrite(Ain1, 0);
      analogWrite(Bin2,pwm_front);
      analogWrite(Bin1, 0);
    }
  }
  else if(pwm_back>25){
    d_right=map(pwm_right,0,255,0,pwm_back);
    d_left=map(pwm_left,0,255,0,pwm_back);
    if(pwm_right>25){ 
      analogWrite(Ain2,0);
      analogWrite(Ain1, pwm_back);
      analogWrite(Bin2, 0);
      analogWrite(Bin1, pwm_back-d_right);
    }
    else if(pwm_left>25){
      analogWrite(Ain2,0);
      analogWrite(Ain1, pwm_back-d_left);
      analogWrite(Bin2, 0);
      analogWrite(Bin1, pwm_back);
    }
    else{
      analogWrite(Ain2,0);
      analogWrite(Ain1, pwm_back);
      analogWrite(Bin2, 0);
      analogWrite(Bin1, pwm_back);
    }
  }
  else{
      analogWrite(Ain1,0);
      analogWrite(Ain2, 0);
      analogWrite(Bin1, 0);
      analogWrite(Bin2, 0);
  }

  Serial.print("accelerate: ");
  Serial.print(pwm_value_t);
  Serial.print(" | steering: ");
  Serial.print(pwm_value_s);
  Serial.print(" | front: ");
  Serial.print(pwm_front);
  Serial.print(" | back: ");
  Serial.print(pwm_back);
  Serial.print(" | right: ");
  Serial.print(pwm_right);
  Serial.print(" | left: ");
  Serial.println(pwm_left);
  Serial.print(" | up: ");
  Serial.println(pwm_up);


}

 

 

dmitrych
Offline
Зарегистрирован: 13.01.2020

Вообщем ни чего не получается. Ни какой информации не нашел ни где. У кого может есть какие идеи? поделитесь пожалуйста

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

dmitrych пишет:

Вообщем ни чего не получается. Ни какой информации не нашел ни где. У кого может есть какие идеи? поделитесь пожалуйста

а что должно получаться?
А если просто пример посмотреть?
 


/*
 Stepper Motor Control - speed control

 This program drives a unipolar or bipolar stepper motor.
 The motor is attached to digital pins 8 - 11 of the Arduino.
 A potentiometer is connected to analog input 0.

 The motor will rotate in a clockwise direction. The higher the potentiometer value,
 the faster the motor speed. Because setSpeed() sets the delay between steps,
 you may notice the motor is less responsive to changes in the sensor value at
 low speeds.

 Created 30 Nov. 2009
 Modified 28 Oct 2010
 by Tom Igoe

 */

#include <Stepper.h>

const int stepsPerRevolution = 200;  // change this to fit the number of steps per revolution
// for your motor


// initialize the stepper library on pins 8 through 11:
Stepper myStepper(stepsPerRevolution, 8, 9, 10, 11);

int stepCount = 0;  // number of steps the motor has taken

void setup() {
  // nothing to do inside the setup
}

void loop() {
  // read the sensor value:
  int sensorReading = analogRead(A0);
  // map it to a range from 0 to 100:
  int motorSpeed = map(sensorReading, 0, 1023, 0, 100);
  // set the motor speed:
  if (motorSpeed > 0) {
    myStepper.setSpeed(motorSpeed);
    // step 1/100 of a revolution:
    myStepper.step(stepsPerRevolution / 100);
  }
}

 

dmitrych
Offline
Зарегистрирован: 13.01.2020

Вот то же подумал по принципу патенциометра, только вместо потенциометра входной сигнал шим. Как добавить этот код в ардуино и исправить входной сигнал (к примеру


byte PWM_PIN_U = 4; //up(вверх)ch3/ d4
int pwm_value_u; //что получаем с канала 3

  
Не могу понять
DetSimen
DetSimen аватар
Offline
Зарегистрирован: 25.01.2017

dmitrych пишет:

вместо потенциометра входной сигнал шим. 

потанцометр и "входной сигнал шим"  это несколько разные вещи, я бы сказал. 

dmitrych
Offline
Зарегистрирован: 13.01.2020

Как же тогда? Ни какой информации ни где не нашел. Видимо ни кто  не заморачивался.

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

dmitrych пишет:

Ни какой информации ни где не нашел. Видимо ни кто  не заморачивался.

Видимо, действительно "ни кто" не заморачивался и потому "ни где" нет "ни какой" информации.

Вы будете первопроходцем. Решите эту задачу и осчастливите человечество новыми знаниями. А мы поставим Вам нерукотворный памятник.

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

dmitrych пишет:

Как же тогда? Ни какой информации ни где не нашел. Видимо ни кто  не заморачивался.

Тады, пойдите в обход, попробуйте выяснить, какой сигнал дает потанцометр, а какой ШИМ. Потом, начинаем следующий квест, как из сигнала ШИМ сделать сигнал подобный потанцометру. Так меленькими шажками, святой Грааль и отыщется. От.

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

dmitrych пишет:

Вот то же подумал по принципу патенциометра, только вместо потенциометра входной сигнал шим. Как добавить этот код в ардуино и исправить входной сигнал (к примеру


byte PWM_PIN_U = 4; //up(вверх)ch3/ d4
int pwm_value_u; //что получаем с канала 3

  
Не могу понять

это ты так сообщество троллишь? Оригинально )))
 

dmitrych
Offline
Зарегистрирован: 13.01.2020

Кто тролит? чита в начале. Я же написал новичек инфо не нашел. Если что то не так написал, скажи, а не остри

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

dmitrych пишет:

Кто тролит? чита в начале. Я же написал новичек инфо не нашел. Если что то не так написал, скажи, а не остри

уже сказал...или не читатель?