#1 2019-10-21 13:43:29

valerakopay
Участник
Зарегистрирован: 2019-10-21
Сообщений: 10

Передача значений из порта в порт в пределах одной Arduino - реально?

Цель - сделать игрушку для маленького рёбенка - соединяя провода разных цветов - при правильном соеденении одного цвета - зажигать светодиод соотвествующего цвета.

Не силен в ардуино, но поидее если у нас есть pwm порты которые могут отсылать значения используя шим от 0 до 255 и есть аналоговые порты которые могут считывать аналоговые значения - в теории всё реально?
Код для UNO(хотя пробовал и мегу):

int whitePinWrite = 5;
int bluePinWrite = 6;
int redPinWrite = 9;
int yellowPinWrite = 10;
int greenPinWrite = 11;

int whitePinRead = A0;
int bluePinRead = A1;
int redPinRead = A2;
int yellowPinRead = A3;
int greenPinRead = A4;

  int whiteCode = 10;
  int blueCode = 20;
  int redCode = 30;
  int yellowCode = 40;
  int greenCode = 50;

  int white = 10;
  int blue = 20;
  int red = 30;
  int yellow = 40;
  int green = 50;
    
void setup() {
 pinMode(whitePinWrite, OUTPUT);
 pinMode(bluePinWrite, OUTPUT);
 pinMode(redPinWrite, OUTPUT);
 pinMode(yellowPinWrite, OUTPUT);
 pinMode(greenPinWrite, OUTPUT);
 
 pinMode(whitePinRead, INPUT);
 pinMode(bluePinRead, INPUT);
 pinMode(redPinRead, INPUT);
 pinMode(yellowPinRead, INPUT);
 pinMode(greenPinRead, INPUT);
 Serial.begin(115200); 
 
}

void loop() {

  analogWrite(whitePinWrite,whiteCode);
  analogWrite(bluePinWrite,blueCode);
  analogWrite(redPinWrite,redCode);
  analogWrite(yellowPinWrite,yellowCode);
  analogWrite(greenPinWrite,greenCode);

white = analogRead(whitePinRead);
blue = analogRead(bluePinRead);
red = analogRead(redPinRead);
yellow = analogRead(yellowPinRead);
green = analogRead(greenPinRead);
 
 Serial.print("white=\t");
 Serial.println(analogRead(whitePinRead));
 
if(white == whiteCode){
  Serial.println("White connected");
}

 Serial.print("blue=\t");
 Serial.println(blue);
 
if(blue == blueCode){
  Serial.println("blue connected");
}
 Serial.print("red=\t");
 Serial.println(red);
if(red  == redCode){
  Serial.println("red connected");
}
 Serial.print("yellow=\t");
 Serial.println(yellow);
if(yellow == yellowCode){
  Serial.println("yellow connected");
}
 Serial.print("green=\t");
 Serial.println(green);
if(green == greenCode){
  Serial.println("green connected");
}
Serial.println("___");
delay(500);
}

В итоге если не соединять кабельки - ловит рандомный шум, при соеденении, если передаваемое значение будет меньше 200 - то почти всегда будет показывать 0, больше 200 - почти всегда 1023, но не без рандома так же:
___
white=    0
blue=    0
red=    0
yellow=    0
green=    0
___
white=    0
blue=    0
red=    0
yellow=    748
green=    1023
___
white=    0
blue=    1023
red=    0
yellow=    0
green=    1022
___

Я что то делаю явно не так, а что не ясно, пробовал уже всё что только можно.
Или данную задачу можно решить только подавая HIGH и на каждый провод по резистору цеплять разного номинала?
Заранее спасибо тем, кто откликнулся!

Редактировался valerakopay (2019-10-21 13:45:08)

#2 2019-10-21 20:11:33

Kaka
Участник
Зарегистрирован: 2018-03-21
Сообщений: 285

Re: Передача значений из порта в порт в пределах одной Arduino - реально?

valerakopay пишет:

поидее если у нас есть pwm порты которые могут отсылать значения используя шим от 0 до 255 и есть аналоговые порты которые могут считывать аналоговые значения

Ну, могут и дальше чё? Зачем ты пытаешься читать ШИМ как аналоговое значение? Чего ты там надеешься прочитать? Хочешь читать как аналоговое, сначала сделай его аналоговым - проинтегрируй.

#3 2019-10-21 21:23:05

MikeM
Участник
Зарегистрирован: 2017-11-03
Сообщений: 87

Re: Передача значений из порта в порт в пределах одной Arduino - реально?

Зачем усложнять жизнь ШИМом и "аналоговыми" значениями?
Подаёшь активный уровень (цифровой) на whitePinWrite и проверяешь состояние whitePinRead.
"И так восемь раз" (прямо как в анекдоте)

