помогите с программой

shakhatov
Offline
Зарегистрирован: 24.12.2014
#include <IRremote.h>
#include <AFMotor.h> // Подключаем библиотеку для управления двигателями 
#include <Servo.h>   // Подключаем библиотеку для сервоприводов  
#include <SoftwareSerial.h> // Подключаем библиотеку для работы с Serial через дискретные порты
int RECV_PIN = 51; //вход ИК приемника
IRrecv irrecv(RECV_PIN);
decode_results results;
int a=0; // переменная переключения режима, при нажатии кнопки она принимает значение +1
int b=0;//
int d=0;
byte aa = 0;
byte bb = 0;
byte dd = 0;
//Создаем объекты для двигателей 
AF_DCMotor motor1(1); //канал М1 на Motor Shield — задний левый 
AF_DCMotor motor2(2); //канал М2 на Motor Shield — задний правый 
AF_DCMotor motor3(3); //канал М3 на Motor Shield — передний левый 
AF_DCMotor motor4(4); //канал М4 на Motor Shield — передний правый 
// Создаем объект для сервопривода 
Servo vservo; 
// Прописываем пины используемые модулем Bluetooth 
SoftwareSerial BTSerial(52, 53); // RX, TX 
// Создаем переменную для команд Bluetooth 
char vcmd;
const int light[2]={
  32,33};
const int turn_led[2]={
  34,35};
// Создаем переменные для запоминания скорости левых и правых двигателей 
int vspdL, vspdR; 
/* Создаем переменную, на значение которой будет уменьшаться скорость при плавных поворотах. 
Текущая скорость должна быть больше этого значения.  В противном случае двигатели со стороны направления поворота просто не будут вращаться */ 
const int vspd = 200; 
// Заносим в массив пины, к которым подключены светодиоды 
const int vledpins[3]={ 
  22,23,24}; 
// Создаем переменную для сохранения режима работы 
int vmode; 
// Создаем переменную для сохранения предыдущего режима работы 
int vmodeprev = -1; 
// Заносим в массив пины, к которым подключены кнопки 
const int vbtn[2]={ 
  28,29};
const int reset[1]={
  50};
// Массив для хранения углов поворота сервопривода (шаг 15 градусов) 
const int vservo_array[13]={ 
  0,15,30,45,60,75,90,105,120,135,150,165,180}; 
// Массив для хранения данных о расстоянии под различными углами поворота сервопривода 
int vHC_SR04_array[13]; 
// Пины, используемые ультразвуковым дальномером 
const int vTrig = 31; 
const int vEcho = 30; 
// Переменные, для хранения данных с дальномера 
unsigned int vtime_us=0; 
unsigned int vdistance_sm=0; 
// Минимальное расстояние в сантиметрах, при котором нужно искать новый маршрут движения 
const int vmindistance = 30; 
// Переменная для циклов перебора значения массивов vservo_array и vHC_SR04_array 
int vservo_int; 
// Переменные для цикла поиска максимального значения в массивах 
int vmaxarrayindex_int; 
int vmaxarrayvalue_int;

void setup() { 
  irrecv.enableIRIn(); // включить приемник
pinMode(reset[0], OUTPUT);
pinMode(28, OUTPUT);
pinMode(29, OUTPUT);
pinMode(light[0], OUTPUT);
pinMode(light[1], OUTPUT);
pinMode(turn_led[0], OUTPUT);
pinMode(turn_led[1], OUTPUT);
  // Устанавливаем скорость передачи данных по Bluetooth 
  BTSerial.begin(9600); 
  // Устанавливаем скорость передачи данных по кабелю 
  Serial.begin(9600); 
  // Выбираем пин к которому подключен сервопривод 
  vservo.attach(9); // или 10, если воткнули в крайний разъём 
  // Поворачиваем сервопривод в положение 90 градусов при каждом включении 
  vservo.write(90);  
  // Устанавливаем максимальную скорость вращения двигателей 
  vspeed(255,255); 
  /* Устанавливаем все выводы, к которым подключены светодиоды, 
   в OUTPUT. Зажигаем и гасим светодиоды с интервалом в 0.5 сек 
   для проверки */ 
  for (vmode = 0; vmode < 3; vmode = vmode + 1) { 
    pinMode(vledpins[vmode], OUTPUT);  
    digitalWrite(vledpins[vmode], HIGH); 
    delay (500); 
    digitalWrite(vledpins[vmode], LOW); 
  } 
  /* Устанавливаем выводы, к которым подключены кнопки, в INPUT. */ 
  pinMode(vbtn[0], INPUT);  
  pinMode(vbtn[1], INPUT); 
  // Устанавливаем значение первого режима работы робота 
  vmode = 0; 
  // Устанавливаем значение для пинов, к которым подключен ультразвуковой дальномер 
  pinMode(vTrig, OUTPUT); 
  pinMode(vEcho, INPUT); 
}

