A MiniPlotter blogról...

GOOGLE TRANSLATED ENGLISH VERSION HERE!

Ezt a BLOGOT azért hoztam létre, mert elég sokan nézik, és eléggé elrontotta a normál blogomat. Úgy hiszem lesz elég folytatása is és talán érdemes külön választani. Minden át lett másolva a másik helyről.

Tartalom

 

  Azonosító  Munka Státusz
 1.  MPDC DC motoros plotter készítése (gyakorláshoz, ismerkedéshez)         100%      
 2.  MPS1 Léptetőmotoros plotter készítése (már komolyabb programozási feladatokhoz)         100%     
 3.  MPS1  Alacsonyszintű ( Firmware ) készítése       100%        
 4.  MPS1  C# .NET magasszintű alkalmazás készítése       100%        

És ami a végén elkészül :)) itt egy videó róla.

 

 

 Tervek

  Azonosító  Munka Státusz
T1. MPS1 Különféle firmware és C# megoldások a plotterhez    0  darab  
T2. MPS2 Léptetőmotoros vezérlés a Parallax Propeller mikrokontrollerrel         0%      

 

 

 

 

A MiniPlotter blogról... bejegyzés elolvasása

2D Mini Plotter 1. MPDC (DC motor, DVD mechanika)

 

A Basic Stamp 2 (BS2 24p) basic programozása sokféle lehetőséget nyújt. Első lépésnek a LED villogtatása illetve a hangok megszólaltatása jó játék, azonban most még látványosabb és talán még izgalmasabb dologra gondoltam.

2D Plotter

A linken egy 2D plotter megvalósítás látható ami nem az én művem. A cél hogy otthon kevés pénzből öszeállítható kísérleti berendezést készítsünk .... 

(A kép nem elmosódott, hanem COLORCODE3D kódolással készült térbeli kép (link)

 

 

Előszedtem régi rossz DVD meghajtókat és szédszedtem őket. Engem a fejmozgató mechanizmus érdekelt. Fura módon DC motorokat használnak, azaz egyszerű egyenáramú motort a fej mozgatáshoz. Egy végállás ellenőrző kapcsolóval egészül ki a mechanika. Én úgy gondoltam, hogy az áramkörü panelből még kiszerelek egy egy alkatrészt ami második végállás ellenőrzésre is alkalmas lehet. 

 

Maguk a fejmozgató mechanikák könnyűek, ezért azt találtam ki, hogy a 2D mozgatást az egymásra derékszögben szerelt fej mozgatók végzik, azaz a rajzlap fog mozogni és a toll fog egy helyben állni :))

Szétszedtem a fejeket (melyen a lézer és az optikát mozgató rendszer található). Szépen derékszögű vonalzó segítségével egymásra állítottam és műanyag ragasztópisztollyal összeragasztottam. A fejet két képtartó kampóból készítettem el, de valójában bármi megoldás megfelel.

Egy Signetta tollat elvágtam deréktájon :) és az egyik kiszerelt lézeroptika mozgatóra forrasztottam a műanyag ragasztópisztollyal, úgy hogy tulajdonképpen az optikát kiszúrtam a tollal :))). Így egy esetleges továbbfejlesztés alapjait teremtettem, meg, ugyanis az optika rendszer fel-le tudja mozgatni a tollat (már ha lesz hozzá vezérlő elektronika).

A második fejmozgató rendszerre egy parafa lapot ragasztottam. Ezzel megteremtve a síkot a rajzlapok fogadására. Mivel a rajzterület nem nagy (kb 5x5cm) ezért írógéppapírból sok ennél kicsit nagyobb papírlapot vágtam a rajzoláshoz. Az írólap felfogatásához két csipeszt használtam.  

Na azzal persze, hogy a mechanikai rendszer elkészül, még nem vagyunk készen, hiszen az elektronikai csatolófelületet is ki kell dolgozni. Az eddigi költség közel nulla, hiszen az otthon lévő elfekvő dolgokból készült. Az elektronikánál is a minimál elv érvényesül azaz: a legolcsóbban.

Eszközök:

  1. egyenáramú motor 2db
  2. végállás érzékelő kapcsolók 4db
  3. toll emelő 1 db

A motor vezérléséhez - többórányi szakirodalom és tapasztalatok böngészése után - az L293DNE IC-t használtam. Első körben a végállás kapcsoló és a fej emelő vezérlésekkel nem foglalkoztam. Első nekifutásra pont elég lesz a 2D mozgatás is.

Meg kell hogy mondjam nagyon kíváncsi voltam a DC motorokra, mivel hihetetlen hogy a precíziós mozgásokat ezekre bízták és nem léptetőmotorokra. Az egy más kérdés, hogy a kulissza az egyik esetben csigakerékkel, másik esetben nagy áttétellel van mozgatva: azaz gyorsan megállítható. Az is igaz, hogy az optika mozgatása általam ugyan nem ismert, de az bizonyos, hogy minden irányban mozgatható, és még döntési lehetőség is van. Azt hiszem mindezek összehangolt működtetésével éri el az elektronika a megfelelő működést. 

Szóval az L293DNE adatlapja, és alább az én bekötésem látszik.

JP1 kötendő a motorokra. ( 1-2 DC MOTOR1,   3-4 DC MOTOR2)

JP2 kötendő a Basic Stamp P2..P5 portokra,

... és ennyi.

Az IC elvégez mindent oda vissza vezérlésre alkalmas a bekötés, és már csak azt kell tudnunk, hogy hogyan is megy ez. Az L293 leírásából.

 

1A 2A Működés
"L" "H" EGYIK IRÁNY
"H" "L" MÁSIK IRÁNY
"L" "L" GYORS MOTOR ÁLLJ
"H" "H" GYORS MOTOR ÁLLJ
     
 

Azaz, ha a motorhoz tartozó két bit (jelen esetben 1.DC esetén P2 és P3 BS2 portok) egyforma értéken állnak, akkor a motor nem forog. Ha különböznek akkor a két irány közül valamelyikbe járnak.

Mielőtt az egyik Bebe által készített (pontosabban továbbfejlesztett :))) programot megmutatnám, egy értelmezési elméleti segédlet következzen.

Amennyiben egyszerűen csak beállítjuk  P2 = H és P3 = L értékeket akkor a motor elindul. De nem is kicsit gyorsan :)))) ha gyorsan megállítjuk a P2=L,P3=L értékekkel akkor a motor leáll, de a gyors haladásnak ára van. Egyfelöl a tehetetlenség, azaz nem lesz pontos. Lassan tudja gyorsítani a kulisszát (pláne az alul lévő rendszer) és lassan is áll meg. Így érdemes lelassítani a mozgást. Erre a legegyszerűbb módszer az impulzus-szerű meghajtás. Több megoldás is létezik, használható a PBASIC PWM utasítása is de én a FREQOUT-ot használtam. Ennek értelmezése a PBASIC parancsoknál.  Az is látszik majd a programból, hogy a kettes motor esetén egyszerűen a HIGH és LOW azaz a fentiekkel szemben mégiscsak egyszerű impulzusmentes feszültséget kap a motor. Ennek oka, hogy a két DVD belsőleg különbözik. A 2. motor magasabb feszültségre tervezett, azaz próbáltam a két motor működési jellemzőit közelíteni egymáshoz. A program tehát az én két DVD típusomra egy kiegyenlített megoldást ad. Természetesen ez adaptálható az értékek megváltoztatásával.

Továbbiakban a programot nem részletezem. :)

 

És egyfajta BASIC STAMP példa vezérlőprogram:


 

' {$STAMP BS2p}

' {$PBASIC 2.5}


start:

LOW 2

LOW 3

LOW 4

LOW 5


force VAR Word '0..999

motor VAR Byte '0..1

dir VAR Byte '0..1


'1

motor = 0

dir = 0

force = 400

GOSUB func_motor


'2

motor = 1

dir = 0

force = 400

GOSUB func_motor

