De sudokuplotter

Dit bericht is geschreven door Jos Feenstra en Joren Vrancken, 
6 VWO leerlingen van het Wolfert Lyceum in Bergschenhoek. 
Hun begeleider is Dov Scheinowitz, hoewel die mij verzekerde: 
"Maar ze hebben zeer zelfstandig gewerkt, hoor. 
Het was voor mij zeer makkelijk."

In het laatste jaar van de middelbare school moet elke leerling een profielwerkstuk maken. Dit werkstuk dient als een soort “meesterproef”, en is onder andere bedoelt om leerlingen voor te bereiden op grootschalige projecten. Na veel brainstormen hadden wij ons onderwerp gevonden, een sudokuoplosmachine (later noemde we deze de sudokuplotter). Het idee achter de machine klinkt simpel: de plotter moet een sudoku herkennen, oplossen en invullen, maar deze opgave bleek al snel lastiger te zijn dan we voorheen bedacht hadden. Toch hebben we na drie maanden vol ontwerpen, bouwen en problemen oplossen eindelijk onze plotter afgekregen.

De plotter werkt als volgt:

Ten eerste zal er een foto van de sudoku worden gemaakt. De foto wordt doorgestuurd naar de Raspberry Pi. Hier zal het complete verwerkingsproces ervoor zorgen dat de foto uiteindelijk wordt omgezet in een stappenplan voor de motoren. Dit stappenplan stuurt op zijn beurt de mechanica aan. De pen zal zich langs elk vakje bewegen en het gewenste getal invullen indien nodig. De getallen die de plotter schrijft lijken op digitale getallen, aangezien ze eenvoudig schrijfbaar moesten zijn. Wanneer het schrijfproces klaar is zal de pen terugkeren naar een standaardpositie, waarna de opgeloste sudoku weer losgemaakt kan worden.

Demo opzetDe mechanica

de plotter moet drie bewegingen aan kunnen sturen.

  • De pen van links naar rechts en van rechts naar links te bewegen, in andere woorden: De ‘’X’’ van de pen aanpassen.
  • De pen van voor naar achter en van achter naar voor te bewegen, in andere woorden: De ‘’Y’’ van de pen aanpassen.
  • De pen op het papier te drukken en van het papier af te halen, oftewel de hoogte of “Z” van de pen aanpassen.

Om deze drie bewegingen aan te sturen zijn er dus drie respectievelijke motoren nodig, de X-, Y en Z-motor. Het mechanisme voor de Z-motor is een relatief eenvoudig systeem. Deze motor is aangesloten op een schijf, waar vervolgens de pen op is bevestigd. Door nu de schijf links- of rechtsom te draaien kan de pen op en neer bewogen worden. Een belangrijk detail van dit Z-mechanisme is dat de schijf niet is vastgelijmd, maar vastgeklemd zit op de as van de Z-motor. Hierdoor is het mogelijk om de motor door te laten draaien als de pen al op het papier gedrukt zit, wat resulteert in een lichte druk die de pen uitoefent op het papier. Deze druk is essentieel voor de plotter om met duidelijke, rechte lijnen te schrijven.

Close up penNu de pen op het papier kan worden gedrukt moet de plotter in staat zijn de X en Y van de pen aan te passen. Deze verplaatsing moet behaald worden uit de rotatie van de X- en Y-motoren. Om dit voor elkaar te krijgen, hebben wij gebruik gemaakt van wormwielen in samenwerking met aluminium buizen. De wormwielen hebben een bijpassende “mal”, waar de schroef precies doorheen past. Door deze mal vast te zetten op een blok dat over de buizen kan glijden, zal het blok heen en weer te bewegen wanneer de schroef gedraaid wordt. Deze techniek is in totaal drie maal toegepast op de plotter. De Z-motor met de draaischijf vormt samen met een mal voor de schroef en gaten voor de buizen de zogenaamde B-module. Door deze module zijn vervolgens twee buizen en een schroef geschoven, wat als een soort rails beschouwd kan worden. De rails is op zijn beurt aan weerskanten bevestigd aan twee ‘’connectieblokken’’, die wij A-modules hebben genoemd. De X-motor bevindt zich op een van de twee blokken, en is aangesloten op de schroef, wat ervoor zorgt dat de X-motor de B-module naar links/rechts kan bewegen. Dit gehele apparaat (de B-module, de rails, de X-motor en de twee A-modules) bevindt zich weer op 2 railsstukken die bevestigd zijn op de grondplaat. Ieder railsstuk bestaat elk ook weer uit twee buizen en een schroef. Door een ketting tussen de twee wormwielen te laten lopen, en één van de twee wormwielen aan te sluiten op de Y-motor, kan nu het hele schrijfapparaat naar voren of achteren verplaatst worden bij het draaien van de Y-motor.

