По вопросу цикла-Моделирование движения робота на 2d-массиве
я пытаюсь смоделировать движение робота в 2d-массиве. В моем случае робот сначала идет вперед, если он видит энгеля, он поворачивает налево и продолжает свое движение. Проблема в том, что я не мог представить поворот налево и движение в левом направлении в исходной матрице.
Вот мой код:
#include <Servo.h>
#define x 7 //определения матрицы
#define y 7
const int trigPin = 12;
const int echoPin = 11;
Servo myServo; //определения переменных
Servo myServo2;
int pos = 0;
int counter;
int counter1 = 0;
int counter2;
int counter3;
int integer;
int integer2;
int integer4;
long duration;
long distance;
void setup() {
Serial.begin(9600);
myServo.attach(9);
myServo2.attach(10);
pinMode(trigPin, OUTPUT); // Устанавливает тригПин в качестве выходного
pinMode(echoPin, INPUT); // Устанавливает эхопин в качестве ввода
}
void loop() {
int my2dArray[x][y] = { // начальная матрица
{1, 1, 1, 1, 1, 1, 1},
{1, 1, 1, 1, 1, 1, 1},
{1, 1, 1, 1, 1, 1, 1},
{1, 1, 1, 0, 1, 1, 1},
{1, 1, 1, 1, 1, 1, 1},
{1, 1, 1, 1, 1, 1, 1},
{1, 1, 1, 1, 1, 1, 1},
};
// Clears the trigPin
digitalWrite(trigPin, LOW);
delayMicroseconds(2);
// Устанавливает триггер в ВЫСОКОЕ состояние на 10 микросекунд
digitalWrite(trigPin, HIGH);
delayMicroseconds(10);
digitalWrite(trigPin, LOW);
// Считывает эхопин, возвращает время прохождения звуковой волны в микросекундах
duration = pulseIn(echoPin, HIGH);
// Расчет расстояния
distance = duration * 0.034 / 2;
int robot = my2dArray[3][3]; // первое место робота
if (counter1 > 0) {
for (integer = 0; integer < counter1; integer += 1) {
if (distance < 10) { //seeing the object
for (pos = 0; pos <= 180 ; pos += 1) { //turning left
myServo.write(pos);
}
for (pos = 0; pos <= 180 ; pos += 1) { //moving on after turning
myServo.write(pos);
myServo2.write(pos);
if (pos == 180) {
counter3 += 1;
}
}
Serial.println(integer);
for (integer4 = 0; integer4 < counter3; integer4 += 1) { //modifying matrix if there is an object
my2dArray[3 + integer][3 + integer4] = robot * my2dArray[3 + integer][3 + integer4];
}
Serial.println("Break condition.");
break;
} else {
my2dArray[3 + integer][3] = robot * my2dArray[3 + integer][3]; //modifying matrix in case of there is no object
}
}
}
for (integer2 = 0; integer2 < 7; integer2++) { //отображение матрицы
Serial.print(my2dArray[integer2][0]);
Serial.print("|");
Serial.print(my2dArray[integer2][1]);
Serial.print("|");
Serial.print(my2dArray[integer2][2]);
Serial.print("|");
Serial.print(my2dArray[integer2][3]);
Serial.print("|");
Serial.print(my2dArray[integer2][4]);
Serial.print("|");
Serial.print(my2dArray[integer2][5]);
Serial.print("|");
Serial.println(my2dArray[integer2][6]);
}
Serial.println();
for (pos = 0; pos <= 180 ; pos += 1) { // движение вперед в первый момент
myServo.write(pos);
myServo2.write(pos);
if (pos == 180) {
counter1 += 1;
}
}
delay(1000);
}
Проблемная часть заключается в следующем:
for (integer4 = 0; integer4 < counter3; integer4 += 1){ //modifying matrix if there is an object
my2dArray[3 + integer][3+integer4] = robot * my2dArray[3 + integer][3+integer4];
}
"целочисленное" значение не изменяется в проблемной части, оно всегда равно 0, несмотря на первый цикл for. Как я могу правильно передать "целое число" в проблемную часть?
@Zuas, 👍-1
Обсуждение1 ответ
Вашей программе трудно следовать со всеми этими бессмысленными переменными "целое число" и "счетчик", и логика местами кажется немного странной, но я считаю, что причиной ваших проблем является оператор break:
for (integer = 0; integer < counter1; integer += 1) {
if (distance < 10) {
// ...
for (integer4 = 0; integer4 < counter3; integer4 += 1) { //modifying matrix if there is an object
my2dArray[3 + integer][3 + integer4] = robot * my2dArray[3 + integer][3 + integer4];
}
break; // << HERE
} else {
// ...
}
}
Какова цель этого перерыва
? Я думаю, что вы используете его, чтобы выпрыгнуть из if
, чтобы он не запускал else
, который он все равно не запустит, так как это условие else. Вместо этого на самом деле разрыв завершает цикл
for
после первой итерации, которая попадает в это внутреннее условие if. То есть, пока расстояние меньше 10, оно будет выполняться только один
раз, и поэтому
целое
число всегда будет равно 0.
- Печать string and integer LCD
- Почему мои часы реального времени показывают неверное время с моего ПК?
- Arduino uno + cnc Shield v3 + драйвер шагового двигателя A4988 + AccelStepper?
- Отправьте несколько значений int из Python в Arduino, используя pySerial
- Глобальные переменные занимают много места в динамической памяти.
- (Код ультразвукового датчика: такого файла или каталога нет)
- rfid_default_keys проверить с помощью RC522
- Команда strtok() с Serial связью
Эти имена переменных действительно сбивают с толку. Вы действительно должны называть их в честь того, что они представляют, а не типа данных, который в них содержится., @Majenko
Кроме того, вам действительно следует научиться правильно форматировать свой код. Это значительно облегчает следование. На этот раз я сделал это для вас, но вам действительно нужно научиться правильно делать отступы., @Majenko