6 герконов по 3м проводам

Rumata
Rumata аватар
Offline
Зарегистрирован: 29.03.2019

1. Берем 2 esp. Первая AP, вместо вашей ардуины, вторая STA для физического подключения 100500 герконов.

2. Выдираем из земли один из трех проводов, сдаем на цветмет. По остальным двум подаем питание дла STA.

3. Передаем все нужное по вифи с STA на AP.

. дальше по классике

План "Б" - 2 ардуины + JDY40 с каждой стороны. Навар от сдачи в утиль третьего провода остается

Green
Offline
Зарегистрирован: 01.10.2015

Logik пишет:

Green пишет:

Logic, много букв. Не убедил. НЕ КАТИТ!

Я объективно подходил, и понимал что убедить такой комок тьмы не реально. Забей, для других написано. 


Я может быть и комок, однако мой вариант работает. В отличие от твоего!)))

/*
  Кнопочный чарлиплексинг
  биты: 5 4 3 2 1 0
  PIN1 -+-+-+---+---
        ^ ^ v   |
  PIN2 -+-|-+-+-|-+-
          |   ^ v v
  PIN3 ---+---+-+-+-
*/

#define PIN1              A0
#define PIN2              A1
#define PIN3              A2
#define KEY_LEVEL         (1024 / 5)    //уровень кнопки

uint8_t pin[] = {PIN1, PIN2, PIN3};

void setup() {
  Serial.begin(9600);
  Serial.println("Charlie key");
  for (uint8_t i = 0; i < sizeof(pin); i++)
    pinMode(pin[i], INPUT_PULLUP);
}

void loop() {
  uint8_t key = getKey();
  static uint8_t old;
  if (old != key)
    Serial.println(key, HEX);
  old = key;
}

uint8_t getKey() {
  uint8_t result = 0;
  for (uint8_t i = 0; i < sizeof(pin); i++)
    for (uint8_t j = 0; j < sizeof(pin); j++) {
      if (i == j) continue;
      digitalWrite(pin[i], LOW); pinMode(pin[i], OUTPUT);
      result <<= 1;
      result |= analogRead(pin[j]) <= KEY_LEVEL;
      pinMode(pin[i], INPUT_PULLUP);
    }
  return result;
}

Результат:

Charlie key
20
30
38
3C
3E
3F
3E
3C
38
30
20
0
 
vde69
Offline
Зарегистрирован: 10.01.2016

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

 

Green
Offline
Зарегистрирован: 01.10.2015

На каком младшем бите! Здесь порог. Меньше 1 вольта - хорошо, больше - лесом. Поставили 220 ом подтяжку получили 20 ма тока, ага? Токовая петля практически.) Вот вам и помехоустойчивость.

vde69
Offline
Зарегистрирован: 10.01.2016

Green пишет:

На каком младшем бите! Здесь порог. Меньше 1 вольта - хорошо, больше - лесом. Поставили 220 ом подтяжку получили 20 ма тока, ага? Токовая петля практически.) Вот вам и помехоустойчивость.

что будет если напряжение будет равно 1в? 

а вот, что АЦП будет выдавать, то 204, а то 203, Выше условие будет барахлить. 

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

Если да -  как Вы отследите одновременное нажатие A и B?

ну и наверно так будет более наглядно, да и наверно более правильно 

uint8_t getKey() {
  uint8_t result = 0;
  for (uint8_t i = 0; i < sizeof(pin); i++)
    digitalWrite(pin[i], LOW); pinMode(pin[i], OUTPUT);
    for (uint8_t j = 0; j < sizeof(pin); j++) {
      result <<= 1;
      if (i != j) result |= analogRead(pin[j]) <= KEY_LEVEL;
    }
    pinMode(pin[i], INPUT_PULLUP);
  return result;
}

 

Logik пишет:

Пусть схема так.

А как отследить одновременное нажатие G1+G2 ? в каждой итерации цикла делать 2 измерения с разной полярностью ?

nik182
Offline
Зарегистрирован: 04.05.2015

