Импульсный МД со статическим и динамическим режимами
- Войдите на сайт для отправки комментариев
Пнд, 14/08/2017 - 02:42
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();
}
схема использована эта:
http://arduino.ru/forum/proekty/impulsnyi-metalloiskatel-na-arduino
только операционный усилитель заменил на К157УД2, что увеличило чувствительность примерно на 5см на монету.
Также добавил бузер и две кнопки. Входы и выходы могут тоже отличатся-смотри по программе.
Мд с самодельной катушкой диаметром 30 см чует монету 10 рублей с 20 см.
В динамическом режиме происходит автоматическая отстройка от грунта. В статическом отстройка нажатием кнопки.
Мое "ноу-хау"-одновременная работа обоих режимов, что оказалось очень удобным на практике.
Светодиоды отображают размер/расстояние до объекта, а также в каком режиме МД работает.
Пробовал добиться какой-нибудь дискриминации по металлам-не вышло. Если вопросы есть- intrtrade@gmail.com
Тут практически не бываю.