Массив считанных данных

Алексей_Far
Offline
Зарегистрирован: 30.01.2017

Двс, коллеги. Написал небольшой скетч для меги, залил, тупит. При отладке обычным сериалом понял что проблема с массивом - тупит. Обычное целочисленное вычитание дает неверный результат. Подскажите пжта. Хистори такой: скетч для машинки с колесиками и сонаром. На машинке стоит ардуина мега+сенсоршилд. К шилду цепаныл одну серву и сонар (УЗ). Сонар должен считать, поворачивая башкой (сервой) с шагом 10градусов, расстояния до всех объектов и записать в массив. Далее в массиве определяются углы возможных направлений движения. НО при обычном вычитании ардуина гонит. Подскажите пжта в чем трабл. Последний раз програмил на Паскале в школе, поэтому чз 20 лет пришлось вспоминать паскаль и С++ изучать. Вангую что беда с типом данных переменных, но лучше профессиональная оценка. Цикл из 69ой строчки гонит...

#include <EEPROM.h>
#include <Servo.h>
#include <Ultrasonic.h>
#include <LiquidCrystal_I2C.h>

LiquidCrystal_I2C Pad(0x27,16,2);
Servo servo;
Ultrasonic Sonar(48,49);

const byte Center = 90;
const byte Range = 50;
const byte Step=10;                    //Щаг перемещения головы
const int enA = 11;                   //скорость управления двигателями
const int in1 = 22;                  //Контакты ЛЕВОЙ стороны двигателей
const int in2 = 23;                  //Контакты ЛЕВОЙ стороны двигателей
const int enB = 10;                   //скорость управления двигателями
const int in3 = 24;                  //Контакты ПРАВОЙ стороны двигателей
const int in4 = 25;                  //Контакты ПРАВОЙ стороны двигателей
const int Predel=40;
int smotrim_priamo;
int Dist=0;
int KoordDist=0;

void setup()
{ servo.attach(9); // серву подключаем

  pinMode(enA, OUTPUT);
  pinMode(enB, OUTPUT);
  pinMode(in1, OUTPUT);
  pinMode(in2, OUTPUT);
  pinMode(in3, OUTPUT);
  pinMode(in4, OUTPUT);
  Serial.begin(9600);
  Pad.init();
  Pad.backlight();
}
  
void Motor_Speed(int Speed)
{analogWrite(enA, Speed);analogWrite(enB, Speed);}
void Motor_Stop(int Time)
{digitalWrite(in1, LOW);digitalWrite(in2, LOW);digitalWrite(in3, LOW);digitalWrite(in4, LOW);delay(Time);}
void Motor_Forward(int Time)
{digitalWrite(in1, LOW);digitalWrite(in2, HIGH);digitalWrite(in3, HIGH);digitalWrite(in4, LOW);Motor_Speed(130);delay(Time);}
void Motor_Backward(int Time)
{digitalWrite(in1, HIGH);digitalWrite(in2, LOW);digitalWrite(in3, LOW);digitalWrite(in4, HIGH);Motor_Speed(250);delay(Time);}
void Motor_Right(int Time)
{digitalWrite(in1, HIGH);digitalWrite(in2, LOW);digitalWrite(in3, HIGH);digitalWrite(in4, LOW);Motor_Speed(250);delay(Time);}
void Motor_Left(int Time)
{digitalWrite(in1, LOW);digitalWrite(in2, HIGH);digitalWrite(in3, LOW);digitalWrite(in4, HIGH);Motor_Speed(250);delay(Time);}


void Head_Look(int LongMas)
{ Label2:
  int MassDist[LongMas];
  servo.write(Center-Range);delay(300);
  for(int m=0;m<=LongMas;m++)
     {servo.write(Center-Range+m*Step);
     MassDist[m]=Distance(10);
     }
  for(int m=0;m<=LongMas;m++) {Serial.print("MassDist[");Serial.print(m);Serial.print("]= ");Serial.print(MassDist[m]);Serial.print("    koords = ");Serial.println(Center-Range+m*Step);}   
  Serial.println();

 // Dist - самое дальнее расстояние до препядствия; KoordDist - координата расстояния
  boolean Flag=false;
  int b[LongMas],koords[LongMas];                     //массив троек
  int j=0;
  for (int m=0;m<=LongMas;m++){b[m]=0;koords[m]=0;}     // обнуление временного массива

  for (int m=0;m<=LongMas-2;m++)
    {
      Serial.print("m = ");Serial.print(m);Serial.print("    frst = ");Serial.print(MassDist[m]-MassDist[m+1]);Serial.print("    scnd = ");Serial.print(MassDist[m]-MassDist[m+2]);Serial.print("    m = ");Serial.println(m);
      delay(500);
      if (abs(MassDist[m]-MassDist[m+1])<=5 && abs(MassDist[m]-MassDist[m+2])<=5){b[j]=MassDist[m+1];
                                        koords[j]=Center-Range+(m+1)*Step;
                                        Flag=true;
                                        j++;}
    }
  if (Flag=true){Dist=b[0];KoordDist=koords[0];
                 for (int m=0;m<=j;m++){if (Dist<b[m]){Dist=b[m];KoordDist=koords[m];}}} 
           else {Serial.println(" NO WAY TO RIDE !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!");
                 goto Label2;}
  if (abs(KoordDist)>200) {goto Label2;}
  //Serial.println();Serial.print("Dist = ");Serial.print(Dist);Serial.print("    KoordDist = ");Serial.println(KoordDist);
}

