Hola a todos.
Me inicio en este foro debido a que no encuentro solución al problema que me ha surgido. He de decir que mis conocimientos son bastante limitados, pero trato de investigar y buscar soluciones dentro de mis posibilidades. Espero que desde el foro podáis echarme una mano ya que me imagino que para la gente que sabe será pan comido.
Os explico mi proyecto, de dónde he sacado la información y la situación en la que me encuentro actualmente.
Mi idea es construir un cortador de cables automático. Buscando por internet he encontrado estos dos vídeos que parecen de sencilla aplicación y podrían ajustarse a mis necesidades ( DIY Arduino based Automatic wire cutting Machine - YouTube y Arduino automated wire cutter - YouTube ). La idea es sencilla, el motor avanza un cierto número de pasos para arrastrar el cable y cuando termina, el servo se mueve para bajar el cutter y cortar el cable.
Del vídeo podemos sacar la lista de componentes:
- Arduino Nano
- Motor NEMA 17 + extructor
- A4988
- Servo Motor (tengo dos, uno MG995 y otro S3003)
- LCD 16x2
- Placa PCB
- Potenciómetro 10Kohm
- Pulsadores y terminales PCB
El código de arduino es el siguiente:
//------------------------------- librarys ----------------------------------
#include <LiquidCrystal.h>
#include <Servo.h>
//------------------------------- lcd ----------------------------------
LiquidCrystal lcd(12, 11, 2, 3, 4, 5);
//------------------------------- stepper ----------------------------------
#define stepPin 7
#define dirPin 8
//------------------------------- servo ----------------------------------
Servo snippers;
#define servo 10
#define openAngle 90
#define closedAngle 0
//------------------------------- input ----------------------------------
#define leftButton 14
#define rightButton 9
#define upButton 15
#define downButton 6
//------------------------------- user settings ----------------------------------
unsigned int wireLength = 0;
unsigned int wireQuantity = 0;
//------------------------------- system settings ----------------------------------
int state = 0;
int incrementSpeed = 1;
int previousWireLength = 0;
int previousWireQuantity = 0;
float mmPerStep = 0.1549;
void setup() {
Serial.begin(9600);
lcd.begin(16, 2); //LCD columns and rows
pinMode(upButton, INPUT_PULLUP);
pinMode(downButton, INPUT_PULLUP);
pinMode(leftButton, INPUT_PULLUP);
pinMode(rightButton, INPUT_PULLUP);
pinMode(stepPin,OUTPUT);
pinMode(dirPin,OUTPUT);
snippers.attach(servo);
snippers.write(openAngle);
delay(1000);
}
void loop() {
if (!digitalRead(rightButton)){
if(state == 5){
state = 0;
}
else{
state += 1;
}
delay(200);
lcd.clear();
}
if (!digitalRead(leftButton) && state > 0 && state < 4){
state -=1;
delay(200);
lcd.clear();
}
switch (state){
case 0:
homeScreen();
break;
case 1:
chooseWireLength();
break;
case 2:
chooseWireQuantity();
break;
case 3:
confirm();
break;
case 4:
currentlyCutting();
break;
case 5:
finishedCutting();
break;
}
}
void homeScreen(){
lcd.setCursor(0, 0);
lcd.print("CORTADOR CABLES");
lcd.setCursor(11, 1);
lcd.print("SIG.>");
delay(100);
}
void chooseWireLength(){
wireLength = changeValue(wireLength);
//clear LCD if required
if(previousWireLength != wireLength){
lcd.clear();
previousWireLength = wireLength;
}
//Display information on LCD
lcd.setCursor(0, 0);
lcd.print("LONGITUD:" + (String)wireLength + "mm");
displayNavigation();
}
void chooseWireQuantity(){
wireQuantity = changeValue(wireQuantity);
//clear LCD if required
if(previousWireQuantity != wireQuantity){
lcd.clear();
previousWireQuantity = wireQuantity;
}
//Display information on LCD
lcd.setCursor(0, 0);
lcd.print("CANTIDAD:" + (String)wireQuantity);
displayNavigation();
}
void confirm(){
lcd.setCursor(0, 0);
lcd.print((String)wireLength + "mm x " + (String)wireQuantity + "pcs");
lcd.setCursor(0, 1);
lcd.print("<VOLVER");
lcd.setCursor(9, 1);
lcd.print("INICIO>");
delay(100);
}
void currentlyCutting(){
lcd.setCursor(0, 0);
lcd.print((String)0 + "/" + (String)wireQuantity);
lcd.setCursor(0, 1);
lcd.print("???s");
int stepsToTake = (int)wireLength/mmPerStep;
for(int i = 0; i < wireQuantity; i++){
unsigned long timeForOneCycle = millis();
digitalWrite(dirPin,HIGH);
for(int x = 0; x < stepsToTake; x++) {
digitalWrite(stepPin,HIGH);
delayMicroseconds(500);
digitalWrite(stepPin,LOW);
delayMicroseconds(500);
}
lcd.setCursor(0, 0);
lcd.print((String)(i+1) + "/" + (String)wireQuantity);
snippers.write(closedAngle);
delay(600);
snippers.write(openAngle);
delay(600);
lcd.setCursor(0, 1);
unsigned long timeRemaining = ((millis() - timeForOneCycle)*(wireQuantity - (i+1)))/1000;
lcd.print((String)timeRemaining + "s ");
}
wireLength = 0;
wireQuantity = 0;
state = 5;
}
void finishedCutting(){
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("CORTADO COMPLETO");
lcd.setCursor(11, 1);
lcd.print("SIG.>");
delay(100);
}
int changeValue(int currentValue){
if (!digitalRead(upButton)) {
delay(100);
currentValue += incrementSpeed;
incrementSpeed ++;
}
if (!digitalRead(downButton)) {
if(currentValue - incrementSpeed >= 0){
delay(100);
currentValue -= incrementSpeed;
incrementSpeed ++;
}
else{
currentValue = 0;
}
}
if (digitalRead(downButton) && digitalRead(upButton)){
incrementSpeed = 1;
}
return currentValue;
}
void displayNavigation(){
lcd.setCursor(0, 1);
lcd.print("<VOLVER");
lcd.setCursor(11, 1);
lcd.print("SIG.>");
delay(100);
}
Una vez montado todo el circuito, y tras leer que es aconsejable alimentar el servo desde una fuente externa (en el vídeo no lo hacen), así lo hago a través de una protoboard, eso sí, conectando la tierra con la del arduino. Con lo cuál tengo tres alimentaciones:
- La primera, a través de USB para el arduino.
- La segunda, al A4988, con un trasformador a 12V 1,25A.
- La tercera, al servo con 4 pilas alcalinas AA.
El problema:
Pues bien, veo que se ejecuta bien el sketch, el motor avanza (no lo que debería, pero ya ha ajustado el parámetro para que me coincida con la longitud deseada) pero el servo no actúa entre cada movimiento del motor. He comprobado el servo con un código de ejemplo que hace un barrido de 0 a 180º y funciona correctamente alimentándolo externamente, pero al incluirlo con el resto de elementos, no se mueve.
Desconozco si el problema viene del código, o de la alimentación, pero ahora mismo no encuentro más soluciones.
Siento la parrafada pero seguro se me quedaron cosas por decir. Si alguien puede ayudarme y necesita más datos, aquí estaré.
Muchas gracias y un saludo.