Temat: Karta przekaźników na USB + TP 1043

Witam. Jestem w posiadaniu karty przekaźników podłączanej na usb. Chodzi dokładnie o taką jak w tym opisie http://techniczny.wordpress.com/2011/06 … /#more-174

Chciałbym nią sterować z poziomu OpenWrt a dokładnie ze strony www. Zabrałem się więc za to tak jak w w/w instrukcji. Karta jest wykrywana w systemie jako ttyUSB0, wrzuciłem na router biblioteke w php obsługującą komunikację z serialem -> http://www.phpclasses.org/browse/file/17926.html. Dopisałem na dole tej biblioteki na próbe komendy do ustawienia parametrów portu

$serial = new phpSerial;
$serial->deviceClose("/dev/ttyUSB0");
$serial->deviceSet("/dev/ttyUSB0");
$serial->confBaudRate(57600);
$serial->confParity(none); //Set the Parity
$serial->confCharacterLength(8);//Set the word length
$serial->confStopBits(1); //Set Stop Bit
$serial->confFlowControl(none);

dodatkowe funkcje do obliczania sumy CRC która jest wymagana:

function crcmaxim(array $ar)
{
  $numBytes=sizeof($ar);
  $byteIndex=0;
  $bitCount=0;
  $CRC=0;
  for($byteIndex=0;$byteIndex<$numBytes; $byteIndex++ )
  {
    $nextByte=$ar[$byteIndex];
    for($bitCount=0;$bitCount>=1;
      if($b)
      {
        $CRC^=0x8c;
      }
      $nextByte>>=1;
  }
  return $CRC;
}
function sbin2ar($sbin)
{
  $ar=array();
  $ll=strlen($sbin);
  for ($i=0; $i<$ll; $i++) $ar[]=ord(substr($sbin,$i,1));
  return $ar;
}

no i z tym mam problem bo nie chce mi uruchomić tej biblioteki ;/  wywala mi błąd z "if"

Parse error: syntax error, unexpected T_IF, expecting ')' in /www4/index.php on line 60

chodzi dokładnie o ten fragment powyższych funkcji:

     if($b)

szukam, szukam i nie moge znaleźć błędu o co mu chodzi... czy ktoś może coś doradzić??

2

Odp: Karta przekaźników na USB + TP 1043

Linijkę wyżej masz niekompletną - brakuje trzeciego argumentu dla instrukcji for i nawiasu.

3

Odp: Karta przekaźników na USB + TP 1043

faktycznie, wiadać słabo szukałem. Hah to teraz może być problem bo nie wiem jaki tam był argument... to jest funkcja do przeliczania tego CRC przekopiowana z tej stronki co wyżej podałem

4

Odp: Karta przekaźników na USB + TP 1043

Pokaż cały kod php, bo najzwyczajniej w świcie masz błędy składniowe.

Masz niepotrzebny router, uszkodzony czy nie - chętnie przygarnę go.

5

Odp: Karta przekaźników na USB + TP 1043

tak to wygląda:

<?php 

//check the GET action var to see if an action is to be performed 
if (isset($_GET['action'])) { 
    //Action required 
     
    //Load the serial port class 
    require("php_serial.class.php"); 
     
    //Settings serial
$serial = new phpSerial;
$serial->deviceClose("/dev/ttyUSB0");
$serial->deviceSet("/dev/ttyUSB0");
$serial->confBaudRate(57600);
$serial->confParity(none); //Set the Parity
$serial->confCharacterLength(8);//Set the word length
$serial->confStopBits(1); //Set Stop Bit
$serial->confFlowControl(none);
   //CRC
function crcmaxim(array $ar)
{
  $numBytes=sizeof($ar);
  $byteIndex=0;
  $bitCount=0;
  $CRC=0;
  for($byteIndex=0;$byteIndex<$numBytes; $byteIndex++ )
  {
    $nextByte=$ar[$byteIndex];
    for($bitCount=0;$bitCount>=1;
      if($b)
      {
        $CRC^=0x8c;
      }
      $nextByte>>=1;
    }
  }
  return $CRC;
}

// Sting to bit
{
  $ar=array();
  $ll=strlen($sbin);
  for ($i=0; $i<$ll; $i++) $ar[]=ord(substr($sbin,$i,1));
  return $ar;
}

//funkcja zalaczania i wylaczania przekaznika nr 4
$serial->deviceOpen("a+b");
    //Issue the appropriate command according to the serial relay 
    //board documentation 
    if ($_GET['action'] == "on") { 
        //zalaczenie przekaznika 4 
        $cmd=chr(0x01)."O".chr(0x03);
     $serial->sendMessage( chr(0x55).$cmd.chr(crcmaxim(sbin2ar($cmd))).chr(0xa0) );
     
    } else if ($_GET['action'] == "off") { 
        //wylaczenie przekaznika 4
        $cmd=chr(0x01)."F".chr(0x03);
        $serial->sendMessage( chr(0x55).$cmd.chr(crcmaxim(sbin2ar($cmd))).chr(0xa0) );
    } 
     
    //We're done, so close the serial port again 
    $serial->deviceClose(); 

} 


?><!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" 
"http://www.w3.org/TR/html4/loose.dtd"> 
<html> 
<head> 
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1"> 
<title>Sprinkler System Controller</title> 
</head> 
<body> 

<h1>Sprinkler System Controller</h1> 
<p><a href="<?=$_SERVER['PHP_SELF'] . "?action=on" ?>">
Zalacz przekaznik.</a></p> 
<p><a href="<?=$_SERVER['PHP_SELF'] . "?action=off" ?>">
Wylacz przekaznik.</a></p> 
</body> 
</html>

na początku wczytuje biblioteke http://www.phpclasses.org/browse/file/17926.html a następnie ustawiam parametry seriala, obliczam tą sume CRC i próbuje załączyć/wyłączyć przekaźnik. Niestety w kodzie do przeliczania CRC są braki...

6

Odp: Karta przekaźników na USB + TP 1043

Jeżeli kod ma sens to:

 for($bitCount=0;$bitCount>=1;

Tu brakuje jednego argumentu i nawiasu {

    $serial->deviceClose(); 
} 

tu jest za dużo o ten nawias.

// Sting to bit
{
  $ar=array();
  $ll=strlen($sbin);
  for ($i=0; $i<$ll; $i++) $ar[]=ord(substr($sbin,$i,1));
  return $ar;
}

A z tego miała być funkcja, ale gdzieś Ci to function uciekło.

Masz niepotrzebny router, uszkodzony czy nie - chętnie przygarnę go.

7

Odp: Karta przekaźników na USB + TP 1043

dzięki za podpowiedzi smile jest już lepiej jednak nadal nie wiem jakiego argumentu tam brakuje dla tego for. Autor tej funkcji do CRC wrzucił niekompletną ;/ mam jednak od producenta karty usb dokładne kody jakie mają być wysyłane czyli cała ramka, wraz z już wyliczona sumą CRC. Więc tymczasowo chciałbym to przetestować z konsoli. Na początek próbuje ustawić prędkość seriala ale coś nic się nie zmienia...

root@Gargoyle:~$ stty -F /dev/ttyUSB0 57600
root@Gargoyle:~$ stty
speed 38400 baud; line = 0;
-brkint -imaxbel

8

Odp: Karta przekaźników na USB + TP 1043

Ale po stty jeszcze -F podaj, bo tak to nie wiadomo czego się pytasz w sumie.

PS. A wpadłeś na to żeby po prostu zapytać autora? smile

Masz niepotrzebny router, uszkodzony czy nie - chętnie przygarnę go.

9

Odp: Karta przekaźników na USB + TP 1043

ok prędkość ustawiona. A teraz pytanie jak wysłać na seriala taką ramke:

0x55, 0x01, 0x4f, 0x00, 0x28

poprzez echo 0x55, 0x01, 0x4f, 0x00, 0x28 > /dev/ttyUSB0  ???

10

Odp: Karta przekaźników na USB + TP 1043

Cezary napisał/a:

PS. A wpadłeś na to żeby po prostu zapytać autora? smile

tak chciałem pytać autora ale nie ma do niego kontaktu na tym blogu... a w komentarzach ostatnia aktywność to połowa roku 2012....

11

Odp: Karta przekaźników na USB + TP 1043

Nie. echo 0x55 wyśle cztery znaki ascii: 0, x, 5, 5, A ty chcesz zrobić echo "\x55\x01\x4f..." itd.

Mam wrażenie że dostałeś bana na Google.... smile

Masz niepotrzebny router, uszkodzony czy nie - chętnie przygarnę go.

12

Odp: Karta przekaźników na USB + TP 1043

hmm no przez echo nic sie nie dzieje tylko dioda z RX/TX miga na płytce. Wysyłałem tak jak napisałeś czyli:
echo "\x55\x01\x4f\x03\0xca" > /dev/ttyUSB0
Mam całą listę wygenerowanych kodów od producenta, w kodzie szesnastkowym i dziesietnym ale chyba nie docierają do płytki tak jak powinny.
Przykładowy:

0x55, 0x01, 0x4f, 0x00, 0x28 - Włączenie przekaźnika 1

W instrukcji którą otrzymałem pisze tak:
"Parametry połączenia to prędkość 57600bps, 8 bitów danych, bez parzystości, 1 bit stopu - czyli pomijając prędkość,
domyślne ustawienia."
wiec chyba dobrze to mam

root@Gargoyle:~$ stty -F /dev/ttyUSB0
speed 57600 baud; line = 0;
min = 1; time = 0;
-brkint -icrnl -imaxbel
-opost -onlcr
-isig -icanon -iexten -echo -echoe -echok -echoctl -echoke

"Do urządzenia wysyłane oraz odbierane są pakiety 5 bajtowe. W skład pakietu wchodzi jednobajtowa preambuła o
stałej wartości, adres urządzenia, komenda, argument komendy, oraz suma kontrolna CRC."
http://img4.imageshack.us/img4/9731/ramkagz.jpg
Czy przed wysyłaniem musze jeszcze otwierac port?? jeśli tak to tez przez echo?? jaką komendą? bo te wysyłanie ramki z tymi pakietami to chyba dobrze robie...

13

Odp: Karta przekaźników na USB + TP 1043

Przede wszystkim:

echo -e '\x55\x01\x4f\x00\x28'

jak już, a w ogóle to odpal sobie dwa terminale, na jednym daj:

cat /dev/ttyUSB0

a na drugim wpisuj te komendy i patrz na tamtym co sterownik odpowiada.

Swoją drogą zastosowanie w tym przypadku takiej sumy kontrolnej jest co najmniej... dziwne. Miało by to sens gdybyśmy wysyłali długie ciągi danych i każda mogła by być różna i miała znaczenie. Tutaj mamy raptem jeden bajt danych - reszta to znaki, które i tak znamy. Równie dobrą (lepszą, bo więcej znaków) odporność na przypadkowe załączenie uzyskamy ustalając "ludzką" komendę: "Zalacz Przekaznik Numer Jeden" 
Skoro już obsmarowuję twórcę tej płytki to powiem jeszcze, że "dziwne" jest niezaprojektowanie jej pod jakąś dostępną obudowę choćby typu Z-100.

14

Odp: Karta przekaźników na USB + TP 1043

kamillo co autora to się zgodzę, znalazłem go na FB i napisałem do niego w sprawie sterowania tym przekaźnikiem oraz paru innych teoretycznych sprawach i rzeczywiście nie odpisał.

Sam zastanawiam się odnośnie zakupu tego modułu przekaźnikowego i jego późniejszego sterowania, myślałem żeby stworzyć pod niego własną aplikację napisaną w C# pod Windowsa. Zastanawia mnie jedno... Czy jak podłączysz go pod komputer to tworzy Ci nowy (wirtualny) port COM zgodnie z opisem producenta/sprzedającego:

jack_62 napisał/a:

w urządzeniu został wykorzystany scalony sprzętowy sterownik wirtualnego portu COM, dzięki temu urządzenie będzie pracowało z każdym komputerem wyposażonym w port USB

jeśli tak to nie potrzebna jest żadna dodatkowa biblioteka do tworzenia własnych aplikacji, tylko wystarczy użycie odpowiednich klas 'si-szarpa'.

Aha, i z tego co zdążyłem się zapoznać z tematem to musisz otworzyć najpierw port, by później wysłać nim paczkę bajtów.

Ps. nie jestem elektronikiem, ale czy to od zastosowanego układu (scalaka - na którym jest zbudowany układ) zależy jak jest sterowany albo jaki interfejs tworzy układ w kompie (np sam USB albo jak rzekomo w tym przypadku USB+COM)? Czy każdy układ przyjmuję tę samą partię bajtów sterujących układem?

===========================================
WRT160NL v1 CUR01 with Gargoyle PL  by obsy

TL-MR3420 v2 (MiFi) + E3372h-153 (nie hilink) = Play

15

Odp: Karta przekaźników na USB + TP 1043

Nie, to nie jest żaden standard. To jak to jest zrobione zależy od konkretnego modułu, może masz na porcie szeregowym, może być sterowane usb, możesz wysyłać kody ascii lub jawnie pisać w terminalu. Takich kart jest od groma na allegro,
każde może mieć inne sterowanie.

Masz niepotrzebny router, uszkodzony czy nie - chętnie przygarnę go.

16

Odp: Karta przekaźników na USB + TP 1043

mrox napisał/a:

Przede wszystkim:

echo -e '\x55\x01\x4f\x00\x28'

jak już, a w ogóle to odpal sobie dwa terminale, na jednym daj:

cat /dev/ttyUSB0

a na drugim wpisuj te komendy i patrz na tamtym co sterownik odpowiada.

no i bajka karta zaczęła śmigać smile tylko jak narazie działa mi wysyłanie komend i załączają/wyłączają sie przekaźniki. Odpaliłem tak jak napisałeś 2 terminale jednak w tym drugim gdzie dałem cat /dev/ttyUSB0 nic się nie dzieje... mam tez komende do spawdzania stanu przekaźników więc dla tej komendy karta powinna coś zwracać. W jaki sposób jeszcze moge sprawdzić co karta mi zwraca po wysłaniu komendy??

wojciech_69 tak karta po podłączeniu widoczna jest jako nowy port COM. Producent dostarczył aplikacje napisaną w C do sterowania kartą a także wysłał mi na maila poszczególne kody źródłowe pisane w C, które można wykorzystać do swoich potrzeb smile

17

Odp: Karta przekaźników na USB + TP 1043

kamillo jest mżliwość podejrzenia tego kodu? smile

===========================================
WRT160NL v1 CUR01 with Gargoyle PL  by obsy

TL-MR3420 v2 (MiFi) + E3372h-153 (nie hilink) = Play

18

Odp: Karta przekaźników na USB + TP 1043

poszło na poczte smile

19

Odp: Karta przekaźników na USB + TP 1043

kamillo napisał/a:

dałem cat /dev/ttyUSB0 nic się nie dzieje...

Pewnie wysyłane są znaki, których nie da się wyświetlić (bo i po co komuś ułatwiać).
Daj:
cat /dev/ttyUSB0>>/tmp/plik.dat (dopisywanie do pliku)
a potem podglądnij to jakimś edytorem z widokiem szesnastkowym np:
vi /tmp/plik.dat
Potem w vi dajesz:
:%!xxd
Z vi wychodzi się:
:q!

20 (edytowany przez kamillo 2013-01-28 00:52:40)

Odp: Karta przekaźników na USB + TP 1043

może troche głupie pytanie ale jakoś nie umie do tego dojść. Jak w skrypcie bash po jego wykonaniu wrócić do poprzedniej strony?? mam taki skrypt:

#!/bin/sh
echo -e '\x55\x01\x5e\x00\x00' > /dev/ttyUSB0
echo "Zalaczono"

i uruchamiam go przyciskiem na stronie, wyświetla mi później "Załączono" ale chciałbym żeby z automatu wrócił z powrotem do głównej strony index.html. Byłbym wdzięczny za podpowiedź...

21

Odp: Karta przekaźników na USB + TP 1043

Dodatnie tego nie zadziała?

echo "<script type='text/javascript'>window.location='http://192.168.1.1'</script>"

Masz niepotrzebny router, uszkodzony czy nie - chętnie przygarnę go.

22

Odp: Karta przekaźników na USB + TP 1043

tak owszem zadziałało smile tylko dziwna sprawa bo po iluś tam załączeniach, zdarza sie że strona sie wysypuje i wyskakuje

500 - Internal Server Error

23

Odp: Karta przekaźników na USB + TP 1043

Jakiś błąd smile

Masz niepotrzebny router, uszkodzony czy nie - chętnie przygarnę go.

24

Odp: Karta przekaźników na USB + TP 1043

panowie potrzebuje jeszcze waszych rad z uruchomieniem tej karty... sterowanie przekaźnikami działa już ok, ale sprawdzanie ich stanu nie. Zgodnie ze specyfikacją karty jest tak:
http://img4.imageshack.us/img4/5292/zapytania.jpg
Czyli ogółem kod jaki wysyłam do urządzenia wygląda w postaci

echo -e '\x55\x01\x47\x00\x5e' > /dev/ttyUSB0

mamy tu zgodnie ze specyfikacją wysyłaną komendę "47" kilka postów wyżej jest screenshot jak co ta cała reszta oznacza w tym pakiecie.
w trakcie wysyłania takiego pakietu sprawdzam co zwraca:

cat /dev/ttyUSB0>>/tmp/plik.dat

tak jak kolega @mrox zaproponował wysyłam to do pliku. Jednak wygląda na to że nic sie nie dzieje. Plik waży 0 B, sprawdzam go w vi i jest pusto.

25

Odp: Karta przekaźników na USB + TP 1043

Może musisz to natychmiast odebrać, czyli coś w rodzaju

cat /dev/ttyUSB0 > /tmp/plik.txt &
echo -e '\x55\x01\x47\x00\x5e' > /dev/ttyUSB0
sleep 1
killall cat

Masz niepotrzebny router, uszkodzony czy nie - chętnie przygarnę go.