Kör Accelstepper snabbare - koden HodgePodging för en snabbare maximal steg hastighet (2 / 3 steg)

Steg 2: Woah, kod!

Jag har tagit ett fullt program från mitt projekt och rivit det samtidigt hålla de flesta av form i en "funktionell" läge. Jag kan säga den ursprungliga koden fungerade, men jag har bara testat att den nya koden kompileras.

Är denna kod perfekt? Nej.

Är denna kod det bästa och snabbaste sättet att göra detta? Nej.

Men fungerar det? Ja. Och jag hoppas att jag har gjort det så öppet i funktion som möjligt.

Den skrevs ursprungligen som ett funktionsanrop som arbetat med några olika motorer i mitt program (kräver olika instanser av accellstepper), men jag klädde det ner lite för det här exemplet.

Förslag: Om du kolla in den bifogade .ino, du kan titta på koden i din favorit texteditor. Det kommer att Visa mycket bättre, och jag rekommenderar inte att kopiera denna kod blockera i helhet, eftersom det kan vara något sargade.

/ * Detta dokument bör sluta som en kort introduktion till en särskild metod för
kringgå Accelstepper är något låg steg-gräns med standard stepper.run()
protokoll. Det är inte den enda och absolut inte den bästa metoden. Men det works.* /
Extra anmärkning om syftet: detta kan du använda fin accelstepper acceleration
algoritm för den inledande accelerationen och sedan en mycket grövre linjär ramp därefter.

#include < Accelstepper.h >

CONST int stepPin = 23.
CONST int directionPin = 14.

/ * Accelstepper SetMotorIdentifier(TYPE, STEP, DIRECTION) vi använder typ 1 eftersom jag använder en klassisk steg/DIR stepper drivrutin.
Olika typer kan be för andra saker än steg & riktning [se Accelsteppr dokumentation] * /
AccelStepper stepper(1,stepPin,directionPin);

lång actuatorDistance = 158400; Detta varierar beroende på ditt syfte. Jag ville gå 158,400 steg. Det motsvarade med 99 rotationer av min 1.8 deg stepper motor med 1/8th microstepping.
int actuatorSpeed = 3900; Detta motsvarade till 487.5 steg/sekund eller 2,47 varv/sekund, vilket för mig motsvarar cirka 40 sekunder för min manöverdonet.
osignerade långa actuatorTimeout = 19000; Detta kan inte användas i handledning, men det är bra att ha en timeout tröskel om du tror att din manöverdonet kan stall ut och du vill att vissa backup timeout.
int actuatorAcceleration = 8500; Denna acceleration värdet valdes av experimenterande och endast motsvarar till den inledande actuatorSpeed utlösande punkten - efter att din linjär acceleration tar.

CONST byte programOverhead = 26. mätt i mS.
Under funktionen snabb-stepping kan du kontrollera några sensorer (i mitt fall, för en avsluta-stopp). Det är du vill ha din ursprungliga linjära steg-dröjsmål vara ganska nära vad steg räntan var accelstepper actuatorSpeed. Att detta ska fungera, behöver du veta ungefär hur mycket tid dina kontrollerar kretsar tar exklusive steg förseningen. Om din skiss liknar gruva i vad det är att kontrollera, kan du börja med mitt nummer.

CONST byte minPulseWidth = 3; olika drivrutiner kräver olika minsta steg pulser att registrera en rad förändring... De grundläggande reprap drivrutinerna är 1-2 MS, detta är typ av en onödig variabel jag använde för extra fluff, du kan nog göra utan den.

SISTA STEGET PULSVÄRDET
byte stepDelayTarget = 90-minPulseWidth-programOverhead; Detta bör aldrig lägga upp till < 0. Kontrollera manuellt.
Detta nummer, här visas som 90, avser din mål sista steget max hastighet. 90 är i oss, så jag gick upp till 1000.000/90 = 11,111.1... steg/sekund. Det är en förbättring över standard max 3900 steg/sekunder och var begränsad hastighet i min ansökan av det fysiska systemet. Jag vet inte hur högt du kan förvänta dig en arduino att gå. Jag skulle gissa runt 30uS för mega med min specifika kod (ergo 33.000 steg/s)

CONST int systemEndstop = 24.
CONST int enablePin = 53; Detta är en annan extra variabel höll jag i exempelkoden. Du kan ignorera det, men man hänvisar till en PIN-kod som kontrollerar den aktivera pin av min DRV8825 drivrutin. Eftersom det är 53 kan du se jag skrev detta förmodligen för en arduino mega.

