Жизнеспособность этого блога полностью зависит от тебя, дорогой читатель. Комментируй, пиши замечания и предложения. Если блог будет дышать, я буду дополнять его интересными статьями.

понедельник, 22 апреля 2013 г.

Часть 5. СКЕТЧ 


Проект для arduino называетя СКЕТЧ. Ответы на все вопросы по созданию ПО для arduino можно найти тут arduino.ru
Текст самой программы находится ниже. В принципе это все, что необходимо для  прошивки платы arduino:

/*
 * Version 1.2 2013
 * http://tutrobot.blogspot.com/
 * Робот на базе Arduino
*
*/
#define MIN_speed     0

//Только выходы с PWM - 3,5,6,9,10,11
int PIN_ENB = 9;
int PIN_ENA = 6;

int PIN_IN4 = 2;
int PIN_IN3 = 4;
int PIN_IN2 = 5;
int PIN_IN1 = 7;

int LED_PIN = 13;
float vel,ks,m1,m2;
float spl, spr;
int quadr = 0;
int ver, hor;
unsigned char mode;
unsigned char oldmode;
unsigned char iSpeed;
unsigned char rx_buf[8];
unsigned char rxcnt;
boolean binv = 0; 
boolean rx_ok;

// Правый мотор
void RM_foward()
{
  digitalWrite(PIN_IN1, LOW);
  digitalWrite(PIN_IN2, HIGH);
}
void RM_back()
{
  digitalWrite(PIN_IN1, HIGH);
  digitalWrite(PIN_IN2, LOW);
}
// Левый мотор
void LM_foward()
{
  digitalWrite(PIN_IN4, LOW);
  digitalWrite(PIN_IN3, HIGH);
}
void LM_back()
{
  digitalWrite(PIN_IN4, HIGH);
  digitalWrite(PIN_IN3, LOW);
}
void setup()
{
  Serial.begin(9600);
  pinMode(PIN_ENB, OUTPUT);
  pinMode(PIN_IN4, OUTPUT);
  pinMode(PIN_IN3, OUTPUT);
  pinMode(PIN_IN2, OUTPUT);
  pinMode(PIN_IN1, OUTPUT);
  pinMode(PIN_ENA, OUTPUT);
  pinMode(LED_PIN, OUTPUT);

  digitalWrite(PIN_IN1, LOW);
  digitalWrite(PIN_IN2, LOW);
  digitalWrite(PIN_IN4, LOW);
  digitalWrite(PIN_IN3, LOW);

  digitalWrite(PIN_ENA, LOW);
  digitalWrite(PIN_ENB, LOW); 
}
//Процедура задания скорости
void setspeed()
{
  float sf1;
  //левый двигатель
  if (spl>0.0) LM_foward(); else LM_back(); 
  sf1=abs(spl);
  sf1=sf1*(255-MIN_speed)+MIN_speed;
  if (spl==0.0) sf1=0;
  iSpeed = int(sf1);
  analogWrite(PIN_ENA, iSpeed);
  //правый двигатель
  if (spr>0.0) RM_foward(); else RM_back(); 
  sf1=abs(spr);
  sf1=sf1*(255-MIN_speed)+MIN_speed;
  if (spr==0.0) sf1=0;
  iSpeed = int(sf1);
  analogWrite(PIN_ENB, iSpeed);
}

void loop()
{
  if (Serial.available() == 7)
  {
    rxcnt=0;
    digitalWrite(LED_PIN, binv);
    binv=!binv;
  
    while (Serial.available() > 0)
    {  
      rx_buf[rxcnt] = Serial.read();
      rxcnt++;
    }
    //Контроль целостности пакета
    rx_ok=true;
    if (rx_buf[4]!=4) rx_ok=false;
    //прочистка буфера
    if (!rx_ok)
    {
      int avi = Serial.available();
      Serial.print("err");
      while (Serial.available() > 0)
      {
        avi = Serial.read();
      }
    }
   
    if (rx_ok)
    {
        hor = rx_buf[1];
        ver = rx_buf[2];
        
        quadr = 0;
        //Вычисление рабочего квадранта
        float fhor=float(hor);
        float fver=float(ver);       
       
        if (fhor>128.0)
        {
          fhor=256.0-fhor;
          quadr = quadr+1;
        } 

        if (fver>128.0)
        {
          fver=256.0-fver;
          quadr = quadr+2;
        }
        //нормализация скоростей
        fhor=fhor/127.0;
        fver=fver/127.0;
       
        if (fver>fhor)
        {
          m1 = fver;
          m2 = (1.0-fhor)*fver;
          
        } else
        {
          m1 = fhor;
          m2 = (fver-1.0)*fhor;   
        }
        if ((fver<0.1)&&(fhor<0.1))
        {
          m1=0;
          m2=0;
        }
     
        //Приведение знаков скоростей по квадрантам
        if (quadr==0)
        {
          spl=-m1;
          spr=-m2;
        }

        if (quadr==1)
        {
          spr=-m1;
          spl=-m2;
        }       
        if (quadr==2)
        {
          spr=m1;
          spl=m2;
        }
        if (quadr==3)
        {
          spl=m1;
          spr=m2;
        }
       
        setspeed();           
    }   
 
  }
  if (Serial.available() > 7) 
  {
      int avi = Serial.available();
      Serial.print("e");
      while (Serial.available() > 0)
      {
        avi = Serial.read();
      }
  }

}


Комментариев нет:

Отправить комментарий