Программирование RoboCar4WD

oleg15618
Offline
Зарегистрирован: 27.12.2015

Добрый день всем. Подскажите пожалуйста что делаю не так. Заинтересовал один проект по 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 парарельно по два). Я с Ардуино связываюсь впервые, подскажите где, что и как поменять или переподключить что бы всё заработало. Заранее очень благодарен за помощь.
vk007
Offline
Зарегистрирован: 16.06.2015

oleg15618 пишет:

Подскажите пожалуйста что делаю не так.

Для начала, не так Вы код вставляете в сообщение - http://arduino.ru/forum/obshchii/vstavka-programmnogo-koda-v-temukomment...

Ведь предлагал уже - всем при регистрации сделать обязательной к прочтению эту тему. Так тапками закидали.

oleg15618
Offline
Зарегистрирован: 27.12.2015
#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());
  
}

 

andriano
andriano аватар
Offline
Зарегистрирован: 20.06.2015

oleg15618, в приведенном Вами коде подключается 3 нестандартные библиотеки. Ответить на вопрос "Что не так", не разбираясь в том, как работают эти библиотеки, невозможно.

Кроме того, Вы не написали, как появился приведенный Вами код, и почему Вы считаете, что он должен работать с конкретно Вашим роботом.