roboforum.ru

Технический форум по робототехнике.

Тележка с манипулятором и брандспойтом

Наше хобби — конструировать и программировать.
Демонстрация готовых роботов и устройств построенных своими руками.

Re: Тележка с манипулятором и брандспойтом

Сообщение elmot » 08 дек 2014, 23:22

в вертолет - не пойдут, а в телегу - почему нет? Ну а зарядку придется поискать
Аватара пользователя
elmot
 
Сообщения: 5691
Зарегистрирован: 10 ноя 2011, 12:02
Откуда: Turku, Finland
Skype: elmot73
прог. языки: Java и все-все=все
ФИО: Илья

Re: Тележка с манипулятором и брандспойтом

Сообщение slom » 06 янв 2015, 21:41

сегодня пришли 2 посылки, одна из европы через пакфлай, а другая с али експрес

в Китае купил 2 редуктора
http://ru.aliexpress.com/item/the-length-of-shaft-10MM-reduction-gearbox-DC-geared-motor-Steel-roll-teeth-low-noise-high/1665032314.html?recommendVersion=1

и с пакфлая

моторы с редукторами х2

http://www.parkflyer.ru/product/537646/

в результате достал нужные детали из одного китайского редуктора, а остальное про запас :)
теперь телега полноценно носиться на своих 6ти.... :Yahoo!:

на подходе посылки с клешней и сервами для нее 8)
Аватара пользователя
slom
 
Сообщения: 645
Зарегистрирован: 07 сен 2014, 19:29
Откуда: Севастополь
Skype: slom_3d
прог. языки: 3d max :)

Re: Тележка с манипулятором и брандспойтом

Сообщение slom » 07 янв 2015, 21:38

подскажите, может ктото делал плавный старт моторов.

хочу сделать плавную раскрутку моторов, чтобы снова не сорвать шестерни редуктора.
при нажатии на кнопку разворот, сейчас моторы сходу стартуют на 200шим. а хочется чтобы при нажатии и удержании скорость стала плавно нарастать от 80 до 200 в течении примерно 2-3х сек
Аватара пользователя
slom
 
Сообщения: 645
Зарегистрирован: 07 сен 2014, 19:29
Откуда: Севастополь
Skype: slom_3d
прог. языки: 3d max :)

Re: Тележка с манипулятором и брандспойтом

Сообщение elmot » 07 янв 2015, 22:08

дык программно меняешь шим и все. 2-3сек - очень долго. Если цель - неубиение шестерен, то проще 2-3 ступени мощности за первые 0.2 сек. Хотя меня не оставляет впечатление, что в твоем случае шестерня была убита при постановке ребенка на машинку.
Аватара пользователя
elmot
 
Сообщения: 5691
Зарегистрирован: 10 ноя 2011, 12:02
Откуда: Turku, Finland
Skype: elmot73
прог. языки: Java и все-все=все
ФИО: Илья

Re: Тележка с манипулятором и брандспойтом

Сообщение slom » 07 янв 2015, 22:51

elmot писал(а):дык программно меняешь шим и все. 2-3сек - очень долго. Если цель - неубиение шестерен, то проще 2-3 ступени мощности за первые 0.2 сек. Хотя меня не оставляет впечатление, что в твоем случае шестерня была убита при постановке ребенка на машинку.


