3 stappen motoren aansturen via arduino

Hallo allemaal,

Ik ben voor school bezig met een project. Ik heb een X en Y as machine gemaakt.
Deze word aangestuurd door een bipolaire stappen motor die per stap 1,8 graden verspringt.
Deze configuratie stuur ik aan met een Siemens PLC. Nu is het probleem dat je met een plc maar beperkt aantal x kan schakelen. Daarom heb ik gekozen voor een Arduino mega 2560. Deze stuurt (is de bedoeling een frequentie naar de MSD 50 5.6 driver) ter aansturing van de stappen motor. Daarnaast zorg ik door middel van een weerstand 10K en een zenerdiode van 4,7 V voor de juiste stuur spanning.
Heeft iemand voor mij een uitleg hoe ik dit programma kan schrijven.

Mijn bedoeling is door middel van de PLC een start signaal te geven aan de Arduino en zodra ik deze verbreekt dat de Aduino dan ook stopt. De Arduino zorgt er dus voor dat het signaal van de PLC word omgezet in een pulserend signaal.

Ik pas 3 stappen motoren toe. 2 voor de Y as en 1 voor de x Kan dit in een programma?

Ik ben reeds druk aan het experimenteren in C maar kom er nog niet echt uit.

Al vast heel bedankt voor de moeite

Met vriendelijke groet,

Wisse

Is het niet gemakkelijker om een 555je te nemen, waarvan je de reset lijn bedient met de PLC?

Heb je ook al bedacht hoe je gaat bepalen wat de positie van de assen precies is? Je zult op een of andere manier de pulsjes moeten tellen, als je het ding alleen voor "ongeveer 500ms" aanzet, weet je nooit hoeveel stappen er precies gezet zijn.

Waarom kun je niet gewoon puljes maken met die Siemens PLC? Wat type PLC heb je precies, dus het volledige typenummer inclusief de AC/DC opties. Sommige DC types hebben speciale uitgangen om pulstreinen mee te maken.

Een manager is iemand die denkt dat negen vrouwen in één maand een kind kunnen maken
Lambiek

Special Member

Zoals je het nu wil doen gaat het niet werken.
Je weet niet hoeveel stappen je gemaakt hebt, dus de positie is niet te bepalen op deze manier.

Als je haar maar goed zit, GROETEN LAMBIEK.

hallo,

Bedankt voor de reactie's

Ik heb op het einde van de assen een plaatje geplaatst met infrarood sensoren in de in plaatje zitten 3 gaatjes. Dit is mijn zogenoemde "decoder"
Dus per rondje van de as draait geeft ie 3 pulsjes elk pulsje staat voor de verplaatsing van 0,5 mm, ik kan dus vrij nauwkeurig aansturen.
Ik heb in de siemens S7-300 een programma geschreven die ook het aan tal pulsjes telt. En dus precies de locatie weet Het gaat mij dus puur om de goede frequentie te sturen naar de driver/stappenmotor.

Ik hoop dat ik het duidelijk genoeg heb omschreven

De rest lijn (ena) op de driver word rechtstreeks aangestuurd vanaf de plc

Lambiek

Special Member

De stap_frequentie die je nodig hebt hangt helemaal af van hoe je de driver instelt. De MSD50 kan tot 128 microstappen, dus als je hem daarop zet heb je 128 X 200 = 25600 stappen nodig voor één omwenteling. Dus als je 25600Hz uitstuurt doet de motor één omwenteling/sec. Dan kan je de rest zelf wel uitrekenen denk. :)

Als je haar maar goed zit, GROETEN LAMBIEK.

Dat gedeelte snapte ik:P
Alleen hoe zet ik het programma in C in de Arduino? Dat is voor mij nog een raadsel

Op 28 maart 2013 11:49:44 schreef wisse:
Hallo allemaal,

Ik ben voor school bezig met een project.
Wisse

Waarom stel je die vraag dan niet in de rubriek "Schoolvragen" ?

Die driver die je hebt kan microsteps aan, weet je wat dat zijn, zo niet bestudeer dat eerst eens.

