Здравствуйте, амперчане Столкнулся первый раз со связкой 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. Не правильно настроил порт, не дал правильно права.
Нашел логи: 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 ); И ещё одна: Эту решил - просто не правильно указал директорию с классом
Нарыл, что это чем то связано с php.ini http://www.developpez.net/forums/d1...-to-run-in-php_serial-class-php-on-line-54-a/
У меня unix (mac os) но по идее в линукс тоже самое. При соединении автоматически посылается сигнал DTR который обозначает что терминал (программа типа) готов принимать данные (windows его не посылает), но он подключен у ардуины к reset пину и поэтому получается ребут. И поэтому посылка данных кстати идет не в прошивку а в бутлоадер. Теоретически так можно даже сломать все. Поэтому можно 1. Запретить ардуине перегружаться. Например вставив конденсатор в reset-gnd. 2. Подождать 2 секунды пока ардуина перегрузится прежде чем слать что то. 3. Отключить посылку DTR сигнала (если это возможно в php).
Конденсатором я видел фишку, но для начала нужно хотя бы что-то послать из php в tty Arduino UNO, а он вообще не хочет этого делать, в логах такое пишет: Пытаюсь гуглить по "No stty availible, unable to run", пока ищу, русскоязычных нету форумов с этой проблемой.
Вот что нарыл, но транслитом от гугла с трудом понимаю что требуется, какая-то утилита? http://stackoverflow.com/questions/23332768/phpserial-no-stty-availible-cant-seem-to-get-it-working Помогите раскопать ответ
Ура, товарищи! Получилось у меня доколупать этот serial port! Теперь, при заходе на страничку с кодом - отправляется "1" на /dev/ttyACM0 Но теперь всплывает косяк с echo "1" > /dev/ttyACM0 Устройство перезагружается каждый раз, когда ему делаю echo "1" > /dev/ttyACM0 Есть какие-либо решения данной проблемы? Не хотелось бы ставить конденсатор между reset и gnd UPD: Решение простое - просто класс попался кривой и не рабочий, скачал другой - все пошло И не забудьте делать права на /dev/ttyACM0 и /var/lock
С конденсатором между Reset и GND работает - ардуино не ребутается, 1 и 0 получает и различает А программно получится сделать так, чтобы не ребуталось?
Принято пользователя включать в группы, в которых уже сидят данные устройства, а не менять им права доступа индивидуально.
Конечно, некропост, но может кому-то пригодится. Это никак не связано с правами. Надо в PhpSerial.php, около 50 строки if ($this->_exec("stty") === 0) поменять на if ($this->_exec("stty --version") === 0)
Да -- это некропост. И "Да" -- права устанавливать обязательно. Не будет прав, не будет доступа к порту -- что бы вы там в PHP скрипте не писали-программировали. Раз уж пост поднят, то простое: Код (Bash): echo "1" > /dev/ttyACM0 всегда будет отправлять Ардуину (которая UNO, может и другие) в перезагрузку. По одной простой причине, что именно так она программируется -- при попытке открыть порт встроенный USB-Serial адаптер (будь-то ATmega16U2, или CH340, или ещё какой...) перегружает Ардуинку для того, чтобы запустить встроенный бутлоадер.