Program pro navíjení cívek

Jiří Hlavatý

Použitý materiál:

Popis:

Program umožňuje pomocí menu nastavit počet požadovaných otáček (závitů cívky).

Při běhu programu je zobrazován počet zbývajících otáček. Potenciometrem se řídí rychlost navíjení. V případě problému je možno otáčení zastavit a po odstranění problému dále pokračovat. Potenciometr může být zabudován např. do pedálu.

Celé zařízení bylo sestaveno z „šuplíkových zásob“ (motor a LCD panel). Nicméně jsou to díly, které jsou běžně ve vašem sortimentu.

Není to ucelený projekt, jen provizorní zapojení. Držák motoru a cívky jsou tištěné na 3D tiskárně, ale byly navrženy pro můj specifický případ.

Ale třeba by byl přiložený program pro někoho použitelný.

Zapojení:

Motor shieldI2C převodník tlačítkamotor potenciometr
M1, M2X
A4SDA
A5SCL
A0X
D0vlevo
D1vpravo
D2nahoru
D9/servo2dolu
D10/servo1enter
GNDGNDGNDGNDGND
+5V+5V+5V
+12V

/*** Program pro řízení krok. motoru pro navíjení cívek ***

    Arduino UNO + Motor Control Shield 2xL293D
    Zobrazení stavu na LCD1602 připojeném přes převodník I2C
    Ovládání menu pomocí pěti tlačítek VPRAVO, VLEVO, NAHORU, DOLU a ENTER 
    Řízení rychlosti motoru potenciometrem 25k (zapojení +5V, A0, GND)
*/
    #include <AFMotor.h>
    #include <Wire.h> 
    #include <LiquidCrystal_I2C.h>
 
    int MaxOt = 100; // default zadání počtu požadovaných závitů 
    int PolMen = 0;  // indikátor běhu programu 0=setup, 1=start
    int S = 11;     // 
    int D = 12;     //  pozice pro zobrazení na LCD Stovky, Desítky, Jednotky
    int J = 13;     //
    int PosCur;
    // Tlačítka připojená na digitální vstupy proti zemi
    const int Tleft = 0;
    const int Tright = 1;
    const int Tup = 2;
    const int Tdown = 9;
    const int Tenter = 10;
    int StavTl = 1;        // stav, kdy není stisknuté tlačítko
    int StavTr = 1;
    int StavTu = 1;
    int StavTd = 1;
    int StavTe = 1;
    int PGMrun = 0;       // během běhu navíjení nezobrazit MENU, 0 => MENU, 1 => RUN
    // Menu
    char Msetup[] = "=> SETUP start";
    char Mstart[] = "setup => START";
    
    const int stepsPerRevolution = 100;  // motor STH-39G102 
                                         // 3,6deg/step => 100step/rev; 12V
    const int partStep = 10;             // počet kroků provedených stejnou rychlostí
    const int MaxSpeed = 100;            // nastavení max. rychlosti otáčení motoru na 100 rpm:
    const int Smer = FORWARD;            // směr otáčení motoru FORWARD nebo BACKWARD
    LiquidCrystal_I2C lcd(0x27, 16, 2); 
    AF_Stepper myStepper(stepsPerRevolution, 1);  
      
void setup() {
    lcd.begin();
    // Turn on the backlight and print a message.
    lcd.backlight();
    lcd.home();
    lcd.print("Navijecka civek");
    lcd.setCursor(0, 1);
    lcd.print(Msetup);    //zobrazení menu setup nebo start 
    // nastavení portů pro tlačítka
    pinMode(Tleft,INPUT_PULLUP);
    pinMode(Tright,INPUT_PULLUP);
    pinMode(Tup,INPUT_PULLUP);
    pinMode(Tdown,INPUT_PULLUP);
    pinMode(Tenter,INPUT_PULLUP);
}

void loop() {
    if (PGMrun < 1){
      Menu();
      switch(PolMen){
        case 0:     //setup
          Nastav();
        break; 
        case 1:     //start
          while(StavTe > 0){            // čekání na stisk Enter (*)
          lcd.home();///////////
          lcd.print("Pocet z. = ");
          if (MaxOt < 100){lcd.print(" ");}
          if (MaxOt < 10){lcd.print(" ");}
          lcd.print(MaxOt);
          lcd.setCursor(0, 1);
          lcd.print("Stisk * => START"); 
          StavTe = digitalRead(Tenter); // test na stisk (*)
          }
          StavTe = 1;     // zrušit stisk *
          PGMrun = 1;     // povolení startu
        break;
      }      
    }
    else {
      lcd.setCursor(0, 1);///////
      lcd.print("Zbyva z. =      "); 
      Start(MaxOt); 
    }
}

void JednaOtacka(int Step){         // provedení jedné otáčky s možností zastavení
    int i=Step;                       // pro případ zasukování drátu, po odstranění  
    while(i>0){                       // problému lze pokračovat
        // nastavení rychlosti:
        int sensorReading = analogRead(A0);   // čtení hodnoty potenciometru
        // map it to a range from 0 to 100:
        int motorSpeed = map(sensorReading, 0, 1023, 1, MaxSpeed); //
        if (motorSpeed < 2){
          while (motorSpeed < 2){       // čekání na odstranění zasukování 
            sensorReading = analogRead(A0);
            // map it to a range from 0 to 100:
            motorSpeed = map(sensorReading, 0, 1023, 1, MaxSpeed);
          delay(1000);
          }
         }
    myStepper.setSpeed(motorSpeed);   // nastavení rychlosti motoru
    myStepper.step(partStep, Smer, DOUBLE);         //
    i=i-10;
    }
}

