Övervaka belastning Feedback-ett ställdon (2 / 5 steg)
Steg 2: Grundläggande kodning
Målet med denna kod är att kontrollera knapparna och beroende på dem flytta motorn att utöka eller dra tillbaka. När motorn är att utvidga, övervakas ständigt aktuell, för att se om det överträffar den nuvarande maxgräns. Om det har passerat gränsen, då motorn stannar, och inte längre kommer att fördjupa, tills du dra tillbaka det.
Eftersom motorer har en stor nuvarande stegring när de börjar, har koden en liten fördröjning innan det börjar ta nuvarande avläsningar. Detta kan ändras beroende på motorn. Ändra värdet firstfeedbacktimedelay.
Koden övervakar även för manöverdonen uppnått gränslägesbrytarna. När nuvarande sjunker till 0, vet manöverdonet att det har nått gränsen. Den nuvarande sensorn bara stoppar motorn om det har läst 0 några gånger i rad, annars en falsk behandling skulle stoppa motorn mitten av stroke.
Koden är kopplad, koden inklistrade nedan mer detaljerade kommentarer. Koden använder massor av funktioner, så att varje del kan ändras individuellt.
/ * Kod för att övervaka den nuvarande amp dra av manöverdonet och att minska makten om det
stiger över en viss summa.
Skrivet av progressiva automatiseringar
19 augusti 2015
Hårdvara:
-RobotPower MegaMoto kontroll styrelser
-Arduino Uno
-2 tryckknappar
*/
CONST int EnablePin = 8;
CONST int PWMPinA = 11;
CONST int PWMPinB = 3; stift för Megamoto
CONST int buttonLeft = 4;
CONST int buttonRight = 5; //buttons att flytta motorn
CONST int CPin1 = A5; motoriska feedback
int leftlatch = låg;
int rightlatch = låg, //motor lås (används för koden logik)
int hitLimits = 0; //start vid 0
int hitLimitsmax = 10; //values veta om resor gränsen var nådd
lång lastfeedbacktime = 0; måste vara lång, annars det svämmar över
int firstfeedbacktimedelay = 750; första dröjsmål att ignorera nuvarande spike
int feedbacktimedelay = 50; fördröjning mellan feedback cykler, hur ofta du vill motorn kontrolleras
lång currentTimefeedback = 0; måste vara lång, annars det svämmar över
int debounceTime = 300; mängd att Dämpningstid knappar, lägre värden gör knapparna känsligare
lång lastButtonpress = 0; timer för debouncing
lång currentTimedebounce = 0;
int CRaw = 0; indatavärdet för nuvarande avläsningar
int maxAmps = 0; resa gränsen
bool dontExtend = false;
bool firstRun = sant;
bool fullyRetracted = false; //program logik
void setup()
{
Serial.BEGIN(9600);
pinMode (EnablePin, OUTPUT);
pinMode (PWMPinA, OUTPUT);
pinMode (PWMPinB, OUTPUT); //Set motor utgångar
pinMode (buttonLeft, ingång);
pinMode (buttonRight, ingång); //buttons
digitalWrite (buttonLeft, hög);
digitalWrite (buttonRight, hög), //enable inre pullups
pinMode (CPin1, indata); //set feedback input
currentTimedebounce = millis();
currentTimefeedback = 0; //Set första gånger
maxAmps = 15; / / SET MAX aktuella här
} //end setup
void loop()
{
latchButtons (); //check knappar, se om vi behöver flytta
moveMotor (); //check lås, flytta motor in eller ut
} //end huvudloop
void latchButtons()
{
om (digitalRead (buttonLeft) == låg) //left är framåt
{
currentTimedebounce = millis() - lastButtonpress; / / kolla tid sedan senaste press
om (currentTimedebounce > debounceTime & & dontExtend == false) //once du har utlöst dontExtend, ignorera alla framlänges pressar
{
leftlatch =! leftlatch; / / om motorn är rörliga, stop, om stannade, börja flytta
firstRun = sant; / / ange firstRun flagga att ignorera nuvarande spike
fullyRetracted = false; När du flyttar framåt, är du inte helt indragen
lastButtonpress = millis (); //store tidpunkten för senaste knapptryckning
hemkomst.
} //end om
} //end btnLEFT
om (digitalRead (buttonRight) == låg) //right är tillbaka
{
currentTimedebounce = millis() - lastButtonpress; / / kolla tid sedan senaste press
om (currentTimedebounce > debounceTime)
{
rightlatch =! rightlatch; / / om motorn är rörliga, stop, om stannade, börja flytta
firstRun = sant; / / ange firstRun flagga att ignorera nuvarande spike
lastButtonpress = millis (); //store tidpunkten för senaste knapptryckning
hemkomst. } //end om
} //end btnRIGHT
} //end latchButtons
void moveMotor()
{
om (leftlatch == hög) motorForward(255); hastighet = 0-255
om (leftlatch == låg) motorStop();
om (rightlatch == hög) motorBack(255); hastighet = 0-255
om (rightlatch == låg) motorStop();
} //end moveMotor
void motorForward(int speeed)
{
medan (dontExtend == false & & leftlatch == hög)
{
digitalWrite (EnablePin, hög);
analogWrite (PWMPinA, speeed);
analogWrite (PWMPinB, 0); //move motor
om (firstRun == true) delay(firstfeedbacktimedelay); större dröjsmål att ignorera nuvarande spike
annat delay(feedbacktimedelay); liten fördröjning att få snabba
getFeedback();
firstRun = false;
latchButtons (); //check knappar igen
} //end medan
} //end motorForward
void motorBack (int speeed)
{
medan (rightlatch == hög)
{
digitalWrite (EnablePin, hög);
analogWrite (PWMPinA, 0);
analogWrite (PWMPinB, speeed); //move motor
om (firstRun == true) delay(firstfeedbacktimedelay); / / större fördröjning för att ignorera nuvarande spike
annat delay(feedbacktimedelay); liten fördröjning att få snabba
getFeedback();
firstRun = false;
latchButtons (); //check knappar igen
} //end medan
dontExtend = false; //allow motor att förlänga igen, när det har dragits tillbaka
} //end motorBack
void motorStop()
{
analogWrite (PWMPinA, 0);
analogWrite (PWMPinB, 0);
digitalWrite (EnablePin, låg);
firstRun = sant; //once motorn har stannat, återaktivera firstRun för start nuvarande spikar
} //end stopMotor
void getFeedback()
{
CRaw = analogRead(CPin1); Läs aktuella
om (CRaw == 0 & & hitLimits < hitLimitsmax) hitLimits = hitLimits + 1.
annat hitLimits = 0; Kontrollera om motorn är på gränsen och aktuellt har slutat
om (hitLimits == hitLimitsmax & & rightlatch == hög)
{
rightlatch = låg; stoppa motorn
fullyRetracted = sant;
} //end om
annat if (hitLimits == hitLimitsmax & & leftlatch == hög)
{
leftlatch = låg, //stop motor
hitLimits = 0;
} //end om
om (CRaw > maxAmps)
{
dontExtend = sant;
leftlatch = låg; stoppa om feedback är över maximum
} //end om
lastfeedbacktime = millis (); //store tidigare tid för att ta emot feedback
} //end getFeedback