'3

motor = 0

dir = 1

force = 400

GOSUB func_motor

'4

motor = 1

dir = 0

force = 400

GOSUB func_motor


'5

motor =0

dir = 0

force = 700

GOSUB func_motor

'6

motor =1

dir = 0

force =400

GOSUB func_motor




'7

motor =0

dir = 1

force =800

GOSUB func_motor




'8

motor =1

dir = 1

force =1200

GOSUB func_motor



'9

motor =0

dir = 0

force =400

GOSUB func_motor




PAUSE 100


LOW 2

LOW 3

LOW 4

LOW 5

END


GOTO start



func_motor:

  IF motor = 1 THEN GOTO func_motor2

  IF dir = 0 THEN

    HIGH 3

    'PAUSE force/50

    FREQOUT 3,force,550

    LOW 3

  ELSE

    HIGH 2

    'PAUSE force/50

    FREQOUT 2,force,400

    LOW 2

  ENDIF

  PAUSE 50

  RETURN

func_motor2:

  IF dir = 0 THEN

    HIGH 5

    PAUSE force/3

'    FREQOUT 5,force*3,1

    LOW 5

  ELSE

    HIGH 4

    PAUSE force/3

'    FREQOUT 4,force*3,1

    LOW 4

  ENDIF

  PAUSE 50

  RETURN



 És végül BEBE amint éppen kiagyalja a programot :)))

 

 

2D Mini Plotter 1. MPDC (DC motor, DVD mechanika) bejegyzés elolvasása

2D Mini Plotter 2. (5/1 Tintapatron, INKJET elmélet)

 Az első 2D Plotter projekt bevégeztetett, hiszen a célt elértem: a gyerekek az alap programozást elvégezték, érdekességként tekintettek rá, további kérdéseket tettek fel és végül saját maguk is írtak programot. 

Továbblépésként már olyan eszköz szükséges, amivel mélyebben el lehet bíbelődni, azaz jobban használható, pontosabb stb. Ehhez újabb 2D plotter építését terveztem, azonban DVD íróból, az abban lévő léptetőmotoros fej mozgatóból, továbbra is a Basic STAMP 2 24p modulból, és egy tintapatronból készítünk egy összeállítást. 

Miért kérdések:

Miért egy új kialakítás - Mert az egyenáramú motoros kialakítás nem elég pontos, és elég gyenge, azaz egy erősebb ráhatás, a toll nagyobb süllyedése esetén eltérések jönnek létre. Ezek pontosíthatók lennének, de mivel az egyszerűségre is törekszünk, nem szenvedni akarok, hanem olcsó és gyors megoldást. Kézenfekvőbb hát egy új célravezetőbb felépítés. Az első próbálkozásoknak és figyelemfelkeltésnek a gyerekek felé már elég volt. :)

Miért léptetőmotor - Szinte magától értetődik, hogy pontosabb pozícionálást jelent, erősebb mozgatási nyomatékot, és nem utolsó sorban álló helyzetbeli rögzítést.

Miért tintapatron - Na erről majdnem letettem, hiszen alig lelhető fel leírás a HP tintapatronok vezérléséről. Röviden a válasz, azért mert nem ér a papírhoz (így nem képez súrlódási ellenállást), nagyon vékony vonalak is lehetségesek és változtatható a vonalvastagság.

Ez a rész a tinta patronról szól.

A HP tintapatronok vezérlésének keresésekor egy régebbi ELEKTOR magazinban találtam az első utalást, ahol egy Dekjet500-as nyomtató tintapatronjának vezérléséről esett szó.

Sajnos ez a patrontípus kifutóban van és elég drága is, ezért próbáltam más - újabb - megoldást fellelni. Meg kell mondjam, hogy nagyon furcsállom, hogy szinte semmi sincs a neten ebben a témában. Sok időbe került mire egy újabb anyagra bukkantam, ahol egy elég drága patront vettek használatba. Ez a megoldás már közel állt. Találtam egy szabadalmi leírást egy konkrét patron típusról, mely végül a teljes sikert hozta, hiszen végre a belső (gyakorlati) felépítés is láthatóvá lett. Innen már meg lehetett tervezni a vezérlést.

Ahhoz, hogy megérthessük a tintapatron működési elvét, olvassuk el ezt a cikket vagy ezt. Ide teszem azon szabadalmi leírási elemeket is, melyek viszont fontosak a megértés szempontjából. http://www.freepatentsonline.com/5946012.html

Ez a leírás a HP15 és HP45 típusú patronokról szól. Utángyártott változatainak ára 1800Ft körüli, ami elég elfogadható az olcsó projektünk kapcsán :)))

Ajánlom megnézni a szabadalom 3,20,27-29,34,36,54 oldalait!

 

Az ábrákat hosszasan lehetne elemezni, de minden benne van a szabadalmi leírásban. A lényeg, hogy egy mátrixba szervezett fúvóka-rendszerről van szó, mely a HP15 és HP45 patronok esetében 300 fúvókát jelent. Ezek 14 szektorban és szektoronként 22 fúvókával vannak kialakítva. A 14 szektor címzését a PS vezetékekkel (P1..P14) végezzük, azon belül pedig az Address (A1..A22) vezetékekkel. A PS vezetékekre 12V-20V feszültséget kell kapcsolnunk, míg az Address vezetékek 5V-os jelszinttel vezérelhetők. Másik fontos dolog a sorrend, ugyanis először kell beállítani az Address vezetéket, és csak utána kapcsolható a PS vezetékre az "ellenállás hevítő" impulzus. Apropó impulzus. Annak szélességét 2µs érték körülire kell meghatározni. 

Ahhoz, hogy a patronon megtaláljuk a megfelelő vezetékeket szükséges még az alábbi pár ábra a szabadalomból.

Nekünk nincs más dolgunk, mint kiválasztani, egy fúvókát! Én a z 1,3,5 lábak meghajtására gondoltam. Ennek hatására a 7. szektor 9. fúvókája lép majd működésbe, ami a tintapatron közepén található.

A vezérlő elektronika 

 Az L293DNE már ismert alkatrészt használom ennek ára 300HUF (1.5USD) ugyancsak nem túl magas. Ezzel a megoldással 4 fúvókát használhatok, de a kísérlethez elég lesz egy is :)))

...mára ennyi mert elfáradtam :))))) holnap új cikkben leírom az elektronikát is.

ui.: a nagy kísérletezésben azt hiszem kinyírtam az ominózus fúvókát :)) :( de van még 299 db !!... 

uui: igen kinyirtam ! :))))) Viszont tényleg továbbra is működik a többi :) Közben kipróbáltam hátha lehetséges 12V helyett 5V-al működtetni. Válasz : nem lehet!

 

2D Mini Plotter 2. (5/1 Tintapatron, INKJET elmélet) bejegyzés elolvasása

2D Mini Plotter 2. (5/2 Tintapatron vezérlés teszt)

Folytassuk a tintapatron témát. Megbeszéltük az elméletet és jöhet a gyakorlat. 

A felhasznált kísérleti áramkör az alábbi képen látható.

A Basic Stamp 2 két portját használom az Address (A) és Primitive select (PS) vezetékek vezérlésére. Ezen felül már csak a testre van szükség (-). A korábbiak szerint a vezérlőprogramnak Először az (A), majdpedig a (PS) jelet kell kiadni. A (PS) jel egy megfelelő impulzus lehet ami kb. 2µs széles. Végül az (A) jelet újra vissza kell engedni testre. 

 

Származási hely: megosztas

Ehhez az alábbi programot használtam.

 

' {$STAMP BS2p}

' {$PBASIC 2.5}

 

prim CON 6

addr CON 5

LOW addr

LOW prim

 

start:

GOSUB drop1

PAUSE 1


GOTO start



drop1:

HIGH addr

PULSOUT prim,100

LOW addr

RETURN

 

  

Végül az eredmény (Bence rajzolt):

 

Származási hely: megosztas

 

