есть ли способ протестировать Arduino?

Тема в разделе "Arduino & Shields", создана пользователем Hokama, 13 май 2012.

  1. Hokama

    Hokama Нерд

    железо: Mega 2560 и Ethernet Shield, к аналоговом вхдам 0 - 5 подключены потенциометры.
    прошивка: проста до безобразия, сервер при подключении шлет клиенту в столбик значения формата [pin] : [val]

    как было: php скрипт подключался к arduino, парсил строки - по первому символу определял [pin] и присваивал соответствующей переменной значения с противоположного конца строки [val]. после прогона всех 6 строк передовал переменные в JS. в браузере все визулизировалось, графики и так далее. запросы на arduino шли раз в секунду.

    как стало: вышеописаное работало без сбоев довольно долго (да там и сбоить то нечему..), НО внезапно связь с arduino стала обрываться. с частотой от минуты и чаще. на запросы напрямую по IP тоже реагирует не всегда, иногда шлет мусор в браузер (мешанину с тэгами как будто за раз 4-5 запросов впихивает). иногда происходят обвалы значений - было например 400, резко падает до 0, потом опять в норму. происходит с любыми пинами рандомно или с несколькими сразу. перепрошивка не дала результата, отключение всей схемы тоже. по прежнему падает связь и значения ведут себя как описано выше.

    дело мне кажется в железе. есть способ протестировать его? либо сама мега либо шилд.
    зы: когда в очередной раз проблемы с конектом, помогает провести рукой по полоске аналоговых входов или накрыть плату рукой.. тут я совсем не понимаю как это и что это..

    upd: прикрутил сериал принт, который выводит clientLine. наблюдения показали: в течении непродолжительного времени после старта контроллера, как и положено раз в секунду приходит запрос, сериал принт его добросовестно показывает. дальше магия - контроллер как бы зависает. вывод с сериал порта прекращается, php соответственно неполучает данные, напрямую через браузер тоже не подключится к arduino (консолью пингуется). если не перезагружать, а попробовать поприкасаться к плате (не за контакты, а за пластмассу пинов) то может произойти как бы отвисание, сопровождающееся выбросом кучи сообщений в сериал монитор. сообщения собственно выводят clientLine. этот выброс чтото вроде резкой отдачи всего, что не отправилось в момент подвисания.
    Код (Text):
    #include <SPI.h>
    #include <Ethernet.h>
     
    boolean getFlag = false;
    String param;
    int digitalOut[32] = {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0};
     
    byte mac[] = { 0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED };
    byte ip[] = { 192, 168, 1, 177 };
    EthernetServer server(80);
     
    void setup() {
      delay(100);
     
      Serial.begin(57600);
     
      for (int i = 22; i <= 53; i++) {
        pinMode(i, OUTPUT);
        digitalWrite(i, digitalOut[i]);
      }
     
      Ethernet.begin(mac, ip);
      server.begin();
    }
     
    void loop() {
     
      EthernetClient client = server.available();
      if (client) {
        Serial.println("connecting...");
        boolean currentLineIsBlank = true;
        while (client.connected()) {
          if (client.available()) {
            char c = client.read();
     
            if (getFlag) {
              if (c != ' ') {
                param += c;
              } else {
                getFlag = false;
              }
            }
     
            if (c == '?' && param == "") {
              getFlag = true;
            }
            Serial.print(c)
            if (c == '\n' && currentLineIsBlank) {
              if(param == "") {
                client.println("HTTP/1.1 200 OK");
                client.println("Content-Type: text/html");
                client.println();
     
                for (int analogPin = 0; analogPin <= 5; analogPin++) {
                  client.print(analogPin);
                  client.print(" : ");
                  client.print(analogRead(analogPin));
                  client.println("<br />");
                }
              } else {
                int check1 = param.indexOf('=');
                if (check1 != -1) {
                  int check2 = param.indexOf('btn');
                  if (check2 != -1) {
                    int port = (param.substring(check1+1)).toInt();
                    digitalOut[port] = !digitalOut[port];
                    digitalWrite(port, digitalOut[port]);
                  }
                }
                param = "";
              }
              break;
            }
       
            if (c == '\n') {
              currentLineIsBlank = true;
            }
       
            else if (c != '\r') {
              currentLineIsBlank = false;
            }
          }
        }
        delay(1);
        client.stop();
      }
    }
    есть идеи куда копать?
     
  2. Unixon

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

    Может проблема в программной части, на ПК, а не в железе ?
     
  3. nailxx

    nailxx Официальный Нерд Администратор

    Да не похоже на программную проблему. Фокусы с рукой на это намекают.

    Может попробовать убрать Ethernet Shield и просто понаблюдать за serial-показаниями меги? Так мы сможем обелить или очернить эзернет.

    Ещё глупая мысль: в setup попробовать явно включить встроенные подтягивающие резисторы на A0-A5:

    digitalWrite(A0, HIGH);
    digitalWrite(A1, HIGH);
    // ...
     
  4. Hokama

    Hokama Нерд

    попробовал с digitalWrite(A0, HIGH); во всех портах выводит парядка 1021.
    с отсоединенным Ethernet shield протестил. вроде идет нармально. появилась мысль что по какойто причине Arduino перестал успевать обрабатывать запросы.
    а есть какой-нибудь debug sketch, который может прогнать все разъемы и интерфейсы?
    может где перемкнуло, и изза этого такое странное поведение.
     
  5. Unixon

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

    А попробуйте в код добавить отладочный вывод в нескольких местах и посмотреть есть ли какое то определенное место в коде, где программа начинает работать неправильно. Если вывод в Serial не будет работать, подключите к ардуине счетчик-драйвер 8-ки и пусть выводит номер контрольной точки в коде.
     
  6. Hokama

    Hokama Нерд

    да дело в том, что программа работает правильно. собственно иначе бы и не парился так.. я заливал и довольно громосткие сктчи, сервер с выводом страниц с SD карты и отправкой информации в сериал порт о SD карте, ее файлах, ошибках иницализации и тд. программы работают правильно. тут сама дунька в произвольный момент времени виснит в рандомном месте любой программы. проверял питание, не скачет. кабель здоровый вроде, но поменять попробую как до магазина доберусь.. был бы осциллограф, может им бы выводы на добросовестность сигналов проверил. всетаки непривычно после программирования ковырятся в железке и понимать что отладчик тут не вызвать)

    еще попробую все выводы забить 7-сегментниками, без драйверов и заставлю считать до бесконечности.

    если дуньку не удастся реанимировать, то будет хороший повод повозится с ARM.
     
  7. Unixon

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

    Вы не совсем правильно меня поняли. Дело не в том, чтобы проверить программу, а в том, чтобы проверить в какой именно момент исполнения программы глючит железо.
     
  8. Hokama

    Hokama Нерд

    я правильно понял. а заглючить может в любом месте программы. что уже проверено.
    а внешних хардварных устройств таких как счетчики или осциллограф нету..

    ладно, пока решение не найдено, перепишу свой скрипт на работу с сокетом. без Ethernet работает стабильнее, буду пользоватся USB.
    возможно проблемы в шилде, либо в интерфейсе связи между ним и контроллером.