Редактировался MikeM (2019-10-21 21:23:18)

#4 2019-10-21 21:52:03

valerakopay
Участник
Зарегистрирован: 2019-10-21
Сообщений: 10

Re: Передача значений из порта в порт в пределах одной Arduino - реально?

MikeM пишет:

Зачем усложнять жизнь ШИМом и "аналоговыми" значениями?
Подаёшь активный уровень (цифровой) на whitePinWrite и проверяешь состояние whitePinRead.
"И так восемь раз" (прямо как в анекдоте)

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

#5 2019-10-21 22:07:54

valerakopay
Участник
Зарегистрирован: 2019-10-21
Сообщений: 10

Re: Передача значений из порта в порт в пределах одной Arduino - реально?

Kaka пишет:

Зачем ты пытаешься читать ШИМ как аналоговое значение? .

писал же что не разбираюсь, пробовал по разному, просто это последний вариант

Kaka пишет:

Хочешь читать как аналоговое, сначала сделай его аналоговым - проинтегрируй.

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

#6 2019-10-21 22:24:53

MikeM
Участник
Зарегистрирован: 2017-11-03
Сообщений: 87

Re: Передача значений из порта в порт в пределах одной Arduino - реально?

Думал, что это очевидно. Корректирую:
Подаёшь активный уровень (цифровой) на whitePinWrite и проверяешь состояние whitePinRead, затем снимаешь активный уровень.
Повторяешь эту последовательность для остальных пар портов.

Редактировался MikeM (2019-10-21 22:25:35)

#7 2019-10-21 22:49:05

Kaka
Участник
Зарегистрирован: 2018-03-21
Сообщений: 285

Re: Передача значений из порта в порт в пределах одной Arduino - реально?

valerakopay пишет:

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

К шимовому выходу присоединяешь резистор скажем килоом на 4,7. К другому концу резистора присоединяешь конденсатор на 10мкф. Другой конец конденсатора на землю.

Это интегрирующая цепочка. С места соединения резистора и конденсатора снимаешь аналоговый сигнал от 0 до 5В в зависимости от скважности ШИМ. Вот его можно завести на АЦП и считывать.

Если хочешь уж совсем по уму, можно добавить еще буффер (повторитель напряжения), но для считывания сигнала АЦП - не обязательно.

Вот схема с буфером. Его можно выбросить и оставить только резистор и конденсатор.


pwm_to_analog3.gif

Редактировался Kaka (2019-10-21 22:50:29)

#8 2019-10-22 09:00:53

Green
Участник
Зарегистрирован: 2015-11-08
Сообщений: 588

Re: Передача значений из порта в порт в пределах одной Arduino - реально?

MikeM, всё верно.
Входа с подтяжкой, активный низкий, снимается переводом на ввод.)

Было когда то задание для квеста. Без доп. элементов.
- куча проводов
- могут быть соединены в узлы по 2, 3 провода, некоторые могут быть не задействованы
Не всё так просто, как может показаться на первый взгляд.)

#9 2019-10-22 09:12:30

Green
Участник
Зарегистрирован: 2015-11-08
Сообщений: 588

Re: Передача значений из порта в порт в пределах одной Arduino - реально?

Забыл. При проверке нужно и остальные входа проверять на отсутствие связи, иначе можно все скрутить в кучу.)

#10 2019-10-22 11:43:36

valerakopay
Участник
Зарегистрирован: 2019-10-21
Сообщений: 10

Re: Передача значений из порта в порт в пределах одной Arduino - реально?

MikeM пишет:

Подаёшь активный уровень (цифровой) на whitePinWrite и проверяешь состояние whitePinRead, затем снимаешь активный уровень.

Вроде получилось, спасибо. Не привык еще к этой специфике вечного лупа и быстрой работы ардуины - вариант самый простой получается конечно.

void setup() {
  Serial.begin(115200);
  for (int r = 2; r <= 6; r++ ) {
    pinMode(r, INPUT);
    int w = r + 5;
    pinMode(w, OUTPUT);
  }
}

void loop() {
  for (int r = 2; r <= 6; r++ ) {
    int w = r + 5;
    digitalWrite(w, HIGH);
    Serial.print(r);
    if (digitalRead(r) == HIGH) {
      Serial.println("=connected");
    } else {
      Serial.println("=disconnected");
    }
    digitalWrite(w, LOW);
  }
  delay(20);
}

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

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

Редактировался valerakopay (2019-10-22 13:10:14)

#11 2019-10-22 11:45:40

valerakopay
Участник
Зарегистрирован: 2019-10-21
Сообщений: 10

