3. rész Párhuzamos

Vezérelni egy beprogramozott számítógéppel.

Egy kis vicc! Természetesen nem így fogunk robotokat vezérelni, de akár így is lehet,
Viszont ezen a kis projekten leegyszerűsítve megragadhatjuk a lényeget..

 A képernyőről, egy fényérzékeny elektronikai elem segítségével kapcsolgatom ki-be, illetve  programozva villogtatom a LED-et. Ha egyszerre több LED-et vezérlünk, úgy, hogy egy időben küldjük a vezérlő utasításokat mindegyiknek, azt hívjuk párhuzamos vezérlésnek.
A LED az elektromos energiát fénnyé alakítja. Az egyik legfontosabb különbsége a villanykörtéhez képest, hogy csak az egyik irányba vezeti az áramot.
Videó:
https://www.youtube.com/watch?v=23ItjARIYnE

Itt van html-be ágyazott JavaScript kódja. Ha van kedved kipróbálhatod, bár nem fontos...

<html>
<head>
<title>Próba</title>
<style type="text/css"><!--
body { font-family: Arial, Helvetica, sans-serif; font-weight: bold;font-size: 40px; color: #58408F; text-align: center; background-color: #000000;}
--></style>
<style>
#myDIV {
    width: 100px;
    padding: 10px 0;
    background-color: white;
    margin-top:200px;
    margin-left:200px;
}
</style>
</head>

<body>
<input type="button" value="Ki" onclick= "eltünik();" />
<input type="button" value="Be" onclick= "feltünik();" />
<input type="button" value="Blink" onclick= "blink();" /><br>
<div id="myDIV"></div>

<script>


var x = document.getElementById('myDIV');

var eltünik = function() {
x.style.display = 'none';
};


var feltünik = function() {
x.style.display = 'block';
};

var blink = function() {
setTimeout(eltünik, 500);
setTimeout(feltünik, 1000);
setTimeout(eltünik, 1500);
setTimeout(feltünik, 2000);
setTimeout(eltünik, 2500);
setTimeout(feltünik, 3000);
setTimeout(eltünik, 3500);
setTimeout(feltünik, 4000);
setTimeout(eltünik, 4500);
setTimeout(feltünik, 5000);
setTimeout(eltünik, 5500);
setTimeout(feltünik, 6000);
setTimeout(eltünik, 6500);
setTimeout(feltünik, 7000);
setTimeout(eltünik, 7500);
setTimeout(feltünik, 8000);
};
</script>
</body>
</html>


Vezérlés párhuzamos porton keresztül, laikusoknak: 

A párhuzamos port (nyomtató csatlakozója) működése röviden.
A PC párhuzamos interfészére (portjára, avagy csatlakozójára) a kezdeti időkben csak a nyomtatók csatlakoztak. Az egyre nagyobb tudású hardvereszközök megjelenésével egyre több eszköz jelent meg ilyen interfésszel. (pl. szkennerek, adatgyűjtő és vezérlő egységek, hordozható merevlemez, stb.)
A PC hátlapján található párhuzamos 25 pólusú.





