Замечательный пример автоматизации при помощи Arduino — автоматический нарезальщик пенки.
Контроллер Arduino (автор использовал — Arduino Nano, но подойдёт и любой другой), пара шаговых двигателей NEMA 14 и пара драйверов для них — вот и вся электроника, которая потребуется для повторения данной конструкции.
Скетч (FoamCutter.ino):
// FoamCutter - Driver for Actobotics FoamCutter
//
// Compiler: Arduino 1.6.1 on Windows 7
//
// Dependencies: Bounce2 Library (http://playground.arduino.cc/code/bounce)
//
// Hardware: Arduino Nano
// Pololu A4988 Stepper Driver with Voltage Regulator (Item # 1183)
// NEMA 14 1.5A 56oz-in for feeder & Cutter
//
// 2015.03.12 - Jurgen G. Schmidt - www.jgscraft.com
//
//-----------------------------------------------------------------------------
#include <Bounce2.h> // pushbutton debounce library
//--- Program control CONSTANTS --- kept at top for easy management
#define DEBOUNCE_DELAY 5
#define FEED_STEPS 865 // Feed motor is configured for half-step
//#define CUT_STEPS 950 // 15-tooth pulley
#define CUT_STEPS 1188 // 12-tooth pulley
#define M_RIGHT HIGH // set cutter motor direction
#define M_LEFT LOW
//--- Hardware pin assignments
#define LED_13 13 // Built-in LED
#define MOT1_ENA 9 // Motor 1 enable - active low
#define MOT1_DIR 6 // Motor 1 direction
#define MOT1_STP 7 // Motor 1 step
#define MOT2_ENA 5 // Motor 2 enable - active low
#define MOT2_DIR 2 // Motor 2 direction
#define MOT2_STP 4 // Motor 2 step
#define PB_FEED 3 // PB to run feed motor one cycle
#define PB_CUT 8 // PB to run cutter one cycle back and forth
#define PB_RUN 12 // PB to run feed and cut 10 times
//--- instantiate button debouncers
Bounce FeedButton = Bounce();
Bounce CutButton = Bounce();
Bounce RunButton = Bounce();
//---------------------------- setup() ----------------------------------------
void setup() {
pinMode( LED_13, OUTPUT );
pinMode( MOT1_ENA, OUTPUT ); // add 10K to + to avoid jitter at startup
pinMode( MOT1_DIR, OUTPUT );
pinMode( MOT1_STP, OUTPUT );
pinMode( MOT2_ENA, OUTPUT ); // add 10K to +
pinMode( MOT2_DIR, OUTPUT );
pinMode( MOT2_STP, OUTPUT );
pinMode( PB_FEED, INPUT_PULLUP );
pinMode( PB_CUT, INPUT_PULLUP );
pinMode( PB_RUN, INPUT_PULLUP );
FeedButton.attach( PB_FEED );
FeedButton.interval( DEBOUNCE_DELAY );
CutButton.attach( PB_CUT );
CutButton.interval( DEBOUNCE_DELAY );
RunButton.attach( PB_RUN );
RunButton.interval( DEBOUNCE_DELAY );
digitalWrite( MOT1_ENA, HIGH ); // motors off by default
digitalWrite( MOT2_ENA, HIGH );
}
//---------------------------- loop() -----------------------------------------
//--- Wait for a button press and then call matching function
void loop() {
FeedButton.update();
CutButton.update();
RunButton.update();
if( FeedButton.fell() ) Feed();
if( CutButton.fell() ) OneCut();
if( RunButton.fell() ) Run();
}
//---------------------------- Feed() -----------------------------------------
//--- Feed motor operation
//
void Feed() {
digitalWrite( LED_13, HIGH );
digitalWrite( MOT1_ENA, LOW ); // power to stepper motor
digitalWrite( MOT1_DIR, HIGH ); // select direction
for( int i; i<FEED_STEPS; i++ ) {
digitalWrite( MOT1_STP, HIGH );
delayMicroseconds( 10 ); // duration of step signal
digitalWrite( MOT1_STP, LOW );
delayMicroseconds( 1000 ); // pause between steps
}
digitalWrite( MOT1_ENA, HIGH ); // turn off motor - let things cool
digitalWrite( LED_13, LOW );
}
//---------------------------- MoveBlade() ------------------------------------
//--- Move cutting head in desired direction
void MoveBlade( unsigned int mDir ) {
digitalWrite( LED_13, HIGH );
digitalWrite( MOT2_ENA, LOW ); // power to stepper motor
digitalWrite( MOT2_DIR, mDir ); // select direction
for( int i; i<CUT_STEPS; i++ ) {
digitalWrite( MOT2_STP, HIGH );
delayMicroseconds( 10 ); // duration of step signal
digitalWrite( MOT2_STP, LOW );
delayMicroseconds( 1000 ); // pause between steps
}
digitalWrite( MOT2_ENA, HIGH ); // turn off motor - let things cool
digitalWrite( LED_13, LOW );
}
//---------------------------- OneCut() ---------------------------------------
//--- Perform a single cut - blade moves back and forth to return it home
void OneCut( void ) {
MoveBlade( M_RIGHT );
MoveBlade( M_LEFT );
}
//---------------------------- Run() ------------------------------------------
//--- Perform multiple cuts
void Run( void ) {
for( int i=0; i<5; i++ ) {
Feed();
MoveBlade( M_RIGHT );
Feed();
MoveBlade( M_LEFT );
}
}
//-----------------------------------------------------------------------------
//------ end of FoamCutter.ino ------
Комментарии (0)
RSS свернуть / развернутьТолько зарегистрированные и авторизованные пользователи могут оставлять комментарии.