Изготовление электронной шахматной доски.

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

Я думал о том, как обнаруживать фигуры на доске, и я принял решение, что мне не нужно распознавать, какая фигура где: «Истина» находится внутри программного обеспечения, поэтому, если я перемещаю фигуру из A в B , программа может определить, какая часть была перемещена.

Итак, у меня возникла идея просверлить по два отверстия в каждом поле шахматной доски, одно в центре, и одно в правом верхнем углу:

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

Я хочу использовать Raspberry Pi в качестве аппаратной основы для запуска программного обеспечения, которое будет написано на Node.js (но это не должно быть важно для этого вопроса).

Итак, в итоге я получил 64 датчика яркости и 64 светодиода, к которым мне нужно обращаться индивидуально. Другими словами: мне нужно 64 выхода и 64 входа. И, конечно же, это то, с чем Raspberry Pi не справляется из коробки — и я думаю, что должен быть лучший способ, чем иметь 128 портов ввода-вывода.

Поскольку я считаю, что определение состояния платы является более важной задачей, я начал искать в Интернете, как обращаться с матрицей переключателей 8x8. Я нашел предложение использовать микроконтроллер, который последовательно сканирует столбцы доски и в каждом столбце определяет, используется ли строка (= поле) или нет.

Это уменьшило бы сложность до 8 выходов и 8 входов (чтобы иметь возможность считывать состояние платы).

По этому у меня есть несколько вопросов:

  1. Верны ли мои мысли, т.е. это правильный подход, или есть лучшая альтернатива, которую я должен остерегаться?
  2. Поскольку у меня нет опыта работы с микроконтроллерами, на что мне нужно обратить внимание? Мне просто нужен микроконтроллер с 16 контактами, программируемый на языке, который я умею писать, или…?
  3. Кто-нибудь построил такую ​​доску и может дать совет или знает учебник, который проведет вас через этот процесс?
У вас есть правильная идея. Тем не менее, потребуется немного доработать сенсорное приложение. В зависимости от размера и веса кусочков вы можете использовать схему обнаружения блокировки света или тактильную кнопку. Настоящий вопрос здесь заключается в том, как вы собираетесь сказать, какая часть что? Возможно, понадобятся и нестандартные детали. Может быть, поставить RFID-метку на каждый квадрат, а затем на каждом квадрате будет RFID-сканер? Перебор, но мысль.
Описываемая вами маршрутизация сканирования матрицы не справится с наличием 4 штук по 2 строки и 2 столбца. Посмотрите на 3-8-строчные декодеры (74138) и экстраполируйте на 5-64.
Первоначальный состав частей всегда одинаков, поэтому программа знает, где какая часть находится. Если вы затем переместите фигуру из A в B, программа узнает, какая фигура куда была перемещена. Конечно, это не позволяет начинать с произвольных составов, но вы также можете настроить это в программе вручную.
Это кажется... громоздким. Я бы выбрал метод программного видео. OpenCV и камера. И проектор.
@Golo Roden - Но компьютер не знает, какую часть вы двигаете. Если три фигуры могут оказаться в месте, куда вы перемещаетесь, как компьютер узнает, какая из них там?
Компьютер понимает не только поле, на которое вы переходите, но и поле, с которого вы перешли (потому что оно переключается с используемого на неиспользуемое).
@Passerby Тоже интересная мысль, спасибо за вклад :-)
и робот-манипулятор для перемещения части компьютера :-)
Рассмотрите возможность встраивания магнита в нижнюю часть каждой части и использования геркона под каждым квадратом. Очень легко подключить матрицу. Программное обеспечение должно будет издавать звуковой сигнал, если элемент не появляется обратно на доске в течение разумного времени, поскольку он может быть достаточно смещен от центра, чтобы не активировать датчик.
это руководство может быть полезным для организации датчика/обнаружения.
Рассмотрите возможность использования датчика освещенности i2c, подобного этому, от Avago , который используется в смартфонах. Вы можете подключить их все к одной шине и просто считывать их с Pi.
@GoloRoden ты построил доску? мы можем увидеть окончательный результат, пожалуйста? Спасибо