De ketting en tweede schroef voor de Y-beweging is noodzakelijk om de beweging goed te laten verlopen. Bij het testen van een prototype zonder deze onderdelen namen wij waar dat de A-module zonder schroef dan met achterstand meegetrokken werd door de A-module met schroef. Dit kwam doordat de “trekkracht” die de schroef uitoefent niet gelijk verdeeld was over het gehele schrijfapparaat. Er moest dus een tweede schroef komen met of een ketting, of een extra motor. Dit laatste hebben wij niet gekozen, omdat de Raspberry Pi moeite kreeg met het aansturen van een vierde motor.

De code

foto plotterAlle code wordt uitgevoerd door de Raspberry Pi, het brein van de sudokuplotter.

De Raspberry Pi is een computer ter grote van een creditcard en perfect voor dit soort projecten. Aan de Raspberry Pi zitten twee modules aangesloten: een camera om de foto mee te maken en een Piface, hiermee kan men motortjes aansturen.

 

De code bestaat uit drie gedeelte:

Stap 1) Het herkennen van de sudoku in een foto.

Stap 2) Het oplossen van de gevonden sudoku.

Stap 3) Het invullen van de getallen door middel van het aansturen van stappenmotoren.

Stap 1 is ingewikkeld, er wordt een foto gemaakt door de camera en deze wordt met veel fotobewerking binnen 8 seconden door de Raspberry Pi opgelost. Het daadwerkelijke herkennen gebeurt door een proces genaamd optical character recognition.

Stap 2 is relatief wat makkelijker, we gebruikte een heel bekend backtrack algoritme, Algorithm X. Omdat een algoritme programmeren iets gebruikelijker is, was het programmeren hiervan in vergelijking met de andere twee stappen redelijk simpel. De Raspberry Pi lost een moeilijke sudoku op in ongeveer 5 seconden. Maar op een moderne machine ligt deze tijd onder de 0,3 seconden.

Stap 3 is waar alle magie gebeurt, het aansturen van de stappenmotoren waardoor de mechanica tot leven komt. Het programmeren was hier niet het lastige gedeelte, wat echt lastig was is het hardware gedeelte, zorgen dat alle motoren genoeg stroom krijgen en niet oververhitten.

 sudokuDe taakverdeling

Het kiezen van dit onderwerp hebben we vooral berust op onze beste vaardigheden, en hieruit hebben we dan ook een specifieke taakverdeling gemaakt. Jos zorgde voor het mechanische gedeelte, omdat hij erg goed is in mechanica en ontwerpen. Joren daarentegen hield zich vooral bezig met het schrijven van de code, aangezien hij al een ervaren programmeur is. De afhankelijkheid die ontstond door deze ‘’specialisaties’’ zat ons project niet in de weg. Integendeel, het zorgde ervoor dat we veel respect hadden voor elkaars werk en dat we elkaar niet in de weg zaten. Deze taakverdeling is waarschijnlijk ook de reden dat we uiteindelijk geslaagd zijn met ons ambitieuze idee. Wij zijn zeer trots op het resultaat, en het is ook oprecht het grootste, leerzaamste, en meest uitdagende project van de afgelopen 6 jaar geweest.

3 comments on “De sudokuplotter

Geef een reactie

Het e-mailadres wordt niet gepubliceerd. Vereiste velden zijn gemarkeerd met *