Elektroda.pl
Elektroda.pl
X
Please add exception to AdBlock for elektroda.pl.
If you watch the ads, you support portal and users.

[php lub cgi do Arduino] sterowanie com przez www

zen86 27 Jun 2011 18:05 7350 16
  • #1
    zen86
    Level 11  
    Witam. Zacznę od tego że przeszukałem już forum i nie znalazłem rozwiązania dla mnie lub tematy są pozamykane i nie można się podpiąć. Mam sobie płytkę Arduino która ma w sobie Atmege. Na kompie uruchamiam środowisko Arduino a następnie Serial Monitor który widzi com. Podczas kliknięcia np cyfry 1 , R, 3, albo 4 Arduino wykonuje określone zadanie. Potrzebuję zrobić sterowanie tym przez www, najlepiej pod win xp. Co do języka nie mam ograniczenia (poza wiedzą której nie mam bo nie jestem programistą) może to być php albo cgi czy jeszcze coś byle sie dało. Na stronce chce zamieścić 4 przyciski po wduszeniu których Arduino podłączone do mojego kompa zacznie coś robic - coś w stylu (jak już ktoś tu próbował) " zapalac żarówkę w domu poprzez www z Tajlandii". Przypuszczam że nie da się napisac apliakcji która uruchomi na moim kompie środowisko Arduino i jeszcze Serial Monitor a więc pozostaje aplikacja po stronie klienta która uruchomi drugą aplikację na serwerze (moj komp) a ta z koleji będzie wysyłać na com dane 1,R, 3 albo 4 . Tylko jak to zrobić ?

    Dodano: Chyba rozwiązaniem dla mnie byłoby to Link jednakże słabo z moim ang. Ale spróbuję coś się dowiedziec z tego. Wszelkie pomoce mile widziane.
    Do you have a problem with Arduino? Ask question. Visit our forum Arduino.
  • #3
    piotrva
    VIP Meritorious for electroda.pl
    1. Podany przez Ciebie link jest ja knajbardziej profesjonalny i OK, tyle, że jest to rozwiązanie pod Linuksa, na którym musisz mieć zainstalowany serwer http+php - jeśli czujesz się na siłach to w rozwiązaniu PHP mogę pomóc. Na Windowsa znalazłem takie rozwiązania: http://forum.php.pl/lofiversion/index.php/t101036.html lub http://www.phpclasses.org/package/3679-PHP-Communicate-with-a-serial-port.html - nie testowałem tego, ale jak będę miał moment czasu po południu to sprawdzę jak działa z moim Arduino.
    2. Ethernet Shiled też jest dobrym rozwiązaniem - wtedy (o ile wszystko poprawnie skonfigurujesz) nie będziesz musiał nawet włączać komputera, żeby sterować arduino przez internet (na krótszą metę droższe rozwiązanie, ale w dłuższym czasie wyrównałoby się z kosztami prądu pobieranego przez serwer PC i jest poza tym bardziej eleganckie)

    EDIT:
    Przetestowałem pod WIN klasę z 2 linku i napisałem taki kod w php:
    Code:

    <?php
    include "php_serial.class.php";

    // Let's start the class
    $serial = new phpSerial;

    // First we must specify the device. This works on both linux and windows (if
    // your linux serial device is /dev/ttyS0 for COM1, etc)
    $serial->deviceSet("COM2");
    $serial->confBaudRate(9600);
    $serial->confParity('none');
    $serial->confStopBits(1);

    // Then we need to open it
    $serial->deviceOpen();

    // To write into
    $serial->sendMessage("Hello !");

    // Or to read from
    //$read = $serial->readPort();

    // If you want to change the configuration, the device must be closed
    $serial->deviceClose();

    // We can change the baud rate
    //$serial->confBaudRate(2400);

    // etc...
    ?>


    na Arduino taki kodzik:
    Code:

    #include <LiquidCrystal.h>
    //dołączamy bibliotekę do obsługi wyświetlacza LCD

    LiquidCrystal lcd(8,9,4,5,6,7);

    void setup(){
     Serial.begin(9600);
     lcd.begin(16,2);
     lcd.clear();
     lcd.setCursor(0,0);
    }

    char odebrany;

    void loop(){
     if(Serial.available()>0){
      odebrany=Serial.read();
      if(odebrany!=10&&odebrany!=13)lcd.print(odebrany,BYTE);
      if(odebrany=='|'){
        lcd.clear();
      }
     }
    }

    I działa wyśmienicie - wymieniona przez mnie klasa nie obsługuje jedynie pod windowsem odbioru danych z portu COM (ma być to podobno zaimplementowane w przyszłości).
    Mam nadzieję, że te wypociny nieco pomogły ;-)
  • #4
    pancio
    Level 16  
    Quote:
    1. Podany przez Ciebie link jest ja knajbardziej profesjonalny i OK, tyle, że jest to rozwiązanie pod Linuksa, na którym musisz mieć zainstalowany serwer http+php


    a mi się wydaje, ze właśnie pod win, bo w linuksie nie ma urządzeń COM tylko ttyS. Poza tym na win też można osadzić PHP+APACHE.. choć zgrabniej wygląda to w linuksie :-)

    Wskazana klasa pozwala na odczytywanie danych z seriala.. ale tylko w linuksie :-)

    Pozdrawiam,
  • #5
    xamrex
    Level 28  
    Ja przetestowałem pierwszy link.
    Na win7 x64.
    Wszystko działa jak należy ;)

    Mam pytanie odnośnie tych funkcji:
    Code: c
    Log in, to see the code


    Do czego to służy? Mógłby ktoś przetłumaczyć.
  • #6
    pancio
    Level 16  
    DTR - Data Terminal Ready - gotowość terminala
    RTS - Request to Send Data - żądanie wysyłania (sprzętowa kontrola przepływu)

    tu masz pełny opis: RS232
  • #8
    zen86
    Level 11  
    Dziękuję za zaangażowanie i wszelkie wskazówki. Chcę to zrobić na windowsie. Myślałem już o module ethernet albo jeszcze lepszy byłby bluetooth ale niestety juz nie dysponuje środkami na zakup. Mam Arduino+motor shield + robot to już dość kosztów. Wydaje mi się że mój link jest na win - czy się mylę ? Jeden z Was pisze że linuch a drugi że win. Jak to jest ? Może ktoś potwierdzić ? Zajmę się linkami z posta piotrva. Ważne jest żeby dane wychodziły z com do arduino. Dzięki temu robot pojedzie. Wprawdzie aktualnie mam zrobione tak że jeżeli wykona on jakąś czynność to zwraca jakieś dane na kompa (jako takie potwierdzenie że wykonał) ale jeśli tak nie będzie działać ta klasa to mogę to usunąć.
  • #9
    pancio
    Level 16  
    wskazana klasa działać powinna na obu systemach, choć na windows można tylko wysyłać po RS.
  • #10
    piotrva
    VIP Meritorious for electroda.pl
    Tak, istotnie jest tak jak pisze pancio. Odbieranie pod WIN wymaga trochę więcej gimnastyki programistycznej, ale jak będę miał nadmiar wolnego czasu to sam z ciekawości spróbuję dopisać odbiór pod WIN.
  • #11
    piotrva
    VIP Meritorious for electroda.pl
    Na szybko napisana obsługa odczytu danych z portu COM:
    Code:

    <?
    $plik=fopen('com2','r');
    while(true){
    echo(fread($plik,1));
    flush();
    }
    fclose($plik);
    ?>

    Trudnością jest tylko połączenie jednoczesnego odbioru i nadawania bez konieczności zamykania i otwierania portu między każdą operacją...
  • #12
    xamrex
    Level 28  
    A ja mam taki błąd używając klas z drugiego linku
    Code:
    Warning: Reading serial port is not implemented for Windows in C:\Program Files (x86)\WebServ\httpd-users\klasa\php_serial.class.php on line 503


    Z pierwszego linku wszystko działa...
  • #13
    piotrva
    VIP Meritorious for electroda.pl
    Mówiłem, że ta klasa nie ma zaimplementowanej obsługi odczytu, bo są pewne problemy z dwukierunkowym dostępem do pliku z PHP pod systemami klasy Windows.
  • #14
    zen86
    Level 11  
    Dziękuję za wszelkie sugestie i wskazówki. Testuję klasę z drugiego linku postu PIOTRVA. I mam problem. Taki mam kodzik na stronę
    Code:
    <?php
    
    echo 'hello!';

    include "php_serial.class.php";


    $serial = new phpSerial;

    // First we must specify the device. This works on both linux and windows (if
    // your linux serial device is /dev/ttyS0 for COM1, etc)

    $serial->deviceSet("COM11");
    $serial->confBaudRate(9600);
    $serial->confParity('none');
    $serial->confStopBits(1);

    //$serial->autoflush=TRUE;


    // Then we need to open it

    $serial->deviceOpen();

    // To write into

    $serial->sendMessage("r");
    $serial->sendMessage("4");
    $serial->flush();

    // Or to read from
    //$read = $serial->readPort();

    // If you want to change the configuration, the device must be closed

    $serial->deviceClose();

    // We can change the baud rate
    //$serial->confBaudRate(2400);

    // etc...


    ?>
    <form action="" method="POST">
    <input type="submit" value="jedz" />
    </form>


    i teraz tak - wysłanie 1 oznacza jedz w przód ;
    r - jedz do tyłu;
    3- w lewo;
    4- w prawo.

    pojazd moze jechac tylko w lewo albo tył. np

    3i3 jedzie w lewo.
    3ir-lewo i tył;
    rir-jedzie do tyłu

    ale już np
    1i3 - tylko w lewo,
    1ir - tylko tył ,
    to samo z "4" np 3i4 - tylko lewo.

    Zainstalowałem Docklight i ustawiłem tam te komendy do sterowania i wtedy działa wszystko. Nie wiem w czym tkwi problem.
  • #16
    zen86
    Level 11  
    Jeszcze raz. Php wysyła mi odpowiednie komendy (sprawdzone var dumpem) czyli 1,r,3,4. Komenda 3 i r dochodzi do arduino i wykonuje sie, natomiast 1 i 4 nie dochodzi (ale php ją wysyła). Sprawdzałem rownież Docklightem i tam wysyła wszystko i arduino odbiera wszystko i wykonuje. W arduino jest wbudowany SerialMonitor - tam też wszystko działa. Albo cos jest z tą klasą nie tak pod Win albo arduino ma jakies kłopoty z odbieraniem. Ma ktoś jakiś pomysł ?

    Znalazłem przykładową konfigurację portu - MODE COM1:9600,N,8,1,P Co oznacza to P ? Piszą że jest to xon//xoff. Jak to ustawić w php ?
    Code:
    $serial->confFlowControl('xon/xoff'); 

    Podczas gdy w klasie jest
    Code:
    function confFlowControl ($mode)
    
       {
          if ($this->_dState !== SERIAL_DEVICE_SET)
          {
             trigger_error("Unable to set flow control mode : the device is either not set or opened", E_USER_WARNING);
             return false;
          }

          $linuxModes = array(
             "none"     => "clocal -crtscts -ixon -ixoff",
             "rts/cts"  => "-clocal crtscts -ixon -ixoff",
             "xon/xoff" => "-clocal -crtscts ixon ixoff"
          );
          $windowsModes = array(
             "none"     => "xon=off octs=off rts=on",
             //"none"     => "to=on xon=off odsr=on octs=on dtr=on rts=on idsr=on",
             "rts/cts"  => "xon=off octs=on rts=hs",
             "xon/xoff" => "xon=on octs=off rts=on",
          );

          if ($mode !== "none" and $mode !== "rts/cts" and $mode !== "xon/xoff") {
             trigger_error("Invalid flow control mode specified", E_USER_ERROR);
             return false;
          }
                   
          if ($this->_os === "linux")
             $ret = $this->_exec("stty -F " . $this->_device . " " . $linuxModes[$mode], $out);
          else
             $ret = $this->_exec("mode " . $this->_windevice . " " . $windowsModes[$mode], $out);

          if ($ret === 0) return true;
          else {
             trigger_error("Unable to set flow control : " . $out[1], E_USER_ERROR);
             return false;
          }
       }