Összeállt minden a 2D mini plotter 2. verziójának megépítéséhez. El kell gondolkozni azonban egy problémán. Jelen felállásban én vezérlem a tintapatront közvetlenül. Amikor a plotter vonalat húz, mennie kell annak a programrésznek ami a közel 2µs-os impulzusokat előállítja. Azaz egyszerre kell a fejet is mozgatni és a tintát is adagolni. Sajna a Basic Stamp nem multitaszkos rendszer azaz egyszerre csak egy dologgal foglalkozik és igazi megszakítási rendszer sincs benne.

Tehát elgondolkoznék azon, hogy az impulzusvezérlést "kiszervezem" :) azaz egy egység ki bekapcsolását kell csak vezérelni. Ami könnyű vezérelhetőséget jelent (PENUP, PENDOWN jelleggel) viszont elveszítem a programozott akár cseppszintű fejvezérlést. (vonalvastagság, szélesség stb.) illetve a több fúvóka vezérlési lehetőséget. 

Eme utóbbi azért lényeges, mert akár egy mozdulattal szöveget lehet kiírni, vagy éppen nem plotter üzemmódot használni, hanem nyomtatást sorrol-sorra.

 

 

2D Mini Plotter 2. (5/2 Tintapatron vezérlés teszt) bejegyzés elolvasása

2D Mini plotter 2. (5/3 Mechanika)

 Mivel minden teszten túl vagyok, lassan összeállíthatom a 2D plotter második verzióját. Gyorsan foglaljuk össze milyen jellemzőkkel indítunk.

 - DVD íróból vett fejmozgató mechanika

 - DVD házat használjuk fel a mechanika összeépítésére

 - Léptetőmotoros megoldás

 - Rajzolás HP15, HP45 (51645) tintapatron felhasználásával

 - Ösztött mozgatás: A nyomtatófej mozgatása X irányban történik, a lap mozgatása Y irányban

 - Végállás ellenőrző érintők 2 x 2 darab

 - Mindent egy fa polcra szerelünk, amelyet az OBI-ból is meg lehet  vásárolni

 

1.

Mindkét DVD meghajtót szétszereltem. Kiszedtem belőlük a fejmozgató rendszert. A házat pedig félreraktam.

Származási hely: megosztas

 

2. 

Az egyik fejmozgató rendszer a fa felületre lesz rögzítve mégpedig az optikai rendszeren (annak helyén) keresztül. Ehhez csavarozást és ragasztópisztolyos rögzítést használok. Erőteljesen ügyelni kell arra, hogy fém keretnek semelyik része (különösen a motor) ne érintkezzen a fával, hiszen akkor nem tud majd mozogni. 

Egyfelöl ki kell szedni az optikai rendszert, a két lézer fejet, az optikai rácsokat és persze az elektronikai áramköröket. Érthetőbben: csak a csupasz aluminium "kulissza" maradjon. Nagy valószínűséggel (hasonlóan ez enyémhez) a fejet amikor rögzítenénk a fa alapzatra le fog érnia  motor. Ennek kivédéséhez, és a pontos és elmozdulásmentes rögzítéshez két dolgot tegyünk. 

Én gyurmával körül "zsaluztam" a kulisszát, beletettem az optika helyére egy facsavart és a ragasztópisztollyal műanyaggal kitöltöttem.

Származási hely: megosztas
Nagyrészt próbáltam a tetejét síkban tartani. Mikor megszáradt, második lépésben eltávolítottam a gyurmát. A kulisszát rátettem a fára és gyurmával igazítottam a felülettel párhuzamosra, majd a facsavarral rögzítettem. A kulissza mellé egy külön facsavart is becsavartam ami semmit sem rögzített semmihez. Mindezek után a ragasztópisztollyal körbe folyattam az egészet úgy, hogy oldalt lefolyva a fára is rögzült a fej. A külön elhelyezett csavart is körbeölelte a műanyag, ami a későbbiekben a teljes (elfordulás elleni) tartást segíti. 

Származási hely: megosztas

3.

Kivágtam a DVD fémházból egy darabot amin keresztül fér az Y irányú mozgatószerkezet. Ezután egy viszonylag kényes művelet következik, merthogy az X irányú (második) fejmozgató berendezést a kivágott rész fölé kell lehetőség szerint vízszintesen elhelyezni. Erre én a fém-csavar megoldást használtam úgy, hogy a megfelelő helyeken kilyukasztottam a fémházat.

Származási hely: megosztas
A mechanika alá a csavarok mellé távtartónek 5-ös méretű műanyag tipliket tettem. A becsavarozás után teljesen stabil és mégis a rezgéseket várhatóan részben elnyelő kialakítást kapunk. A fémcsavarokat jól megválasztva a mechanika négy sarkában lévő lyukakban picit elmozdulhatnak, amivel a vízszintes finom igazítást - a rendszer élesítésekor - megtehetjük.
Származási hely: megosztas

4.

A fém házat az ugyancsak OBI-ban vásárolt 2db "L" alakú fémlappal rögzítettem fa alaphoz. Olyan helyen próbáltam a rögzítést megoldani, ahol a két "kulissza" metszi egymást, azaz egymás felett vannak. :) 

A teljes összeszerelés után nagyon stabil összeállítást kaptam. Meglátjuk, hogy mindez hogyan viselkedik majd élesben ;)

Származási hely: megosztas

 

 

 

2D Mini plotter 2. (5/3 Mechanika) bejegyzés elolvasása

2D Mini plotter 5/4 ( nyomtatófej + rajzfelület )

Egyre több részből áll a sorozat :))) Ha valaki figyeli ;)

Szóval most a nyomtatófej rögzítéséről és a rajzfelület kialakításáról lesz szó.

 Legfontosabb dolog, hogy mindenki remélem sokat bicajozik. Ha ez igaz, néha kikerül a főútra is ;) ha ez is igaz, akkor csak nyitott szemmel kell járni. Az autók útközben szétesnek :))) mindenféle sallangot otthagynak maguk mögött az úton. Csavarok, fém alkatrészek stb. Ami kell nekünk az az alábbi képen látható kb. 5mm vastag gumi (nem ismerem behatóbban az autók anatómiáját, de szerintem ez egy méregdrága gumi sárhányó lehetett)

Tehát kerékpározzunk addig, amíg nem találunk egy gumit. Garantálom (!), hogy fél óránál több időt ezzel nem kell tölteni és ingyen van :)))

Származási hely: megosztas

 

A gumiból az alábbi képen látható darabokat vágjunk ki és Ferrobond vagy hasonló gyorsragasztóval rögzítsük távolság tartóként az alsó szerkezet fém felületére.

 

Származási hely: megosztas

Ezután vegyük elő kedvenc együttesünk frissen vásárolt CD lemezét (óvatosan tegyük félre), majd a CD borítót vágjuk szikével és egy fém vonalzóval megfelelő méretűre. Azaz az alsó mechanika tetejének méretére. Végül a vágások mentén tőrjük el ( egy egyetemes fogóval )

 

Származási hely: megosztas

 

 

Származási hely: megosztas

Végül a pillanatragasztóval rögzítsük a műanyag lapot az előzőleg rögzített gumi távtartókra. Megjegyzem, hogy a gumi + pillanatragasztó páros "ütős". Nem kell attól tartani, hogy majd szétesik a szerkezet!

 

Származási hely: megosztas

 

A nagyobbik falat a nyomtatófej rögzítése. Számomra 3 napos fejtörőt jelentett az alábbi felfogatási módszer kitalálása. Merthogy a fejet úgy kell rögzíteni, hogy fel-le állítható legyen (attól függően milyen anyagot teszünk alá). Ne kelljen a patronon változtatást eszközölni, original patronnal használható legyen. Könnyen oldható legyen (mivel a száradás ellen a tartójában kell tartani), és végül teljesen stabilan álljon a nyomtatás folyamat közben. Mindezeket megfejelve egyszerűen legyen elkészíthető.