void loop() {
 if (irrecv.decode(&results)) {
delay(300); // задержка перед выполнением определения кнопок, чтобы избежать быстрое двойное нажатие

if (results.value == 0xAF5F20D) {a=a+1; aa = 0;} else {aa++;}
if (results.value == 0xAF550AF) {b=b+1; bb = 0;} else {bb++;}
if (results.value == 0xAF56897) {d=d+1; dd = 0;} else {dd++;}
if (a==1){digitalWrite(28, HIGH);} 
if (aa == 3){digitalWrite(28, LOW); a = 0;}
if (b==1){digitalWrite(29, HIGH);}
if (bb == 3){digitalWrite(29, LOW); b = 0;}
if (d==1){digitalWrite(reset[0], HIGH);} 
if (dd == 3){digitalWrite(reset[0], LOW); d = 0;}
{ //
delay(10); //пауза между повторами //
} //
irrecv.resume(); // 

}

  /* Переключение режимов работы робота */ 
  // Кнопка переключения на следующий режим - BTN1 
  if (digitalRead(vbtn[0]) == HIGH){   
    vmode = 1;    
    delay (500); 
  }
  
  // Кнопка переключения на предыдущий режим - BTN2 
  if (digitalRead(vbtn[1]) == HIGH){   
    vmode = 2;    
    delay (500); 
  }
  // Засвечиваем светодиод текущего режима работы 
  digitalWrite(vledpins[vmode], HIGH);  
  /* Выбор режима работы */ 
  switch (vmode) { 
  case 1: 
    // Режим работы с использованием ультразвукового дальномера 
    vultrasoundmode(); 
    break; 
  case 2: 
      // Режим управления через Bluetooth 
    vbluetoothmode(); 
    break; 
  } 
} 
/* Режим работы с использованием ультразвукового дальномера */ 
void vultrasoundmode(){ 
  vservo.write(90);                  
  delay(200); 
  Serial.print("Now "); 
  Serial.println(vHC_SR04()); 
  // Если расстояние меньше наименьшего, то 
  if (vHC_SR04() < vmindistance) { 
    // Останавливаем двигатели 
    vrelease(); 
    // Крутим серву измеряя расстояния и занося данные в массив 
    for (vservo_int = 0; vservo_int < 13; vservo_int = vservo_int + 1) { 
      vservo.write(vservo_array[vservo_int]); 
      delay(200); 
      vHC_SR04_array[vservo_int] = vHC_SR04(); 
      // Выводим данные для отладки 
      Serial.print(vservo_int); 
      Serial.print(" "); 
      Serial.println(vHC_SR04_array[vservo_int]); 
    } 
    vservo.write(90); 
    delay(500); 
    // Поиск в массиве позиции с максимальным значением 
    vmaxarrayindex_int = 0; 
    vmaxarrayvalue_int = 0;    
    for (vservo_int = 0; vservo_int < 13; vservo_int = vservo_int + 1) {     
      if (vHC_SR04_array[vservo_int] > vmaxarrayvalue_int) { 
        vmaxarrayindex_int = vservo_int; 
        vmaxarrayvalue_int = vHC_SR04_array[vservo_int]; 
      } 
    } 
    Serial.print("Max index "); 
    Serial.println(vmaxarrayindex_int); 
    // Проверка - если максимальное значение массива меньше минимального расстояния, то едем назад 
    if (vHC_SR04_array[vmaxarrayindex_int] < vmindistance) { 
      vbackward(); 
      delay(500); 
    } 
    /* Проверка - если индекс максимального значения массива меньше 6 то поворачиваем вправо, 
    иначе влево */ 
    if (vmaxarrayindex_int < 6) { 
      vright(); 
      delay(500); 
    } 
    else 
    { 
      vleft(); 
      delay(500); 
    } 
  } 
  else 
  { 
    // Едем прямо 
    vforward(); 
  } 
}

