• Witaj na Forum Arduino Polska! Zapraszamy do rejestracji!
  • Znajdziesz tutaj wiele informacji na temat hardware / software.
Witaj! Logowanie Rejestracja


Ocena wątku:
  • 0 głosów - średnia: 0
  • 1
  • 2
  • 3
  • 4
  • 5
Cewka wykrywacza metali - Arduino
#1
Wink 
Witam. Chce zrobić sobie wykrywacz metali z arduino. Ogólnie podczas budowy całego układu kieruję się schematem poniżej. I problem polega na tym że nie działa  Dodgy .Znaczy się, raz działa i ładnie wykrywa, zaraz w ogóle nie działa a zaraz wykrywa metal tam gdzie go nie ma. Pomyślałem sobie że może źle nawinąłem cewkę? Moje pytanie brzmi - czy ktoś wie ile zwojów drutu miedzianego 0,6 powinienem nawinąć na obudowę o średnicy 14cm? (obudowa wydrukowana na drukarce 3d). Albo jest mi w stanie wytłumaczyć jak to obliczyć? Z góry dzięki za odpowiedzi  Big Grin


Załączone pliki Miniatury
   
 
Odpowiedź
#2
Ostatnio miałem jakiś niemarkowy wykrywacz kabli itd. w ścianach, działał w cały świat. Markowy Bosch zazwyczaj działa OK, ale też czasami pokazuje dziwne rzeczy. Może masz za duże oczekiwania wobec zestawu pokazanego na schemacie i programu, którego nie pokazujesz.
To taka ogólna refleksja, nie robiłem nic w tych okolicach i ja nic tu nie doradzę.
Miło być decenianym https://buycoffee.to/kaczakat
 
Odpowiedź
#3
(24-12-2022, 00:25)kaczakat napisał(a): Ostatnio miałem jakiś niemarkowy wykrywacz kabli itd. w ścianach, działał w cały świat. Markowy Bosch zazwyczaj działa OK, ale też czasami pokazuje dziwne rzeczy. Może masz za duże oczekiwania wobec zestawu pokazanego na schemacie i programu, którego nie pokazujesz.
To taka ogólna refleksja, nie robiłem nic w tych okolicach i ja nic tu nie doradzę.
Nie no, nie spoedziwam się cudów  Wink , ale oglądając poradniki na youtube gdzie ludzię tworzą takie proste wykrywacze i działa im to w miarę okej zastanawiam się co poszło nie tak.  
Kod wygląda tak:

const byte npulse = 12; // number of pulses to charge the capacitor before each measurement

const byte pin_pulse = A0; // sends pulses to charge the capacitor (can be a digital pin)
const byte pin_cap  = A1; // measures the capacitor charge
const byte pin_LED = 12; // LED that turns on when metal is detected

void setup() {
  pinMode(pin_pulse, OUTPUT);
  digitalWrite(pin_pulse, LOW);
  pinMode(pin_cap, INPUT);
  pinMode(pin_LED, OUTPUT);
  digitalWrite(pin_LED, LOW);
}

const int nmeas = 256; //measurements to take
long int sumsum = 0; //running sum of 64 sums
long int skip = 0; //number of skipped sums
long int diff = 0;      //difference between sum and avgsum
long int flash_period = 0; //period (in ms)
long unsigned int prev_flash = 0; //time stamp of previous flash

void loop() {

  int minval = 2000;
  int maxval = 0;

  //perform measurement
  long unsigned int sum = 0;
  for (int imeas = 0; imeas < nmeas + 2; imeas++) {
    //reset the capacitor
    pinMode(pin_cap, OUTPUT);
    digitalWrite(pin_cap, LOW);
    delayMicroseconds(20);
    pinMode(pin_cap, INPUT);
    //apply pulses
    for (int ipulse = 0; ipulse < npulse; ipulse++) {
      digitalWrite(pin_pulse, HIGH); //takes 3.5 microseconds
      delayMicroseconds(3);
      digitalWrite(pin_pulse, LOW); //takes 3.5 microseconds
      delayMicroseconds(3);
    }
    //read the charge on the capacitor
    int val = analogRead(pin_cap); //takes 13x8=104 microseconds
    minval = min(val, minval);
    maxval = max(val, maxval);
    sum += val;

    //determine if LEDs should be on or off
    long unsigned int timestamp = millis();
    byte ledstat = 0;
    if (timestamp < prev_flash +12) {
      if (diff > 0)ledstat = 1;
      if (diff < 0)ledstat = 2;
    }
    if (timestamp > prev_flash + flash_period) {
      if (diff > 0)ledstat = 1;
      if (diff < 0)ledstat = 2;
      prev_flash = timestamp;
    }
    if (flash_period > 1000)ledstat = 0;

    //switch the LEDs to this setting
    if (ledstat == 0) {
      digitalWrite(pin_LED, LOW);
    }
    if (ledstat == 1) {
      digitalWrite(pin_LED, LOW);
    }
    if (ledstat == 2) {
      digitalWrite(pin_LED, HIGH);
    }

  }

  //subtract minimum and maximum value to remove spikes
  sum -= minval; sum -= maxval;

  //process
  if (sumsum == 0) sumsum = sum << 6; //set sumsum to expected value
  long int avgsum = (sumsum + 32) >> 6;
  diff = sum - avgsum;
  if (abs(diff)<avgsum >> 10) {  //adjust for small changes
    sumsum = sumsum + sum - avgsum;
    skip = 0;
  } else {
    skip++;
  }
  if (skip > 64) {  // break off in case of prolonged skipping
    sumsum = sum << 6;
    skip = 0;
  }

  // one permille change = 2 ticks/s
  if (diff == 0) flash_period = 1000000;
  else flash_period = avgsum / (2 * abs(diff));
}
 
Odpowiedź
  


Skocz do:


Przeglądający: 1 gości