Nagyon nehezen jött az ötlet, de sikeres lett a végeredmény. 

Szerezzünk egy PC-ből (lehet a szomszédé is) egy bővítőhely takaró lapot. ( ezeket szoktuk lecsavarni ha egy új kártyát helyezünk a gépbe, illetve ezeket szokták tartalékba adni a géphez) Ha ez nincs, akkor a DVD ház maradékából vágjunk egy mutatóujj széles ( egzakt méret :))) kb. 12cm hosszú fémlapot.

A fej stabilitás fontos részeként a fenti gumilapból vágjunk egy darabot és rögzítsük pillanatragasztóval a kulissza tetejére. Ehhez kerül majd a fej egyik oldala.

Származási hely: megosztas

A fémlapot a képen látható módon hajlítsuk meg. Fontos hogy nézd át a lenti képeket, a lényeg, hogy stabil tartást biztosítson a fejnek. Egy menetes fémcsavart csavarjunk a kivágott részbe úgy, hogy először a csavarra felcsavarunk teljesen egy anyát, majd egy másik anyával rögzítjük a fém lapra a csavart. Erra azért van szükség, mert az anyák csavargatásával lehet pontosan beállítani a saját rendszerünkhöz a kellő tartóerőt, azaz hogy fixen álljon a fej.

Származási hely: megosztas

 

Nem írkálom le pontosan, azt hiszem a képeken látszik minden. A patron oldalán fut végig a leghosszabb része a fémlapnak, majd a kulissza mögött elhajlik. Itt fontos, hogy íves hajlítást végezzünk, hogy a fejet könnyen fel tudjuk szorítani. 

Ha a fémlapon a csavar jól van beállítva, akkor a fej le és feltétele egyszerű mozdulat lesz, és a fej fixen fog állni. 

Származási hely: megosztas

 

Származási hely: megosztas

 

Származási hely: megosztas

 

 

Figyelmesebbek látják, hogy az áramköröket a fa lapra illetve a fémházra már rögzítettem is.. :) Igen mert elkészült, de csak a most következő részben írom le a felépítését.

 

2D Mini plotter 5/4 ( nyomtatófej + rajzfelület ) bejegyzés elolvasása

2D Mini plotter 5/5 (elektronika + tesztszoftver )

 

Az elektronika a következő, és a hozzá tartozó BASIC STAMP tesztprogram. 

Az elektronikát egy picit átalakítottam. Mivel a tintapatronon csak egy Primitive Select (PS) vonalat nyitok meg, ezért teljesen felesleges emiatt egy dárga és helyigényes IC-t elhelyezni az áramkörben. Ehelyett két tranzisztort alkalmazok. Másik, hogy van elég címsínem és sok-sok SHIFT regiszterem (74HCT595), azaz könnyen tudnám vezérelni az egy PS jelhez tartozó a 22 fúvókát (A1..A22 address). Ehhez mindössze 3 db SHIFT regiszter és 3 jelvezeték szükséges.

Ne legyek túl törekvő!! Végül majd úgy járok mint a szarka és a farka.... Ráadásul ez egy plotter...

Legyen a gép minimalista :)) Két Address jelet fogok használni, de csak a tapasztalatszerzés céljából, és próbálok egymás melletti fúvókákat választani. Ezzel elméletben vastagabb pöttyöt  fogok rajzolni.

(azóta ezt kipróbáltam és nem egymás mellettiek voltak a pöttyök.. :))) majd kitalálom még)

MIndezek mellett a kulisszák végállását is ellenőrizni akarom. Ehhez a DVD-kből kiszerelt végálláskapcsolókat használom fel. 

Tehát:

  • Tintapatron vezérlés ( két fúvóka)
  • léptetőmotor vezérlés ( 2db)
  • végállás ellenőrzés ( 2 x 2db)

Bár eddig nem említettem, de a BASIC STAMP 2 (BS2p24)áramkört a "Super Carrier Board" fejlesztő panelen használom.  Ez könnyed használatot eredményez. A panelen a BS2 minden kivezetése megtalálható. Erre csatlakozok saját tüskesorral.

Emiatt nem kell csodálkozni, hogy az áramkörben szerepel 12V körüli érték is (mint korábban a tintapatron tesztnél). Kipróbáltam a tintapatront, de sajnos 10V alatt meg sem szólal, tehát 9V-os elemmel nem szükséges próbálkozni, de gondolom mindenki saját tápról fogja hajtani az eszközt, mivel a léptetőmotorok sem keveset fogyasztanak.

Tehát lássuk a áramkört (MPS1 ver 1) rákattintva nagyban is megnézhető.

 

 Az BASIC STAMP 2 Super Carrier Board áramkört a fa "polcra" helyeztem, a fenti vezérlőt pedig rácsavaroztam a plotter fémházára. Az összeköttetéseket szalagkábel részekkel oldottam meg.

 

Származási hely: megosztas

Külön problémát okozhat a léptetőmotor bekötése. Ehhez irányadó lehet az alábbi gondolatsor.

Egy mérőműszerrel mérjük ki az összetartozó tekercsvégeket. Elvileg a motor 4 kivezetése közül két-két egymás melleti lesz az. A Motort jelöljük M1-el, L1 és L2 jelenti a tekercseket, az 1 vagy 2 tekercsvéget kötőjelesen jelölöm. A bekötéskor a J2 csatlakozósorhoz az alábbi hozzárendelést tehetjük meg:

   J2 lábak 8 7 6 5 4 3 2 1
  Motor  M1L1-1 M1L2-1 M1L1-2  M1L2-2  M2L1-1 M2L2-1  M2L1-2  M2L2-2 
                   

 

 A végállás kapcsolókról eddig nem sok szó esett. Én a DVD alaplapján találtam egy minit, a DVD mechanika áramkörén, egy floppy lemez meghajtóban (FDD) (tudom ez csalás mert eddig erről nem volt szó :))) De valójában egy nagyon egyszerű szerkezet, ezért akár kézzel is elkészíthető.

(Két rézlapot ( alkoholmentes dobozos sör ) (alkoholmentes csak azértis, de jó más isch) :)) vágunk ki melyek egyik felét ragasztópisztollyal rögzítjük egymáshoz úgy, hogy fém,esen ne érintkezzenek és a fémlapok egymás felé nézzenek. Az egyik rézlapra finoman kívülről egy szöggel és kalapáccsal üssünk (NEM LYUKAT!) egy kis puklit. És ennyi. A rézlapok távolsága legyen kb 1-2mm. A végére forrasztjuk a vezetékeket.)

A végálláskapcsolókat úgy helyezzük el,  hogy az adott mechanikát végállásba toljuk és ott zárt állást kell hogy felvegyen a kapcsoló. (ezt ellenőrizzük mérőműszerrel) Az adott helyen pillanatragasztóval rögzítjük a kapcsolókat.

Én a legfurább helyekre tettem őket, hiszen bárhol lehetnek a lényeg az, hogy az adott mechanika mindekét végállását tudjuk előre jelezni velük.

Az áramkörökről, majd képeket teszek még fel, de legyen itt egy kis videó is :))

 És egy  kép a papírra rajzolásról.

 

 

Az alábbi -nagyon egyszerű!- tesztprogram csak a fejmozgatásra készült (nem rajzol!): 

 

 ' {$STAMP BS2p}

' {$PBASIC 2.5}
 
l1  CON 4   '12
d1  CON 3   '14
c1  CON 2   '11
 
p1 VAR Byte
p1 = %00010001
p2 VAR Byte
p2 = %00100010
p3 VAR Byte
p3 = %01000100
p4 VAR Byte
p4 = %10001000
 
 
p VAR Word
 
p=10
 
LOW l1
 
start:
GOSUB cw
GOSUB cw
GOSUB cw
GOSUB cw
GOSUB cw
GOSUB cw
GOSUB cw
GOSUB cw
GOSUB cw
 
