Запись чтение значений в массиве через кнопку
- Войдите на сайт для отправки комментариев
Пт, 10/04/2015 - 12:43
Доброго времени суток, принцып такой , крутим потециометры , далее жмёт кнопку происходит запись всех 4 х значений в массив и так несколько раз происходит запись последовательно в массив -перед нажатием один раз на неё меняем потенциометры каждый раз , жмём на кнопку два раза - должно происходить считывание с массива данных и крутить сервоприв, по считываемым данным с массива далее всё по кругу считывается и выполняется ,,,,, помогите разобраться почему эта кнопка ничего не делает , серво крутится при изменении положения потенциометров но на кнопку нет реакции .
#include <Servo.h> // servo treiber
Servo servo_0;
Servo servo_1;
Servo servo_2;
Servo servo_3;
int sensorPin0 = A0; // Schulter
int sensorPin1 = A1; // Hand
int sensorPin2 = A2; // Ellbogen
int sensorPin3 = A3; // Zange
int count0, arrayStep, arrayMax, countverz, Taster, stepsMax, steps, time = 1000, del = 1000, temp;
unsigned int verz = 0;
long previousMillis1 = 0;
long previousMillis2 = 0;
long previousMillis3 = 0;
long previousMillis4 = 0;
long previousMicros = 0;
unsigned long currentMillis = millis();
unsigned long currentMicros = micros();
// arrays
int Delay[7] = {0,0,1,3,15,60,300};
int SensVal[4]; // sensor werte
float dif[4], ist[4], sol[4], dir[4];
int joint0[180];
int joint1[180];
int joint2[180];
int joint3[180];
int top = 179;
// status
boolean playmode = false, Step = false;
void setup()
{
pinMode(4, INPUT); // sets the digital pin 4 as intput
pinMode(6, INPUT); // sets the digital pin 4 as intput
pinMode(13, OUTPUT); // sets the digital pin 4 as intput
digitalWrite(13, HIGH); // sets the LED on
servo_0.attach(3);
servo_1.attach(5);
servo_2.attach(10);
servo_3.attach(11);
Serial.begin(115200);
Serial.println("mini robot ready...");
//delay(1000);
digitalWrite(13, LOW);
}
void loop()
{
currentMillis = millis();
currentMicros = micros();
// Schalter abfragen
Button();
if(!playmode) // manuelles führen
{
if(currentMillis - previousMillis1 > 25) // 40tel sekunde
{
if (arrayStep < top)
{
previousMillis1 = currentMillis;
readPot();
mapping();
move_servo();
//record();
} // ende zähler < max
} // ende step (<20ms
} // ende manuelles führen
else if(playmode) // abspielen
{
if (Step) // next step aus array lesen
{
digitalWrite(13, HIGH);
if (arrayStep < arrayMax)
{
arrayStep += 1;
Read();
calculate();
Step = 0;
digitalWrite(13, LOW);
}
else // liste fertig. neustart
{
arrayStep = 0; //
calc_pause(); // pausenlänge aus zangenpoti lesen
countverz = 0;
while(countverz < verz)
{
countverz += 1;
calc_pause();
digitalWrite(13, HIGH); delay(25);
digitalWrite(13, LOW); delay(975);
}
}
//Serial.println(arrayStep);
}
else // ausführen
{
if (currentMicros - previousMicros > time) // speed für servo update/step
{
previousMicros = currentMicros;
play_servo();
}
}
}// ende playmode
// ---------------------------------------------------------------------------------Hardware Pause Schalter
while (digitalRead(4) == true)
{
digitalWrite(13, HIGH); delay(500);
digitalWrite(13, LOW); delay(500);
}
// ---------------------------------------------------------------------------------- Textausgabe seriel
// serial ausgabe 1 sek
/*if(currentMillis - previousMillis2 > 5000)
{
previousMillis2 = currentMillis;
/*count0 = 0;
while(count0 < 4)
{
int val = SensVal[count0];
// val = map(val, 142, 888, 0, 180);
Serial.println(val);
//Serial.println("test");
count0 += 1;
}
Serial.println(playmode);
Serial.println(arrayStep);
Serial.println(arrayMax);
Serial.println(" ");
}*/
}
// ---------------------------------------------------------------------------------------- sub routinen
void calc_pause()
{
readPot();
temp = SensVal[3];
if (temp < 0) temp = 0;
temp = map(temp, 0, 680, 0 ,6);
verz = Delay[temp];
/*Serial.print(temp);
Serial.print(" ");
Serial.print(verz);
Serial.print(" ");
Serial.println(countverz);*/
}
void readPot()
{
SensVal[0] = analogRead(sensorPin0); SensVal[0] += -10; // Schulter drehen
SensVal[1] = analogRead(sensorPin1); SensVal[1] += 280; // Schulter
SensVal[2] = analogRead(sensorPin2); SensVal[2] += -50; // Hand
SensVal[3] = analogRead(sensorPin3); // SensVal[3] += 0;// Zange
//Serial.print(SensVal[2]);Serial.print(" "); // CHECK
}
void mapping()
{
ist[0] = map(SensVal[0], 150, 900, 600, 2400);// Schulter drehen
ist[1] = map(SensVal[1], 1000, 100, 550, 2400);// Schulter
ist[2] = map(SensVal[2], 120, 860, 400, 2500);// Hand
ist[3] = map(SensVal[3], 1023, 0, 500, 2500);// Zange
//Serial.println(ist[2]); // CHECK
}
void record()
{
joint0[arrayStep] = ist[0];
joint1[arrayStep] = ist[1];
joint2[arrayStep] = ist[2];
joint3[arrayStep] = ist[3];
}
void Read()
{
sol[0] = joint0[arrayStep];
sol[1] = joint1[arrayStep];
sol[2] = joint2[arrayStep];
sol[3] = joint3[arrayStep];
}
void move_servo()
{ //anschlüsse gemappt!
servo_0.writeMicroseconds(ist[3]); // Zange
servo_1.writeMicroseconds(ist[2]); // Hand
servo_2.writeMicroseconds(ist[0]); // Schulter
servo_3.writeMicroseconds(ist[1]); // Ellbogen
}
// ------------------------------------------------------------ einzelschritte berechnen
void calculate()
{
// wegstrecken berechnen
dif[0] = abs(ist[0]-sol[0]);
dif[1] = abs(ist[1]-sol[1]);
dif[2] = abs(ist[2]-sol[2]);
dif[3] = abs(ist[3]-sol[3]);
// grösten weg finden
stepsMax = max(dif[0],dif[1]);
stepsMax = max(stepsMax,dif[2]);
stepsMax = max(stepsMax,dif[3]);
//Serial.println(stepsMax);
if (stepsMax < 500) // slow if maxstep < 400
del = 1200;
else
del = 600;
// einzelschritt berechnen (step + pos/neg)
if (sol[0] < ist[0]) dir[0] = 0-dif[0]/stepsMax; else dir[0] = dif[0]/stepsMax;
if (sol[1] < ist[1]) dir[1] = 0-dif[1]/stepsMax; else dir[1] = dif[1]/stepsMax;
if (sol[2] < ist[2]) dir[2] = 0-dif[2]/stepsMax; else dir[2] = dif[2]/stepsMax;
if (sol[3] < ist[3]) dir[3] = 0-dif[3]/stepsMax; else dir[3] = dif[3]/stepsMax;
//Serial.println(dir4);
}
void play_servo()
{
steps += 1;
if (steps < stepsMax)
{
//time = del*5;// anfahr rampe
if(steps == 20) time = del*4; // anfahr rampe up
else if(steps == 40) time = del*3;
else if(steps == 80) time = del*2;
else if(steps == 100) time = del-1;
if(steps == stepsMax-200) time = del*2; // stop rampe down
else if(steps == stepsMax-80) time = del*3;
else if(steps == stepsMax-40) time = del*4;
else if(steps == stepsMax-20) time = del*5;
ist[0] += dir[0]; // set new pos
ist[1] += dir[1];
ist[2] += dir[2];
ist[3] += dir[3];
servo_0.writeMicroseconds(ist[3]); // Zange //anschlüsse gemappt!
servo_1.writeMicroseconds(ist[2]); // Hand
servo_2.writeMicroseconds(ist[0]); // Schulter
servo_3.writeMicroseconds(ist[1]); // Ellbogen
}
else
{
Step = 1; // next step aus array lesen
steps = 0; // servo zwischenschritte
}
}
void data_out() // generiert listen mit Servo daten (milli sekunden)
{
int i = 0;
while(i < arrayMax)
{
digitalWrite(13, HIGH);
i += 1;
Serial.print(joint0[i]); Serial.print(", ");
}
Serial.println("Joint0");
i = 0;
while(i < arrayMax)
{
digitalWrite(13, HIGH);
i += 1;
Serial.print(joint1[i]); Serial.print(", ");
}
Serial.println("Joint1");
i = 0;
while(i < arrayMax)
{
digitalWrite(13, HIGH);
i += 1;
Serial.print(joint2[i]); Serial.print(", ");
}
Serial.println("Joint2");
i = 0;
while(i < arrayMax)
{
digitalWrite(13, HIGH);
i += 1;
Serial.print(joint3[i]); Serial.print(", ");
}
Serial.println("Joint3");
}
void Button()
{
if (digitalRead(6) == false)
{
delay(20);
if (digitalRead(6) == true) // taster losgelassen
{
if (Taster == 0)
{
Taster = 1;
previousMillis3 = currentMillis;
//Serial.print("Status Record "); Serial.println(Taster);
}
else if ((Taster == 1) && (currentMillis - previousMillis3 < 250))
{
Taster = 2;
//Serial.println(Taster);
}
/*else if ((Taster == 2) && (currentMillis - previousMillis3 < 500))
{
Taster = 3;
Serial.println(Taster);
}*/
}
}
if ((Taster == 1) && (currentMillis - previousMillis3 > 1000)) // array beschreiben
{
arrayStep += 1;
arrayMax = arrayStep;
record();
Taster = 0;
playmode = false;
Serial.print("Record Step: "); Serial.println(arrayStep);
digitalWrite(13, HIGH);
delay(100);
digitalWrite(13, LOW);
}
else if (Taster == 2)
{
arrayStep = 0;
playmode = true;
Taster = 0;
Step = 1;
Serial.println("playmode ");
data_out();
delay(250);
digitalWrite(13, LOW);
}
/*if (Taster == 3)
{
// ++ arrayStep
// playmode = 1;
Taster = 0;
Serial.println("Clear ");
}*/
if (currentMillis - previousMillis3 > 2000) // Taster Status löschen
{
Taster = 0;
//Serial.println("restart ");
}
}
Нашёл ошибку кноб надо к 6 ке воткнуть , всё работает но медленно крутит приводы , сори за созданную тему , но может кому пригодится данный вариает повтора данных движений )))) в моём случае это манипулятор , задаю движения а он потом выполняет их циклично , после оключения питания массив обнуляется , обучать движениям надо вновь ,