Industriële fabricage
Industrieel internet der dingen | Industriële materialen | Onderhoud en reparatie van apparatuur | Industriële programmering |
home  MfgRobots >> Industriële fabricage >  >> Manufacturing Technology >> Productieproces

DIY 3-As CNC VMC: Bouw een Precisie Freesmachine

Onderdelen en Benodigdheden

OnderdeelAantal
Arduino Nano R31
Raspberry Pi 3 Model B1
SparkFun A4988 stuurmotor driver1
Adafruit Arduino Nano 4-stepper 1-DC RepRap shield1
OpenBuilds Aluminium Afstandsbusjes1 set
Voeding 12V/5A1
OpenBuilds L-Bracket1
OpenBuilds M5 T-moeren (10 stuks)1
OpenBuilds Laagprofiel Schroeven M5 (10 stuks)1
OpenBuilds M3 Cilinderkopschroeven1
OpenBuilds Zetschroef1
OpenBuilds Sleufring 15x5x2mm1
OpenBuilds Anti-backlash Moerblok voor 8mm Trapezoïdale Spindel2
OpenBuilds Draadstangplaat NEMA 171
OpenBuilds 8mm Metrische Trapezoïdale Spindel1
OpenBuilds Kogellager 625 2RS 5x16x51
Gladde staf1
BLDC koelventilator1
DC motor (algemeen)1
Servo Tower Pro MG996R1
Texas Instruments L293D Dual H-brug driver1

Benodigde tools en machines

  • Schroevendraaiers
  • Boormachine
  • Dremel / draaiend snijgereedschap
  • Lijmpistool
  • Solderbout
  • Hoekschuifer

Apps en online diensten

  • Linux
  • ArtCAM
  • GRBL 0.9
  • Autodesk Fusion 360
  • Arduino IDE
  • Google Android Things
  • VNC

Over dit project

Onze prototype is IoT-gebaseerd, wat een schaalbare architectuur biedt voor bediening vanaf praktisch elke locatie met internetverbinding. Dit is een 350x350 mm CNC met een werkgebied van 250x240 mm, aangedreven door open-source bewegingsbesturing (GRBL). De hardware is grotendeels open source, wat de kosten aanzienlijk drukt. De machine is volledig gebouwd met lokaal aangeschafte materialen en kan hout, kunststoffen, hard rubber, hard hars, etc. bewerken. Het primaire doel is low-cost PCB-productie. Houtsnede is eveneens mogelijk.

We plannen laserbewerking toe te voegen als toekomstige uitbreiding. Omdat het systeem nu al via een lokaal draadloos netwerk te bedienen is, willen we het uitschalen naar een gedistribueerd webapplicatiemodel om een ecosysteem van meerdere dergelijke apparaten te creëren. De mogelijkheden zijn onbeperkt.

Constructie en specificaties

  • Basisframe: 2020 T-groef aluminiumprofielen met L-verbindingen
  • Spindel: 2000 rpm DC-gestuurd, ~80-85 Watt
  • Beweging: Spindels en draadstangen met gladde staven en radiale groove snap-fit kogellagers voor soepelheid op alle 3assen
  • Resolutie: Minimale spindlepas 0.8mm/omwenteling, 2000 stappen/omwenteling = 1600 stappen/mm op alle assen
  • Afmetingen: Machine ~430x430x330 mm, werkgebied ~270x170x65 mm
  • Positioneer nauwkeurigheid: 0.04 mm
  • Z-as portaal: 3D-geprint vanaf nul met dubbele geleidestaven, 4.8 cm reisf met gefreesde bit
  • Gereedschap: 45° V-bit voor PCB-gravure, ondersteunt 0.2-1.8 mm frezen
  • Motoren: NEMA 23 stappenmotoren, 3A max per as
  • Drivers: A4988 2.5A met 1/16 microstepping voor ultieme precisie

IoT-besturing (Industry 4.0)

De CNC-router is draadloos te bedienen vanaf een mobiel/tablet scherm (HMI) via een Raspberry Pi met webserver en router voor beveiliging. We plannen real-time inzichten in motorkoppel, stroomverbruik, trillingen, geluid etc. via een webplatform – de kern van Industrial IoT (Industrie 4.0).

Code