Ответы (5)

Поскольку изображение стоит тысячи слов, вот пример LDM-24488NI : матрица с 64 светодиодами

введите описание изображения здесь

Для вашего приложения вам понадобится одна такая матрица для светодиодов и еще одна для датчиков, требующих в общей сложности 32 контактов ввода-вывода. Поскольку у вашего RPi не так много, вам придется использовать демультиплексор от 1 до 8 для выбора отдельных строк и столбцов:

введите описание изображения здесь

Для светодиодов вы можете использовать демультиплексоры как для строк, так и для столбцов, поскольку вам нужен только один светодиод за раз. Для датчиков я бы рекомендовал использовать демультиплексор для строк и отдельные строки для столбцов, чтобы иметь возможность обнаруживать несколько активных датчиков в одной строке. Это доведет необходимое количество контактов до 17 контактов, с которыми может справиться RPi.

Да, мультиплексирование, как вы описываете, является распространенным способом адресации массивов вещей.

Самая сложная часть будет связана с аналоговой природой датчиков света. CdS LDR (светозависимые резисторы), вероятно, являются лучшими в этом случае, потому что они чувствительны, дешевы и дают большой, легко измеримый отклик в диапазоне человеческого веса. Электрически они представляют собой резисторы, сопротивление которых уменьшается при более ярком свете.

Это упростит мультиплексирование, если вы используете микро с 8 аналоговыми входами. Это означает, что половина вашего мультиплексора встроена в микро. Вы включаете строку LDR и, например, считываете сигналы 8 столбцов непосредственно с микро.

Последовательное сканирование 64 аналоговых входов может быть легко выполнено мгновенно с помощью обычных микроконтроллеров. Допустим, вы можете снимать новые показания каждые 100 мкс. Это «долго», даже для маленьких и дешевых микропроцессоров. Это означает, что вся плата будет сканироваться каждые 6,4 мс, что намного быстрее, чем вы можете заметить задержку.

Мультиплексировать светодиоды еще проще, поскольку все это делается с помощью цифровых выходов. Многие микроконтроллеры имеют более 16 цифровых выходов, так что это не проблема. Есть и другие вещи, которые должны произойти, и вы будете использовать контакты быстрее, чем вы можете ожидать сейчас, но 64-контактный микроконтроллер действительно должен быть достаточно хорошим, если не 44-контактный.

Я бы, вероятно, выделил один микроконтроллер только для обработки ввода-вывода платы. Это оптимизировано для наличия достаточного количества контактов ввода/вывода, аналогово-цифровых входов и т.п. Затем он взаимодействует с основным вычислительным механизмом через UART. Протокол будет иметь вид «зажечь квадрат 3,2» или «из квадрата 5,4 убрана фишка». Это также позволяет в будущем использовать совершенно другой аппаратный интерфейс, если вы сохраняете тот же протокол.

Для светодиодов очевидный способ сделать это - иметь выход для каждой строки и каждого столбца шахматной доски: всего 8 + 8 = 16 контактов. Аноды будут соединены с проводами рядов, а катоды — с проводами столбцов. Для светодиода, который вы хотите зажечь, вы должны сделать его анодный провод положительным (логическая 1), а его катодный провод отрицательным (логический 0), в то время как остальные остаются в обратном состоянии (поэтому оставшиеся светодиоды имеют нейтральное или обратное смещение).

Здесь я делаю предположение, что микроконтроллер выдает достаточно высокое/низкое напряжение, чтобы вы могли соединить светодиод от одного к другому. Если это не так, вам понадобится транзистор или буфер для каждой линии. С питанием 5 В это жестко, учитывая, что светодиод падает примерно на 2 В, и вам нужно разумное падение напряжения на токоограничивающем резисторе (обратите внимание, что вам нужно установить их только в строках строк или линиях столбцов, а не в обоих).