Globala variabler som en del av programmet fungerar.
osignerade långa timeStart; Vi vill kunna återställa timeStart i olika delar av programmet. Det är en global variabel redeclared av ett antal funktioner. Vara medveten om. En annan "extra variabel" höll jag i exempelkoden.

void setup() {//Void installationsprogrammet körs en gång under initial uppstart av mikroprocessor, men inte efter.

stepper.setPinsInverted(false,false,true); setPinsInverted (bool Dir, bool steg, bool aktivera) Bool aktivera är == true eftersom min aktivera PIN-kod är avstängd när höga och på när låg. Detta är motsatsen av standard, så vi aktivera funktionen Invertera. Jag tror standard är en A4988 drivrutin, och denna användningsfall är för Pololu DRV8825 utbrytning.

Följande bör känna om du har använt programmet accelstepper innan.

stepper.setMaxSpeed(actuatorSpeed);
stepper.setAcceleration(actuatorAcceleration);
stepper.setEnablePin(enablePin);

stepper.setMinPulseWidth(3); Kom ihåg minPulseWidth variabeln från förr? Detta är den accelstepper versionen.

förklara pinmodes
pinMode(systemEndstop,INPUT);
digitalWrite(systemEndstop,HIGH); Detta uppsättningar inre 20k pull-up resistor. Det är oftast nödvändigt för en hall sensor har en pull-up resistor, och i detta fall använde jag en hall-sensor Ändstopp.

} //end av void setup

void fastSteppingFunction() {//This funktion används senare som linjär-ramp-delen av koden.

Okej! StepDelay måste ställas in så att den skapar ett fördjupat hastighet ungefär lika med fördjupat hastighet att accelstepper slutar på. Mycket olika, och du kommer att ha orsakat en momentan acceleration att stepper motor kommer att misslyckas att hänga med.
byte stepDelay=((1000000/actuatorSpeed)-minPulseWidth-programOverhead);
VIKTIGT: Om din actuatorSpeed är mindre än 3900steps/s, kan du ändra stepDelay till en uint_16t eller annars "uint." Byte är mindre overhead att arbeta med, men kan inte > 255
I min ursprungliga koden kodade jag faktiskt hård stepDelay början på 250 i stället för (100000/actuatorSpeed). Matematik för mina värderingar skulle sätta 1.000.000/actuatorSpeed på 256 steg/sekund, och av någon anledning valde jag 250. Men denna matematik steg tillåter dig att ändra din actuatorSpeed utan att behöva ändra värdet här.

byte counter = 0;
räknaren används som ett sätt att göra en mycket snabb villkorlig programsats som flödar över varje 256 siffror. Det finns andra sätt att genomföra linjär rampen. Detta är det sättet som jag valde. Jag trodde det skulle vara snabb men det är inte längre klart för mig varför jag valde just denna metod.

While(digitalRead(systemEndstop)==High) {//remember detta är vår avslutande tillstånd. I min kod räknar vi inte med våra steg räknas. Du kan räkna steg också, genom att ange ditt tillstånd när en större disk når ett visst nummer. Måste du genomföra en räknare som ökar stegvis under varje steg.

digitalWrite(stepPin,HIGH);
delayMicroseconds(minPulseWidth);
digitalWrite(stepPin,LOW);
delayMicroseconds(stepDelay);

om (actuatorTimeout < (millis()-timeStart)) {//Did du märker vi sa "timeStart=millis()" i början av aktivering? Detta är eftersom jag rekommenderar att ditt system har en timeout om din motor bås ut och aldrig når du din Ändstopp.
göra en fel funktion och kalla det här.
göra en funktion för att få tillbaka upp farten, förutsatt att du vill göra det när du löst felet. Valfritt ingår ej.
rekursivt återgå till fastSteppingFunction();
}

/ * Nästa steg är att öka räknaren. Detta kommer att köras varje gång du upprepa slingan.
Min metod är inte mycket justerbar till ändra lutningen på rampen, och om jag skulle skriva om
denna kod idag skulle jag nog välja något annat. Anser att detta vid genomförandet av
din kod.
*/

räknare = counter + 2; / * alltid manipulera denna räknare så att du förstår när din
räknaren kommer att nå villkoret i if uttalande nedan. I mitt fall, det kommer att nå de
villkora varje 256/2 steg, det vill säga, varje 128 steg. Om jag valde ett antal lik "3" i stället < br > "2" skulle jag har ett problem eftersom disken inte skulle nå 0 till en tredje overflow < br > av räknaren byte, så jag skulle minska lutningen på min linjära ramp sex gånger. < br > under tiden jag kan också minska lutningen till hälften genom att ändra antalet till 1. Eller, jag kan dubbla < br > lutning genom att säga 4. Denna brist på flexibilitet i att förändra linjära rampens lutning är därför < br > föreslår jag att överväga andra metoder för att göra en linjär ramp. Prova att genomföra din metod med < br > minsta matematik. Ett idealiskt omfatta inte multiplikation i öglan, och speciellt inte division.
*/

om (stepDelay > stepDelayTarget & & counter == 0) {//So detta villkor är ute för att se om du är nått ditt max hastighet mål, och om du ännu inte har och räknaren har nått sin trigger punkt [0], då det minskar fördröjningen.
stepDelay--; Stepdelay--är ett snabbt sätt att säga "stepdelay = stepdelay-1", dvs, din minskar steg förseningen. Genom att minska förseningen steg, du ökar frekvensen av steg / hastigheten på din motor.
}

}
}
}