Voorbeeld G-code (VHDL)

Het volledige G-code bestand is te groot om hier weer te geven. Het bevat standaard GRBL commando's voor pen-up/pen-down (M300), wachttijden (G4), lineaire interpolatie (G1) en coördinaten. Download het volledige bestand voor details.

Stappenmotor Code (Arduino)

// AMIT
#include <Servo.h>
#include <AFMotor.h>

#define LINE_BUFFER_LENGTH 512
char STEP = MICROSTEP;
const int penZUp = 115;
const int penZDown = 83;
const int penServoPin = 10;
const int stepsPerRevolution = 48;

Servo penServo;
AF_Stepper myStepperY(stepsPerRevolution, 1);
AF_Stepper myStepperX(stepsPerRevolution, 2);

struct point { float x; float y; float z; };
struct point actuatorPos;

float StepInc = 1;
int StepDelay = 0, LineDelay = 0, penDelay = 50;
float StepsPerMillimeterX = 100.0;
float StepsPerMillimeterY = 100.0;
float Xmin = 0, Xmax = 40, Ymin = 0, Ymax = 40, Zmin = 0, Zmax = 1;
float Xpos = Xmin, Ypos = Ymin, Zpos = Zmax;
boolean verbose = false;

void setup() {
  Serial.begin(9600);
  penServo.attach(penServoPin);
  penServo.write(penZUp);
  delay(100);
  myStepperX.setSpeed(600);
  myStepperY.setSpeed(600);
  Serial.println("Mini CNC Plotter alive and kicking!");
  Serial.print("X range: "); Serial.print(Xmin); Serial.print(" to "); Serial.print(Xmax); Serial.println(" mm.");
  Serial.print("Y range: "); Serial.print(Ymin); Serial.print(" to "); Serial.print(Ymax); Serial.println(" mm.");
}

void loop() {
  delay(100);
  char line[LINE_BUFFER_LENGTH];
  char c;
  int lineIndex = 0;
  bool lineIsComment = false, lineSemiColon = false;
  
  while (1) {
    while (Serial.available() > 0) {
      c = Serial.read();
      if (c == '\n' || c == '\r') {
        if (lineIndex > 0) {
          line[lineIndex] = '\0';
          if (verbose) { Serial.print("Received: "); Serial.println(line); }
          processIncomingLine(line, lineIndex);
          lineIndex = 0;
        }
        lineIsComment = lineSemiColon = false;
        Serial.println("ok");
      } else {
        if (lineIsComment || lineSemiColon) {
          if (c == ')') lineIsComment = false;
        } else {
          if (c <= ' ') { /* witruimte */ }
          else if (c == '/') { /* block delete */ }
          else if (c == '(') { lineIsComment = true; }
          else if (c == ';') { lineSemiColon = true; }
          else if (lineIndex >= LINE_BUFFER_LENGTH-1) { Serial.println("ERROR - lineBuffer overflow"); lineIsComment = lineSemiColon = false; }
          else if (c >= 'a' && c <= 'z') { line[lineIndex++] = c - 'a' + 'A'; }
          else { line[lineIndex++] = c; }
        }
      }
    }
  }
}

void processIncomingLine(char* line, int charNB) {
  int currentIndex = 0;
  char buffer[64];
  struct point newPos = {0, 0, 0};
  
  while (currentIndex < charNB) {
    switch (line[currentIndex++]) {
      case 'U': penUp(); break;
      case 'D': penDown(); break;
      case 'G':
        buffer[0] = line[currentIndex++];
        buffer[1] = '\0';
        switch (atoi(buffer)) {
          case 0: case 1: // G0/G1
            char* indexX = strchr(line+currentIndex, 'X');
            char* indexY = strchr(line+currentIndex, 'Y');
            if (indexY <= 0) { newPos.x = atof(indexX+1); newPos.y = actuatorPos.y; }
            else if (indexX <= 0) { newPos.y = atof(indexY+1); newPos.x = actuatorPos.x; }
            else { newPos.y = atof(indexY+1); *indexY = '\0'; newPos.x = atof(indexX+1); }
            drawLine(newPos.x, newPos.y);
            actuatorPos.x = newPos.x; actuatorPos.y = newPos.y;
            break;
        }
        break;
      case 'M':
        buffer[0] = line[currentIndex++];
        buffer[1] = line[currentIndex++];
        buffer[2] = line[currentIndex++];
        buffer[3] = '\0';
        switch (atoi(buffer)) {
          case 300:
            char* indexS = strchr(line+currentIndex, 'S');
            float Spos = atof(indexS+1);
            if (Spos == 30) penDown();
            if (Spos == 50) penUp();
            break;
          case 114:
            Serial.print("Absolute position: X = "); Serial.print(actuatorPos.x);
            Serial.print(" - Y = "); Serial.println(actuatorPos.y);
            break;
          default:
            Serial.print("Command not recognized: M"); Serial.println(buffer);
        }
        break;
    }
  }
}

