Помогите в linux'e !

Тема в разделе "Arduino & Shields", создана пользователем CryNET, 30 апр 2014.

  1. CryNET

    CryNET Гик

    Здравствуйте, амперчане

    Столкнулся первый раз со связкой linux + Aduino UNO + php
    Задача проста - передать средствами php "1" или "0" в порт.

    Но беда в том, что я первый раз столкнулся с портами в linux'e, на запросы php ардуино молчит, RX/TX не моргают.
    Что я пробовал делать:

    Код (Text):
    ls -l /dev/ttyACM0
    crw-rw---- 1 root dialout 166, 0 апр.  30 22:13 /dev/ttyACM0
    chmod 777 /dev/ttyACM0
    chmod 777 /var/lock
    //Безрезультатно, на запрос echo 1 > /dev/ttyACM0 - Arduino UNO перезагружается
     
    Пробовал шаманить с stty:
    Код (Text):
    stty -F /dev/ttyACM0 raw speed 9600
    9600
    //Ничего не изменилось
    stty -F /dev/ttyACM0 cs8 9600 ignbrk -brkint -icrnl -imaxbel -opost -onlcr -isig -icanon -iexten -echo -echoe -echok -echoctl -echoke noflsh -ixon -crtscts raw
    //Ничего не изменилось
     
    Сам php скрипт простой:

    Код (Text):
    include 'src/PhpSerial.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("/dev/ttyACM0");

    // We can change the baud rate, parity, length, stop bits, flow control
    $serial->confBaudRate(9600);
    $serial->confParity("none");
    $serial->confCharacterLength(8);
    $serial->confStopBits(1);
    $serial->confFlowControl("none");

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

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

    // If you want to change the configuration, the device must be closed
    $serial->deviceClose();
    На связке windows + Arduino UNO + php у меня получалось слать в порт ардуине всякие значения.

    Сложности:
    Стоит Ubuntu Server 12.04.4 LTS

    Мои предположения:
    1. Лиукс не дает php/apache2 доступа в порт(хотя дал права 777 на /dev/ttyACM0)
    2. Я шлю не в тот порт (хотя ведь на echo 1 > /dev/ttyACM0 ардуино ребутится)
    3. Не правильно настроил порт, не дал правильно права.
     
  2. CryNET

    CryNET Гик

    Нашел логи:
    58 строка файла - это PhpSerial()

    Код (Text):
        /**
        * Constructor. Perform some checks about the OS and setserial
        *
        * @return PhpSerial
        */
        public function PhpSerial()
        {
            setlocale(LC_ALL, "en_US");

            $sysName = php_uname();

            if (substr($sysName, 0, 5) === "Linux") {
                $this->_os = "linux";

                if ($this->_exec("stty") === 0) {
                    register_shutdown_function(array($this, "deviceClose"));
                } else {
                    trigger_error(
                        "No stty availible, unable to run.",
                        E_USER_ERROR
                    );
                }
            } elseif (substr($sysName, 0, 6) === "Darwin") {
                $this->_os = "osx";
                register_shutdown_function(array($this, "deviceClose"));
            } elseif (substr($sysName, 0, 7) === "Windows") {
                $this->_os = "windows";
                register_shutdown_function(array($this, "deviceClose"));
            } else {
                trigger_error("Host OS is neither osx, linux nor windows, unable " .
                              "to run.", E_USER_ERROR);
                exit();
            }
        }
    а сама 58 строка - это конец такого выражения из этого класса
    Код (Text):
    trigger_error(
                        "No stty availible, unable to run.",
                        E_USER_ERROR
                    );

    И ещё одна:
    Эту решил - просто не правильно указал директорию с классом :)
     

    Вложения:

    • PhpSerial.txt
      Размер файла:
      18,8 КБ
      Просмотров:
      329
  3. CryNET

    CryNET Гик

  4. Витя

    Витя Гик

    У меня unix (mac os) но по идее в линукс тоже самое. При соединении автоматически посылается сигнал DTR который обозначает что терминал (программа типа) готов принимать данные (windows его не посылает), но он подключен у ардуины к reset пину и поэтому получается ребут. И поэтому посылка данных кстати идет не в прошивку а в бутлоадер. Теоретически так можно даже сломать все.

    Поэтому можно
    1. Запретить ардуине перегружаться. Например вставив конденсатор в reset-gnd.
    2. Подождать 2 секунды пока ардуина перегрузится прежде чем слать что то.
    3. Отключить посылку DTR сигнала (если это возможно в php).
     
  5. CryNET

    CryNET Гик

    Конденсатором я видел фишку, но для начала нужно хотя бы что-то послать из php в tty Arduino UNO, а он вообще не хочет этого делать, в логах такое пишет:
    Пытаюсь гуглить по "No stty availible, unable to run", пока ищу, русскоязычных нету форумов с этой проблемой.
     
  6. CryNET

    CryNET Гик

  7. CryNET

    CryNET Гик

    Ура, товарищи!
    Получилось у меня доколупать этот serial port!
    Теперь, при заходе на страничку с кодом - отправляется "1" на /dev/ttyACM0

    Но теперь всплывает косяк с echo "1" > /dev/ttyACM0
    Устройство перезагружается каждый раз, когда ему делаю echo "1" > /dev/ttyACM0
    Есть какие-либо решения данной проблемы? Не хотелось бы ставить конденсатор между reset и gnd

    UPD:
    Решение простое - просто класс попался кривой и не рабочий, скачал другой - все пошло
    И не забудьте делать права на /dev/ttyACM0 и /var/lock
     
    Mitrandir нравится это.
  8. CryNET

    CryNET Гик

    С конденсатором между Reset и GND работает - ардуино не ребутается, 1 и 0 получает и различает
    А программно получится сделать так, чтобы не ребуталось?
     
  9. Mitrandir

    Mitrandir Гуру

    Только давать три семерки не есть хорошо..
     
  10. CryNET

    CryNET Гик

    Да, это просто ужас в linux'e :)
     
  11. Unixon

    Unixon Оракул Модератор

    Принято пользователя включать в группы, в которых уже сидят данные устройства, а не менять им права доступа индивидуально.
     
    Mitrandir нравится это.
  12. bg13

    bg13 Нуб

    Конечно, некропост, но может кому-то пригодится. Это никак не связано с правами.
    Надо в PhpSerial.php, около 50 строки
    if ($this->_exec("stty") === 0) поменять на
    if ($this->_exec("stty --version") === 0)
     
  13. AlexU

    AlexU Гуру

    Да -- это некропост.
    И "Да" -- права устанавливать обязательно. Не будет прав, не будет доступа к порту -- что бы вы там в PHP скрипте не писали-программировали.
    Раз уж пост поднят, то простое:
    Код (Bash):
    echo "1" > /dev/ttyACM0
    всегда будет отправлять Ардуину (которая UNO, может и другие) в перезагрузку. По одной простой причине, что именно так она программируется -- при попытке открыть порт встроенный USB-Serial адаптер (будь-то ATmega16U2, или CH340, или ещё какой...) перегружает Ардуинку для того, чтобы запустить встроенный бутлоадер.