Если ваши выходы имеют три состояния (то есть, в дополнение к логическому 0 и логической 1, они могут быть установлены в состояние с высоким импедансом, возможно, временно настроив их как входы), тогда вы можете проявить смекалку и использовать сетку 4x8 со светодиодами. соединены антипараллельными парами. В этой настройке важно установить для неиспользуемых выходов высокое сопротивление, иначе загорятся ненужные светодиоды.

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


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

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

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

Другим решением было бы купить четыре микросхемы декодера 4-к-16 с выходами с открытым коллектором (или с открытым стоком, если используются микросхемы MOSFET), например: http://www.unicornelectronics.com/ftp/Data%20Sheets/74159.pdf . Открытый коллектор означает, что выходы микросхемы будут потреблять только ток, а не отдавать его. Таким образом, вы можете подключить 16 датчиков к 16 выходам микросхемы, а остальные концы соединить вместе с подтягивающим резистором (туда же можно подключить и ваш АЦП). Вы устанавливаете один выход в низкий уровень (проводящий), а остальные 15 остаются высокими (непроводящими). ​​Это отличается от стандартного логического выхода, где остальные 15 выходов будут пропускать ток в общую точку.

Вход для этих ИС представляет собой 4-битный двоичный код для выбора одного из 16 выходов, но у них также есть дополнительный вход для включения/выключения микросхемы. Таким образом, вы потенциально можете иметь массив из 64 приемников с открытым коллектором, подключенных к 64 датчикам, с другими концами датчиков, объединенными с одним подтягивающим резистором и аналого-цифровым преобразователем. Для этого вам потребуется в общей сложности 8 выходов на вашем микроконтроллере: четыре для приема сигналов выбора от 4 до 16 (общие для всех четырех микросхем) и четыре для приема сигналов включения (по одному для каждой микросхемы).

РЕДАКТИРОВАТЬ: от 3 до 8 декодеров (также называемых 1 из 8 = 1 линия из 8) кажутся более доступными, чем от 4 до 16, но 8 IC намного более беспорядочны, чем 4. Другой тип IC, который может быть полезен, - это восьмеричный счетчик (и его более распространенный двоюродный брат десятичный счетчик , который можно настроить как восьмеричный счетчик, подключив его девятый выход к линии сброса). Для перехода от одного выхода к другому требуется последовательный импульс, поэтому потребуется меньше Контакты ввода-вывода на микроконтроллере, а не на микросхеме декодера. Обычно они имеют дополнительные входы для сброса и включения. Существуют также ИС, называемые сдвиговыми регистрами , которые доступны в двух типах: один для преобразования последовательного в параллельный, другой для преобразования параллельного в последовательный. Наконец, естьбуферы , которые вы можете поместить между Rasberry Pi и шахматной доской, чтобы Pi не разрушился в случае перегрузки по току. Все это может быть полезно в схемах мультиплексирования.

Вы упомянули регистры сдвига — их можно было бы использовать и для светодиодных выходов. Другой счетчик плюс 8-битный регистр сдвига, который может работать с тремя состояниями, может управлять всем массивом с помощью чуть более двух или трех выводов, если они достаточно быстры, чтобы избежать видимого мерцания.
@hobbs Я не думаю, что мерцание является проблемой, поскольку OP хочет зажечь только один или два светодиода одновременно. Даже три состояния на самом деле не нужны, если у вас есть только один прямой и один инвертирующий десятичный/восьмеричный счетчик/сдвиговый регистр для управления светодиодами. 3 контакта вполне достижимы: общий сброс, продвижение по столбцу, продвижение по строке. Это может быть выходом - приберегите все остальные контакты для более сложной проблемы с датчиками.
Для светодиодов также можно использовать драйвер светодиодов MAX7219/7221. Это уменьшит количество входов до 3 — часы, данные, защелка.

Мультиплексирование действительно является распространенной практикой.

Есть несколько способов получить больше от пинов Raspberry Pi.