GOSUB ccw
GOSUB ccw
GOSUB ccw
GOSUB ccw
GOSUB ccw
GOSUB ccw
GOSUB ccw
GOSUB ccw
GOSUB ccw
 
GOTO start
 
 
cw:
SHIFTOUT d1,c1,MSBFIRST,[p1]
PULSOUT l1,1
PAUSE p
 
SHIFTOUT d1,c1,MSBFIRST,[p2]
PULSOUT l1,1
PAUSE p
 
SHIFTOUT d1,c1,MSBFIRST,[p3]
PULSOUT l1,1
PAUSE p
 
SHIFTOUT d1,c1,MSBFIRST,[p4]
PULSOUT l1,1
PAUSE p
RETURN
 
 
ccw:
SHIFTOUT d1,c1,MSBFIRST,[p4]
PULSOUT l1,1
PAUSE p
 
SHIFTOUT d1,c1,MSBFIRST,[p3]
PULSOUT l1,1
PAUSE p
 
SHIFTOUT d1,c1,MSBFIRST,[p2]
PULSOUT l1,1
PAUSE p
 
SHIFTOUT d1,c1,MSBFIRST,[p1]
PULSOUT l1,1
PAUSE p
RETURN
 
A következőkben elvileg már nem készítünk hardvert, csak a firmware-ről lesz szó.
 
És itt még lesz pár kép a végleges hardverről ....
 
 
 
2D Mini plotter 5/5 (elektronika + tesztszoftver ) bejegyzés elolvasása

2D Mini plotter tesztprogram

 A következő tesztprogram az elkészült miniplotter első "igazi" programja.

  • Teszteli a végállásokat
  • Meghatározza a rajzfelület méretét
  • Megrajzolja a rajzfelület kerületét vastag vonallal
  • Soros vonalon némi információt ad vissza

Meghatározásra kerültek a plotter jellemzői is.

Lássuk:

 

' {$STAMP BS2p}

' {$PBASIC 2.5}


motorpause CON 0 'kötelező stepping pause


l1  CON 4   '12

d1  CON 3   '14

c1  CON 2   '11

LOW l1


prim  CON 5

addr1 CON 6

addr2 CON 7

x     CON 0

y     CON 1

left    CON 0

right   CON 1

top     CON 2

bottom  CON 3


switchleft PIN 9      'x1

switchright PIN 8     'x2

switchtop PIN 11      'y1

switchbottom PIN 10   'y2

INPUT switchleft

INPUT switchright

INPUT switchtop

INPUT switchbottom


'fej kikapcsolása

LOW addr1

LOW addr2

LOW prim


'motor fázisállapotok tárolása

maxphase CON 4  'ennyi fázis van

phase VAR Byte(maxphase)

phase(0) = %0001

phase(1) = %0010

phase(2) = %0100

phase(3) = %1000

motorphase VAR Byte(2) 'az adott motor éppen melyik fázisban van

motorphase(x)=0

motorphase(y)=0


position VAR Word(2)      'coord x,y = aktuális pozíció koordinátája

setpos VAR Word(2) 'elérendő pozíció


penstate VAR Bit  ' 1=down=lent van=ír

penwidth VAR Nib ' 0..15 0=weak,legvékonyabb

penstate = 0

penwidth = 12


width VAR Word

height VAR Word


i VAR Byte


DEBUG CLS,"Start 2D Mini Plotter"

'GOTO debugstart

'**************************  program start

GOSUB reset

start:

   GOSUB penup

   setpos(x) = 0

   setpos(y) = 0

  DEBUG 13,DEC 1

   GOSUB gotopos

   GOSUB pendown

   setpos(x) = width

  DEBUG 13,DEC 2

   GOSUB gotopos

   setpos(y) = height

  DEBUG 13,DEC 3

   GOSUB gotopos

   setpos(x)=0

  DEBUG 13,DEC 4

   GOSUB gotopos

   setpos(y)=0

  DEBUG 13,DEC 5

   GOSUB gotopos


   DEBUG 13, "end"

END

GOTO start


'************************** functions , függvények

penup:

  penstate = 0

  RETURN


pendown:

  penstate = 1

  RETURN


gotopos:

  DEBUG 13,"x:",DEC setpos(x),",",DEC position(x)

  IF setpos(x)

    DO WHILE switchleft=1 AND (position(x)>setpos(x))

'      DEBUG 13,"1x:",DEC position(x)

      GOSUB motor_step_left

    LOOP

  ELSE

    DO WHILE switchright=1 AND (position(x)

'      DEBUG 13,"2x:",DEC position(x)

      GOSUB motor_step_right

    LOOP

  ENDIF


  DEBUG 13,"y:",DEC setpos(y),",",DEC position(y)

  IF setpos(y)

    DO WHILE switchtop=1 AND (position(y)>setpos(y))

'      DEBUG 13,"1y:",DEC position(y)

      GOSUB motor_step_top

    LOOP

  ELSE

    DO WHILE switchbottom=1 AND (position(y)

'      DEBUG 13,"2y:",DEC position(y)

      GOSUB motor_step_bottom

    LOOP

  ENDIF

  RETURN



reset:

  GOSUB penup

  GOSUB runleft

  DEBUG 13,"Motor in left position: ",DEC switchleft

  GOSUB runtop

  DEBUG 13,"Motor in top position: ",DEC switchtop

  'Rajztábla méretének megállapítása

  GOSUB runright

  DEBUG 13,"Width:",DEC position(x)

  GOSUB runbottom

  DEBUG 13,"Height:",DEC position(y)

  width = position(x)

  height = position(y)

  GOSUB runleft

  GOSUB runtop


  setpos(x)=0

  setpos(y)=0

  position(x)=0

  position(y)=0

  RETURN


runleft:

  DO WHILE switchleft = 1

    GOSUB motor_step_left

  LOOP

  RETURN

runtop:

  DO WHILE switchtop = 1

    GOSUB motor_step_top

  LOOP

  RETURN

runright:

  DO WHILE switchright = 1

    GOSUB motor_step_right

  LOOP

  RETURN

runbottom:

  DO WHILE switchbottom = 1

    GOSUB motor_step_bottom

  LOOP

  RETURN


motor_step_left:

  IF switchleft=1 THEN

'    DEBUG 13,"Motor go left position",DEC switchleft

    IF motorphase(x)<(maxphase-1) THEN

       motorphase(x)=motorphase(x)+1

    ELSE

       motorphase(x)=0

    ENDIF

    IF position(x)>0 THEN

      position(x)=position(x)-1

    ELSE

      position(x)=0

    ENDIF

    SHIFTOUT d1,c1,MSBFIRST,[phase(motorphase(x)) << 4]

    PULSOUT l1,1

    PAUSE motorpause

    GOSUB drop1

  ELSE

'    DEBUG 13,"Motor in left position",DEC switchleft

    position(x)=0

  ENDIF

  RETURN


motor_step_right:

  IF switchright=1 THEN

'    DEBUG 13,"Motor go right position",DEC switchright

    IF motorphase(x)>0 THEN

       motorphase(x)=motorphase(x)-1

    ELSE

       motorphase(x)=MAXphase-1

    ENDIF

    position(x)=position(x)+1

    SHIFTOUT d1,c1,MSBFIRST,[phase(motorphase(x)) << 4]

    PULSOUT l1,1

    PAUSE motorpause

    GOSUB drop1

  ELSE

'    DEBUG 13,"Motor in right position",DEC switchleft

  ENDIF

  RETURN


motor_step_bottom:

  IF switchbottom=1 THEN

'    DEBUG 13,"Motor go bottom position",DEC switchbottom

    IF motorphase(y)>0 THEN

       motorphase(y)=motorphase(y)-1

    ELSE

       motorphase(y)=MAXphase-1

    ENDIF

    position(y)=position(y)+1

    SHIFTOUT d1,c1,MSBFIRST,[phase(motorphase(y))]

    PULSOUT l1,1

    PAUSE motorpause

    GOSUB drop1

  ELSE

'    DEBUG 13,"Motor in bottom position: ",DEC switchtop

  ENDIF

  RETURN


motor_step_top:

  IF switchtop=1 THEN

'    DEBUG 13,"Motor go top position",DEC switchtop

    IF motorphase(y)<(maxphase-1) THEN

       motorphase(y)=motorphase(y)+1

    ELSE

       motorphase(y)=0

    ENDIF

    IF position(y)>0 THEN

      position(y)=position(y)-1

    ELSE

      position(y)=0

    ENDIF

    SHIFTOUT d1,c1,MSBFIRST,[phase(motorphase(y))]

    PULSOUT l1,1

    PAUSE motorpause

    GOSUB drop1

  ELSE

'    DEBUG 13,"Motor in top position: ",DEC switchtop

    position(y)=0

  ENDIF

  RETURN



drop1:

  IF penstate=1 THEN

    FOR i=0 TO penwidth

      HIGH addr1

      PULSOUT prim,50

      LOW addr1

      'PAUSE 1

    NEXT

  ENDIF

  RETURN



debugstart:

  DEBUG DEC switchleft

  DEBUG DEC switchright

  DEBUG DEC switchtop

  DEBUG DEC switchbottom

  DEBUG 13

  PAUSE 100

  GOTO debugstart

 

 

2D Mini plotter tesztprogram bejegyzés elolvasása

2D Mini plotter firmware v1.00

Elkészült a Miniplotter első firmware verziója.

Ezt nem a gyerekek készítették, hanem szórakozásból én. :)))

