Бот Arduinosumo с вращающимся мотором

Я делаю сумо-бот для проекта с использованием Arduino. У меня нет опыта работы с кодом Arduino, но у меня есть опыт работы с Java. Тем не менее, у этого бота есть детектор краев для предотвращения его падения, драйвер L298 и так далее.
Из-за недостатка опыта я не знаю точно, как код Arduino работает с методами и т. Д. Тем не менее, мой главный вопрос — как он выполняет мои методы с задержками? Это застревает в методах без возврата? Не входишь? Выполнение заканчивается позже? В настоящее время кажется, что двигатели движутся вперед без включения или выключения. Я также проверил проводку. (Я прошу прощения за плохое расспрос — девственница переполнена).

int motor_forward = 10;
int motor_reverse = 9;
int motor2_forward = 13;
int motor2_reverse = 12;
int edgeDec1 = 7;
//int edgeDec2 = 6;

//the setup routine runs once when you press reset;
void setup(){
//initialize the digital pin as an output.
pinMode(motor_forward, OUTPUT);
pinMode(motor_reverse,OUTPUT);
pinMode(motor2_forward,OUTPUT);
pinMode(motor2_reverse,OUTPUT);
pinMode(edgeDec1,INPUT);

}
//the loop routine runs over and over again forever
void loop(){
int indicator = random(2);

delay(5000);//5 second delay
//loop to prevent another 5 second delay
while(true){
if (indicator = 0){
for(int x = 0; x < random(200); x++){
Forward();
EdgeDec();
delay(10);
}
}
else if ( indicator = 1){
for(int x = 0; x < random(200); x++){
TurnLeft();
EdgeDec();
delay(10);
}
}
else if ( indicator = 2){
for(int x = 0; x < random(200); x++){
TurnRight();
EdgeDec();
delay(10);
}
}

}

}
void Forward(){
//right motor
digitalWrite(motor_forward,1);//terminal d1 will be high
digitalWrite(motor_reverse,0);//terminal d2 will be low

//left motor
digitalWrite(motor2_forward,1);//terminal d1 will be high
digitalWrite(motor2_reverse,0);//terminal d2 will be low

}
//going in reverse
void Reverse(){
//right motor
digitalWrite(motor_forward,0);//terminal d1 will be low
digitalWrite(motor_reverse,1);//terminal d2 will be high

//left motor
digitalWrite(motor2_forward,0);//terminal d1 will be low
digitalWrite(motor2_reverse,1);//terminal d2 will be high

}
//rotating left
void TurnLeft(){
//right motor
digitalWrite(motor_forward,0);//terminal d1 will be high
digitalWrite(motor_reverse,1);//terminal d2 will be low

//left motor
digitalWrite(motor2_forward,1);//terminal d1 will be high
digitalWrite(motor2_reverse,0);//terminal d2 will be low

}
void TurnRight(){
//right motor
digitalWrite(motor_forward,1);//terminal d1 will be high
digitalWrite(motor_reverse,0);//terminal d2 will be low

//left motor
digitalWrite(motor2_forward,0);//terminal d1 will be high
digitalWrite(motor2_reverse,1);//terminal d2 will be low

}
void EdgeDec(){
if(edgeDec1 == 1){
Reverse();
delay(700);
TurnLeft();
delay(1000);
Forward();

}
}

0

Решение

У вас есть пара ошибок / недоразумений в вашем коде, поэтому я добавил немного простой отладки, которая работает, открыв Инструменты> Serial Monitor после загрузки вашего кода. В вашей функции EdgeDec () (функция = метод Java) у вас было if (EdgeDec = 1), но EdgeDec — это просто целое число со значением 7. Что вы хотели — это прочитать значение вывода с номером 7 — if (digitalRead) (edgeDec1) == НИЗКИЙ).

Кроме того, я изменил вашу логику с HIGH (1) на LOW (0), потому что вы не привязали выводы digitalRead ни LOW (используя внешние резисторы), ни HIGH (используя внутренние резисторы Arduino) — прочитайте мои комментарии в коде. Не уверен, что вы делали с циклом while (true) — возможно, дальнейшая отладка? В любом случае, надеюсь, это поможет …

int motor_forward = 10;
int motor_reverse = 9;
int motor2_forward = 13;
int motor2_reverse = 12;
int edgeDec1 = 7;
//int edgeDec2 = 6;
int indicator; // pulled this out of your loop - askchipbug

String repeatstring; //debugging variable, stops a debug string from repeating in Serial monitor when watching a loop - askchipbug