/* Режим управления через Bluetooth */ 
void vbluetoothmode() { 
  // Если есть данные с Bluetooth 
  if (BTSerial.available()) 
  { 
    /* Читаем команды и заносим их в переменную. 
     (char) преобразует код символа команды в символ */ 
    vcmd = (char)BTSerial.read(); 
    // Отправляем команду в порт, чтобы можно было их проверить в "Мониторе порта" 
    Serial.println(vcmd);

    // Вперед 
    if (vcmd == 'F') { 
      vforward(); 
    } 
    // Назад 
    if (vcmd == 'B') 
    { 
      vbackward(); 
    } 
    // Влево 
    if (vcmd == 'L') 
    { 
      vleft(); 
    }     
    // Вправо 
    if (vcmd == 'R') 
    { 
      vright(); 
    }  
    // Прямо и влево 
    if (vcmd == 'G') 
    { 
      vforwardleft(); 
    }  
    // Прямо и вправо 
    if (vcmd == 'I') 
    { 
      vforwardright(); 
    }  
    // Назад и влево 
    if (vcmd == 'H') 
    { 
      vbackwardleft(); 
    }  
    // Назад и вправо 
    if (vcmd == 'J') 
    { 
      vbackwardright(); 
    }  
    // Стоп 
    if (vcmd == 'S') 
    { 
      vrelease(); 
    }
   if (vcmd == 'W') 
    {
     vlighton();
    } 
   if (vcmd == 'w') 
    {
     vlightoff();
    }
   if (vcmd == 'U') 
    {
     v2lighton();
    } 
   if (vcmd == 'u') 
    {
     v2lightoff();
    } 
   if (vcmd == 'V') 
    {
     vturnlefton();
    }
   if (vcmd == 'v') 
    {
     vturnleftoff();
    }
   if (vcmd == 'X') 
    {
     vturnrighton();
    }
   if (vcmd == 'x') 
    {
     vturnrightoff();
    }    
    // Скорость 0% 
    if (vcmd == '0') 
    { 
      vspeed(0,0); 
    } 
    // Скорость 10% 
    if (vcmd == '1') 
    { 
      vspeed(25,25); 
    } 
    // Скорость 20% 
    if (vcmd == '2') 
    { 
      vspeed(50,50); 
    } 
    // Скорость 30% 
    if (vcmd == '3') 
    { 
      vspeed(75,75); 
    } 
    // Скорость 40% 
    if (vcmd == '4') 
    { 
      vspeed(100,100); 
    } 
    // Скорость 50% 
    if (vcmd == '5') 
    { 
      vspeed(125,125); 
    } 
    // Скорость 60% 
    if (vcmd == '6') 
    { 
      vspeed(150,150); 
    } 
    // Скорость 70% 
    if (vcmd == '7') 
    { 
      vspeed(175,175); 
    } 
    // Скорость 80% 
    if (vcmd == '8') 
    { 
      vspeed(200,200); 
    } 
    // Скорость 90% 
    if (vcmd == '9') 
    { 
      vspeed(225,225); 
    } 
    // Скорость 100% 
    if (vcmd == 'q') 
    { 
      vspeed(255,255);
    }
    
  } 
}

/* Функция определения расстояния с дальномера */ 
int vHC_SR04() { 
  digitalWrite(vTrig, HIGH); // Подаем сигнал на выход микроконтроллера 
  delayMicroseconds(10); // Удерживаем 10 микросекунд 
  digitalWrite(vTrig, LOW); // Затем убираем 
  vtime_us=pulseIn(vEcho, HIGH); // Замеряем длину импульса 
  vdistance_sm=vtime_us/58; // Пересчитываем в сантиметры 
  return vdistance_sm; // Возвращаем значение 
}

/* Функции управления двигателями */

// Вперед 
void vforward() { 
  vspeed(vspdL,vspdR); 
  vforwardRL(); 
}

// Вперед для RL 
void vforwardRL() { 
  motor1.run(FORWARD); 
  motor2.run(FORWARD); 
  motor3.run(FORWARD); 
  motor4.run(FORWARD); 
}

