De Instant-Feedback-Chess-Hammer

by JimSolux in Circuits > Arduino

765 Views, 0 Favorites, 0 Comments

De Instant-Feedback-Chess-Hammer

ChessHammer.png

Ontwerpdoel

Ben je slecht in schaken? Weet je niet wanneer je een fout maakt? Ik ook!

Dit project heeft als doel om mij als beginnend schaker te leren wanneer ik een fout maak, en mij daar feedback op te geven, door mij fysiek te straffen.

De instant-feedback-chess-hammer zal jou bij elke serieuze fout die je maakt tijdens het schaken meteen laten weten dat je slecht bezig bent, door een hamer (stok) op jouw hoofd te laten vallen.

Mijn doel en plan was dus om een hamer te maken die bij elke fout tijdens een digitaal spelletje schaken, de speler op zijn hoofd slaat op het moment dat er een serieuze fout gemaakt wordt.


Iteraties

Het plan was om de grote stappenmotor te gebruiken om op verschillende snelheden de speler te kunnen slaan met de hamer, afhankelijk van hoe slecht de fouten van de speler zijn. Hij zou harder slaan als er grovere fouten worden gemaakt. Helaas kwam ik er achter dat deze grote motor een andere motor-driver nodig had, en dat hij een veel grotere stroomtoevoer nodig had dan voorheen vernomen. Hierdoor heb ik de keuze moeten maken om de beweging van de hamer statisch te maken, en in de handen te laten van zwaartekracht.

Ik heb om deze reden gekozen om een trigger te maken die de hamer loslaat op het moment dat je een grote fout maakt.

De python code is nog wel gebouwd om de exacte waarde van jouw fout (bepaald door stockfish, een schaak-algoritme) naar de arduino op te sturen, en zo kun je dus alsnog erg makkelijk de arduino code aanpassen indien je wel de juiste stroomtoevoer voor de stappenmotor hebt. 

Supplies

Scheme.png
boxxje.png
_DSC3356.JPG
_DSC3358.JPG
_DSC3361.JPG
_DSC3363.JPG

Materialen

-         4x houten plaat (45x22x2cm)

-         Arduino Uno

-         SG90 Mini Servo

-         3x houten balkje (7x5x2cm)

-         Houten dekselplaat (22x22x0.5cm)

-         20 Schroeven (2-4cm)

-         Houten lat (hamer) (150x4x2cm)

-         Plint latje (10x4x0,2cm)

-         3D geprint blokje

Tools

-         Arduino IDE

-         Python + Selenium

-         Chess.com account

-         Schroevendraaier/ accutol

-         Houtlijm

-         Schuurpapier / schuurmachine

-         Zaag / tafelzaag

-         Gatenzaag

-         3D printer

En voor de versie met de grote stappenmotor komt daar bij:

-         Stepper Motor - 1.89N.m - 2.8A - NEMA23

-         TB6600 Stappen Driver | 3.5A | 1/32 microsteps | 9-40V

-         10 tot 40V Power supply

Leer Python

Codeding.png

Voor dit project heb ik een redelijk groot python script geschreven, omdat het doel redelijk complex is. De code is helaas erg lang, en het kan simpeler. Dit was mijn eerste python script die ik ooit heb geschreven, maar ondanks het onnodig lange systeem werkt het. In het Code-hoofdstuk hier onder (step 6), staat de code en de uitleg wat de code doet.

In het kort uitgelegd: Ik heb een python script geschreven dat een webbrowser start, en op het moment dat jij in een match zit met een bot, leest het script uit de HTML van de webpagina wat voor beoordeling jouw moves krijgen. Deze waarde wordt opgeslagen, en als deze waarde erg naar beneden gaat (na het maken van een grotere fout) wordt deze code over de COM-port (de USB poort) opgestuurd.

Programma Setup

Ik heb voor dit project gewerkt met python in het programma PyCharm. Je kunt het script gemakkelijk in andere programma’s gebruiken.

Om de code te laten werken moeten de volgende python modules zijn geinstalleerd.

-         Pip (https://pip.pypa.io/en/stable/getting-started/ )

-         Selenium (https://www.selenium.dev/documentation/webdriver/getting_started/install_library/ )

De andere gebruikte modules zijn ingebouwd in python zelf. Als een van de modules toch niet werkt, kun je ze installeren met Pip vanuit jouw command prompt. (pip install moduleNaam).

Test De Data Met Een Servo (of De Stappenmotor)

_DSC3356.JPG

In het code-hoofdstuk van deze instructable staat een simpel arduino script dat in staat is om een servo te laten draaien als de arduino data van het pythonscript opgestuurd krijgt over de COM-port. Daar staat meer uitgelegd over hoe het script werkt.

-         Koppel de servo aan de arduino.

-         Sluit de Arduino UNO aan aan de computer.

-         Zorg dat het Arduino script op hetzelfde serial-nummer leest, als dat het pythonscript de data verstuurt.

-         Selecteer de juiste COM-port in de Arduino IDE en in het pythonscript.

-         Upload het script naar je arduino vanuit de Arduino IDE.

-         Start het pythonscript.

-         Druk in de webbrowser op Q om data op te sturen en kijk of de lampjes van de arduino knipperen om te zien of ze de data binnenkrijgen.

-         Log in op chess.com en start een spel tegen een bot. Zet daarbij onder custom, de evaluation aan.

-         Druk op P om het pythonscript te activeren.

-         Speel het spel en kijk of de hamer valt als de evaluatie waarde omlaag gaat. (Je kunt in het pythonscript zien of de juiste waarde wordt opgestuurd.

Bouw De Behuizing

_DSC3354.JPG
WhatsApp Image 2024-06-28 at 13.17.17 (1).jpeg
WhatsApp Image 2024-06-28 at 13.17.17 (2).jpeg
WhatsApp Image 2024-06-28 at 13.17.17 (3).jpeg
WhatsApp Image 2024-06-28 at 13.17.17.jpeg
WhatsApp Image 2024-06-28 at 13.17.18.jpeg

Vanwege het gewicht en de beweging van de hamer, heb ik ervoor gekozen om een zwaardere, houten behuizing te maken. Het gewicht zorgt ervoor dat hij niet zomaar kan omvallen als de hamer naar beneden komt.

Het bouwen van de behuizing bestaat uit de volgende stappen:

·        Zaag de vier zijkanten op maat en zaag de zijkanten schuin af, op een hoek van 45 graden.

·        Boor links boven in een van de platen een rond gat met een diameter van 6,3cm (pas dit aan op de grootte van de stappenmotor)

·        Maak onderin de plaat die daar tegenover komt een klein gat waar de kabel doorheen komt.

·        Lijm de houten zijkanten aan elkaar vast, schroef ze vast voor stevigheid.

·        Gebruik een dun dekselplaatje, en bevestig deze op een manier waarop hij los kan komen. (Ik heb gekozen voor twee magneetplaatjes die hem op zijn plek houden).

·        Bevestig een blokje linksboven het gat. Dit blokje is er om de hamer tegen te houden.

·        Bevestig een blokje achter de deksel zodat de deksel niet kan verschuiven.

·        Maak een 3d print van een blokje dat de hamer vast kan houden, en gedraaid kan worden door de stappenmotor.

·        Maak het handvat van de lat geleidelijk dunner, zodat deze ongeveer op 30% van de lat vast komt te zitten in het blokje die aan de stappenmotor vast zit.

·        Schroef een van de kleinere latjes op de deksel vast, en maak een opening in het hout waar de servo precies in past.

·        Zet een heel klein houten latje op de servo vast, die straks de hamer gaat tegenhouden. Deze kun je vastlijmen en vastschroeven op de bijgeleverde plastic servo extensie.

Aansluiten En Spelen

Naamloos-8.png
Naamloos-6.png
Naamloos-7.png

Als je ervoor kiest om de stappenmotor te gebruiken, zal je kleine dingen in de Arduino code moeten veranderen, en de servo compleet moeten weglaten.

Sluit de bedrading aan en start opnieuw het Arduino en het Python script. Zet de behuizing neer op tafel en laat de hamer tegen het blokje op de servo aan leunen. Begin een schaakspel op Chess.com tegen een bot, met evaluaties aan. Druk op P om het pythonscript te activeren.

Als je het heel goed doet, dan zul je niet eens merken dat de Instant-feedback-chess-hammer naast je staat, maar zodra je fouten maakt, zal de hamer op je hoofd vallen, waardoor je meteen weet dat je een fout hebt gemaakt. Zo leer je domme dingen sneller af!

Code

Wegens de grootte van de scripts heb ik besloten het bestand bij te voegen als file. Hier kun je hem openen en doorlezen, of direct gebruiken. Ik zal hier kort uitleggen wat de functies doen.

Pythoncode:

De pythoncode gebruikt de volgende modules; time, re, selenium, codecs, string, serial, sys, signal en keyboard.

Het script heeft de volgende structuur:

  • Benoemen van de globale variabelen voor de webdriver
  • Functies (op volgorde van als laatst gebruikt naar eerst gebruikt)
  • Het openen van de serial connectie op de comport.
  • Het starten van RunProgramme(), een functie die op een timer bijhoudt wat er gebeurt.

Wat doet elke functie?

  • RunProgramme() start de webbrowser, en kijkt of er input komt.
  • CheckInput() kijkt of de gebruiker iets op het toetsenbord tikt. P = start game.
  • PrintFinalValue() kijkt of de score op dit moment lager is dan de vorige, en stuurt als dat zo is, de nieuwe waarde naar de arduino.
  • SleepAndReset() reset het berekenen van de beoordeling naar 0 na een nieuw spel.
  • ArduinoTestInput() is een functie om de arduino te testen.
  • ReceiveAndPrintValue() is een functie die de evaluatie uit de HTML uitleest, hij stuurt hem daarna naar printFinalValue().
  • Find_All() kijkt hoe vaak een string voorkomt in een andere string.
  • SeeIfMoveWasMade() Kijkt uit de HTML of er een nieuwe move is gemaakt sinds de vorige keer dat de functie is aangevraagd.
  • timer_counter() is een timer.
  • ChangeValueToState() is een outdated functie die handig kan zijn als de stappenmotor gebruikt moet worden. Deze functie zou beslissen hoe hard de arduino zou kunnen slaan als de evaluatiewaarde met een bepaald getal omlaag gaat.
  • SendValueToArduino() stuurt de evaluatiewaarde naar de arduino toe over de comport.

Onderaan het script, net voor RunProgramme() wordt aangeroepen, wordt arduinoData aangemaakt, de serial connectie met de arduino. Kijk hier goed of de COM-port goed staat!


ArduinoIDE code:

De Arduinocode gebruikt de servo module. Als je de stappenmotor wilt gebruiken, moet je daarvoor de bijbehorende stappenmotor modules gebruiken.

Dit script is erg simpel. Alle belangrijke dingen die gebeuren zijn:

  • In de setup wordt er verbinding gemaakt met de serial poort, waar hij later data kan uitlezen.
  • In de loop kijkt het script of er data beschikbaar is op de serial poort, en als dat zo is, dan zet hij deze data op de variabele "myCmd". Op het moment is het zo dat als het pythonscript data opstuurt naar de arduino, dat alleen zo is als de evaluatiewaarde negatief verandert. Dit betekent dat de hamer meteen gaat vallen als myCmd niet leeg is.
  • De functie temporaryCompare() kan gebruikt worden om te kijken of de oorspronkelijke waarde is verandert. Dan houdt de arduino dat zelf bij, in plaats van het pythonscript. Op dit moment is het niet nodig, maar als je de stappenmotor wilt gebruiken, zal je dit moeten gebruiken.


De code heeft op het moment ongebruikte functies, maar deze zijn allemaal nodig als je beslist om de stappenmotor te gebruiken, en om de snelheid van de hamer daarmee te besturen. Een aantal toevoegingen en veranderingen zijn dan nodig, maar op deze manier werkt de schaakhamer ook!


Conclusie

ittt chess hammer vid 2024

Ik ben erg tevreden met hoe het project is verlopen, en hoeveel ik ervan geleerd heb. Tijdens dit project heb ik voor het eerst Arduino IDE gebruikt, met stroomcircuits gewerkt, Python gebruikt, COM-port communicatie gedaan en voor het eerst een 3D printer gebruikt.

Ik heb veel onderschat in het project, omdat ik het een simpel idee vond, maar het bleek al snel dat er vrij grote uitdagingen zaten. Het bleek moeilijk om html data uit een actieve webbrowser uit te lezen, dus moest ik eerst leren hoe ik met een script een browser kan opstarten en besturen. Daarnaast bleek het besturen van een grote stappenmotor ook moeilijke dan ik dacht, en kwam ik er achter dat je eigenlijk een speciale energietoevoer nodig hebt, net als een grotere en complexere stappenmotordriver. Ik heb veel over deze onderdelen en over programmeren geleerd tijdens dit project, en ook heb ik met hout iets in elkaar gezet wat best veel werk kostte.


Uiteindelijk ben ik heel blij dat ik mijn ironische idee tot uitwerking heb kunnen brengen.

Jim Dekker, student Game Design

ITTT 2024 - HKU