Voorwoord Begin 2de semester van het laaste jaar academische bachelor wordt gevraagd om je keuze te maken in verband met de masterproef. Daarbij is er keuze uit een hele lijst van voorstellen. Uit die lijst viel mijn oog op een item die toen nog de titel “CNC machine met open-source componenten” droeg. De omschrijving liet vrijwel meteen merken dat het concept het hele plaatje omvat, wat in de opleiding Elektromechanica aan bod komt: een elektronische aansturing en bijhorende mechanica (motoren, overbrengingen). In mijn vrije tijd houd ik mij sinds langere tijd bezig met het bedenken en ontwerpen van elektronische circuits, waarin ook sturingen en motoraandrijvingen onder vallen. Zo werd de maquette’s van mij als van m’n broer bij het laatstejaar secundair onderwijs met een microcontroller geautomatiseerd. De mechanische bewegingen zelf, werden toen vanwege de eenvoud en gemakshalve met Lego Technics uitgevoerd. Later kreeg ook een boot een volledig op maat gemaakte sturing. Ook hier op basis van een microcontroller. De bediening gebeurt bovendien via een exe-programma, gemaakt in Visual Studio. Deze laatste kon dankzij de geziene leerstof en aanvullende zelfstudie in de academische bacheloropleiding. Alle aangehaalde zaken, blijken uitstekend van pas te komen in deze masterproef. Doorheen het jaar waren wel enkele vertragingen en tegenslagen, maar mede dankzij de steun van de begeleiders, Dhr. Vanwalleghem en Dhr. Grimonprez is alles uiteindelijk goed gekomen. Graag bij deze ook mijn oprechte dank. Verder wens ik ook m’n ouders te bedanken. Dankzij hen heb ik de mogelijkheid gekregen om deze studies uit te voeren. Ook dank voor het materiaal in bruikleen van vader en broer: een oscilloscoop, verschillende tangen en bits, … Als laatste wil ik oog graag het personeel van de Howest bedanken. Steeds kon ik rekenen op hun medewerking als ik enkele toestellen, problemen of hulp nodig had.
2
Abstract The Genisys Xs is an prototyping printer, build by Stratasys Inc. Meanwhile, there are multiple prototyping-printers on the commercial market. Generally, they can be divided into 2 main groups: low-cost printers and professional printers. Low-cost printers usually doesn’t have very sturdy mechanics, while professional printers are very expensive. Howest has an old Genisys Xs prototyping, that doesn’t work any longer. A mechanical issue and a outdated control unit finally imposes an replacement. The use of an low-cost controller in combination with the re-use of the good mechanics of the Genisys, would give an low-cost 3D-printer, with still good print results. This concept, where the whole construction and control unit is known, could then be used in combination with other tools, like an measuring tool head for instance.
3
Inhoud 1.
Intro: Additieve manufacturing ....................................................................................................... 8
2.
Genisys Xs ........................................................................................................................................ 9
2.1.
Inleiding ....................................................................................................................................... 9
2.2.
Situering .................................................................................................................................... 11
3.
Doelstellingen ................................................................................................................................ 11
4.
Makerbot - RepRap ....................................................................................................................... 12
4.1.
Keuze sturing ............................................................................................................................. 12
4.2.
Makerbot Thing-o-Matic en extruder MK7 ............................................................................... 13
4.3.
RepRap RAMPS V1.4.................................................................................................................. 15
5.
Overzicht ombouwen Genisys ....................................................................................................... 16
5.1.
Voorzieningen ‘oude’ Genisys ................................................................................................... 16
5.2.
Ondersteuning voorzieningen Genisys in nieuwe sturing ......................................................... 18
6.
Project Ballenwerper ..................................................................................................................... 18
6.1.
Inleiding ..................................................................................................................................... 18
6.1.1.
Doel en situering ................................................................................................................... 18
6.1.2.
Vereisten project ................................................................................................................... 21
6.1.3.
Praktische aanpak.................................................................................................................. 21
6.2.
Hardware ballenwerper ............................................................................................................ 22
6.2.1.
Principieel schema................................................................................................................. 22
6.2.2.
Shield ..................................................................................................................................... 24
6.2.3.
Interface ................................................................................................................................ 28
6.3.
Software microcontroller .......................................................................................................... 29
6.3.1.
Datacommunicatie ................................................................................................................ 29
6.3.2.
Communicatie PC – microcontroller ..................................................................................... 30
6.3.2.1.
Hardwareperiferie ............................................................................................................. 30
6.3.2.2.
Eigen datacommunicatieprotocol ..................................................................................... 31
6.3.2.3.
Data-intregriteit................................................................................................................. 32
6.3.2.4.
‘Fail-safe’-systeem ............................................................................................................. 33
6.3.3.
Communicatie microcontroller - driver ................................................................................. 34
6.3.3.1.
Hardwareperiferie ............................................................................................................. 34
6.3.3.2.
Datacommunicatieprotocol............................................................................................... 35
6.3.3.3.
Data-integriteit .................................................................................................................. 36
6.3.3.4.
Praktische implementatie SPI ............................................................................................ 36
6.3.4.
Uitvoeren trajecten ballenwerper ......................................................................................... 37
6.3.4.1.
Genereren NXT-pulsen ...................................................................................................... 37
6.3.4.2.
De functie ‘move’ .............................................................................................................. 43
6.3.4.3.
Manueel positioneren ....................................................................................................... 46 4
6.3.5.
Algemene structuur microcontrollerprogramma.................................................................. 47
6.4.
Software Visual Studio .............................................................................................................. 49
6.5.
Opmerkingen/verbeteringen prototype ................................................................................... 50
6.6.
Besluit project ballenwerper ..................................................................................................... 50
6.7.
Opstart manual ballenwerper ................................................................................................... 53
6.7.1.
Opstartprocedure .................................................................................................................. 53
6.7.2.
Troubleshooting .................................................................................................................... 53
7.
Hardware nieuwe Genisys ............................................................................................................. 54
7.1.
Amis-converter .......................................................................................................................... 54
7.2.
Extruder safety switch ............................................................................................................... 57
7.3.
Power PCB ................................................................................................................................. 60
7.4.
Mains PCB .................................................................................................................................. 63
7.5.
Power supply ............................................................................................................................. 64
7.6.
Bekabeling ................................................................................................................................. 64
8.
Software nieuwe Genisys .............................................................................................................. 65
9.
Overzicht ombouw ........................................................................................................................ 72
10.
Uitbreidingen............................................................................................................................. 73
11.
Eindconclusie masterproef ........................................................................................................ 76
12.
Literatuurlijst ............................................................................................................................. 78
13.
Bijlagen ...................................................................................................................................... 78
13.1.
Uitleg Eclipse code project ballenwerper.............................................................................. 78
13.2.
Digitale bijlagen ..................................................................................................................... 87
Figuren Figuur 1: Additieve Manufacturing ......................................................................................................... 8 Figuur 2: Genisys Xs ................................................................................................................................. 9 Figuur 3: Oude sturing Genisys ............................................................................................................... 9 Figuur 4: Blokschematische werking oude sturing Genisys .................................................................. 10 Figuur 5: Commerciële prototyping printers......................................................................................... 11 Figuur 6: Makerbot Thing-o-Matic ........................................................................................................ 13 Figuur 7: Aansluitschema Thing-o-Matic............................................................................................... 14 Figuur 8: Extruderkop MK7 Makerbot .................................................................................................. 14 Figuur 9: Ramps v1.4 ............................................................................................................................. 15 Figuur 10: Aansluitschema Ramps v1.4................................................................................................. 16 Figuur 11: 'Grote' opstelling .................................................................................................................. 19 Figuur 12: 'Kleine' opstelling ................................................................................................................. 19 5
Figuur 13: Arduino Uno ......................................................................................................................... 20 Figuur 14: Principieel schema................................................................................................................ 22 Figuur 15: Principieel schema met uitbreiding...................................................................................... 23 Figuur 16: Shield en Interface ............................................................................................................... 23 Figuur 17: Alle mogelijke IO met microcontroller ................................................................................. 24 Figuur 18: Overzicht pin-out microcontroller ....................................................................................... 25 Figuur 19: Niveaushifting (niet inverterend!)........................................................................................ 25 Figuur 20: Reset netwerk ...................................................................................................................... 26 Figuur 21: Stabilisator............................................................................................................................ 27 Figuur 22: Bedrading Interface .............................................................................................................. 29 Figuur 23: Dataprotocol PC-microcontroller ......................................................................................... 31 Figuur 24: Verbeterde protocol: EOD-byte ........................................................................................... 33 Figuur 25: Principiele werking SPI ......................................................................................................... 34 Figuur 26: Dataprotocol microcontroller - driver .................................................................................. 35 Figuur 27: Sequentieel verloop communicatie ..................................................................................... 35 Figuur 28: Schrijf-transactie .................................................................................................................. 36 Figuur 29: Methode 1 opwekken Nxt-pulsen ........................................................................................ 38 Figuur 30: Methode 2 opwekken Nxt-pulsen ........................................................................................ 39 Figuur 31: Werking ISR i.f.v. tijd ............................................................................................................ 40 Figuur 32: Delay ISR ............................................................................................................................... 40 Figuur 33: Verwerkingstijd ISR .............................................................................................................. 41 Figuur 34: Niet 'real-time' hoofdprogramma ........................................................................................ 42 Figuur 35: 'Real-time' garantie d.m.v. beveiliging ................................................................................. 42 Figuur 36: Overzicht 'Move'-functie ...................................................................................................... 44 Figuur 37: Sequentie geschreven programma in Eclipse ...................................................................... 47 Figuur 38: Principiële werkingsstructuur .............................................................................................. 47 Figuur 39: Blokschema werking ballenwerper ...................................................................................... 48 Figuur 40: Praktische uitvoering shield en interface ............................................................................. 51 Figuur 41: De GUI .................................................................................................................................. 51 Figuur 42: Protectienetwerk bij kortsluitfout ingang single buffer ....................................................... 55 Figuur 43: Protectienetwerk bij kortsluitfout ingang hex buffer .......................................................... 56 Figuur 44: Bufferen voedingsspanning .................................................................................................. 56 Figuur 45: Signaalbehandeling thermokoppel ...................................................................................... 57 Figuur 46: Extruder safety switch Makerbot ......................................................................................... 58 Figuur 47: Extruder safety switch nieuwe Genisys................................................................................ 59 Figuur 48: Bussysteem AMIS-drivers ..................................................................................................... 60 Figuur 49: Vermogentrap via mosfet .................................................................................................... 61 Figuur 50: Laadtijd gate mosfet............................................................................................................. 62 Figuur 51: Vermogentrap via low power transistor .............................................................................. 63 Figuur 52: Mains PCB............................................................................................................................. 63 Figuur 53: Niet aangehaalde verbindingen ........................................................................................... 64 Figuur 54: Softwaremodel ..................................................................................................................... 65 Figuur 55: Macro's SPI - Deel 1 .............................................................................................................. 66 Figuur 56: Macro’s SPI - Deel 2.............................................................................................................. 67 Figuur 57: Macro’s enablen/disablen AMIS-driver ............................................................................... 68 Figuur 58: Definiëren uitbreidings-IO .................................................................................................... 68 Figuur 59: Uitbreiding configuratie instellingen.................................................................................... 69 Figuur 60: Omrekening temperatuur .................................................................................................... 70 Figuur 61: Hoofdprogramma Sprinter ................................................................................................... 71 Figuur 62: Ondersteuning blokkeerpinnen ........................................................................................... 71 Figuur 63: Blokschema nieuwe sturing ................................................................................................. 72 Figuur 64: Blokschema ombouw Ramps ............................................................................................... 73 6
Figuur 65: Controle op de scheefstelling............................................................................................... 74 Figuur 66: Controle door lichtsluis ........................................................................................................ 74 Figuur 67: Controle door inductieve sensor .......................................................................................... 74 Figuur 68: Detectie haspel leeg ............................................................................................................. 76 Figuur 69: Include's en constanten ....................................................................................................... 78 Figuur 70: Constanten ........................................................................................................................... 79 Figuur 71: Globale variabelen deel 1..................................................................................................... 79 Figuur 72: Globale variabelen deel 2..................................................................................................... 80 Figuur 73: Intialiseren............................................................................................................................ 80 Figuur 74: ADC en USART ...................................................................................................................... 81 Figuur 75: Pariteitscontrole en SPI-leesactie ........................................................................................ 82 Figuur 76: SPI-schrijfactie ...................................................................................................................... 82 Figuur 77: SPI-initialisatie ...................................................................................................................... 83 Figuur 78: In -en uitschakelen driver ..................................................................................................... 83 Figuur 79: ISR ......................................................................................................................................... 84 Figuur 80: Update microstep en deel 1 'Move'-functie ........................................................................ 85 Figuur 81: Deel 2 'Move'-functie ........................................................................................................... 86
Tabellen Tabel 1: Voor en nadelen soorten printers ........................................................................................... 11 Tabel 2: Lijst voorzieningen oude Genisys ............................................................................................ 17 Tabel 3: Overzicht verbruikers 24V ....................................................................................................... 64 Tabel 4: Overzicht onkosten ombouw .................................................................................................. 77
7
1. Intro: Additieve manufacturing Additieve manufacturing, kortweg AM, is duidelijk een uit het Engels afgeleide term en zou vrij kunnen vertaald worden tot: “productie door toevoeging van materiaal”. AM is een algemene term en beslaat eigenlijk meerdere principes. Wel delen die principes eenzelfde basis. Vooreerst wordt een 3D-model, afkomstig uit een CAD/CAM-pakket opgedeeld in meerdere lagen of layers. Die layers kunnen verder beschouwd worden als 2D-modellen met een uniforme dikte. Door die layers met een bepaald bronmateriaal te gaan realiseren, wordt het product uiteindelijk laag per laag opgebouwd. Hoe die layers nu praktisch worden gerealiseerd, hangt van het gebruikte procedé af. In deze masterproef wordt gebruikt gemaakt van FFF: Fused Filament Fabrication (Figuur 1).
FDM by Zureks.png Figuur 1: Additieve Manufacturing
De FFF-techniek zorgt ervoor dat het moedermateriaal (ABS in deze masterproef) in een vloeibare, viskeuze toestand op de juiste positie terecht komt. Het doet dit door het bewegen van de spuitmond, de tafel of een combinatie van beide. Laag per laag komt zo het product tot stand. Hoewel de FFF-techniek hier niets over aangeeft, gebeuren de bewegingen vaak door middel van een X, Y en Z-as (cartesische assenkruis). De fabricatie via AM heeft als voordeel dat complexe producten te bouwen zijn. Zo ook producten die niet meteen via klassieke methoden (draaien, frezen, …) te maken zijn. Bovendien is de vorm van het product enorm flexibel: de machine hoeft immers niet worden opgebouwd of aangepast. Inladen van nieuwe 3D-model volstaat. Een andere voordeel van AM is het feit dat er enkel bronmateriaal wordt gedropt, waar dit nodig is. Zo is er bijgevolg ook geen verlies van bronmateriaal. De FFFtechniek zelf wordt momenteel steeds vaker ingezet, aangezien het in principe in ieder materiaal kan worden toegepast. Zolang het bronmateriaal maar in een viskeuze toestand kan worden gedropt en nadien in een vaste toestand kan worden omgezet (door afkoelen, uitharden, …). Zoals aangegeven is Fused Filament Fabrication één van de procedés die onder Additieve Manufacturing valt. Andere procedés zijn bijvoorbeeld het laagsgewijs bestrooien met poeder, waarna een laserstraal het poeder op specifieke plaatsen doet versmelten.
8
2. Genisys Xs
2.1.
Inleiding
De Genisys Xs, geproduceerd door Stratasys, is de naam van de 3D prototyping machine, die in het kader van deze masterproef wordt herontwikkeld (Figuur 2). De Genisys Xs kwam er door de samenwerking van Stratasys met IBM. De rapid-prototyping-technologie werd ontwikkeld door IBM en in 1995 gekocht door Stratasys. De Genisys Xs kan onderdelen bouwen tot 305x203x203mm, respectievelijk breedte, diepte en hoogte.
Figuur 2: Genisys Xs
De mechanica (stappenmotoren, lineare geleidingen, tandriemen, frame, …) blijft behouden. De verouderde sturing bevindt zich achterin de machine en is voorzien met voor deze toepassing aangepaste stuurkaarten (geprikt op het moederbord van de PC). Een voorbeeld hiervan is de uitbreidingskaart waarop reeds H-bruggen zijn voorzien om rechtstreeks stappenmotoren aan te sturen (Figuur 3). De 3D-software ‘AutoGen’ draait op een externe PC. Hierin kunnen STL-files worden geopend en worden bewerkt (roteren, verschalen, verplaatsen, …). De Genisys dient dan via een ethernetkabel op de PC (of via een tussenliggend netwerk) aangesloten te worden. De Genisys wordt geconfigureerd op de externe PC alsof het een ‘gewone’ printer betreft. Uiteindelijk kan vanuit AutoGen het printen van het stuk gestart worden. Figuur 3 biedt hierover meer verduidelijking, aan de hand van foto’s en een blokschema.
Figuur 3: Oude sturing Genisys
9
Op Figuur 3 is links de originele sturing van de Genisys te zien. Een ingebouwde PC met aangepaste stuurkaarten is rechts onderaan de machine weer te vinden. Linksonder staat een PCB, waarop het vermogengedeelte wordt geregeld (lampen, doorverbinding tussen de verschillende connectoren, voedingen, …). Centraal staat nog een PCB, waar eerder de signaalbehandeling van temperatuursensoren, detectie deurcontacten plaats vindt. De extruderkop herbergt ook nog een eigen PCB, die instaat voor de lokale werking (vermogentrap motoren, temperatuurmeting, …). Deze is niet op de figuur te zien. Rechts is de vermogenkaart te zien, dewelke de verschillende stappenmotoren aansturen. Deze is één van de speciale kaarten die op het moederbord van de ingebouwde PC is ingeprikt. Figuur 4 geeft een beknopte, schematische opbouw van de Genisys weer. Het beschrijft hoe de interactie tussen de verschillende onderdelen gebeurt.
PC Ingebouwde PC + versterkerkaarten SUB-D
Ethernet AutoGen (Windows NT)
RS485 X Power Supply PCB
Y Z RS485
Losse kabels
RS485 Extruder PCB Patronen PCB +extra Losse kabels
Blokkeerpinnen
Verlichting
Magneetcontacten beveiliging Ventilator
Eigen mechanisme laden nieuwe patronen
Randapparatuur zoals verwarming platforms, referentiesensoren,
Figuur 4: Blokschematische werking oude sturing Genisys
10
2.2.
Situering
Er bestaan reeds meerdere fabrikanten van prototyping printers op de markt. Globaal kan er onderscheid worden gemaakt in het doel van de machine: voor professioneel gebruik of eerder voor hobby gebruik. Figuur 5 geeft een overzicht en indeling van enkele 3D-printer leveranciers.
Commerciële prototyping printers
3D Systems Ultimaker Professionele printers
Low-cost printers
…
Stratasys Reprap
…
Makerbot
Figuur 5: Commerciële prototyping printers
Typisch voor de low-cost printers is de grotere interactie met de gebruiker (handmatig refereren, …), terwijl vooral de grote kost doorweegt bij de professionele printers. Tabel 1 geeft een overzicht. Tabel 1: Voor en nadelen soorten printers
Low-cost 3D-printers
Voordeel
Professionele 3D-printers
Lagere prijs
Kant-en-klare oplossing
Vrije toegang tot schema’s e.d.
Goede printresultaten
Internetfora ter ondersteuning
Goede mechanische opstelling
Mechanisch minder solide
Duur
Veel interactie gebruiker nodig
Vrij gesloten, geen schema’s, …
Nadeel
3. Doelstellingen De bedoeling is nu om de beste eigenschappen van zowel low-cost als professionele 3D-printers te combineren. De machine wordt op die manier ook volledig gekend qua werking en onderdelen. In de toekomst kan men dus zelf aan de printer gaan sleutelen en staat het vrij om de machine van andere tools te voorzien (bv. meetkop). Zo zou de machine voor meerdere doeleinden inzetbaar worden. 11
De doelstellingen van de masterproef zijn dan ook de volgende:
Ontmantelen en studie werking huidige sturing Genisys
Onderzoek werking nieuwe, aan te kopen sturing
Onderzoek noden en onderdelen voor de ombouw
Marktstudies omtrent aan te kopen onderdelen
Aankopen en ombouwen machine
Programmacode sturing aanpassen aan nieuwe noden
Uitbreidingen van de doelstelling zijn bijvoorbeeld het integreren van een haspelsysteem binnen de machine. Het ontwerpen van een eigen sturing valt niet binnen de doelstellingen. Er dient gebruik gemaakt te worden van reeds bestaande, open-source (dit betekend ‘gratis te verkrijgen’) sturingen.
4. Makerbot - RepRap
4.1.
Keuze sturing
Aanvankelijk wordt voor de nieuwe sturing gebaseerd op deze die Makerbot aanbiedt. De kennismaking gebeurt tijdens een workshop, georganiseerd door Timelab in samenwerking met Howest Kortrijk. Dit resulteerde in heel wat nuttige informatie omtrent het gebruik en de uitbreidingsmogelijkheden van de Makerbot “Thing-o-Matic”, de recentste 3D prototyping machine van Makerbot. Elektronische schema’s, overzicht van de verschillende items en onderdelen, uitbreidings IO, enz. zijn terug te vinden op het internet. Dit vergemakkelijkt het “hacken” van de sturing. Andere sturingen zoals ‘Ultimaker’ hebben op dit moment minder goede ondersteuning, waardoor de “open source”-graad iets lager ligt. Bovendien ziet de sturing van de Makerbot Thing-oMatic er vrij degelijk uit. Aan de softwarezijde lijkt het minder vlot te gaan verlopen. De programmacode bestaat uit enorm veel aparte files, die bovendien weggestopt zitten in aparte mappen. De syntax van de code zelf is op het eerste zicht vreemd: de IO-pinnen worden aangesproken via een statement, waarvan niet meteen ergens anders de achterliggende code van dat statement te vinden is. Bovendien is niet meteen duidelijk met welk programma deze code dient ingeladen te worden in de microcontroller. De uitleg op het internet is summier. Echter, er kan via contacten hulp gezocht worden. De lokale verdeler van Makerbot, stelde voor om een Thing-o-Matic (in bouwpakket) in bruikleen te geven. Zodoende kan de kennis van de machine aangescherpt worden en nog beter bepaald worden wat er voor de ombouw nodig is en wat niet. Door omstandigheden liet de levering op zich wachten, waardoor tijdelijk aan een ander project wordt gewerkt (zie Project Ballenwerper).
12
Bij aanvang van het tweede semester werd meteen gestart met de assemblage van de Thing-o-matic, die ondertussen geleverd werd. Er werden enkele producten geprint. Buiten de slechte uitlijning van de schroefspil van de Z-as (op te lossen d.m.v. het maken van sleufgaten), viel er niets op aan te merken: een duidelijke online ‘assembly manual’, inbegrip van montagetools (inwendige zeskantsleutels, …), etc. Er werd ondertussen meermaals pogingen gedaan om te code te begrijpen of om er ergens een structuur in te herkennen. Via de externe begeleider is er reeds bij aanvang van de masterproef contact met Timelab, verbonden aan Ugent. Daar houdt men zich ook bezig met het ‘hacken’ van sturingen. Een bezoek aan Timelab zelf, loste het probleem evenwel niet op. Hoewel men daar reeds Thing-o-matic toestellen heeft staan, bleek dat ook zij geen ervaring hebben met de Makerbotsturingen: men ‘hackt’ eerder “Ramps”-sturingen (RepRap). Van deze laatste kan men wel waardevolle informatie en support geven. De sourcecode van de Ramps-sturing kan worden gecompileerd en gedownload in Arduino-software. Daarenboven is er wel structuur en herkenbare syntax te herkennen. Na overleg met de begeleiders wordt uiteindelijk voor deze sturing geopteerd. Toch is de kennismaking met de Makerbot zinvol. Zowel de Makerbot als de Ramps-sturing werken met dezelfde PC-software, nl. ‘ReplicatorG’. Uittesten van deze software op de Makerbot levert gebruikservaring op, waardoor de kennismaking met het programma al reeds gebeurt is. Bovendien zal de MK7-extruder vanuit de Thing-o-matic worden gebruikt in de Genisys. Deze extruder is de meest recentste versie van Makerbot. Het kan 1,75mm-draad aan (andere varianten zijn bv. 3mm), is compact en netjes opgebouwd en wordt rechtstreeks aangedreven door een stappenmotor. Bij DC-motoren moet omwille van de lage doorvoersnelheid van de draad via een reductiekast gewerkt worden, wat speling impliceert. Hierdoor wordt de draad niet onmiddellijk teruggetrokken en dus ook het extruderen niet onmiddellijk gestopt. Daarom liggen de printresultaten bij gebruik van DC-motoren iets lager.
4.2.
Makerbot Thing-o-Matic en extruder MK7
De ‘Thing-o-matic’ is de naam van een volledige prototyping machine van Makerbot (Figuur 6). Deze gebruikt momenteel de generatie 4 elektronica voor de sturing. Deze is opgebouwd uit meerdere modules: het moederbord, meerdere stappenmotor drivers, eindeloop contacten, extruder controller en een optionele safety cutoff switch . Figuur 7 geeft een overzicht van de opbouw.
Figuur 6: Makerbot Thing-o-Matic
13
Figuur 7: Aansluitschema Thing-o-Matic
De prototyping machines evolueren steeds meer, waardoor ze steeds performanter worden. Dit is niet anders voor de extruders. De laatste versie is de MK7 extruder (Figuur 8). Deze oogt vrij degelijk, netjes en compact.
Figuur 8: Extruderkop MK7 Makerbot
Het is ook deze extruder die zal gebruikt worden, ter vervanging van de oude kop in de Genisys. De extruder-kit omvat alles wat in Figuur 8 is afgebeeld met bovendien een thermokoppel en thermiek. Deze laatste doet dienst als een laatste veiligheid, mocht de temperatuursregeling via het thermokoppel falen. 14
4.3.
RepRap RAMPS V1.4
Reprap is een acroniem voor “Replicating Rapid Prototyper”. Net als Makerbot, heeft RepRap meerdere versie en varianten van prototyping machines. Vanuit de masterproef is er echter alleen interesse in de sturing. De Ramps (Reprap Arduino Mega Pololu Shield) is een moederbord, die allerlei connectoren en randelektronica bevat en bovenop een Arduino Mega microcontroller dient geplugd te worden. Ze biedt plaats voor 5 kleine stappenmotordrivers (Pololu drivers), die rechtstreeks bovenop het bord kunnen worden geprikt. Deze zijn helaas ontoereikend qua vermogen voor de Genesys (slechts tot +- 1A). Ook mosfets om de verwarmweerstanden in de extruder en printbed aan te sturen zijn voorzien. De mosfet voor de extruder voldoet, die voor het printbed niet. Verder is het bord ontworpen om thermistoren als temperatuursensors te gebruiken. De extruderkop en printbed in de Genisys, gebruiken echter een thermokoppel, respectievelijk temperatuurs-ic om de temperatuur te meten.
Figuur 9: Ramps v1.4
De verschillende aansluitingen zijn te zien in Figuur 9. Rechts op de printplaat zijn de uitbreidingsaansluitingen te zien, waarvan in deze verhandeling gebruik zal gemaakt worden. De typische interconnectie die dient gemaakt te worden met de ‘default’ Ramps-sturing wordt weergegeven door Figuur 10.
15
Figuur 10: Aansluitschema Ramps v1.4
5. Overzicht ombouwen Genisys
5.1.
Voorzieningen ‘oude’ Genisys
Bij voorkeur wordt liefst zo veel als mogelijk gerecupereerd. De stuurkaart van de stappenmotoren bijvoorbeeld, lijkt nog steeds goed te werken. Zo ook de 33V DC-bron, de 12V transformatoren, … Tabel 2 geeft een overzicht van de huidige voorzieningen van de Genisys die al dan niet verplicht opnieuw ondersteuning vinden bij de nieuwe sturing.
16
Tabel 2: Lijst voorzieningen oude Genisys
Functie
Ondersteuning gewenst in nieuwe sturing?
magneetcontact toegangsdeur platform
ja
magneetcontact toegangsdeur patronen
Ja
2x blokkeerpin toegangsdeur platform
Ja
2x blokkeerpin toegangsdeur patronen
Ja
verlichting
Ja (manueel mag ook)
Printerkopunit met verwarming en temp.sensor
Andere extruderkop
Patroontoevoer printerkop met toebehoren
Nee
Overige toebehoren printerkop
Nee
2x homing-referentie spoelen
Nee, andere meetprocedure
temperatuursensoren op PCB's
Nee
2x ventilatoren
Ja
XYZ-stappenmotoren
Ja
enkelzijdige XYZ-eindeloopcontacten
Ja
verwarmingselement platform met temp.sensor
Ja
Onboard tranfo's/omvormers
Transfo’s niet, 33V voeding wel
Ingebouwde PC
Nee
Echter, de H-bruggen en andere elektronica zijn gebouwd op een meerlagen-PCB , in combinatie met randcomponenten, waaronder ook enkele microcontrollers. Dit maakt het zéér moeilijk (onmogelijk) om de bestaande schakeling te achterhalen en te weten te komen waar de signalen, afkomstig van de nieuwe sturing, dienen te worden geïnjecteerd. De fabrikant van de Genisys Xs, Stratasys, werd daarom gecontacteerd. Helaas kunnen zij die info niet prijsgeven, ook al wordt de Genisys inmiddels niet meer geproduceerd. Ook voor de zelfkalibratie zal een ander systeem moeten worden ontwikkeld. Het huidig systeem werkt m.b.v. 2 spoelen, links en rechts aangebracht op het platform. Tijdens het opstarten zal de machine achtereenvolgens met de printtip even boven de linker –en rechterspoel bewegen. Door de veranderende zelfinductie van de spoel geschiedt een contactloze afstandsmeting. Deze meting wordt gebruikt om de evenwijdigheid tussen platform en de loopweg van de printerkop te controleren. Tevens kan hiermee nauwkeurig het nulpunt van de Z-as worden bepaald. Er wordt sowieso voor een andere printkop geopteerd. De vulling gebeurde tot nu toe met losse patronen, die achter elkaar in een houder zitten. Een speciaal systeem zorgt er uiteindelijk voor dat de patronen onder elkaar naar de verwarmde kop worden geleidt. Daarbij houdt een niet-vluchtig EEPROM geheugen het aantal patronen in de houder bij. De Genisys is voorzien van meerdere zulke houders (12-tal), waardoor wel enige tijd kan geprint worden zonder bijvullen. Het hervullen van de houders zelf, moest echter steeds door Stratasys gebeuren (resetten EEPROM, grondstof patronen), waardoor men een zekere monopoly heeft. 17
De nieuwe kop gebruikt een draad, waardoor de aanvoer eenvoudiger een continu kan gebeuren. Deze heeft een andere vorm dan de bestaande printertip, waardoor van het huidig systeem geen gebruik meer kan gemaakt worden. Daarenboven is het huidig systeem uit losse elektronicacomponenten opgebouwd. De nieuwe sturing zou dus opnieuw volledig dezelfde componenten nodig hebben, wat bij voorkeur te vermijden is. Om veiligheidsredenen wordt tijdens het printen het toevoerluik naar de patronen en de toegangsdeur vooraan geblokkeerd. Dit gebeurt met solenoïdes of elektromagneten. Deze werken op 24Vdc en hebben een ohmse weerstand van 104Ω. Daarnaast zijn er ook voorzieningen voor licht. Dit gebeurt met 2 halogeenlampen, elk met een vermogen van 35W op 12Vdc.
5.2.
Ondersteuning voorzieningen Genisys in nieuwe sturing
De verlichting werd voorheen bediend via een toetsenbord en LCD-scherm. Beide vormden samen een interactief gebeuren met de sturing, via menu’s, aanvraag tot een bepaalde actie, enz. Om het geheel wat te vereenvoudigen, wordt besloten om voorlopig de lichten te bedienen met een eenvoudige schakelaar. Wel wordt er op de PCB voorzieningen getroffen om het licht (of een andere verbruiker) alsnog via de nieuwe sturing te bedienen. Hieronder kan men verstaan dat voorlopig die componenten niet worden gekocht en gemonteerd op de PCB. De controle op de uitlijning wordt voorlopig achterwege gelaten, aangezien dit niet het hoofddoel is. Wel worden enkele systemen bedacht. Deze kunnen terug gevonden worden onder Uitbreidingen. Er zijn heel wat zaken die niet worden ondersteunt in de nieuwe sturing, maar waarvan wel gewenst wordt dat die terug operationeel worden. Daarom wordt het onvermijdelijk om die zelf een ondersteuning te gaan geven. Daarom wordt zelf wat elektronica ontworpen en gebouwd op printplaten/PCB’s. Deze komen uitgebreid aan bod in het hoofdstuk Hardware nieuwe Genisys.
6. Project Ballenwerper
6.1.
Inleiding
6.1.1.Doel en situering In het academiejaar 2010-2011 handelde een bachelorproef zich reeds rond een ballenwerper, aangedreven door een PMAS met drive (zie Figuur 11). Er moest een studie gemaakt worden van de baanvergelijking van het balletje (daaruit volgen dan de benodigde hoeksnelheid en hoekversnelling), inertie van het mechanisch systeem, regelparameters van de drive, …
18
Figuur 11: 'Grote' opstelling
Een vervolg van dit project is het uitvoeren van de opstelling in mini-formaat (zie Figuur 12): de PMAS-motor wordt vervangen door een stappenmotor, de opvangpotjes worden uit kunststof opgebouwd m.b.v. een 3D plastic-printer en de centrale arm wordt uit plexiglas gelaserd.
Figuur 12: 'Kleine' opstelling
Er moet tenslotte ook nog een kleiner equivalent voor de frequentieomvormer voorzien worden. Vanuit de masterproef zelf is er ook vraag naar drivers voor stappenmotoren. Er werd dan ook een markstudie uitgevoerd. Menig fabrikanten werden gecontacteerd en mochten een voorstel maken van geschikte drivers op basis van de technische gegevens die hen werd medegedeeld: kenmerken gebruikte stappenmotoren, omschrijving toepassing, … De fabrikant met de beste drivers en laagste prijs zal het uiteindelijk halen. Naar het einde van de markstudie bracht dhr. Derammelaere mij in contact met een persoon van ON Semiconductor (afdeling Oudenaarde). Met het oog op de ballenwerpertjes die een grote ‘eyecatcher’-factor bezitten voor beurzen waar de fabrikant van halfgeleiders aan deelnemen, werd overeen gekomen om de drivers als demomateriaal aan de hogeschool te schenken. Er werd dan ook voor deze fabrikant gekozen. De technische verantwoordelijken aldaar hielpen om de geschikte keuze te maken in hun uitgebreid assortiment van driver-IC’s. Hoewel ON Semiconductor eigenlijk enkel halfgeleiders produceert, maakt men intern wel zelf printplaten. Zo ook de kant-en-klare driver bordjes die in deze opdracht worden gebruikt: AMIS-30421 (zie datasheet). Op de kleine printplaten zijn naast de driver-ic zelf, ook externe mosfet’s en andere componenten voorzien. Die externe mosfet’s maken het mogelijk om grotere stromen aan te kunnen (er bestaan ook driver-ic’s die interne H-bruggen hebben, maar kunnen minder grote stromen aan). Om het moment van technisch overleg is dit type IC nog niet commercieel te verkrijgen omdat ze nog maar net is uitgebracht. Wij konden wel reeds demo-bordjes verkrijgen.
19
De toelevering van de stuurelektronica voor de masterproef liet op zich wachten. Weken gingen voorbij. Daarbij werd de leverancier meerdere keren gecontacteerd. Om geen kostbare tijd verloren te laten gaan, stelde de masterproefbegeleider, dhr. Vanwallghem, voor om ondertussen dit ‘mini-ballenwerper’-project op mij te nemen. De link met de masterproef hoeft echter niet ver gezocht te worden: beide projecten werken immers met stappenmotoren, er wordt van dezelfde stappenmotor-drivers gebruik gemaakt en beide projecten worden aangestuurd vanuit een microcontroller. Het biedt tevens een goede kennismaking met de driver, als voorbereiding bij het inbouwen ervan in de 3D-printer. Het doel van het ballenwerperproject is nu om de driver van de stappenmotor op zo’n wijze aan te sturen, zodat de stappenmotor de gewenste trajecten maakt. Daarenboven zou alles compact en gebruiksvriendelijk moeten opgebouwd worden. De praktische realisatie van de stuurlogica gebeurt door een microcontroller. Een microcontroller op zich bestaat enkel uit een IC. Deze kan niet zonder extra randelementen. De Italiaanse fabrikant ‘Arduino’ heeft zich hierop toegespitst en biedt kant en klare printplaten met microcontroller en toebehoren reeds gemonteerd. De microncontroller zelf is van de fabrikant Atmel. Microcontrollers kunnen ingedeeld worden in grootte en hun ‘kunnen’, waardoor ook Arduino zijn kant en klare printplaten in een gelijkmatige manier indeelt. Het gebruikte exemplaar in de ballenwerper is de Arduino Uno (zie Figuur 13), wat de naam van de printplaat is. De gemonteerde microcontroller is in dit geval de ATmega 328P van de fabrikant Atmel. Dit is hetzelfde type als dat gebruikt wordt in het vak ‘microcontrollers’ in het eerste semester van dit masterjaar. Het vak komt dus net van pas.
Figuur 13: Arduino Uno
Een verdere ontwikkeling van dit project is een Geïntegreerde Proef dat hierop wordt toegepast. De laatstejaars van het technisch secundair onderwijs zullen van deze ballenwerpertjes gebruik maken. Er moet dus extra aandacht geschonken worden aan de gebruiksvriendelijkheid.
20
6.1.2.Vereisten project Op vraag van de EM-afdeling zouden volgende items moeten worden voorzien: JOGGEN: de stappenmotor kan aangestuurd worden met een instelbare snelheid. Beide draairichtingen moeten mogelijk zijn. HOMING: de werper moet nauwkeurig een (horizontale) positie kunnen bereiken. In deze mode moet de stappenmotor dus traag, of zelfs stap per stap aangestuurd worden. Zodra horizontaal, kan de gebruiker een drukknop (Home knop) indrukken waardoor de waarde van de 'actual position' op nul gezet wordt. Daardoor is het mogelijk om vanaf nu een absoluut traject uit te voeren t.o.v. deze nulpositie. WERPTRAJECT: In deze mode voert de motor een voor gedefinieerd traject uit: eerst een beweging naar beneden met een zekere snelheid, even wachten en daarna met een instelbare snelheid draaien tot een specifieke hoek bereikt wordt. Tot slot terugkeren naar de nulpositie. Bedoeling is dat dit traject eenvoudig kan gewijzigd worden. In deze mode wordt een balletje opgegooid en opnieuw gevangen door het andere potje. Het geheel (microcontroller, driver stappenmotor, interface ballenwerper, …) zou op een compacte manier moeten samengebouwd kunnen worden.
6.1.3.Praktische aanpak Daar sta je dan: een motor, stappenmotor-driver en een microcontroller, meer niet … Een uitdaging, maar wel een mooie EM-toepassing. Er werd eerst getracht om de nodige signalen te generen om de stappenmotor-driver aan te sturen. Pas dan kon gekeken worden om die signalen aan te sturen in functie van het traject. Aanvankelijk werd het traject telkens in de programmacode zelf geschreven. Dynamisch aanpassen van het traject was dus omslachtig en niet gebruiksvriendelijk: telkens moet de programmacode opnieuw gedownload worden. Het aanleren en installeren van de extra programmeersoftware voor nieuwe gebruikers wordt zo onvermijdelijk. In de vereisten wordt niets vermeld over de manier hoe de trajecten moeten worden ingegeven. Een eigen oplossing hiervoor werd voorgesteld: een op maat gemaakte GUI (onder de vorm van een exeprogramma). Installeren is niet nodig (kopiëren volstaat) en is bovendien intuïtief te bedienen. In de masteropleiding EM is de module ‘softwareontwikkeling’ opgenomen, waarvan nu dankbaar gebruik kan gemaakt worden. Er wordt m.b.v. Visual Studio een Grafische User Interface voorzien, alwaar het traject eenvoudig kan bijgewerkt en verstuurd worden naar de microcontroller. Het biedt ook de mogelijkheid om verschillende trajecten te bewaren en op te roepen. Tevens kan softwarematig gepositioneerd worden en wordt de statusinfo van de stappenmotordriver gevisualiseerd. De communicatie tussen PC en microcontroller brengt wel extra complexiteit met zich mee en vormt een extra uitdaging.
21
In overleg met dhr. Vanwalleghem werd beslist om het programma in het Engels te schrijven, zodat het programma door een breed publiek begrepen kan worden. Het feit dat ik ‘carte blanche’ kreeg opende wel veel perspectieven en is wellicht ook de grote reden waardoor het project in een redelijk beperkte termijn (+-10 weken) werd afgehandeld. Eerlijkheidshalve moet gezegd worden dat veel bruikbare ontwerpstrategieën werden overgenomen van een ander lopend microcontroller-project die ik in mijn vrije tijd reeds uitvoerde. Dat scheelde wel enig piekerwerk en tijd.
6.2.
Hardware ballenwerper
6.2.1.Principieel schema In Figuur 14 is het principiële schema van de ballenwerper te zien. De microcontroller communiceert met de driver via de SPI-bus (Serial Peripheral Interface) met de driver. Hier worden de algemene instellingen geconfigureerd: piekstroom, microstepping, … De driver zal per puls op de NXT-lijn effectief een stap zetten. Daarbij wordt de draairichting via de DIR-lijn geregeld. Verder zijn nog extra IO voorzien om bijvoorbeeld de driver te resetten, SLA-uitgang (=Speed and Load Angle), … Deze laatst genoemde is de bemonsterde tegen-EMK over de windingen van de stappenmotor. Het biedt onder meer de mogelijkheid om het verlies van stappen te detecteren. NXT DIR
Stappenmotor
On Semi
SPI
µcontroller Driver …
Figuur 14: Principieel schema
Er zijn echter enkele opmerkingen. Vooreerst is het logisch signaalniveau van de driver 3,3V, terwijl dat dit bij de microcontroller 5V is. Er zal dus een niveauconversie moeten plaatsvinden. Een tweede probleem is de toegeleverde spanning naar de microcontroller-print. De binnenkomende spanning wordt er lokaal wel naar 5V gereduceerd, maar is vanwege het beperkt vermogen (warmteontwikkeling) gelimiteerd tot 12V. Om een compact geheel te verkrijgen en om geen twee apart voedingen nodig te hebben, is gewenst om alles op een en dezelfde voedingsspanning (deze voor de driver: +-24V) te laten werken. Een bijkomende verlaging wordt dus noodzakelijk (zie Figuur 15). Er moet tenslotte ook drukknoppen, statusleds en regelknoppen voorzien worden om de ballenwerper te kunnen bedienen (joggen, homen, …).
22
3,3V <->5V
Stappenmotor
On Semi
Led’s, drukknoppen, regelknop, …
…
µcontroller Driver
…V->12V 24-30V Figuur 15: Principieel schema met uitbreiding
Er wordt verwacht dat alles op een ordelijke manier wordt opgebouwd. De driver en de microcontroller zijn kant en klare printen die ongeveer even groot zijn. Beide bezitten hun eigen connectoren om hun IO te verbinden. Er zal sowieso een eigen print moeten ontworpen worden waarop de extra elementen worden voorzien. Om de bediening onafhankelijk en vanop enige afstand te kunnen realiseren, zullen twee printen gemaakt worden: een ‘shield’ en een ‘interface’ (zie Figuur 16). 3,3V <->5V
Stappenmotor
On Semi µcontroller Driver
…
Led’s, drukknoppen, regelknop, …
…V->12V
“Interface” 24-30V
“Shield” Figuur 16: Shield en Interface
Het ontwerp wordt zo gemaakt, zodat de shield een tussenlaag vormt van de microcontroller naar de driver. Onderaan de shield bevinden zich de overeenkomstige connectoren van de microcontroller en bovenaan die voor de driver. De verbinding tussen microcontroller en interface geschiedt met een 14-aderige flatcable.
23
6.2.2.Shield Zoals reeds gebleken is uit voorgaande paragraaf moet de shield onder andere de niveauconversie 3,3V - 5V en het verlagen van de voedingsspanning naar 12V voor zijn rekening nemen. Daarnaast zijn nog enkele extra features die worden voorzien: een reset-knop voor de microcontroller, idem voor de driver en een optionele connector om de SLA-uitgang gemakkelijk op te kunnen meten. On Semiconductor beschikt over demokoffers waar met verschillende drivers kan geëxperimenteerd worden (zie bijlage). Ook daar moet een soortgelijke conversie tussen 3,3V en 5V plaatsvinden. Het is interessant om die realisatie te gaan bestuderen. On Semiconductor maakt voor de conversie van 5V naar 3,3V gebruik van een quad bus-buffer: MC74VHC126D. Deze bestaat zoals de naam al aangeeft uit 4 buffers, elk met tri-state uitgang. In het geval van de ballenwerper zouden we eigenlijk 6 zo’n buffers nodig hebben (zie Figuur 17), wat resulteert in minstens 2 ic’s.
(O) (I) (I) (I) (O) (I) (I) (I)
(O) (O) -> analoog!
Figuur 17: Alle mogelijke IO met microcontroller
Ik wist echter dat er ook ic’s bestaan met 6 poorten in één behuizing (zonder tri-state uitgang echter, maar is hier toch niet nodig). Even zoeken in het uitgebreid ON Semi-assortiment van logische ic’s leidde tot volgend gekozen type: MC74VHC50D (zie datasheet). Verder heeft de hex-buffer dezelfde eigenschappen als de quad-buffer: een ingangsrange tot 7V (tot 5,5V aangeraden gebruik), ook al is de voedingsspanning slechts 3,3V. De conversie van 3,3V naar 5V gebeurt met dezelfde ic’s als deze die ON Semiconductor gebruikt in hun demosets: MC74VHC1GT50D (zie datasheet). Het ontwerpen van de printen gebeurt met behulp van ‘Eagle’, een softwarepakket om PCB’s te tekenen. Alvorens het effectief tekenen van de printbanen, moet eerst een schema getekend worden. In de bibliotheek zijn reeds veel gebruikte componenten voorzien, zodat de meeste elementen enkel in het schema hoeven gesleept worden.
24
Echter, de opgesomde ic’s zitten er niet standaard in. Er wordt dan een ander ic gekozen waarvan de ic-behuizing (package) en de pin-out dezelfde zijn. De ic-naam wordt dan handmatig aangepast. Een belangrijk detail: de schematische voorstelling geeft een inverterende werking aan van de buffers, hoewel in praktijk dit niet zo is (“1” aan ingang wordt ook “1” aan uitgang)! Het volledig schema is in de bijlage weer te vinden. In de basis komt het er op neer om de juiste verbindingen te leggen tussen de connectoren, ic’s en andere componenten. Bv. de uitgangspin (in vorm van connectorpin) van de microcontroller die de NXT-pulsen genereert moet naar de ingang van een van de buffers van de MC74VHC50D lopen. Vanuit bijhorende uitgang moet de verbinding dan naar de juiste connectorpin van de driver lopen. Figuur 18 geeft een overzicht welke functie de IO-pinnen van de microcontroller vervullen. De benaming in het rood rechts op de figuur is dezelfde als deze gebruikt op de arduino-print zelf.
Figuur 18: Overzicht pin-out microcontroller
De verbindingen tussen microcontroller, buffer en drive zijn vrij rechttoe rechtaan (zie Figuur 19). De connectoren op het arduinobordje zijn gegroepeerd in rijen van 6 en 8. In het schema werden dan ook dezelfde groepen gebruikt en telkens de naam van de groep vermeld. Hiervoor werd de naam van het belangrijkste/meest kenmerkende signaal die in die groep voorkomt gebruikt (bv. “Aref”).
Figuur 19: Niveaushifting (niet inverterend!)
Het handmatig resetten van de driver gebeurt niet via de microcontroller. Daarvoor werd een drukknop op de shield voorzien. De ingangen moeten ten allen tijde een eenduidig spanningsniveau aan hun ingang zien (anders is toestand van de uitgang niet voorspelbaar). De resetingang van de drive is actief hoog.
25
Bijgevolg moet bij het niet bedienen van de drukknop de ingang laag worden. Vandaar dat een ‘pulldown’ weerstand wordt gebruikt. De waarde ervan is niet zo heel kritisch. Wel zijn er enkele aandachtspunten waar rekening mee moet worden gehouden: - vanuit ecologisch standpunt wordt best een grote waarde gekozen, zodat de onttrokken stroom bij het bedienen van de drukknop niet onnodig groot wordt. - de spanningval over deze weerstand ten gevolge van de ingangsstroom van de buffer (die echter zéér laag is dankzij de CMOS-technologie) mag niet te groot worden (ingang moet nog altijd als een “0” herkend worden). De weerstandswaarde mag dus niet enorm groot zijn. - Vanuit het perspectief van het oppikken van storingen wordt alles best laagohmig gehouden. Het systeem is dan niet zo gevoelig. Er wordt een compromis gesloten tussen de aandachtspunten en gekozen voor een standaardwaarde van 10K (Figuur 20).
Figuur 20: Reset netwerk
Hier en daar worden op de shield reeds weerstanden voorzien om bepaalde leds aan te sturen. Er zijn daar drie redenen voor: - Dankzij de aansluitingen is het mogelijk om lokaal doorverbindingen te maken tussen onderkant en bovenkant van de print - Een eventuele kortsluiting tussen signaaldraden van de flatcable of bij de interface-print, heeft verder geen gevolgen: de stroom wordt toch door de weerstanden op de shield beperkt. - Het is mogelijk om bepaalde signaalpaden te doen kruisen via deze componenten. Het vergemakkelijkt het ontwerpen van de print. Ook hier geldt dat de weerstandswaarde zelf niet kritisch is. De gebruikte leds verdragen stromen tot 20mA. Echter, de levensduur is in functie van de stroom. Voor 3mm-leds wordt 8mA gekozen. Verder is de spanningsval over een rode led bij 8mA ongeveer 1,8V (+-1,5V bij groene led). De benodigde weerstand wordt dan:
ܴௗ =
ܷ − ܷௗ,ௗ 5 − 1,8 = = 400Ω ܫௗ 0,008
Voor groen wordt dit 437,5Ω. De eerstvolgende standaardwaarde groter is 470Ω.
26
Om de jogsnelheid aan te passen wordt gebruik gemaakt van een trimmer: een kleine regelbare weerstand. Deze wordt gebruikt als een spanningsdeler. De uitgang wordt dan aangeboden aan de microcontroller die via een ADC (analoog naar digitaal converter) de spanning converteert in een binaire waarde. Om ruis te onderdrukken wordt een lage weerstandswaarde van de trimmer gekozen (zie Interface). Op de shield zelf wordt nog eens een kleine condensator voorzien. Zijn werking is tweeledig: deels om hoogfrequente ruis te onderdrukken (vormt een laagdoorlaatfilter in combinatie met trimmer), maar ze helpt ook om de uitgangsimpedantie van de trimmer te verlagen (de ADC werkt met een sample-and-hold schakeling, waarbij tijdens het opladen van een kleine condensator tijdelijke een kleine piekstroom wordt onttrokken). Een standaardwaarde van 100nF wordt gebruikt. Op de connectoren van de microcontroller is ook een ingang voorzien om de microcontroller te resetten. Bij resetten moet de pin kortgesloten worden naar de massa. Vandaar dat de resetdrukknop tussen deze pin en de massa staat opgesteld. Om de voedingsspanning naar de ic die instaat voor de 5V naar 3,3V conversie te bufferen, wordt een kleine condensator van 100nF gebruikt. Het reduceren van de toegeleverde voedingsspanning naar de microcontroller tenslotte gebeurt met behulp van een zogenaamde ‘spanningsstabilisator’. De uitgang is een vaste en constante/vlakke spanning. Dit is in eerste instantie misschien niet zo ecologisch (overtollige spanning wordt uiteindelijk in warmte omgezet) en is een dc-dc-converter een betere keuze. Echter, een dc-dcconverter vergt meer componenten en het ontwikkelde vermogen is hier eerder laag (<2W). Bovendien is een simpele stabilisator eenvoudiger, goedkoper en zeker bij elke elektronicashop te verkrijgen (enorm veel gebruikt). Daarbij komt nog dat deze een ingebouwde temperatuursbeveiliging hebben (robuust!). De waarde van de fixe uitgangsspanning is niet kritisch: maximum 12V (anders krijgen de stabilisatoren op het arduinobordje te warm), minimum 7V (minstens 2V overspanning nodig om een goede regeling van de uitgang te realiseren op het arduinobord). De standaardwaarden van mogelijke stabilisatoren zijn 9V, 10V en 12V. Als behuizing wordt TO-220 gekozen: deze kan grotere vermogens aan en is voorzien van een koelvlak om koelplaten te kunnen monteren. Uit de datasheet van de stabilisator is ook te halen dat voor een optimale werking het aan te raden is om kleine condensatoren voor en na de stabilisator te monteren: ook hier geldt een algemene standaardwaarde van 100nF (zie Figuur 21).
Figuur 21: Stabilisator
Eens het schema is getekend, kan overgegaan worden naar het ontwerpen van de print zelf. Dankzij het tekenen van het schema wordt je nu als gebruiker geassisteerd welke verbindingen getekend moeten worden. Omdat de driver-print en de microcontroller ongeveer dezelfde grootte en vorm hebben, wordt gekozen om deze boven elkaar te monteren, waardoor de positie van de connectoren reeds vastliggen. Verdere schikking van de componenten gebeurt op basis van bedieningsgemak van de drukknoppen en waar er plaats is om componenten te plaatsen (niets anders in de weg?).
27
Het is ook geweten dat hiervan uiteindelijk meerdere exemplaren zal worden gemaakt (GIP 6e jaar TSO!). Om een snellere serieproductie en montage te vergemakkelijken wordt nagestreefd om nadien zo weinig mogelijk draden te moeten monteren (zo veel mogelijk via printbanen zelf). Ook is het zo, dat door de tussenlaag-opstelling van de shield de connectoren de ene keer bovenaan moeten gesoldeerd worden en de andere keer onderaan. Een dubbelzijdige print in dus onvermijdelijk. Het biedt wel als voordeel dat via doorverbindingen tussen onderkant en bovenkant, banen gekruist kunnen worden (kans op externe draden wordt hierdoor kleiner). Die doorverbindingen tussen boven –en onderkant gebeuren tevens door middel van de aansluitingen van de componenten zelf, waardoor geen aparte doorverbindingen hoeven gemaakt worden. Wel moet aandacht worden besteed dat bij het monteren een component zowel bovenaan als onderaan wordt gesoldeerd. Een lastig karwei is het uitzoeken van de ideale paden tussen de hex buffer-ic en de connectoren. Eens een verbinding naar ingang is gekozen, ligt de verbinding van uitgang naar de andere conector onherroepelijk vast. Het komt dus vaak voor dat banen elkaar meerdere keren moeten kruisen. Tijdens het ontwerpproces worden de buffers meerdere keren onderling gewisseld (moet in het schema gebeuren), zodat uiteindelijk een optimaal resultaat ontstaat: geen enkele externe draadverbinding nodig! Alle IO, met uitzondering van 1 pin, wordt reeds gebruikt. De vrije IO-pin werd met opzet vrijgehouden. Het biedt de mogelijk om in een verder stadium van het traject, een ‘sync’-puls binnen te nemen. Dit is een trigger-signaal, waarmee de ballenwerper zijn traject onmiddellijk zal starten. Zo kan bij toepassing van meerdere ballenwerpers, waarbij balletjes van de ene naar de andere wordt gegooid, alle werpertjes op eenzelfde ogenblik gestart worden. Ondertussen is een aangepaste versie van het prototype uitgebracht. De printontwerpen van zowel het prototype als de aangepaste versie zijn in de bijlage weer te vinden.
6.2.3.Interface Een gelijkaardige procedure als de shield moet doorlopen worden om de ‘interface’-print tot stand te brengen. Zoals in Figuur 22 te zien is, moeten drukknoppen, statusleds en een trimmer op het interfacebord voorzien zijn. Het schema is vrij rechttoe rechtaan. Daar de meeste weerstanden van de leds reeds op de shield voorzien zijn, volstaat het om enkel de leds te monteren. Een uitzondering: een weerstand voor de power-led is nog niet op de shield voorzien en moet dus op de interfacebord zelf ondergebracht worden. De trimmer wordt op de +5V en gnd aangesloten en levert aan de sleper een spanning tussen 0 en 5V af. Zoals reeds aangegeven bij de shield, wordt vanwege ruisgevoeligheid een lage weerstandswaarde gekozen voor de trimmer: 1KΩ. Lagere waarden resulteren in een hoger stroomverbruik (continu op 5V aangesloten!). De gekozen waarde is opnieuw een compromis tussen ruis en verbruik. Trimmers zijn automatisch lineair (weerstandsverhouding lineair met draaihoek), wat hier ook gewenst is. Potentiometers bestaan zowel in lineaire als logaritmische verdeling (laatste vooral toegepast in audio applicaties). Opletten geblazen dat bij eventueel vervangen voor een lineair type gekozen wordt!
28
Daar de microcontroller interne pull-up stroombronnen voorziet aan de ingangen, volstaat het om de drukknoppen tussen de microcontroller-ingang en massa te plaatsen. Intern (programmatorisch) zal wel nog een invertering moeten plaatsvinden aangezien met positieve logica (“1”=actie, “0”=geen actie) gewerkt wordt.
Figuur 22: Bedrading Interface
Daarnaast is ook de connector te zien waarop de printbanen toekomen. De flatcable moet een rechte verbinding verwezenlijken, zodat pin 1 van de shield wordt verbonden met pin 1 van de interface, pin 2 met pin 2, enz. Ondertussen is een aangepaste versie van het prototype uitgebracht. De printontwerpen van zowel het prototype als de aangepaste versie zijn in de bijlage weer te vinden.
6.3.
Software microcontroller
6.3.1.Datacommunicatie De datacommunicatie van de microcontroller kan in twee hoofdgroepen worden ingedeeld: deze tussen de PC en microcontroller en deze tussen microcontroller en driver. De microcontroller is dus steeds het centrale controlerende tussenelement. Rechtstreeks communiceren tussen PC en driver is praktisch niet mogelijk (geen rechtstreekse hardware-ondersteuning voorzien).
29
6.3.2.Communicatie PC – microcontroller
6.3.2.1. Hardwareperiferie Hoe kan de communicatie tussen microcontroller en PC nu praktisch gerealiseerd worden? Het is niet dat de microcontroller voorzien is van een ethernet aansluiting of dergelijke … Wel is een USB-kabel voorzien waarmee de microcontroller wordt geprogrammeerd. Het zou op een of andere manier moeten mogelijk zijn om via die kabel te kunnen communiceren … De microcontroller heeft enkele standaard communicatieperiferie aan boord, zoals I²C, SPI en USART (uitgebreide uitleg terug te vinden in datasheet microcontroller). Om de microcontroller te programmeren wordt van deze laatste gebruik gemaakt. Een USBconverter (= kleine micrcontroller met USB periferie) die op de arduino printplaat voorzien is, communiceert dan met de microcontroller via USART. In feite kan er gesproken worden van een USBUSART-omzetter. De werking van USART is vergelijkbaar met de vroeger vaak gebruikte seriële communicatie ‘RS-232’. Echter, de signaalniveau’s zijn 0V en 5V (i.p.v. +12V en -12V) en niet alle signalen worden gebruikt: enkel de Tx-lijn en Rx-lijn worden behouden. De naam ‘USART’ staat voor Universal Synchronous and Asynchronous serial Receiver Transmitter (zoals de naam al doet vermoeden, kan de USART-blok eigenlijk ook voor synchrone communicatie gebruikt worden). De USART-blok is eigenlijk een stukje hardware die zelfstandig draait, los van de CPU. Het staat in voor signaalverwerking en het serieel verzenden en ontvangen van data. Die data wordt dan uitgewisseld met het sequentiële programma in de vorm van lezen en schrijven van en naar registers. USART is dus evenals RS-232 ‘full duplex’: zenden en ontvangen kan tegelijkertijd gebeuren.
De aangesloten USB-device, hier de microcontroller, doet zich op de PC voor als een VCP: Virtual Com Port. Het is dan alsof de pc een extra seriële poort krijgt. Hetzij virtueel, dus geen echte hardware seriële poort. In visual studio is een standaard tool (net zoals bv. buttons, checkboxen, …) voorzien om een COMpoort (= seriële poort) aan te sturen. Voor Visual Studio is er geen wezenlijk verschil tussen een fysieke COM-poort of een VCP. Wel moet de data naar de juiste poort gestuurd worden. De ‘portname’ van de COM-tool in Visual Studio moet daarom correct worden ingesteld: COM1, COM2, … De ‘portname’ waarmee de microcontroller zich aanbiedt op de PC verschilt van PC tot PC en van microcontroller tot microcontroller. Daarom moet altijd onder ‘apparaatbeheer’ gekeken worden welke naam de VCP van de microcontroller heeft. De USB-controller op de PC heeft om het USB-gedeelte te kunnen ondersteunen wel een stuurprogramma-bestand nodig (zie bijlage). Verder zijn een paar algemene afspraken nodig tussen PC en USART: met welke snelheid wordt er data verzonden? Welke pariteitscontrole? … Dit zijn instellingen voor het communicatieprotocol. De snelheid wordt ook wel de baudrate genoemd en bedraagt hier de standaardwaarde 9600 bps (bits per second). Er wordt geen pariteit gebruikt, aangezien USB op zich vrij betrouwbaar is, er geen zeer hoge baudrate gebruikt wordt en de transmissielijnen op het arduinobordje kort zijn (niet storingsgevoelig). Het kan voor een nog hogere betrouwbaarheid wel ingeschakeld worden. Daarin kan gekozen worden voor even, oneven, space, mark, … pariteit (zie internet voor meer uitleg). 30
USART op zich verzorgt dus enkel het zenden en ontvangen van byte’s (eventueel wel foutdetectie binnenin een byte mogelijk via pariteitscontrole). Daarbij zijn de zendregisters/buffers slechts 2 byte’s diep en werken via het FIFO (First In First Out) principe (wat op zich een voordeel is, aangezien de volgorde wordt gerespecteerd). Er stellen zich enkele problemen op: Probleem 1: hoe grote datapakketen (bv. te volgen trajecten) doorsluizen als communicatie enkel op byteniveau gebeurt? Probleem 2: hoe weten welke data nog bij elkaar hoort indien een byte wegvalt? Probleem 3: PC en microcontroller weten niet wanneer data precies toekomt. Hoe opvangen? Probleem 4: microcontroller moet ten allen tijde real-time werken ->wachtlussen vermijden! Probleem 5: wat als communicatie wegvalt? Uit veiligheidsredenen (oververhitting!) zou driver best geen stroom meer leveren aan motor.
6.3.2.2. Eigen datacommunicatieprotocol De opgesomde problemen in voorgaande paragraaf zijn niet onoverkomelijk, ze kunnen gelukkig opgelost worden. Daarbij wordt een eigen datacommunicatieprotocol ontwikkeld die in basis zeer eenvoudig is. ‘Eenvoudig’ omdat de dataoverdracht niet het hoofddoel van dit project is en de verwerking ervan niet veel rekentijd in beslag mag nemen. Het dataprotocol zelf kent de vorm zoals weergegeven in Figuur 23:
ID-byte
Databyte 1
…
Databyte n
Figuur 23: Dataprotocol PC-microcontroller
Het komt erop neer dat elk datapakket (welke afmetingen dan ook) moet starten met een unieke byte. Dankzij die ID-byte weet de microcontroller automatisch (zo geprogrammeerd) hoeveel byte’s zullen volgen en wat de bestemming van de navolgende data is. Eens de ID-byte ontvangen is, springt de microcontroller bij ontvangst van een volgende byte telkens naar de juist sectie. Daar staat telkens een aangepaste programma die dan effectief iets met de ontvangen data doet. Een mogelijk voorbeeld van zo’n programma, is het opnieuw samenstellen van de ontvangen byte’s tot integers (16-bit) en het resultaat daarvan telkens bewaren in een array. Na bv. de 15e byte (er werden dus 15 databytes verwacht) wordt dan de array vrijgegeven voor gebruik in het hoofdprogramma. Dit kan bijvoorbeeld in de vorm van het nemen van een kopie, wat een soort van bufferwerking voorstelt. De sectie waarnaar de microcontroller bij ontvangst van een byte telkens moet springen, wordt bijgehouden op basis van een pointer. De ID-byte stelt de pointer dus telkens in op een juiste locatie, alwaar het bijhorende verwerkingsprogramma staat. Indien het aantal verwachte bytes bereikt is, dan wordt de pointer gereset en kan een nieuwe ID ontvangen worden. Het aantal te verwachten bytes na de ID-byte kan verschillen van ID tot ID en mag ook gerust 0 zijn. Dit kan handig zijn wanneer een actie moet gebeuren, maar waar verder geen data vereist wordt. 31
De ID-byte zelf kan eender welk nummer tussen 0 en 255 zijn (grenzen inbegrepen). In het programma worden de ID’s echter voorgesteld met letters. De toekenning van een getalwaarde gebeurt door de assembler zelf op basis van de Ascii-codering (gebeurt ook voor de PC-zijde). Merk op dat de letters ‘a’ en ‘A’ twee verschillende getallen voorstellen en dat bepaalde symbolen ook opgenomen zijn in de Ascii-tabel (bv. / * - +). Een overzichtslijst van de Ascii-tabel kan gemakkelijk op internet gevonden worden, maar heeft hier verder weinig nut aangezien de assembler alle conversies voor zijn rekening neemt. Zowel verzenden als ontvangen gebeurt volgens dit zelf ontworpen protocol. Het datapakket wordt opgesplitst in byte’s die één voor één worden verzonden. Een pointer houdt bij welke byte’s reeds verzonden zijn en welke niet. Aan de andere kant worden alle byte’s ontvangen en met een pointer terug tot één pakket hersteld. Het zenden (en dus ook het periodiek updaten van de statusinfo) gebeurt om de 500ms. Deze intervaltijd is een compromis tussen wat nog echt leesbaar is voor de gebruiker en het real-time zijn van de weergegeven info. Wanneer de intervaltijd verstreken is, wordt eerst alle info verzameld: data wordt opgevraagd vanuit de driver, interne data wordt gebufferd, enz. Daarna wordt de data gecomprimeerd (overbodige data wordt weggelaten) en opgesplitst in aparte bytes. Uiteindelijk wordt alle data sequentieel verzonden, te beginnend met een ID-byte.
6.3.2.3. Data-intregriteit Hoewel de gebruikte communicatiemiddelen vrij robuust zijn, kan tijdens de dataoverdracht soms toch iets mislopen. Door storingen kan een spanningspiek op een datalijn optreden, waardoor een “0” als een “1” kan worden geïnterpreteerd. Hierdoor verandert de data-inhoud of wordt een controlebit niet correct ontvangen. In het laatste geval is het mogelijk dat de ontvangen byte door het ontvangstmechanisme wordt verworpen, aangezien de correctheid ervan op z’n minst twijfelachtig is. Een ontbrekende byte van PC naar de microcontroller is erger dan van de microcontroller naar de PC. Dit omdat de verzonden data naar de GUI eigenlijk slechts dient als visualisatie van enkele parameters van de driver en de microcontroller. Een halve seconde later wordt de data toch opnieuw bijgewerkt. Een ontbrekende byte naar de microcontroller is erger, omdat alle data sequentieel wordt verzonden. Zo zou een ontbrekende byte als gevolg kunnen hebben dat de hoekpositie van traject 1 geïnterpreteerd zou worden als de hoeksnelheid voor traject 1, de wachttijd als hoeksnelheid, enz. Het volledige ontvangen traject is dus fout. Er loopt daarom softwarematig een timer mee met de ontvangstzijde in de microcontroller. Telkens een geldige byte (d.w.z. geen fouten in dataframe, zoals een stopbit die laag is i.p.v. hoog) is ontvangen wordt de timer gereset. De PC zendt normaal alle bytes in zijn zendbuffer op volle snelheid: ‘back to back’ of anders gezegd ‘de ene na de andere’. Ontbreekt een byte, dan zal de timer niet op tijd worden gereset en een vaste waarde (eigen gedefinieerde ‘timeout’-tijd) overschrijden. De ontvangstpointer wordt dan gereset (waardoor ook het valideren en verwerken van het datapakket wordt geannuleerd). Echter, omdat een PC niet altijd gegarandeerd realtime is, is het niet 100% zeker dat de byte’s in de zendbuffer van de PC altijd ‘back to back’ zullen worden verzonden.
32
Uit veiligheid en om toch een continue werking van de microcontroller te kunnen verzekeren (dataprotocol te streng, waardoor geen uitwisseling meer gebeurt), wordt de timeout-tijd ingesteld op 3 byte-tijden i.p.v. één. Dit impliceert wel een minder goede werking. Stel dat twee datablokken meteen na elkaar worden verzonden en er één byte wegvalt, dan zal er geen fout zal ontdekt worden in het eerste blok: de ID-byte van de tweede datablok wordt als de laatste databyte van datablok 1 geïnterpreteerd. Volledig wachterdicht is het systeem dus niet. Toch is ze nodig om bij het voortijdig afbreken van de verwachte datastroom, zichzelf automatisch te herstellen. En dit zonder ondertussen te veel data verkeerd te hebben geïnterpreteerd en dus onbedoelde acties te hebben getriggerd. Het gebruikte protocol is vrij eenvoudig en bezit weinig dataoverhead of tijdsverlies door controleroutines. Een aan te raden uitbreiding die het systeem robuuster maakt, is een ‘end of datablock’-byte, die telkens op het einde van een datablok wordt verzonden (zie Figuur 24). De laatste byte moet altijd dit uniek getal zijn (geen reeds gebruikte ID-byte!). Is dit niet het geval, dan is er een byte te weinig verzonden en moet de verwerking geannuleerd worden. Een voorstel voor deze unieke byte is bv. het minteken-karakter “-“. Letters worden best vermeden, omdat deze eerder worden gebruikt als een ID-byte. Ook dit maakt het systeem niet waterdicht, maar verhoogt de foutdetectie wel aanzienlijk (startbyte per definitie nooit gelijk aan endbyte). Dit zowel voor verlies van één byte of meerdere (hoe groot is kans dat databyte toevallig hetzelfde is als endbyte …).
ID-byte
Databyte 1
…
Databyte n
EOD-byte
Figuur 24: Verbeterde protocol: EOD-byte
6.3.2.4. ‘Fail-safe’-systeem Bij connectieverlies zal het mechanisme dat de dataintegriteit waarborgt ook ingrijpen. Het voorkomt echter niet dat de driver stroom blijft sturen naar de stappenmotor. Hiervoor wordt een tweede controlesysteem geïmplementeerd: een ‘NoCom’-timer. Indien binnen de 3sec (tijd zelf te kiezen) een geldige byte is ontvangen, dan wordt de timer gereset. Indien niet, wordt de driver uitgeschakeld. Dit systeem vereist dus wel dat er om de 3sec minstens 1 byte moet ontvangen worden. Aan de PC-zijde wordt er voor de zekerheid gezorgd dat er minstens om de 1sec een byte wordt verzonden (zie Software Visual Studio). Staat er data in de zendbuffer, dan betekend dit dat er sowieso data wordt verzonden naar de microcontroller. Een ‘NoCom’-beveiliging zal dus niet optreden. Echter, indien de databuffer leeg is, moet een byte verzonden worden. En dit om de seconde. In principe kan dit eender welke byte zijn, zolang de microcontroller de ‘NoCom’-timer maar reset. Maar hij zal ook trachten die byte te decoderen (als een ID-byte), waardoor dit geen reeds gebruikte symbool mag zijn. Vandaar dat toch aan de te verzenden byte een zinvolle betekenis/waarde moet worden gegeven: de karakter “p”, afkomstig van ‘ping’. Deze legt dus ook meteen de link naar het welbekende begrip. De microcontroller zal deze byte dan herkennen en weten dat er verder niets mee hoeft te gebeuren.
33
6.3.3.Communicatie microcontroller - driver Het communicatiemiddel tussen microcontroller en driver ligt door de gekozen driver reeds vast: Serial Peripheral Interface, kortweg SPI. Gelukkig is de gebruikte microcontroller voorzien van periferie om deze communicatie te ondersteunen.
6.3.3.1. Hardwareperiferie De werking van SPI berust op het schema, weergegeven door Figuur 25.
Figuur 25: Principiele werking SPI
Zoals reeds is te zien, wordt er gebruik gemaakt van het ‘master-slave’-principe. Data wordt klaargezet in een schuifregister. Vervolgens genereert de master klokpulsen, zodat de inhoud van de slave-register bij de master terecht komt en omgekeerd. In hoofdzaak zijn 3 transmissielijnen essentieel: de klok-lijn (hierop verschijnen de door de master gegenereerde pulsen) en de 2 datalijnen voor de dataoverdracht (1 voor slave -> master en 1 voor master -> slave). Een 4de signaal-lijn is voorzien om in het geval van meerdere slaves (3 hoofdsignalen worden dan allen parallel aangesloten), de juiste slave te activeren d.m.v. bijhorende SS-lijn (Slave Select) laag te maken. De toegelaten frequentie van de klokpulsen kan zeer hoog liggen en is in het geval van de drive 1MHz. De uitgebreide voorwaarden waaraan de signalen moeten voldoen staat uitgelegd in de datasheet. De ballenwerper (master) heeft slechts één slave: de stappenmotor-drive. Het is in principe mogelijk om de SS-lijn aan de massa te hangen (slave continu geadresseerd). Echter, om bepaalde acties door te voeren, vereist de interne werking van de drive dat de SS-lijn kortstondig hoog wordt gemaakt. Continu laag maken van de signaallijn is dus niet toegestaan (zie ook Figuur 27). Door de opzet van beide lijnen is ook hier ‘full duplex’-communicatie mogelijk. Echter, het initiatief moet in tegenstelling tot USART wel altijd van de master komen: een slave zwijgt dus totdat de master hem iets vraagt (vandaar dat slave’s parallel plaatsen mogelijk is, mits aangepaste uitgangen).
34
6.3.3.2. Datacommunicatieprotocol Het algemene dataprotocol van master naar slave ziet eruit als weergegeven in Figuur 26.
Figuur 26: Dataprotocol microcontroller - driver
Eerst moet een byte worden verzonden die aangeeft welke geheugenlocatie van de slave aangesproken wordt wat het doel is (lezen of schrijven?). Een tweede byte bevat dan de effectieve data. Indien de master een byte wil verzenden, zal door de hardwareopzet altijd een uitwisseling van data plaatsvinden tussen master en slave. De data die de slave bij de transactie verzend heeft dan eigenlijk geen betekenis. Hetzelfde geldt indien de slave data verzend. Daarom is bij een leesactie de tweede databyte afkomstig van de drive van belang en bij een schrijfactie de tweede databyte van de microcontroller van belang. Aangezien het initiatief altijd van de master moet komen, is het ook hij die een transactie van data moet starten. Daarom is de eerste byte afkomstig van de microcontroller van belang. Figuur 27 stelt deze situaties voor: bovenaan een leesactie, onderaan een schrijfactie.
Figuur 27: Sequentieel verloop communicatie
Merk de info bij de stijgende flank van de CS-lijn (=SS-lijn) op: de geschreven data wordt pas in desbetreffende register geschreven als de CS-lijn terug hoog wordt. Zoals ook te zien is in Figuur 27, wordt een leesactie aangegeven met commandonummer ‘000’ en een schrijfactie met ‘100’. Om gemakkelijk te kunnen programmeren, wordt bovenaan constanten gedeclareerd zodat de registers bij naam kunnen worden aangesproken i.p.v. hun nummer. Zie ook Figuur 75 t.e.m. Figuur 77 in bijlage.
35
6.3.3.3. Data-integriteit Ook hier geldt een vrij robuuste hardware maar een bestaande mogelijkheid dat tijdens de dataoverdracht iets fout kan gaan, waardoor de informatie wordt misvormd. Om nu de data-integriteit te verhogen worden twee verschillende mechanismes toegepast. Beide mechanismes werden uit de datasheet van de driver gehaald (zie datasheet). Om er zeker van te zijn dat de geschreven data correct is, wordt steeds na het schrijven de inhoud terug opgevraagd (zie Figuur 28).
Figuur 28: Schrijf-transactie
Het controleren van de data bij leesacties is minder eenvoudig: de juiste data is niet gekend, ze wordt juist opgevraagd. Sommige geheugenlocaties (status registers 0 t.e.m. 2) hebben echter een pariteitbit in zich. De toegepaste pariteitscontrole is ‘even pariteit’: het totaal aantal enen van data en pariteitsbit zijn steeds even. Door nu na ontvangst de data op deze pariteit te controleren, wordt de data-integriteit bij deze registers verhoogd. Deze pariteitscontrole kan helaas niet voor alle geheugenlocaties uitgevoerd worden, daar zij niet allemaal een pariteitsbit bevatten. Bij de resterende leesacties waar geen pariteit is voorzien, wordt voorlopig geen controle op de integriteit uitgevoerd. Deze is alsnog implementeerbaar. Een mogelijkheid is het tweemaal lezen van dezelfde locatie. Beide ontvangen bytes moeten dan hetzelfde zijn.
6.3.3.4. Praktische implementatie SPI Aangezien de microcontroller een klokfrequentie bezit van 16MHz en een verschalingsfactor van 64 wordt ingesteld, dan gebeurt de SPI-communicatie binnen een tijd van: 4µs (periode gegenereerde klokfrequentie door microcontroller) vermenigvuldigd met 8bits/byte en 2 bytes/overdracht = 64µs/overdracht. Door het controlemechanisme van de schrijfcyclus en de mogelijke pariteitscontrole iets meer dan 128µs. Omdat de communicatiesnelheid hoog ligt en er eigenlijk tijdens die korte periodes verder toch niets wezenlijk kan ondernomen worden zonder de ontvangen informatie, wordt beslist om lokaal wel wachtcyclussen te bouwen. De duurtijd ervan is eerder beperkt (geen grootteorde ms) en in het geval van de ballenwerper toegelaten.
36
Bij het maken en uittesten werd voorlopig ‘fosc/64’ gekozen. In principe kan de gegenereerde klokfrequentie door de microcontroller nog verdubbeld worden door bit ‘SPI2X’ hoog te maken in register ‘SPSR’. Daardoor gebeurt de dataoverdracht in ruim 64µs.
6.3.4.Uitvoeren trajecten ballenwerper
6.3.4.1. Genereren NXT-pulsen Het genereren van de pulsen waarbij de driver de stappenmotor een stap laat verzetten, kortweg de NXT-pulsen, is niet zo heel eenvoudig met de microcontroller. Er moet goed over systeem van opwekking nagedacht worden omdat de frequentie hoog kan zijn (vooral wanneer bij een grote microstep-reductie grote snelheden gewenst zijn) en tegelijk nog een programma moet worden uitgevoerd. De tijdsduur tussen de opeenvolgende pulsen moeten daarbij precies (een afwijking van bv. 100µs op 1ms doet de snelheid al met 10% variëren) en variabel (bv. opschuiven vanuit pull-in gebied naar gewenste snelheid of omgekeerd) zijn. Daarbovenop is het aantal pulsen vastgelegd: afhankelijk van de gewenste positie. De microcontrollers bezit qua tijdsgerelateerde periferie over 3 ‘timers’. Dit zijn algemene modules die in verschillende modes kunnen worden uitgebaad (zie ook datasheet). Er wordt een gereserveerd voor tijdgebaseerde handelingen voor het werkend programma, waardoor er slechts 2 overblijven, net genoeg zal blijken. De timers kunnen een interrupt genereren. Een interrupt zorgt ervoor dat het normale werkingsprogramma (=hoofdprogramma) wordt onderbroken (er wordt bijgehouden welke instructie momenteel uitgevoerd werd) en naar een apart stukje code (aangeduid met Interrupt Service Routine, kortweg ISR) wordt gesprongen. Na het beëindigen van dit stukje code, wordt het hoofdprogramma hervat. In regel moet de ISR zo kort mogelijk gehouden worden, om het hoofdprogramma niet te sterk te vertragen. Een voorgesteld scenario was de volgende. Eén timermodule (bv. Timer 1) wekt zelfstandig een klokfrequentie op. De andere (Timer 0) wordt uitgebaat als een teller, waarvan de telfrequentie in te stellen is via een zogenaamde ‘prescaler’. De teller wordt initieel gereset. Wanneer de teller een vooraf ingestelde waarde overschrijdt, wordt een interrupt gegenereerd. In de ISR wordt dan timermodule 1 (en dus de klokpulsen) stopgezet. Op basis van onderstaande formule zijn dan het correcte aantal stappen met de juiste snelheid gezet:
݂݁݅ݐ݊݁ݑݍ݁ݎ1 ݆݀݅ݐ ݔ2 = #݊݁ݏ݈ݑ/ sec ݔsec = #݊݁ݏ݈ݑ Figuur 29 geeft hiervan een schematisch overzicht.
37
Timer 0
tijd
Timer 1 Nxt-output Timer 1 (frequentie)
Figuur 29: Methode 1 opwekken Nxt-pulsen
Het wordt echter moeilijk indien de frequentie van de Nxt-pulsen variabel wordt (is bv. het geval wanneer vanuit het pull-in gebied naar de gewenste hoeksnelheid wordt gegaan). Er moet dan telkens worden bijgehouden hoeveel stappen al gezet zijn binnen de beschouwde periode en hoeveel er nog gezet moeten worden (de ‘matchtijd’ van Timer 0 moet dus telkens mee veranderen). Het voordeel van deze methode is wel dat voor een vaste snelheid ( “frequentie” en “tijd” zijn dan constant), er slechts één interrupt wordt gegenereerd: wanneer de positie bereikt is.
Het ander scenario die uiteindelijk wordt gebruikt: Eén timer (Timer 0) genereert telkens een puls die zo kort mogelijk is (minimumcriteria waaraan moet voldoen opgelegd door driver). Dit om zo’n hoog mogelijke triggerfrequentie van die timer toe te laten. De drive zet immers slechts een stap bij een stijgende flank van de NXT-lijn (triggeren van de timer voordat deze afgelopen is, zou een constant hoog signaal leveren, waardoor geen stappen meer worden verzet). Een andere timer (Timer 1) wordt analoog als het eerste scenario als een teller uitgebaat, waarvan de telfrequentie in te stellen is (via zijn ‘prescaler’). Ook deze wordt initieel gereset. Bij het overschrijden van een bepaalde waarde (“match-value”), wordt een interrupt gegenereerd. In de ISR wordt dan timer 1 getriggerd (genereert een korte puls) en een nieuwe “match-value” ingeladen. Dit kan dezelfde zijn als voordien (zelfde tussenafstand pulsen en dus ook dezelfde hoeksnelheid) of verschillend (tijd tussen pulsen korter, wat een stijgende hoeksnelheid als gevolg heeft). Er wordt in de ISR ook telkens het totaal aantal te zetten stappen met 1 verlaagd, totdat de positie bereikt is (aantal te zetten stappen = 0).
38
In Figuur 30 zijn die interrupts op een tijdsas weergegeven. In de ISR wordt dan effectief de Nxt-puls gecreëerd m.b.v. Timer 0.
Timer 1 Nxt-output Timer 0
Uitvoeren ISR Uitvoeren hoofdprogramma Pulsetime Figuur 30: Methode 2 opwekken Nxt-pulsen
De groene streep in Figuur 30 geeft de duurtijd aan die de ISR nodig heeft om een nieuwe interrupttijd (=pulsetime) in te stellen, een puls te creëren, interne pointers bij te werken, enz. Bij het verlaten van de ISR wordt naar het hoofdprogramma teruggekeerd waar de CPU was weggesprongen. De code aldaar wordt verder uitgevoerd, totdat er zich opnieuw een interrupt voordoet. Dit resterend stukje tijd wordt in het rood weergegeven. Deze methode biedt als voordeel dat de hoeksnelheid variabel is, maar heeft als nadeel dat voor iedere puls naar de ISR moet worden gesprongen. Bij zeer hoge pulsfrequenties wordt dit gevaarlijk omdat deze wel eens het hoofdprogramma sterk zou kunnen vertragen. De ISR neemt immers ook enig rekenwerk in. Tijdsgebonden acties lopen dan gevaar. Daarom wordt de minimumtijd tussen 2 pulsen softwarematig gelimiteerd tot 20µs (zie Figuur 31). Het gevaar zit hem ook in de ‘overhead’ die de ISR met zich meebrengt. Vooraleer er wordt weggesprongen uit het hoofdprogramma moeten eerst enkele variabelen worden opgeslagen (return-adres, tussenresultaten, …). Daarna wordt achterhaald wat de oorzaak van de interrupt was en naar bijhorende ISR gesprongen. Dit stuk code blijft voor de gebruiker verborgen, maar neemt een niet te onderschatten tijd in beslag! Een ‘.iss’-file wordt door de compiler gegenereerd. Daarin staan onder andere de vertaalde C-commando’s naar assembler-code. Ook de ISR-overhead op assemblerniveau is er weer te vinden.
39
Interval min. 20µs! Interrupt -Laden volgende interrupttijd -Creëren puls op Nxt-pin -Bijwerken interne pointer -…
Uitvoeren hoofdprogramma Uitvoeren ISR
Figuur 31: Werking ISR i.f.v. tijd
Om de werking van de voorziene beveiligingen te bewijzen, wordt tijdelijk in het programma één codelijn geschrevenen die de vrije pin PC5/analog 5 doet toggelen. Door nu deze codelijn op uitkiende plaatsen te voorzien, kunnen controlesignalen opgewekt worden. Deze worden dan via een oscilloscoop bekeken. Figuur 32 geeft de tijdsvertraging voor het uitvoeren van instructies door de CPU weer. De eerste coderegel (als eerste uitgevoerd na de ISR-overhead) maakt het blauwe signaal hoog. De navolgende regels zorgen dan voor het updaten van de tussentijd en het opwekken zelf van de NXT-puls (rode signaal). Deze laatste bedraagt 1µs, wat boven de opgelegde minimumlimiet van 625ns is. Het duurt toch 1,44µs vanaf het begin van de ISR (te starten na de overhead en het hoog maken van het controlesignaal) eer de puls er degelijk komt.
Figuur 32: Delay ISR
40
Figuur 33 geeft de uitvoertijd voor de volledige ISR weer (overhead inbegrepen). Dit wordt gerealiseerd door één ISR-coderegel licht te wijzigen zodat de ‘match-value’ veel kleiner wordt dan het toegestane minimum. Die waarde zou een ‘match’ moeten aangeven om de 4µs. De ISR neemt sowieso meer dan 4µs in beslag. Bij het verlaten van de ISR, ziet de microcontroller dat inmiddels een onverwerkte ‘match-case’ heeft plaatsgevonden. Hij keert dan ook meteen terug naar het begin van de ISR. Door nu ook in de ISR het toggelen van de meetpin op te nemen, stelt dit ons in staat om de uitvoertijd van de ISR op te meten. Om het meten te vergemakkelijken wordt de duurtijd van de te meten signalen zo lang mogelijk gemaakt (ISR wordt maar uitgevoerd totdat de positie bereikt wordt). Praktisch komt dit erop neer om de gewenste trajecthoek maximaal te maken.
Figuur 33: Verwerkingstijd ISR
Zoals te zien is op Figuur 33, duurt het toch 16,8µs om de ISR uit te voeren. In de toekomst zou nog een stukje code hier geplaatst moeten worden om vanuit het pull-in gebied naar de gewenste snelheid te schuiven en omgekeerd. Dit zal ook enige tijd in beslag nemen. Vanuit de ‘.iss’-file is ook te zien dat een C-commando meestal zo’n 4 assembler-regels vereist. De meeste assembler-regels worden op hun beurt in 1 CPU-cyclustijd verwerkt (bij 16MHz is dit 62,5ns). Dus een C-commando neemt eigenlijk 0,25µs in beslag. Rekening houdend met het verwijderen van de C-commando ter opwekking van het controlesignaal, zouden er nog slechts 12 C-regels mogen bijkomen. De huidige limiet tussen twee pulsen en dus de ISR-tijd is immers 20µs. Daarbij moet binnen die 20µs ook nog een zinvol stukje van de tijd gebruikt worden om het hoofdprogramma uit te voeren. Lukt dit niet meer voor de uitbreiding, dan moet de opgelegde limiet van 20µs vergroot worden. De maximum te genereren frequentie en dus ook de hoeksnelheid verlaagd hierdoor. Met de huidige minimumtijd van 20µs is een maximale hoeksnelheid van iets meer dan 1400 °/sec mogelijk. De periodieke verwerkingstijd van het hoofdprogramma met interrupts wordt 20µs – 16,8µs = 3,2µs. Met een verwerkingstijd van 4 C-commando’s per µs wordt dit 12,8 instructies om de 20µs of 0,64 instructies/µs. Indien geen interrupts voorkomen, wordt het hoofdprogramma op volle snelheid (4 instructies/µs) uitgevoerd. Door de intrede van de interrupts wordt het hoofdprogramma 4/0,64 of 6,25 keer trager uitgevoerd. De vertraging is dus vrij beperkt. Echter, bij een ISR-tijd van 19,8µs, wordt dit al een factor 100!
41
Dit herhaaldelijk uitvoeren van de ISR bij een te korte tussentijd duurt totdat de gewenste positie bereikt wordt (aantal de nemen stappen wordt 0). Vanaf dan wordt de interrupt gemaskeerd en kan het hoofdprogramma effectief worden uitgevoerd. Door nu het toggelen van het controlesignaal in de routine waar de 1ms-taktpuls wordt verwerkt te laten gebeuren, kan aangetoond worden dat in deze situatie (bij een te korte tussentijd) het hoofdprogramma niet meer real-time is. Figuur 34 geeft dit dan ook aan. De aan –en uittijd van 1ms wordt hier niet gerespecteerd. De ‘aan’-tijd is hier zelfs langer dan de ‘uit’-tijd.
Figuur 34: Niet 'real-time' hoofdprogramma
Figuur 35 geeft hetzelfde signaal weer, maar nu met invoering van de beveiliging. De aan –en uittijd van 1ms wordt nu wel gevolgd, wat betekend dat het hoofdprogramma wel nog steeds op tijd wordt uitgevoerd.
Figuur 35: 'Real-time' garantie d.m.v. beveiliging
Tot zover de controle van de beveiligingen.
42
Verder wordt in de ISR ook een interne hoekpointer bijgewerkt. Bij CW wordt deze verlaagd, bij CCW verhoogd. Om nooit gegevensverlies i.v.m. positie te krijgen, wordt geopteerd om de interne hoekpointer altijd uit te drukken in de fijnst mogelijke microsteps. Omdat eigenlijk het aantal stappen wordt bijgehouden, zou er eerder van een stappen-pointer gesproken moeten worden. Echter, beide staan wel in lineair verband met elkaar. Deze pointer is noodzakelijk omdat de stappenmotor in open-loop werkt. De pointer is dus een virtuele absolute encoder: ze geeft op ieder ogenblik de positie weer van de motoras. Belangrijk is dat deze altijd overeen stemt met de werkelijke positie. Verliezen van stappen mag dus nooit voorkomen. Er zijn reeds systemen geïmplementeerd om deze zoveel als mogelijk te voorkomen (altijd starten binnen pull-in gebied, versnellen met max toegestane acceleratie, …). De absolute positie is altijd uitgedrukt in het aantal fijnste microsteps voor een hoek tussen 0° en 360°, de hoek 360° zelf niet inbegrepen: deze stelt dezelfde absolute positie voor als 0°. De reden voor deze grenzen is het feit dat berekeningen hierdoor eenvoudiger worden en dat er nooit een overflow in de pointer zou ontstaan. Daarom moet een stukje code zorgen dat deze grenzen altijd gerespecteerd worden. Zie ook Figuur 79 in de bijlage.
6.3.4.2. De functie ‘move’ Om een beweging uit te voeren moet steeds gekend zijn hoeveel pulsen (stappen) gezet moeten worden en met welke tussentijd (hoeksnelheid). De tussentijd is niet echt uitgedrukt in een tijdswaarde, maar eerder in een ‘match’-waarde waarmee in combinatie met een timer uiteindelijk een interrupt wordt gegenereerd (zie vorige paragraaf). Deze berekeningen zijn dus systeemafhankelijk en gebeuren logischerwijs in de microcontroller zelf. Commando’s binnen een trajecten worden gedefinieerd door een wenshoek in ° (absoluut t.o.v. een referentie uitgedrukt), een hoeksnelheid in °/sec, een draairichting (CW of CCW) en een wachttijd na afloop (eenheid in ms). De subroutine die wordt opgeroepen om de commando’s binnen een traject te decoderen heeft de vorm zoals in hieronder is afgebeeld.
Hierbij moet worden opgepast dat voor de dataoverdracht redenen de hoek (die een cijfer na de komma bevat) vooraf werd vertienvoudigd. Terugdelen moet dus nog gebeuren. Hoeveel stappen (pulsen) er nu gezet moeten worden hangt af van welke relatieve hoek gemaakt moet worden, wat het aantal full-steps van de motor is en welke microstepfactor gebruikt wordt. Door deze laatste is de nauwkeurigheid van de te maken hoek variabel. Vandaar dat om gegevensverlies te voorkomen, alle hoeken altijd worden uitgedrukt in de fijnst mogelijke microstep.
Figuur 36 geeft een algemeen overzicht van de functie ‘Move’.
43
*Updaten microstep en berekenen aantal fijne stappen per NXT-puls *Opsplitsen gewenste hoek in aantal volledige omwentelingen en een hoek tussen 0° en 360° *Berekenen relatieve hoekverdraaiing t.o.v. de actuele positie (negatief betekent terug keren) *Berekenen complementaire hoek indien negatief (defaultrichting is immers steeds CCW) *Berekenen complementaire hoek indien andere draairichting gekozen wordt *Bijtellen aantal volledige omwentelingen aan het aantal te nemen stappen *Berekenen tussentijd NXT-pulsen zodat hoeksnelheid voldoet aan wenswaarde Enkel indien aantal te nemen stappen groter of gelijk is aan het aantal fijnste stappen dat genomen wordt per NXT-puls!
*Begrenzen minimumtijd tussen NXT-pulsen om continuïteit programma te waarborgen *Limiteren max startsnelheid (binnen pull-in karakteristiek blijven!) *Dir-uitgang hoog of laag maken, naargelang gewenste draairichting: CW of CCW
Figuur 36: Overzicht 'Move'-functie
Eens een deeltraject is gestart, mag de microstepfactor niet meer aangepast worden. Om de verandering toch door te kunnen voeren, wordt via een boolean aangegeven dat een update beschikbaar is. Wanneer een verandering van de microstep is toegelaten (hier dus), dan wordt deze update doorgevoerd. Op basis van de (nieuwe) huidige microstep-factor, wordt dan berekend met hoeveel fijnst mogelijke stappen één NXT-puls overeen komt. In de ISR wordt met deze waarde de interne hoekpointer telkens verhoogd of verlaagd.
Vervolgens wordt de gewenste hoek opgesplitst in een aantal volledige omwentelingen en een resthoek. Daarbij wordt de hoek ook teruggerekend naar de oorspronkelijke waarde (delen door 10). 44
Dit omdat bij het verzenden gebruik wordt gemaakt van gehele getallen en de hoekwaarde in de GUI één cijfer na de komma bevat. In het geval van de ballenwerper wordt een motor met 200 fullsteps gebruikt en is de fijnste microstepfactor 64x. Een volledige omwenteling komt dan overeen met 200stappen/360° * 360° * 64 microsteps/stap, ofwel 12800 fijne stappen. Vervolgens wordt op basis van de gewenste hoek en de huidige positie de vereiste relatieve hoekverplaatsing berekend. Een negatieve hoek betekend dat er in principe teruggekeerd moet worden. Omdat de defaultrichting CCW is, wordt in dat geval dezelfde eindhoek bereikt door middel van ‘door te draaien’. Het berekenen van de complementaire hoek is daarom vereist. Een bijkomend voordeel is dat vanaf deze programmalijn, de relatieve hoek (= het aantal te nemen stappen) nu altijd positief is. De ISR vereist dit, omdat het bereiken van de positie wordt aangegeven met een aantal te nemen stappen gelijk aan 0 (het aantal te nemen stappen wordt telkens met 1 verminderd). Indien toch een andere draairichting gewenst is, wordt alsnog de complementaire hoek berekend. Deze blijft dankzij de opzet steeds positief. Nadien worden het aantal volledige omwentelingen aan het aantal te nemen stappen toegevoegd. Omdat nu de effectieve microstepfactor variabel is, moet eerst worden nagegaan of het effectief aantal te zetten stappen wel degelijk groter of gelijk aan het aantal dat wordt genomen per NXT-puls. Stel even dat een relatieve verplaatsing van 0,5° gewenst wordt, maar door de microstepfactor slechts een nauwkeurigheid van 1° mogelijk is. In dat geval zullen geen stappen worden gezet. De wachttijd wordt gerespecteerd en een volgende commando kan na afloop uitgevoerd worden. Indien wel stappen kunnen worden verzet, dan wordt de tussentijd tussen twee NXT-pulsen berekend om te voldoen aan de gewenste hoeksnelheid. Daarbij worden volgende formules gebruikt. De hoeksnelheid is ook te definiëren als de afgelegde hoek tussen 2 opeenvolgende pulsen gedeeld door de tussentijd:
݈݁݊ݏ݇݁ܪℎ݁݅݀ =
݈݂݁݀݃݁݁݃ܣℎ݇݁ ݆ܶ݀݅ݐ݊݁ݏݏݑ
Met de afgelegde hoek tussen 2 opeenvolgende pulsen:
݈݂݁݀݃݁݁݃ܣℎ= ݇݁
360° #݂ ݏ݁ݐݏ݈݈ݑ. ݉݅ܿݎݐ݂ܿܽ݁ݐݏݎ
De tussentijd wordt dan:
ܶ= ݆݀݅ݐ݊݁ݏݏݑ
360° 1 . ܽܽ݊ ݏ݁ݐݏ݈݈ݑ݂ ݈ܽݐ. ݉݅ܿ ݃݊݅݁ݐݏݎℎ݈݁݊ݏ݇݁ℎ݁݅݀
45
Het aantal fullsteps is in het geval van de ballenwerper 200 stappen per omwenteling en afhankelijk van de gebruikte motor. De werkelijke formule houdt nog rekening met het feit dat de gebruikte eenheid ‘µs’ is i.p.v. ‘sec’ en dat de timer in combinatie met een prescaler wordt gebruikt (vandaar factor 4 en verminderen eindresultaat met 1). Meer uitleg van timer en prescaler is in de datasheet van de microcontroller te vinden. Zie ook Figuur 80 en Figuur 81 in bijlage. Als laatste wordt de tussentijd begrensd: deze mag niet kleiner zijn dan 20µs (‘MaxSpeed’: waarborgen continuïteit hoofdprogramma) en mag initieel niet korter zijn dan de toegelaten ‘StartSpeed’, wat ervoor zorgt dat gestart wordt binnen het pull-in gebied van de motor. Omdat de gegevens van de motor voorlopig nog niet gekend zijn, wordt de begrenzing van de pull-in overbrugd (eenzelfde waarde als ‘StartSpeed’). Deze kan in een verder stadium juist ingesteld worden. Dit vereist ook dat een routine in de ISR wordt geschreven die de tussentijd steeds korter zal maken totdat de gewenste hoeksnelheid wordt bereikt. Vertragen moet op een analoge manier gebeuren. Voorlopig ontbreekt zo’n routine nog binnen de ISR (wel een voorbeeld in commentaar geschreven). Het moeilijke is dat het motorkoppel ook afneemt i.f.v. de hoeksnelheid. Een goede en vooral korte (continuïteit hoofdprogramma!) regelstrategie moet nog bedacht worden.
6.3.4.3. Manueel positioneren Het manueel positioneren omvat volgende features: joggen in twee richtingen (stap-voor-stap en continu), homen en refereren. Deze voorzieningen kunnen pas uitgevoerd worden indien geen traject wordt uitgevoerd. Is dit wel het geval, dan moet eerst het traject gestopt worden. Het positioneren is zowel hardwarematig (in de vorm van drukknoppen) als softwarematig (via GUI) mogelijk. Alle trajecten worden gebaseerd op een vaste referentielijn: 0°. Aangezien de stappenmotor een open-loop mechanisme is, weet de microcontroller na opstarten niet waar de motor precies staat. Hij gaat er voorlopig van uit dat deze reeds op 0° staat (is daarom niet echt zo). Om nu toch manueel de motoras nauwkeurig op 0° te kunnen positioneren, zijn de jogknoppen voorzien (zie ook
46
Vereisten project). Via een trimmer kan de jogsnelheid ingesteld worden. Omdat het aantal IOpinnen beperkt is, wordt de trimmer ook gebruikt om te schakelen tussen stap-voor-stap joggen of continu draaien. Staat de trimmer tussen 0° en 16°, dan wordt gejogd in een ‘stap-voor-stap’-mode. Bedienen van de jog-knop (CW of CCW), zal de motor met 1 stap doen verdraaien. De stapgrootte hangt af van de gekozen microstepfactor en het aantal fullsteps van de motor. Hoe fijner gejogd moet worden, hoe groter de microstepfactor gekozen moet worden.
Indien de trimmer op een hoek groter dan 16° staat ingesteld (slaghoek trimmer tot +-270°), dan zal bij indrukken van de jog-knop (CW of CCW) de motor continu draaien. De hoeksnelheid is vanaf dan evenredig met de trimmerstand (en de microstep-resolutie). Om een grenseffect waarbij de trimmer net wel en net geen 16° bereikt - waarbij een slechte jogwerking zou kunnen optreden - te vermijden, wordt een soort van hysterese ingebouwd. Daarbij wordt wel de lineariteit van de jogsnelheid gewaarborgd (zie code in bijlage). Het homen omvat de functionaliteit om de motoras naar de referentielijn (0°) te brengen. Dit kan gebruikt worden als controlemiddel om verlies van stappen te detecteren of voor andere doeleinden. Daarbij wordt dankbaar gebruik gemaakt van de functie ‘move’ (zie voorgaande paragraaf). Het refereren zelf tenslotte houdt niets anders in dan de interne hoekencoder te resetten (= instellen op 0°). Verder zijn nog een drietal drukknoppen en enkele statusleds voorzien om de driver manueel aan of uit te schakelen, trajecten te starten en te stoppen en het laatst ontvangen traject in het EEPROMgeheugen op te slaan. De statusleds geven dan de ‘aan’-toestand weer van de driver, de indicatie dat een traject wordt uitgevoerd en dat een traject wordt opgeslagen.
6.3.5.Algemene structuur microcontrollerprogramma De volgorde van de programmacode zoals ze in de bijlage is weergegeven, is op te delen zoals Figuur 37weergeeft.
-Verwijzen naar include’s
-Declareren constanten
-Aanmaken globale variabelen
-Definiëren functies
-Hoofdprogramma Figuur 37: Sequentie geschreven programma in Eclipse
47
De echte werkingsstructuur zelf gebeurt op basis van Figuur 38. Bij het opstarten worden allerhande zaken geïnitialiseerd (instellen USART, definiëren in -en uitgangen, …). Dit hoeft slechts eenmaal te gebeuren. Het hoofdprogramma zelf moet echter continu worden uitgevoerd.
Initialiseer/opstart-routine
Werkings programma
Figuur 38: Principiële werkingsstructuur
Figuur 39 geeft dan een volledig overzicht van het microcontrollerprogramma. Dit zou moeten helpen om door de lange programmacode te worstelen.
48
*Instellen in –en uitgangen *Configureren timers, USART, SPI, EEPROM *Initialiseren specifieke globale variabelen *Laden van opgeslagen traject uit geheugen
*Updaten algemene statusled’s “DriveOn” en “TrajectBusy” *Starten nieuwe AD-conversie indien vorige conversie klaar *Updaten nieuwe microstep indien beschikbaar en toegelaten *Verlagen stroom indien positie bereikt (enkel in jog –en homemodus) *Controle en ingrijpen op timeout in dataontvangst op byteniveau en packet-niveau *Inlezen, verwerking en herstellen individuele byte’s tot gehele datapacket *Verzamelen, comprimeren en doorsturen statusinfo naar PC (om de 500ms) *Bijwerken timevariabelen en drukknoppen inlezen via anti-dender methode *Acties op basis van bediening drukknoppen (al dan niet enkel op stijgende flanken) *Bijwerken traject indien toegestaan
*Uitvoeren van ieder deeltraject uit lijst gehele traject
Figuur 39: Blokschema werking ballenwerper
49
6.4.
Software Visual Studio
De GUI moet zo gebruiksvriendelijk en robuust mogelijk gemaakt worden. Dit blijft een hoofdgedachte doorheen het programmeren. Hoewel heel wat zaken gezien werden in ‘Softwareontwikkeling’ en ‘CSD1’, is bijlange na niet alles gezien. Er komt dan ook heel wat zelfstudie en ‘trial and error’ bij te pas. De form bevat alle noodzakelijke tools om een eenvoudige bediening en weergave toe te laten. Het probleem is echter wel dat het aantal deeltrajecten of commando’s variabel is. Er wordt standaard 4 deeltrajecten aangeboden, maar via een extra knop kan telkens een nieuwe regel onderaan worden bijgevoegd. Via de scrollbar rechts kan genavigeerd worden tussen de verschillende deeltrajecten. Om het geheel ietwat onafhankelijk van de gebruikte motor te maken, wordt een config-file gebruikt om typische algemene motorinstellingen te bewaren. Hier zijn dat de ‘MaxCurIndex’ en de ‘MaxInRushCurIndex’. Deze laatste bevat wel een foutieve vertaling van “ruststroom”, maar wordt niet aangepast om de compatibiliteit van eerder uitgebrachte versies te behouden. Een beter begrip was misschien ‘MaxStandByCurIndex’. De twee begrippen staan in voor een begrenzing van de motorstroom. Zo kan de gebruiker nooit iets verkeerd doen. Bij het opstarten van de exe-programma worden de bijhorende waarden opgevraagd via de hulpclass ‘globals’. Eventueel aanpassen van deze indexen is mogelijk via ‘kladblok’ of ’notepad’. De index is nul gebaseerd en staat voor de volgorde waarin de stroom voorkomt in de drop-down boxen (bovenaan = index 0). Ook wordt om een grotere flexibiliteit van het programma te realiseren, de COM-module die instaat voor de datacommunicatie naar de microcontroller volledig instelbaar voor de gebruiker. Normaal worden alle instellingen correct ingesteld bij opstarten van het programma en is een apart invoer voorzien voor de COM-poort zelf. Toch is het eventueel mogelijk om bijkomende instellingen te maken. Daarbij wordt gebruik gemaakt van een tweede form die dan wordt opgeroepen. Daarin staat een tool die de eigenschappen van de COM-module weergeeft. Om geen nodeloos dataverkeer te verkrijgen en de mogelijkheid te bieden om eerst alle instellingen te maken voor aleer door te sturen naar de micrcontroller, worden de instellingen pas doorgestuurd nadat op de ‘upload’-knop wordt geklikt. Bij ‘Update Parameters’ worden enkel de stroom –en microstepinstellingen doorgezonden, terwijl bij ‘Upload Traject’ dit zowel het traject als de stroom – en microstepinstellingen zijn. Telkens een verandering is doorgevoerd, moeten de veranderingen steeds doorgestuurd worden door op de juiste knop te klikken! Om een gebruiksvriendelijker ontwerp te krijgen en features te voorzien die standaard zijn bij officeprogramma’s, wordt ervoor gekozen om telkens de gegevens net voor sluiten van het programma te bewaren. Een volgende keer bij het openen van het exe-programma worden de gegevens terug opgehaald en ingevuld in de form. Ook wordt de mogelijkheid geboden om trajecten samen met de algemene stroom en microstep-instelling te bewaren. Om het bewaren van de gegevens en de uitwisseling ervan gemakkelijker te laten verlopen, wordt gebruik gemaakt van XML-files. Het gebruik ervan wordt wel aangeleerd in ‘CSD2”, maar wordt helaas niet gevolgd door de studierichting EMEM. Mits inschrijven op de cursus en zelfstudie wordt het gebruik ervan wel mogelijk. Een algemene werkingsstructuur visueel voorstellen ligt hier moeilijker. Alles wordt ‘event’-gestuurd. Een subroutine, functie, … wordt enkel uitgevoerd bij het bedienen van een knop, aflopen van een timer, … Een vaste uitvoeringsvolgorde is moeilijk te voorspellen. Wel zijn er zaken die steeds eerst uitgevoerd worden (“form load”) of steeds laatst (“form closing”).
50
6.5.
Opmerkingen/verbeteringen prototype
Tijdens de testfase van de prototype werd een van de ‘3,3V naar 5V’-buffers defect (reden hiervoor nog steeds onbekend). Spanningsloos uitmeten voorgaf deed echter geen problemen vermoeden. Bij het aanleggen van de voedingsspanning ontstaat een kortsluiting van de ingang naar de positieve voedingsspanning. Dit in combinatie met een uitgang van de driver die laag wordt, resulteerde in het stukgaan van de driver-IC. Opdat dit voorval nooit meer zou voorkomen, wordt een weerstand tussen in –en uitgang van buffer respectievelijk driver geschakeld. Daardoor verliest de tussenliggende buffer eigenlijk zijn doel, aangezien de weerstand tegelijk ook de rol van niveaushifter vervult. De buffer wordt dan ook weggelaten. Bij een eventuele fout (kortsluiting ingang of verkeerdelijk definiëren van IO-pin tot uitgang) zal deze de kortsluitstroom beperken, zonder verdere nefaste gevolgen. Door het invoeren van deze weerstand wordt er inherent een RC-filter gebouwd tussen uitgang en ingang (deze bezit een zekere ingangscapaciteit). Dit wordt gevaarlijk met de hoge SPI-communicatiesnelheid. In het ontwerp werd hiermee rekening gehouden door een evenwicht te zoeken tussen een lage weerstandswaarde en een aanvaardbare toegelaten kortsluitstroom. De rode led werd voorheen aangesloten op de actief lage ‘ERRB’-uitgang van de driver (via buffer). Echter, aangezien door het continu afvragen van de fout-registers (voor melding op GUI), worden de fouten automatisch bevestigd (“acknowledged”). De foutstatus verdwijnt dan en de ‘ERRB’-uitgang wordt weer meteen hoog. Hierdoor brandt de led slechts zeer kortstondig, waardoor er geen relevante signalisatie meer is. Enkele componenten krijgen een andere schikking omdat de aansluitingen van de twee drukknoppen op de shield te dicht bij USB-connector van het onderliggend arduinobordje zaten en er kans was op kortsluiting indien de shield niet zorgvuldig (mooi evenwijdig) gemonteerd werd. Een papieren scheidingsblad bood wel een eerste bescherming hiervoor, maar was eigenlijk slechts een tussenoplossing. Omwille van de andere schikking (t.g.v. het verplaatsen van de twee drukknoppen), moet de stabilisator ook anders gemonteerd worden. Hierbij wordt meteen de mogelijkheid voorzien om de stabilisator plat te monteren. Het printoppervlak kan eventueel dienst doen als een kleine koelplaat. Door een andere schikking van de printbanen en door het verhuizen van enkele componenten van de Interface naar de Shield, kunnen lokaal overbruggingen gemaakt worden die vooraf niet mogelijk waren. Er kwam daardoor meer plaats vrij, waardoor banen iets dikker gekozen konden worden en daardoor de kans op afpelen kleiner wordt.
6.6.
Besluit project ballenwerper
Alle vereiste doelstellingen zijn bereikt. Meer nog, enkele extra voorzieningen werden geïmplementeerd. Bovendien is het geheel compact en gemakkelijk te bedienen. Op Figuur 40 is het eindresultaat van het prototype te zien. De printplaten werden ontwikkeld en gebouwd in de hogeschool zelf, met de zeer gewaardeerde hulp van Mevr. Sweertvaegher.
51
Figuur 40: Praktische uitvoering shield en interface
De lay-out van de Grafische User Interface is te zien op Figuur 41.
Figuur 41: De GUI
52
De hardware (printplaten, drukknoppen) is volledig in orde. Ook de software voldoet. Hieraan kan achteraf altijd nog gesleuteld worden, wat ook het grote voordeel eraan is. Onderstaande zaken zijn geen tekortkomingen van het project. Wel zijn ze enkele punten waar nog verbetering mogelijk is. Een eerste punt van verbetering is het (sterk) verhogen van de data-integriteit door het invoeren van een ‘End Of Datablock’-byte (zie Datacommunicatie). Een tweede punt is de mogelijkheid om de SPI-communicatie dubbel zo snel te laten verlopen. Vereist is dit niet, het huidige systeem werkt prima onder de gekozen snelheid. Een derde mogelijk punt is het implementeren dat trajecten enkel kunnen gestart worden indien de driver is ingeschakeld. Nu kan een traject in principe gestart worden eer de driver wordt ingeschakeld. De microcontroller denkt dat de motor meebeweegt, hoewel deze in het echt stilstaat. De interne encoder geeft dus eigenlijk foutieve informatie door. Een geoptimaliseerde code om langzaam van het pull-in naar de gewenste snelheid (verondersteld in het pull-out gebied te liggen) te gaan en omgekeerd is er nog niet. Dit is een vierde punt waar verbetering mogelijk is. Er moet wel opgepast worden dat het ontwikkelde motorkoppel ook daalt met hoeksnelheid. Het regelalgoritme moet hiermee rekening houden. Voorlopig werd de begrenzing voor opstarten binnen het pull-in overbrugd door de max toegelaten startspeed een waarde te geven, gelijk aan de max speed (=20µs). Deze moet echter nog een correcte waarde krijgen en hangt af van de gebruikte motor. Aanpassen van deze waarde vereist wel dat ook een goede regeling van pull-in naar de wenswaarde wordt geïmplementeerd binnen de ISR.
Een extra voorziene feature die voorlopig nog niet werkt is het opslaan van een traject in het EEPROM-geheugen van de microcontroller. Dit is een niet vluchtig geheugen, waardoor ook demonstratie van een traject mogelijk is zonder PC. De reden waarom dit niet werkte werd gevonden na het beëindigen van het project: een bit moet hoog gemaakt worden binnen 4 klok-cylcussen nadat een andere wordt geset. Aangezien de C-taal meestal 4 assembler-regels vergt, werd deze limiettijd nooit gehaald. Er zal dus een deel in assemblercode geschreven moeten worden. Het testen daarvan verkeerd nog in een experimentele fase, waardoor een correcte werking van de voorziene code die momenteel in commentaar staat niet gegarandeerd wordt.
Als laatste nog even dit: er wordt met opzet één IO-pin niet gebruikt: PC5 (analog 5). Deze is overgelaten ten behoeve het binnennemen van een ‘sync’-puls: alle ballenwerpers zullen dan op hetzelfde ogenblik hun traject starten bij het hoog worden van deze ingang. Handig als meerdere werpertjes ballen naar elkaar moeten gooien. Het staat echter volledig vrij wat er met deze IO-pin nu precies gebeurt.
53
6.7.
Opstart manual ballenwerper
6.7.1.Opstartprocedure De ballenwerper kan op twee manieren bediend worden: via de GUI of via de Interface of via beide. Het continu joggen is voorlopig enkel mogelijk mits aansluiten van de Interface, omdat hiervoor de aanwezigheid van de trimmer wordt vereist. -
Sluit de Interface aan indien manueel bedienen van de ballenwerper gewenst is.
-
Sluit de voedingsspanning (30V max) aan op de voorziene connectoren op de stappenmotordriver van de ballenwerper. Let op de polariteit!
-
Indien nieuwe trajecten geladen moeten worden of joggen via de GUI gewenst wordt, dan dient de ballenwerper met de PC verbonden te worden via de voorziene USB aansluiting. Controleer daarbij de naam van de virtuele COM-poort (via configuratiescherm, apparaatbeheer, …).
-
Open de GUI. Tijdens het opstarten worden automatisch alle beschikbare poorten in de keuzelijst geladen. Deze lijst kan manueel worden geüpdate via bijhorende knop (handig indien de USB werd ingeplugd nadat de GUI werd opgestart). Kies daaruit de correcte COMpoort waarop de ballenwerper aangesloten is.
-
Open de connectie naar de microcontroller m.b.v. bijhorende knop.
Start de trajecten slechts nadat de drive stroom levert. De microcontroller denkt anders dat de motor draait en laat de interne encoder meelopen, terwijl in het echt de motor stil staat. De GUI biedt ook een beknopt overzicht van de knoppen en invoerkaders. Zie ‘Help’ -> ‘Uitleg Ballenwerper’.
6.7.2.Troubleshooting Let er op dat de driver van spanning is voorzien voordat de USB in de PC wordt geplugd. Bij opstarten wordt de driver immers geïnitialiseerd. Indien de driver tijdens deze fase spanningsloos is, worden deze instellingen niet doorgevoerd. Was dit toch het geval, dan kan eenvoudig via het resetten van de microcontroller (drukknop voorzien op de shield) de initialisatiecyclus opnieuw uitgevoerd worden. Trajecten die tot dan toe geüpload waren gaan mogelijks wel verloren. Zorg dat de stappenmotor correct aangesloten is, anders zal de driver een fout geven en niet willen starten. De twee uiteinden van een motorwikkeling moeten volledig worden aangesloten op ofwel de X-klemmen ofwel op de Y-klemmen. Niet een uiteinde op een X-klem en de andere op een Y-klem. Het resetten van de driver en vervolgens van de microcontroller zou altijd een fout-situatie moeten beëindigen, mits de oorzaak van de fout weggenomen wordt.
54
7. Hardware nieuwe Genisys De algemene ontwerpprocedure is volledig analoog als dat van de ballenwerper. Ook hier dienen eerst de schema’s getekend te worden in Eagle, waarna er geassisteerd wordt bij het tekenen van de printbanen zelf. De versie van Eagle die gebruikt wordt, is freeware. Dit betekend dat er enkele beperkingen op het pakket zitten. De beperkte grootte van de printplaat is daar een voorbeeld van. Het is ook met die reden dat de extra elektronica wordt gehuisvest op meerdere aparte printplaten. Een gunstig effect hiervan, is de modulaire opbouw van het geheel. De volledige schema’s zijn tevens in de bijlage weer te vinden. Verder, is in tegenstelling tot de ballenwerper, hier geen reden om dubbelzijdige printplaten te gebruiken.
7.1.
Amis-converter
Er wordt met dezelfde stappenmotordrivers gewerkt als bij de ballenwerper. Dus ook hier zal een 5V3,3V conversie moeten plaatsvinden. Zoals te verwachten is, gebeurt dit met hoofdzakelijk dezelfde componenten. De 5V naar 3,3V conversie gebeurt nog steeds met hex-buffer MC74VHC50D. Voor de 3,3V naar 5V conversie echter, wordt hier gekozen voor de MC74VHC1G07D. Dit is een vergelijkbare single buffer als de MC74VHC1GT50D, maar dan met een ‘open-drain’ outputtype. Zo kan met meerdere uitgangen een hardwarematige OF-functie gebouwd worden. De slave’s, die op de SPI-bus zijn aangesloten, moeten immers kunnen communiceren zonder elkaar te storen (zie ook datasheet AMIS 30421 voor meer uitleg over het doel van ‘open-drain’ uitgangen). In de tijdspanne vanaf de ‘release’ van versie 2 van de ballenwerper tot het ontwerpmoment, is inmiddels bekend dat er 2 ballenwerpers stuk zijn. Telkens bleek een buffer het begeven te hebben. Bij één ballenwerper was daardoor zelfs de microcontroller stuk gegaan! On Semiconductor werd hiervan op de hoogte gesteld. Zij konden de oorzaak niet verklaren. Zelf hebben ze nog geen problemen ondervonden. De buffers zijn opgebouwd met CMOS-technologie, waarvan bekend is dat het vrij gevoelig is voor statische ontladingen (ESD). Hoewel intern wel protectienetwerkjes voorzien, moet toch sowieso omzichtig met de devices worden omgegaan (worden in speciale anti-statische zakjes verpakt). Vanuit persoonlijk inzicht, dient de vermoedelijke oorzaak van het falen van de buffers bij de connectoren van de ballenwerper gezocht worden. De ingangen van de buffers maken immers direct contact met de connectorpinnen. In losgeklikte toestand kan via aanraking een statische ontlading plaatsvinden, waardoor een buffer stuk gaat. Bij de demoboard van On Semiconductor, waar men van dezelfde devices gebruik maakt, is slechts één connector voorzien: tussen het demoboard zelf en de AMIS-driver. Ter hoogte van die connector gebeurt daarenboven de meeste communicatie naar de AMIS-drivers (merendeel buffer-outputs), waardoor de kans op het defect gaan van een buffer heel wat kleiner wordt. Dit zou kunnen verklaren waarom On Semiconductor geen problemen heeft ondervonden. Om nooit meer een kettingreactie van defecten te krijgen als één onderdeel het begeeft, wordt in het nieuwe ontwerp weerstanden in de signaallijnen voorzien. Soms worden in schema’s dergelijke weerstanden (typisch 100Ω, maar hangt van applicatie tot applicatie af) gebruikt om de statische gevoeligheid te doen dalen, wat meteen een dubbel nut aan de weerstanden geeft. In de datasheet van de AMIS 30421 staat niets expliciet vermeld over max uitgangsstroom van een digitale uitgang. Wel staat er data vermeld, waaronder als testcondities 8mA wordt genomen als uitgangsstroom. Er wordt aangenomen dat 10mA (=vrij courante waarde) de max toegelaten uitgangsstroom van een AMIS-driver is, zonder nefaste gevolgen. Bij een defecte buffer (lees: in kortsluiting) en een bijhorende voedingsspanning van 3,3V, wordt de minimale weerstand 330Ω. 55
Dit is meteen ook een gangbare waarde die te verkrijgen is. Die 330Ω is de ondergrens (max stroom van 10mA). Aan de andere kan mag er ook niet veel hoger gegaan worden, wegens het inherente RCgedrag (parasitaire capaciteit ingangen)! Figuur 42 geeft hiervan het schema. De aansluitingen links lopen naar de AMIS-drivers, deze rechts worden via een IDC-connector verbonden aan de “PowerPCB”.
Figuur 42: Protectienetwerk bij kortsluitfout ingang single buffer
Om de stroom te beperken indien een ingang van de microcontroller per ongeluk als uitgang wordt geconfigureerd, wordt ook hier een weerstand in de signaallijn opgenomen. De buffers zelf mogen max 20mA afleveren, waardoor met een voedingsspanning van 5V een gangbare weerstandswaarde van 270Ω wordt bekomen. Deze worden voorzien op de “Power-PCB”. (zie Power PCB). De max uitgangsstroom van de microcontroller ligt veel hoger: max 40 à 50mA. Om de kortsluitstroom bij een fout aan de ingang van de buffers te beperken, is bij 5V een weerstand van 100 à 125Ω nodig. Om het hogere stroomverbruik wat verder in te perken en omwille van het gemak en de eenvoud wordt voor alle weerstanden 330 ohm gekozen. Bij een kortsluitfout op 3,3V wordt de max stroom dan 10mA, bij 5V is deze 15mA. Figuur 43 toont de stroombeperkende weerstanden bij een kortsluitfout van de hex-buffer.
56
Figuur 43: Protectienetwerk bij kortsluitfout ingang hex buffer
In het schema (zie Figuur 42) zijn ook ‘pull-up’ weerstanden te zien. Deze worden voorzien, maar niet gemonteerd. De uitgangen van de AMIS kunnen worden geconfigureerd als ‘push-pull’ type i.p.v. ‘open-drain’, waardoor eigenlijk geen pull-up weerstanden nodig zijn. Door toch plaats te voorzien (is geen meerkost!), kan nog altijd gekozen worden voor een open-drain uitgang in combinatie met een pull-up weerstand. Eén uitzondering: de MISO-uitgang dient wel van een gemonteerde pull-up weerstand voorzien te zijn. Wanneer de slave niet geactiveerd wordt, is deze uitgang in een ‘hoge impedantie’, zodat de bus vrij wordt gelaten voor andere slave’s. Wordt die weerstand niet gemonteerd, dan is het spanningsniveau op de uitgang (en dus de ingang van de ‘open drain’-buffer) onzeker. Om de buslijn aan de uitgang van de buffer niet te verstoren, mag de buffer niet geleiden, waardoor wel een logische “1” aan ingang moet verschijnen (=pull up weerstand). Een verdere uitbreiding op de algemene inzetbaarheid is de doorverbinding van alle driver-IO. Voor de sturing zou een 8-polige IDC-connector volstaan, ware het niet dat deze niet bestaat. De eerstvolgende groter is een 10-polige exemplaar. Dit is net voldoende om alle driver-IO over te brengen. Dit vereist dan wel dat ook alle buffers worden gemonteerd. Dit maakt het mogelijk om deze converter-PCB’s voor andere toepassingen te gebruiken, zonder verlies van IO. Verder is een condensator van 100nF opgenomen in het schema (Figuur 44). De buffert de 3,3V voedingsspanning voor de buffers. Deze buffering kan de piekstromen leveren wanneer uitgang omklapt (zie werking CMOS-output internet).
Figuur 44: Bufferen voedingsspanning
Om geen massalus te verkrijgen, waardoor de grote motorstroom via een signaal-GND zou lopen i.p.v. via de ‘zware’ power-supply GND en bijgevolg ongewenste spanningsvallen zou veroorzaken, wordt nergens een GND via de IDC-connector overgebracht. Ook wordt voor dezelfde reden de GND van beide AMIS-connectoren niet verbonden op de converter-PCB. 57
Via de ‘zwaardere’ power-connectoren worden tenslotte alle GND’s naar één massapunt gebracht. Op dat punt heerst dan eenzelfde spanningspotentiaal en worden de spanningsvallen kabels die optreden in de kabel niet gecumuleerd. Door lang plaats –en zoekwerk is er uiteindelijk slechts 1 overbrugging op de converter-PCB nodig, ter hoogte van de SLA-uitgang.
7.2.
Extruder safety switch
Deze PCB is gebaseerd op doel van de “extruder safety cutoff switch” bij Makerbot. Deze is weliswaar iets verbeterd en huisvest meteen de thermokoppel-ic, die voor de ombouw noodzakelijk is, aangezien de temperatuursensor van de extruderkop (MK7 makerbot) met een thermokoppel werkt en de Ramps motherboard voorzien is op thermistors. Het is de bedoeling dat deze PCB in de buurt van de extruderkop wordt gemonteerd en meebeweegt. Dit, omdat zo alle kabels tussen PCB en extruderkop kunnen stilstaan. Het zijn dan slechts enkele, robuustere kabels die hoeven mee te bewegen. Een bijkomend voordeel is dat de afstand tussen thermokoppel en thermokoppel-ic klein is, waardoor de invloed van ruis geringer wordt. De thermokoppel-ic wordt gekozen op basis van wat Farnell in zijn gamma aanbiedt. De keuze gaat naar de AD8495ARMZ. Deze levert een uitgangsspanning van 5mV/°C en houdt reeds rekening met de omgevingstemperatuur. In de datasheet wordt aangeraden om een laagdoorlaat filter te bouwen aan de ingangen voor de thermokoppel. Het netwerkje (Figuur 45) filtert ruis, hoogfrequente storingen en allerhande common-mode signalen weg, opdat een correcte temperatuur zou worden uitgelezen.
Figuur 45: Signaalbehandeling thermokoppel
Om verder de ruis vanop de voedingsspanning (die uiteindelijk een invloed heeft op de uitgangsspanning) te beperken, wordt een laagdoorlaat filter in de voedingslijn naar het thermokoppel-ic opgenomen. Aangezien verder de Ramps moederbord al een condensator herbergt voor een laagdoorlaat filter voor de thermistoren (ook hier om de ruis te onderdrukken), in enkel nog een weerstand nodig na de uitgang van het thermokoppel-ic. Hiervoor wordt de weerstand van 4,7KΩ die dient te worden verwijderd op het moederbord, hergebruikt. Bij het binnennemen van de ingebouwde temperatuursensor in het platform, geldt ook dat de weerstand van 4,7KΩ vanop het Ramps moederbord moet worden weggenomen. De voedingsspanning mag in principe 12V bedragen, maar om er zeker van te zijn dat de max ingangsspanning van de analoge ingang van de microcontroller (=5V) nooit wordt overschreden, wordt voor 5V gekozen. Met een factor van 5mV/°C, is een theoretische temperatuur tot 500°C meetbaar. Ruim voldoende boven de normale werkingsgebied, die rond de 220 à 250°C ligt. Het circuit die de stroomtoevoer naar de verwarmingsweerstand van de extruderkop onderbreekt, bezit dezelfde werking als de ‘ extruder cutoff switch’ bij de Makerbot, maar dan iets zuiniger. 58
Bij de Makerbot plaatst laatst men een weerstand in serie met de spoel van de relais. Dit is te zien in Figuur 46,, waarvan helaas geen betere kwaliteit beschikbaar is.
Figuur 46: Extruder safety switch Makerbot
Men plaatst de thermiek (NC-contact) contact) parallel over de relaisspoel, waardoor deze in normale werking niet is aangetrokken. In serie met thermiek wordt een NC-hulpcontact NC hulpcontact van hetzelfde relais geplaatst. Via het et andere hulpcontact wordt de stroomtoevoer naar weerstand onderbroken. Vanaf het moment dat de thermiek even open gaat (extruderkop wordt door welke reden dan ook te warm), wordt het relais aangetrokken. De hoofdkring wordt onderbroken en het andere hulpcontact hulp voorkomt dat bij het terug sluiten van de thermiek het relais weer zou uitschakelen (de bypass over de relaisspoel wordt immers terug hersteld). De voedingsspanning moet dan eerst worden weggenomen, waardoor het relais terug afvalt (soort ‘reset’). Dit systeem voorkomt dat er een soort van temperatuursregeling zou ontstaan met als setpoint de thermiektemperatuur. Opdat deze opzet zou werken, mag de weerstand in serie met de relaisspoel niet te groot zijn (relais moet nog altijd via deze weerstand kunnen nnen aantrekken). Door de lagere weerstandswaarde krijgt deze ook warm (vermogenweerstand voorzien). Een goede werking van dit systeem is dus min of meer afhankelijk van de spoelweerstand van de relais. Dit is geen zo’n goede ontwerpstrategie, aangezien het h niet om het even is door welke relais de oorspronkelijke wordt vervangen en er tevens een relatief groot passief stroomverbruik is. Bovendien moet het relais aantrekken eer de hoofdkring wordt onderbroken, wat naar de werking van de veiligheid toe minder minde logisch is. Dit wordt ecologischer aangepakt in de nieuwe PCB (Figuur ( 47).
59
Figuur 47: Extruder safety switch nieuwe Genisys
Bij inschakelen van de bronspanning, is de condensator van 10µF initieel ontladen. Deze laadt op, waardoor transistor Q1 kortstondig in geleiding wordt gebracht. Normaal gezien is de thermiek gesloten, waardoor het relais aantrekt en de hoofdkring wordt ingeschakeld. Het hulpcontact neemt over, waardoor het relais blijvend wordt aangetrokken. Wanneer de thermiek even opent (extruderkop te warm), wordt het relais losgelaten en de hoofdkring onderbroken. Het overneemcontact valt eveneens af. Wanneer de extruderkop voldoende is afgekoeld en de thermiek bijgevolg terug sluit, zal - net als bij de Makerbot – ook hier geen herinschakeling plaatsvinden. Een rode led signaliseert daarenboven dat thermiek-beveiliging in werking is getreden. Ook hier gebeurt het resetten door de voedingsspanning weg te nemen. Door de verplichte aantrekking van het relais eer er stroom naar de verwarmweerstand loopt, is het geheel ook naar veiligheid iets betrouwbaarder. De diode over de spoel van het relais beperkt de inductiespanning over spoel, wanneer deze wordt uitgeschakeld. Hetzelfde geldt voor diode aan hoofdkring, maar wordt niet gemonteerd aangezien de verwarming geen inductieve last vormt. Het biedt wel de voorziening om een diode te monteren indien later alsnog een inductieve verbruiker wordt aangesloten. De diode aan condensator van 10µF tenslotte, zorgt ervoor dat deze direct wordt ontladen wanneer de voedingsspanning wegvalt (=resetten).
60
7.3.
Power PCB
Deze printplaat voorziet de verdeling van 24V, uitbreiding van de SPI-communicatiebus naar andere devices en groepering van verschillende kabels en signalen naar de IDC-connectoren voor de AMISdrivers. Zoals de naam het ook al zegt, herbergt deze ook de aansturingen voor de ‘zwaardere’ verbruikers, d.m.v. mosfets. Figuur 48 toont hoe voor iedere driver de signalen van de SPI-databus wordt gecombineerd met de reeds bestaande Nxt, Dir-uitgangen en andere signalen, afkomstig van de uitbreidings-IO (bv. reset). De stroombeperkende weerstanden (560Ω), die dienst doen bij het per ongeluk instellen van de microcontroller IO-pin als uitgang, zijn hier tevens opgenomen. De weerstanden van 2,2KΩ hebben een pull-up functie, aangezien de aangesloten uitgangstrappen open-drain zijn. Deze mogen in principe voor of na de weerstanden van 560Ω staan. Maar om geen spanningsval te veroorzaken wanneer een van de open-drain uitgangen laag wordt, is deze na de 2,2K pull-up weerstand en de microcontroller ingang geplaatst. Ook wordt er plaats voorzien om indien nodig de SPI-bus later voor nog meer AMIS-drivers of andere toepassingen te gebruiken (“SPI Amis Uitbreidingsconnector”).
Figuur 48: Bussysteem AMIS-drivers
De Ramps moederbord voorziet reeds een Mosfet voor de verwarming van het bed/platform en de extruderkop. Echter, deze is niet zwaar genoeg voor de platformweerstand op de Genesys (ontwikkeld 250W @36V, wat een stroom van +-7A oplevert). De mosfet op de Ramps moederbord levert “-“, waardoor het aanstuurcircuit van de ‘zwaardere’ mosfet hierop aangepast moet zijn. 61
Daarenboven leveren de andere aansturingen 5V (DO microcontroller), terwijl voor een voldoende aansturing van de mosfets minstens 10V nodig is (bij voedingsspanning van 12V zeker volledig in geleiding) De gekozen mosfets worden uit het gamma van Farnell gekozen. De reden voor mosfets is het laag benodigd vermogen van het aanstuurcircuit (geen grote basisstromen nodig, zoals bij transistoren wel het geval is) en het laag vermogensverlies bij mosfets tijdens ingeschakelde toestand, dankzij de zeer lage ‘on-weerstand’ (Pverlies mosfet: I²*Ron <-> Pverlies transistor: I²*0,2V). Het ontwikkeld vermogen is zo laag, dat zelfs geen koelplaat nodig is. Wel is de mogelijkheid tot plaatsing ervan voorzien. Figuur 49 geeft het aanstuurcircuit van een mosfet weer. De reden waarom niet voor kant-en-klare mosfet driver-ic’s wordt gekozen, is de hogere prijs van dergelijke drivers en de robuustheid en de equivalente werking van de vervangende schakeling.
Figuur 49: Vermogentrap via mosfet
Via transistor Q6 wordt via het logische ingangssignaal een stroombron (via pnp-transistor Q5 rechtsboven) ingeschakeld. Deze doet de mosfet Q4 geleiden. De stroombron (+-25mA) levert ofwel stroom (ingang Q6 = “1”) ofwel geen stroom (ingang Q6 = “0”). Om steeds een eenduidige toestand te verkrijgen en om de parasitaire condensator aan de gate te ontladen, wordt een weerstand naar massa ter hoogte van de gate voorzien. De keuze voor een transistor als stroombron i.p.v. een transistor als schakelaar in combinatie met een stroombeperkende weerstand, is het vlugger opladen van de gate via een stroombron. Dit resulteert in kordater schakelen van de mosfet (warmteontwikkeling tijdens overgangen aan-uit!). De stroombron-configuratie vergt evenveel componenten als een transistor, uitgebaad als schakelaar. Aangezien het uitschakelen wel nog steeds gebeurt via een ‘gewone’ weerstand, moet om een kordate uitschakeling te verkrijgen, best een eerder lage weerstand genomen (t = 5.R.C!). Maar ook niet te laag, de mosfet moet nog steeds volledig in geleiding kunnen worden gebracht (Istroombron*R>10V)! Figuur 50 staaft dit. Bovenaan in het midden is het thévenin-equivalent van de schakeling linksboven te vinden: de transistor als schakelaar (afgebeeld als +12V-klem), in combinatie met een stroombeperkende weerstand R1. Weerstand R3 is dan een parallelschakeling van R1 en R2 en Vth de spanning in het knooppunt van de onbelaste spanningsdeler, gevormd door R1 en R2. De condensator stelt de parasitaire ingangscapaciteit voor van de gate van de mosfet. Voor de eenvoud is de mosfet zelf verder weggelaten. Rechtsboven is de gate aanstuurschakeling via een stroombron te zien. De 30mA is afkomstig van 12V/R1 of 12V/400Ω. Dit, zodat beide schakelingen aanvankelijk evenveel laadstroom leveren en objectief kunnen vergeleken worden. De aansturing via R1 en R2 (samen R3) kent een typisch RC-gedrag, wat te verwachten is. Na 5߬ heeft de gate de ingangsspanning (=Vth)bereikt. Merk op: dit is niet de voedingsspanning. Deze kan hoogstens Vth bereiken, die afwijkt van de voedingsspanning t.g.v. de spanningsval over R1 door R2. In dit voorbeeld is dat 10,15V. Bij de stroombron ligt dit enigszins anders. 62
Ook hier krijgen we een soort van RC-gedrag, alleen is de theoretische eindwaarde (3mA x 2200Ω=66V) veel hoger. Ook hier geldt dat na 1߬, 63% van de eindewaarde is bereikt. Daar de eindwaarde veel hoger ligt, zal ook de praktische grens van 12V vlugger bereikt worden (cfr. 1ste order filter, met een hogere wenswaarde). Die 12V ligt in werkelijkheid iets lager, vanwege de opbouw van de stroombron zelf. In dit voorbeeld is dat ongeveer 11,6V.
U (V)
U (V) 66V
10,15V
R1: 400 R2: 2200 C: 10nF
11,59V
16,92µs
t (s)
4,25µs
t (s)
Figuur 50: Laadtijd gate mosfet
Idealiter gezien zou het ontladen ook met een stroombron moeten gebeuren. Dit maakt de aansturing evenwel veel complexer. Praktisch wordt voor R2 een weerstandswaarde van 1K gekozen, waardoor bij een gate-capaciteit van 10nF, de ontlading in 50µs plaatsvindt. In de praktijk ligt de ingangscapaciteit echter eerder in de grootteorde van 1nF, waardoor de ontlading ergens rond de 5 à 15µs zal duren. Een opmerking i.v.m. de led’s: deze worden gebruikt om de stroombron te realiseren. Deze zullen slechts zeer licht of kortstondig branden. Steeds is plaats voorzien tot montage van vrijloopdioden. Enkel bij de blokkeerpinnen worden deze effectief gemonteerd, aangezien slechts daar sprake is van een echte inductieve verbruiker. Er is ook plaats voorzien om de verlichting (of een andere verbruiker) in en uit te schakelen, maar de componenten worden niet gemonteerd. De verlichting zal voorlopig via een ‘gewone’ schakelaar worden bediend. Dit omdat een softwarematige bediening voorlopig niet wordt ondersteund. Een kleine opmerking: de computervoeding die de 12V voorziet, kan niet voldoende stroom leveren voor de Ramps moederbord, de ventilatoren en de halogeenlampen. Om geen extra aparte 12V-bron nodig te hebben, worden de halogeenlampen in serie op 24V geplaatst. Dit mag, aangezien beide lampen eenzelfde interne weerstand hebben (zie Power supply). Op de PCB is ook de mogelijkheid tot het aansturen van de ventilatoren ingecalculeerd (Figuur 51). Aangezien deze verbruikers eerdere laag vermogen zijn, kan de aansturing met een eenvoudige transistor gebeuren. De BC337 kan een max stroom van 500mA leveren. Bij 12V is dit tot 6W, wat zeker voldoende is voor een kleine ventilator. De ingangen zijn rechtstreeks 5V-compatibel ontworpen. 63
Figuur 51: Vermogentrap via low power transistor
7.4.
Mains PCB
Deze PCB, die zich achteraan aan de zijkant van de machine bevindt, verzorgt de netspanningzijde van de Genisys. Er bestaat al een soort van netspanningsPCB, maar deze herbergt componenten die niet meer nodig zijn (zoals bv. transformatoren). Doorzagen is geen optie, want het betreft hier een meerlagenprint (Multi layer), waardoor het gevaar bestaat dat meerdere lagen worden kortgesloten. De printplaat wordt dan maar opnieuw ontworpen(Figuur 52), naar eigen noden en wensen (extra aansluitpunten aarding, extra connectoren, …) . Er wordt gebruik gemaakt van bestaande gaten voor schakelaar, 230V-aansluitpunten, zekeringhouder en montagegaten. De schakeling is dezelfde als voorheen: een schakelaar onderbreekt via een smeltzekering enkelpolig de 230V-toevoer naar de verdeelstekkers.
Figuur 52: Mains PCB
64
7.5.
Power supply
De stappenmotor drivers, blokkeerpinnen, halogeenlampen (mits serieschakeling) worden allen met 24V gevoed. Een overzicht wordt gegeven door Tabel 3. Tabel 3: Overzicht verbruikers 24V
Item
Kenmerken
Stroomverbruik (A) @24V
Halogeenlampen (2X)
35W@12V (-> serieschakeling)
2,917
Blokkeerpinnen (4X)
104Ω/24V
0,923
Stappenmotordrivers (3X)
2,85A piek
8,58A
totaal
12,42
De gekozen 24V-bron heeft een maximum vermogen van 300W, wat neerkomt op een te leveren stroom van hoogstens 12,5A. Net voldoende blijkt. Wel moet als kanttekening gezegd worden dat de 2,85A per driver de piekstroom is. De gemiddelde ontrokken stroom is weliswaar lager en hangt van meerdere parameters af. Naast de 24V bron, wordt een PC-voeding aangewend en de reeds ingebouwde 33V voeding hergebruikt.
7.6.
Bekabeling
De meeste verbindingen zijn rechttoe rechtaan. Ze kunnen online worden gevonden bij de “RAMPS v1.4”-sturing of vanuit de schema’s zelf gemakkelijk worden afgeleid. Maar er zijn enkele elementen nog niet aan bod gekomen, omdat die bv. rechtstreeks worden overgenomen vanuit de Genisys. De LM34D, de temperatuursensor vanuit het platform is daar een voorbeeld van. In Figuur 53 is daarom van deze elementen de principiële aansluiting schematisch weergegeven.
+5VPC-voeding LM34D
T1 Ramps v1.4 GND
+12VPC-voeding MK7 Ventilator GND
Figuur 53: Niet aangehaalde verbindingen
65
8. Software nieuwe Genisys Het spreekt voor zich dat de software sowieso dient gewijzigd te worden. Voor het gemak en de eenvoud wordt enkel de code die wordt gewijzigd of bijgevoegd hier besproken. De volledige code is in bijlage weer te vinden. De hele opzet gebeurt zoals beschreven in Figuur 54. Een 3D-model wordt vanuit een CAD/CAMpakket in STL-formaat opgeslagen. Deze file wordt dan vanuit ReplicatorG geopend en vervolgens worden de bijhorende Gcodes gegenereerd. Deze worden dan doorgestuurd naar de microcontroller, waar de sprinter-software deze verwerkt en de stappenmotoren gepast aanstuurt.
PC
STL-formaat
CADmodel
ReplicatorG
G-codes
Sprinter
Figuur 54: Softwaremodel
De sprinter-code bestaat uit meerdere files, die wel allen samen worden geladen bij het openen van het ‘PDE-bestand’ door Arduino.cc. De algemene structuur is de volgende. De werkelijke programmacode is terug te vinden onder het bestand/tabblad “Sprinter”. Allerhande configuratieinstellingen die dienen gemaakt te worden (bv. #stappen/mm van ierder as, …) worden ondergebracht in de file “Configuration.h”. Definiëren van de verschillende functies en subroutines, alsook het definiëren van macro’s gebeurd in het bestand “Sprinter.h”. Macro’s en declaraties inzake het aanspreken van de IO is terug te vinden in het bestand “fastio.h”. In principe moet in deze laatste niets worden aangepast. In het tabblad “pins.h” wordt bij de juiste moederbordsectie de verschillende IO-pinnen met een naam gelinkt. Dit stelt de gebruiker in staat om namen te gebruiken, waardoor de kans op missen verkleint, alsook het achteraf wisselen van pinnen eenvoudig kan plaats vinden. Als laatste is er ook een bestand “thermistortables.h”, waarin opzoektabellen zijn opgenomen. Zo wordt de opgemeten spanning gerelateerd aan een temperatuur. Dit, omdat er geen lineair verband bestaat tussen de temperatuur en de weerstandswaarde van een thermistor over het volledige meetbereik. In deze masterproef wordt er eigenlijk geen gebruik gemaakt van deze file. Om errors te vermijden wordt de file niet verwijderd. Aangemaakte functies of subroutines moeten eerst bij naam worden gedeclareerd aan de compiler, eer ze effectief gedefinieerd worden. Veel verklaren die niet, daarom worden ze ook hier niet weergegeven. Ze kunnen wel in de volledige code in de bijlage weergevonden worden. Aangezien de AMIS-drivers over geen enable-ingang beschikken, maar deze via de SPI-bus dient gemanipuleerd te worden, moet in de software de nodige aanpassingen gemaakt worden. 66
Omwille de compatibiliteit met de originele RAMPS-sturing te, worden de oorspronkelijke enablepinnen behouden (en dus ook de code voor het hoog en laag maken ervan). In Figuur 55 en Figuur 56 zijn de macro’s te zien die worden aangewend om de SPI-communicatie te verwezenlijken.
Figuur 55: Macro's SPI - Deel 1
Figuur 55 linkt de adressen van de AMIS-registers met hun naam, zodat de code eenvoudiger te begrijpen is voor de programmeur. Dit kan ook voor de verschillende bits, binnen een byte. Voorlopig wordt enkel de “enable”-bit gedefinieerd, welke hier de MSB (Most Significant Bit) is. Tevens is in dezelfde figuur de SPI leesprocedure opgenomen. Na het adresseren van de juiste slave (laag maken CS), wordt de meegegeven geheugenlocatie geselecteerd. Vervolgens wordt ‘dummy-data’ (hier byte 0)verstuurd, zodat de slave de inhoud van de geselecteerde geheugenlocatie kan doorgeven. Na het ontvangen deactiveert de master de slave door de CS-lijn van de slave terug hoog te maken. De returnvariabele kan ofwel een boolean of een byte zijn. Indien een byte, dan moet de variabele “Bit_Select” de waarde 255 hebben, zodat na een “and-operatie” alle bits behouden blijven. Is de returnvariabele een boolean, dan fungeert de “Bit_Select” als een soort van masker. Is bv. de meegegeven waarde voor “Bit_Select” gelijk aan de eerder gedefinieerde “AMIS_MOTEN”, dan zal van de ontvangen data de MSB bekeken worden. Is deze hoog, dan is de returnwaarde ‘true’, in het andere geval ‘false’.
67
Figuur 56: Macro’s SPI - Deel 2
In Figuur 56 zijn de schrijfprocedures beschreven. Daarbij is er onderscheidt gemaakt voor een bit of byte gebaseerde schrijfcyclus. De bit gebaseerde cyclus werkt op het “read-and-modify”-principe: de doellocatie wordt eerst uitgelezen, de bit wordt gemanipuleerd en vervolgens de volledige byte terug weggeschreven naar de geheugenlocatie in de AMIS. De byte gebaseerde cyclus houdt geen rekening met de huidige waarde. De meegegeven waarde wordt meteen in de geadresseerde geheugenlocatie gezet, waardoor de inhoud zonder meer wordt overschreven. Het moge duidelijk zijn dat de byte gebaseerde schrijfcyclus de kortste tijd in beslag neemt. Beide schrijfcyclussen werken op een vergelijkbare wijze als de leescyclus: na het activeren van de slave, wordt de geheugenlocatie geadresseerd, waarna de inhoud van die locatie door de master wordt doorgestuurd. Wel wordt hier na het deactiveren van de slave een wachttijd van 4µs ingevoerd. Dit wordt geëist door de AMIS, om deze laatste de kans te geven om de doorgestuurde data effectief weg te schrijven in de geheugenlocatie. Omdat het in principe mogelijk is om meteen na elkaar twee schrijfacties op dezelfde slave uit te voeren, wordt voor de zekerheid die 4µs wachttijd in de macro opgenomen, zodat de programmeur hier geen zorgen over hoeft te maken. Het hoog en laag maken van de enable-pinnen gebeurd reeds op basis van een macro. Deze worden nu uitgebreid met een bijkomende commando om de enable-bit ook via de SPI-bus te gaan aanpassen. Dit hoeft enkel indien het ook effectief om een AMIS-driver gaat. Wordt de oorspronkelijke drivers gebruikt, dan wordt de SPI-commando niet uitgevoerd. Dit vereist dat de software correct wordt geconfigureerd. Zo moet bv. de codelijn “#define X_USES_AMIS” worden opgenomen, om duidelijk te maken dat de X-as een AMIS-driver gebruikt en dus de enable-bit dient gemanipuleerd te worden via de SPI-bus. Figuur 57 toont de uitbreiding van de oorspronkelijke macro, met de SPI-bus commando’s. Hier wordt duidelijk gebruik gemaakt van de bit gebaseerde schrijfcyclus, om de enablebit “MOTEN” aan te passen.
68
Figuur 57: Macro’s enablen/disablen AMIS-driver
De uitbreidings-IO wordt gebruikt om alle voorzieningen in de Genisys te kunnen ondersteunen (met uitzondering van de verlichting, die voorlopig manueel dient te gebeuren). Deze pinnen krijgen een gepaste naam (Figuur 58).
Figuur 58: Definiëren uitbreidings-IO
De configuratie-instellingen worden aangepast op de Ramps-sturing en uitgebreid met die, die betrekking hebben op de uitbreidingen. In Figuur 59 worden alle zelf aangemaakte instellingen samengebundeld.
69
Figuur 59: Uitbreiding configuratie instellingen
De gebruikte temperatuursensoren zijn geen enkele als standaard voorzien in de software. Er is immers keuze binnen de software tussen meerdere temperatuursensoren en bijhorende omrekencode. Daarom wordt deze zelf aangemaakt. Dit gebeurt op eenzelfde structuur als de andere omrekencode (zie Figuur 60). De sturing gebruikt twee omrekenprocedures: een omzetting van een ADC-waarde naar een temperatuur in °C en omgekeerd. De berekeningen zijn dus complementair. Van de AD8495 is gekend dat de uitgangsspanning 5mV/°C bedraagt. De ADconverter converteert 5V naar 1024 (10-bits). Om nu een resultaat te hebben in °C, volstaat het dus om de ADC-waarde te vermenigvuldigen met de factor “200*5/1024”. Echter, bij grote ADC-waarden zal na de vermenigvuldiging van “200*5” reeds een overflow gebeuren. Om dit te vermijden wordt de factor “200*5/1024” gereduceerd en benaderd door 49/50. Eenzelfde werking en redenering gaat op voor de LM34, dewelke een uitgangsspanning levert van 5mV/°F. De relatie tussen Farenheit en graden Celcius: Tc=(Tf-32)*5/9. De bijhorende factor “500/1024” wordt nu benaderd door “49/100”. Naast het aanmaken van de functies, moet ook in de code gezocht worden waar deze functies worden aangewend en zo nodig aanpassingen maken, zodat de nieuwe aangemaakte functies ook degelijk worden opgeroepen.
70
Figuur 60: Omrekening temperatuur
Het hoofdprogramma (‘Void Loop’) ziet er uit als weergegeven in Figuur 61. De aansturing voor de uitbreidingen (‘auxiliary’) wordt gevormd door het toevoegen van de coderegel “Manage_Genisys_aux();”. Voorlopig wordt daarin enkel de blokkeerpinnen aangestuurd (zie Figuur 62), maar de verlichting kan hier later ook worden ondergebracht. Verder is er ook een codeblok te zien, welke de samengestelde error-uitgang (“Errb-uitgang”, zie datasheet AMIS-driver) van alle drivers cyclisch bekijkt. De ingang wordt laag als één of meerdere uitgangen van de drivers laag worden (dit gebeurd bij een fout-melding, zie datasheet AMIS drivers). De eerste maal kan een foutmelding voorkomen, terwijl er geen echte fout aanwezig is. Daarom wordt de eerste keer de fout behandeld en genegeerd, waarna bij normale werking geen errors zouden mogen voorkomen. Is dit toch het geval, dan wordt de fout behandeld, in de subroutine “Check_Amis_Errors();”. De code van deze functie is te lang om hier weer te geven, maar kan in de bijlage gevonden worden. In het kort komt het erop neer dat de functie alle registers van alle drivers uitleest, waarin fout-statussen zijn opgenomen. Er wordt achterhaald wat de fout precies is en dat wordt doorgegeven naar de PC. Uitlezen van de registers, impliceert automatisch het bevestigen (‘acknowledge’) van de fouten, waardoor de de error-uitgang terug hoog moet worden, indien alle oorzaken van de fouten verdwenen zijn. Is dit niet het geval, dan wordt de melding gegeven dat de errors niet kunnen ‘gecleard’ worden en wordt het cyclisch uitlezen van de error-uitgang gestopt. Aangezien deze steeds laag blijft, zou anders continu het scherm gevuld worden met foutmeldingen.
71
Figuur 61: Hoofdprogramma Sprinter
Figuur 62 geeft de aansturing van de blokkeerpinnen weer. Voorlopig volgen deze enkel hun bijhorende sensoren. De bedoeling is uiteindelijk om de deuren te blokkeren bij aanvang van het printen en pas terug vrij te geven indien het printen gestopt is. Tussentijds deblokkeren (bv. wanneer de haspel met de plastic draad op is en moet vervangen worden) kan pas na aanvragen. Deze laatste voorziening wordt nu nog niet ondersteund.
Figuur 62: Ondersteuning blokkeerpinnen
Er wordt ook wat code toegevoegd onder de sectie “Void Setup()”. Die code is net als de controle op de error-ingang, te lang om hier weer te geven (opgenomen in de bijlage). In het kort wordt naast de bestaande code in de sectie “Void Setup” alle aangemaakte IO-pinnen (=uitbreidingspinnen) als ingang gedefinieerd en hun bijhorende pull-up geactiveerd. Ook worden alle geconfigureerde drivers gereset en ingesteld. Het instellen van type uitgangstrap van de drivers naar “push-pull” is een voorbeeld daarvan. De standaard microstep van 64 wordt behouden. Tevens wordt de snelheid van de SPI-databus ingesteld, met de ingestelde waarde in het tabblad “Configuration.h”.
72
9. Overzicht ombouw Figuur 63 geeft de schematische opstelling van de ombouw weer. Op de Ramps-moederbord is de stappenmotordriver voor de aandrijving van de plasticdraad rechtstreeks inprikbaar. Via een bijhorende connector op de Ramps wordt de stappenmotor zelf aangesloten. De “extruder”-PCB die naast de extruderkop zelf staat opgesteld, wordt via een aantal losse kabels (die samengebonden zijn) verbonden met de Ramps-moederbord en de PC-voeding. De Ramps-moederbord zelf wordt tevens van spanning voorzien door deze laatste voeding. Verder worden alle noodzakelijke signalen voor de AMIS-drivers (SPI, Nxt, …) en de randvoorzieningen (blokkeerpinnen, …) vanuit de Ramps overgebracht naar de “Power”-PCB. Daar worden de AMIS signalen verzameld en telkens via één 10-aderige flatcable overgebracht naar de “AMIS Converter”PCB’s. De signalen voor de randvoorzieningen gaan naar vermogentrappen, die door ofwel +12V (PCvoeding) of +24V (aparte voeding) worden gevoed. Blokkeerpinnen, ventilatoren, …
Power Supply
Ramps V1.3
SPI-databus
Power PCB
Nxt, Dir, CS
Extruder Safety PCB
Converter
Converter
Converter
Amis 30421
Amis 30421
Amis 30421
extruder-motor
Thermokoppel, thermiek, relais
X-motor
Y-motor
Z-motor
Figuur 63: Blokschema nieuwe sturing
Figuur 64 toont concreet de aanpassingen t.o.v. de originele sturing. Zo worden de originele motordrivers niet gemonteerd in de voorziene headers, maar apart aangebracht. De extruderkop wordt niet meteen verbonden met de Ramps-moederbord, maar loopt eerst naar de “Extruder”-PCB. Ook worden geen thermistor voor de extruder gebruikt, maar een thermokoppel. Een vergelijkbaar verhaal gaat op voor het platform. De uitgangssignalen van de Ramps-moederbord lopen eerst naar een ‘zwaardere’ vermogentrap op de “Power”-PCB, waarna deze effectief met de verwarmweerstand wordt verbonden. Ook hier wordt geen thermistor gebruikt, maar de reeds ingebouwde Farenheit temperatuursensor in IC-vorm.
73
Genisys platform Sensor Genisys XXXXXXXX
XXXX Thermokoppel Extruder PCB
Power PCB
Amis 30421
Amis 30421
Amis 30421
Figuur 64: Blokschema ombouw Ramps
10.
Uitbreidingen
Voor de controle op de uitlijning zijn meerdere systemen mogelijk. Belangrijk is dat het doel van de meting behouden blijft: blijft de scheefstelling tussen platform en meetkop binnen de toegelaten grenzen? Benadrukken we nog eens het feit dat de printerkop en het platform gerust iets scheef mogen lopen (er kan hier trouwens niets meer aan gedaan worden, aangezien het vaste frame waarop de geleiding van de printerkop werd vastgemaakt bestaat uit gegoten aluminium), zolang ze maar onderling evenwijdig bewegen. Figuur 65 geeft daarvan een schematisch overzicht. De huidige toegelaten marge (die we overigens minstens willen evenaren) bedraagt 0,025 inch ofwel 0,635mm.
74
Figuur 65: Controle op de scheefstelling
In Figuur 66 is een eerste voorstel te zien. Twee lichtbronnen (slechts één gevisualiseerd) staan op de linker –en rechteruiteinde van het platform, dewelke verticaal en horizontaal kan bewegen. Op de printerkop (die de laatste beweging realiseert, namelijk in en uit het blad a.h.w.) staat dan een ontvanger. Door middel van een zeer kleine boring wordt een soort van venster of masker gebouwd. De ontvanger zal de lichtstraal pas detecteren als het platform op nagenoeg exact dezelfde hoogte komt te staan. Deze procedure wordt uitgevoerd voor zowel de linkerzijde als voor de rechterzijde. Indien daarbij telkens de positie op de Z-as wordt bijgehouden, kan nagegaan worden of het verschil al dan niet kleiner is dan de toegelaten grens. De keuze gaat naar 1 ontvanger en 2 lichtstralen, aangezien dan slechts 1 detectiecircuit voor de ontvanger hoeft gebouwd te worden. De performantie en nauwkeurigheid hangt hoofdzakelijk af van hoe goed en fijn een dergelijk venster/masker kan gemaakt worden.
Figuur 66: Controle door lichtsluis
Een ander mogelijk systeem wordt verduidelijkt met Figuur 67.
Figuur 67: Controle door inductieve sensor
75
Hier wordt gewerkt met een kant-en-klare industriële sensor. Een digitale inductieve sensor meerbepaald. Deze sensoren kennen een zeker gebied waarin ze zullen schakelen. Alleen is de exacte afstand wanneer ze effectief schakelen onbekend. Enkel de grenzen zijn gekend. Op zich is dat geen nadeel. In deze toepassing is het eerder belangrijk dat steeds op eenzelfde afstand wordt geschakeld, de afstand zelf doet er niet veel toe (er wordt toch bijgehouden vanaf welke hoogte er geschakeld werd). Dit begrip is ook wel bekend onder de naam ‘repetiviteit’. Om de verschillen in de repetiviteit en het schakelgebied sowieso te verkleinen, wordt een “hefboomwerking” geïmplementeerd. Door de lange arm, zal bij het geringste contact de uitwijking op het uiteinde relatief groot zijn, waardoor der onmiddellijk wordt geschakeld. Dit systeem laat echter geen eenvoudige scharnier toe als ophangpunt, aangezien deze laatste enige speling met zich mee brengt. Het voorgesteld ontwerp rekent op een arm die licht kan buigen, zonder dat daarvoor grote krachten nodig zijn. Het materiaal moet uit zichzelf terugveren (buiging moet binnen elasticiteitsgrens van het materiaal blijven), bestand zijn tegen hogere temperaturen (grootteorde 80-100°C) en mag geen kruip vertonen. Een laatste voorstel is het gebruik van een analoge inductieve sensor. Deze meet letterlijk de afstand. De voorwaarden zijn wel dat het analoog uitgangssignaal zonder al te veel ruis of storing kan binnengenomen worden door de sturing (moet over een vrije analoge input beschikken) en dat de sturing een de analoog-naar-digitaal-omzetting met een voldoende hoge nauwkeurigheid realiseert. Anders heeft een nauwkeurige meting weinig zin, als de sturing toch niet zo’n kleine verschillen opmerkt. Een andere mogelijke uitbreiding is de detectie wanneer de toevoermateriaal op is (haspel is leeg). Vanaf dan moet het de gebruiker mogelijk gemaakt worden om de haspel te vervangen. Praktisch komt dit erop neer dat het platform volledig achteraan wegschuift (kans aanraking door gebruiker verkleinen) en de toegangsdeur bovenaan wordt ontgrendeld. Via het bedienen van de motor, moet de draad van de nieuwe haspel worden meegenomen. Na het sluiten van de toegangsdeur en het bevestigen door de gebruiker, moet de deur terug vergrendeld worden en het printer worden hervat. Figuur 68 geeft de praktische opstelling weer om de detectie van een lege haspel uit te voeren. Hierin wordt de MK7 extruderkop simplistisch voorgesteld. De toevoerdraad komt via een geleiderstuk tussen een lichtsluis terecht, waarna deze de extuder binnen treed. Wanneer de draad op is, zal dit gedetecteerd worden door de lichtsluis en bijgevolg de sturing. Via een aluminiumplaat, die tussenin de extruder wordt gemonteerd, en enkele regelvijzen, kan de printplaat met de lichtsluis mooi afgeregeld worden. Zo valt de toevoerdraad mooi binnen het actieve gedeelte van de lichtsluis.
76
Figuur 68: Detectie haspel leeg
11.
Eindconclusie masterproef
Hoewel dit aanvankelijk niet tot de doelstellingen behoorde, is het project van de ballenwerper een succes. Ondertussen wordt het ballenwerper-platform voor meerdere doeleinden ingezet. Zo ook bij een bachelorproef omtrent het controleren van een balletje via objectherkenning met een camera. De bijkomende doelstellingen van dit project zijn meer dan vervuld: het geheel werd aangevuld met elementen die de rubuustheid en de flexibiliteit alleen maar ten goede komen. Leerlingen van het 6de jaar secundair onderwijs zijn er reeds in geslaagd op een goed traject te ontwerpen: meer dan 100 succesvolle worpen worden na elkaar uitgevoerd.
Bij de realisatie bleek dat de drivers sporadisch werden gereset. De uitgangstype van driver wordt dan van het “open-drain”-type. Aangezien de Errb-uitgang geen externe pull-up weerstand heeft (MISO-uitgang heeft die wel, zie “AMIS Converter”-PCB), is de uitgang onzeker. Deze kan dus gerust laag worden. Dit gebeurde dan ook, waardoor bij het foutzoeken (SPI-communicatie werkt dus nog steeds, dankzij de externe pull-up) aan het licht kwam, dat de bit die instaat voor het uitgangstype terug laag is. Dit is defaultwaarde na het inschakelen of resetten. De reden is hoogstwaarschijnlijk de, nochtans korte, spanningspieken op de GND-draad. Thans werden de draadsectie groot genoeg gekozen. Wel is bekend dat in principe iedere draad ook een kleine spoel is. Na contact met On Semiconductor, bleek uiteindelijk dat het invoeren van optocouplers (galvanische scheiding tussen de GND van de sturing en de 24V-voeding) pas effectief het probleem kan oplossen. Helaas is hier geen tijd meer voor en zou dit extra PCB’s vergen. Ook verliezen de oorspronkelijke Converter-PCB’s hiermee hun nut en doel. 77
Een laatste eigen poging tot oplossen werd ondernomen: de spoelwerking van de draad verkleinen, door de draad zo kort mogelijk te maken en de GND-verbinding met de sturing zo kort mogelijk bij de drivers te laten aangrijpen. Voorlopig lijkt het euvel i.v.m. de drivers daarmee opgelost. Toch werkt de 3D-printer nog niet helemaal als zou moeten. Binnen ReplicatorG, de software die op de PC draait, is een module ondergebracht die instaat voor het genereren van de Gcode zelf: ‘Skeinforge’. Er zijn heel wat elementen die kunnen ingesteld worden. Voor de Thing-o-Matic in bruikleen, staan zo goed als alle instellingen meteen goed. Dit ligt iets anders voor de Sprinter software. Momenteel gaat de omgebouwde Genisys na het homen met zowel X, Y als Z-as naar een zijde bewegen. Er moet door de gebruiker ingegrepen worden, omdat er botsingen dreigen te gebeuren. De opdracht om te bewegen is afkomstig van de Gcode. Na het correct instellen, wordt verwacht dat de machine volledig operationeel is. Een overzicht hoeveel de ombouw nu precies heeft gekost wordt weergegeven in Tabel 4. Tabel 4: Overzicht onkosten ombouw
Onderdeel
Prijs (€)
Aandeel totaal (%)
Eigen PCB’s + ombouw (bekabeling, …)
175,59
59
Ramps v1.4 moederbord
72,79
24
Arduino Mega
52
17
Stappenmotor drivers
0
0
Software sturing
0
0
Totaal
300,38
De drivers zelf worden gratis ter beschikking gesteld door On Semiconductor. Dankzij de open-source sturing, is de software volledig gratis. De machine zelf (motoren, constructie) was reeds voorhanden, zodat enkel de hardware van de sturing en de ombouw de kostprijs bepalen. De extra aangekochte power supply van 24V wordt hierin meegerekend. Een vergelijking: een volledige ‘Thing-o-Matic’ van Makerbot kost ongeveer 960€. Een volledige ‘Replicator’ van Makerbot kost ongeveer 1370€. De prijzen en wisselkoersen zijn gebaseerd op deze van juni 2012.
Alle doelstellingen werden behaald, uitgezonderd de definitieve inzetbaarheid van de machine zelf. Zoals reeds aangehaald, zou mits de correcte instellingen (slechts een kwestie van software) de machine wel functioneel moeten worden. Door de lange wachttermijn van de lokale dealer van Makerbot, is de tijd besteed aan het ballenwerperproject. Op zich zeer nuttig, maar daardoor heeft de uitwerking van de eigenlijke masterproef in één semester moeten plaatsvinden, terwijl voor een goede afwerking toch beide semesters nodig waren. Niettemin werd er alles aan gedaan om alles toch zo goed en kwaad als het kon af te werken. 78
12.
Literatuurlijst
Aangezien de volledige masterproef rond ‘open-source’ draait, zijn zo goed als alle bronnen internetsite’s. Wat de info betreft van de AMIS 30421: de is nog niet uitgebracht. De info werd via mail verkregen van de fabrikant. Zureks, "FDM by Zureks.png," 2008. [Online]. Available: http://upload.wikimedia.org/wikipedia/commons/4/42/FDM_by_Zureks.png. [Accessed 30 04 2012]. "reprap.org," [Online]. Available: http://reprap.org/wiki/RAMPS1.4. [Accessed 9 05 2012]. "Github," [Online]. Available: https://github.com/kliment/Sprinter. [Accessed 9 05 2012]. "Makerbot," [Online]. Available: http://store.makerbot.com/3d-printers/thing-o-matic.html. [Accessed 9 05 2012]. "ReplicatorG," wikidot.com, [Online]. Available: http://replicat.org/. [Accessed 9 05 2012]. “Wikipedia” [Online]. Available: http://wikipedia.org. [Accessed 9 05 2012].
13.
Bijlagen
Het overgrote deel van de bijlagen is apart te vinden in de bijhorende CD-rom in een digitale versie.
13.1.
Uitleg Eclipse code project ballenwerper
Figuur 69: Include's en constanten
79
In Figuur 69 worden de gebruikte hulpfiles opgeroepen en enkele constanten al dan niet via een voorafgaande berekening gedefinieerd. In commentaar is ook een overzicht te vinden van de gebruikte IO. Merk op dat PC5 niet weer te vinden is en dus nog vrij is.
Figuur 70: Constanten
In Figuur 70 worden andere constanten gedefinieerd. Het gebruik van constanten vergemakkelijkt het begrijpen van een programma. Daarbij kunnen nu ook de registers in de driver bij naam genoemd worden. Ook kan een waarde die meerdere keren voorkomt gemakkelijk gewijzigd worden, zonder overal in de code te moeten zoeken.
Figuur 71: Globale variabelen deel 1
Figuur 71 geeft een eerste deel van een lange lijst van globale variabelen. Zij worden doorheen het programma gebruikt. Indien variabelen ook in de ISR worden aangewend, dienen zijn voorzien te worden van de prefix ‘volatile’. 80
Figuur 72 geeft dan het tweede deel weer. De variabelennaam spreekt telkens voor zich. Er wordt ook een standaardtraject voorzien, opgeslagen in aparte arrays: één voor hoeken, hoeksnelheden en wachttijden en één voor draairichtingen . Ook worden buffer-locaties voorzien, waar de ontvangen trajecten worden opgeslagen totdat het huidige traject kan geüpdate worden.
Figuur 72: Globale variabelen deel 2
Figuur 73: Intialiseren
81
In Figuur 73 is een eerste subroutine te zien. Hierin worden alle instellingen i.v.m. timers, het configureren van IO-pinnen naar ingang of uitgang en het vastleggen van de default-toestand van de uitgangen uitgevoerd.
Figuur 74: ADC en USART
In Figuur 74 wordt de AD-converter en de USART geconfigureerd. Tevens zijn de functies die worden gebruikt ter verzenden en ontvangen van databyte’s via de USART te zien. Bij het zenden geeft de return-waarde informatie of het verzenden al of niet gelukt is. Bij het ontvangen is dit analoog. Maar aangezien altijd iets gereturnd moet worden, is een bijkomstige boolean nodig die aangeeft of de return-waarde geldig is of niet. Indien iets ontvangen wordt, wordt dankzij deze functie de verschillende timers automatisch gereset.
82
Figuur 75: Pariteitscontrole en SPI-leesactie
Figuur 75 geeft de hulprountine weer om een even pariteitscontrole uit voeren. De return-waarde van de functie is waar indien de controle correct is. Ook een leesactie via de SPI-bus is afgebeeld. Eerst wordt de slave (driver) geselecteerd door de SS-lijn laag te maken en vervolgens de leestransactie uitgevoerd. Nadien wordt een pariteitscontrole uitgevoerd indien de data voorzien is van een pariteitsbit. Bij een correcte pariteit wordt de pariteitbit (MSB) eruit gefilterd (= laag gemaakt) en de overige data behouden. Bij een foutief resultaat wordt de waarde ‘255’ gereturned. Dit maakt dat ook kan gezegd worden dat bij een foutief resultaat de MSB hoog is, bij een correct resultaat laag.
Figuur 76: SPI-schrijfactie
83
In Figuur 76 is de schrijfactie over de SPI-bus te zien. Na de typische schrijf-transactie wordt de weggeschreven waarde ingelezen (via “SPI_MasterRead”). Bij een foutieve pariteit wordt gemeld dat het schrijven mislukt is. Indien geen pariteit voorzien of indien de pariteitsbit correct is, wordt de weggeschreven data en de weg te schrijven data vergeleken en een gepaste waarde gereturned.
Figuur 77: SPI-initialisatie
Net zoals de ADC of de USART geconfigureerd moet worden, moet ook de SPI-communicatie correct opgezet worden. Dit wordt in Figuur 77 weergegeven. Tevens is er een hulproutine te vinden waarbij de meegegeven stroomwaarde wordt ingesteld bij de driver. Dit gebeurt de gepaste register vanuit de driver in te lezen, de stroomwaarde aan te passen en vervolgens terug te sturen naar de driver. Zo kunnen instellingen gebeuren zonder dat de andere data in het register overschreven wordt.
Figuur 78: In -en uitschakelen driver
Figuur 78 geeft nog een voorbeeld van een hulproutine. De meegegeven waarde bepaald of de driver wordt ingeschakeld of uitgeschakeld. Daarbij worden verschillende variabelen in een defaulttoestand gezet om goede werking te garanderen. 84
Ook zijn er reeds routines aangemaakt voor gebruik van het EEPROM-geheugen (nergens afgebeeld). Aangezien deze nog niet op punt staat, wordt deze hier ook niet besproken.
Figuur 79: ISR
De Interrupt Service Routine wordt in Figuur 79 afgebeeld. Na het opwekken van de NXT-puls zelf, wordt de nieuwe intervaltijd voor de volgende puls (“PulseTime”) ingeladen. Indien gebruik wordt gemaakt van de navolgende code die in commentaar werd gezet (verschuiving pull-in naar wenswaarde), vervalt de voorgaande coderegel (“OCR1A=PulseTime;”). Echter, de code in commentaar zorgt niet voor een langzame vertraging van de huidige snelheid naar het pull-in gebied. Tevens is de gebruikte halvering te bruusk. Verder is het bijwerken van de virtuele encoder (“CurrentSteps”) te zien. Meteen daarna wordt de waarde ‘genormaliseerd’ zodat altijd een equivalente hoek tussen 0° en 360° bekomen wordt. De variabele is echter wel uitgedrukt in “fijnst mogelijke microsteps”, in het huidige geval komt 1 full-step overeen met 64 “fijnst mogelijke microsteps”. Als laatste is ook het stopzetten van de pulsgenerator bij het bereiken van de positie (aantal te nemen stappen <=0) te zien. De reden voor “<=” is omdat door gebruik van een grovere microstep, het aantal gezette stappen groter kan zijn.
85
Figuur 80: Update microstep en deel 1 'Move'-functie
In Figuur 80 is nog een hulproutine te zien, alwaar de microsteps worden geüpdate. De driver wordt ingesteld en ook het herberekenen van het aantal gezette “fijnst mogelijke microsteps” per NXT-puls wordt er voorzien. Daarnaast is het eerste deel van de functie ‘Move’ te zien. De interrupts worden er tijdelijk gemaskeerd, de microsteps geüpdate m.b.v. de zonet aangemaakte routine, de gewenste hoek wordt opgesplitst in een aantal volledige omwentelingen en een resthoek. Deze laatste wordt dan naar zijn juiste waarde gebracht (was omwille van transmissieredenen vertienvoudigd). Vervolgens wordt berekend met hoeveel “fijnst mogelijke microsteps” de resthoek overeen komt (=”NewPosition”). Het verschil met de huidige positie geeft de relatieve verplaatsing weer en vertelt ons hoeveel de motor moet verdraaien om zijn nieuwe positie in te nemen. Een negatieve waarde betekend terugkeren. Ook wordt aangegeven dat een nieuwe job wordt gestart en de wachttijd wordt geïnitialiseerd.
86
Uiteindelijk moet het aantal te zetten stappen steeds positief zijn. Daarom wordt in het tweede deel (Figuur 81) bij een negatieve hoek de complementaire hoek berekend. Dit is dan het aantal te nemen stappen indien de motor doordraait i.p.v. weer te keren. Indien een andere draairichting gekozen wordt, dan wordt van de huidige hoek de complementair hoek berekend. Let op dat in principe van het aantal stappen moet gesproken worden i.p.v. hoek. Nadien wordt het aantal volledige omwentelingen erbij geteld. Indien het aantal te zetten stappen groter is dan het aantal dat wordt genomen bij 1 NXT-puls, dan wordt er effectief gedraaid. De tijd tussen twee pulsen wordt uitgerekend om aan de hoeksnelheid te voldoen. Ook wordt de maxsnelheid (20µs!) en de startsnelheid (pull-in!) begrensd.
Figuur 81: Deel 2 'Move'-functie
Vanaf dan volgt het hoofdprogramma alwaar deze functies worden gebruikt. De coderegels werden zoals reeds te zien was ruim voorzien van begeleidende commentaar. We verwijzen dan ook verder in de digitale bijlagen voor het hoofdprogramma.
87
13.2.
Digitale bijlagen
[zie CD-Rom]
88
89