A firmeare tehát az előzőek alapján a Basic STAMP bélyegszámítógép-re készült. Az alábbi tudást biztosítja hardver szinten.

  • Vonalvastagság 15 méretben
  • pontrajzolás
  • vonalrajzolás
  • négyzetrajzolás
  • reset
  • home és far pozíciókba térés

A vonalvastagság legvékonyabb méretét kisérleti jelleggel állapítottam meg. Ehhez képes a 15-ös méret 15 db pöttyöt tesz egy helyre.

A négyzetrajzolás csak a derékzögű koordinátarendszerben - a plotter két síkjára párhuzamosan - értelmezett. 

A firmware lekezeli a végálláskapcsolókat, és információt is visszaad a rajzterület teljes méretéről.

Tehát jöjjön a Basic Stamp firmware:

 

' {$STAMP BS2p}

' {$PBASIC 2.5}


motorpause CON 0 'kötelező stepping pause

l1    CON 4   '12

d1    CON 3   '14

c1    CON 2   '11

LOW l1


prim    CON 5

addr1   CON 6

addr2   CON 7


x       CON 0

y       CON 1

left    CON 0

right   CON 1

top     CON 2

bottom  CON 3


id CON $a0


'ram térkép

command      CON 0

width        CON 20

height       CON 22

'penwidth     CON 14 '//byte 0..15 0=weak,legvékonyabb

rect         CON 26 '6,8,10,12 word

  rectx      CON 26

  recty      CON 28

  rectw      CON 30

  recth      CON 32

  recttop    CON recth 'aliases

  rectbottom CON recty

  rectleft   CON rectx

  rectright  CON rectw

  rectx2     CON rectw

  recty2     CON recth

position     CON 34  '2 x Word //coord x,y = aktuális pozíció koordinátája

  positionx  CON 34  '2 x Word //coord x,y = aktuális pozíció koordinátája

  positiony  CON 36  '2 x Word //coord x,y = aktuális pozíció koordinátája

setpos       CON 38  '2 x Word //elérendő pozíció

  setpx      CON 38  '2 x Word //elérendő pozíció

  setpy      CON 40  '2 x Word //elérendő pozíció

line         CON 42  '


cim          VAR Word  'i2c eeprom cim és érték

ertek        VAR Word

a            VAR cim   'általános változók (kizárva amikor i2c eprom)

b            VAR ertek

setposx      VAR a

setposy      VAR a

posx         VAR b

posy         VAR b


'végálláskapcsolók

switchleft    PIN 9      'x1

switchright   PIN 8     'x2

switchtop     PIN 11      'y1

switchbottom  PIN 10   'y2

INPUT switchleft

INPUT switchright

INPUT switchtop

INPUT switchbottom


'fej kikapcsolása

LOW addr1

LOW addr2

LOW prim


'motor fázisállapotok tárolása

maxphase CON 8  'ennyi fázis van

phase VAR Nib(maxphase)

'phase(0) = %0011

'phase(1) = %0110

'phase(2) = %1100

'phase(3) = %1001

phase(0) = %0001

phase(1) = %0011

phase(2) = %0010

phase(3) = %0110

phase(4) = %0100

phase(5) = %1100

phase(6) = %1000

phase(7) = %1001

motorphase VAR Nib(2) 'az adott motor éppen melyik fázisban van

motorphase(x)=0

motorphase(y)=0


penstate VAR Bit  ' 1=down=lent van=ír

penwidth VAR Nib

penstate = 0

penwidth=0


i VAR Word 'általános ciklusváltozó GOSUB ne menjen belőle !

dropi VAR Nib

'j VAR Byte


cmd VAR Byte



'**************************  program start

GOSUB reset

start:

   GOSUB ok

   DEBUGIN SPSTR 1

   GET 0,cmd

   DEBUG cmd,13

   SELECT cmd

     CASE "w"

        GOSUB getparam

        DEBUGIN DEC penwidth

     CASE "0"

        GOSUB gohome

     CASE "1"

        GOSUB gofar

     CASE "r"

        GOSUB reset

     CASE "f"

        GOSUB drawframe

     CASE "b"

        GET width,Word a

        GET height,Word b

        GOSUB getparam

        DEBUGIN DEC ertek

        PUT rectx,Word ertek

        DEBUGIN DEC ertek

        PUT recty,Word ertek

        DEBUGIN DEC ertek

        PUT rectw,Word ertek

        DEBUGIN DEC ertek

        PUT recth,Word ertek

        GOSUB drawbox

      CASE "p"

        GOSUB getparam

        DEBUGIN DEC ertek

        PUT setpx,Word ertek

        DEBUGIN DEC ertek

        PUT setpy,Word ertek

        GOSUB drawpoint

      CASE "l"

        GOSUB getparam

        DEBUGIN DEC ertek

        PUT rectx,Word ertek

        DEBUGIN DEC ertek

        PUT recty,Word ertek

        DEBUGIN DEC ertek

        PUT rectx2,Word ertek

        DEBUGIN DEC ertek

        PUT recty2,Word ertek

        GOSUB drawline

   ENDSELECT

GOTO start


'************************** functions , függvények

penup:

  penstate = 0

  RETURN


pendown:

  penstate = 1

  RETURN


ok:

  DEBUG "MPS1>",CR

  RETURN


getparam:

  DEBUG ":",CR

  RETURN


gotopos:

  'DEBUG 13,"x:",DEC setpos(x),",",DEC position(x)

  GET setpx,Word setposx

  GET position,Word posx


  IF setposx

    DO WHILE switchleft=1 AND (posx>setposx)