A számítógép fizikai egységeit adatokkal vezéreljük. Ezen adatsorok, legkisebb egysége a bit. A bitet a számítógép gépi kódjában vagy egyel jelöljük, vagy nullával. Ha 1 van a kódban, az azt jelenti, hogy egy áramkört bekapcsolunk. Ha 0 van a kódba, az azt, hogy nincs áram az áramkörbe. A gépi kódban a kód így csak nullákból, és egyekből áll. Ez pl egy részel a gépi kódból: 00100100 01100001
Mindent programot, bármely programnyelven is írták, a számítógép gépi kódra fordítja, és ezen kommunikál a nyomtatóval is.
A gépi kód adatsorában a következő legkisebb egység a bájt. A bájt 8 bitből áll. Ez egy bájt: 0000 0001 Egy byte-nak 256 variációja van!
A nyomtató csatlakozója azért párhuzamos, mert egyszerre egy bájt adatot képes küldeni, azaz nyolc bit-et. Tehát nyolc "villanykapcsolónak" küld adatot egy időben, hogy melyik kapcsoljon be, és melyik ki. Tehát a 25 vezetékből nyolc érpár, vagyis 16 vezeték ezt   célt szolgálja. Evvel egyszerre tudom le, vagy felkapcsolni a lakásba a villanyt, a hűtőt, a tv-t, és még öt valami mást. A 16 vezeték úgy oszlik meg, hogy van 8 "fázis"  a biteknek, a másik nyolc csak földelés, amelyek valójában össze vannak kötve, sőt, a számítógép dobozával is... Így amikor az egyik bit érintkezőjére rákötünk egy LED megfelelő lábát, a másikat már bármelyik földvezetékhez, vagy akár a számítógép dobozára is köthetjük. A 25 érintkezőből a 2., 3., 4., 5., 6., 7., és 8. 9. számú lyukról van szó. Ezen kívül, mint már említettem, hogy van 8 darab földelés, amelyek valójában össze vannak kötve, ezekre a fenti képen a 18., 19., 20., 21., 22., 23., 24., 25. érintkezők.Most csak ezek a fontos nekünk. Vannak állapot, és ellenőrző funkciót betöltő érintkezők, de most ezekkel nem foglalkozunk. A fázis avagy valódi nevén a digit érintkezők  bit kiosztása a következő. Amikor kiküldünk egy ilyen bájt parancsot: 0000 0001 , akkor a második lyukba nyomott LED fog világítani. Amikor ilyet: 1000 0000, akkor a kilencedik lyukban lévő. Amikor ilyet: 0000 0000 Akkor egyik LEDse fog világítani, és amikor ilyet: 1111 1111 Akkor mindegyik LED világítani fog!

LED, mint hardver:

http://people.inf.elte.hu/vaszlo/lpt02.jpg
Először csináljunk egy ilyen egy, vagy akár nyolc LED-es alkalmazást, amin megfigyelhetjük,  és elsajátíthatjuk párhuzamos port vezérlésének az alapjait.
Fontos! Ezeken az érintkezőkön +5V  jelenik meg, amikor a parancs bájttal bekapcsoljuk. A LED csak akkor világít, ha a megfelelő lábát dugjuk a lyukba. Ha a polaritást felcseréljük, akkor nem fog világítani, akkor se, ha fel van kapcsolva, tehát nem történik semmi..Azért, mert a LED egyenirányító, vagyis csak az egyik irányba vezeti az áramot, a másikba nem.  A legfontosabb pedig az, hogy ne zárjuk rövidre az érintkezőt, mert amikor rákapcsoljuk az 5V-ot, az érintkező, vagy még az alaplap is tönkre mehet. Sőt, még a jó irányba kötött 5mm-es LED-nek sincs elég nagy ellenállása, így sorba kell kötni rá egy ellenállást (kb. kb.  egy 470 Ohm-os, 0,25W
) hogy biztonsággal használjuk. Erről majd többet olvashatsz a 4. részben, vagy/és itt.:
https://megaled.hu/hu/cikkek/13-led-ekrol-kezdoknek
http://ledcalc.com/#calc
 Persze még így is, régi, értéktelen számítógépen érdemes kipróbálni, saját felelősségre... Ha félted a gépedet de kipróbálnád, akkor használjad a Parmon programot (lejjebb), az mutatja virtuálisan, hogy mit csinálnának a LED-ek, ha használnád őket!
http://skory.gylcomp.hu/kezdo/index.html

Leválasztás:
Amikor majd nem LED-eket, hanem komolyabb gépeket akarunk vezérelni, akkor azt, nem fogjuk tudni így vezérelni, hanem egy leválasztó egységre lesz szükségünk.
A leválasztás azért kell, hogy még véletlenül, se terheljük túl a párhuzamos portot,  vagyis még véletlenül se kerüljön rá nagyfeszültség, áramerősség. A leválasztás azt jelenti, hogy a számítógépünket, és a vezérelt gépünket fizikailag szétválasztjuk. Egy olyan egységet használunk, ahol a LED-ek fényét optokapcsolók érzékelik, és ezek kapcsolgathatják a nagyfeszültségű eszközöket, pl. otthon a villanyt fel-le.
Ilyeneket lehet kapni, de ezekről és robotjainkat mozgató a motorokról az 5. részben lesz szó!