int Distance(int interval){ //interval - это количество замеров    //Выбор в массиве замеров самое наиболее часто встречающееся
  int L=1, K=0,Mass_d[interval]; //массив замеров расстояний
  delay(50);
  for (int i=0; i<=interval; i++){Mass_d[i]=Sonar.Ranging(CM);}
  byte a[interval];
  for (int i=0; i<interval; i++){a[i]=0;}
  for (int i=0; i<interval; i++){for (int j=0; j<interval; j++){if (Mass_d[i]==Mass_d[j]) {a[i]=a[i]+1;}}}
  for (int i=0; i<interval; i++){if (a[i]>L) {L=a[i];K=i;}}
  if (L==1){K=0;}
  return Mass_d[K]; 
}
void loop (){
smotrim_priamo=0;
KoordDist=0;
servo.write(Center);
//servo2.write(160);
smotrim_priamo=Distance(10);
Serial.print("smotrim_priamo = ");Serial.println(smotrim_priamo);
if (smotrim_priamo==1) {smotrim_priamo=300;}
if (smotrim_priamo<Predel)
 {Motor_Stop(500);
  Label1:
  Head_Look(Range*2/Step);
  servo.write(KoordDist);delay(500);
  if (KoordDist>Center){int T=(KoordDist-Center)/2;Serial.println("Turn Left");
                        for (int i=0; i<=KoordDist-Center; i++){servo.write(KoordDist-i);Motor_Left(T);}}
  if (KoordDist<Center){int T=(Center-KoordDist)/2;Serial.println("Turn Right");
                        for (int i=0; i<=Center-KoordDist; i++){servo.write(KoordDist+i);Motor_Right(T);}}
  if (KoordDist==Center){Motor_Backward(400);Motor_Stop(500);goto Label1;}
  Motor_Stop(500);
 }
Motor_Forward(1);
}

 

Алексей_Far
Offline
Зарегистрирован: 30.01.2017

Прогоняем, на порте результат:

smotrim_priamo = 7
MassDist[0]= 6    koords = 40
MassDist[1]= 5    koords = 50
MassDist[2]= 5    koords = 60
MassDist[3]= 8    koords = 70
MassDist[4]= 7    koords = 80
MassDist[5]= 4    koords = 90
MassDist[6]= 5    koords = 100
MassDist[7]= 6    koords = 110
MassDist[8]= 5    koords = 120
MassDist[9]= 8    koords = 130
MassDist[10]= 8    koords = 140

m = 0    frst = 218    scnd = 218    m = 0
m = 1    frst = 0    scnd = -58    m = 1
m = 2    frst = -68    scnd = 2    m = 2
m = 3    frst = 80    scnd = 0    m = 3
m = 4    frst = -85    scnd = 0    m = 4
m = 5    frst = -80    scnd = -85    m = 5
m = 6    frst = -6    scnd = 0    m = 6
m = 7    frst = 0    scnd = 7    m = 7
m = 8    frst = 3    scnd = 1    m = 8
m = 9        frst = 218    scnd = 218    m = 9
 

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Ну, сразу бросается в глаза выходы за пределы массива.

В строках 73 и 71 используется "MassDist[m+2]" в цикле с условием "m<=LongMas-2".

Тоже самое в строке 58. Используется m, а условие при этом m<=LongMas

Та же хрень в строке 67.

В общем, проверяйте выходы за границы везде.

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

Алексей_Far
Offline
Зарегистрирован: 30.01.2017

Спасибо. Разобрался. Проблема была нюбской. Как всегда не учел, что размер массива задаю к примеру 10, значит он и должен включать 10 элементов но нумерация идет с 0 по 9ый.