void Start(int Xotacek){            // spuštění motoru pro navinutí X otáček
    for (int y=0;y<Xotacek;y++){
      JednaOtacka(stepsPerRevolution);
      ZobrazCislo(Xotacek-y-1);       // zobrazení zbývajících otáček
      }
    PGMrun = 0;     //zobrazení menu
    lcd.home();
    lcd.print("Navinuto ");
    lcd.print(MaxOt);
    lcd.print(" z.  ");    
    lcd.setCursor(0, 1);
    lcd.print(Msetup);
    PolMen = 0;
    delay(500);
}

void ZobrazCislo(int Cislo){    // zobrazení čísla na požadovanou pozici
    int poz;
    if (Cislo>99)
       {
       poz = S;
       }
       else if (Cislo>9)
       {
        poz = D;
       }
       else
       {
        poz = J;
       }
    lcd.setCursor(poz-1, 1);
    lcd.print(" ");   
    lcd.setCursor(poz, 1);
    lcd.print(Cislo);
}

void Menu(){      //výběr položek menu
    while(StavTe > 0){            // čekání na stisk Enter (*)
    StavTr = digitalRead(Tright); // při stisku pravého tlačítka změň zobrazení na => START
    if (StavTr == 0){
      lcd.setCursor(0, 1);
      lcd.print(Mstart);
      PolMen = 1;                 // vybráno START
      }
    StavTl = digitalRead(Tleft);  // při stisku levého tlačítka změ%n na => SETUP
    if (StavTl == 0){
      lcd.setCursor(0, 1);
      lcd.print(Msetup);
      PolMen = 0;                 // vybráno SETUP
      }
    StavTe = digitalRead(Tenter); // test na stisk (*)
    }
    delay(500);
    StavTe = 1;
}
  
void Nastav(){      // nastavení počtu závitů v SETUPu
      if (MaxOt > 99){
      PosCur = S;
      }
      else if (MaxOt > 9){
      PosCur = D;
      }
      else{
      PosCur = J;
      }
      lcd.home();
      lcd.print("Pocet zavitu   ");    // zobrazit výchozí stav
      lcd.setCursor(0, 1);
      lcd.print("       x =    ");    // 
      lcd.setCursor(PosCur, 1);
      lcd.print(MaxOt);
      lcd.setCursor(PosCur, 1);
      lcd.cursor();         // zapnout kurzor a blikat?
//      lcd.blink();
      delay(1000);
      while(StavTe > 0){    // čekání na stisk Enter (*)
      StavTu = digitalRead(Tup);  // při stisku tl. nahoru zvětšit MaxOt dle pozice kurzoru
        if (StavTu == 0){
          switch (PosCur){
            case 11:
              if (MaxOt < 900){
                MaxOt = MaxOt + 100;
              }
              ZobrazCislo(MaxOt);
              lcd.setCursor(PosCur, 1);
              delay(500);
              break;
            case 12:
              if (MaxOt < 980){
                MaxOt = MaxOt + 10;
              }
              ZobrazCislo(MaxOt);
              lcd.setCursor(PosCur, 1);
              delay(500);
              break;
            case 13:
              if (MaxOt < 998){
                MaxOt = MaxOt + 1;
              }
              ZobrazCislo(MaxOt);
              lcd.setCursor(PosCur, 1);
              delay(500);
              break;
          }
          StavTu =1;
          }
      StavTd = digitalRead(Tdown);  // při stisku tl. dolu zmenšit MaxOt dle pozice kurzoru
        if (StavTd == 0){
          switch (PosCur){
            case 11:
              if (MaxOt >= 100){
                MaxOt = MaxOt - 100;
              }
              ZobrazCislo(MaxOt);
              lcd.setCursor(PosCur, 1);
              delay(500);
              break;
            case 12:
              if (MaxOt >= 20){
                MaxOt = MaxOt - 10;
              }
              ZobrazCislo(MaxOt);
              lcd.setCursor(PosCur, 1);
              delay(500);
              break;
            case 13:
              if (MaxOt >= 1){
                MaxOt = MaxOt - 1;
              }
              ZobrazCislo(MaxOt);
              lcd.setCursor(PosCur, 1);
              delay(500);
              break;
          }
          StavTd = 1;
          }
      StavTr = digitalRead(Tright);  // při stisku tl. doprava posunout pozici kurzoru
        if (StavTr == 0){
          if (PosCur < 13){
            PosCur++;
            lcd.setCursor(PosCur, 1);
            delay(500);
          }
          StavTr = 1;          
          }
      StavTl = digitalRead(Tleft);  // při stisku tl. doleva posunout pozici kurzoru
        if (StavTl == 0){
          if (PosCur > 11){
            PosCur--;
            lcd.setCursor(PosCur, 1);
            delay(500);
          }          
          StavTl = 1;
          }          
      StavTe = digitalRead(Tenter);  // test na stisk (*)
      //delay(500);
      }
      StavTe = 1;
      lcd.noCursor();   //vypnout kurzor
      lcd.setCursor(0, 1);
      lcd.print(Msetup);
      delay(500);
}

Sdílet článek

3 Responses

  1. Dobrý den, je možnost koupit automatické navíjení, nebo můžete poskytnout podrobnější návod?

  2. postavil bych si to, je to přesně to co potřebuji
    trochu podrobností by neškodilo ( podrobné fotky, schéma, zkušenosti )

    1. Omluva za pozdní reakci, server neposílá upozornění na vložený komentář.
      Schéma zapojení je popsáno v přiložené tabulce. Použité komponenty jsou v záhlaví kódu programu. Použitý motor (a nastavení počtu kroků) je popsán v kódu programu.

Napsat komentář

Vaše e-mailová adresa nebude zveřejněna. Vyžadované informace jsou označeny *

Mohlo by se také líbit

Nejčtenější články