Ви не увійшли.
Цель - сделать игрушку для маленького рёбенка - соединяя провода разных цветов - при правильном соеденении одного цвета - зажигать светодиод соотвествующего цвета.
Не силен в ардуино, но поидее если у нас есть 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)
Неактивний
поидее если у нас есть pwm порты которые могут отсылать значения используя шим от 0 до 255 и есть аналоговые порты которые могут считывать аналоговые значения
Ну, могут и дальше чё? Зачем ты пытаешься читать ШИМ как аналоговое значение? Чего ты там надеешься прочитать? Хочешь читать как аналоговое, сначала сделай его аналоговым - проинтегрируй.
Неактивний
Зачем усложнять жизнь ШИМом и "аналоговыми" значениями?
Подаёшь активный уровень (цифровой) на whitePinWrite и проверяешь состояние whitePinRead.
"И так восемь раз" (прямо как в анекдоте)
Остання редакція MikeM (2019-10-21 21:23:18)
Неактивний
Зачем усложнять жизнь ШИМом и "аналоговыми" значениями?
Подаёшь активный уровень (цифровой) на whitePinWrite и проверяешь состояние whitePinRead.
"И так восемь раз" (прямо как в анекдоте)
так тогда можно любой порт откуда идет выход соеденить с любым портом который читается и никак не различить правильный цвет был соединен или нет?
Неактивний
Зачем ты пытаешься читать ШИМ как аналоговое значение? .
писал же что не разбираюсь, пробовал по разному, просто это последний вариант
Хочешь читать как аналоговое, сначала сделай его аналоговым - проинтегрируй.
можно подробней или пример? по наводке нашел только как интегрировать полученный сигнал а не как наоборот делать.
Неактивний
Думал, что это очевидно. Корректирую:
Подаёшь активный уровень (цифровой) на whitePinWrite и проверяешь состояние whitePinRead, затем снимаешь активный уровень.
Повторяешь эту последовательность для остальных пар портов.
Остання редакція MikeM (2019-10-21 22:25:35)
Неактивний
можно подробней или пример? по наводке нашел только как интегрировать полученный сигнал а не как наоборот делать.
К шимовому выходу присоединяешь резистор скажем килоом на 4,7. К другому концу резистора присоединяешь конденсатор на 10мкф. Другой конец конденсатора на землю.
Это интегрирующая цепочка. С места соединения резистора и конденсатора снимаешь аналоговый сигнал от 0 до 5В в зависимости от скважности ШИМ. Вот его можно завести на АЦП и считывать.
Если хочешь уж совсем по уму, можно добавить еще буффер (повторитель напряжения), но для считывания сигнала АЦП - не обязательно.
Вот схема с буфером. Его можно выбросить и оставить только резистор и конденсатор.
Остання редакція Kaka (2019-10-21 22:50:29)
Неактивний
MikeM, всё верно.
Входа с подтяжкой, активный низкий, снимается переводом на ввод.)
Было когда то задание для квеста. Без доп. элементов.
- куча проводов
- могут быть соединены в узлы по 2, 3 провода, некоторые могут быть не задействованы
Не всё так просто, как может показаться на первый взгляд.)
Неактивний
Подаёшь активный уровень (цифровой) на 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)
Неактивний
Забыл. При проверке нужно и остальные входа проверять на отсутствие связи, иначе можно все скрутить в кучу.)
не понял что за проверка. физически это будут соединятся тюльпаны - папы с мамами. в теории можно конечно будет выход с выходом или вход в входом закоротить - это может быть проблемой?
Неактивний
в теории можно конечно будет выход с выходом или вход в входом закоротить
Через килоомный резистор. А то случайно включишь оба на OUTPUT, в один сунешь HIGH, а в другой LOW - придётся комнату проветривать.
Неактивний
valerakopay пише:в теории можно конечно будет выход с выходом или вход в входом закоротить
Через килоомный резистор. А то случайно включишь оба на OUTPUT, в один сунешь HIGH, а в другой LOW - придётся комнату проветривать.
поставить на каждый OUTPUT 1кОм резистор что бы не было проблем?
Неактивний
Ну, если только с умом. Иногда бывает, что этот резистор мешает. Но если нет, то его в любом случае невредно поставить как можно ближе к пину. Типичный пример: спаял плату, включаешь проверять, но не заметил, что на столе под ней откушенная ножка какой-нибудь детали валяется, или там пинцет на плату уронил. Если все пины защищены, то вероятность выхода дыма в разы снижается.
Неактивний
Настало время установки по указанному коду выше когда порты замкнуты (без резистора) - все отлично, реле замыкается и не размыкается пока не разомкнуть проводники что замыкают порты.
Но вот в разомкнутом состоянии реле то замыкается то размыкается на глаз как раз в пол секунды, по логам 10 лупов с паузой по 20 мс connected, 10 - disconnected.
При этом если рукой взяться за проводник который идёт к порту с которого считывается сигнал, скорость размыкания и замыкания ускоряется.
Стоит экспериментировать с резисторами? Они могут тут помочь ?
Неактивний
INPUT заменить на INPUT_PULLUP
спасибо за совет, попробовал - теперь даже при разомкнутых проводниках при чтении порта всегда HIGH.
Неактивний
MikeM пише:INPUT заменить на INPUT_PULLUP
спасибо за совет, попробовал - теперь даже при разомкнутых проводниках при чтении порта всегда HIGH.
так и должно быть. Инвертируйте в скетче сигналы
valerakopay пише:MikeM пише:INPUT заменить на INPUT_PULLUP
спасибо за совет, попробовал - теперь даже при разомкнутых проводниках при чтении порта всегда HIGH.
так и должно быть. Инвертируйте в скетче сигналы
вы имеете ввиду записывать в порт LOW а не HIGH? и если при чтении будет LOW значит порты замкнуты друг на друга?
Неактивний
Да