Verslag van bijeenkomst 13 februari 2010

Vandaag was er een lezing van Willem Ouwerkerk over de toerenteller voor 4-taktmotoren en een lezing van Albert Nijhof over het oplossen van sudokupuzzels.

bijeenkomst20100213-1 bijeenkomst20100213-2 bijeenkomst20100213-3

T o e r e n t e l l e r

Op de forthbijeenkomst van zaterdag 13 februari 2010 vertelde Willem Ouwerkerk over de toerenteller die hij aan het maken is voor de motor van zijn kartwagen.

Willem begint met ons een filmpje te laten zien van de start van een race: hij staat opgesteld als tweede in een groep van een stuk of tien karts. Het startsignaal wordt gegeven en de voorste spuit weg. De tweede laat een gat vallen van vele meters en komt dan langzaam in beweging. Wat is daar aan de hand? Moest de bestuurder misschien nog zijn leesbril afzetten en opbergen in zijn borstzakje waarvan de rits wat moeilijk open en dicht gaat?

Willem: Nee, aan mijn reactiesnelheid lag het echt niet. Wel had ik net het koppelingkastje vernieuwd en ja, daar lag de oorzaak (bleek achteraf). Om het probleem te onderzoeken zou een toerenteller handig zijn. Die kun je zo kopen, maar het is natuurlijk leuker om zo'n ding zelf te maken.

De hardware

Als je aan officiële kartraces mee wilt doen mag je niet aan de motor knutselen, op straffe van diskwalificatie De toerenteller moet buiten de motor blijven en pikt daarom de pulsen op met een spoeltje.

Er ontstaat een lange levendige discussie als het schema van de pulsoppikker op het projectiescherm verschijnt en Willem opmerkt: "Soms verandert-ie als hem vastpak". "Storing" is nu het onderwerp, gevolgd door kreten als - capacitaire lading - zeners - afvoer van lading - punt A of B aan aarde leggen - er is geen aarde - metalen kastje - zwevende lading - maakt allemaal niets uit - enz.

De software

Tenslotte komt de byte-forth software aan de orde. De software telt het aantal pulsen. Bij iedere waarneming van een puls wordt er in een interrupt een tellertje verhoogd. Het programma leest de stand om de 2/10 seconde en zet dan de teller weer op nul. Het onthoudt de laatste 6 standen en middelt die. Daardoor is de einduitslag minder schokkerig dan wanneer je alleen de laatste stand zou gebruiken. Soms, zoals bij plotseling heftig remmen, verandert het toerental echt snel. Dat is gemakkelijk te detecteren. In dat geval doet alleen de laatste stand mee in de berekening.

In een gewone forth programmeer je door nieuwe woorden te definiëren boven op de kern. Byte-forth is geen gewone forth, het compileert code die zelfstandig moet kunnen lopen. Je kun dus niet terugvallen op code die in de kern staat. Alle routines die je nodig hebt moeten in die zelfstandige code gezet worden. Nu blijkt dat je bij het omrekenen van de tellerstand naar het toerental (aantal pulsen per minuut) ergens een dubbelgetal met 25 moet vermenigvuldigen. Omdat de vermenigvuldigingsfunctie in dit programma verder niet nodig is, ziet Willem af van de algemene code voor vermenigvuldigen en maakt 'met de hand' een D25* die toe kan met shift en optellen. Dat bespaart ruimte.

: D25* ( ud -- ud*25 )
  2DUP D2* D2* D2*     \ ud*8
  2DUP D2*             \ ud*16
  D+ D+ ;              \ ud*25

Uit het publiek komt het idee om de tijd tussen de pulsen te meten in plaats van het aantal pulsen per periode. Dat maakt het resultaat nauwkeuriger. Het is nog de vraag a) of dat wel nodig is en b) of het programma daardoor eenvoudiger of ingewikkelder wordt.

Wat was er nou aan de hand?

Door de vernieuwing aan de koppeling was er ergens verandering gekomen in de speling, minder dan een millimeter, maar dat veroorzaakte toch dat de motor bij het starten aangreep bij een veel te laag toerental en dat schiet natuurlijk niet op. Overigens is Willem ondanks de startproblemen toch nog als tweede geëindigd, een kwestie van rijstijl...

Albert Nijhof 15feb2010

S U D O K U

In deze lezing die eigenlijk het vervolg is op de eerdere Programmeren-In-Forth-afleveringen demonstreert Albert hoe een Forthprogramma een sudokupuzzel oplost met een aantal verschillende algoritmes.

sudo.f

De sudo.f file staat opzichzelf.

  • Hij is bedoeld om sudoku's op te lossen met de hand.
  • Het hoofdwoord is SU
  • Met het vraagteken zie je het menu.
  • Met [escape] verlaat je het programma weer.

Er zijn meer mogelijkheden, bekijk daarvoor zelf de code.

Zo voer je een nieuwe opgave in:

  1. . Verlaat het programma.
  2. . Selecteer met de cursor een sudoku en kopieer, steeds te beginnen met het woord SUDOKU (zie sasesi.html).
  3. . Plak in Win32forth.
  4. . Druk op enter als er nog geen OK verschenen is.
  5. . Typ SU

De 3 files: sa.f se.f si.f

Deze 3 programma's lossen sudoku's op.

  • sa.f is de simpelste met veel gokwerk.
  • si.f is geavanceerder met zo weinig mogelijk gokwerk.
  • se.f zit daar tussenin.

In sasesi.html zie je ze naast elkaar. Eronder staan opgaven.

De programma's kennen geen menu.

  • Met SUDOKU voer een een nieuwe opgave in, net als bij sudo.f boven.
  • Met OPLOS los je hem op.
  • Met .SDK druk je hem af.

De 3 files gebruiken onderstaande files:

   include an.f
   include su-symbolen.f
   include su-kop-or.f
   include su-statistiek.f
   include su-analyse.f
   include su-aanpassing.f
   include su-im-ex.f
   include su-dot-ana.f

Let op

In an.f staan enkele woordjes die ik gewoonlijk laad voordat ik iets anders ga doen. Op 3 plekken zijn ze afhankelijk van Win32forth:

   regel 8          WARNING
   regel 12 t/m 17  WORDS
   regel 69         CHDIR

Download hier alle bestanden die horen bij deze lezing over sudoku's : sudoku-an.zip.