Срочно нужна помощь с arduino due. Единица на пине.

roccosiffredi
Offline
Зарегистрирован: 22.06.2012

Добрый день, у меня проблема с питанием на задействованных в скетче пинах:

В коде нет операторов, которые посылали бы HIGH на пины, однако на некоторых пинах висят единицы. В порт никаких команд не идет, проверял также на других компьютерах. Может криво драйверы встали?

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

 

int magn = 49;
int rele = 47;
int brak1 = 44;
int brak2 = 45;
 
на этих пинах висит 3,3V

Выкладываю весь код:


#include <string.h>

//ДШИ 1 ГОРИЗОНТАЛЬ////////////////////////
int dirpin1 = 2;
int steppin1 = 3;
int leftPin1 = 52;
int rightPin1 = 50;
int Stop1 = 54;
int Stop2 = 55;

//ДШИ 2 ВЕРТИКАЛЬ////////////////////////
int dirpin2 = 4;
int steppin2 = 5;
int downPin2 = 53;
int upPin2 = 51;
int Stop3 = 56;
int Stop4 = 57;

int speedPin = 48;            // pin скорости
int datch = 46;               // pin касания
int magn = 49;                // pin столика
int stol = 58;                // pin кнопки стола
int diod = 59;                // pin диод касания

int rele = 47;                // pin реле
int brak1 = 44;               // pin брака1 по току
int brak2 = 45;               // pin брака2 по току
int signbrak = 42;            // pin сигнала брака по току

int rstate, lstate, ustate, dstate = 0;

int i, n, a, b, spPin, rval, lval, rightStop, leftStop, uval, dval, upStop, downStop, S, V, dat, sb;

char direct[5];
char st[10];
char sp[2];
char buffer[18];

void setup() 
{
  Serial.begin(115200);

  pinMode(dirpin1, OUTPUT);
  pinMode(steppin1, OUTPUT);
  pinMode(rightPin1, INPUT);
  pinMode(leftPin1, INPUT);
  pinMode(Stop1, INPUT);
  pinMode(Stop2, INPUT);

  pinMode(dirpin2, OUTPUT);
  pinMode(steppin2, OUTPUT);
  pinMode(downPin2, INPUT);
  pinMode(upPin2, INPUT);  
  pinMode(Stop3, INPUT);
  pinMode(Stop4, INPUT);

  pinMode(speedPin, INPUT);
  pinMode(datch, INPUT);
  pinMode(magn, OUTPUT);
  pinMode(stol, INPUT);
  pinMode(diod, OUTPUT);


  pinMode(rele, OUTPUT);
  pinMode(brak1, OUTPUT);
  pinMode(brak2, OUTPUT);
  pinMode(signbrak, INPUT);
}