// Назад 
void vbackward() { 
  vspeed(vspdL,vspdR); 
  vbackwardRL(); 
}

// Назад для RL 
void vbackwardRL() { 
  motor1.run(BACKWARD); 
  motor2.run(BACKWARD); 
  motor3.run(BACKWARD); 
  motor4.run(BACKWARD); 
}

// Влево 
void vleft() { 
  vspeed(vspdL,vspdR); 
  motor1.run(BACKWARD); 
  motor2.run(FORWARD); 
  motor3.run(BACKWARD); 
  motor4.run(FORWARD); 
}

// Вправо 
void vright() { 
  vspeed(vspdL,vspdR); 
  motor1.run(FORWARD); 
  motor2.run(BACKWARD); 
  motor3.run(FORWARD); 
  motor4.run(BACKWARD); 
}

// Вперед и влево 
void vforwardleft() { 
  if (vspdL > vspd) { 
    vspeed(vspdL-vspd,vspdR); 
  } 
  else 
  { 
    vspeed(0,vspdR); 
  } 
  vforwardRL(); 
}

// Вперед и вправо 
void vforwardright() { 
  if (vspdR > vspd) { 
    vspeed(vspdL,vspdR-vspd); 
  } 
  else 
  { 
    vspeed(vspdL,0); 
  } 
  vforwardRL(); 
}

// Назад и влево 
void vbackwardleft() { 
  if (vspdL > vspd) { 
    vspeed(vspdL-vspd,vspdR); 
  } 
  else 
  { 
    vspeed(0,vspdR); 
  } 
  vbackwardRL(); 
}

// Назад и вправо 
void vbackwardright() { 
  if (vspdR > vspd) { 
    vspeed(vspdL,vspdR-vspd); 
  } 
  else 
  { 
    vspeed(vspdL,0); 
  } 
  vbackwardRL(); 
}

// Стоп 
void vrelease(){ 
  motor1.run(RELEASE); 
  motor2.run(RELEASE); 
  motor3.run(RELEASE); 
  motor4.run(RELEASE); 
}
void vlighton(){
  digitalWrite(light[0], HIGH);
}
void vlightoff(){
  digitalWrite(light[0], LOW);
}
void v2lighton(){
  digitalWrite(light[1], HIGH);
}
void v2lightoff(){
  digitalWrite(light[1], LOW);
}
void vturnlefton(){
  digitalWrite(turn_led[0], HIGH);   
  delay(1000);              
  digitalWrite(turn_led[0], LOW);    
  delay(1000);
}  
void vturnleftoff(){
  digitalWrite(turn_led[0], LOW);   
  delay(1000);              
  digitalWrite(turn_led[0], LOW);    
  delay(1000);
}
void vturnrighton(){
  digitalWrite(turn_led[1], HIGH);   
  delay(1000);              
  digitalWrite(turn_led[1], LOW);    
  delay(1000);
}  
void vturnrightoff(){
  digitalWrite(turn_led[1], LOW);   
  delay(1000);              
  digitalWrite(turn_led[1], LOW);    
  delay(1000);
}  

// Изменение скорости 
void vspeed(int spdL,int spdR){ 
  if (spdL == spdR) { 
    vspdL=spdL; 
    vspdR=spdR; 
  } 
  motor1.setSpeed(spdL); 
  motor2.setSpeed(spdR); 
  motor3.setSpeed(spdL); 
  motor4.setSpeed(spdR); 
}

 

shakhatov
Offline
Зарегистрирован: 24.12.2014

как сделать чтобы режим работы робота переключался с пульта ду без и спользования 28 и 29 пина 

GothThug
GothThug аватар
Offline
Зарегистрирован: 07.09.2014

Удоли

068 pinMode(28, OUTPUT);
069 pinMode(29, OUTPUT);

Перепиши

110 if (a==1){digitalWrite(28, HIGH);}
111 if (aa == 3){digitalWrite(28, LOW); a = 0;}
112 if (b==1){digitalWrite(29, HIGH);}
113 if (bb == 3){digitalWrite(29, LOW); b = 0;}
 

На

110  
111 if (aa == 3){ a = 0;}
112  
113 if (bb == 3){b = 0;}
 

и тд. и тп...

GothThug
GothThug аватар
Offline
Зарегистрирован: 07.09.2014

Это для начала, а дальше нужно разбираться...