Analóg vezérlés. 
Ha ilyenre lenne valakinek szüksége, akkor itt:
http://mselectronic.uw.hu/pic/lpt%20merokartya/merok_dok_2_netes.pdf

A párhuzamos portunk programozása:

A párhuzamos portot a következő nyelvekkel lehet programozni:
ASSEMBLY, Basic variációk, Pascal variációk,  C variációk (C++), C#, Java,
(Talán lehet Javascipttel is, de baromi bonyolultan, érthető dolgot nem találtam. A Javascriptnél alapvetően letiltották, hogy a böngészővel vezérelni lehessen.)
Kapcsolgatni a biteket ki-be lehet DOS-t használva, a megfelelő parancsok beírásával is.
A DOS egy operációs rendszer, amit egyébként a Windows is tartalmaz.
Azonban, a Windows rendszereken, már az XP-n is a Microsoft nehezítette a portokhoz való hozzáférést, és csak egy DLL fájl segítségével lehet ezt megvalósítani. Ezért a DOS mikéntjével most nem foglalkozok, mivel nekem még XP-m van, azt írom le elsőként, hogyan lehet Windows rendszereken programozni a portot. Ráadásul a DOS-paranccsal csak ki be lehet kapcsolgatni, a LED-eket, de nem lehet programozni, hogy saját maga csinálja meg. Később majd bővítem az egyéb lehetőségekkel.
Szerencsére a IO.ddl fájl használata nem bonyolult, Windows alol sem vezérelni a párhuzamos portot (LPT).

Parmon program:
Ha csak ki szeretnéd próbálni programozás nélkül a LED-ek ki-be kapcsolását, akkor elég letöltened ezt a kicsi programot!
Ez egyébként Visual Basic 6-tal készült.
Arra is jó, ha csinálod a programozást, akkor evvel helyettesítheted a LED-eket, mert mutatja grafikusan melyik bitet kapcsolod fel-le...

Itt most úgy állítottam be a színeket, hogy ha van áram az érintkezőbe, akkor zöld. Láthatod, hogy a 2-9-ig szürke, és a 378-asra vagyis ezekre a kiküldött bájt 0000 0000 Ami Decimális jelöléssel 0.

Innen le tudod tölteni ezt a kis remek programot:
http://people.inf.elte.hu/vaszlo/parmon.exe

IO.DLL fájl:
 Amennyiben Te is Windows alatt akarsz programozni portot, akkor szükséged lesz erre a bizonyos IO.DLL fájlra. Innen tudod letölteni:
http://www.programmersheaven.com/download/22947/download.aspx
Majd csomagold ki, ha úgy jött le (nekem nem kellett, majd linkelem én honnan töltöttem le, ha megtalálom).
Aztán másold be a C:\WINDOWS\system32. könytárába.
Ennek a DLL fájlnak valami olyan értelme, van, hogy evvel meg lehet kerülni az operációs rendszert. Azt pontosan nem tudom hogy, de nem kell ezt tudni ahhoz, hogy tudjuk használni. :)
Különösen, hogy más teendőnk nincs evvel.

A portnak van egy címe. A gépeden meg tudod nézni, pl így a legegyszerűbben.
Start menü, Saját gépre jobb klikk, eszközkezelő, Portok, Nyomtató port (lpt1), jobb egérgombbal tulajdonságok, Erőforrások. I/O tartomány 0378 - 037F Van nálam írva. A cím szinte mindenkinél 378  ..
és erre a címre küldenéd a bájtokat.



Programozás alapja a Visual Basic-ben:

1. A legtöbb programnyelven sajnos nem olyan egyszerű programozni, mint a már megismert JavaScripttel, sajnos le kell töltenünk, és telepítenünk kell a programíráshoz egy programot. Ezeket IDE-nek, integrált fejlesztői környezetek hívjuk.
A Visual Basic egy lebutított változatát tudjuk a  Microsoft Office-be is programozni. Ha első körben ezt akarod használni, akkor inkább a Powerpoint-ot nyisd meg, és ott használd, ne az Excelt.
Hogy hogy kell Powerpoint-ból  arra választ találsz, ha megnézed nyolc sorral lejjebb, a 2 pont utáni videókat!