Het is onduidelijk uit je vraagstelling ]wat Siemens er mee te maken heeft, specificeer alstublieft.

Het gaat er niet om een precies afgemeten tijd een frequentie aan te bieden aan een motordriver, maar om de pulsen te tellen.

Bovendien, als je een schuine lijn wilt trekken met je XY tafel kun je niet eerst X helemaal doen en daarna Y maar moet je de schuine lijn incrementeel zo goed mogelijk benaderen. Anders maak je een geodriehoek op je werkstuk opgespannen op de XY tafel.

En nog wat: Als je denkt dat een preciese tijd, een bepaalde frequentie gelijk is aan een aantal pulsen: Een motor moet versnellen, als je dus ineens de volle snelheid (frequentie) aanbiedt, mist hij pulsen en is de positie dus onzeker.

Zoek overigens eens met de naam (typenummer) van die driver op dit forum.

Dat gedeelte snapte ik
Alleen hoe zet ik het programma in C in de Arduino? Dat is voor mij nog een raadsel

Eerst C leren programmeren, vervolgens de Arduino doc betreffende C
en daarna pas je problemen in de dan verkregen kan gieten.

Andere benadering: Vragen, geen reet ervan begrijpen, opvolgen en klaar.

Hoeveel beweegt je X Y tafel als je een pulsje krijgt (een derde omwenteling) van je stappenmotor?

Hoeveel is de speling in het systeem, met andere woorden als je motor achteruit gaat draaien beweegt de tafel dan ook terug wat overeenkomt met een derde omwenteling?

Zo niet, hoe denk je dat te gaan oplossen?

Als je 10 keer je tafel helemaal naar links beweegt en daarna 90% naar rechts, wat is dan de spreiding is de eindposities?