void moveActuatorForward() {
Hallå! Du ska börja flytta en motor. I många fall som innebär att du bör göra vissa säkerhet kontrollera. Följande kommenterade om uttalande är en filler för detta.
/ * om ([infoga errorCondition]) {
stepper.disableOutputs();
error();
}*/

stepper.enableOutputs(); Detta är överflödigt, faktiskt. Det är redan har anropats.
stepper.Move(actuatorDistance); Du måste berätta accelstepper hur långt du kommer!
timeStart = millis(); Jag använde en global variabel i andra delar av koden, kanske du vill använda en lokal variabel.

Hej börjar vi äntligen!
While(1) {/ / titel: "Grundläggande flytta medan Loop"

om (digitalRead(systemEndstop)==LOW) {//checks om vi träffar Ändstopp innan den når accelstepper max hastighet
Detta hänt aldrig för min ansökan, men kanske inte för din.
bryta; bryta tar bort dig från while loop kallas "grundläggande flytta medan loop"
}

stepper.Run(); Detta gör din ursprungliga acceleration helt abstrakt.

IF(stepper.Speed() < actuatorSpeed) {
fastSteppingFunction();
bryta;
}

}

stepper. DisableOutputs();
Hej är vi klara!
}

void loop() {
göra saker än flytta din motors, om du har andra saker att göra.
stepper.disableOutputs(); Jag brukar lägga till extra disableOutputs i de fall jag gjort misstag i koden, eftersom min stegmotorer sattes till en hög ström som så småningom skulle göra dessa små motorer överhettas. För enkla program detta är inte en stor sak, men när du börjar springa runt med mer program stater du vill vara säker på att du låter inte din motor överhettas medan du gör något annat.

om (1) {//Here jag bara föreslår att du förmodligen vill köra manöverdonet baserat på vissa villkor.
Nu är detta en strippad version av koden. Låt oss bara se det som ett mål att "Aktivera" ett linjärt ställdon. Det finns två endstops för den här enheten men vi tittar bara på flytta manöverdonet från "hem" till "tomgångsanslag"
stepper.enableOutputs();
stepper.setCurrentPosition(0); Min fysiska system hade en hel del friktion, så jag aldrig avtog min last. Detta innebar att när jag startar motorn, accelstepper ibland önskar att "bromsa" innan det accelererar igen. Detta är även om det inte i själva verket körs. SetCurrentPosition(0) fungerar som en återställning av accelstepper koden.
moveActuatorForward();
stepper.disableOutputs();
}
}

Se Steg
Relaterade Ämnen

Hur till göra din Laptop/dator snabbare

för det första ladda ner ett gratis program som heter Ccleaner, vad den gör det tar bort alla dina cookies, historia på datorn, så se till att alla webbplatser du vill du lägga till i favoriter.I denna bild har jag tagit bort över 200mb, när jag kom...

Hur man kör snabbare

Steg 1: Stepping stora Steg i stora långa stegSteg 2: snabbare Börjar få snabbareSteg 3: För långt Inte sära på benen för långt ifrån varandra...

Topp 10 naturliga hår olja för att främja hårväxt snabbare

Denna video kommer att hjälpa för att veta du Top 10 naturliga hår olja för att främja hårväxt snabbareSteg 1: Titta på hela videon tutorial här:Om du gillar & vill se fler videor Vänligen prenumerera https://goo.gl/so4UdLThumbs upp, kommentera, dela...

2 rullar Android vikt kontrollerad robot

Denna robot leksak är som en Segway, förutom att det är naturligt själv balanseringen. Den fungerande principen för rörelse liknar sfär leksaken, minus utanför bollen del och gyro. Den är stabil eftersom tyngdpunkten är lägre än hjul centrum. Det ska...

Att lägga till MIDI till gamla hem organ

