Připojení zařízení k paralelnímu portu

Jedná se o možnost na dálku rozsvítit světlo, spustit větráček, zkrátka nic rychlého. V zásadě o možnost z php přenastavit hodnotu na paralelním portu s tím, že pro nové přenastavení se bude program muset spustit znovu. V tomto experimentu jsem připojil čtyři úsporné LED diody.

Výstupní výkon je dán napětím a skutečností, že jednotlivé piny lze proti zemi zatížit nejvýše cca 2,5 mA (napětí na výstupu se pohybuje okolo 3,5V). Výkon úsporných LED je takový, že pokud není příliš světlo, poznáte, zda svítí, či nikoli.Pokud budete chtít použít normální svítící diody, měl by paralelní port "utáhnout" i 20 mA, ale jedině proti 5V, které na konektoru nejsou. Jsou ovšem na konektoru USB, který lze využít jako napájení. I při zapojení proti zemi je lépe port zatěžovat jen cca 15 mA. Správně by asi pro rozsvědcování diod měl být nějaký zesilovač (např. 74LS07).

Důležité - požadovaného proudu je třeba dosáhnout zapojením odporu do série s diodou, pro každou musí být samostatný odpor! pro očekávané napětí 3,5 V a 2 mA (napětí na úsporné diodě asi 2,2 V) to je asi 860 ohm nebo 1 kohm, pro vysocesvítící červenou (2,6V) proti 5 V (20 mA, svítí v log. 0) je to 120 ohmů, bezpečných je 200 ohmů (12 mA), pro zelenou a bílou budou hodnoty odporu menší.

Celá problematika je vysvětlena na stránce http://www.epanorama.net/circuits/parallel_output.html, ze které jsem z větší části vycházel. Pro zapojení pinů zkuste například www.google.cz/search?q=lpt+pinout&tbm=isch (na konektoru bývají mezi piny vyražená malinká čísla, tak poznáte pin 1 od 13 a nespletete si, na kterou stranu schematu se díváte).

Ovládání z php

Je logické, že na free web serveru to asi nepůjde. Ovšem ani samotné php nemá příkazy pro ovládání portů. Musíte spustit externí program; buď si jej napíšete v C++, nebo si můžete stáhnout program parashell; po rozbalení najdete adresář bin, v něm linux, a zde umístěný program lze povětšinou spustit (jinak budete muset překládat). Pro Slackware to fungovalo bez překládání. Program je třeba umístit do vhodného adresáře (zvolil jsem /usr/local/bin, ale asi je to jedno), a označit, že jej může spouštět owner (root), ale i kdokoli jiný. Protože jedině root smí obsluhovat hardware přímo, musí se spustit tak, aby po spuštění pracoval s právy svého vlastníka, to lze udělat příkazem:

chmod +s lpt_test

(bez konzole to nepůjde). Výsledkem všech úprav v mém případě je, že ls hlásí nastavení mode na 14677 (dosaženo uvedeným postupem pomocí programu mc).

Samotný php jsem zkoušel ve stavu, kdy lze i port zadat, ale to je krajně nebezpečné. Na testování stačí vyzkoušet, který port máme, a pak jej dosadit napevno. První lpt port (lpt1) má adresu 0x378, tedy správněji 378H; pokud je ovšem portů méně nebo více, BIOS je při zapnutí počítače přečísluje, aby začínaly od jedničky; když ještě v počítači bývaly karty, pak BIOS dával port, který byl na kartě MDA (adresa 3BCH) na první místo (paralelní port obsahovaly následně i grafické karty Hercules a dokonce některé VGA, vždy na této adrese). Pak má v operačním systému tento port označení lpt1, a 378H je lpt2. Nebudete-li přidávat hardware, neměl by se port stěhovat. Pokud na novém počítači lpt nemáte a musíte si koupit kartu na PCI, očekávejte nějakou jinou a poměrně vysokou adresu.

Externí program spustíme příkazem "exec". Musím podotknout, že program je spuštěn, ale php skriút nečeká na jeho dokončení, ale pokračuje dále. Pro výstup je to použitelné, pokud budete chtít port číst (na 379H atd. je pět vstupních bitů), musíte výstup směřovat do souboru, číst ten, a ještě to zopakovat dvakrát, třeba na začátku a na konci dlouhého php, abyste získali aktuální hodnotu. Jistě existuje lepší řešení, zatím po něm pátrám (víte-li jak řešit tento problém, napište na hlavac@fs.cvut.cz, abych to tu mohl doplnit).

Výsledný php skript - program port.php, který volá sám sebe a zadaný údaj posílá na lpt:

<html>
<head>
<meta http-equiv="Content-Type"
content="text/html; charset=windows-1250">
<title>Parallel port settings</title>
</head>

<body bgcolor="#FFFFFF">

<?php