'      DEBUG 13,"1x:",DEC position(x)

      GOSUB motor_step_left

    LOOP

  ELSE

    DO WHILE switchright=1 AND (posx

'      DEBUG 13,"2x:",DEC position(x)

      GOSUB motor_step_right

    LOOP

  ENDIF


  GET setpy,Word setposy

  GET positiony,Word posy

  'DEBUG 13,"y:",DEC setpos(y),",",DEC position(y)

  IF setposy>posy THEN

    DO WHILE switchtop=1 AND (posy

'      DEBUG 13,"1y:",DEC position(y)

      GOSUB motor_step_top

    LOOP

  ELSE

    DO WHILE switchbottom=1 AND (posy>setposy)

'      DEBUG 13,"2y:",DEC position(y)

      GOSUB motor_step_bottom

    LOOP

  ENDIF

'PAUSE 5000

  RETURN


gohome:

  GOSUB penup

  GOSUB runleft

  GOSUB RUNbottom

  RETURN

gofar:

  GOSUB penup

  GOSUB RUNright

  GOSUB RUNtop

  RETURN



reset:

  GOSUB penup

  GOSUB runleft

  GOSUB RUNbottom

  'DEBUG 13,"Motor in left,top position: "

  'Rajztábla méretének megállapítása

  GOSUB RUNright

  GOSUB RUNtop

  GET positionx,Word a

  GET positiony,Word b

  DEBUG "W:",DEC a,CR,"H:",DEC b,CR

  PUT width,Word a

  PUT height,Word b

'  GET width,Word a

'  GET height,Word b

'  DEBUG 13,"Width:",DEC a,"Height:",DEC b

  GOSUB runleft

  GOSUB runbottom


  PUT setpos,Word 0,Word 0

  PUT position,Word 0,Word 0

  RETURN


runleft:

  DO WHILE switchleft = 1

    GOSUB motor_step_left

  LOOP

  RETURN

runtop:

  DO WHILE switchtop = 1

    GOSUB motor_step_top

  LOOP

  RETURN

runright:

  DO WHILE switchright = 1

    GOSUB motor_step_right

  LOOP

  RETURN

runbottom:

  DO WHILE switchbottom = 1

    GOSUB motor_step_bottom

  LOOP

  RETURN


motor_step_left:

  IF switchleft=1 THEN

'    DEBUG 13,"Motor go left position",DEC switchleft

    IF motorphase(x)<(maxphase-1) THEN

       motorphase(x)=motorphase(x)+1

    ELSE

       motorphase(x)=0

    ENDIF

    GET positionx,Word b

    IF b>0 THEN

      b=b-1

    ELSE

      b=0

    ENDIF

    PUT positionx,Word b

    SHIFTOUT d1,c1,MSBFIRST,[phase(motorphase(x)) << 4]

    PULSOUT l1,1

    PAUSE motorpause

    GOTO drop1  'és egyben return

  ELSE

'    DEBUG 13,"Motor in left position",DEC switchleft

    PUT position,Word 0

  ENDIF

  RETURN


motor_step_right:

  IF switchright=1 THEN

'    DEBUG 13,"Motor go right position",DEC switchright

    IF motorphase(x)>0 THEN

       motorphase(x)=motorphase(x)-1

    ELSE

       motorphase(x)=MAXphase-1

    ENDIF

    GET positionx, Word posx

    posx=posx+1

    PUT positionx,Word posx

    SHIFTOUT d1,c1,MSBFIRST,[phase(motorphase(x)) << 4]

    PULSOUT l1,1

    PAUSE motorpause

    GOTO drop1  'és egyben return

  ENDIF

  RETURN


motor_step_bottom:

  IF switchbottom=1 THEN

'    DEBUG 13,"Motor go bottom position",DEC switchbottom

    IF motorphase(y)>0 THEN

       motorphase(y)=motorphase(y)-1

    ELSE

       motorphase(y)=MAXphase-1

    ENDIF

    GET positiony,Word posy

    IF posy>0 THEN

      posy=posy-1

    ELSE

      posy=0

    ENDIF

    PUT positiony,Word posy

    SHIFTOUT d1,c1,MSBFIRST,[phase(motorphase(y))]

    PULSOUT l1,1

    PAUSE motorpause

    GOTO drop1  'és egyben return

  ELSE

'    DEBUG 13,"Motor in bottom position: ",DEC switchtop

    PUT positiony,Word 0

  ENDIF

  RETURN


motor_step_top:

  IF switchtop=1 THEN

'    DEBUG 13,"Motor go top position",DEC switchtop

    IF motorphase(y)<(maxphase-1) THEN

       motorphase(y)=motorphase(y)+1

    ELSE

       motorphase(y)=0

    ENDIF

    GET positiony,Word posy

    posy=posy+1

    PUT positiony,Word posy

    SHIFTOUT d1,c1,MSBFIRST,[phase(motorphase(y))]

    PULSOUT l1,1

    PAUSE motorpause

    GOTO drop1  'és egyben return

  ENDIF

  RETURN



drop1:

  IF penstate=1 THEN

    FOR dropi=0 TO penwidth

      HIGH addr1

      PULSOUT prim,40

      LOW addr1

    NEXT

  ENDIF

  RETURN



drawbox:

   GOSUB penup

   GET rectx,Word a

   PUT setpx,Word a

   GET recty,Word b

   PUT setpy,Word b

   GOSUB gotopos

   GOSUB pendown

   GET rectx,Word a

   GET rectw,Word b

   PUT setpx , Word (a+b)

   GOSUB gotopos

   GET recty,Word a

   GET recth,Word b

   PUT setpy , Word (a+b)

   GOSUB gotopos

   GET rectx,Word a

   PUT setpx, Word a

   GOSUB gotopos

   GET recty,Word b

   PUT setpy,Word b

   GOSUB gotopos

   RETURN


drawline:

   ax VAR Word

   ay VAR Word

   aw VAR Word

   ah VAR Word

   signw VAR Bit

   signh VAR Bit


   GET rectx,  Word a

   PUT setpx,  Word a

   ax=a                                  '200

   GET recty,  Word b

   PUT setpy,  Word b

   ay=b                                  '200

   GOSUB penup

   GOSUB gotopos

   GET rectx2, Word a                    '300

   aw=a-ax                               '200-10=190

   signw=aw.BIT15

   GET recty2, Word a                    '100

   ah=a-ay                               '200-10=190

   signh=ah.BIT15                        'előjel         '0

   aw=ABS(aw)

   ah=ABS(ah)


   GOSUB pendown

   FOR i=0 TO ah

      IF signh=1 THEN

         PUT setpy,   Word (ay-i)    '10+0, 10+1, 10+2 ... 10+190

      ELSE

         PUT setpy,   Word (ay+i)    '10+0, 10+1, 10+2 ... 10+190

      ENDIF

      IF ah=0 THEN

         ah=1

      ENDIF                                                      'a=(((aw/4)*(i/4))/(ah/4))*4

      a=(aw/ah)*i                 '1*0,1*1

      IF ABS(a)>aw THEN

         a=aw

      ENDIF

      IF signw=1 THEN

         PUT setpx,   Word (ax-a)      '10+0,10+1

      ELSE

         PUT setpx,   Word (ax+a)      '10+0,10+1

      ENDIF

      GOSUB gotopos

   NEXT

   RETURN


drawpoint:

  GOSUB penup

  GOSUB gotopos

  GOSUB pendown

  GOSUB drop1

  RETURN


drawframe:

   fi VAR Nib

   'PUT rectx,Word 0,Word 0

   GET width,Word a

   GET height,Word b

   'PUT rectw,Word a,Word b

   'GOSUB drawbox

   penwidth=0

   FOR fi=0 TO b/100

    PUT rectx,Word 0,Word fi*100

    PUT rectx2,Word a,Word fi*100

    GOSUB drawline

    GET width,Word a

    GET height,Word b

   NEXT

   FOR fi=0 TO a/100

    PUT rectx,Word fi*100,Word 0

    PUT rectx2,Word fi*100,Word b

    GOSUB drawline

    GET width,Word a

    GET height,Word b

   NEXT

   RETURN

 

 

2D Mini plotter firmware v1.00 bejegyzés elolvasása

2D Miniplotter C# .NET magasszintű alkalmazás

Ezt a példaprogramot is én készítettem, hogy a gyerekekkel való foglalkozás ne mondjon csődöt :)))

A mini plotter alacsonyszintű programja alapvető funkcionalitást biztosít a miniplotter hardver részeihez, azonban ezzel teljeskörűen nem lehet minden munkát elvégezni (jelen esetben nagyon kevés a Basic Stamp memóriája ezért csak a minimálisnál funkció lehet beépítve)

