All Projects → Nikolay-Kha → Pycnc

Nikolay-Kha / Pycnc

Licence: mit
Python CNC machine controller for Raspberry Pi and other ARM Linux boards

Programming Languages

python
139335 projects - #7 most used programming language
gcode
15 projects

Projects that are alternatives of or similar to Pycnc

parrot 3d
Stronger frame, Light weight component and easier to maintenance
Stars: ✭ 26 (-93.33%)
Mutual labels:  3d-printing, 3d-printer
Nimbus Eth1
Nimbus: an Ethereum 1.0 and 2.0 Client for Resource-Restricted Devices
Stars: ✭ 386 (-1.03%)
Mutual labels:  raspberry-pi, raspberry-pi-3
octoscreen
A touchscreen client for Octoprint
Stars: ✭ 26 (-93.33%)
Mutual labels:  3d-printing, 3d-printer
tronxy-xy100
Working with an inexpensive 3D printer, Other names: STARTT (from imakr.com) or Anet A8
Stars: ✭ 22 (-94.36%)
Mutual labels:  3d-printing, 3d-printer
Awesome Raspberry Pi
curated list of projects with raspberry pi
Stars: ✭ 309 (-20.77%)
Mutual labels:  raspberry-pi, 3d-printing
PolyDraw
✳️ PTSource PolyDraw is a free 3D polygonal modeller for Windows x86 and x64, for creating or modifying 3D objects using a mesh of 3D points and parametric NURBS Curves .Exports and imports to over 40 formats including WebVR and 3D Printing.
Stars: ✭ 17 (-95.64%)
Mutual labels:  3d-printing, 3d-printer
K3D-VOSTOK
K3D VOSTOK 3D printer
Stars: ✭ 138 (-64.62%)
Mutual labels:  3d-printing, 3d-printer
adventures-in-motion-control
A realistic simulator for a 3D printer motion controller
Stars: ✭ 31 (-92.05%)
Mutual labels:  cnc, 3d-printing
Rpisurv
Raspberry Pi surveillance
Stars: ✭ 293 (-24.87%)
Mutual labels:  raspberry-pi, raspberry-pi-3
Pigeon
Pigeon is a simple 3D printed cloud home surveillance camera project that uses the new Raspberry Pi Zero W
Stars: ✭ 266 (-31.79%)
Mutual labels:  raspberry-pi, 3d-printing
OctoPrint-GitFiles
With this plugin, you can use a github/gitlab repository for keeping your OctoPrint Files collection up-to-date.
Stars: ✭ 28 (-92.82%)
Mutual labels:  3d-printing, 3d-printer
Rust Raspberrypi Os Tutorials
📚 Learn to write an embedded OS in Rust 🦀
Stars: ✭ 7,275 (+1765.38%)
Mutual labels:  raspberry-pi, raspberry-pi-3
pyr0piezo
An AVR/ARM based piezoelectric sensor for use in ultra-precise applications
Stars: ✭ 61 (-84.36%)
Mutual labels:  3d-printing, 3d-printer
Rak8s
Stand up a Raspberry Pi based Kubernetes cluster with Ansible
Stars: ✭ 354 (-9.23%)
Mutual labels:  raspberry-pi, raspberry-pi-3
step-daemon
stepd - External planner and stepper for 3d printing
Stars: ✭ 85 (-78.21%)
Mutual labels:  cnc, 3d-printing
rapcores
Robotic Application Processor
Stars: ✭ 14 (-96.41%)
Mutual labels:  cnc, 3d-printing
Ml Examples
Arm Machine Learning tutorials and examples
Stars: ✭ 207 (-46.92%)
Mutual labels:  raspberry-pi, raspberry-pi-3
Iotwifi
Raspberry Pi (arm) wifi configuration container. Configure and control wifi connectivity with a JSON based REST api.
Stars: ✭ 236 (-39.49%)
Mutual labels:  raspberry-pi, raspberry-pi-3
3D-Engine-OpenGL-4
3D Graphics Engine For Games | C++ OpenGL 4.1
Stars: ✭ 19 (-95.13%)
Mutual labels:  3d-printing, 3d-printer
Marlin Config
Marlin firmware instant configurator
Stars: ✭ 327 (-16.15%)
Mutual labels:  3d-printing, 3d-printer

Build Status

PyCNC is a free open-source high-performance G-code interpreter and CNC/3D-printer controller. It can run on a variety of Linux-powered ARM-based boards, such as Raspberry Pi, Odroid, Beaglebone and others. This gives you a flexibility to pick a board you are most familiar with, and use everything Linux has to offer, while keeping all your G-code runtime on the same board without a need to have a separate microcontroller for real-time operation. Our choice of Python as main programming language significantly reduces code base compared to C/C++ projects, reduces boilerplate and microcontroller-specific code, and makes the project accessible to a broader audience to tinker with.

Realtime Motor Control in Linux?

Typically there is no way to control stepper motors from Linux runtime environment due to the lack of real time GPIO control. Even kernel based modules can not guarantee precise control of pulses for steppers. However, we can use a separate hardware module, DMA (Direct Memory Access) which provides high precision for GPIO outputs. This module can copy bytes which represent GPIO states from RAM buffer directly to GPIO with some clock based on main chip internal oscillator without using CPU's cores. Using such approach this project generates impulses for moving stepper motors and that is very precise way regardless CPU load and OS time jitter.
This approach also allows to use Python language for this project. Typically, Python is not good choice for real time application, but since project just needs to set up DMA buffers and hardware will do the rest, Python become the perfect choice for easy development of this project.