$hodnota = "0x0";
$hodnota = $_GET["abc"];
$lptport = "0x378";
$prikaz = "/usr/local/bin/parashell ".$lptport." ".$hodnota;

echo "Command line to be executed:<br>$prikaz<br>";

exec ($prikaz);

echo "... has been executed."
?>

<p>Set the port address and the value:</p>

<form action="port.php" method="get">
    <p>Port address : 0x378<br>
    Port value : <input type="text" size="20" name="abc" value="0x0">
    <br>
    <input type="submit" name="odeslat" value="Set port"></p>
</form>

</body>
</html>

Tento program byl vyzkoušen a funguje. Stačil by ale i kratší:

<html>
<head>
<meta http-equiv="Content-Type"
content="text/html; charset=windows-1250">
<title>Parallel port settings</title>
</head>

<body bgcolor="#FFFFFF">

<?php


if ($_GET["a"]) 
  {$hodnota = $_GET["a"];}
else
  {$hodnota = "0x0";};
$prikaz = "/usr/local/bin/parashell 0x378 ".$hodnota;

exec ($prikaz);

?>

<p>Set the port address and the value:</p>

<form action="port.php" method="get">
    Port value : <input type="text" size="20" name="a" value="0x0">
    <br>
    <input type="submit" name="odeslat" value="Set"></p>
</form>

</body>
</html>

Podotýkám, že kontrolovat, že program funguje tím, že si dáme před spuštěním "exec" nějaké echo, nemusí pomoci - pokud se spuštění programu nepovede, nedojde k dokončení generování php, a server tedy nevrátí vůbec nic. Lze ale požít zápis do souboru:

$hodnota = "0x0";
$hodnota = $_GET["abc"];
$lptport = "0x378";
$prikaz = "/usr/local/bin/parashell ".$lptport." ".$hodnota;

echo "file openning ...";
$h = fopen('echo.txt','w') or die(' ... cannot open file');
fwrite($h,$prikaz);
fclose($h);
echo " ... done<br>";

echo "Command line to be executed:<br>$prikaz<br>";

exec ($prikaz);

echo "... has been executed."

Soubor ale musí existovat a musí mít nastaveny parametry - buď že jej smí přepsat kdokoli, nebo že jej smí přepsat vlastník, ale ten je stejný, jako ten, který spouští Apache (ten se liší podle distribuce Linuxu). Mně to tak fungovalo, ale chyba byla jinde.

Výsledný program na serveru arii je v tomto případě k ničemu, k serveru nemůžete a na lpt v době, kdy čtete tento článek, asi již nic připojeného ani není.

Poznámka

Z předchozího vyplývá nejjednodušší varianta skriptu, vhodná pouze pro ladění - parametr je třeba zadávat ve formě "port.php?a=3":

<html>
<body>
<?php

exec ("/usr/local/bin/parashell 0x378 ".$_GET["a"]);

?>
</body>
</html>

Vhodné, pokud to chcete napsat na server ručně - asi lze vynechat i oba zbylé tagy (html, body). Funkci programu parashell je nutné vyzkoušet ručně z konzole jako jiný uživatel než root, než cokoli z výše uvedeného zkusíte spustit.

---

Poznámka.

Hračka, kterou jsme připojovali, se sama po pěti minutách nečinnosti vypínala. Řešením je, že se jí pravidelně pošle příkaz, ať něco udělá, například změna na jednom bitu. Opakované příkazy se v Linuxu svěřují programu cron. Zavoláme příkaz "crontab -e" a na konec doplníme řádek:

*/4 * * * * /usr/local/bin/obnovit >>/usr/local/bin/obnovit.log

*/4 znamená každé čtyři minuty. Program /usr/local/bin/obnovit a druhý soubor (na začátku prázdný) musíme samozřejmě vyrobit a nastavit jeho vlastnosti podobně jako parashell (zejména, že jej může kdokoli spustit). Jeho obsahem například u mne je:

/usr/local/bin/parashell 0x378 0xFD
sleep 0.1
/usr/local/bin/parashell 0x378 0xFF

0xFF znamená žádnou činnost. Sleep posečká uvedený počet vteřin, než bude skript pokračovat. Nevýhodou je, že použitá hračka udělá vždy totéž, a navíc se pak ukončí (pokud ji zrovna někdo ovládá, pak to může vadit).

Adresy

http://arii.fsid.cvut.cz/port.php?abc=0xFF&odeslat=Set+port - program pro nastavování portů (default je nyní 0xFF, protože použité dálkové (infračervené) ovládání se spíná přizemněním vývodu brouka)

http://www.fsid.cvut.cz/prt/hexbug1.htm - ovládání dálkového ovládání tím, že se klikne na obrázek a Javascript/php program zajistí, že právě jen tento jeden vývod bude v logické "0"; html stránka je umístěna na FSINETu, ale skripty se pochopitelně spouští ze serveru arii, kde může být připojeno dálkové ovládání.

 

 

 

¨