Один из них — использовать чип, чтобы сделать за вас часть тяжелой работы. Например, если у вас есть 8 входов и 8 выходов для считывания состояния платы, вы можете использовать счетчик, чтобы повышать 8 входов по одному за раз. Для этого вам понадобятся 2 вывода на Arduino — один для возврата к первому выводу и один для «перехода к следующему ряду». Вы только что сохранили 6 контактов!

Сохранения 6 контактов может быть недостаточно — давайте посмотрим, куда мы можем двигаться дальше: если вы перестроите свою сетку 8x8 в сетку 16x4, вы можете использовать что-то вроде http://www.instructables.com/id/16-Stage . -Decade-Counter-Chain-Using-two-4017-Chi/?ALLSTEPS (не обращайте внимания на верхнюю половину, две линии, идущие сверху вниз, — это ваш «сброс», идущие сверху слева, и « перейти к следующей строке", которая называется CLK, здесь часы). Теперь вы можете сосчитать 8 на левой половине доски, а затем 8 на правой половине доски; соедините столбцы A и E, B и F, C и G, D и H вместе.

Поздравляем, теперь у вас есть два выходных контакта (сброс и часы) и 4 входных контакта, всего 6 — это экономит 10 контактов! Обратите внимание, что у Raspberry Pi нет аналого-цифровых преобразователей, поэтому для этого вам потребуется дополнительная работа.

Теперь о светодиодах. У вас уже есть управляемый источник питания (двухдекадные счетчики) — давайте использовать их повторно. Поместите 64 светодиода с 16 контактов питания через резистор (у каждого светодиода ДОЛЖЕН быть свой собственный резистор!), на 4 другие шины (такая же схема, как указано выше: AE, BF, CG и DH). Соедините эти 4 шины через 4 транзистора с 4 контактами и поставьте все контакты на «высокий уровень» — так как обе стороны светодиода теперь на 5 вольт, светодиоды будут выключены. Затем, когда вы хотите зажечь светодиод, убедитесь, что ваши две декады находятся в правильном положении (как если бы вы считывали датчик на этом квадрате), установите одну из 4 направляющих на низкий уровень. Теперь ток должен течь от «высокого» счетчика декады к «низкому» на этой конкретной шине. Эй престо, свет загорается! Дайте небольшую задержку, затем выключите его, прежде чем снова изменить счетчик декады.

Если вам нужно больше контроля, вы можете использовать что-то вроде чипа TLC5940 — http://playground.arduino.cc/Learning/TLC5940 — каждый чип может установить 16 светодиодов (так что вам нужно 4 из них) на уровень яркости. от 0 (выкл.) до 1024 (полностью вкл.), поэтому вы можете плавно включать и выключать отдельные светодиоды с большим контролем. По памяти для этого требуется около 4 контактов, и они могут быть соединены последовательно, поэтому 4 цифровых контакта (один из которых должен быть PWM - они имеют символ «~» рядом с контактом) будут управлять любым количеством светодиодов.

Удачи!

Это RPi, а не Ардуино.
Мои извинения, вы правы. Почти все, что я сказал, по-прежнему применимо, поэтому я внес небольшие изменения, чтобы все заработало.

Я не думаю, что вам понадобится светодиод в правом верхнем углу. Датчика посередине, как вы упомянули, было бы достаточно. Сложной частью будет код для шахматной доски. Представьте, что у вас есть шахматная доска. Строка будет обозначена как «алфавит», а столбец — как «число».

Итак, сначала вам нужна программа для программирования типа фигуры в начальной позиции. Позже, когда вы переместите свои части, код сгенерирует начальное местоположение части до конечного местоположения. Это уменьшит ваш вклад вдвое.

Может быть, я не так объяснил… светодиоды не предназначены для чтения текущего состояния, они предназначены для того, чтобы показывать, какой ход компьютер хочет сделать. Итак, пользователь делает ход: датчики яркости сообщают программе, что они сделали. Программное обеспечение рассчитывает свой следующий ход и мигает двумя светодиодами, пользователь перемещает фигуру, а затем снова наступает очередь человека.