с теорией у меня все ок :D
это я понимаю, что менять шим, у меня даже получалось делать тьест с плавным разгоном, но без управления, а вот когда дело доходит до реального скетча, то что то ниче не выходит :(

поэтому и прошу практической помощи, может ктото реализовывал в своих проектах и есть кусок готового скетча?


у меня сейчас вот так

Код: Выделить всёРазвернуть
// Скетч для управления через блютус, Wild Thumper 6WD, на ардуино совместимом контролере TREX controller. реализовано движение и стрельба с водомета. 


#include <BTCA2ALite.h>// Добавляем библиотеку блютус программы
#include <Servo.h> // Добавляем библиотеку серво

Servo myservoH; // Горизонтальная серва углы от 0 до 180 (центровка 89)
Servo myservoV; // Вертикальная серва углы от 1 до 45
const int H_SERVO_PIN = 7; // Горизонтальная серва подключена к пину 7
const int V_SERVO_PIN = 8; //Пин вертикального сервопривода 8
const float H_L_ANGLE = 180; // Максимальные угл поворота башни налево
const float H_R_ANGLE = 0; // Максимальные угл поворота башни направо
const float H_DEF_ANGLE = 89; // Дефолтный угол (центровка)
const float V_U_ANGLE = 45; // Максимальные угл поворота башни вверх
const float V_D_ANGLE = 0; // Максимальные угл поворота башни вниз
const float V_DEF_ANGLE = 15; // Дефолтный угол (центровка)
//Размер шага V_STEP и H_STEP побираем экспериментально для достижения нужной скорости поворота серв
const float V_STEP = 0.012; // Шаг - знаение отвечающее за скорость вращения по вертикали.
const float H_STEP = 0.012; // Шаг - знаение отвечающее за скорость вращения по горизонтали
float curVAngle = V_DEF_ANGLE; //Переменная текущего угла верт. сервы
float curHAngle = H_DEF_ANGLE; //Переменная текущего угла гор. сервы
bool moveServoVUp = false; //Флаг движения верт. сервы вверх
bool moveServoVDown = false; //Флаг движения верт. сервы вниз
bool moveServoHLeft = false; //Флаг движения гор. сервы влево
bool moveServoHRight = false; //Флаг движения гор. сервы вправо

btca2aLite btca2aLite; // Конструктор btca2aLite

// Задаем скорости для движения
int Speed = 80; // Текущая максимальная скорость
int TSpeed = 150; // Скорость медленного мотора при повороте
[b]int RLSpeed; // Скорость танкоаого разворота[/b]

// задаем пины для левого мотора
#define Dir_L 2
#define Pwm_L 3
#define Brake_L 4
// задаем пины для правого мотора
#define Dir_R 10
#define Pwm_R 11
#define Brake_R 9

#define SHOT  12 // пин для водомета

enum States
{
    WAITING,
    READING,
    RUNNING,
    ERROR,
    TIMEOUT
};

States state;
States onWait();
States onRead();
States onRun();
States onError();

States onTimeout();

void performServo(); // добовляем сервы


void setup(){
    Serial.begin(9600); // Скорость BT и порта должна быть 9600
    //Моторы
    pinMode (Pwm_L, OUTPUT);
    pinMode (Dir_L, OUTPUT);
    pinMode (Brake_L, OUTPUT);
   
    pinMode (Pwm_R, OUTPUT);
    pinMode (Dir_R, OUTPUT);
    pinMode (Brake_R, OUTPUT);
   
    digitalWrite (Pwm_L, LOW);
    digitalWrite (Pwm_R, LOW);
   
    digitalWrite (Brake_L, LOW);
    digitalWrite (Brake_R, LOW);
 
pinMode(SHOT, OUTPUT); // задаем выход для стрельбы водой
   
    // устанавливаем пин как вывод управления сервой
    myservoH.attach(H_SERVO_PIN);
    myservoV.attach(V_SERVO_PIN);
    myservoH.write(curHAngle);
    myservoV.write(curVAngle);
   
   
    //Светодиод
    pinMode(13, OUTPUT); // Инициализируем пин светодиода
    digitalWrite(13, HIGH); // Светодиод выключен
}

void loop(){
   
    btca2aLite.ReadCommand(); // Считывание принятых команд (кодов кнопок)
    //Вызываем функцию управление сервами
    performServo();
   
   
   
    //--------— Движение Вперед —-------------
    if (btca2aLite.ButtonPressed(KEYCODE_DPAD_UP)) // Едет вперед если нажат курсор ВПЕРЕД
    {
        if (btca2aLite.ButtonPressed(KEYCODE_DPAD_RIGHT)){ // Поворот направо при нажатии курсора ВПЕРЕД и ВЛЕВО
            digitalWrite (Dir_L, HIGH);
            analogWrite (Pwm_L, TSpeed);
            digitalWrite (Dir_R, HIGH);
            analogWrite (Pwm_R, Speed);
        }
        if (btca2aLite.ButtonPressed(KEYCODE_DPAD_LEFT)){ // Поворот налево при нажатии курсора ВПЕРЕД и ВПРАВО
            digitalWrite (Dir_L, HIGH);
            analogWrite (Pwm_L, Speed);
            digitalWrite (Dir_R, HIGH);
            analogWrite (Pwm_R, TSpeed);
        }
        digitalWrite (Dir_L, HIGH);
        analogWrite (Pwm_L, Speed);
        digitalWrite (Dir_R, HIGH);
        analogWrite (Pwm_R, Speed);
    }
   
    //-------— Движение Назад —-------------
    if (btca2aLite.ButtonPressed(KEYCODE_DPAD_DOWN)) // Едет назад если нажат курсор НАЗАД
    {
        if (btca2aLite.ButtonPressed(KEYCODE_DPAD_RIGHT)){ // Поворот налево при нажатии курсора НАЗАД и ВЛЕВО
            digitalWrite (Dir_L, LOW);
            analogWrite (Pwm_L, TSpeed);
            digitalWrite (Dir_R, LOW);
            analogWrite (Pwm_R, Speed);
        }
        if (btca2aLite.ButtonPressed(KEYCODE_DPAD_LEFT)){ // Поворот направо при нажатии курсора НАЗАД и ВПРАВО
            digitalWrite (Dir_L, LOW);
            analogWrite (Pwm_L, Speed);
            digitalWrite (Dir_R, LOW);
            analogWrite (Pwm_R, TSpeed);
        }
        digitalWrite (Dir_L, LOW);
        analogWrite (Pwm_L, Speed);
        digitalWrite (Dir_R, LOW);
        analogWrite (Pwm_R, Speed);
    }
   
    //-------— Движение Влево (Танковый разворот) —-------------
    if (btca2aLite.ButtonPressed(KEYCODE_DPAD_LEFT )) // разворот на месте в лево
    {
        digitalWrite (Dir_L, LOW);
        analogWrite (Pwm_L, RLSpeed);
        digitalWrite (Dir_R, HIGH);
        analogWrite (Pwm_R, RLSpeed);
    }
   
    //-------— Движение Вправо (Танковый разворот) —-------------
    if (btca2aLite.ButtonPressed(KEYCODE_DPAD_RIGHT)) // разворот на месте в право
    {
        digitalWrite (Dir_L, HIGH);
        [b]for (RLSpeed = 80; RLSpeed <= 200; ++RLSpeed)[/b]
        analogWrite (Pwm_L, RLSpeed);
        digitalWrite (Dir_R, LOW);
        [b]for (RLSpeed = 80; RLSpeed <= 200; ++RLSpeed)[/b]
        analogWrite (Pwm_R, RLSpeed);
    }
   
    //-------— движение в право —-------------
    if (btca2aLite.ButtonPressed(KEYCODE_DPAD_RIGHT)) //
    {
        digitalWrite (Dir_L, HIGH);
        analogWrite (Pwm_L, RLSpeed);
        digitalWrite (Dir_R, LOW);
        analogWrite (Pwm_R, RLSpeed);
    }
   
   
    //---------- Переключение скоростей —-------------


   if(btca2aLite.Button(KEYCODE_BUTTON_START)) // ТУРБО режимпри нажатии кнопки START
   {
   Speed = 200;
   }
   if(btca2aLite.Button(KEYCODE_BUTTON_R2)) // 4-я Скорость при нажатии кнопки R2
   {
   Speed = 150;
   }
   if(btca2aLite.Button(KEYCODE_BUTTON_R1)) // 3-я Скорость при нажатии кнопки R1
   {
   Speed = 120;
   }
   if(btca2aLite.Button(KEYCODE_BUTTON_L2)) // 2-я Скорость при нажатии кнопки L2
   {
   Speed = 90;
   }
   if(btca2aLite.Button(KEYCODE_BUTTON_L1)) // 1-я Скорость при нажатии кнопки L2
   {
   Speed = 70;
   }
   
    //-------— включение насоса —-------------
   if (btca2aLite.ButtonPressed(KEYCODE_BUTTON_SELECT))
    {
     digitalWrite (SHOT, HIGH);
     }
    //-------— выключение насоса происходит автоматически после отпускания кнопки—-------------
   if(btca2aLite.ButtonReleased(KEYCODE_BUTTON_SELECT))
    {
   digitalWrite (SHOT, LOW);
    }
   
   
    //--------— Повороты серв при нажатии кнопок —-------------
   
    if(btca2aLite.Button(KEYCODE_BUTTON_X)) // servoV вниз
    {
        moveServoVDown = true;
             
    }
    if(btca2aLite.Button(KEYCODE_BUTTON_A)) // servoH движется к 0
    {
        moveServoHRight = true;
    }
    if(btca2aLite.Button(KEYCODE_BUTTON_B)) // servoV вверх
    {
        moveServoVUp = true;
             
    }
   
    if(btca2aLite.Button(KEYCODE_BUTTON_Y)) // servoH движется к 180
    {
        moveServoHLeft = true;
    }
   
//--------— чтобы сервы не продолжали движения при отжатых кнопках —-------------   
if(btca2aLite.ButtonReleased(KEYCODE_BUTTON_X))
{
moveServoVDown = false;
}
if(btca2aLite.ButtonReleased(KEYCODE_BUTTON_B))
{
moveServoVUp = false;
}

if(btca2aLite.ButtonReleased(KEYCODE_BUTTON_A))
{
moveServoHRight = false;
}
if(btca2aLite.ButtonReleased(KEYCODE_BUTTON_Y))
{
moveServoHLeft = false;
}
   
   
    //----------------— Стоп —---------------------
   
    // Если не нажата ни одна кнопка курсора происходит остановка, скорость 0 для каждого мотора
    if (btca2aLite.ButtonReleased(KEYCODE_DPAD_UP) && btca2aLite.ButtonReleased(KEYCODE_DPAD_DOWN) && btca2aLite.ButtonReleased(KEYCODE_DPAD_LEFT) && btca2aLite.ButtonReleased(KEYCODE_DPAD_RIGHT)){
        analogWrite (Pwm_L, 0);
        analogWrite (Pwm_R, 0);
    }
}



//Функция управления сервоприводами (вызывается в теле loop на каждой итерации)
//Выполняет изменения положения серв на подобранный шаг согласно установленным флагам движения
//Флаги устанавливаются согласно поступившим символам управления сервами
void performServo()
{
    //Установлен флаг движения вверх и текущий угол не максимальный
    if (moveServoVUp && curVAngle + V_STEP <= V_U_ANGLE)
    {
        //К текущему верт. углу прибавляем шаг
        curVAngle += V_STEP;
    }
    //Установлен флаг движения вниз и текущий угол не минимален
    else if (moveServoVDown && curVAngle - V_STEP >= V_D_ANGLE)
    {
        //От текущего верт. угла отнимаем шаг
        curVAngle -= V_STEP;
    }
    //Установлен флаг движения влево и текущий угол не максимален
    if (moveServoHLeft && curHAngle + H_STEP <= H_L_ANGLE)
    {
        //К текущему гор. углу прибавляем гор. шаг
        curHAngle += H_STEP;
    }
    //Установлен флаг движения вправо и текущий угол не минимален
    else if (moveServoHRight && curHAngle - H_STEP >= H_R_ANGLE)
    {
        //От текущего угла отнимаем гор. шаг
        curHAngle -= H_STEP;
    }
   
    //Если было движние по вертикали
    if (moveServoVUp || moveServoVDown)
    {
        myservoV.write(curVAngle);
    }
    //Если было движение по горизонтали
    if (moveServoHLeft || moveServoHRight)
    {
        myservoH.write(curHAngle);
    }
}



в коде выделил то что по моему мнению должно поидее делать плавный ход )