void loop()
{
  int k = 0;  

  a = 500;                                     // КОНЕЧНАЯ СКОРОСТЬ
  n = 1000;                                    // НАЧАЛЬНАЯ СКОРОСТЬ
  b = 10;                                      // ШАГОВАЯ СКОРОСТЬ

  rval = digitalRead(rightPin1);               // Переменные горизонтального ДШИ1
  lval = digitalRead(leftPin1);
  rightStop = digitalRead(Stop1);
  leftStop = digitalRead(Stop2);

  uval = digitalRead(upPin2);                  // Переменные вертикального ДШИ2
  dval = digitalRead(downPin2);
  upStop = digitalRead(Stop3);
  downStop = digitalRead(Stop4);

  spPin = digitalRead(speedPin);               // Переменная скорости 
  dat = digitalRead(datch);                    // Переменная датчика касания

  sb = digitalRead(signbrak);                  // Переменная сигнала брака по току

  digitalWrite(datch, HIGH);                   // Запуск обратной логики касания

  /*
   digitalWrite(brak1, LOW);                  // Специально забиваю в пины нули, т.к. там висит логическая единица
   digitalWrite(brak2, LOW);
   digitalWrite(magn, LOW);
   digitalWrite(rele, LOW);
   */

  direct[0] = '\0';
  st[0] = '\0';
  sp[0] = '\0';

  if (dat == HIGH) 
  {    
    digitalWrite(diod, HIGH);
  }
  if (dat == LOW) 
  {    
    digitalWrite(diod, LOW);
  }


  ////ДШИ1/////////////////////////////////////////////

  // right SPEED 1.
  if (rval == HIGH && spPin == LOW && rightStop == LOW) 
  {    
    digitalWrite(dirpin1, LOW);                // Выбираем направление
    digitalWrite(steppin1, LOW);
    digitalWrite(steppin1, HIGH);
    delay(b); 
  }


  // left SPEED 1.
  if (lval == HIGH && spPin == LOW && leftStop == LOW)
  {    
    digitalWrite(dirpin1, HIGH);               // Меняем направление
    digitalWrite(steppin1, LOW);
    digitalWrite(steppin1, HIGH);
    delay(b); 
  }


  // right SPEED 2.
  if (rval == HIGH && spPin == HIGH && rightStop == LOW) 
  {    
    if (rstate == 0)
    {
      digitalWrite(dirpin1, LOW);              // Выбираем направление

      for (n; n>a; n--)                        // Ускорение
      {  
        digitalWrite(steppin1, LOW);
        digitalWrite(steppin1, HIGH);
        delayMicroseconds(n);
      }
      rstate = 1;
    }
    if (rstate == 1)
    {
      digitalWrite(steppin1, LOW);
      digitalWrite(steppin1, HIGH);
      delayMicroseconds(a); 
    }
  }
  if (rval == LOW)
  {
    rstate = 0;
  }

  // left SPEED 2.
  if (lval == HIGH && spPin == HIGH && leftStop == LOW)
  {    
    if (lstate == 0)
    {
      digitalWrite(dirpin1, HIGH);             // Меняем направление

      for (n; n>a; n--)                        // Ускорение
      {
        digitalWrite(steppin1, LOW);
        digitalWrite(steppin1, HIGH);
        delayMicroseconds(n);
      }

      lstate = 1;
    }

    if (lstate == 1)
    {
      digitalWrite(steppin1, LOW);
      digitalWrite(steppin1, HIGH);
      delayMicroseconds(a); 
    }
  }

  if (lval == LOW)
  {
    lstate = 0;
  }

  ////ДШИ 2/////////////////////////////////////////

  // up SPEED 1.  
  if (uval == HIGH && spPin == LOW && upStop == LOW) 
  {    
    digitalWrite(dirpin2, LOW);                // Выбираем направление
    digitalWrite(steppin2, LOW);
    digitalWrite(steppin2, HIGH);
    delay(b); 
  }


  // down SPEED 1.
  if (dval == HIGH && spPin==LOW && downStop == LOW)
  {    
    digitalWrite(dirpin2, HIGH);               // Меняем направление
    digitalWrite(steppin2, LOW);
    digitalWrite(steppin2, HIGH);
    delay(b); 
  }


  // up SPEED 2.
  if (uval == HIGH && spPin == HIGH && upStop == LOW) 
  {    
    if (ustate == 0)
    {
      digitalWrite(dirpin2, LOW);              // Выбираем направление

      for (n; n>a; n--)                        // Ускорение
      {
        digitalWrite(steppin2, LOW);
        digitalWrite(steppin2, HIGH);
        delayMicroseconds(n);
      }
      ustate = 1;
    }
    if (ustate == 1)
    {
      digitalWrite(steppin2, LOW);
      digitalWrite(steppin2, HIGH);
      delayMicroseconds(a); 
    }
  }
  if (uval == LOW)
  {
    ustate = 0;
  }

  // down SPEED 2.
  if (dval == HIGH && spPin == HIGH && downStop == LOW)
  {    
    if (dstate == 0)
    {
      digitalWrite(dirpin2, HIGH);             // Меняем направление

      for (n; n>a; n--)                        // Ускорение
      {
        digitalWrite(steppin2, LOW);
        digitalWrite(steppin2, HIGH);
        delayMicroseconds(n);
      }
      dstate = 1;
    }
    if (dstate == 1)
    {
      digitalWrite(steppin2, LOW);
      digitalWrite(steppin2, HIGH);
      delayMicroseconds(a); 
    }
  }
  if (dval == LOW)
  {
    dstate = 0;
  }

  while(Serial.available() > 0)                // Загоняем прочитанное в буфер
  {       
    buffer[k] = Serial.read();
    k++;
    delay (2);
  }
  buffer[k++] = '\0';                          // Закрываем массив

  if(k>0)                                      // Если буфер наполнен
  {       
    sscanf(buffer, "%[^','],%[^','],%[^',']", &direct, &st, &sp);      //разбераем его на части отделенные запятой 
  }

  S = String(st).toInt();
  V = String(sp).toInt();

  // ПРОВЕРКА КАСАНИЯ
  if ((String)direct == "a")
  {    

    // ДАТЧИК КАСАНИЯ.
    if (dat == HIGH)                           // Контакт
    {
      Serial.print(1, DEC);      
    }
    else                                       // Нет контакта
    {
      Serial.print(2, DEC);      
    }   
  }

  // ПРОВЕРКА ГОДНОСТИ ПО ТОКУ
  if ((String)direct == "sb")
  {    

    // СИГНАЛ БРАКА.
    if (sb == HIGH)                            // Брак
    {
      Serial.print(3, DEC);      
    }
    else                                       // Годный
    {
      Serial.print(4, DEC);      
    }   
  }

  // БЛОК РЕЛЕ
  if ((String)direct == "rh")
  {    
    digitalWrite(rele, HIGH);
  }
  if ((String)direct == "rl")
  {    
    digitalWrite(rele, LOW);
  }

  // Маркировка бракованного диода1
  if ((String)direct == "b1")
  {    
    digitalWrite(brak1, HIGH);
    delay(200);
    digitalWrite(brak1, LOW);
  }

  // Маркировка бракованного диода2
  if ((String)direct == "b2")
  {    
    digitalWrite(brak2, HIGH);
    delay(200);
    digitalWrite(brak2, LOW);
  }

  // Крутим вправо (RIGHT)/////////////////////
  if ((String)direct == "r" && rightStop == LOW)
  {
    digitalWrite(magn, LOW);
    for (i=0; i<S; i++)
    {
      digitalWrite(dirpin1, LOW);              // Выбираем направление
      digitalWrite(steppin1, LOW);
      digitalWrite(steppin1, HIGH);
      delay(V); 
    }
    digitalWrite(magn, HIGH);
  }

  // Крутим влево (LEFT)///////////////////////
  if ((String)direct == "l" && leftStop == LOW)
  {
    digitalWrite(magn, LOW);
    for (i=0; i<S; i++)
    {
      digitalWrite(dirpin1, HIGH);             // Выбираем направление
      digitalWrite(steppin1, LOW);
      digitalWrite(steppin1, HIGH);
      delay(V); 
    }
    digitalWrite(magn, HIGH);
  }

  // Крутим вверх (UP)/////////////////////////
  if ((String)direct == "u" && upStop == LOW) 
  {
    digitalWrite(magn, LOW);
    for (i=0; i<S; i++)
    {    
      digitalWrite(dirpin2, LOW);              // Выбираем направление
      digitalWrite(steppin2, LOW);
      digitalWrite(steppin2, HIGH);
      delay(V); 
    }
    digitalWrite(magn, HIGH);
  }

  // Крутим вниз (DOWN)////////////////////////
  if ((String)direct == "d" && downStop == LOW) 
  {
    digitalWrite(magn, LOW);
    for (i=0; i<S; i++)
    {    
      digitalWrite(dirpin2, HIGH);             // Выбираем направление
      digitalWrite(steppin2, LOW);
      digitalWrite(steppin2, HIGH);
      delay(V); 
    }
    digitalWrite(magn, HIGH);
  }   
}

