Подключение джойстика и прошивка

Тема в разделе "Моторы, сервоприводы, робототехника", создана пользователем Федор, 22 сен 2014.

  1. Федор

    Федор Нуб

    доброго времени суток! есть необходимость с помощью такого джойстика [​IMG]
    управлять моторами (Motor Shield). джойстик подключается через troyka shield на разъемы А0 и А1. собственно вся проблема в наличии нужной прошивки. если у кого есть нужное или может помочь-буду признателен!))
     
  2. ANV

    ANV Гуру

    Посмотрите в местной вики http://wiki.amperka.ru/ как работать с детальками, потом если не получится, то покажите скетч и что не получилось.
     
  3. Федор

    Федор Нуб

    Ссылку просмотрел, но нужного не нашел.
    Скетч:

    int leftLinePin = 10;
    int rightLinePin = 11;

    int leftDirPin = 4;
    int leftSpeedPin = 5;

    int rightDirPin = 7;
    int rightSpeedPin = 6;

    int value_X, value_Y, value_Z = 0;

    int runSpeed = 50;

    void setupMotorShield()
    {
    pinMode(leftDirPin, OUTPUT);
    pinMode(leftSpeedPin, OUTPUT);
    pinMode(rightDirPin, OUTPUT);
    pinMode(rightSpeedPin, OUTPUT);
    }

    void go()
    {
    analogWrite(leftSpeedPin, runSpeed);
    analogWrite(rightSpeedPin, runSpeed);
    }

    void stop()
    {
    analogWrite(leftSpeedPin, 0);
    analogWrite(rightSpeedPin, 0);
    }

    void goBackward()
    {
    digitalWrite(leftDirPin, LOW);
    digitalWrite(rightDirPin, LOW);
    }

    void goForward()
    {
    digitalWrite(leftDirPin, HIGH);
    digitalWrite(rightDirPin, HIGH);
    go();
    }

    void turnLeft()
    {
    digitalWrite(leftDirPin, LOW);
    digitalWrite(rightDirPin, HIGH);
    go();
    }

    void turnRight()
    {
    digitalWrite(leftDirPin, HIGH);
    digitalWrite(rightDirPin, LOW);
    go();
    }

    void setup()
    {
    setupMotorShield();
    }

    void loop()
    {
    value_Y = analogRead(axis_Y); // Считываем аналоговое значение оси Y
    if
    (value_Y >= 0 && value_Y =<502) {
    goBackward();
    } else if (value_Y > 502 && value_Y =<1023) {
    goForward();
    } else if (value_X >=0 && value_X =<502) {
    turnLeft();
    } else if (value_X >502 && value_X =<1023) {
    turnRight();
    }
    }

    Думаю все дело в нем, ибо 100% корявый. :D Не получилось управлять двумя коллекторными двигателями с помощью джойстика, светодиоды на Motor Shield которые должны гореть зеленым при загрузке скетча горят красным. На команды с джойстика вообще не реагирует.
     
  4. ANV

    ANV Гуру

    Сначала проверьте что у Вас работает motor shield и крутятся моторы.
    Для этого в функции loop() уберите все условия и напишите код
    Код (Text):
    goBackward();
    delay(1000);
    goForward();
    delay(1000);
    turnLeft();
    delay(1000);
    turnRight();
    delay(1000);
    Когда заработают моторы, можно разбираться с джойстиком.
    Кстати где в setup определение пинов джойстика на вход?
    И еще пины правильнее определять не как переменную, а через #define, т.к. эти значения не меняются во время выполнения программы.
     
  5. Федор

    Федор Нуб

    Прошил, моторы работают.
    Кстати вся проблема может быть в том что не определил пины на вход...
     
  6. Федор

    Федор Нуб

    Но при определении пинов А0 и А1, все равно платы не работают и на движки сигналы не поступают
     
  7. vvr

    vvr Инженерище

    напиши полный код
     
  8. Федор

    Федор Нуб

    int leftLinePin = 10;
    int rightLinePin = 11;

    int leftDirPin = 4;
    int leftSpeedPin = 5;

    int rightDirPin = 7;
    int rightSpeedPin = 6;

    int JoyStick_X = 0; //x
    int JoyStick_Y = 1; //y

    int runSpeed = 50;

    void setupMotorShield()
    {
    pinMode(leftDirPin, OUTPUT);
    pinMode(leftSpeedPin, OUTPUT);
    pinMode(rightDirPin, OUTPUT);
    pinMode(rightSpeedPin, OUTPUT);
    }

    void go()
    {
    analogWrite(leftSpeedPin, runSpeed);
    analogWrite(rightSpeedPin, runSpeed);
    }

    void stop()
    {
    analogWrite(leftSpeedPin, 0);
    analogWrite(rightSpeedPin, 0);
    }

    void goBackward()
    {
    digitalWrite(leftDirPin, LOW);
    digitalWrite(rightDirPin, LOW);
    }

    void goForward()
    {
    digitalWrite(leftDirPin, HIGH);
    digitalWrite(rightDirPin, HIGH);
    go();
    }

    void turnLeft()
    {
    digitalWrite(leftDirPin, LOW);
    digitalWrite(rightDirPin, HIGH);
    go();
    }

    void turnRight()
    {
    digitalWrite(leftDirPin, HIGH);
    digitalWrite(rightDirPin, LOW);
    go();
    }

    void setup()
    {
    setupMotorShield();
    }

    void loop()
    {
    int x,y,z;
    x=analogRead(JoyStick_X);
    y=analogRead(JoyStick_Y);

    if(x == 502){
    stop();
    }
    if(x > 502) {
    goForward();
    }
    if(x < 502) {
    goBackward();
    }
    if(y == 502){
    stop();
    }
    if(y < 502){
    turnLeft();
    }
    if(y > 502){
    turnRight();
    }
    }

    Это измененный скетч, c вписанными пинами на джойстик, и измененной void loop.
    Теперь возникает вопрос: куда определять пины на джойстик? И они идут на вход же, верно?
     
  9. vvr

    vvr Инженерище

    Не вникая в код сразу видно, что не внимательно читали (а может и совсем не читали) как работать с потенциометром, а джойстик это и есть два потенциометра.
    Выводы джойстика идут на аналоговые пины
    int JoyStick_X = А0; //x
    int JoyStick_Y = А1; //y
     
  10. Федор

    Федор Нуб

    Выводы джойстика подключены к аналоговым пинам на тройке, сигнал с них поступает на motor shield, только команды он исполняет странно: когда он должен стоять, он поворачивает, по оси X в принципе в порядке с поворотами, а по Y (вперед назад) вообще все мертво.
     
  11. Федор

    Федор Нуб

    Изменил код в функции void loop
    void loop()
    {
    int x,y,z;
    x=analogRead(JoyStick_X);
    y=analogRead(JoyStick_Y);

    if(x == 501){
    stop();
    }
    if(x > 501) {
    turnRight();
    }
    if(x < 501) {
    turnLeft();
    }
    if(y == 501){
    stop();
    }
    if(y > 501){
    goForward();
    }
    if(y < 501){
    goBackward();
    }
    }

    В прямом и обратном направлении робот едет, на повороты никак не соглашается, движки просто молчат и все. В чем может быть проблема?
     
  12. Arseny

    Arseny Нерд

    можно попробовать так:
    int l_in = analogRead(A0);
    int l_out;
    int r_in = analogRead(A1);
    int r_out;
    void setup()
    {
    pinMode(A0, INPUT);
    pinMode(A1, INPUT);
    pinMode(3, OUTPUT);
    pinMode(5, OUTPUT);
    }
    void loop()
    {
    int l_out = map(l_in, 0, 1023, 0, 255);
    int r_out = map(r_in, 0, 1023, 0, 255);
    analogWrite(3, l_out);
    analogWrite(5, r_out);
    }
     
  13. vvr

    vvr Инженерище

    Вот в глаза бросилось
    if(x == 501){
    stop();
    }
    if(y == 501){
    stop();
    }
    Изменили х, а у=501 - что будет?
     
  14. Федор

    Федор Нуб

    В этом и была проблема. Из-за того, что стоп прописан для y и x он не ехал на поворотах, либо вперед назад, в зависимости от того, что стояло в функции void loop: x или y. Убрал и он поехал))
    Но назад едет неохотно, думаю в джойстике дело.
     
  15. vvr

    vvr Инженерище

    Ещё в глаза бросается
    if(x == 501)
    Сделайте для джойстика мёртвую зону в нейтральном положении
    if(x>=490 && x<=510) и откорректируйте значения в условиях движения.
    Жёстко привязаться к одному значению не правильно, джойстик не всегда будет в него возвращаться.
     
  16. Федор

    Федор Нуб

    Возможно стоит попробовать, но проверял я возвращение через Serial monitor там возвращаются в исходное положение, хотя нечастые отклонения бывают (на одну единицу).