Video demo - YouTube video
And the original video when PyCNC was just a prototype YouTube video

Current gcode and features support

  • Commands G0, G1, G2, G3, G4, G17, G18, G19, G20, G21, G28, G53, G90, G91, G92, M2, M3, M5, M30, M84, M104, M105, M106, M107, M109, M114, M140, M190 are supported. Commands can be easily added, see gmachine.py file.
  • Four axis are supported - X, Y, Z, E.
  • Circular interpolation for XY, ZX, YZ planes is supported.
  • Spindle with rpm control is supported.
  • Extruder and bed heaters are supported.
  • Hardware watchdog.

Watchdog

PyCNC uses one of DMA channels as hardware watchdog for safety purpose. If board, OS or PyCNC hangs this watchdog should disable all GPIO pins(by switching them into input state, for RPi this would be GPIO0-29) in 15 seconds. Since there is a high current and dangerous devices like heated bed, extruder heater, this feature should prevent uncontrollable overheating. But don't count on such software features too much, they can hang too or output MOSFET become shorted, use hardware protection like thermal cutoff switches in your machines.

Hardware

Currently, this project supports Raspberry Pi 1-3. Developed and tested with RPI3. And there is a way to add new boards. See hal.py file.
Note: Current Raspberry Pi implementation uses the same resources as on board 3.5 mm jack(PWM module), so do not use it. HDMI audio works.

Config

All configs are stored in config.py and contain hardware properties, limitations and pin names for hardware control.
Raspberry Pi implementation should be connected to A4988, DRV8825 or any other stepper motor drivers with DIR and STEP pin inputs. Default config is created for Raspberry Pi 2-3 and this wiring config:

Circuit name RPi pin name RAMPSv1.4 board pin name Note
X step GPIO21 A0
X dir GPIO20 A1
steppers enable GPIO26 A2, A8, D24, D30, D38 all steppers
Y step GPIO16 A6
Y dir GPIO19 A7
Z dir GPIO13 D48
Z step GPIO12 D46
E1 step GPIO6 D36 reserve
E1 dir GPIO5 D34 reserve
E0 dir GPIO7 D28
E0 step GPIO8 D26
Z max GPIO11 D19
Z min GPIO25 D18
Y max GPIO9 D15
Y min GPIO10 D14
X max GPIO24 D2
X min GPIO23 D3
heater bed GPIO22 D8
heater 2 GPIO27 D9 uses for fan
heater 1 GPIO18 D10
ser 1 GPIO17 D11 reserve
ser 2 GPIO15 D6 reserve
ser 3 GPIO4 D5 reserve
ser 4 GPIO14 D4 reserve
I2C SCL GPIO3 - to ads111x
I2C SDA GPIO2 - to ads111x
ads1115 ch0 - A15 heater 2 - nc
ads1115 ch1 - A14 bed sensor
ads1115 ch2 - A13 extruder sensor
ads1115 ch3 - - not connected

So having Raspberry Pi connected this way, there is no need to configure pin map for project. RAMPS v1.4 board can be used for this purpose. Full reference circuit diagram and photos of assembled controller(click to enlarge):
circuit small sample front small sample back small sample mounted small

Usage

Just clone this repo and run ./pycnc from repo root. It will start in interactive terminal mode where gcode commands can be entered manually.
To run file with gcode commands, just run ./pycnc filename.
Optionally, pycnc can be installed. Run

sudo pip install .

in repo root directory to install it. After than, pycnc command will be added to system path. To remove installation, just run:

sudo pip remove pycnc

Performance notice

Pure Python interpreter would not provide great performance for high speed machines. Overspeeding setting causes motors mispulses and probably lose of trajectory. According to my tests, Raspberry Pi 2 can handle axises with 400 pulses on mm with top velocity ~800 mm per min. There is always way out! :) Use JIT Python implementation like PyPy. RPi2 can handle up to 18000 mm per minute on the machine with 80 steps per millimeter motors with PyPy.
Note: Raspbian has outdated PyPy version in repositories(v4.0). Moreover v4.0 has issue with mmap module implementation. Use PyPy v5.0+, download it for your OS from here.
PyPy installation:

wget wget https://bitbucket.org/pypy/pypy/downloads/pypy2-v5.7.1-linux-armhf-raspbian.tar.bz2
sudo mkdir /opt/pypy
sudo tar xvf pypy2-v5.7.1-linux-armhf-raspbian.tar.bz2 --directory /opt/pypy/ --strip-components=1
sudo ln -s /opt/pypy/bin/pypy /usr/local/bin/pypy

Project architecture

Dependencies

Nothing for runtime. Just pure Python code. For uploading to PyPi there is a need in pandoc:

sudo dnf install pandoc
sudo pip install pypandoc

GCode simulation

Just a link, mostly for myself :), to a nice web software for gcode files emulation (very helpful for manual creating of gcode files): https://nraynaud.github.io/webgcode/

License

see LICENSE file.

Author

Nikolay Khabarov

Note that the project description data, including the texts, logos, images, and/or trademarks, for each open source project belongs to its rightful owner. If you wish to add or remove any projects, please contact us at [email protected].