С уважением, Александр.

roccosiffredi
Offline
Зарегистрирован: 22.06.2012

Также проверил питание на всех пинах на пустом скетче - напряжение в диапазоне 0,6-0,9V. Это нормально?

Andrey_Y_Ostanovsky
Offline
Зарегистрирован: 03.12.2012

Вот тут перечислены некоторые приемы диагностики и есть скетч для тестирования состояния пинов. Спасибы - слать автору скетча.

maksim
Offline
Зарегистрирован: 12.02.2012

Преобретите Mega2560.

roccosiffredi
Offline
Зарегистрирован: 22.06.2012

maksim пишет:

Преобретите Mega2560.

Поясните пожалуйста почему Мега лучше Дуе? Я брал именно Дуе из-за частоты.

maksim
Offline
Зарегистрирован: 12.02.2012

Потому как то что у вас делает дуина справился бы и Atmega48(если сэкономить один вывод). На SAM3X8E(Дуе) можно какую нибудь ОС поставить, а вы ей два шаговика крутите. Дуе еще не объезженная платформа с своими косяками и недочетами + отсутствие библиотек. Мега же объезжана в доль и поперек. Если нужно срочно, то решение одно - поставить Мегу.

roccosiffredi
Offline
Зарегистрирован: 22.06.2012

Все верно, спасибо за помощь. Проверил на Uno - проблема исчезла. Буду добывать Mega.

maksim
Offline
Зарегистрирован: 12.02.2012

Так если Уна уже есть, то может подумать как сэкономить один вывод? Ведь у вас используется 21 цифровой вывод, а у Уны их 20.

roccosiffredi
Offline
Зарегистрирован: 22.06.2012

К сожалению возможности сэкономить пин нет, более того - скорее всего понадобятся еще несколько дополнительных.

Оперативно удалось найти в продаже только Arduino Mega 2560 R3. Я думаю отличия с обычной Mega не принципиальные и собираюсь ее купить, вот только возможность возврата платы отсутствует, потому хотел бы убедиться и перестраховаться.

Mega R3 подойдет ведь?

С уважением, Александр.

maksim
Offline
Зарегистрирован: 12.02.2012

Подойдет, R3 - это всего лишь версия платы, МК тот же.

roccosiffredi
Offline
Зарегистрирован: 22.06.2012

Ну вот и мега 2560 забарахлила. Сообщения на ПК доходят лишь спустя 10 секунд после открытия порта.

void setup() 
{
  Serial.begin(9600);

  Serial.println("step1");
  delay(1000);
}

void loop()
{
  Serial.println("step2");
  delay(1000);
}

Уно снова надежнее своих отпрысков. Задержка отсутствует, сообщение от уно начинают приходить почти сразу после загрузки скетча. Однако механическая часть кода (реакции на кнопки) в мега2560 работает сразу после загрузки.

Это можно каким-либо образом исправить или перед запуском программы измерений необходима 10секундная задержка после установки связи с платой?

С уважением, Александр.

roccosiffredi
Offline
Зарегистрирован: 22.06.2012

При открытии монитора задержка присутствует, но при нажатии резет в это время сообщения приходят сразу. Возможно ли программно резетить?

C уважением, Александр.

maksim
Offline
Зарегистрирован: 12.02.2012

Перезагрузите комп, если не поможет, то переустановите драйвер на мегу.

roccosiffredi
Offline
Зарегистрирован: 22.06.2012

Не помогло. Переустанавливал драйверы, пробовал 1.5.1 beta версию. Перезагружался. Все не по чем.

maksim
Offline
Зарегистрирован: 12.02.2012

А уно и мега у вас одновременно к компу подключены? СОМ-порты у них разные назначены? 

roccosiffredi
Offline
Зарегистрирован: 22.06.2012

Обе платы были подключены одновременно, в ide переназначал название платы и номер порта. Так же пытался пересадить мега на другой порт, но это тоже не помогло. Плата, насколько мне известно, не оригинальная. Может в этом кроется проблема. 

Так же пробовал резетить программно с помощью этой функции:

 

void(* resetFunc) (void) = 0; // Reset MC function

resetFunc(); //вызов

но куда бы я не вставлял resetFunc(); результат один и тот же - либо связь устанавливается спустя 10 секунд, либо сообщения не приходят вовсе.

 

 

maksim
Offline
Зарегистрирован: 12.02.2012

Задержка эта именно при открытии порта компом, то есть это комп не может открыть порт, дуина скорее всего не при чем. У меня такое иногда бывает ,когда одновременно несколько дуин к одному компу подключены. Помогает простое отключение - подключение той или иной дуины от компа. Попробуйте только Мегу оставить подключенной к компу, Уну отключите. Также удалите драйвер Уны, может быть конфликт драйверов.

Ведь и скейтчи наверное заливаются тоже не сразу, а с задержкой?

roccosiffredi
Offline
Зарегистрирован: 22.06.2012

Уно я лишь для эксперимента подключил, она уже удалена. Попробую снести usb-modem, может в нем дело, хотя с уно он не мешал открыть быстро порт. Также попробую на другом ПК мегу.

tsostik
Offline
Зарегистрирован: 28.02.2013

Я, конечно,  не могу знать тонкости Вашего кода, но у Вас в скетче используется 9 выходных пинов.

Простейший сдвиговый регистр освободит вам 6 выводов. Стоить это будет 9 байт ОЗУ и сотню байт скетча.

roccosiffredi
Offline
Зарегистрирован: 22.06.2012

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

Но с открытием порта надо разобраться. При смене ПК порт открылся мгновенно. Так что дело все-таки в его огороде. На нем стояли дрова дуе, уно и мега, может я неудачно прочистил все перед установкой драйверов на мегу. Удалял драйверы в диспетчере устройств. Или, возможно дело в usb-драйвере?

tsostik
Offline
Зарегистрирован: 28.02.2013
roccosiffredi
Offline
Зарегистрирован: 22.06.2012
int datch = 9;                // pin касания

int dat, S, V;

char direct[3];      //3

char st[6];          //6
char sp[2];          //2
char buffer[12];     //12

void setup() 
{
  Serial.begin(9600);
  pinMode(datch, INPUT);
}

void loop()
{
  int k = 0; 
  dat = digitalRead(datch);                    // Переменная датчика касания
  digitalWrite(datch, HIGH);                   // Запуск обратной логики касания

  direct[0] = '\0';
  st[0] = '\0';
  sp[0] = '\0';

  while(Serial.available() > 0)                // Загоняем прочитанное в буфер
  {       
    buffer[k] = Serial.read();
    k++;
    delay(2);
  }
  buffer[k++] = '\0';                          // Закрываем массив

  if(k>0)                                      // Если буфер наполнен
  {       
    sscanf(buffer, "%[^','],%[^','],%[^',']", &direct, &st, &sp);      // Разбираем его на части отделенные запятой 
  }

  S = String(st).toInt();
  V = String(sp).toInt();

  // ПРОВЕРКА КАСАНИЯ
  if ((String)direct == "a")
  {    

    // ДАТЧИК КАСАНИЯ.
    if (dat == HIGH)                           // Контакт
    {
      Serial.print(1, DEC);
    }
    else                                       // Нет контакта
    {
      Serial.print(2, DEC);
    }   
  }
}

Оцените пожалуйста. Критичного ничего нет? Проблема либо здесь, либо на стороне LabVIEW. В Labview при считывании данных на первой итерации ошибка (возможно в таймауте - функция считывания данных зависает на 10 секунд), со второй все в норме.

Задержка в SerialMonitor ушла со сменой ПК. Скорее всего дело в материнской плате было. Т.к. проблемы возникали на материнках с RS232 портом.