• Добро пожаловать на компьютерный форум Tehnari.ru. Здесь разбираемся с проблемами ПК и ноутбуков: Windows, драйверы, «железо», сборка и апгрейд, софт и безопасность. Форум работает много лет, сейчас он переехал на новый движок, но старые темы и аккаунты мы постарались сохранить максимально аккуратно.

    Форум не связан с магазинами и сервисами – мы ничего не продаём и не даём «рекламу под видом совета». Отвечают обычные участники и модераторы, которые следят за порядком и качеством подсказок.

    Если вы у нас впервые, загляните на страницу о форуме и правила – там коротко описано, как задать вопрос так, чтобы быстро получить ответ. Чтобы создавать темы и писать сообщения, сначала зарегистрируйтесь, а затем войдите под своим логином.

    Не знаете, с чего начать? Создайте тему с описанием проблемы – подскажем и при необходимости перенесём её в подходящий раздел.
    Задать вопрос Новые сообщения Как правильно спросить
    Если пришли по старой ссылке со старого Tehnari.ru – вы на нужном месте, просто продолжайте обсуждение.

Танк на Ардуино

  • Автор темы Автор темы Kisar
  • Дата начала Дата начала

Kisar

Ученик
Почётный участник
Регистрация
28 Июн 2014
Сообщения
246
Реакции
14
Баллы
0
Танк на Ардуино

Всем доброго времени суток!

Собрал для детей танк, все части распечатал на 3Д принтере. Использую Arduino nano, lm298 и плату от геймпада PS2. Все получилось замечательно, но есть одна загвоздка. При движении в любом направлении видно что танк "подтупливает". Выражается это в том, что он начинает набирать скорость, потом резко ее сбрасывает и начинает опять набирать. то есть едет "рывками". Прилагаю код и видео работы. Заранее спасибо!

Видео:
https://www.youtube.com/watch?v=xFXih3cpEMc
 
 

Вложения

  • tank.txt
    tank.txt
    7.4 KB · Просмотры: 94
Просто отлично!
 
При движении в любом направлении видно что танк "подтупливает"
не вижу никаких "подтупливаний"
танк выполняет команду, пока нажата кнопка, останавливается после ее окончания и выполняет следующую.
в чем вы видите проблему?
совет
уменьшите в прошивке максимальную скорость танка, будет комфортнее управлять им
 
К сожалению не видно на видео, но слышно, что он рывками двигается. Вечером уменьшу скорость и пришлю видео работы. При низкой скорости хорошо видно
 
не вижу никаких "подтупливаний"
Почему? Отчетливо видно что едет именно рывками, как будто двигатели постоянно то стартуют, то останавливаются.
При движении в любом направлении видно что танк "подтупливает". Выражается это в том, что он начинает набирать скорость, потом резко ее сбрасывает и начинает опять набирать. то есть едет "рывками".
А как Адруинка подает сигнал на ключи управления двигателями? Там типа ШИМа реализовано для установки желаемой скорости или или просто постоянный сигнал для открытия ключей?
У меня похожая проблемка была на простенькой РУ игрушке, тоже движение рывками. Проблема была в загрязнении коллектора смазкой. Попробуйте подключить другой двигатель для проверки или имеющиеся разберите и очистите коллектор.
 
Почему? Отчетливо видно что едет именно рывками, как будто двигатели постоянно то стартуют, то останавливаются.

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

Двигатели проверены, подключал напрямую к источнику питания. Реализовано через ШИМ.
 
по моему в конце кода у вас скорость обнуляется с задержкой в 50 мс
с какой целью?
может в этом дело?

analogWrite(speedPinA, 0);
analogWrite(speedPinB, 0);
delay(50);
 
Согласен, проблема движения рывками связана с задержкой после выполнения команд в процедуре loop(). Значение переменной b=50мс, да ещё в конце явно задана задержка 50мс, вот и получается, что движется не плавно.
 
Поставил вместо delay(50) такой код:

Код:
if (!ps2x.NewButtonState())
 {
 analogWrite(speedPinA, 0);
  analogWrite(speedPinB, 0);
 }

и танк начинает очень долго отзываться на команды.


Идея то простая:
1) нажимаем на кнопку и двигаемся вперед
2) отпускаем кнопку и останавливаемся