Egyébként pedig töltsd le a Visual Studio Express-t, de a 2012-est ajánlom, mert a legfrissebbnek a telepítése már nagyon el van bonyolítva, és problémáid lehetnek vele!
https://www.microsoft.com/en-us/download/details.aspx?id=34673
Ennek a telepítéséhez itt találsz például segítséget a youtube-on:
https://www.youtube.com/watch?v=8Gvk1oW9B9Q
https://www.youtube.com/watch?v=A1Hx24N5WZo

2. Ha telepítetted, akkor nézd meg ezt a két 15 perces videót, mely elmondja az alapokat, és utána ha még az alábbi leírást is elolvasod, fogod tudni programozni a párhuzamos portodat!

https://www.youtube.com/watch?v=EunPj_G1i1M
https://www.youtube.com/watch?v=xDU6vXuPquQ&t=559s

Ezek után, már könnyen tudunk olyan programot mi is csinálni, amivel ki-be tudjuk kapcsolgatni a biteket.
Itt egy bónusz, hogy csinálhatsz saját böngészőt! Elképesztően egyszerű:
https://www.youtube.com/watch?v=nvEdhnt5V9M

És itt Powerpoint-ot használva csinálják:
https://www.youtube.com/watch?v=LeemMH8-nHE

A port párhuzamos programozása Visual Basic-ban:
Amikor megcsinálsz egy üres form-ot, akkor először nem gombot raksz rá, vagy ilyesmit, hanem egy modult adsz hozzá.
Az ikonos menüben a hozzáadásokba van a modul hozzáadása, nálam egy kicsit el volt rejtve, de megtalálod. Az alábbi fotón a piros nyíl mutatja hol találod a modul hozzáadását!
Az a modulra rákattintva kettőt, azt kell kódolnod. Be kell másolni ezt, aztán már csak a form1 gyel, vagy aminek elnevezted kell foglalkozni, és ezt a modul részt el is felejtheted:

Public Declare Sub PortOut Lib "IO.DLL" (ByVal Port As Integer, ByVal Data As Byte)
Public Declare Sub PortWordOut Lib "IO.DLL" (ByVal Port As Integer, ByVal Data As Integer)
Public Declare Sub PortDWordOut Lib "IO.DLL" (ByVal Port As Integer, ByVal Data As Long)
Public Declare Function PortIn Lib "IO.DLL" (ByVal Port As Integer) As Byte
Public Declare Function PortDWordIn Lib "IO.DLL" (ByVal Port As Integer) As Long
Public Declare Sub SetPortBit Lib "IO.DLL" (ByVal Port As Integer, ByVal Bit As Byte)
Public Declare Sub ClrPortBit Lib "IO.DLL" (ByVal Port As Integer, ByVal Bit As Byte)
Public Declare Sub NotPortBit Lib "IO.DLL" (ByVal Port As Integer, ByVal Bit As Byte)
Public Declare Function GetPortBit Lib "IO.DLL" (ByVal Port As Integer, ByVal Bit As Byte) As Boolean
Public Declare Function RightPortShift Lib "IO.DLL" (ByVal Port As Integer, ByVal Val As Boolean) As Boolean
Public Declare Function LeftPortShift Lib "IO.DLL" (ByVal Port As Integer, ByVal Val As Boolean) As Boolean
Public Declare Function IsDriverInstalled Lib "IO.DLL" () As Boolean

A piros nyíllal mutatom, hol lehetett a form1-hez hozzáadni a modult, amibe a fenti kódot másoltam:



Ez után tegyél egy gombot a form1-re. Ez lesz a start gomb. A gombra kettőt kattintva programozd be, vagyis írd be ezt a kódot:


Be is másolhatod innen is a gomb kódjába.
        PortOut(888, 0)
        Threading.Thread.Sleep(1000)
        PortOut(888, 1)
        Threading.Thread.Sleep(1000)
        PortOut(888, 22)
        Threading.Thread.Sleep(1000)
        PortOut(888, 34)
        Threading.Thread.Sleep(1000)
        PortOut(888, 56)
        Threading.Thread.Sleep(1000)
        PortOut(888, 25)
        Threading.Thread.Sleep(1000)
        PortOut(888, 201)
        Threading.Thread.Sleep(1000)
        PortOut(888, 68)
        Threading.Thread.Sleep(1000)
        PortOut(888, 78)
        Threading.Thread.Sleep(1000)
        PortOut(888, 92)
        Threading.Thread.Sleep(1000)
        PortOut(888, 0)

Indítsd el a programot, és láthatod, ahogy a LED-ek össze-vissza villognak!
A 888 az decimálisan a 0378 hexadecimális címe, az utána lévő szám, ha nulla, akkor minden LED elalszik, ha 255, akkor minden LED világít. 0 és 255 között pedig különböző variációkban van felkapcsolva.
Az 1000 a milliszekundum, ami a várakozást jelenti a két bájt közötti.

A Parmon programról le tudod lesni, hogy milyen LED variációhoz, milyen szám illik.
Pl: Amikor a Parmonnal felkapcsolom a 3., 5., és, a 7 LED-et (lásd a képen), akkor ehhez a 42-es szám tartozik. Vagyis a programodba  PortOut(888, 42) ezt kel írnod!


Lejátszva a programot (a zöld háromszögre kattintva, a piros nyíl mutatja) és megnyomva a start gomb, a Paralel Port Monitor (más néven a Parmon) Program mutatja, hogy villognak a LED-ek:



Mentés:
Először a File menűben a Save All -lal mindent mentsél el. Nem muszáj elfogadni az a helyet, ahová menteni akarja. Aztán még ne csukd be, hanem a Debug menűben a Build gombot nyomd meg. Ekkor a lap alján, balra kiírja, hogy éppen építi, aztán hogy készen van. Ekkor felkeresve a Projekt mappádat a release al-almappába megtalálod az exe fájlt, vagyis a kész programodat.

Több:
http://www.vbforums.com/showthread.php?410868-SIMPLE-parallel-port-reading

LED-es kijelzők:
A LED-eket most már tudod úgy is programozni, hogy futófényt, vagy különböző effekteket állítsál elő, sőt, hét darab hosszúkás  LED-ből olyan kijelzőt is tudsz csinálni amely 0 és 9 között számokat formál meg. Ilyen 7 szegmenses kijelzőt (1 digit) egyébként készen is lehet kapni.lehet kapni:



Ha pedig a számok LED- variációját (gépkódját, avagy az adott byte-ot) hozzárendeled a programodban a számokhoz, akkor vizuálisan is megjeleníthetsz egy számológépet. Tehát az eredményt nem a monitorra, hanem akár erre a kijelzőre is ki tudod küldeni.
Így lehet olvasni a státusz érintkezőket a portban:
TextBox1.Text = CStr(889)

https://logout.hu/bejegyzes/tobal/parhuzamos_port_programozas.html
Ami fontos, hogy olyan 7 szegmenses kijelzőt vegyél, ha ki akarod próbálni, amelyiknek a katódja közös, és nem az anódja! 
Sok LED-ből pedig tv-szerű kijelzőt is gyártanak, illetve a monitor se más, mint "sok LED" egymás mellett.
Azt hiszem kezdjük sejteni, hogy működik a számítógép!

Kérdéses jelenség a párhuzamos porttal kapcsolatban!
Amikor a egyes bemeneteket használjuk, vagyis pl. érzékelünk valamit, akkor közben képes a kimenetek bitjeit átállítani, a bejövő jelre. Pl. jön egy jel, és a kimenetekből mondjuk 6-ot bekapcsol, amelyeket egyébként előzőleg kikapcsoltunk. Mi ez?
 Használható-e akkor is, ha a portra egyéb esetben nyomtató van beállítva, vagy a gépre, ha nem is a portra?
Ezeknek még jobban utána kell nézni!


Példaprojekt:
Ezen az oldalon láthatsz egy példaprojektemet a párhuzamos port vezérlésére:
A menüben az 5. lap...