Слушал долго и внимательно. То, что ТС пытается реализовать называется параллельный ЦАП. Теории про работу такого ЦАП и схемы включения есть, например http://www.gaw.ru/html.cgi/txt/doc/dac/pardacs.htm . Можно выбрать разные схемы включения. Опять же как прочитать результат такого кодирования тоже достаточно резжёван. Для уверенного распознавания разрядность АЦП должно быть лучше, чем точность резисторов ЦАП. В общем случае для уверенного распознавания разрядность АЦП должна быть как минимум в два раза выше - для шести кнопок нужно 12 разрядное АЦП.

Logik
Offline
Зарегистрирован: 05.08.2014

vde69 пишет:

Logik пишет:

Пусть схема так.

А как отследить одновременное нажатие G1+G2 ? в каждой итерации цикла делать 2 измерения с разной полярностью ?

Да. Каждый цикл - перебор всех трех вариантов стробов смена полярности и снова перебор трех вариантов стробов. Итого 6 итераций. Это простая часть задачи. Вся фишка в логической обработке полученных с возвратов результатов. Там думать надо.

Logik
Offline
Зарегистрирован: 05.08.2014

nik182 пишет:
Слушал долго и внимательно. То, что ТС пытается реализовать называется параллельный ЦАП. Теории про работу такого ЦАП и схемы включения есть, например http://www.gaw.ru/html.cgi/txt/doc/dac/pardacs.htm . Можно выбрать разные схемы включения. Опять же как прочитать результат такого кодирования тоже достаточно резжёван. Для уверенного распознавания разрядность АЦП должно быть лучше, чем точность резисторов ЦАП. В общем случае для уверенного распознавания разрядность АЦП должна быть как минимум в два раза выше - для шести кнопок нужно 12 разрядное АЦП.

Добавлю, что это еще и при условии четкого согласования диапазона выходных напряжений этого "ЦАП" и АЦП. И при хорошей линейности "ЦАП" чего на простом делителе не получится.

Но отчасти проблема снимается тем что в схеме 2 "ЦАП" по 3 кнопки. Потому по теории - 6-и разрядное АЦП сойдет. А учетом предыдущего абзаца и помех - 10 разрядов может хватить, а может и нет.

Green
Offline
Зарегистрирован: 01.10.2015

vde69 пишет:
Схемы от Вас я не вижу, а без нее обсуждать особо нечего. Или мы говорим про...

ну и наверно так будет более наглядно, да и наверно более правильно


​Схема в скетче, но от перемены мест слагаемых сумма не изменяется.)
​Это набросок для демонстрации. Там многое ещё можно делать.

andriano
andriano аватар
Offline
Зарегистрирован: 20.06.2015

nik182 пишет:
В общем случае для уверенного распознавания разрядность АЦП должна быть как минимум в два раза выше - для шести кнопок нужно 12 разрядное АЦП.

Откуда такая зависимость?

Мне кажется, что должно быть:

N = M + K, где N - количество разрядов, M - количество кнопок, а K - некоторая константа (порядка 3)

Вы же предлагаете формулу:

N = C*M, где С=2.

nik182
Offline
Зарегистрирован: 04.05.2015

При идеальном ЦАП количество кнопок равно разрядности АЦП. Или по Вашему N=M С=1. Уменьшение числа кнопок зависит от неравномерности подбора резисторов ЦАП, но оно всегда линейно. С может быть 2,3,4 и т.д. Это если нет ограничений на число одновременно нажатых кнопок. Если ограничение есть, то Ваша формула ближе к результату. У ТС нет ограничений на число кнопок - герконов.

andriano
andriano аватар
Offline
Зарегистрирован: 20.06.2015

nik182 пишет:
С может быть 2,3,4 и т.д. Это если нет ограничений на число одновременно нажатых кнопок.

Хотелось бы услышать обоснование.

Цитата:
Если ограничение есть, то Ваша формула ближе к результату.

Моя формула как раз для случая произвольной комбинации кнопок. Т.е. в Вашей терминологии "нет ограничений".

nik182
Offline
Зарегистрирован: 04.05.2015

Нарисуйте график преобразования ЦАП при разных значениях погрешности резисторов. Это всегда будет облако точек вокруг прямой. Чем шире облако, тем больше разрядов АЦП нужно иметь у запасе , что бы однозначно разрешить код ЦАП. Плюс шум, минус статистика. При этом не важно на каком месте кода ЦАП находится точка. Задавать приходиться по самому большому отклонению от центральной линии. А так как разряды АЦП вещь конечная, то соответственно и появляются цифры 2,3,4. Это как бы коридор двух линий внутри которых должно находиться облако точек ЦАП.