//the setup routine runs once when you press reset;
void setup(){
Serial.begin(9600);           // set up Serial library at 9600 bps, using SerialMonitor to debug - askchipbug
//initialize the digital pin as an output.
pinMode(motor_forward, OUTPUT);
pinMode(motor_reverse,OUTPUT);
pinMode(motor2_forward,OUTPUT);
pinMode(motor2_reverse,OUTPUT);
pinMode(edgeDec1,INPUT_PULLUP); // set this high so it doesn't float about - askchipbug
// you can use the internal 20k pullups with INPUT_PULLUP which means 1 = off, 0 = on
// or you have to use external pulldown resistors to have 1 = on, 0 = off
pr("setup completed"); // askchipbug

}
//the loop routine runs over and over again forever
void loop(){
randomSeed(analogRead(0)); // seeds the random() function with a different number each time the loop runs - askchipbug
indicator = random(2);
pr("indicator: " + String(indicator)); // askchipbug
pr("5 second delay");
delay(5000);//5 second delay
//loop to prevent another 5 second delay
while(true){
if (indicator == 0){ //you had this set as indicator = 0 - askchipbug
pr("indicator: " + String(indicator)); // askchipbug
for(int x = 0; x < random(200); x++){
Forward();
EdgeDec();
delay(10);
}
}
else if ( indicator = 1){
pr("indicator: " + String(indicator)); //askchipbug
for(int x = 0; x < random(200); x++){
TurnLeft();
EdgeDec();
delay(10);
}
}
else if ( indicator = 2){
pr("indicator: " + String(indicator));// askchipbug
for(int x = 0; x < random(200); x++){
TurnRight();
EdgeDec();
delay(10);
}
}
}

}
void Forward(){
//right motor
pr("forward"); //askchipbug
digitalWrite(motor_forward,1);//terminal d1 will be high
digitalWrite(motor_reverse,0);//terminal d2 will be low

//left motor
digitalWrite(motor2_forward,1);//terminal d1 will be high
digitalWrite(motor2_reverse,0);//terminal d2 will be low
}
//going in reverse
void Reverse(){
pr("reverse"); //askchipbug
//right motor
digitalWrite(motor_forward,0);//terminal d1 will be low
digitalWrite(motor_reverse,1);//terminal d2 will be high

//left motor
digitalWrite(motor2_forward,0);//terminal d1 will be low
digitalWrite(motor2_reverse,1);//terminal d2 will be high
}
//rotating left
void TurnLeft(){
pr("turn left"); //askchipbug
//right motor
digitalWrite(motor_forward,0);//terminal d1 will be high
digitalWrite(motor_reverse,1);//terminal d2 will be low

//left motor
digitalWrite(motor2_forward,1);//terminal d1 will be high
digitalWrite(motor2_reverse,0);//terminal d2 will be low
}
void TurnRight(){
pr("turn right"); //askchipbug
//right motor
digitalWrite(motor_forward,1);//terminal d1 will be high
digitalWrite(motor_reverse,0);//terminal d2 will be low

//left motor
digitalWrite(motor2_forward,0);//terminal d1 will be high
digitalWrite(motor2_reverse,1);//terminal d2 will be low
}
void EdgeDec(){
pr("edge detector: " + String(digitalRead(edgeDec1))); // read pin 7 - askchipbug
if(digitalRead(edgeDec1) == LOW){ // remember we're using the internal pullups so LOW = on - askchipbug
pr("edge detected!"); // askchipbug
Reverse();
delay(700);
TurnLeft();
delay(1000);
Forward();
}
}

//simple debug technique - use pr("something"); in your code - askchipbug
void pr(String txt){
if(repeatstring != txt){
//if the debug text is different, print it
Serial.println(txt); //prints the text and adds a newline
Serial.flush(); //waits for all the data to be printed
delay(1000); //just pauses the scrolling text for 1 second, make bigger if you want a longer pause
repeatstring = txt;
}
}
0

Другие решения

delay Метод в Arduino, вообще говоря, реализуется как просто выполнение ряда nopНа процессоре достаточно циклов, чтобы составить требуемое время задержки. По сути, это блокирующий вызов, поскольку он просто полностью использует процессор в течение достаточного времени, как указано в аргументе, передаваемом delay,

Например, допустим, что ваш процессор работает на частоте 100 Гц, тогда, по сути, для задержки на 1 секунду потребуется 100 nop инструкции, которые процессор будет выполнять. Конечно, предполагается, что такая инструкция занимает ровно 1 такт. Учитывая, что Arduino Uno работает на микропроцессоре ATMEGA328p, вам нужно посмотреть эту таблицу, чтобы узнать больше.

0

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector