H-Bot (robot)


H-Bot exerciser
H-Bot Delphi project

Inleiding

Hieronder staat een H-Bot (robot met H vorm).



Dit type robots wordt toegepast in magazijn stellingen, als laser cutter en zelfs voor het opvouwen an T-shirts.
Dit artikel beschrijft de werking van een H-Bot.



De gesimuleerde robot wordt hier als plotter gebruikt.

Links- en rechtsboven staan twee onafhankleijk werkende vaste motoren die een snaar aandrijven.
Die motoren laten de pen horizontaal, vertikaal of diagonaal bewegen.

Onderdelen




Er is één snaar, waarvan de uiteinden aan de pen zijn vastgemaakt.

Theorie

Vertikale penbeweging



Motor 1 beweegt tegen de klok in, motor 2 met de klok mee over dezelfde afstand.
Pen P beweegt omhoog.

Horizontale pen beweging


Motor 1 draait met de klok mee evenals motor 2, met gelijke afstand.
Pen P beweegt horizontaal naar rechts.

Diagonale pen beweging
Die is het resultaat van zowel vertikale- als horizontale beweging.
Pen
 
omhoog  = linker motor CCW  d; Rechter motor CW d (distance) omhoog
rechts  = linker motor  CW  d; Rechter motor CW d
---------------------------------------------------------  optellen
Diagonaal omhoog =  Rechter motor CW 2d
Diagonaal rechts omhoog over afstand d is het resultaat van een 2d draai van motor 2.
De draaiingen van motor 1 heffen elkaar op. Motor 1 staat stil.

Samenvatting:



Bij een diagonale pen beweging draait maar één motor.
De snaar beweging is verdubbeld.

Simulator: gebruik, knoppen en indicatoren.




Het programma

Algemeen
    - bewegingen moeten realistisch ogen: vloeiend zonder geknipper
    - bewegende delen moet als zodanig herkenbaar zijn
    - knoppen moeten de werking tonen en verduidelijken
De H-Bot wordt afgebeeld in een paintbox op het main form.
Dat is echter niet voldoende want wissen van de paintbox voor het herschrijven met de nieuwe situatie
zou hinderlijk geknipper opleveren.
Dat is te vermijden door de H-Bot in een bitmap (mapX) te tekenen en met copyrects
de gewijzigde delen van Xmap naar de paintbox te kopiëren.
Sommige delen van de H-bot worden maar één keer getekend en veranderen niet.
Die achtergrond wordt getekend in bitmap mapA.
Delen B van mapA worden gekopieerd naar mapX. De pen tekent in mapA.
De wielen (waarover de snaar loopt) zijn voorzien van spaken om draaiing aan te geven.
Op de snaar zijn met dat doel paarse puntjes aangebracht.

Timing
DeH-Bot afbeelden na beweging (van een pixel) kost wat tijd.
Die tijd wordt weergegeven samen met het percentage van de tijd.
Na de berekening en tekenen van de nieuwe situatie wacht de processor tot een vaste tijd is verlopen.
Die wachttijd bepaalt de snelheid.

Gemiddeld is 800 microseconde nodig als de pen één pixel is bewogen.

Gebieden en bitmaps



MapA : bitmap waarop de motoren en gebied B met vertikale geleiders, wielen en snaar.
Gebied E is de tekentafel met coordinaaten.
MapA wordt naar mapX gekopieerd.
Map C: bitmap met horizontale geleiders en wielen, ook gekopieerd naar mapX.
MapD : pen houder. Wordt gekopieerd naar mapX.
MapX wordt (partieel) gekopieerd naar paintbox1 om zichtbaar te worden nadat de spaken en paarse punten zijn aangebracht.

Delphi code


Voor details verwijs in naar de source code.

Units
    - unit1 : simulator controle, constanten, variabelen, teken procedures.
    - Unit2 : TDav7ELbox is een Tpaintbox component met enter- en leave events
    voor de motor knoppen.
    - Timer_unit: code om de CPU ticks om te zetten naar een microseconden klok, mede voor snelheids regeling.
    - Demo_unit: verzotgt 3 demos om de H-Bot in werking te tonen..
Unit1 procedures en functies
PaintmapA, paintmapC, paintmapD,paintLeftMotor,paintRightMotor : spreken voor zichzelf.
PaintB : tekent gebied B op mapA.
PaintE: tekent coordinaten stelsel E op mapA.
procedure paintchain(mp: Tbitmap;x1,y1,x2,y2 : word);// tekent snaar op bitmap mp (x1,y1)--> (x2,y2)
XpartialToBox; //mapC, B gebied --> paintbox, dit zijn de bijgewerkte rechthoeken van mapX
procAWheelmovement; //teken spaken op wielen in B gebied.
procCwheelmovement;//teken spaken op wielen in C gebied.
procBeltMovement;// teken paarse stippen op snaar.
In geval van de laatste drie procedures: de positie van de spaken en de punten is berekend
vanuit de positie van de pen.
(0,0) is het midden van het E gebied.
De coördinaten van E lopen van (-320,-320) links boven naar (320,320) rechts onder.
De procBeltMovement code is vrij lang omdat de snaar is onderverdeeld in horizontale en vertikale stukken
afgewisseld door cirkelbogen om alle wielen.