Magasszintű programra kell bízni például:

  • kör rajzolás
  • ellipszis és görbe vonalak rajzolását
  • elforgatott négyzetek
  • kép
  • szöveg

...és lehetne folytatni a sort. Csak a képzeletünk szab határt.

Elkészült egy C# .NET alkalmazás, ami inkább csak egy példa. A példafunkciók:

  • pontok rajzolása
  • körök rajzolása
  • vonalak rajzolása

A programból kiragadok részleteket. Egyfelöl soros vonalkezelés C# alatt, másfelöl a soros vonalon keresztül a Miniplotter vezérlés egyes részletei.

 

        Random rnd = new Random();

        SerialPort comport = new SerialPort("COM2");

        public Form1()

        {

            InitializeComponent();

            comport.NewLine = ((char)13).ToString();

            comport.BaudRate = 9600;

            comport.DataBits = 8;

            comport.StopBits = StopBits.One;

            comport.Parity = Parity.None;

            comport.Handshake = Handshake.None;

            comport.ReadTimeout = 10000;

            comport.Open();

            if (comport.IsOpen)

            {

                MessageBox.Show("opened");

                

            }

        }

A fenti kódrészlet a soros vonal megnyitását mutatja. Mivel a plotter egyes utasítás végrehajtásainak maximális ideje 10sec-nél nem nagyobb, ezért erre az időre állítottam be a timeout értékét, azaz azt az időt, amennyi ideig vár a C# program a plotter válaszára. A többi beállítás kötelező (kivéve a portot :) )

A másik részlet alább azt mutatja be, hogy a komunikációt hogyan építjük fel. Handshake jellegű a kommunikáció. Ez azt jelenti, hogy ha a firmware-t tanulmányozzuk, akkor látható, hogy minden parancs kiadása után várjuk a "prompt" megjelenését  (  MPS1>  ). Ez jelenti az utasítás végrehajtás végét. (Eddig van 10sec ideje a plotternek végezni :) 

Minden parancs kiadása után visszajön a parancs (echo), azaz ezt is figyelhetjük. Mindezeken felül van egy nagyon fontos dolog még. A Basic Stamp soros kezelését a főprogram figyeli. És nem mindig figyeli hiszen mást is csinál. Röviden fogalmazva nincs pufferelve, azaz mindig meg illene várnunk az utasítások végrehajtását és hogy a Basic Stamp odaérjen, hogy a soros vonalat figyelje.

Mivel nem Windows rendszerű a BS2, ezért a végrehajtási idők pontosan meghatározhatók. A programban a Thread.Pause jól használható arra, hogy pontosan 10ms-ot várjunk a parancsok kiadása után. Ez minden esetben elég.

És a részlet:

 

        private void button1_Click(object sender, EventArgs e)

        {

            if (comport.IsOpen)

            {

                comport.DiscardInBuffer();

                write("p");

                if ( comport.ReadChar() == 'p')

                {

                    writeline(rnd.Next(500).ToString());

                    writeline("120");

                    waitforready();

                }                

            }

        }

 

A részlet a pont kirajzolását mutatja. Fontos részlet a writeline függvény és a waitforready.

 

        private void writeline(string s)

        {

            Thread.Sleep(10);

            comport.WriteLine(s);

        }

 

És a másik:

 

        private void waitforready()

        {

            string s1;


            try

            {

                do

                {

                    s1 = comport.ReadLine();

                } while (s1 != "MPS1>");

            }

            catch (TimeoutException) { }

            comport.DiscardInBuffer();

            //MessageBox.Show("Ready.");

        }

 
Nem magyarázom. A fentiek miatt érthetőnek kell lennie. :))
 
És végül a teljes csomag:
 

 

 

 

 

2D Miniplotter C# .NET magasszintű alkalmazás bejegyzés elolvasása

2D Miniplotter Tesztek

Teszteltem a Miniplotter programot (firmware) és hiányosságot tapasztaltam a vonalrajzolás témában. Természetesen vonalat rajzolni többféle módon lehet. A BS2 esetében a probléma többes. Egyik, hogy csak egész aritmetika van, a másik, hogy az egész számok max. 16 bitesek.

Ezen kívül szűk keresztmetszet a memória mérete is. 

Jelen körben a probléma, hogy a vonalrajzolás úgy történik, hogy a plotter minden egyes vonalpozícióban megáll, és egy tintapöttyöt hoz létre, majd tovább megy a következő pozícióba. Ez gyorsan végrehajtódik.

A hiba a kerekítésből adódik, valójában a 360 fokos területben átellenesen 90-90 fokos területen finomfelbontású, azon túl pedig durva és pontatlan. (adódik a programból) Összefoglalva egyáltalán nem egy megfelelő program.

Mellékelem a programot, várom az észrevételeket és jobbító javaslatokat :)

(..és persze a program a letöltéseknél is megtalálható)

 

A kérdéses részlet:

drawline:

   ax VAR Word

   ay VAR Word

   aw VAR Word

   ah VAR Word

   signw VAR Bit

   signh VAR Bit


   GET rectx,  Word a

   PUT setpx,  Word a

   ax=a                                  '200

   GET recty,  Word b

   PUT setpy,  Word b

   ay=b                                  '200

   GOSUB penup

   GOSUB gotopos                         'setpx,setpy pontba

   GET rectx2, Word a                    '300

   aw=a-ax                               '200-10=190

   signw=aw.BIT15

   GET recty2, Word a                    '100

   ah=a-ay                               '200-10=190

   signh=ah.BIT15                        'előjel         '0

   aw=ABS(aw)

   ah=ABS(ah)


   GOSUB pendown                         'gotopos esetén rajzol

   FOR i=0 TO ah

      IF signh=1 THEN

         PUT setpy,   Word (ay-i)    '10+0, 10+1, 10+2 ... 10+190

      ELSE

         PUT setpy,   Word (ay+i)    '10+0, 10+1, 10+2 ... 10+190

      ENDIF

      IF ah=0 THEN

         ah=1

      ENDIF                               

      a=(((aw*5)/ah)*i)/5                 '1*0,1*1

      IF ABS(a)>aw THEN

         a=aw

      ENDIF

      IF signw=1 THEN

         PUT setpx,   Word (ax-a)      '10+0,10+1

      ELSE

         PUT setpx,   Word (ax+a)      '10+0,10+1

      ENDIF

      GOSUB gotopos

   NEXT

   RETURN

 

 

2D Miniplotter Tesztek bejegyzés elolvasása

Miniplotter új firmware (v2)

 Természetesen az idő múlásával előjönnek a problémák. Jelen Basic Stamp 2 program (ebben az összefüggésben nevezhetjük firmware-nek). Egy javított és egyben célorientált változat.

  v1 firmware  v2 firmware
help (h) nem igen 
vonalvastagság igen  igen 
pont rajzolás igen  igen 
vonalrajzolás hibás javított
demo keretrajz igen nem
négyzet rajzolás igen nem

Látszik az összehasonlításból, hogy a kettes verzió nagy jelentősége abban áll, hogy javítottam  a vonal rajzolást. A v1-ben rosszul működött. A demonak és a négyzet rajzolásnak igazából nincs jelentősége, de valójában a memória mérete szabott határokat és emiatt került ki ez a két (lényegtelen) funkció.

Egy elképzelés még van, mégpedig a "hardveres" vonalfajták beillesztése.

A Basic Stamp IDE keretrendszerből feltöltve azonnal be is indul a soros vonal figyelés ahol a helpet is megkapjuk a használathoz. Ezen a soros (debug) vonalon fogjuk tudni használni a plottert.

Következik a C# felső szintű program kialakítása.

Terv szerint HPGL plotter anyagok beolvasásának és bitmap képek vektoros átalakításával áramköri rajzolást végezhetünk.. de erről majd később bővebben ;)

 

Letöltés / download : http://hgplsoft.com/jw15/index.php?option=com_content&view=article&id=7&Itemid=5

 

Miniplotter új firmware (v2) bejegyzés elolvasása