Добавлено спустя 25 минут 53 секунды:
у меня там в скетче есть переключатель скоростей, при нажатии на разные кнопки, скорость меняется.
в идиале хочется сделать так чтобы при переключении на макс скорость, моторы не рвали редуктора сразу стартуя с нее а начинали тоже плавно.
и на поворотах тоже плавно.

а иначе я устану менять редуктора :((((((
Аватара пользователя
slom
 
Сообщения: 645
Зарегистрирован: 07 сен 2014, 19:29
Откуда: Севастополь
Skype: slom_3d
прог. языки: 3d max :)

Re: Тележка с манипулятором и брандспойтом

Сообщение Aseris » 08 янв 2015, 14:47

Поствить фильтр на значение скорости, чтоб на управляющий вход шло знчение Vi плавно наростающее. нар Vi=(Vi-1*200+Vупр*56)/256
Аватара пользователя
Aseris
 
Сообщения: 1142
Зарегистрирован: 01 сен 2009, 14:58
Откуда: Чехия
прог. языки: C/С++, VHDL, Verilog, ASM, Python

Re: Тележка с манипулятором и брандспойтом

Сообщение slom » 08 янв 2015, 21:08

Aseris писал(а):Поствить фильтр на значение скорости, чтоб на управляющий вход шло знчение Vi плавно наростающее. нар Vi=(Vi-1*200+Vупр*56)/256


эммм, а можно подробней, а то мои познания в ардуино это сунуть вынуть :oops: , тоесть скопировать вставить :D
но куда вставить вашу формулу я не понимаю?

вот создал тему
http://arduino.ru/forum/programmirovanie/plavnyi-starttormozhenie-kollektornykh-motorov-v-tyazhelom-robote

там люди тоже помогают, но пока не работает :(
Аватара пользователя
slom
 
Сообщения: 645
Зарегистрирован: 07 сен 2014, 19:29
Откуда: Севастополь
Skype: slom_3d
прог. языки: 3d max :)

Re: Тележка с манипулятором и брандспойтом

Сообщение slom » 13 янв 2015, 12:12

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

и решил проблему с питанием, вместо тяжелого свинца поставил ли ион банки от разломанного ноутбучного акума. поставл 6 банок.

возникла новая проблема
пришла клешня
Изображение

поставил сервы, все собрал, подключил и пропарился по незнанию. в скетче стояли максимальные значения сервы, серва что на самой клешне, раскрыла ее и по всей видимости пыталась двигаться дальше. но в отличии от микро серв которые при этом трещат, это молча грелась и догрелась, что перестала работать... :(

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

есть какието предложения по ремонту? жаль серву, 5 мин поработала, даже не покрутилась и сдохла ((((

модель сервы mg-995
Аватара пользователя
slom
 
Сообщения: 645
Зарегистрирован: 07 сен 2014, 19:29
Откуда: Севастополь
Skype: slom_3d
прог. языки: 3d max :)

Re: Тележка с манипулятором и брандспойтом

Сообщение lorry » 13 янв 2015, 12:14

Серву только менять
Аватара пользователя
lorry
 
Сообщения: 448
Зарегистрирован: 04 фев 2014, 13:53
Откуда: Комсомольск-на-Амуре
прог. языки: машинные коды
ФИО: Иван Иваныч

Re: Тележка с манипулятором и брандспойтом

Сообщение Aseris » 13 янв 2015, 19:04

разобрать и посмотреть или там внутри ничено не погнуло, а так, новую серву искать
Аватара пользователя
Aseris
 
Сообщения: 1142
Зарегистрирован: 01 сен 2009, 14:58
Откуда: Чехия
прог. языки: C/С++, VHDL, Verilog, ASM, Python

Re: Тележка с манипулятором и брандспойтом

Сообщение slom » 13 янв 2015, 23:37

внутри на вид все целое, и вот какой прикол. я думал я виноват что серва сгорела. но похоже что чтото нето со скетчем программы или еще чемто.

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

может в коде чтото нето?

Код: Выделить всёРазвернуть
// Скетч для управления через блютус, Wild Thumper 6WD, на ардуино совместимом контролере TREX controller. реализовано движение и стрельба с водомета. 


#include <BTCA2ALite.h>// Добавляем библиотеку блютус программы
#include <Servo.h> // Добавляем библиотеку серво

Servo myservoH; // Горизонтальная серва углы от 0 до 180 (центровка 89)
Servo myservoV; // Вертикальная серва углы от 1 до 45
const int H_SERVO_PIN = 5; // Горизонтальная серва подключена к пину 7
const int V_SERVO_PIN = 8; //Пин вертикального сервопривода 8
const float H_L_ANGLE = 120; // Максимальные угл поворота башни налево
const float H_R_ANGLE = 70; // Максимальные угл поворота башни направо
const float H_DEF_ANGLE = 90; // Дефолтный угол (центровка)
const float V_U_ANGLE = 120; // Максимальные угл поворота башни вверх
const float V_D_ANGLE = 0; // Максимальные угл поворота башни вниз
const float V_DEF_ANGLE = 90; // Дефолтный угол (центровка)
//Размер шага V_STEP и H_STEP побираем экспериментально для достижения нужной скорости поворота серв
const float V_STEP = 0.012; // Шаг - знаение отвечающее за скорость вращения по вертикали.
const float H_STEP = 0.012; // Шаг - знаение отвечающее за скорость вращения по горизонтали
float curVAngle = V_DEF_ANGLE; //Переменная текущего угла верт. сервы
float curHAngle = H_DEF_ANGLE; //Переменная текущего угла гор. сервы
bool moveServoVUp = false; //Флаг движения верт. сервы вверх
bool moveServoVDown = false; //Флаг движения верт. сервы вниз
bool moveServoHLeft = false; //Флаг движения гор. сервы влево
bool moveServoHRight = false; //Флаг движения гор. сервы вправо

btca2aLite btca2aLite; // Конструктор btca2aLite


// задаем пины для левого мотора
#define Dir_L 2
#define Pwm_L 3
#define Brake_L 4
// задаем пины для правого мотора
#define Dir_R 10
#define Pwm_R 11
#define Brake_R 9

// Задаем скорости для движения
byte MaxSpeed = 250; // Максимальная скорость
byte MinSpeed = 100;  // Минимальная скорость

int forw_back = 0;
int righ_left = 0;

byte step_fb = 5;     // Шаг изменения скорости движения вперед - назад
byte step_stop = 10;  // Шаг изменения скорости остановки
byte step_rl =  20;    // Шаг изменения скорости движения вправо - влево
byte step_dir = 10;   // Шаг изменения скорости выравнивания



#define SHOT  12 // пин для водомета

enum States
{
    WAITING,
    READING,
    RUNNING,
    ERROR,
    TIMEOUT
};

States state;
States onWait();
States onRead();
States onRun();
States onError();

States onTimeout();

void performServo(); // добовляем сервы


void setup(){
    Serial.begin(9600); // Скорость BT и порта должна быть 9600
    //Моторы
    pinMode (Pwm_L, OUTPUT);
    pinMode (Dir_L, OUTPUT);
    pinMode (Brake_L, OUTPUT);
   
    pinMode (Pwm_R, OUTPUT);
    pinMode (Dir_R, OUTPUT);
    pinMode (Brake_R, OUTPUT);
   
    digitalWrite (Pwm_L, LOW);
    digitalWrite (Pwm_R, LOW);
   
    digitalWrite (Brake_L, LOW);
    digitalWrite (Brake_R, LOW);
 
pinMode(SHOT, OUTPUT); // задаем выход для стрельбы водой
   
    // устанавливаем пин как вывод управления сервой
    myservoH.attach(H_SERVO_PIN);
    myservoV.attach(V_SERVO_PIN);
    myservoH.write(curHAngle);
    myservoV.write(curVAngle);
   
   
    //Светодиод
    pinMode(13, OUTPUT); // Инициализируем пин светодиода
    digitalWrite(13, HIGH); // Светодиод выключен
}

void loop(){
   
    btca2aLite.ReadCommand(); // Считывание принятых команд (кодов кнопок)
    //Вызываем функцию управление сервами
    performServo();
   

  static unsigned long pre_millis = 0;
  if(millis()-pre_millis > 50)
  {
    pre_millis = millis();
   
    if(btca2aLite.ButtonPressed(KEYCODE_DPAD_UP))
    {
      forw_back += step_fb;
      if(forw_back > 0 && forw_back < MinSpeed) forw_back = MinSpeed;
    }
    else if(btca2aLite.ButtonPressed(KEYCODE_DPAD_DOWN))
    {
      forw_back -= step_fb;
      if(forw_back < 0 && forw_back > MinSpeed*-1) forw_back = MinSpeed*-1;
    }
    else
    {
      if(forw_back < 0) forw_back += step_stop;
      else if(forw_back > 0) forw_back -= step_stop;
      if(abs(forw_back) < MinSpeed) forw_back = 0;
    }
    forw_back = constrain(forw_back, MaxSpeed*-1, MaxSpeed);


    if(btca2aLite.ButtonPressed(KEYCODE_DPAD_RIGHT))
    {
      righ_left += step_rl;
      if(righ_left > 0 && righ_left < MinSpeed) righ_left = MinSpeed;
    }
    else if(btca2aLite.ButtonPressed(KEYCODE_DPAD_LEFT))
    {
      righ_left -= step_rl;
      if(righ_left < 0 && righ_left > MinSpeed*-1) righ_left = MinSpeed*-1;
    }
    else
    {
      if(righ_left < 0) righ_left += step_dir;
      else if(righ_left > 0) righ_left -= step_dir;
      if(abs(righ_left) < MinSpeed) righ_left = 0;
    }
    righ_left = constrain(righ_left, MaxSpeed*-1, MaxSpeed);


    int pwm_l = forw_back + righ_left;
    int pwm_r = forw_back - righ_left;
    pwm_l = constrain(pwm_l, MaxSpeed*-1, MaxSpeed);
    pwm_r = constrain(pwm_r, MaxSpeed*-1, MaxSpeed);

    digitalWrite(Dir_L, (pwm_l<0)?0:1);
    digitalWrite(Dir_R, (pwm_r<0)?0:1);
    analogWrite(Pwm_L, abs(pwm_l));
    analogWrite(Pwm_R, abs(pwm_r));
  }
       
 
   
    //-------— включение насоса —-------------
   if (btca2aLite.ButtonPressed(KEYCODE_BUTTON_SELECT))
    {
     digitalWrite (SHOT, HIGH);
     }
    //-------— выключение насоса происходит автоматически после отпускания кнопки—-------------
   if(btca2aLite.ButtonReleased(KEYCODE_BUTTON_SELECT))
    {
   digitalWrite (SHOT, LOW);
    }
   
   
    //--------— Повороты серв при нажатии кнопок —-------------
   
    if(btca2aLite.Button(KEYCODE_BUTTON_X)) // servoV вниз
    {
        moveServoVDown = true;
             
    }
    if(btca2aLite.Button(KEYCODE_BUTTON_A)) // servoH движется к 0
    {
        moveServoHRight = true;
    }
    if(btca2aLite.Button(KEYCODE_BUTTON_B)) // servoV вверх
    {
        moveServoVUp = true;
             
    }
   
    if(btca2aLite.Button(KEYCODE_BUTTON_Y)) // servoH движется к 180
    {
        moveServoHLeft = true;
    }
   
//--------— чтобы сервы не продолжали движения при отжатых кнопках —-------------   
if(btca2aLite.ButtonReleased(KEYCODE_BUTTON_X))
{
moveServoVDown = false;
}
if(btca2aLite.ButtonReleased(KEYCODE_BUTTON_B))
{
moveServoVUp = false;
}

if(btca2aLite.ButtonReleased(KEYCODE_BUTTON_A))
{
moveServoHRight = false;
}
if(btca2aLite.ButtonReleased(KEYCODE_BUTTON_Y))
{
moveServoHLeft = false;
}
   
   
    //----------------— Стоп —---------------------
   
    // Если не нажата ни одна кнопка курсора происходит остановка, скорость 0 для каждого мотора
    if (btca2aLite.ButtonReleased(KEYCODE_DPAD_UP) && btca2aLite.ButtonReleased(KEYCODE_DPAD_DOWN) && btca2aLite.ButtonReleased(KEYCODE_DPAD_LEFT) && btca2aLite.ButtonReleased(KEYCODE_DPAD_RIGHT)){
        analogWrite (Pwm_L, 0);
        analogWrite (Pwm_R, 0);
    }
}



//Функция управления сервоприводами (вызывается в теле loop на каждой итерации)
//Выполняет изменения положения серв на подобранный шаг согласно установленным флагам движения
//Флаги устанавливаются согласно поступившим символам управления сервами
void performServo()
{
    //Установлен флаг движения вверх и текущий угол не максимальный
    if (moveServoVUp && curVAngle + V_STEP <= V_U_ANGLE)
    {
        //К текущему верт. углу прибавляем шаг
        curVAngle += V_STEP;
    }
    //Установлен флаг движения вниз и текущий угол не минимален
    else if (moveServoVDown && curVAngle - V_STEP >= V_D_ANGLE)
    {
        //От текущего верт. угла отнимаем шаг
        curVAngle -= V_STEP;
    }
    //Установлен флаг движения влево и текущий угол не максимален
    if (moveServoHLeft && curHAngle + H_STEP <= H_L_ANGLE)
    {
        //К текущему гор. углу прибавляем гор. шаг
        curHAngle += H_STEP;
    }
    //Установлен флаг движения вправо и текущий угол не минимален
    else if (moveServoHRight && curHAngle - H_STEP >= H_R_ANGLE)
    {
        //От текущего угла отнимаем гор. шаг
        curHAngle -= H_STEP;
    }
   
    //Если было движние по вертикали
    if (moveServoVUp || moveServoVDown)
    {
        myservoV.write(curVAngle);
    }
    //Если было движение по горизонтали
    if (moveServoHLeft || moveServoHRight)
    {
        myservoH.write(curHAngle);
    }
}
Аватара пользователя
slom
 
Сообщения: 645
Зарегистрирован: 07 сен 2014, 19:29
Откуда: Севастополь
Skype: slom_3d
прог. языки: 3d max :)

Re: Тележка с манипулятором и брандспойтом

Сообщение slom » 15 янв 2015, 00:47

прикрутил клешню
Изображение
Аватара пользователя
slom
 
Сообщения: 645
Зарегистрирован: 07 сен 2014, 19:29
Откуда: Севастополь
Skype: slom_3d
прог. языки: 3d max :)

Re: Тележка с манипулятором и брандспойтом

Сообщение slom » 17 янв 2015, 11:46

Аватара пользователя
slom
 
Сообщения: 645
Зарегистрирован: 07 сен 2014, 19:29
Откуда: Севастополь
Skype: slom_3d
прог. языки: 3d max :)

Re: Тележка с манипулятором и брандспойтом

Сообщение slom » 18 янв 2015, 21:35

проект почти готов!
Изображение

все что изначально хотел реализовано:
1. телега управляется дистанционно через блютус
2. имеет на борту управляемый манипулятор-захват.
3. есть управляемый водомет.

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

ну и еще хочу сделать прочный и красивый корпус, подумываю на люминий 1,5 -2 мм

спереди где клешня, сделать раздвоенный бампер
Изображение
это просто как пример, посредине типо клешня будет.
Аватара пользователя
slom
 
Сообщения: 645
Зарегистрирован: 07 сен 2014, 19:29
Откуда: Севастополь
Skype: slom_3d
прог. языки: 3d max :)

Re: Тележка с манипулятором и брандспойтом

Сообщение slom » 20 янв 2015, 00:21

Аватара пользователя
slom
 
Сообщения: 645
Зарегистрирован: 07 сен 2014, 19:29
Откуда: Севастополь
Skype: slom_3d
прог. языки: 3d max :)

Пред.След.

Вернуться в Наши проекты

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 3