Но почему-то никак не получается((

Все delay убрал
 
С интересом слежу.
Ардуино получу к лету, будет время поразвлекаться перед 1 сентября.
Очень хочется сделать что-то интересное. Есть даже 3д принтер, но у меня проблема бывает с выставлением горизонтальной платформы для печати, не всегда получается напечатать хорошо.
Танк соберу вряд ли, но наблюдать за темой очень интересно, спасибо!
 
По вашему коду получается, что при отпускании кнопки в порты, задающие скорость вращения двигателей, вы пишете 0, отсюда и остановка. Есть такое явление у кнопок, как дребезг контактов, покопайте в этом направлении. Тут много полезных советов есть, может, найдёте решение.

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

Код:
if (!ps2x.NewButtonState())
{
analogWrite(speedPinA, 0);
analogWrite(speedPinB, 0);
}
и танк начинает очень долго отзываться на команды.
это вы зря
попробуйте вместо
Код:
 analogWrite(speedPinA, 0);
  analogWrite(speedPinB, 0);
 delay(50);
сначала просто
Код:
 delay(50);
если результат будет не удовлетворительным, то так
Код:
analogWrite(speedPinA, Х);
  analogWrite(speedPinB, Х);
 delay(50);
где вместо Х подставляйте для экспериментов разные числа например от 20 до 255
 
это вы зря
попробуйте вместо
Код:
 analogWrite(speedPinA, 0);
  analogWrite(speedPinB, 0);
 delay(50);
сначала просто
Код:
 delay(50);
если результат будет не удовлетворительным, то так
Код:
analogWrite(speedPinA, Х);
  analogWrite(speedPinB, Х);
 delay(50);
где вместо Х подставляйте для экспериментов разные числа например от 20 до 255

Так нельзя ставить((

Потому что если нажимаем кнопку вперёд, он едет вперёд и не останавливается пока не нажмёшь любую другую кнопку для смены направления.
 
Траки для гусениц сами замоделили или готовые брали?
 
это вы зря
попробуйте вместо
Код:
 analogWrite(speedPinA, 0);
  analogWrite(speedPinB, 0);
 delay(50);
сначала просто
Код:
 delay(50);
если результат будет не удовлетворительным, то так
Код:
analogWrite(speedPinA, Х);
  analogWrite(speedPinB, Х);
 delay(50);
где вместо Х подставляйте для экспериментов разные числа например от 20 до 255

По пунктам:
1) Танк двигается рывками
2) Танк двигается вперед и не останавливается пока не нажмешь на
кнопку смены направления и он начинает двигаться бесконечно в другом направлении
3) Изменяются рывки из-за смены скорости, но так продолжает бесконечное движение вперед.

Схему нарисовать тяжело, управление взято из готовы:

Arduino nano, LM298, плата радио PS2, step down для питания ардуино(сильно нагревается линейный стабилизатор на самом ардуино).

Вот собственно и вся схема)
 
Всем спасибо за помощь! Все получилось) я решил сделать все через if
HTML:
#include <PS2X_lib.h>  //for v1.6
// motor A
int dir1PinA = 2;
int dir2PinA = 4;
int speedPinA = 5;
// motor B
int dir1PinB = 7;
int dir2PinB = 8;
int speedPinB = 6;
//изменение максимальной скорости
int a = 127;
int b = 0;
PS2X ps2x; // create PS2 Controller Class
int error = 0; 
byte type = 0;
byte vibrate = 0;

void setup(){
 Serial.begin(57600);
 pinMode(13,OUTPUT);
pinMode(dir1PinA, OUTPUT);
pinMode(dir2PinA, OUTPUT);
pinMode(speedPinA, OUTPUT);
pinMode(dir1PinB, OUTPUT);
pinMode(dir2PinB, OUTPUT);
pinMode(speedPinB, OUTPUT);


 //CHANGES for v1.6 HERE!!! **************PAY ATTENTION*************
  
 error = ps2x.config_gamepad(13,11,10,12, true, true);   //setup pins and settings:  GamePad(clock, command, attention, data, Pressures?, Rumble?) check for error
 
 if(error == 0){
   Serial.println("Found Controller, configured successful");
   Serial.println("Try out all the buttons, X will vibrate the controller, faster as you press harder;");
  Serial.println("holding L1 or R1 will print out the analog stick values.");
  Serial.println("Go to www.billporter.info for updates and to report bugs.");
 }
   
  else if(error == 1)
   Serial.println("No controller found, check wiring, see readme.txt to enable debug. visit www.billporter.info for troubleshooting tips");
   
  else if(error == 2)
   Serial.println("Controller found but not accepting commands. see readme.txt to enable debug. Visit www.billporter.info for troubleshooting tips");
   
  else if(error == 3)
   Serial.println("Controller refusing to enter Pressures mode, may not support it. ");
   
   //Serial.print(ps2x.Analog(1), HEX);
   
   type = ps2x.readType(); 
     switch(type) {
       case 0:
        Serial.println("Unknown Controller type");
       break;
       case 1:
        Serial.println("DualShock Controller Found");
       break;
       case 2:
         Serial.println("GuitarHero Controller Found");
       break;
     }
  
}

