робот промоутер.

Тема в разделе "Arduino & Shields", создана пользователем Алесей, 28 июн 2013.

  1. Алесей

    Алесей Нуб

    Добрый день господа !
    нужна помощь профессионала в ардуино.
    была идея собрать робота промоутера на основе ардуино.
    сталкиваюсь с этим впервые (и программированием тоже) так что прошу за ранее не судить)
    программировал сам как мог скорее всего не правильно..

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



    объясню конструкцию

    разделен на две части верх и низ.
    управляются от трех ардуино верх от двух
    одна на поворот вторая на контейнер с визитками
    низ от другой

    низ (работает нормально) :
    arduino uno
    3 датчика движения лево право сзади https://amperka.ru/product/infrared-motion-sensor
    2 датчика линии https://amperka.ru/product/digital-line-sensor
    ИК датчик препятствиий https://amperka.ru/product/infrared-sensor-switch
    Motor Shield + два мотора. https://amperka.ru/product/arduino-motor-shield

    // Моторы подключаются к клеммам M1+,M1-,M2+,M2-
    // Motor shield использует четыре контакта 6,5,7,4 для управления моторами
    //правй левый датчики движения,ик ддатчики. сигнал блокировки движения от верха
    //
    //ик датчик препятсвий

    #define DIR_RIGHT_SIDE 4
    #define SPEED_RIGHT_SIDE 5
    #define SPEED_LEFT_SIDE 6
    #define DIR_LEFT_SIDE 7
    #define LEFT_IK_PIN 9
    #define RIGHT_IK_PIN 8
    #define LEFT_DD_PIN 10
    #define RIGHT_DD_PIN 11
    #define RELE 12
    #define DP 13 //датчик препятсвий



    int val1=0;
    int val2=0;
    int val3=0;
    int val4=0;
    int val5=0;
    int val6=0;

    void goLeft (int speed, bool reverseLeft)//присваиваем свойства левому мотору (скорость.направление)
    {
    analogWrite(SPEED_LEFT_SIDE, speed);
    digitalWrite(DIR_LEFT_SIDE, reverseLeft ? LOW : HIGH);

    }
    void goRight (int speed, bool reverseRight)//присваиваем свойства правому мотору (скорость.направление)
    {
    analogWrite(SPEED_RIGHT_SIDE, speed);
    digitalWrite(DIR_RIGHT_SIDE, reverseRight ? LOW : HIGH);

    }


    void setup()
    {
    // Настраивает выводы платы 4,5,6,7 на вывод сигналов
    for(int i = 4; i <= 7; i++)
    pinMode(i, OUTPUT);
    pinMode(LEFT_DD_PIN,INPUT);
    pinMode(RIGHT_DD_PIN,INPUT);
    pinMode(LEFT_IK_PIN,INPUT);
    pinMode(RIGHT_IK_PIN,INPUT);
    pinMode(RELE,INPUT);
    pinMode(DP,INPUT);
    }
    void loop()
    {
    val2=digitalRead(RIGHT_IK_PIN);//считывание сигнала с датчика
    val1=digitalRead(LEFT_IK_PIN);//считывание сигнала с датчика
    val3=digitalRead(LEFT_DD_PIN);//считывание сигнала с датчика
    val4=digitalRead(RIGHT_DD_PIN);//считывание сигнала с датчика
    val5=digitalRead(RELE);//считывание сигнала с датчика
    val6=digitalRead(DP);// считывание сигнал с датчика препятствий

    if(val6==HIGH)//если есть сигнал с датчика препятствиий
    {
    goRight(200,false);// то правый назад
    goLeft (200,false);// то левый назад
    delay(500);

    }else if(val5==HIGH)//если есть сигнал от верха
    {
    goRight(0,true);// то правый стоп
    goLeft (0,true);// то левый стоп
    }else{
    if((val1==LOW))// если есть сиггнал c IK датчиков
    {goRight (200,false);// то левый назад
    delay(500);
    }else if ((val2==LOW))// если есть сиггнал c IK датчиков
    {goLeft(200,false);// то правый назад
    delay(500);
    }else{
    if(val3==HIGH)// если есть сиггнал c DD пр
    {goLeft (200,true);// то левый вперед
    delay(0);
    }else if(val4==HIGH)//если есть сигнал с DD лев
    {goRight(200,true);// то правый вперед
    delay(0);
    }else{
    goRight(0,true);// то правый стоп
    goLeft (0,true);// то левый стоп
    }
    }
    }
    }


    верх контейнер с визитками( работамет нормально)
    arduino uno
    2 датчика линии https://amperka.ru/product/digital-line-sensor
    сервомотор.

    //http://cxem.net/arduino/arduino4.php

    //управление контейнеом с визитками
    // 1 серво , 2 ик датчика, сигнал блокировки при отсутствии визиток

    #include <Servo.h>
    #define IK_PIN1 1//датчик наличия визиток в контейнере
    #define IK_PIN2 2//датчик наличия визиток для захвата
    #define RELE 3//сигнал откл

    Servo servoZ; // Обьект Servo
    int val1=0;
    int val2=0;
    void setup()
    {
    servoZ.attach(4); // Servo присоединен к 3 выводу
    pinMode(IK_PIN1,INPUT);
    pinMode(IK_PIN2,INPUT);
    pinMode(RELE,OUTPUT);
    }

    void loop()
    {
    val1=digitalRead(IK_PIN1);//считывание сигнала с датчика
    val2=digitalRead(IK_PIN2);//считывание сигнала с датчика

    if(val1==LOW)//если закончились визитки в контейнере
    {digitalWrite(RELE,HIGH);//вкл сигнал блокировки руки
    servoZ.write(91);//серво стоп
    delay(100);//
    servoZ.write(92);//
    delay(100);//
    }else{// если есть визитки в контейнере то...

    if(val2==LOW)//если нет визитки для захвата то...

    {servoZ.write(100); // Повернуть серво влево
    delay(0); // Пауза 0 сек.

    }else if (val2==HIGH)// если есть визитка ддля захвата то..
    {servoZ.write(91);//серво стоп
    delay(100);//
    servoZ.write(92);//
    delay(100);//
    }

    }
    }

    верх поворотная часть с рукой (рабоет через раз)
    непонятные проблемы ..при полностью заряженном аккамуляторе 12v тупит и греется
    при подъсаженом работает нормально.
    при малом вольтаже 6в работает как тормоз ))) аккамулятор садит быстро
    думал развести питание с помощью Power Shield https://amperka.ru/product/arduino-power-shield все равно все греется.


    arduino uno
    4 датчика движения лево, перед ,право, верх https://amperka.ru/product/infrared-motion-sensor
    1 датчика линии https://amperka.ru/product/digital-line-sensor
    2 сервомотора
    Power Shield https://amperka.ru/product/arduino-power-shield
    Music Shield v2 https://amperka.ru/product/arduino-music-shield (в цепи но не подключена)
    //правый левый верхний датчики движения , визитка рука контейнер, сигнал на блокиировку нижней части
    #define LEFT_DD_PIN 2//левый датчик движжения
    #define RIGHT_DD_PIN 3//правый датчик движения
    #define FRONT_DD_PIN 4//передниий датчик движения
    #define UP_DD_PIN 5//верхний датчик движкения
    #define IK_PIN_RUKA 6//ик рука
    #define RELE_IN 7// сигнал блокировки с контейнера визиток
    #define RELE_OUT 8// ик визитки


    #include <Servo.h> //настройки серво

    Servo servoY;// имя серво Y
    Servo servoX;// имя серво X


    int val1=0;// начальной состояние входных контактов от датчик движения лев
    int val2=0;// начальное состояние входного коетакта от датчика движения прав
    int val3=0;//сотоячние переднего dd
    int val4=0;//начальное состояние входного контакта отдатчика движения верх
    int val5=0;//рука
    int val6=0;//реле вход

    void setup()
    {
    pinMode(LEFT_DD_PIN,INPUT);
    pinMode(RIGHT_DD_PIN,INPUT);
    pinMode(FRONT_DD_PIN,INPUT);
    pinMode(UP_DD_PIN,INPUT);
    pinMode(IK_PIN_RUKA ,INPUT);
    pinMode(RELE_IN,INPUT);
    pinMode(RELE_OUT,OUTPUT);


    servoY.attach(0);//выходы серво Y
    servoX.attach(1);//выходы серво X

    }
    void loop()
    {

    val1=digitalRead(LEFT_DD_PIN);//считывание сигнала с датчика движ лев
    val2=digitalRead(RIGHT_DD_PIN);//считывание сигнала с датчика движ прав
    val3=digitalRead(FRONT_DD_PIN);//считывание сигнала с датчика перед
    val4=digitalRead(UP_DD_PIN);//считывание сигнала с датчика движ верх
    val5=digitalRead(IK_PIN_RUKA);//считывание сигнала с датчика рука
    val6=digitalRead(RELE_IN);//считывание сигнала блокировки

    digitalWrite(RELE_OUT,LOW);//выкл блокировка низ


    if(val6==LOW)//еcли есть сигнал что нет визиток в контейнере
    {

    if (val5==HIGH)//еслии есть сигнал с ик датчика на руке
    {

    if(val4==HIGH)// если есть сигнал с верхнего датчика двиижения
    {servoX.write(0);// то рука вверх
    digitalWrite(RELE_OUT,HIGH);//выкл реле
    delay(0);//задержка при вкл на 1 сек
    return;

    }else{

    if ((val3==HIGH))// если есть сигнал с переднего DD
    {servoY.write(90);// то серво Y на (90)
    servoX.write(90);
    digitalWrite(RELE_OUT,HIGH);//вкл реле
    delay(0);//задержка при вкл на 1 сек

    }else if ((val2==HIGH))// если ечть сигнал с правого ДД и ЗД
    {servoY.write(180);// то серво Y Нна право (180)
    servoX.write(90);
    digitalWrite(RELE_OUT,HIGH);//вкл реле
    delay(0); // задержка 1 сек

    }else if ((val1==HIGH))// если есть сигнал с левого ДД И ЗД
    {servoY.write(0);// то серво Y на лево (0)
    servoX.write(90);
    digitalWrite(RELE_OUT,HIGH);//вкл реле
    delay(0);//задержка при вкл на 1 сек



    }
    }
    }else{//если нет сигналда на руке
    servoY.write(90);// то серво Y на лево (0)
    servoX.write(130);
    delay (200);
    servoX.write(90);
    delay (200);

    }

    }else{// танцует
    servoY.write(90);// повернутся вперед
    servoX.write(0);// то рука вверх
    delay(500);//задержка при вкл на 0,5 сек
    servoX.write(10);// то рука вверх
    delay(500);//задержка при вкл на 0,5 сек


    }

    }
     
  2. XCB

    XCB Гик

    проверяйте цепи питания у проблемной части, считайте потребляемые мощности серв и моторов, внимательно проверьте все что воткнуто в разьемы vin, +5v, aref
     
  3. Алесей

    Алесей Нуб

    я понял что проблема в серво...
    может ли быть проблема что они слишком мощные для ардуино? какие максимально мощные можно ставить
    хочется поставить аккамулятор помощнее , что бы обеспечить длительную стабильнную работу 2-4 часа
    думал что (Power shild ) решит проблему.

    все начитнает стабильно работать когда подсаживается аккамулятор.
     
  4. XCB

    XCB Гик

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

    Алесей Нуб

    пробовал подключать двумя способами
    1 через штекер 5,1 ардуино при этом на power shilld пеермычки справа..подключал 12 в греется ардуино , 6 в сервы работаю как при нехватке питания..

    2 через входной разъем на power shild
     
  6. XCB

    XCB Гик

    например я ничего не понял, нарисовали бы схемки...
     
  7. Алесей

    Алесей Нуб

    да конечно . я пришлю фото с пояснениями
     
  8. Алесей

    Алесей Нуб

    спасибо разобрался