andriano
andriano аватар
Offline
Зарегистрирован: 20.06.2015

nik182 пишет:
Нарисуйте график преобразования ЦАП при разных значениях погрешности резисторов. Это всегда будет облако точек вокруг прямой...

Собственно, можно не продолжать. Если у нас заданная точность резисторов (без подбора), то формула, очевидно, будет другой. Но все равно никак не N=C*M. Здесь эффект будет совершенно другим: скажем, если у нас точность резисторов 20%, то никакой возможности уверенно распознавать даже 4 кнопки у нас нет. Даже с 24-разрядным АЦП.

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

nik182
Offline
Зарегистрирован: 04.05.2015

Имено ломаной кривой, если соединить точки. если не содинять - облако, которое надо накрыть областью одназначного распознавания АЦП. N=C*M это предельный случай. Но мы живем в реальном мире. Дело даже не в 24 разрядном АЦП, а о весе разряда. То же  АЦП AVR можно использовать в 8 битном варианте. При этом вес каждого разряда расширяется и может оказаться, что расширенный вес накрывает область разброса функции ЦАП и соответственно С выродится в единицу. Поэтому важен подбор резисторов ЦАП, особенно старших разрядов.  

SLKH
Offline
Зарегистрирован: 17.08.2015

Rumata пишет:

 

План "Б" - 2 ардуины + JDY40 с каждой стороны. Навар от сдачи в утиль третьего провода остается

Одной JDY40 со стороны герконов не хватит? Навару ещё больше.

Pyotr
Offline
Зарегистрирован: 12.03.2014

А по двум проводам 6 герконов не пойдет? ) R1, R8-R10 на стороне ардуино. Номиналы резисторов навскидку поставил. R1, R10 ограничительные. Можно линию на КЗ проверять и на обрыв. Сам схему не собирал и код не писал, но проблем не вижу.

svm
Offline
Зарегистрирован: 06.11.2016

Pyotr пишет:

А по двум проводам 6 герконов не пойдет? ) R1, R8-R10 на стороне ардуино. Номиналы резисторов навскидку поставил. R1, R10 ограничительные. Можно линию на КЗ проверять и на обрыв. Сам схему не собирал и код не писал, но проблем не вижу.

Для 6 кнопок, самый оптимальный вариант.

vde69
Offline
Зарегистрирован: 10.01.2016

Pyotr пишет:

А по двум проводам 6 герконов не пойдет? ) R1, R8-R10 на стороне ардуино. Номиналы резисторов навскидку поставил. R1, R10 ограничительные. Можно линию на КЗ проверять и на обрыв. Сам схему не собирал и код не писал, но проблем не вижу.

 

почти идеально, осталось только компенсировать разное питание, но это легко.

как я сам не додумал :(

Pyotr
Offline
Зарегистрирован: 12.03.2014

vde69 пишет:

 

почти идеально, осталось только компенсировать разное питание, но это легко.

Поясните, что за "разное питание". 

Pyotr
Offline
Зарегистрирован: 12.03.2014

Еще. Чтоб легче было отслеживать КЗ в линии, нужно последовательно с S3 и  S6 поставить резисторы Ом так на 47. 

vde69
Offline
Зарегистрирован: 10.01.2016

Pyotr пишет:

vde69 пишет:

почти идеально, осталось только компенсировать разное питание, но это легко.

Поясните, что за "разное питание". 

проблема:

http://arduino.ru/forum/apparatnye-voprosy/6-gerkonov-po-3m-provodam#comment-605139

решение:

http://arduino.ru/forum/apparatnye-voprosy/6-gerkonov-po-3m-provodam#comment-605580

Pyotr
Offline
Зарегистрирован: 12.03.2014

Не знаю почему у Вас такая проблема. Может наводки виноваты. Я бы померил входное за 20 мс (20-50 значений) и посмотрел их значения. Стабильны или прыгают.

svm
Offline
Зарегистрирован: 06.11.2016

vde69 пишет:

почти идеально, осталось только компенсировать разное питание, но это легко.

как я сам не додумал :(

Чушь собачья. Вам нужно измерить соотношение сопротивлений резистивного делителя. Для этого измеряется падение напряжения на верхнем конце делителя и его выходе. Находите формулу, и с удивлением замечаете, что соотношение напряжений плеч делителя, не зависит от напряжения питания. При вычислении напряжение уничтожается. В последней схеме есть нюанс - диоды, падение напряжения на которых зависит от протекающего тока, но если грамотно подобрать номиналы резисторов, то этот фактор можно свести к минимуму. Если использовать вместо двух, три провода, то диоды можно исключить. Можете посмотреть здесь http://arduino.ru/forum/proekty/universalnyi-arduino-probnik?page=1#comment-349963 Но в принципе для измерения сопротивления достаточно двух проводов.

vde69
Offline
Зарегистрирован: 10.01.2016

на сколько я понимаю ардуино только в теории так должно работать, на практике увы и ах, я мерил.... 

разница измерений при питании от +5 и от usb  у меня достигала до 32 единиц на контакте по схеме из нулевого поста

ps

и кстати очень много чего пишут про ардуину и это не всегда правда, например про NANO пишут, что если его питать через собственную ногу +5вольт, но на контакте +3,3 питания не будет, а у меня все нормально, есть там 3.3 вольта :)

иногда полученный опытным путем результат не соответствует теоретическому :)

