Помогите разобраться с режимами манипулятора
- Войдите на сайт для отправки комментариев
Втр, 19/04/2016 - 17:20
#include <Servo.h>
int joyX=5;
int joyY=4;
int joyU=3;
int joyI=1;
int joyM=0;
int angl=90;
int angl2=90 ;
int angl3=90 ;
int angl4=90 ;
int angl5=90 ;
int pos1 = 0;
int pos2 = 0;
int pos3 = 90;
int pos4 = 90;
int ButPin = 7; // Подключаем кнопку к выходу 10
int flag = 0; // флаг состояния
int flag1 = 0;
int regim = 0; // Переключалка
Servo myservo1;
Servo myservo2;
Servo myservo3;
Servo myservo4;
Servo myservo5;
int ButPin1 = 5;
void setup()
{
myservo1.attach(9);
myservo2.attach(10);
myservo3.attach(6);
myservo4.attach(12);
myservo5.attach(11);
pinMode(joyX,INPUT);
pinMode(joyY,INPUT);
pinMode(joyU,INPUT);
pinMode(joyI,INPUT);
pinMode(joyM,INPUT);
Serial.begin(19200);
}
void loop()
{
if(digitalRead(ButPin) == HIGH && flag == 0)
{
regim ++;
flag = 1;
if(regim > 1)
{
regim = 0;
}
}
if(digitalRead(ButPin) == LOW && flag == 1)
{
flag = 0;
}
// ======= Вполняем задачу при выборе режима =======
// РЕЖИМ 0: OFF
if(regim == 0)
{
int val = (analogRead(joyX)/64)-8;
if (val > 0) {
angl=angl+abs(val);
}
else {
if (val < 0) {
angl=angl-abs(val);}
}
int val1 = (analogRead(joyY)/64)-8;
if (val1 > 0) {
angl2=angl2+abs(val1);
}
else {
if (val1 < 0) {
angl2=angl2-abs(val1);}
}
int val2 = (analogRead(joyU)/64)-8;
if (val2 > 0) {
angl3=angl3+abs(val2);
}
else {
if (val2 < 0) {
angl3=angl3-abs(val2);}
}
int val3 = (analogRead(joyI)/64)-8;
if (val3 > 0) {
angl4=angl4+abs(val3);
}
else {
if (val3 < 0) {
angl4=angl4-abs(val3);}
}
int val4 = (analogRead(joyM)/64)-8;
if (val4 > 0) {
angl5=angl5+abs(val4);
}
else {
if (val4 < 0) {
angl5=angl5-abs(val4);}
}
if (angl < 0) angl = 0;
if (angl > 180) angl = 180;
if (angl2 < 0) angl2 = 0;
if (angl2 > 180) angl2 = 180;
if (angl3 < 0) angl3 = 0;
if (angl3 > 180) angl3 = 180;
if (angl4 < 0) angl4 = 0;
if (angl4 > 180) angl4 = 180;
if (angl5 < 0) angl5 = 0;
if (angl5 > 180) angl5 = 180;
Serial.print("Power: ");
Serial.println(val);
Serial.println(val1);
Serial.println(val2);
Serial.println(val3);
Serial.println(val4);
Serial.print("Angle: ");
Serial.println(angl);
Serial.println(angl2);
Serial.println(angl3);
Serial.println(angl4);
Serial.println(angl5);
myservo1.write(angl);
myservo2.write(angl2);
myservo3.write(angl3);
myservo4.write(angl4);
myservo5.write(angl5);
int spd = 200;
if (val != 0) {
spd = 700/abs(val);
}
if (val1 != 0) {
spd = 700/abs(val1);
}
if (val2 != 0) {
spd = 700/abs(val2);
}
if (val3 != 0) {
spd = 700/abs(val3);
}
if (val4 != 0) {
spd = 700/abs(val4);
}
Serial.print("Speed: ");
Serial.println(spd);
Serial.println("-----------");
delay(spd);
}
// РЕЖИМ 1: R
if(regim == 1)
{
for (pos1 = 0; pos1 <= 180; pos1 += 1) {
myservo1.write(pos1);
delay(20);
}
delay(1000);
for (pos2 = 90; pos2 >= 30; pos2 -= 1) {
myservo2.write(pos2);
delay(25);
}
delay(1000);
for (pos4 = 90; pos4 >= 20; pos4 -= 1) {
myservo4.write(pos4);
delay(25);
}
delay(100);
for (pos3 = 60; pos3 >= 50; pos3 -= 1) {
myservo3.write(pos3);
delay(25);
}
delay(1000);
for (pos4 = 20; pos4 <= 120; pos4 += 1) {
myservo4.write(pos4);
delay(25);
}
delay(100);
for (pos3 = 50; pos3 <= 100; pos3 += 1) {
myservo3.write(pos3);
delay(25);
}
delay(1000);
for (pos2 = 30; pos2 <= 90; pos2 += 1) {
myservo2.write(pos2);
delay(40);
}
delay(1000);
for (pos1 = 180; pos1 >= 0; pos1 -= 1) {
myservo1.write(pos1);
delay(20);
}
delay(1000);
for (pos2 = 90; pos2 >= 30; pos2 -= 1) {
myservo2.write(pos2);
delay(25);
}
delay(1000);
for (pos3 = 60; pos3 >= 50; pos3 -= 1) {
myservo3.write(pos3);
delay(25);
}
delay(1000);
for (pos4 = 90; pos4 >= 20; pos4 -= 1) {
myservo4.write(pos4);
delay(25);
}
delay(100);
for (pos3 = 50; pos3 <= 100; pos3 += 1) {
myservo3.write(pos3);
delay(25);
}
delay(1000);
for (pos4 = 20; pos4 <= 90; pos4 += 1) {
myservo4.write(pos4);
delay(10);
}
for (pos2 = 30; pos2 <= 90; pos2 += 1) {
myservo2.write(pos2);
delay(40);
}
delay(1000);
}
}
Помогите разобраться с режимами работы робота манипулятора. Сначала отрабатывается ручной режим от джойстиков, далее при нажатии на кнопку отрабатывается автоматический режим, если нажать на кнопку ещё раз, манипулятор должен перейти в ручной режим, но этого не происходит, он так и остаётся в автоматическом режиме. Что не так, почему он не переходит в ручное управление?
Я бы это не писал. Так как по умолчанию пины и так выходы и в подобной декларации не нуждаются
pinMode(joyX,INPUT);
pinMode(joyY,INPUT);
pinMode(joyU,INPUT);
pinMode(joyI,INPUT);
pinMode(joyM,INPUT);
Сначала исправите первое сообщение: код надо постить, нажав кнопочку с красными скобочками над окошком написания сообщения. Разбираться в сплошном тексте мало кому приятно... :)
#include <Servo.h> int joyX=5, joyY=4, joyU=3, joyI=1, joyM=0; int angl=90, angl2=90, angl3=90, angl4=90, angl5=90; int pos1 = 0, pos2 = 0, pos3 = 90, pos4 = 90; int ButPin = 7; // Подключаем кнопку к выходу 10 // флаг состояния int flag = 0, flag1 = 0; int regim = 0; // Переключалка Servo myservo1, myservo2, myservo3, mysrvo4, myservo5; int ButPin1 = 5; void setup() { myservo1.attach(9); myservo2.attach(10); myservo3.attach(6); myservo4.attach(12); myservo5.attach(11); Serial.begin(19200); } void loop() { if(digitalRead(ButPin) == HIGH && flag == 0) { regim ++; flag = 1; if(regim > 1) { regim = 0; } } if(digitalRead(ButPin) == LOW && flag == 1) { flag = 0; } // ======= Вполняем задачу при выборе режима ======= // РЕЖИМ 0: OFF if(regim == 0) { int val = (analogRead(joyX)/64)-8; if (val > 0) { angl=angl+abs(val); } else { if (val < 0) { angl=angl-abs(val);} } int val1 = (analogRead(joyY)/64)-8; if (val1 > 0) { angl2=angl2+abs(val1); } else { if (val1 < 0) { angl2=angl2-abs(val1);} } int val2 = (analogRead(joyU)/64)-8; if (val2 > 0) { angl3=angl3+abs(val2); } else { if (val2 < 0) { angl3=angl3-abs(val2);} } int val3 = (analogRead(joyI)/64)-8; if (val3 > 0) { angl4=angl4+abs(val3); } else { if (val3 < 0) { angl4=angl4-abs(val3);} } int val4 = (analogRead(joyM)/64)-8; if (val4 > 0) { angl5=angl5+abs(val4); } else { if (val4 < 0) { angl5=angl5-abs(val4);} } if (angl < 0) angl = 0; if (angl > 180) angl = 180; if (angl2 < 0) angl2 = 0; if (angl2 > 180) angl2 = 180; if (angl3 < 0) angl3 = 0; if (angl3 > 180) angl3 = 180; if (angl4 < 0) angl4 = 0; if (angl4 > 180) angl4 = 180; if (angl5 < 0) angl5 = 0; if (angl5 > 180) angl5 = 180; Serial.print("Power: "); Serial.println(val); Serial.println(val1); Serial.println(val2); Serial.println(val3); Serial.println(val4); Serial.print("Angle: "); Serial.println(angl); Serial.println(angl2); Serial.println(angl3); Serial.println(angl4); Serial.println(angl5); myservo1.write(angl); myservo2.write(angl2); myservo3.write(angl3); myservo4.write(angl4); myservo5.write(angl5); int spd = 200; if (val != 0) { spd = 700/abs(val); } if (val1 != 0) { spd = 700/abs(val1); } if (val2 != 0) { spd = 700/abs(val2); } if (val3 != 0) { spd = 700/abs(val3); } if (val4 != 0) { spd = 700/abs(val4); } Serial.print("Speed: "); Serial.println(spd); Serial.println("-----------"); delay(spd); } // РЕЖИМ 1: R if(regim == 1) { for (pos1 = 0; pos1 <= 180; pos1 += 1) { myservo1.write(pos1); delay(20); } delay(1000); for (pos2 = 90; pos2 >= 30; pos2 -= 1) { myservo2.write(pos2); delay(25); } delay(1000); for (pos4 = 90; pos4 >= 20; pos4 -= 1) { myservo4.write(pos4); delay(25); } delay(100); for (pos3 = 60; pos3 >= 50; pos3 -= 1) { myservo3.write(pos3); delay(25); } delay(1000); for (pos4 = 20; pos4 <= 120; pos4 += 1) { myservo4.write(pos4); delay(25); } delay(100); for (pos3 = 50; pos3 <= 100; pos3 += 1) { myservo3.write(pos3); delay(25); } delay(1000); for (pos2 = 30; pos2 <= 90; pos2 += 1) { myservo2.write(pos2); delay(40); } delay(1000); for (pos1 = 180; pos1 >= 0; pos1 -= 1) { myservo1.write(pos1); delay(20); } delay(1000); for (pos2 = 90; pos2 >= 30; pos2 -= 1) { myservo2.write(pos2); delay(25); } delay(1000); for (pos3 = 60; pos3 >= 50; pos3 -= 1) { myservo3.write(pos3); delay(25); } delay(1000); for (pos4 = 90; pos4 >= 20; pos4 -= 1) { myservo4.write(pos4); delay(25); } delay(100); for (pos3 = 50; pos3 <= 100; pos3 += 1) { myservo3.write(pos3); delay(25); } delay(1000); for (pos4 = 20; pos4 <= 90; pos4 += 1) { myservo4.write(pos4); delay(10); } for (pos2 = 30; pos2 <= 90; pos2 += 1) { myservo2.write(pos2); delay(40); } delay(1000); } }Даже при нескольких нажатиях не происходит переключения?
в какой то момент, если быстро нажимать кнопку происходит переключение
Значит дело не в стабильности кнопки.
В этом уроке чел пишет и объясняет фукнцию для стабилизации кнопки
https://www.youtube.com/watch?v=LkR8rxzAo_A&index=3&list=PL944BA86E715C5FEE