Paso 2: Codificación básica
El objetivo de este código es comprobar los botones y dependiendo del estado de ellos mueva el motor para extender o retraer. Una vez que el motor se está extendiendo, se monitorea constantemente la corriente, para ver si supera el límite máximo de corriente. Si ha pasado el límite, entonces el motor se detiene y ya no se extenderá, hasta que se retraiga.
Puesto que los motores tienen un pico de corriente grande cuando empiezan, el código tiene una pequeña demora antes de que comience a tomar lecturas de corriente. Esto puede cambiar dependiendo del motor. El valor de cambio es firstfeedbacktimedelay.
El código también controla cuando los actuadores han alcanzado los fines de carrera. Cuando la corriente cae a 0, el actuador sabe que ha llegado a los límites. El sensor de corriente sólo detiene el motor si ha leído 0 un par de veces en una fila, más una lectura falsa dejaría el motor media stroke.
Se adjunta el código, el código pegado por debajo ha comentarios más detallados. El código utiliza un montón de funciones, para que cada parte se puede cambiar individualmente.
! rightlatch; / / si el motor es if movimiento, parada, parada, Inicio movimiento firstRun = true; / / set firstRun bandera ignorar actual punto lastButtonpress = millis (); //store tiempo de la última pulsación de retorno; {}} //end si} //end btnRIGHT} latchButtons //end void moveMotor() {si (leftlatch == HIGH) motorForward(255); //speed = 0-255 si (leftlatch == LOW) motorStop(); si (rightlatch == HIGH) motorBack(255); //speed = 0-255 si (rightlatch == baja) motorStop();} fin moveMotor void motorForward (int speeed) {mientras que (dontExtend == false & & leftlatch == HIGH) {digitalWrite (EnablePin, alto); analogWrite (PWMPinA, speeed); analogWrite (PWMPinB, 0); if motor //move (firstRun == true) delay(firstfeedbacktimedelay); / / mayor demora ignorar actual punto más delay(feedbacktimedelay); //small demora para llegar a velocidad getFeedback() firstRun = false; latchButtons (); //check botones otra vez} //end mientras} //end motorForward void motorBack (int speeed) {mientras que (rightlatch == HIGH) {digitalWrite (EnablePin ALTO); analogWrite (PWMPinA, 0); analogWrite (PWMPinB, speeed); if motor //move (firstRun == true) delay(firstfeedbacktimedelay); / / mayor demora ignorar corriente spike delay(feedbacktimedelay) otra cosa; pequeño retraso para llegar a velocidad getFeedback(); firstRun = false; latchButtons (); //check botones otra vez} //end mientras dontExtend = false; //allow motor para ampliar otra vez, después se ha retraído} //end motorBack void motorStop() {analogWrite (PWMPinA, 0); analogWrite (PWMPinB, 0); digitalWrite (EnablePin, LOW); firstRun = true; //once ha detenido el motor, volver a habilitar firstRun a picos corriente de inicio} //end stopMotor void getFeedback() {CRaw = analogRead(CPin1); / / if actual leer (CRaw == 0 & & hitLimits < hitLimitsmax) hitLimits = hitLimits + 1; otro hitLimits = 0; / Compruebe para ver si el motor está en los límites y la corriente ha dejado de si (hitLimits == hitLimitsmax & & rightlatch == HIGH) {rightlatch = bajo; / / stop motor fullyRetracted = true;} terminar si else if (hitLimits == hitLimitsmax & & leftlatch == HIGH) {leftlatch = bajo; hitLimits motor //stop = 0;} final si si (CRaw > maxAmps) {dontExtend = true; leftlatch = bajo; //stop si la regeneración es en máximo} //end si lastfeedbacktime = millis (); //store tiempo anterior para recibir retroalimentación} //end getFeedback