void loop(){
    ps2x.read_gamepad(false, vibrate);          //read controller and set large motor to spin at 'vibrate' speed
   if(ps2x.Button(PSB_PAD_UP)) {         //will be TRUE as long as button is pressed
  digitalWrite(dir1PinA, HIGH);
  digitalWrite(dir2PinA, LOW);
  digitalWrite(dir1PinB, LOW);
  digitalWrite(dir2PinB, HIGH);
  analogWrite(speedPinA, a);
  analogWrite(speedPinB, a);
  delay(b);
  
 } else  if(ps2x.Button(PSB_PAD_RIGHT)){
  digitalWrite(dir1PinA, HIGH);
  digitalWrite(dir2PinA, LOW);
  digitalWrite(dir1PinB, HIGH);
  digitalWrite(dir2PinB, LOW);
  analogWrite(speedPinA, a);
  analogWrite(speedPinB, a);
  delay(b);
   }
      else  if(ps2x.Button(PSB_PAD_LEFT)){
  digitalWrite(dir1PinA, LOW);
  digitalWrite(dir2PinA, HIGH);
  digitalWrite(dir1PinB, LOW);
  digitalWrite(dir2PinB, HIGH);
  analogWrite(speedPinA, a);
  analogWrite(speedPinB, a);
  delay(b); 
  }
       else if(ps2x.Button(PSB_PAD_DOWN)){
  digitalWrite(dir1PinA, LOW);
  digitalWrite(dir2PinA, HIGH);
  digitalWrite(dir1PinB, HIGH);
  digitalWrite(dir2PinB, LOW);
  analogWrite(speedPinA, a);
  analogWrite(speedPinB, a);
  delay(b);
      }  
      else {  
  analogWrite(speedPinA, 0);
  analogWrite(speedPinB, 0);
  }
  
  
  
  
  
  
  
  
  
  
  
  
  
  /*
vibrate = ps2x.Analog(PSAB_BLUE);        //this will set the large motor vibrate speed based on 
                                              //how hard you press the blue (X) button    
                  //will be TRUE if any button changes state (on to off, or off to on)
    {
        if(ps2x.Button(PSB_L3))
         Serial.println("L3 pressed");
        if(ps2x.Button(PSB_R3))
         Serial.println("R3 pressed");
        if(ps2x.Button(PSB_L2))
         Serial.println("L2 pressed");
        if(ps2x.Button(PSB_R2))
         Serial.println("R2 pressed");
        if(ps2x.Button(PSB_GREEN))
         Serial.println("Triangle pressed");   
    }   
    if(ps2x.ButtonPressed(PSB_RED))             //will be TRUE if button was JUST pressed
         Serial.println("Circle just pressed");   
    if(ps2x.ButtonReleased(PSB_PINK))             //will be TRUE if button was JUST released
         Serial.println("Square just released");     
    if(ps2x.NewButtonState(PSB_BLUE))            //will be TRUE if button was JUST pressed OR released
         Serial.println("X just changed");    
    if(ps2x.Button(PSB_L1) || ps2x.Button(PSB_R1)) // print stick values if either is TRUE
    {
        Serial.print("Stick Values:");
        Serial.print(ps2x.Analog(PSS_LY), DEC); //Left stick, Y axis. Other options: LX, RY, RX  
        Serial.print(",");
        Serial.print(ps2x.Analog(PSS_LX), DEC); 
        Serial.print(",");
        Serial.print(ps2x.Analog(PSS_RY), DEC); 
        Serial.print(",");
        Serial.println(ps2x.Analog(PSS_RX), DEC); 
    } */
 delay (50);
 }
 
Назад
Сверху