BOOM
BOOM аватар
Offline
Зарегистрирован: 14.11.2018

Где это такую ерунду про Nano пишут? Первый раз слышу...

svm
Offline
Зарегистрирован: 06.11.2016

vde69 пишет:

на сколько я понимаю ардуино только в теории так должно работать, на практике увы и ах, я мерил.... 

разница измерений при питании от +5 и от usb  у меня достигала до 32 единиц на контакте по схеме из нулевого поста

Просто Вы их готовить не умеете. Если измеряете  напряжение, то нужно или использовать внешний точный источник опорного напряжения или хотя-бы внутренний 1,1 В. Использование в качестве опорного напряжения питания в этом случае недопустимо. А для измерения сопротивлений не нужно абсолютных значений напряжения, нужно отношение их на резисторах делителя, а оно от напряжения источника питания не зависит.

vde69
Offline
Зарегистрирован: 10.01.2016

BOOM пишет:

Где это такую ерунду про Nano пишут? Первый раз слышу...

 

http://arduino.ru/Hardware/ArduinoBoardNano

Микросхема FTDI FT232RL получает питание, только если сама платформа запитана от USB. 
Таким образом при работе от внешнего источника (не USB), будет отсутствовать напряжение 3.3 В

 

Rumata
Rumata аватар
Offline
Зарегистрирован: 29.03.2019

vde69 пишет:

Судя по этой схеме, это не так. 

Pyotr
Offline
Зарегистрирован: 12.03.2014

vde69, покажите код с которым выдается различное значение АЦП с делителя при разном напряжении питания ардуино. Просто интересно.

svm
Offline
Зарегистрирован: 06.11.2016

Pyotr пишет:

vde69, покажите код с которым выдается различное значение АЦП с делителя при разном напряжении питания ардуино. Просто интересно.

Тогда и схему заодно. А то ТС может питать ардуино от одного источника питания, а делитель от другого. Пути господни неисповедимы.

svm
Offline
Зарегистрирован: 06.11.2016

Вот один из вариантов, работает на автономном контроллере плазмореза. Помех выше крыши, но сбоев клавиатуры не замечалось. Резисторы ставились из имеющихся, возможно не оптимальны.

Резисторы можно подобрать тщательнее, для увеличения защитных интервалов, но того-же порядка. С увеличением номинала, возрастает уровень наводок. Условия ТС - 3 провода выполняются. Вход ардуино защищен, в кабель подается земля. В экселевской таблице все видно, минимальная разница между комбинациями клавиш 0,2В. Есть проблема с замедлением работы программы. Ардуина слишком быстро отлавливает нажатие клавиш. Поэтому надо проверить хотя-бы 100 раз ( и то не факт), сколько клавиш нажато. А то возможна непредсказуемая реакция. Допустим клавиша "1" - "ОГОНЬ", а клавиши "1" + "2" + "3" - "ПОСТАВИТЬ ОРУЖИЕ НА ПРЕДОХРАНИТЕЛЬ". Что будет в результате, если руки с похмелья дрожат?