void drawLine(float x1, float y1) {
  if (x1 >= Xmax) x1 = Xmax;
  if (x1 <= Xmin) x1 = Xmin;
  if (y1 >= Ymax) y1 = Ymax;
  if (y1 <= Ymin) y1 = Ymin;
  
  x1 = (int)(x1 * StepsPerMillimeterX);
  y1 = (int)(y1 * StepsPerMillimeterY);
  float x0 = Xpos, y0 = Ypos;
  long dx = abs(x1-x0), dy = abs(y1-y0);
  int sx = x0 dy) {
    for (i=0; i= dx) { over -= dx; myStepperY.onestep(sy, STEP); }
      delay(StepDelay);
    }
  } else {
    for (i=0; i= dy) { over -= dy; myStepperX.onestep(sx, STEP); }
      delay(StepDelay);
    }
  }
  delay(LineDelay);
  Xpos = x1; Ypos = y1;
}

void penUp() {
  penServo.write(penZUp);
  delay(penDelay);
  Zpos = Zmax;
  digitalWrite(15, LOW); digitalWrite(16, HIGH);
  if (verbose) Serial.println("Pen up!");
}

void penDown() {
  penServo.write(penZDown);
  delay(penDelay);
  Zpos = Zmin;
  digitalWrite(15, HIGH); digitalWrite(16, LOW);
  if (verbose) Serial.println("Pen down.");
}

Adafruit Motor Shield Bibliotheek (Arduino)

De volledige AFMotor.h bibliotheekcode is te uitgebreid om hier weer te geven. Het bevat PWM-initialisatie voor timers, motorcontrole (DC en stappenmotoren), microstepping curves (8/16 stappen), en latch-registerbeheer voor de H-bruggen. Download de bibliotheek via de Arduino Library Manager of van de Adafruit GitHub repository.

Aangepaste onderdelen en behuizingen

  • cnc_contour_SNa09InGkY.gm1 (contour bestand)
  • cnc_coppertop_PIxEVyoMWI.gtl (koperlaag boven)

Schema's

DIY 3-As CNC VMC: Bouw een Precisie Freesmachine
Overzichtsschema
DIY 3-As CNC VMC: Bouw een Precisie Freesmachine
Detail schema
DIY 3-As CNC VMC: Bouw een Precisie Freesmachine
Aansluitschema motoren
DIY 3-As CNC VMC: Bouw een Precisie Freesmachine
Raspberry Pi verbindingen
DIY 3-As CNC VMC: Bouw een Precisie Freesmachine
Voedingsschema

Productieproces

  1. Bouw Je Eigen LUMAZOID: Een DIY Arduino Muziek Visualizer
  2. Een slimme voltmeter bouwen met Arduino en smartphone – Eenvoudig DIY-project
  3. Bouw een DIY VR-skateboard met Arduino, Google Cardboard en Bluetooth
  4. Triple CNC-machine – Premium upgrade build
  5. Zen-tuin CNC-eindtafel: Bouw je eigen slimme meubelstuk
  6. Bouw een DIY Arduino Radionica EMR Behandelapparaat
  7. Bouw een Volledig Functionele CNC-machine met Arduino Nano R3
  8. DIY 2D Motion Racing Simulator met Arduino Nano & SG90 Servo's
  9. Bouw Je Eigen Universele CNC Machine – Complete DIY Handleiding
  10. Verticaal Frezen & CNC VMC: Een Uitgebreide Inleiding
  11. Mini VMC Machine uitgelegd: Compact CNC-frezen voor kleinschalige projecten