Re: Передача значений из порта в порт в пределах одной Arduino - реально?

Green пишет:

Забыл. При проверке нужно и остальные входа проверять на отсутствие связи, иначе можно все скрутить в кучу.)

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

#12 2019-10-28 16:55:57

Green
Участник
Зарегистрирован: 2015-11-08
Сообщений: 588

Re: Передача значений из порта в порт в пределах одной Arduino - реально?

Как раз выход с выходом и может быть проблемой. Вы просто не рассматриваете все возможные варианты.

#13 2019-10-29 11:25:15

Kaka
Участник
Зарегистрирован: 2018-03-21
Сообщений: 285

Re: Передача значений из порта в порт в пределах одной Arduino - реально?

valerakopay пишет:

в теории можно конечно будет выход с выходом или вход в входом закоротить

Через килоомный резистор. А то случайно включишь оба на OUTPUT, в один сунешь HIGH, а в другой LOW - придётся комнату проветривать.

#14 2019-10-29 11:36:29

valerakopay
Участник
Зарегистрирован: 2019-10-21
Сообщений: 10

Re: Передача значений из порта в порт в пределах одной Arduino - реально?

Kaka пишет:
valerakopay пишет:

в теории можно конечно будет выход с выходом или вход в входом закоротить

Через килоомный резистор. А то случайно включишь оба на OUTPUT, в один сунешь HIGH, а в другой LOW - придётся комнату проветривать.

поставить на каждый OUTPUT 1кОм резистор что бы не было проблем?

#15 2019-10-29 13:20:15

Kaka
Участник
Зарегистрирован: 2018-03-21
Сообщений: 285

Re: Передача значений из порта в порт в пределах одной Arduino - реально?

Ну, если только с умом. Иногда бывает, что этот резистор мешает. Но если нет, то его в любом случае невредно поставить как можно ближе к пину. Типичный пример: спаял плату, включаешь проверять, но не заметил, что на столе под ней откушенная ножка какой-нибудь детали валяется, или там пинцет на плату уронил. Если все пины защищены, то вероятность выхода дыма в разы снижается.

#16 2019-10-30 06:26:54

Green
Участник
Зарегистрирован: 2015-11-08
Сообщений: 588

Re: Передача значений из порта в порт в пределах одной Arduino - реально?

Если с умом, то можно и без резисторов. Читайте внимательно.

#17 2020-01-14 20:15:36

valerakopay
Участник
Зарегистрирован: 2019-10-21
Сообщений: 10

Re: Передача значений из порта в порт в пределах одной Arduino - реально?

Настало время установки smile по указанному коду выше когда порты замкнуты (без резистора) - все отлично, реле замыкается и не размыкается пока не разомкнуть проводники что замыкают порты.
Но вот в разомкнутом состоянии реле то замыкается то размыкается на глаз как раз в пол секунды, по логам 10 лупов с паузой по 20 мс connected, 10 - disconnected.
При этом если рукой взяться за проводник который идёт к порту с которого считывается сигнал, скорость размыкания и замыкания ускоряется.
Стоит экспериментировать с резисторами? Они могут тут помочь ?

#18 2020-01-15 11:15:56

MikeM
Участник
Зарегистрирован: 2017-11-03
Сообщений: 87

Re: Передача значений из порта в порт в пределах одной Arduino - реально?

INPUT заменить на INPUT_PULLUP

#19 2020-01-16 00:03:56

valerakopay
Участник
Зарегистрирован: 2019-10-21
Сообщений: 10

Re: Передача значений из порта в порт в пределах одной Arduino - реально?

MikeM пишет:

INPUT заменить на INPUT_PULLUP

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

#20 2020-01-16 00:32:33

г0сть
Гость

Re: Передача значений из порта в порт в пределах одной Arduino - реально?

valerakopay пишет:
MikeM пишет:

INPUT заменить на INPUT_PULLUP

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

так и должно быть. Инвертируйте в скетче сигналы

#21 2020-01-16 14:18:29

valerakopay
Участник
Зарегистрирован: 2019-10-21
Сообщений: 10

Re: Передача значений из порта в порт в пределах одной Arduino - реально?

г0сть пишет:
valerakopay пишет:
MikeM пишет:

INPUT заменить на INPUT_PULLUP

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

так и должно быть. Инвертируйте в скетче сигналы

вы имеете ввиду записывать в порт LOW а не HIGH? и если при чтении будет LOW значит порты замкнуты друг на друга?

#22 2020-01-16 16:15:57

г0сть
Гость

Re: Передача значений из порта в порт в пределах одной Arduino - реально?

Да

Быстрое сообщение

Введите сообщение и нажмите Отправить

Подвал раздела