i en tidigare instructable "hur till få en fri synt" jag talade om hur du skaffar en "synt" (ett hem orgel) för nästan ingenting. Så, kanske nu du har din gratis hem orgel och kanske det ser cool men fungerar inte korrekt eller kanske...

Altoid Tin tyst larm

Altoid Tin ultraljud tyst rum larmDetta är min första instructable, så ursäkta eventuella misstag som jag har gjort. Min flickvän har problem med sin rumskompis och var inte säker på om rumskamrat var på väg in i hennes rum utan tillstånd. Jag beslut...

Automatisk, biorytm LED akvarium ljus

normala akvarium lampor är lysrör som kräver att du aktivera dem på morgonen och utanför på natten. Detta är inte det mest effektiva sättet att tända en tank, men av någon anledning är det standard kit får du. En annan fråga är att högspännings-krets...

Hur till tala fikonspråk

denna tutorial lär du dig att tala och skriva i den gamla koden, fikonspråk. Njut!Steg 1: material: • Papper• Penna• En vän att träna medSteg 2: Att välja ett ord jag valde ordet, hund. I fikonspråk, skulle hund vara ogday. Låt mig berätta du hur til...

MSP430 baserad Chronulator (med Launchpad chip)

nyligen, jag har experimenterat med microcontrollers. Ett projekt som verkligen fångade min blick var Chronulator på http://www.sharebrained.com. På samma gång släppt Texas Instruments en experimenter's kit kallas startfönstret för enastående pris på...

Styra TV med någon telefon (även telefoner utan IR-blaster)

Vill du styra din TV och flera andra prylar som är IR kontrolleras? Ya men min telefon inte stöder det eftersom den inte har en IR-blaster. Oroa dig inte här en gadget som ger IR-kontroll till någon annan telefon och det den behöver är bluetooth! Ja!...

Self balancing skateboard/segw * y projektet Arduino Shield

Gallmänna ändamål Arduino shield för egen balanseringsmaskiner.Varför gjorde jag det?Jag har tidigare gjort en Instructable 2010 om hur man bygger en självbalanserande skateboard.Det finns > 500 kommentarer på detta och många uttrycker förvirring stä...

Twitter Mood Light - världens humör i en låda

Hur världen mår just nu? Här du berättar.Drivs av: en Arduino, en WiFly trådlös modul, en RGB LED, Twitter.com och en 9v batteri.Jag är nyheter knarkare. Jag vill veta allt som händer i världen så fort det händer. Jag vill vakna upp och veta omedelba...

Styrenhet: En internet-ansluten ratten för att styra... något!

Efter att sätta ihop ett halvdussin eller så elektriska Imp projekt, det slog mig att bara för den integrerade havspolitiken är kraftfull nog att hantera komplicerade uppgifter inte betyder att att göra en enkel sak Internetanslutning är mindre kraft...

Höghastighetståg fotografering med Arduino och CHDK

detta projekt använder en Arduino mikrokontroller och en laser paus-beam utlösa brand via USB remote en Canon kamera modifierad med CHDK (Canon hacka Development Kit) firmware.Omedelbar påverkan är den snabba blixtfotografering utlöses av ljud eller...

LED Pong tabell

Denna LED öl pong tabell blåser sinnen, och om du gör det korrekt, inga säkringar. Fullt fungerande modellen båda upptäcker där en boll studsar och förstärker ditt festande erfarenhet med en musik-känsliga ljusshow. Som du ser, kommer vår nuvarande v...

Programmera din Makey Makey

Standard MaKey MaKey nyckel pressar inte passar dina behov?I detta Instructable ska jag visa dig hur du anpassar nycklarna!Vad du behöver:-MaKey MaKey-USB-kabel-Arduino IDESteg 1: Ladda ner addonMaKey MaKey behöver en addon att arbeta med Arduino IDE...

Treebeard stegvisa

jag hade mycket roligt att sätta ihop denna Treebeard kostym för Halloween i år. Det tog en helg att göra huvudet och en annan dag att sätta kroppen tillsammans. Det var en ganska rusade bygga, jag behövde till använda en värmare och hårtork för att...

HacKeyboard, ett mekaniskt tangentbord byggs från grunden

Hej Karl "instructablers"! I detta instructable jag ska presentera ett helt nytt projekt som jag har just avslutat. I själva verket använder jag själva projektet för att skriva detta instructable. Jag presenterar för er den fantastiska, fantasti...

1Sheeld kontrolleras Arduino fordon

Använda 1Sheeld, powered fjärrkontroll en Arduino fordon med accelerometern i din Smartphone/surfplatta.Steg 1: Essentials Du kommer att kräva den följande objekt eller motsvarande.1) något Arduino powered vehicle plattform. På bilden är den Dagu vil...