#arrays #arduino #sensors #robotics
#массивы #arduino #датчики #робототехника
Вопрос:
Я пытаюсь заставить датчик сканировать вокруг и пометить объект, присвоив 1 этой позиции. Позиции из 30 60 90 120 150 [ 0 0 0 0 0]. Затем я хотел взять этот массив и сравнить его с памятью (tempArray vs memArray) и решить, в какую сторону повернуть. По сути, предотвращение препятствий, есть предложения о том, как реализовать это с помощью массивов?
void scan() {
servo.write(30);
delay(350);
rScan = echodis();
if (rScan > distanceLimit) {
tempArray[4] = 1;
}
servo.write(60);
delay(350);
rDiagScan = echodis();
if (rDiagScan > distanceLimit) {
tempArray[3] = 1;
}
servo.write(90);
delay(350);
cScan = echodis();
if (cScan > distanceLimit) {
tempArray[2] = 1;
}
servo.write(120);
delay(350);
lDiagScan = echodis();
if (lDiagScan > distanceLimit) {
tempArray[1] = 1;
}
servo.write(150);
delay(350);
lScan = echodis();
if (lScan > distanceLimit) {
tempArray[0] = 1;
}
scanCount ;
servo.write(120);
delay(350);
lDiagScan = echodis();
if (lDiagScan > distanceLimit) {
tempArray[1] = 1;
} servo.write(90);
delay(350);
cScan = echodis();
if (cScan > distanceLimit) {
tempArray[2] = 1;
}
servo.write(60);
delay(350);
rDiagScan = echodis();
if (rDiagScan > distanceLimit) {
tempArray[3] = 1;
}
servo.write(30);
delay(350);
rScan = echodis();
if (rScan > distanceLimit) {
tempArray[4] = 1;
}
scanCount ;
//if(scanCount = 4){
//memset(tempArray, 0, sizeof(tempArray));
//}
//return (tempArray);
}
Ответ №1:
Есть много способов решить такие проблемы при повторении, вот один.
Подход здесь заключается в том, чтобы позволить состоянию и данным управлять операциями, а не массово повторяющимся кодом, подверженным ошибкам. Также учитывайте важность определения минимумов, максимумов, констант и т.д. В одном месте.
#define SERVO_SETTLE_MILLIS 350
#define SERVO_STEP 30
#define SERVO_SAMPLE_LEN 5
#define OUTLIER 1
#define INLIER 0
byte scan_count = 0; // when even or 0, position starts at 30. when odd, position starts at 150.
void scan(byte* pSampleArray, const uint16_t maxDistance) {
byte direction = scan_count % 2 == 0;
byte servo_position = direction ? (SERVO_SAMPLE_LEN * SERVO_STEP) : 0;
byte sample_index = direction ? SERVO_SAMPLE_LEN : -1;
for (byte i = 0; i < SERVO_SAMPLE_LEN; i ) {
// direction == 0 == servo position starts at 30 (initial)
if (direction) {
sample_index--; // e.g. 4,3,2,1,0
servo_position = SERVO_STEP; // e.g. 30,60,90,120,150
}
else
{
sample_index ; // e.g. 0,1,2,3,4
servo_position -= SERVO_STEP;; // e.g. 150,120,90,60,30
}
// position servo
servo.write(servo_position);
// settling time
delay(SERVO_SETTLE_MILLIS);
// sample = 1 if outlier, 0 otherwise
pSampleArray[sample_index] = echodis() > maxDistance ? OUTLIER : INLIER;
}
scan_count ; // implies direction stepping for next call to scan.
}
Конечно, необходимо позаботиться о том, чтобы pSampleArray мог вместить 5 выборок.
Вы не говорите о том, что вы планируете делать с «массивами», которые, вероятно, являются реальной основой вашего проекта, но, например, рассмотрите функцию foo
void foo(const uint16_t maxDistance) {
byte sample1[SERVO_SAMPLE_LEN];
byte sample2[SERVO_SAMPLE_LEN];
scan(sample1, maxDistance);
delay(1000);
scan(sample2, maxDistance);
//
// process your samples
//
}
Удачи!