Программирование RoboCar4WD
- Войдите на сайт для отправки комментариев
Вс, 27/12/2015 - 12:07
Добрый день всем. Подскажите пожалуйста что делаю не так. Заинтересовал один проект по Arduino, купил все необходимое, собрал, но когда дело дошло до программирования то получилась засада.
Вот код программы:
#include <KemaDrive.h>
#include <KemaUS.h>
#include <KemaState.h>
#include <VirtualWire.h> //pin 11
KemaDrive myDrive(2,3,4,5,6,7);
KemaState curState;
KemaState prevState;
KemaUS ultraSonic(22,23,24,25);
long prevTime = 0; //для алгоритма работы цикла loop() 10р/с
long deltaTime = 0; //для алгоритма работы цикла loop() 10р/с
int incomingByte = 0; //для тестирования через сериал-порт
boolean rfCtrl = true; // запрет/разрешение раидоуправления
char passRfCtrl[4] = {'*', '*', '*', '*'}; //кодовое слово для проверки приходящего сообщения
char act = '?'; //текущая команда
void setup()
{
Serial.begin(9600);
vw_set_ptt_inverted(true); // Required for DR3100
vw_setup(2000); // Bits per sec
vw_rx_start();
myDrive.turn(curState.turnAng());
}
void loop()
{
prevTime = millis();
uint8_t buf[VW_MAX_MESSAGE_LEN];
uint8_t buflen = VW_MAX_MESSAGE_LEN;
rfCtrl = true;
// ---------------------------------------------------- Sensor Section
curState.setEchoR(ultraSonic.pingR());
curState.setEchoL(ultraSonic.pingL());
//----------------------------------------------------- RF control
if (vw_get_message(buf, &buflen)) // Non-blocking
{
int i;
char letter;
rfCtrl = true;
for (i = 0; i < buflen-1; i++)
{
letter = buf[i];
if(letter != passRfCtrl[i])
{
rfCtrl = false;
break;
}
}
if(rfCtrl)
{
letter = buf[buflen-1];
Serial.println(letter);
switch (letter)
{
case 'S':
curState.setAct('S');
curState.setSpeed(0);
act = 'S';
break;
case 'B':
curState.setAct('B');
curState.setSpeed(curState.speed()-1);
act = 'B';
break;
case 'F':
curState.setAct('F');
curState.setSpeed(curState.speed()+1);
act = 'F';
break;
case 'R':
curState.setAct('R');
curState.setTurnAng(curState.turnAng() + 10);
act = 'R';
break;
case 'L':
curState.setAct('L');
curState.setTurnAng(curState.turnAng() - 10);
act = 'L';
break;
case 'W':
curState.setAct('W');
curState.setTurnAng(0);
act = 'W';
break;
}
}
}
// ---------------------------------------------------- Smart Section
if(!rfCtrl)
{
if((curState.echoR() < 300) && (curState.echoL() < 300)) //stop
{
curState.setAct('S');
curState.setSpeed(0);
act = 'S';
}
if((curState.echoR() < 150) && (curState.echoL() < 150)) //back
{
curState.setAct('B');
curState.setSpeed(curState.speed()-1);
act = 'B';
}
if((curState.echoR() == 0) && (curState.echoL() == 0)) //forward
{
curState.setAct('F');
curState.setSpeed(curState.speed()+1);
act = 'F';
}
}
if (Serial.available() > 0)
{
incomingByte = Serial.read();
Serial.println("command");
if (incomingByte == 52)
{
curState.setAct('L');
curState.setTurnAng(curState.turnAng() - 10);
act = 'L';
Serial.println("left");
}
if (incomingByte == 53)
{
curState.setAct('W');
curState.setTurnAng(0);
act = 'W';
Serial.println("stop");
}
if (incomingByte == 54)
{
curState.setAct('R');
curState.setTurnAng(curState.turnAng() + 10);
act = 'R';
Serial.println("right");
}
}
// ---------------------------------------------------- Drive Section
switch (act)
{
case 'S':
myDrive.move(curState.speed());
break;
case 'B':
myDrive.move(curState.speed());
break;
case 'F':
myDrive.move(curState.speed());
break;
case 'R':
myDrive.turn(curState.turnAng());
break;
case 'L':
myDrive.turn(curState.turnAng());
break;
case 'W':
myDrive.turn(curState.turnAng());
break;
}
// --------------------------------------------------- Final Section
act = '?';
prevState = curState;
deltaTime = millis() - prevTime;
if(deltaTime < 100)
delay(100 - deltaTime);
// Serial.println(curState.act());
}
После загрузки его, при подаче питания на Ардуино, сразу происходит центровка передних серводвигателей, но на этом все и кончается, немогу понять как заставить работать ультразвуковыедатчики и 4 мотора (подключенные через l298n парарельно по два). Я с Ардуино связываюсь впервые, подскажите где, что и как поменять или переподключить что бы всё заработало. Заранее очень благодарен за помощь.
Подскажите пожалуйста что делаю не так.
Для начала, не так Вы код вставляете в сообщение - http://arduino.ru/forum/obshchii/vstavka-programmnogo-koda-v-temukomment...
Ведь предлагал уже - всем при регистрации сделать обязательной к прочтению эту тему. Так тапками закидали.
#include <KemaDrive.h> #include <KemaUS.h> #include <KemaState.h> #include <VirtualWire.h> //pin 11 KemaDrive myDrive(2,3,4,5,6,7); KemaState curState; KemaState prevState; KemaUS ultraSonic(22,23,24,25); long prevTime = 0; //для алгоритма работы цикла loop() 10р/с long deltaTime = 0; //для алгоритма работы цикла loop() 10р/с int incomingByte = 0; //для тестирования через сериал-порт boolean rfCtrl = true; // запрет/разрешение раидоуправления char passRfCtrl[4] = {'*', '*', '*', '*'}; //кодовое слово для проверки приходящего сообщения char act = '?'; //текущая команда void setup() { Serial.begin(9600); vw_set_ptt_inverted(true); // Required for DR3100 vw_setup(2000); // Bits per sec vw_rx_start(); myDrive.turn(curState.turnAng()); } void loop() { prevTime = millis(); uint8_t buf[VW_MAX_MESSAGE_LEN]; uint8_t buflen = VW_MAX_MESSAGE_LEN; rfCtrl = true; // ---------------------------------------------------- Sensor Section curState.setEchoR(ultraSonic.pingR()); curState.setEchoL(ultraSonic.pingL()); //----------------------------------------------------- RF control if (vw_get_message(buf, &buflen)) // Non-blocking { int i; char letter; rfCtrl = true; for (i = 0; i < buflen-1; i++) { letter = buf[i]; if(letter != passRfCtrl[i]) { rfCtrl = false; break; } } if(rfCtrl) { letter = buf[buflen-1]; Serial.println(letter); switch (letter) { case 'S': curState.setAct('S'); curState.setSpeed(0); act = 'S'; break; case 'B': curState.setAct('B'); curState.setSpeed(curState.speed()-1); act = 'B'; break; case 'F': curState.setAct('F'); curState.setSpeed(curState.speed()+1); act = 'F'; break; case 'R': curState.setAct('R'); curState.setTurnAng(curState.turnAng() + 10); act = 'R'; break; case 'L': curState.setAct('L'); curState.setTurnAng(curState.turnAng() - 10); act = 'L'; break; case 'W': curState.setAct('W'); curState.setTurnAng(0); act = 'W'; break; } } } // ---------------------------------------------------- Smart Section if(!rfCtrl) { if((curState.echoR() < 300) && (curState.echoL() < 300)) //stop { curState.setAct('S'); curState.setSpeed(0); act = 'S'; } if((curState.echoR() < 150) && (curState.echoL() < 150)) //back { curState.setAct('B'); curState.setSpeed(curState.speed()-1); act = 'B'; } if((curState.echoR() == 0) && (curState.echoL() == 0)) //forward { curState.setAct('F'); curState.setSpeed(curState.speed()+1); act = 'F'; } } if (Serial.available() > 0) { incomingByte = Serial.read(); Serial.println("command"); if (incomingByte == 52) { curState.setAct('L'); curState.setTurnAng(curState.turnAng() - 10); act = 'L'; Serial.println("left"); } if (incomingByte == 53) { curState.setAct('W'); curState.setTurnAng(0); act = 'W'; Serial.println("stop"); } if (incomingByte == 54) { curState.setAct('R'); curState.setTurnAng(curState.turnAng() + 10); act = 'R'; Serial.println("right"); } } // ---------------------------------------------------- Drive Section switch (act) { case 'S': myDrive.move(curState.speed()); break; case 'B': myDrive.move(curState.speed()); break; case 'F': myDrive.move(curState.speed()); break; case 'R': myDrive.turn(curState.turnAng()); break; case 'L': myDrive.turn(curState.turnAng()); break; case 'W': myDrive.turn(curState.turnAng()); break; } // --------------------------------------------------- Final Section act = '?'; prevState = curState; deltaTime = millis() - prevTime; if(deltaTime < 100) delay(100 - deltaTime); // Serial.println(curState.act()); }oleg15618, в приведенном Вами коде подключается 3 нестандартные библиотеки. Ответить на вопрос "Что не так", не разбираясь в том, как работают эти библиотеки, невозможно.
Кроме того, Вы не написали, как появился приведенный Вами код, и почему Вы считаете, что он должен работать с конкретно Вашим роботом.