0
блин, я ж просто коммент написал. Теперь точно придется участвовать=))

А делать можно все что угодно?
avatar

danil_borchevkin

  • 29 февраля 2016, 14:16
+1
ууууууу=))

Есть возможность поучаствовать=))
avatar

danil_borchevkin

  • 29 февраля 2016, 11:58
0
блин, да даже мои любимые MSp430 дешевле, чем ATMEGA 2560=))
avatar

danil_borchevkin

  • 24 февраля 2016, 19:44
0
Просмотрел. Вам уже предложили все хорошие варианты, в том числе (о чем я не догадался) — DS2411.

ИМХО, вы исходите не из совсем верных посылов — вы берете стоимость в розницу и в России и абсолютно не считаете ни тулинг-косты, ни затраты на разработку/проектирование, ни время, которое будет на это потрачено. Вы слишком рано думаете об оптимизации стоимости, не имея на руках готового прототипа и заранее отметая любые варианты, которые вам предлагают.

Что вам мешает сделать поле 3 х 3 и протестировать свою идею?! Сделать на резистивных делителях, на герконах, на рфидах, на Ibutton, на DS2411, практика и эксперимент покажет, что лучше и что выживет в результате экспериментов. Здесь можно будет уложится в 10-15 тысяч рублей. Затем отдаем это разным ребенкам и смотрим — жива ли вообще идея.

Не совсем также понятна ориентация на ATMEGA 2650 — она стоит от 14 евро за штуку, в то время как STM32 — в два раза меньше (SMT32F4 — Cortex M4), EFM32 — в 3 раза меньше (Wonder Gecko — Cortex M4), а EFM32 — еще и лидер по энергопотреблению, что в разы увеличит автономность вашей игрушки по сравнению с ATMEGA (имеется в виду расход на вычислительную часть).
avatar

danil_borchevkin

  • 24 февраля 2016, 19:30
0
могу сразу обозначить круг проблем, с которым вы столкнетесь:
— мультиплексирование нужно осуществлять такими средствами, чтобы ток утечки был минимален, а неактивные антенны отключались
— нужно рассчитывать линии на печатной плате в 50 Ом — получится неплохой челлендж
— нужно изолировать каналы друг от друга
— мультиплексор должен вносить минимальные искажения
— все это приведет к кастомной печатной плате и дорогим микросхемам — pl.mouser.com/ProductDetail/Analog-Devices/ADG904BRUZ/?qs=BpaRKvA4VqEOqmnl0ENwhg%3D%3D — 4 евро за штуку (4 к 1), что уже дороже
avatar

danil_borchevkin

  • 24 февраля 2016, 17:33
0
хотя гугл прям на первой странице по запросу «rfid antenna mux» выдает множество решений, но все они дороже, нежели использование отдельных ридеров
https://developer.mbed.org/forum/electronics/topic/4080/

https://e2e.ti.com/support/wireless_connectivity/nfc_rfid/f/667/t/269476

http://www.ti.com/lit/an/sloa167/sloa167.pdf — аппнот как это сделать и рассчитать
http://www.youtube.com/watch?v=16VFU9n8VO4 — видео к предыдущему аппноуту

http://forum.arduino.cc/index.php?topic=244408.0

http://www.electronicspoint.com/threads/switching-between-rfid-antennas-one-reader-100-antennas-how.75634/

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

danil_borchevkin

  • 24 февраля 2016, 17:29
0
кроме того, говоря о РФИД, вы забываете о стоимости меток- от 10 руб за 1 шт самого низкого качества на бумажной основе
avatar

danil_borchevkin

  • 24 февраля 2016, 17:21
0
Контактный метод, как раз таки будет самым надежным и дешевым. У вас фигурки различные, Насколько я понял и нужно дектить ее тип.

посмотрите в сторону iButton=)) (таблетки от домофона)

avatar

danil_borchevkin

  • 24 февраля 2016, 17:19
0
Такого опыта не было, точно ответить на вопрос не смогу.

А из чего фигурки?

Скорость переключения — это не главная проблема в данном вопросе.

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

Попробуйте, и по возможности, отпишитесь
avatar

danil_borchevkin

  • 24 февраля 2016, 16:21
0
у вас код нечитаемый — пожалуйста, на будущее — постите, используя форматирование.

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

Я вас, на всякий случай, еще раз попрошу прочитать любую книжку по Си или С++ — тогда у вас не будет появляться таких вопросов. Опять же, посоветую книги господина Праты.

allow() — не команда, а функция.

else пишется с маленькой буквы.

if (i == 5 || but==1 )


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

Функция allow() вызывается только в том случае, если все пять байт UID, считанных с карты, совпадают с пятью байтами мастер-карты(i как раз подсчитывает количество совпавших считанных байт с хранящимися в массиве с UID карты). То есть, если нет карты у ридера, либо считанный номер не совпадает — allow() вызываться не будет. Если вы хотите вызывать ее еще из какого-то места — вам ничего не мешает.

У вас уже есть флаг, который хранит состояние двери — зачем вам хранить состояние кнопки?!

