pondělí 17. dubna 2017

Arduino, OpenSCAD a krokové motory

Měl jsem doma už dlouho hromádku krokových motorů odněkud ze šrotu, a když jsem teď měl chviličku volna a nápad na věc, kde by byl krokový motor nezbytný, pokusil jsem se je oživit. V následujícím videu vše ukazuju a vysvětluju:



S pomocí příkladů od knihovny Stepper, která je standardní součástní Arduino IDE, jsem napsal následující jednoduchý prográmek pro otočení krokového motoru o osminu otáčky (o 45 °) po stisknutí tlačítka připojeného na pin A0 a zem:

#include <stepper.h>

const int stepsPerRevolution = 50;
Stepper myStepper(stepsPerRevolution, 2, 3, 4, 5);

void setup()
{
    pinMode(A0, INPUT_PULLUP);
    myStepper.setSpeed(60);
}

void loop()
{
    static byte krok = 0;
    if (!digitalRead(A0)) {
        myStepper.step(6 + (((krok++ % 4) == 0) ? 1 : 0));
        delay(100);
    }
}


SCAD zdrojový kód pro unašeč CD, nasazený na hřídeli krokového motoru. Používá knihovnu Gears pro vytvoření ozubené díry. Vytištěno z PETG na i3 MK2 za 16 minut:

include <gears.scad>;
zuby_h = 7.4;
cd_d = 14.9;
cd_h = 1.2;
vyska = 8;
union() {
    difference() {
        cylinder(vyska, d1=18, d2=30);
        linear_extrude(height = zuby_h) gear(number_of_teeth=15, circular_pitch=100, clearance = 0);
    }
    translate([0, 0, vyska]) cylinder(cd_h, d1=cd_d, d2=cd_d);
}


SCAD zdrojový kód pro podstavec motoru, aby tento necestoval po stole. Vytištěný také z PETG, protože motor se zahřívá (i když stojí!), takže podstavec z PLA (ze kterého jinak tisknu vše) by se pod ním nejspíš roztekl:

prumer = 60;
vyska = 2.4;
dira_d = 12;
dira_h = 2.2;
roztec = 49.5;
sloup_d = 6;
sloup_h = 13.4;
sroub_d = 2.8;
sroub_h = 6;
union() {
    difference() {
        cylinder(vyska, d1=prumer, d2=prumer);
        translate([0, 0, vyska - dira_h]) cylinder(dira_h, d1=dira_d, d2=dira_d);
    }
    translate([roztec/2, 0, vyska]) sloupek();
    translate([-roztec/2, 0, vyska]) sloupek();
}

module sloupek() {
    difference() {
        cylinder(sloup_h, d1=sloup_d, d2=sloup_d);
        translate([0, 0, sloup_h-sroub_h]) cylinder(sroub_h, d1=sroub_d, d2=sroub_d);
    }
}

A to je vše :-)

3 komentáře: