Срочно нужна помощь с arduino due. Единица на пине.
- Войдите на сайт для отправки комментариев
Ср, 13/02/2013 - 16:09
Добрый день, у меня проблема с питанием на задействованных в скетче пинах:
В коде нет операторов, которые посылали бы 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); } }
С уважением, Александр.
Также проверил питание на всех пинах на пустом скетче - напряжение в диапазоне 0,6-0,9V. Это нормально?
Вот тут перечислены некоторые приемы диагностики и есть скетч для тестирования состояния пинов. Спасибы - слать автору скетча.
Преобретите Mega2560.
Преобретите Mega2560.
Поясните пожалуйста почему Мега лучше Дуе? Я брал именно Дуе из-за частоты.
Потому как то что у вас делает дуина справился бы и Atmega48(если сэкономить один вывод). На SAM3X8E(Дуе) можно какую нибудь ОС поставить, а вы ей два шаговика крутите. Дуе еще не объезженная платформа с своими косяками и недочетами + отсутствие библиотек. Мега же объезжана в доль и поперек. Если нужно срочно, то решение одно - поставить Мегу.
Все верно, спасибо за помощь. Проверил на Uno - проблема исчезла. Буду добывать Mega.
Так если Уна уже есть, то может подумать как сэкономить один вывод? Ведь у вас используется 21 цифровой вывод, а у Уны их 20.
К сожалению возможности сэкономить пин нет, более того - скорее всего понадобятся еще несколько дополнительных.
Оперативно удалось найти в продаже только Arduino Mega 2560 R3. Я думаю отличия с обычной Mega не принципиальные и собираюсь ее купить, вот только возможность возврата платы отсутствует, потому хотел бы убедиться и перестраховаться.
Mega R3 подойдет ведь?
С уважением, Александр.
Подойдет, R3 - это всего лишь версия платы, МК тот же.
Ну вот и мега 2560 забарахлила. Сообщения на ПК доходят лишь спустя 10 секунд после открытия порта.
Уно снова надежнее своих отпрысков. Задержка отсутствует, сообщение от уно начинают приходить почти сразу после загрузки скетча. Однако механическая часть кода (реакции на кнопки) в мега2560 работает сразу после загрузки.
Это можно каким-либо образом исправить или перед запуском программы измерений необходима 10секундная задержка после установки связи с платой?
С уважением, Александр.
При открытии монитора задержка присутствует, но при нажатии резет в это время сообщения приходят сразу. Возможно ли программно резетить?
C уважением, Александр.
Перезагрузите комп, если не поможет, то переустановите драйвер на мегу.
Не помогло. Переустанавливал драйверы, пробовал 1.5.1 beta версию. Перезагружался. Все не по чем.
А уно и мега у вас одновременно к компу подключены? СОМ-порты у них разные назначены?
Обе платы были подключены одновременно, в ide переназначал название платы и номер порта. Так же пытался пересадить мега на другой порт, но это тоже не помогло. Плата, насколько мне известно, не оригинальная. Может в этом кроется проблема.
Так же пробовал резетить программно с помощью этой функции:
но куда бы я не вставлял resetFunc(); результат один и тот же - либо связь устанавливается спустя 10 секунд, либо сообщения не приходят вовсе.
Задержка эта именно при открытии порта компом, то есть это комп не может открыть порт, дуина скорее всего не при чем. У меня такое иногда бывает ,когда одновременно несколько дуин к одному компу подключены. Помогает простое отключение - подключение той или иной дуины от компа. Попробуйте только Мегу оставить подключенной к компу, Уну отключите. Также удалите драйвер Уны, может быть конфликт драйверов.
Ведь и скейтчи наверное заливаются тоже не сразу, а с задержкой?
Уно я лишь для эксперимента подключил, она уже удалена. Попробую снести usb-modem, может в нем дело, хотя с уно он не мешал открыть быстро порт. Также попробую на другом ПК мегу.
Я, конечно, не могу знать тонкости Вашего кода, но у Вас в скетче используется 9 выходных пинов.
Простейший сдвиговый регистр освободит вам 6 выводов. Стоить это будет 9 байт ОЗУ и сотню байт скетча.
Хорошо, спасибо большое за совет, я это обязательно учту, возможно дадите ссылочку на хорошее описание работы со сдвиговыми регистрами?
Но с открытием порта надо разобраться. При смене ПК порт открылся мгновенно. Так что дело все-таки в его огороде. На нем стояли дрова дуе, уно и мега, может я неудачно прочистил все перед установкой драйверов на мегу. Удалял драйверы в диспетчере устройств. Или, возможно дело в usb-драйвере?
http://arduino.ru/Tutorial/registr_74HC595
Оцените пожалуйста. Критичного ничего нет? Проблема либо здесь, либо на стороне LabVIEW. В Labview при считывании данных на первой итерации ошибка (возможно в таймауте - функция считывания данных зависает на 10 секунд), со второй все в норме.
Задержка в SerialMonitor ушла со сменой ПК. Скорее всего дело в материнской плате было. Т.к. проблемы возникали на материнках с RS232 портом.