3D Джойстик

Тема в разделе "Arduino & Shields", создана пользователем grx1a, 26 янв 2013.

  1. grx1a

    grx1a Гик

    Всем Эдравствуйте. Решил создать интересный проект но нужен совет специалистов по выбору устройства необходимого для данного проекта.
    Много лет назад играл в игру DOOM по средством видео очков а вместо клавиатуры и обычной мыши использовал необычное устройство напоминающее мышь, но от обычной мыши это устройство отличалось тем что его не нужно водить по столу, я просто держал в ладони эргономичный маленький легкий пластиковый предмет с кнопками на весу, не касаясь рукой ни каких поверхностей! Рука была согнута в локте на угол 90 градусов. И передвижения управляемого объекта осуществлялось путем наклона данного устройства в пространстве, по средствам кисти руки, другими словами, наклонил кисть руки вперед, управляемый объект движется вперед, наклонил назад, объект движется назад, такая же ситуация с наклоном руки вправо и влево, соответственно управляемый объект движется влево или вправо. Управление осуществляется по двум осям в горизонтальной плоскости (X,Y). Связь с компьютером осуществлялась по средствам обычного провода
    Я хочу создать нечто подобное но с некоторой модернизацией этого девайса. Модернизация будет заключаться в том, что величиной угла наклона можно будет изменять скорость изменения параметров управляемого объекта в определенном диапазоне в направлении заданного угла наклона. А также добавить к вышеупомянутому устройству имевшему возможности управления по двум осям в горизонтальной плоскости еще одну ось вращения в вертикальной плоскости Z.
    Вопрос заключается в том, какой девайс из двух упомянутых ниже мне стоит выбрать для осуществления данного проекта?
    1. Трехосный гироскоп http://amperka.ru/collection/Sensory/product/triokhosnyi-ghiroskop
    2. Трехосный компас http://amperka.ru/collection/Sensory/product/triokhosnyi-kompas
    Данное устройство очень удобно для управления роботизированной техники, например: Углом наклона по двум плоскостям можно управлять скоростью и направлением движения управляемого объекта, а углом поворота по вертикальной оси Zможно управлять углом поворота «углом рысканья (вертикальный руль)» что особенно удобно для управления летательными аппаратами. Так же в корпус данного устройства можно установить микро джойстики http://www.elecfreaks.com/store/alps-skqu-4-direction-joystick-w-switch-p-28.html для управления видеокамерой закрепленной на управляемом устройстве (роботе). Ну а про количество кнопок переключателей микро джойстиков в данном устройстве можно ограничить только фантазией весом устройства и размерами корпуса
     
  2. Unixon

    Unixon Оракул Модератор

    Оба сенсора. Только вместо компаса, а лучше вместе с ним можно использовать еще акселерометр, углы крена и тангажа это позволит в локальных координатах получать ближе к реальности, а вот угол рысканья привется уже вычислять вместе с компасом. Тот чип, что называют "гироскопом" на деле является сенсором угловых скоростей и в полноценный гироскоп превращается только в сочетании с вычислителем, интегрирующим его показания. В джойстике с помощью этого сенсора можно измерять напрямую скорости поворота, но если они не нужны, достаточно будет оставить только компас и акселерометр.
     
    grx1a и nailxx нравится это.
  3. grx1a

    grx1a Гик

    Спасибо!!! Заказал нужные железки как что то получится создать размещу описание на сайте.
     
  4. grx1a

    grx1a Гик

    Пока только написал программу к миниджойстику который встрою в 3D джойстик. Миниджойстик хочу подключить к управлению видеокамерой, описание проги есть на форуме в разделе проекты
     
  5. Sergey991

    Sergey991 Нерд

    Гм. могу помочь прогой у меня только немного другое устройство но программа должна подойти!
    Код (Text):
    #include <Wire.h>
     
    #define Register_ID 0
    #define Register_2D 0x2D
    #define Register_X0 0x32
    #define Register_X1 0x33
    #define Register_Y0 0x34
    #define Register_Y1 0x35
    #define Register_Z0 0x36
    #define Register_Z1 0x37
     
    int val;
    int ADXAddress = 0xA7 >> 1;  // the default 7-bit slave address
    int reading = 0;
    int X0,X1,X_out;
    int Y0,Y1,Y_out;
    int Z1,Z0,Z_out;
    int potpin = 0;
    double Xg,Yg,Zg;
     
     
     
     
    void setup()
    {
      Wire.begin();            
      Serial.begin(9600);  
      delay(100);
      // enable to measute g data
      Wire.beginTransmission(ADXAddress);
      Wire.write(Register_2D);
      Wire.write(8);                //measuring enable
      Wire.endTransmission();   // stop transmitting
     
    }
     
     
    void loop()
    {
      //--------------X
      Wire.beginTransmission(ADXAddress); // transmit to device
      Wire.write(Register_X0);
      Wire.write(Register_X1);
      Wire.endTransmission();
      Wire.requestFrom(ADXAddress,2);
      if(Wire.available()<=2)
      {
        X0 = Wire.read();
        X1 = Wire.read();
        X1=X1<<8;
        X_out=X0+X1;
      }
     
      //------------------Y
      Wire.beginTransmission(ADXAddress); // transmit to device
      Wire.write(Register_Y0);
      Wire.write(Register_Y1);
      Wire.endTransmission();
      Wire.requestFrom(ADXAddress,2);
      if(Wire.available()<=2)
      {
        Y0 = Wire.read();
        Y1 = Wire.read();
        Y1=Y1<<8;
        Y_out=Y0+Y1;
      }
      //------------------Z
      Wire.beginTransmission(ADXAddress); // transmit to device
      Wire.write(Register_Z0);
      Wire.write(Register_Z1);
      Wire.endTransmission();
      Wire.requestFrom(ADXAddress,2);
      if(Wire.available()<=2)
      {
        Z0 = Wire.read();
        Z1 = Wire.read();
        Z1=Z1<<8;
        Z_out=Z0+Z1;
      }
      //
      Xg=X_out;//256.0;
      Yg=Y_out;//256.0;
      Zg=Z_out;//256.0;
      Serial.print("X= ");
      Serial.print(Xg);
      Serial.print("      ");
      Serial.print("Y= ");
      Serial.print(Yg);
      Serial.print("        ");
      Serial.print("Z= ");
      Serial.print(Zg);
      Serial.println("  ");
      delay(10);
    }
    Тоесть считываем значения и отправляем через сериал=)
     
    grx1a нравится это.
  6. grx1a

    grx1a Гик

    Благодарю, скоро мне этот код пригодится
     
  7. Dmitriy Kunin

    Dmitriy Kunin Гик

    Готовое решение :)

     
  8. grx1a

    grx1a Гик

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

    grx1a Гик

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

    grx1a Гик

    Помогите пожалуйста не могу енкодер настроить математический выражение правильно но машина его почему то не математический считает, все должно быть так 1+1=2 0+0=0 0+1=1, но на деле машина это по своему считает, в чем причина? вот часть кода
    /*
    Программа для энкодера
    Общий вход пин энкодера +5в (1 или HIGH)
    Выход A 01100110011
    Выход B 00110011001
    Сумма 01210121012
    */
    #define pinA 3 //
    #define pinB 4 //
    #define ledpin 13 //
    boolean stateA=0; //
    boolean stateB=0; //
    boolean valA=0; //
    boolean valB=0; //
    boolean pulse = 0; //
    boolean direction = 0; //
    void setup(){
    pinMode(pinA,INPUT); //
    pinMode(pinB,INPUT); //
    pinMode(ledpin,OUTPUT); //
    }
    void loop(){
    valA=digitalRead(pinA); //
    valB=digitalRead(pinB); //
    if(valA==HIGH) //
    {stateA=1;}
    else
    {stateA=0;}
    if(valB==HIGH) //
    {stateB=1;}
    else
    {stateA=0;}
    if(stateA+stateB==2) //
    {pulse=0;}
    if(stateA+stateB==0)
    {pulse=0;}
    if(stateA+stateB==1)
    {pulse=1;}

    if (pulse==1) //
    {digitalWrite(ledpin,HIGH);}
    else
    {digitalWrite(ledpin,LOW);}}
     
  11. roggedhorse

    roggedhorse Гик

    вот тут

    Код (Text):

    if (valB==HIGH) {
        stateB=1;
    } else {
        stateA=0;
    }
     
    должно быть stateB ?


    P.S. как же трудно читается ваш код :(


    P.P.S. Вместо Serial.print(" "); можно писать Serial.print("\t");
     
  12. grx1a

    grx1a Гик

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