Привет, дорогие подписчики, прошу прощения за столь длинное отсутствие постов по электронике. У меня сейчас много работы + занят созданием общественной организации по электронике и робототехнике, ищу инвесторов и спонсоров. поэтому времени пилить годные посты нету.
А теперь к делу.
Предлагаю вам собрать простейший металоискатель на базе ардуины (или мк АтМега8, АтМега328(Р) )
Вот вид моего пробного устройства. Корпус купил на рынке, трубу тоже (обычная для воды без алюминиевой фольги в середине), катушку мотали давно, потому не помню сколько витков и какой провод(
Вид корпуса устройства сверху:
Светодиод - мигает в такт колебаниям контура катушки
Дырка посередине с кнопкой - ресет ардуины
Дырка справа - пьезопищалка
Кнопка сбоку - при нажатии подает сигнал NULL SW который обнуляет колебания контура с осциллятором и "записывает" эталон. Нажимать нужно максимально далеко от метала.
С другой стороны я вывел гнездо для RXD и TXD ардуины, сделано для того чтобы менять прошивку металоискателя не разбирая корпус.
Потроха устройства (выглядит пока не очень эстетично так как собиралось на скорую руку):
Сверху на фото - разьем RXD и TXD ардуины
Слева на фото - пьезо пищалка
Посередине на фото - Arduino Pro Mini 5v (AtMega 328P) 16mHz
Справа на фото светодиод
Плата осциллятора, я залил термоклеем (силикон) и да, я использовал КТ315, что оказалось не самым лучшим решением. Резисторы смдшные. Синие провода идут на катушку индуктивности
Для простоты замены осциллятора я использовал PLS и BLS
Схема осциллятора
Q1 - транзистор 2n2222 или аналог
5vcc - на плату ардуины 5v
pin5 - на 5 пин ардуины
GND - земля ардуины
Кнопка, Пьезо, светодиод у меня выведены отдельно, поэтому в схематику и плату я их не включал. А просто припаял проводами на плату Ардуины
Кнопка - GND и Pin12
Пьезо и светодиод - GND и Pin13
Разводка платы (Я использую программу DipTrace)
R1,R2,R3 - перемычки
Прошивка для ардуины:
// Подсоедините катушку металодетектора (20-200kHz) на pin 5
// Подсоедините пьезо динамик на pin 13 и GND
// Подсоедините кнопку сброса на pin 12 и GND
// ПОМНИТЕ НАЖИМАЙТЕ КНОПКУ СБРОСА ТОЛЬКО ПОСЛЕ ПОДАЧИ ПИТАНИЯ!!
#define SET(x,y) (x |=(1<<y)) //-Bit set/clear macros
#define CLR(x,y) (x &= (~(1<<y))) // |
#define CHK(x,y) (x & (1<<y)) // |
#define TOG(x,y) (x^=(1<<y)) //-+
unsigned long t0=0; //-Last time
int t=1; //-time between ints
unsigned char tflag=0; //-Measurement ready flag
float SENSITIVITY= 900; //-Guess what (МОЖНО МЕНЯТЬ ДО 1000)
//-Generate interrupt every 1000 oscillations of the search coil
SIGNAL(TIMER1_COMPA_vect)
{
OCR1A+=900; //МОЖНО МЕНЯТЬ ДО 1000
t=micros()-t0;
t0+=t;
tflag=1;
}
void setup()
{
pinMode(13,OUTPUT); //-piezo pin
digitalWrite(12,HIGH); //-NULL SW. pull up
//-Set up counter1 to count at pin 5
TCCR1A=0;
TCCR1B=0x07;
SET(TIMSK1,OCF1A);
}
//-Float ABS
float absf(float f)
{
if(f<0.0)
return -f;
else
return f;
}
int v0=0; //-NULL value
float f=0; //-Measurement value
unsigned int FTW=0; //-Click generator rate
unsigned int PCW=0; //-Click generator phase
unsigned long timer=0; //-Click timer
void loop()
{
if(tflag)
{
if(digitalRead(12)==LOW) //-Check NULL SW.
v0=t; //-Sample new null value
f=f*0.9+absf(t-v0)*0.1; //-Running average over 10 samples
tflag=0; //-Reset flag
float clf=f*SENSITIVITY; //-Convert measurement to click frequency
if(clf>10000)
clf=10000;
FTW=clf;
}
//-Click generator
if(millis()>timer)
{
timer+=10;
PCW+=FTW;
if(PCW&0x8000)
{
digitalWrite(13,HIGH);
PCW&=0x7fff;
}
else
digitalWrite(13,LOW);
}
}