Импульсный МД со статическим и динамическим режимами

intrtrade
Offline
Зарегистрирован: 15.12.2016
int biperS[5]{0,0,0,0,0};
int biperD[5]{0,0,0,0,0};
byte regim=0;
int tr2=-1;
float slow[5];
float fast[5];
 int dlina1=20; // изначально 20
 int dlina2=5;  // изначально 5
 int v1[5];
 int v2[5];
 int zazor=100;
 int zazorS=25;
 int ferum[5]{0,0,0,0,0};
  unsigned long stopTime=0;

int sensor[5];
int zemS[5];
 const int button1 = 10;
    const int button2 = 11;
    int buttonState1 = 0;
    int buttonState2 = 0;

int dinamo(){
  int t=micros()-stopTime;
  if (t<5000){delayMicroseconds(5000-t);} //общая пауза составляет 5000 микросекунд
stopTime=micros(); //засекли время
//digitalWrite(5,HIGH); //удалить, это сигнал для второй дуины, экспериментальный!!!!!!!!!!!!!!!!!!!!
digitalWrite(6, HIGH);
     delayMicroseconds(200);  
 //       digitalWrite(5,LOW); //удалить, это сигнал для второй дуины, экспериментальный!!!!!!!!!!!!!!!!!!!!
        digitalWrite(6, LOW);
       
 int i;for(i=0;i<5;i=i+1){sensor[i]=analogRead(A5);} //данные прочитали
for(i=0;i<5;i=i+1){
slow[i]=(slow[i]*(dlina1-1)+sensor[i])/dlina1;
fast[i]=(fast[i]*(dlina2-1)+sensor[i])/dlina2;
if (fast[i]>slow[i]){v1[i]=0;v2[i]=v2[i]+(fast[i]-slow[i]);}
if (slow[i]>fast[i]){v2[i]=0;v1[i]=v1[i]+(slow[i]-fast[i]);}
if (ferum[i]==0){if (v1[i]>zazor){ferum[i]=1;biperD[i]=10;}} // тут число 10 это 10 циклов по 5 милисекунд,=50 милисекунд сигнал
if (v1[i]==0){ferum[i]=0;}}

// начало статического режима
for(i=0;i<5;i=i+1){if(sensor[i]<zemS[i]){biperS[i]=zemS[i]-sensor[i];}}

 
}


int zem(){ // баланс земли
 int i; for(i=0;i<5;i=i+1){zemS[i]=0;} // обнулили массив
  int n; for (n=0;n<40;n=n+1){ 
    delayMicroseconds(4500);
    digitalWrite(6, HIGH);
      delayMicroseconds(200);  
        digitalWrite(6, LOW);
       for(i=0;i<5;i=i+1){zemS[i]=zemS[i]+analogRead(A5);} //данные прочитали 
  }
  for(i=0;i<5;i=i+1){zemS[i]=zemS[i]/40;}  
}

int beepD(){ // сигнализация в динамическом режиме

if (biperD[0]>0){digitalWrite(8,HIGH);biperD[0]=biperD[0]-1;return 1;} 
if (biperD[1]>0){digitalWrite(8,HIGH);biperD[1]=biperD[1]-1;return 1;} 
if (biperD[2]>0){digitalWrite(8,HIGH);biperD[2]=biperD[2]-1;return 1;} 
if (biperD[3]>0){digitalWrite(8,HIGH);biperD[3]=biperD[3]-1;return 1;} 
if (biperD[4]>0){digitalWrite(8,HIGH);biperD[4]=biperD[4]-1;return 1;} 
digitalWrite(8,LOW);
return 0;

}

int beepS(){ // сигнализация в статическом режиме

if (sensor[0]<(zemS[0]-zazorS)){
digitalWrite(8,HIGH);
int timer=zemS[0]-sensor[0];
 timer=timer*5;
 delayMicroseconds(timer);
digitalWrite(8,LOW);  
}
}

int led(){
  if (regim==0){digitalWrite(2,HIGH);digitalWrite(3,LOW);}
  if (regim==64){digitalWrite(3,HIGH);digitalWrite(2,LOW);}
  if (regim==128){digitalWrite(2,HIGH);digitalWrite(3,HIGH);}
  if (regim==192){digitalWrite(2,LOW);digitalWrite(3,LOW);}
  
if ((zemS[4]-30)>sensor[4]){digitalWrite(4,HIGH);}else {digitalWrite(4,LOW);}
if ((zemS[3]-30)>sensor[3]){digitalWrite(7,HIGH);}else {digitalWrite(7,LOW);}
if ((zemS[2]-30)>sensor[2]){digitalWrite(9,HIGH);}else {digitalWrite(9,LOW);}
if ((zemS[1]-30)>sensor[1]){digitalWrite(12,HIGH);}else {digitalWrite(12,LOW);}
if ((zemS[0]-30)>sensor[0]){digitalWrite(13,HIGH);}else {digitalWrite(13,LOW);}
}


void setup() {
// Serial.begin(9600);

      pinMode(button1, INPUT);
      pinMode(button2,INPUT);
      pinMode(6, OUTPUT); //управляющий на силовой транзистор
      pinMode(8, OUTPUT); //бузер
 
// pinMode(5,OUTPUT);//удалить, это сигнал для второй дуины, экспериментальный!!!!!!!!!!!!!!!!!!!!
 //LED:
 pinMode(13, OUTPUT);
 pinMode(12, OUTPUT);
 pinMode(9, OUTPUT);
  pinMode(7, OUTPUT);
 pinMode(4, OUTPUT);
  pinMode(3, OUTPUT);
 pinMode(2, OUTPUT);
zem();
}

void loop() {
 buttonState1 = digitalRead(button1);
 buttonState2 = digitalRead(button2);
if (buttonState1==HIGH){digitalWrite(8,HIGH);delay(100);digitalWrite(8,LOW);delay(100); zem();}// балансируем землю
if (buttonState2==HIGH){digitalWrite(8,HIGH);delay(100);digitalWrite(8,LOW);delay(200);regim=regim+64;}// 4 режима работы
dinamo();
if (regim==0){beepD();}
if (regim==64){beepS();}
if (regim==128){tr2=beepD();if(tr2==0){beepS();}}
led();
}

 

intrtrade
Offline
Зарегистрирован: 15.12.2016

схема использована эта:
http://arduino.ru/forum/proekty/impulsnyi-metalloiskatel-na-arduino

только операционный усилитель заменил на К157УД2, что увеличило чувствительность примерно на 5см на монету.
Также добавил бузер и две кнопки. Входы и выходы могут тоже отличатся-смотри по программе.
Мд с самодельной катушкой диаметром 30 см чует монету 10 рублей с 20 см.
В динамическом режиме происходит автоматическая отстройка от грунта. В статическом отстройка нажатием кнопки.
Мое "ноу-хау"-одновременная работа обоих режимов, что оказалось очень удобным на практике.
Светодиоды отображают размер/расстояние до объекта, а также в каком режиме МД работает.
Пробовал добиться какой-нибудь дискриминации по металлам-не вышло. Если вопросы есть- intrtrade@gmail.com
Тут практически не бываю.