в loop() после rfid.halt() вставляете код, который проверяет состояние кнопки и, если она нажата, переключает состояние замка

if (digitalRead(BUTTON))
{
   allow();
}
delay(500);


Теперь функция allow() будет вызываться если поднесена либо карта, либо нажата кнопка. Соответственно, по факту флаг хранит текущее состояние двери (можно его переименовать в более осмысленный). Если дверь была закрыта — она откроется, если открыта — закроется. delay для того, чтобы создать безопасный интервал нажатия.

Код после всех этих инсинуаций уже стал значительно запутанным и требует рефакторинга.

avatar

danil_borchevkin

  • 28 ноября 2015, 21:56
0
if (!flag)
условие правильное. К сожалению, здесь нельзя редактировать коментарии
avatar

danil_borchevkin

  • 19 ноября 2015, 21:58
0
версия более яснее и короче — используем свойства условия в if:


void allow()
{
  Serial.println(«Access accept!»);

  if (flag) // New cycle!
  {
    digitalWrite(RELAY, HIGH); // Turn on the electromagnet
    flag = 1;                  // Set the flag
  }
  else
  {
    digitalWrite(RELAY, LOW); // Switch off the electromagnet
    flag = 0;                 // Clear the flag
  }
  indication(GREEN_LED);
  tone(5, 1109, 300); // Play the melody input
  delay(300);
  tone(5, 554, 300);
}

avatar

danil_borchevkin

  • 19 ноября 2015, 21:51
0
Приветствую!

У вас в коде закралась определенная неясность=))


 if (flag == 0) // New cycle!
  {
    digitalWrite(RELAY, HIGH); // Turn on the electromagnet
    flag == 1;                          // Flip the flag
  }
  if (flag == 1)
  {
    digitalWrite(RELAY, LOW); // Switch off the electromagnet
    flag == 0;                         // Flip the flag
  }


Логика работы кода представлена следующая:
1. Если флаг равен нулю, то отключаем замок
2. Если флаг не равен нулю, то включаем замок.

Но в теле if у вас не происходит изменения значения флага. Т.е. флаг у вас всегда равен нулю

в if все как бы верно, но вот в теле if — у вас не присваивание (flag = 0), а сравнение (flag == 0), которое возвращаяет 0 или 1 в зависимости от условия и ничему не присваивается. Т.е. если запустить отладку и отслеживание переменной, представленный код не меняет значение флага. (кстати для флага int все таки многовато, когда есть char или _Bool, если компилятор С99-совместимый).

Совет — тело второго if делаем телом else первого.

Итого, рабочий код для функции allow():

void allow()
{
  Serial.println(«Access accept!»);

  if (flag == 0) // New cycle!
  {
    digitalWrite(RELAY, HIGH); // Turn on the electromagnet
    flag = 1;                  // Set the flag
  }
  else
  {
    digitalWrite(RELAY, LOW); // Switch off the electromagnet
    flag = 0;                 // Clear the flag
  }
  indication(GREEN_LED);
  tone(5, 1109, 300); // Play the melody input
  delay(300);
  tone(5, 554, 300);
}


P.S. Для того, чтобы лучше узнать С и С++ советую книги Стивена Прата (есть по обеим языкам). Доступно и хорошо написано с сотней примеров и упражений, живой язык
avatar

danil_borchevkin

  • 19 ноября 2015, 21:47
0
Спасибо за решение!
avatar

danil_borchevkin

  • 13 ноября 2015, 15:57
0
добавил в пост
avatar

danil_borchevkin

  • 13 ноября 2015, 15:52
+1
Правильно ли я понимаю, что вам нужно удаленно управлять RPi через 3G модем — т.е. у вас где то установлена RPi, и вы удаленно пытаетесь подключиться по IP-адресу через веб-интерфейс, SSH и т.д?

Если мои предположения верны — то это не сработает — сотовые операторы выдают т.н. «серый» IP — свой локальный, и для выхода в интернет у них общий гейт — т.о. вы пытаетесь подключиться на гейт, а не на RPi. Решение в таком случае:
1. Купить «белый» IP — статический IP — такая услуга есть у каждого оператора.
2. Если нужно SSH — то поднимать ReverseSSH
3. Воспользоваться DNS (например, https://www.noip.com/remote-access), чтобы имея динамический IP, иметь статический IP с форвардингом до динамического.
4. Может быть есть еще варианты, но самые популярные — выше.
avatar

danil_borchevkin

  • 5 октября 2015, 11:27
0
не работал c webiopi, поэтому ничего подсказать не могу
avatar

danil_borchevkin

  • 5 октября 2015, 10:11
0
Нет, не поможет. Физический и канальный уровни отличаются для Mifare (для которого и предназначен данный считыватель) и для EM4100 (самый популярный стандарт на 125 кГц).

Для ознакомления с технологиями RFID можно почитать эту статью или же обратиться к википедии, а вот в этой статье описано как на ATTiny13 собрать свой считыватель на 125 кГц
avatar

danil_borchevkin

  • 21 июня 2015, 21:44