[Bericht gewijzigd door Druiloor op donderdag 28 maart 2013 15:59:10 (13%)

Opgepast: MaartenBakker citaat: "ruik ik een troll die per ongeluk met de arreslee meegelift is" :

Hallo,

bedankt voor deze antwoorden,

Excuses als ik mijn vraag op de verkeerde plek heb gesteld.

Ik zal mijn best doen zo duidelijk mogelijk te zijn.

Ik moet in opdracht van school mijn project aan sturen met een Siemens PLC S7-300

Dit is een prachtig systeem maar dit heeft als nadeel dat je de uitgangen maar een x aantal keer kan schakelen. We moesten met een alternatief komen die ook betaalbaar is. Daarom hebben wij er voor gekozen om tussen de PLC en de Msd 50 een Arduino te plaatsen deze zou makkelijk de frequentie kunnen sturen naar de driver. (mijn vraag gaat dus niet over de Plc maar puur over het programma en de aansturing van de arduino.
Het gaat er niet om een precies afgemeten tijd een frequentie aan te bieden aan een motordriver, maar om de pulsen te tellen.

Bovendien, als je een schuine lijn wilt trekken met je XY tafel kun je niet eerst X helemaal doen en daarna Y maar moet je de schuine lijn incrementeel zo goed mogelijk benaderen. Anders maak je een geodriehoek op je werkstuk opgespannen op de XY tafel.

Ook dit gedeelte snap ik maar ik hoef echter alleen maar een blokje van punt a naar punt b verplaatsen.

Of heb ik nu een verkeert beeld?

En nog wat: Als je denkt dat een preciese tijd, een bepaalde frequentie gelijk is aan een aantal pulsen: Een motor moet versnellen, als je dus ineens de volle snelheid (frequentie) aanbiedt, mist hij pulsen en is de positie dus onzeker.

Ook dat denk ik niet mijn bedoeling is om zolang de PLC niet het vooraf geprogrammeerde aantal pulsjes heeft bereikt dat de motor dan blijft doordraaien.

Ik hoop dat mijn idee haalbaar is vandaar mijn vraag:
Ik stuur een signaal (4,7 V) via de pl naar de arduino die zet dit signaal om naar een frequentie en zodra ik het signaal verbreek dan stopt de stappen motor. Dit kan ik bereiken door het enabel signaal te bekrachtigen en en door het signaal naar de arduino te stoppen.

Mijn vraag is: Is dit een haalbaar idee? Zo nee waarom niet? En zo ja kan iemand mij een voorbeeld sturen hoe ik de arduino dan moet programmeren.

Daarnaast is mijn plan om er een soft start/stop functie in te verwerken. (Maar dit is fine tuning)

Verder ben ik nu al een paar weken bezig met C ik ben druk bezig met experimenteren en stuur nu al meerdere leds enz aan. Het gaat mij puur om hoe zet ik meerdere stappen motoren weg in C

Omdat ik hier nog geen ervaring mee heb zoek ik puur een voorbeeld. (Ik doe niet aan kopie gedrag.) Echter zonder voorbeeld is het voor mij moeilijk om er een beeld van te maken. Vandaar dat ik hier nu de vraag stel.

Hoeveel beweegt je X Y tafel als je een pulsje krijgt (een derde omwenteling) van je stappenmotor?

Ik start hem elke keer na gebruik weer op met nullen van de x en y as.

Daarmee vangen wij het verloop voor het grootste gedeelte op.
Echter is het verloop na 20 x naar links bewegen 0,5 mm.

Dit wouden wij oplossen door middel van een kleine software matig finetuning na 10 x de opdracht uit te voeren de positie met 0,5 mm te corrigeren.

Als je je blokje over 100 pulsen wilt verplaatsen en je biedt de pulsen te snel (direct op volle snelheid) aan slaat de motor gewoon pulsen over, dus die gaat 99 of minder vooruit als je 100 pulsen hebt gegeven. En je weet dus niet precies waar hij staat, tenzij je de pulsen hunt tellen met je decoder op een derde omwenteling nauwkeurig (Is nogal wat als die motor 1,8 graad beweegt per puls), maar ja wat is de vereiste nauwkeurigheid (volstrekt onduidelijk) , en dat kan de bedoeling ook niet zijn want dan wordt het een servosysteem. "Duwen maar en kijken waar we uitkomen en dat corrigeren"

Daar kun je op drie manieren achterkomen
1. Door te vragen op een forum, zonder voorkennis en literatuurstudie
2. Doordat je denkt het allemaal wel te weten je kop er tegen te stoten
3. Door de specs en literatuur te bekijken voor je iets gaat "programmeren"

Naar mijn smaak deugt alleen 3. Die investeert in de toekomst en strookt niet met de kinderlijke eigenschap van onmiddellijke behoeftebevrediging, met andere woorden "als ik het nu maar heb, verder is alles best"

Dus ...

Als je meerdere motoren aanstuurt, heb je ook meerdere drivers (Waarom eigenlijk? Waarom die motoren niet omschakelen beurtelings op dezelfde driver?)

En die drivers hebben een enable pen. Je kunt dus alle drivers van een stapsignaal voorzien en slechts een van de vele motoren reageert, namelijk degene die enabled is.

Volgens mij is een PLC een programmable logic controller. Een arduino is een voorbeeld in de hobbysfeer, Ik zie dus niet in waarom je een PLC nodig hebt om een PLC te sturen omdat die tweede PLC minder zou kunnen. Die Siemens is maar x keer Iets? Wat bedoel je daarmee, want kan hij maar x keer. En als je het 2x keer wilt kun je dan commando x keer geven en weer commando x keer waardoor hij het 2x keer doet?

Kortom het is me onduidelijk dat als de opdracht luidt: doe het met een Siemens PLC dat je dan gaat zoeken naar een Arduinoi die door een Siemens PLC wordt aangestuurd.

Stel je blokje staat op [x1,y1] en je wilt teneinde gehonoreerd te worden met een diploma dat blokje verplaatsen naar [x2,y2]
dan maak je een loop while (x<x2 || y<y2)
die doet xmotor 1 stap of y motor een stap afhankelijk van of de richthoek groter of kleiner dan 45 graden is. En y motor of x motor 1 stap als de fout van de ideale lijn daardoor kleiner wordt dan hij is als je dat nalaat.

[Bericht gewijzigd door Druiloor op donderdag 28 maart 2013 17:00:08 (13%)

Opgepast: MaartenBakker citaat: "ruik ik een troll die per ongeluk met de arreslee meegelift is" :

Kijk hier heb ik wat aan! Als ik u goed begrijpt kan ik de arduino zo programmeren dat hij constant een signaal geeft en deze stuur ik naar alle drivers toe en dan kan ik de motoren aan en uitschakelen met ena?

Heb ik dit goed verwoord?

Dan ga ik nu de derde optie uitvoeren en er voor zorgen dat ik een duidelijk maar eenvoudig besturing's programma in c verwerk.

Super bedankt!

Op 28 maart 2013 16:51:52 schreef wisse:

Heb ik dit goed verwoord?

Dat is minder interessant dan de vraag of het goed begrepen is. Dat laatste is in het kader van de misplaatste schoolvraag zelf te beantwoorden, door met die vraag in gedachte de specs van de driver opnieuw na te lezen.

Opgepast: MaartenBakker citaat: "ruik ik een troll die per ongeluk met de arreslee meegelift is" :

@Druiloor: dat ben ik toch niet met je eens: je kop stoken kan didactisch zeer verantwoord zijn! Als je begint met literatuurstudies, kom je waarschijnlijk uit op een academisch verantwoord (maar verder volstrekt nutteloos) antwoord dat "er een oplossing bestaat".

Dan is het leuk dat je weet dat iemand het probleem kon oplossen, maar je begrijpt nog steeds niet wat het probleem was om mee te beginnen. Daarom is het juist beter om het zelf te proberen, zelf je kop te stoten, en als je de problemen die daarbij ongetwijfelt optreden zelf hebt ondervonden, gaat uitzoeken hoe anderen die opgelost hebben.

Ik zou minimaal uitgangen van de PLC gebruiken per motor, dan kun je al 3 snelheden gebruiken, dus in 3 stappen van stilstand naar de maximale snelheid, en als je bijna bij het doel bent, terug schakelen naar de lage snelheid, zodat je er niet voorbij schiet.

De software in de microcontroller is eigenlijk vrij eenvoudig, je moet 3 uitgangen onafhankelijk van elkaar met een bepaalde frequentie kunnen schakelen. Bepaal eerst eens wat de maximale frequentie moet zijn, dan kun je daarna gaan bekijken hoe je dat kunt implementeren. Als je maximaal 3x 100Hz moet maken, kan de code een stuk simpeler zijn dan dat je 3x 100kHz nodig hebt.

Ik blijf erbij dat je dit ook zonder microcontroller kunt oplossen, met een NE555je. Daarmee kun je ook eenvoudig verschillende frequenties maken, als je de weerstand waarmee je de timing condensator oplaadt vervangt door 2 of 3 weerstanden parallel, die je met de uitgangen van de PLC aan of uit kunt zetten.

Een manager is iemand die denkt dat negen vrouwen in één maand een kind kunnen maken
elmowww

Golden Member

Als ik jou was zou ik je adviseren om naar de code van cnc machines of 3d printers te kijken.

Hierin zitten volledige interfaces met eindstoppen, commando`s, versnelling, positiebeveiliging en zelf plan algoritmen.

Hangt er vanaf wat je zelf wilt doen, maar de code is veelal open (wellicht niet gemakkelijk te doorgronden).

Kijk voor de grap eens naar GRBL, Marlin of Sprinter. Dit zijn allemaal codes die kunnen wat jij wilt.

Zelf heb ik de hardware voor een van deze boards ontwikkeld en ik kan je zeggen dat de code meer kan dan wat jij wilt. Het enige wat je nodig hebt is een UART (serieële poort).

PA0EJE - www.eje-electronics.nl - e.jongerius[aapje]eje-electronics.nl - EJE Electronics - Elektronica/firmware ontwikkeling