Tanuljunk egy kicsit többet Visual Basic-ből!
Eder további videót ajánlom:
https://www.youtube.com/watch?v=TFea2Ns7gCk
https://www.youtube.com/watch?v=fy57qSVXiUE
illetve hasonló videókat, majd amikor az alapjait átlátod, akkor a kódokra már itt is rákereshetsz, és össze fogod tudni rakni a programodat:
https://docs.microsoft.com/en-us/dotnet/articles/visual-basic/
(Néha az oldal átvisz más nyelvben lévő kódhoz, nézd, meg, hogy vb-ről van-e még szó!)
Stb.


Néhány VB (visual basic) kód, módszer, amelyre majd szükség lehet:

Magyar dátumfomátum:
var dateAsString = DateTime.Now.ToString("yyyy-MM-dd");
// dateAsString = "2011-02-17"

Gombnál, funkciók:
A gomb tulajdonségainál a be lehet állítani, hogy a gomb lenyomására, vagy/és felengedésére csináljon valamit. A tulajdonságainál meg kell keresni a mousedown vagy/és mouseup opcikat, és ha ezekre kettőt kattintunk, akkor egy subkódot tesz a kódba a gombhoz. Ebbe kell beleírni azt, hogy a gomb lenyomására, vagy felengedésére mit csináljon...

Egy string írása szövegfájlba, majd onnan kiolvasása:
Imports System
Imports System.IO
Imports System.Text
Module Module1
    Sub Main()
        Dim path As String = "c:\robot\record.txt"
        Dim fs As FileStream = File.Create(path)

    End Sub
End Module
----------------------------------------
Public Class Form1
    Dim num As Integer
    Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
        num = NumericUpDown1.Value
        My.Computer.FileSystem.WriteAllText("c:\robot\record.txt", num, True)
    End Sub

    Private Sub Button2_Click(sender As Object, e As EventArgs) Handles Button2.Click
        Dim fileReader As String
        fileReader = My.Computer.FileSystem.ReadAllText("c:\robot\record.txt")
        Label1.Text = fileReader
    End Sub

    Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load

    End Sub
End Class

Késleltetések.
 Más-más feladatra néha a másik működik jobban, ill. a másik jó:
1 A legegyszerűbb késleltetés:
  Threading.Thread.Sleep(1000)

2 a Timer használata:
Ráhúzol a formra egy Timer-t, ami valójában ismételgetést késleltetéssel jelent, majd a tulajdonságainál beállítod, hogy a késleltetése mennyi legyen, alapból 100 (0,1 szekundum), és alapból nem indul el a form betöltésével, azaz a program megnyitásával, csak ha beállítod az Enabled-re a True-t. Egyébként a gombokkal tudod elindítani a Timer programrészt, amibe be kell írnod azt a kódot, amit ismételgetni akarsz. Amikor ráhúzod a formra, akkor a Timer a form alatt, kis óraikonként jelenik meg, arra kell kettőt kattintani, hogy programozni tudjad, egyet, hogy a baálításai megjelenjenek. A gombokkal ezt a kódot kell beírni, amikor el akarod indítani:
Timer1.Enabled = True
vagy ezt:
Timer1.Start()
És ezt, ha meg akarod állítani:
Timer3.Enabled = False
Timer1.Stop()
2. A Delay
Ehhez a formhoz hozzá kell adni egy Modult. A menüben a Project, és abban a Add Modul gombbal, majd a Modul kódjába be kell másolni ezt a kódot:

Sub Delay(ByVal dblsecs As Double)
        Const onesec As Double = 1.0# / (1440.0# * 60.0#)
        Dim dblWaitTil As Date
        Now.AddSeconds(onesec)
        dblWaitTil = Now.AddSeconds(onesec).AddSeconds(dblsecs)
        Do Until Now > dblWaitTil
            Application.DoEvents()
        Loop
    End Sub

Ez után fog a programba működni ez a kód, ha késleltetni akarsz:

Delay(1000)

Konvertálások:
Pl: String átalakítása char-rá:
Dim szam As Integer
szam = 145
Label1.Text = Chr(szam)
És a többi konvertálás: http://www.convertdatatypes.com/Convert-Char-to-Integer-in-VB.net.html