Импульсный МД со статическим и динамическим режимами
- Войдите на сайт для отправки комментариев
Пнд, 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
Тут практически не бываю.