Гусеничный робот- PS3 dualshok

Jonyk
Offline
Зарегистрирован: 20.05.2012

Приветствую Всех.

Это мое первое сообщение на форуме, хочу поделится своим небольшим проектом гусинечного робота управляемеого джойстиком PS3 через bluetooth.

Прошу сильно за внешний вид не пинать, собрал из того что под руку попало.

Скетч выложу немного позже, надо закомментировать.

Пока только фото и видео.

фото1

 

видео

youtu.be/A2eVEEbJb7U

 

youtu.be/Fp0f2xo6z-w

 

Продолжение следует...

Mastino
Offline
Зарегистрирован: 03.12.2011

Прикольный робот!

maksim
Offline
Зарегистрирован: 12.02.2012

Давайте тоже в конкурсе учавствуйте, вместе с вашим уже 3 робота будет.

Внимание. Конкурс!!! 

Zapek@n
Offline
Зарегистрирован: 16.02.2012

 Здорово! А это у Вас arduino BT или какой-то дополнительный bluetooth использовали?

maksim
Offline
Зарегистрирован: 12.02.2012

А сверло какую роль играет? ) 

Jonyk
Offline
Зарегистрирован: 20.05.2012

 противовес :-)

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

Jonyk
Offline
Зарегистрирован: 20.05.2012

Zapek@n пишет:

 Здорово! А это у Вас arduino BT или какой-то дополнительный bluetooth использовали?

Используется USB host shield и стандартный USB BT приемник.

Jonyk
Offline
Зарегистрирован: 20.05.2012

maksim пишет:

Давайте тоже в конкурсе учавствуйте, вместе с вашим уже 3 робота будет.

Внимание. Конкурс!!! 

да конечно, только немного проект оформлю, схема, скетч, описание.

Jonyk
Offline
Зарегистрирован: 20.05.2012

Схема:

madguitar
Offline
Зарегистрирован: 17.06.2011

я тоже сделал аналогичного робота, даже по комплектации такой)

интересует следующее - управляется напрямую с джоя или все-таки через ПК?

у меня например через ПК, но джойстик от x-box

и на схеме usb-host shield для чего?

Jonyk
Offline
Зарегистрирован: 20.05.2012

madguitar пишет:

я тоже сделал аналогичного робота, даже по комплектации такой)

интересует следующее - управляется напрямую с джоя или все-таки через ПК?

у меня например через ПК, но джойстик от x-box

и на схеме usb-host shield для чего?

В USB-host shield воткнут USB приемник и управление идет напрямую с джойстика, используя библиотеку.

подробнее www.circuitsathome.com/mcu/ps3-and-wiimote-game-controllers-on-the-arduino-host-shield-part-1

библиотека и примеры github.com/felis/USB_Host_Shield_2.0

 

Jonyk
Offline
Зарегистрирован: 20.05.2012

Скетч:

/* Гусиничный робот с роботоризированной рукой
управляемый с джойстика PS3. 
библиотека для джойстика и USB host https://github.com/felis/USB_Host_Shield_2.0 
*/




#include <PS3BT.h>         // Библиотека для джойстика
#include <Servo.h>
Servo Servo1;              
Servo Servo2;
Servo Servo3;
int Servo1centerPos = 95;    // среднеее положение для серв
int Servo2centerPos = 20;
int Servo3centerPos = 5;
int Servo1plus = 180;        // Максимальные и минимальные положения серв
int Servo1minus= 0;
int Servo2plus = 130;
int Servo2minus= 0;
int Servo3plus = 140;
int Servo3minus= 0;
//int Servo1pos = 0;
//int Servo2pos= 0;
const int Motor3DirR =  12;          // Правый мотор
const int Motor4DirL =  13;          // Левый мотор
const int MotorPWM3 =  3;            // PWM для правого мотора
const int MotorPWM4 =  11;           // PWM для левого мотора
//const int Laser =  15;
int Speed = 0;   
//int SpeedL = 0;
//int SpeedR = 0;
int fadeAmount = 1;   // Шаг для изменения PWM
//int fadeAmountturn = 10;
//int Stop = 0; 

USB Usb;
PS3BT BT(&Usb);

void setup() {
    
    
  Serial.begin(115200);
  
  if (Usb.Init() == -1)    // проверяем запущен-ли USB, для нормальной работы необходимо на вход Vin подавать минимум 9V.
  {
   Notify(PSTR("\r\nOSC did not start"));  // Если нет то ошибка
    while(1); 
  }
  Notify(PSTR("\r\nPS3 Bluetooth Library Started")); //Если USB запущем старт библиотеки
  
    Servo1.attach(31);
    Servo2.attach(32);  
    Servo3.attach(24);
  pinMode(Motor3DirR, OUTPUT);
  pinMode(Motor4DirL, OUTPUT);
  pinMode(MotorPWM3, OUTPUT);
  pinMode(MotorPWM4, OUTPUT);
  //pinMode(Laser, OUTPUT);
   Servo1.write(Servo1centerPos);
   Servo2.write(Servo2minus);
   Servo3.write(Servo3centerPos);
}

