доброго времени суток! есть необходимость с помощью такого джойстика управлять моторами (Motor Shield). джойстик подключается через troyka shield на разъемы А0 и А1. собственно вся проблема в наличии нужной прошивки. если у кого есть нужное или может помочь-буду признателен!))
Посмотрите в местной вики http://wiki.amperka.ru/ как работать с детальками, потом если не получится, то покажите скетч и что не получилось.
Ссылку просмотрел, но нужного не нашел. Скетч: 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% корявый. Не получилось управлять двумя коллекторными двигателями с помощью джойстика, светодиоды на Motor Shield которые должны гореть зеленым при загрузке скетча горят красным. На команды с джойстика вообще не реагирует.
Сначала проверьте что у Вас работает motor shield и крутятся моторы. Для этого в функции loop() уберите все условия и напишите код Код (Text): goBackward(); delay(1000); goForward(); delay(1000); turnLeft(); delay(1000); turnRight(); delay(1000); Когда заработают моторы, можно разбираться с джойстиком. Кстати где в setup определение пинов джойстика на вход? И еще пины правильнее определять не как переменную, а через #define, т.к. эти значения не меняются во время выполнения программы.
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. Теперь возникает вопрос: куда определять пины на джойстик? И они идут на вход же, верно?
Не вникая в код сразу видно, что не внимательно читали (а может и совсем не читали) как работать с потенциометром, а джойстик это и есть два потенциометра. Выводы джойстика идут на аналоговые пины int JoyStick_X = А0; //x int JoyStick_Y = А1; //y
Выводы джойстика подключены к аналоговым пинам на тройке, сигнал с них поступает на motor shield, только команды он исполняет странно: когда он должен стоять, он поворачивает, по оси X в принципе в порядке с поворотами, а по Y (вперед назад) вообще все мертво.
Изменил код в функции 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(); } } В прямом и обратном направлении робот едет, на повороты никак не соглашается, движки просто молчат и все. В чем может быть проблема?
можно попробовать так: 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); }
Вот в глаза бросилось if(x == 501){ stop(); } if(y == 501){ stop(); } Изменили х, а у=501 - что будет?
В этом и была проблема. Из-за того, что стоп прописан для y и x он не ехал на поворотах, либо вперед назад, в зависимости от того, что стояло в функции void loop: x или y. Убрал и он поехал)) Но назад едет неохотно, думаю в джойстике дело.
Ещё в глаза бросается if(x == 501) Сделайте для джойстика мёртвую зону в нейтральном положении if(x>=490 && x<=510) и откорректируйте значения в условиях движения. Жёстко привязаться к одному значению не правильно, джойстик не всегда будет в него возвращаться.
Возможно стоит попробовать, но проверял я возвращение через Serial monitor там возвращаются в исходное положение, хотя нечастые отклонения бывают (на одну единицу).