передача параметров arduino через php в openwrt

Тема в разделе "Arduino & Shields", создана пользователем d00m, 7 дек 2012.

  1. d00m

    d00m Гик

    всем привет.

    значит есть проблема, и похоже она связана с autoreset, но я еще начинаю грешить на Troyka Shield потому что больше ничего не могу придумать )
    итак.
    скетч загруженный в мою arduino uno rev3 принимает параметры и в зависимости от них крутит пару сервов как нужно.
    на arduino сверху прикреплена Troyka Shield и к ней подключены сервы.
    arduino подключен USB кабелем в роутер TP-link MR3020 который прошит OpenWRT.
    после установки драйвера она там определяется как /dev/ttyACM0

    по идее отправить команду так:
    # echo y > /dev/ttyACM0

    она должна нормально отработать и один серв сделать свою работу.
    но не работает пока в отдельном ssh окне не сделать вот так:

    # cat /dev/ttyACM0
    то есть попросту открыть порт.
    после этого все сразу начинает работать..

    об эту проблему уже много копий сломано и есть разные варианты решений
    http://playground.arduino.cc/Main/DisablingAutoResetOnSerialConnection
    - резистор припаять или кондер, в случае Uno и прочие изуверства над какимито дорожками на плате..
    есть и софтовые решения. например можно проинициализировать порт с помощью команды
    # stty -F /dev/ttyACM0 raw speed 115200
    многие пишут что это им помогает.

    но не мне :(
    я перепробовал разные варианты ключей и так и не нашел нужного, который бы работал..

    видимо поэтому мой php код (используется библиотека отсюда http://www.phpclasses.org/browse/file/17926.html)
    Код (Text):
    # cat 2.php
    <?php
    include "php_serial.class.php";
     
    $serial = new phpSerial;
     
    $serial->deviceSet("/dev/ttyACM0");
    $serial->confBaudRate(115200);
     
    $serial->deviceOpen();
     
    $serial->sendMessage("y");
    sleep(1);
    $read = $serial->readPort();
     
    print $read;
     
    $serial->deviceClose();
     
    ?>
     
    тоже работaет только тогда когда в другом окне открыт порт с помощью cat

    может чтото подскажете ?
     
  2. Unixon

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

    У вас есть на Uno перемычка на плате "RESET EN" в виде пары контактных площадок?
     
  3. d00m

    d00m Гик

    сударь, если бы такая была, я бы ничего сюда и не написал :)
    я вот что нашел еще:
    http://www.eevblog.com/forum/beginners/arduino-uno-as-isp/

     
  4. Unixon

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

    Просто вы написали, что у вас Uno Rev.3, а на этой ревизии перемычка должна быть.
    У вас точно такая плата?
    Если не такая, то можете прислать фото платы?
     
  5. d00m

    d00m Гик

    простите, невнимательно читал.
    вот такое может и есть. где их искать и что с ними потом делать ? резать дорожки не хочу..

    но отдельно джампера точно нету.
    тем более сверху Тройка Шилд - он наверняка свои 5 коп. добавляет..
     
  6. d00m

    d00m Гик

    ага, нашел.. и что с ней делать ?
    они вроде спаяны между собой..
     
  7. Unixon

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

    Разъединяете, паяльником или ножом. Можно переключатель маленький припаять или съемную перемычку.
     
  8. d00m

    d00m Гик

    и получается в таком состоянии ардуину не прошить пока не соединить эти контакты опять ?
     
  9. Unixon

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

    Да, вы верно поняли. Хотя надо бы еще посмотреть с какой стороны от этой перемычки кнопка сброса и разъем ICSP.
     
  10. d00m

    d00m Гик

    ну все точно как на фотке, которую вы добавили выше..

    ну с железным решением я понял, должно работать.. но почему не работает софтовое решение..
    например:
    это проблема rev3 или Uno или мне так повезло ?
     
  11. Unixon

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

    Надо смотреть по какой команде дергается линия DTR, а по какой нет.
     
  12. d00m

    d00m Гик

    ооо вот что я нашел !
    http://chiolina.wordpress.com/2012/11/23/51/


    чуть изменил свой код php - 2 сек вместой 1 - чтобы наверняка
    с 1 почемуто не работает

    Код (Text):
    <?php
    include "php_serial.class.php";
     
    $serial = new phpSerial;
     
    $serial->deviceSet("/dev/ttyACM0");
    $serial->confBaudRate(115200);
     
    $serial->deviceOpen();
    sleep(2);
     
    $serial->sendMessage("y");
     
    $read = $serial->readPort();
     
    print $read;
     
    $serial->deviceClose();
     
    ?>
     
    код работает. только предварительно надо проинициализировать порт:

    #stty -F /dev/ttyACM0 raw speed 115200

    потом запускаю сам скрипт:

    # php-cgi 2.php
    X-Powered-By: PHP/5.4.5
    Content-type: text/html

    yn ver 0.15
    Yes! 0

    и тут есть небольшой глюк.

    в самом скрипте в порт ПЕРЕДАЕТСЯ символ y - на него реагирует один серв и отвечает Yes !
    Код (Text):
    case 'y': //////////////////////////////////////////////////////////////////
          Serial.print("Yes! "); Serial.println(ang);
          v_servo.write(60);
          delay(500);
          v_servo.write(20);
          delay(500);  
          v_servo.write(60);
          readString = "";
          ang = 0;
          c = '0';
          delay(1000);
          break;
    это видно при выводе работы php скрипта, но выше есть строчка:
    yn ver 0.15
    это отсюда:
    Код (Text):
    void setup()
    {
      h_servo.attach(9);
      v_servo.attach(10);
      //h_servo.write(80);
      //v_servo.write(45);
      Serial.begin(115200);
      Serial.println("yn ver 0.15");
    это такую строчку выводит мой скетч при запуске - показывает версию скрипта )
    но я специально добавил туда два символа - yn
    на y и на n регируют мои сервы.
    и получается что при выполнении скрипта 2.php он какимто образом ловит эти команды !
    непонятно почему при чтении ИЗ порта происходит запись этих данных В этот же порт ? или как это еще можно объяснить..
    UPD
    я хотел сказать, что при запуске скрипта серв выполняет сначала команды y и n - они есть в ВЫВОДЕ который скетч выводит.
    а потом выполняет команду y которая в самом скрипте.
    вот и вопрос - почему выполняются первые y и n ?
     
  13. Unixon

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

    Буферизуется что ли ввод или вывод?
     
  14. d00m

    d00m Гик

    я не знаю как это назвать, но по поведению сервов - они реагируют на символы y и n, хотя эти символы ВЫВОДЯТСЯ на консоль, то есть СЧИТЫВАЮТСЯ из порта.
    я проверял - можно добавить несколько разный команд в Serial.println и они выполнятся !
    непонятно почему так..