void loop() {
  

Usb.Task();

  if(BT.PS3BTConnected || BT.PS3NavigationBTConnected) {  // проверка соединения с джойстиком
    if(BT.getAnalogHat(LeftHatX) > 137 || BT.getAnalogHat(LeftHatX) < 117 || BT.getAnalogHat(LeftHatY) > 137 || BT.getAnalogHat(LeftHatY) < 117 || BT.getAnalogHat(RightHatX) > 137 || BT.getAnalogHat(RightHatX) < 117 || BT.getAnalogHat(RightHatY) > 137 || BT.getAnalogHat(RightHatY) < 117 || BT.getAnalogButton(R2_ANALOG) > 0) {
      if(BT.getAnalogHat(LeftHatX) > 137 || BT.getAnalogHat(LeftHatX) < 117 || BT.getAnalogHat(RightHatY) > 137 || BT.getAnalogHat(RightHatY) < 117 || BT.getAnalogButton(R2_ANALOG) > 0) {
        if( BT.getAnalogHat(LeftHatX) < 117) {
          Servo1.write(map(BT.getAnalogHat(LeftHatX),0,117,Servo1minus,Servo1centerPos));                //Управление серво с помощью аналоговых стиков
      }
     if( BT.getAnalogHat(LeftHatX) > 137) {
          Servo1.write(map(BT.getAnalogHat(LeftHatX),137,255,Servo1centerPos,Servo1plus));
      }  
     if( BT.getAnalogHat(RightHatY) < 117) {
          Servo2.write(map(BT.getAnalogHat(RightHatY),0,117,Servo2plus,Servo2centerPos));  
      }
     if( BT.getAnalogHat(RightHatY) > 137) {
          Servo2.write(map(BT.getAnalogHat(RightHatY),137,255,Servo2centerPos,Servo2minus));
      }
     if(BT.getAnalogButton(R2_ANALOG) > 0) {
        Servo3.write(map(BT.getAnalogButton(R2_ANALOG),0,255,Servo3minus,Servo3plus)); 
       }
      }
     } 
    if (BT.getButton(UP)) {                  //Задаем направление
        digitalWrite(Motor3DirR, HIGH);
        digitalWrite(Motor4DirL, HIGH);
     }
    if (BT.getButton(DOWN)) {
        digitalWrite(Motor4DirL, LOW);
        digitalWrite(Motor3DirR, LOW);       
     }
    if (BT.getButton(LEFT)) {
        digitalWrite(Motor4DirL, LOW);
        digitalWrite(Motor3DirR, HIGH);       
     } 
    if (BT.getButton(RIGHT)) {
        digitalWrite(Motor4DirL, HIGH);
        digitalWrite(Motor3DirR, LOW);       
     }
    if (BT.getButton(TRIANGLE)) {                             // Задаем скорость используя PWM, увилечение скорости
        Speed = constrain((Speed + fadeAmount),0,255);
        analogWrite(MotorPWM3, Speed); 
        analogWrite(MotorPWM4, Speed);
     } 
    if (BT.getButton(CROSS)) {                               // Уменьшение скорости
        Speed = constrain((Speed - fadeAmount),0,255); 
       analogWrite(MotorPWM3, Speed); 
       analogWrite(MotorPWM4, Speed); 
     }
    if (BT.getButton(CIRCLE)) {                              // Остановка
       analogWrite(MotorPWM3, LOW); 
       analogWrite(MotorPWM4, LOW);
     }
    //if (BT.getButton(SQUARE)) {
     // digitalWrite(Laser, HIGH);
    //}
  }
 }
Jonyk
Offline
Зарегистрирован: 20.05.2012

Предыдущий вариант управления, использовал Wiiremote джойстик

youtu.be/Og8Tn61F2_E

 

Jonyk
Offline
Зарегистрирован: 20.05.2012

 Вырезал детальки для роботоризированной руки

 

собрал захват

 

Zapek@n
Offline
Зарегистрирован: 16.02.2012

 А чем вырезали если не секрет? Заказывали или сами как-то?

Jonyk
Offline
Зарегистрирован: 20.05.2012

 заказал лазерную резку, сейчас с этим проблем нет 

leshak
Offline
Зарегистрирован: 29.09.2011

 А во что, примерно, резка обошлась?

И, если можно, пару слов: как готовили файл для порезки? В чем рисовали прикидывали? Какие-то пробные разрезы "картона" делали?

Вообщем про "процесс" в общем виде было-бы интерестно услышать ;)

Евгений74
Offline
Зарегистрирован: 08.05.2012

 Jonyk А чертежами захвата не поделишься ? Буду бдагодарен