Pen beweging
Dit simulator project heeft een educatief doel.
Daarom is er voorzien in meerdere knoppen om de werking van de robot te tonen.
    1. aansturen van de motoren om de pen beweging te zien.
    2. aansturen van de pen om de motor bewegingen te zien.


Hierboven staan vier paintboxen met toegevoegde on-enter en on-leave events.
De code staat in unit2. De paintboxen zijn op run time gecreëerd.
De linker muisknop op de top helft (L knop) beweeft de linker motor CCW (tegen de klok in).
Op de onderste helft is de beweging CW (met de klok mee).
Deze akties hebben tegenovergesteld effect met de rechter muisknop.
De R paintbox gedraagt zich overeenkomstig, maar drijft de rechter motor aan.
De L+R knoppen laten beide motoren bewegen in dezelfde of in tegengestelde richting.



De pen bewegen zonder te tekenen:
Rechter muisknop op het bolletje, beweeg in gewenste richting.
Laat muisknop los als juiste positie is bereikt.
Gebruik de linker muisknop om wel te tekenen.
Een mouse down event op het bolletje set de movebusy flag.
Die flag maakt volgende mouse move events mogelijk.
De pen control paintbox is verdeeld in cellen, het cell nummer wordt vertaald naar de richting code voor de pen.



Links afgebeeld zijn de paintbox cellen, rechts de richting code.
Procedure procXpainting set de moveflag en roept procedure procmove aan zolang die true is.
Procmove regelt de snelheid. Als maar één moter werkt dan wordt de wachttijd verdubbeld omdat
de motor de dubbele afstand moet draaien om de pen diagonaal te bewegen.
Procmove roept moveControl aan om de nieuwe pen positie te berekenen (penPosX,penPosY),
mapX bij te werken en delen van mapX naar paintbox1 te kopiëren.
Buiten de grenzen van het E gebied reset procMove de moveflag zodat de pen beweging stopt.

De demo unit

Er zijn drie demo's. De demo knoppen delen het OnClick event.
Hun tags 1..3 onderscheidt ze.
Een klik roept procedure startdemo(demoNr) aan.

Demo 1:
Plot de parameter functie
    X = 150(sin(8t)+sin(t))
    Y = 150(cos(8t)+cos(t))
Waarin t loopt van 0…2*pi in 500 stappen.
Voor elke waarde van t worden x en y berekend en procedure movetoXY tekent een lijn naar de nieuwe (x,y) positie.

Demo 2:
Is gelijk aan demo1 maar de functie is
    X = 500(sin(9t)*cos(9t)*sin(7t))
    Y = 275(sin(9t)*cos(7t))
Procedure movetoXY(x,y)
Deze procedure roept procmove( direction) aan op weg naar pen position (x,y);
Eerst worden waarden Xstep en Ystep berekend om x en y mee te verhogen.
Er is horizontale- en vertikale (lijn) orientatie.





horizontale orientatievertikale orientatie

Demo 3
Deze plot een paar lijnen tekst.
Deze tekst staat in array demotext samen met de begin coördinaten en de font hoogte.
Procedure startdemo(3) roept procedure painttextline(line nr) aan voor elke regel.
Painttextline roept drawdemochar(x,y) voor elk teken op de regel.
Drawdemochar uiteindelijk roept movotoXY(x,y) en procmove(direction) aan.

Blijft over hoe de parameters voor procedures movetoXY ( ) en procmove( ) worden bepaald.
Een bitmap genaamd scanmap (breedte=60, hoogte=60 pixels ) wordt gewist voor elk teken,
de achtergrond zwart gemaakt.
Daarop wordt het teken gezet met rode kleur en witte achtergrond.
De zwarte achtergrondkleur geeft de omtrek van het teken weer.


scanmap.

Drawdemochar heeft variabelen scanX, scanY en x, y die allemaal naar pixels wijzen in scanmap.
Eerst worden scanX en scanY op 0 gezet:
functie scanChar(var scanX,scanY) : Boolean; wordt aangeroepen.
Die scant scanmap (links naar rechts, van boven naar onder) om een rood pixel te vinden.
Is dat het geval dan wordt waarde true afgeleverd.
ScanX,scanY wijzen dan naar het eerste rode pixel van het teken.
Daarna zet drawdemochar een punt.
x wordt nu gelijk gemaakt aan scanX , y aan scanY en functie subscan(var x,y; var dir) : Boolean wordt aangeroepen.
Die zoekt naar aangrenzende rode punten van (x,y).
Indien gevonden wordt true aangegeven samen met de richtingcode voor procedure procmove( ).
x en y worden bijgewerkt om de nieuwe pixel aan te geven.
Als de subscan false afgeeft dan wordt scanChar opnieuw aangeroepen om overgebleven rode pixels op te sporen
te beginnen bij scanX,scanY.
De characters in scanmap worden getekend in het roman font.
De GoDemoFlag bewaakt de demo processen.
Een klik op de stop knop reset de GoDemoFlag wat het demo proces stopt.

Dit is het einde van de H-Bot simulatorbeschrijving.