Я пытаюсь создать MIDI-подобный контроллер, у которого шея похожа на гитару. На этой шее огромная матрица датчиков давления. Контроллер будет эмулировать 3 строки.
Это работает так: есть 3 длинных полоски двухсторонней медной ленты (0,5 см в ширину, длина шейки), которые подключены к источнику питания (3,3 В или 5 В, вероятно, пока не имеет значения). На этих полосах находится слой Велостата, который изменяет удельное сопротивление в зависимости от давления. Поверх велостата будет еще один слой рядов или ячеек медной ленты, соединенный с чем-то, что выплевывает показание напряжения через слой велостата. Поскольку шея длиной около 40 см, будет не менее 80 рядов.
Если представить три нижние полосы медной ленты в виде столбцов диаграммы вдоль шеи, датчики будут либо ячейками, либо рядами, в зависимости от метода измерения (я подумал, что можно будет также объединить столбцы, а затем могут быть строки.) Есть несколько особых условий, которые могут сделать это проще: поскольку это контроллер, похожий на гитару, не каждое измерение необходимо измерять! Имеет значение только касание, наиболее близкое к корпусу контроллера. Также разрешение 8 бит должно быть достаточно точным. 255 уровней давления, вероятно, больше, чем нужно в любом случае.
Теперь сложные биты:
Измерение должно проводиться в реальном времени и достаточно для обнаружения ударов и т. Д. (Понятия не имею, насколько высокой должна быть частота дискретизации - оценивается в несколько кГц для обеспечения хорошего измерения и воспроизводимости), и цифровой выход контроллера должен быть либо MIDI (по 3 отдельным каналам - по одному на строку) или цифровой сигнал, который можно обработать с помощью Raspberry Pi.
Теперь, когда мои знания действительно ограничены, я не мог придумать правильные инструменты для работы. Но я знаю, что это возможно. Есть похожий, но другой контроллер, который использует очень похожую технику (которую я практически перепроектировал, пока не заметил, что у них есть патент, и информация о том, как они это делают, не такая таинственная, как я думал), это называется ROLI Побережья.
TL; DR:
примерно 240 датчиков
может быть разделен на группы по 80 человек, которые питаются от одной линии
это приложение в реальном времени, мне нужно получать давление от каждого датчика, когда он касается (некоторые условия применяются, см. выше)
Спасибо заранее, я знаю, что это много читать. Я благодарен за любое предложение и был бы очень рад, если бы вы могли помочь мне справиться с ужасным беспорядком, который я намеревался создать!
Вещи, о которых я думал до сих пор:
Мультиплексирование строк и столбцов, чтение каждой ячейки с помощью АЦП MCP3008 или большего размера и цепочка (гирляндная цепочка или древовидная структура) ATmegas, которые только подталкивают самое низкое взаимодействие по положению к окончательному сигналу, но из моих расчетов, которые могут быть ограничены накладные расходы на связь. Также более ранняя модель включала ленточные потенциометры, от которых я отказался, потому что дизайн был плохим (несколько попыток, было недостаточно круто).
EDIT / UPDATE:
Спасибо за хорошие предложения до сих пор! Благодаря им я теперь могу сформулировать свою проблему гораздо яснее:
У меня матрица из 80 рядов * 3 колонки датчиков давления. Когда человек взаимодействует с сенсорной матрицей, несколько датчиков, находящихся поблизости, улавливают касание, но только вдоль колонки. Колонны механически разделены. Датчики имеют сопротивление от 100 Ом до 1 кОм. Все эти датчики должны считываться с глубиной 8 бит, обрабатываться и результаты должны передаваться с частотой не менее 1 кГц. Таким образом, одно чтение / обработка должно занять менее миллисекунды. Окончательный результат для каждого столбца должен быть: 4 байта для float32 и 1 байт для uint8. Float32 укажет усредненную позицию первого взаимодействия вдоль столбца. Взаимодействие определяется как последовательная группа датчиков с давлением выше определенного порога. Вот где обработка попадает в смесь: столбец будет перемещаться вниз, пока показание не превысит порог. Это будет считаться началом взаимодействия. Давление и положение каждого датчика запоминаются вплоть до первого датчика, который падает ниже порогового значения с максимумом (вероятно) 4 последовательных датчиков. Из всех датчиков записанного взаимодействия будут обрабатываться только два датчика - тот, который считывает самое высокое давление (самое низкое сопротивление) и самый высокий - непосредственно над или под ним. Положение с плавающей запятой рассчитывается путем усреднения двух положений датчиков, взвешенных по их давлениям. Общее давление взаимодействия будет просто сложением обоих давлений, зажатых между 0 и 255 (добавьте оба давления единицы 8 в uint16 и разделите на 2 без округления, отбросьте ненужные биты - это должно быть быстро). Это должно происходить для каждого столбца. Результат размером 15 байт будет затем отправлен через SPI на небольшой компьютер (Raspberry Pi B3), который выступает в качестве синтезатора. Я не настроен на способ передачи. Если SPI не является подходящим инструментом для работы, я готов использовать любой способ общения, с которым может справиться Raspberry Pi. Поскольку это музыкально-интерактивное приложение, задержка имеет решающее значение.
Мои точные вопросы: это можно решить с помощью одного микроконтроллера, не ломая банк? Я не могу позволить себе купить микросхемы на несколько сотен долларов для хобби-проекта. Какое оборудование вы бы порекомендовали? Есть ли неочевидные предостережения, от которых мне нужно быть осторожными?
Подход, который я получил из ответов до сих пор, заключался в том, чтобы питать каждый столбец по отдельности, а затем считывать строки с помощью 5 16-канальных АЦП (ADS7961), подключенных к Arduino через SPI. Я обеспокоен тем, что это может быть не самый простой / дешевый подход или недостаточно быстрый, чтобы достичь частоты> 1 кГц.
Отказ от ответственности: я обычно теоретический химик и ужасный любитель, когда дело доходит до электротехники, все, что я знаю, самоучка и без какого-либо профессионального опыта (что, в свою очередь, является причиной того, что я обращаюсь за помощью к более знающим людям). Хотя я знаю, как обходиться с программным обеспечением. Все, что касается программного обеспечения, я разберусь с достаточным количеством времени. Кроме того, я немец, поэтому, пожалуйста, извините случайные грамматические недостатки.
Ответы:
В зависимости от ценового диапазона, вы можете рассмотреть возможность использования FPGA между Raspberry Pi и АЦП, такими как плата DE0-Nano , которая имеет хорошую поддержку в качестве вводной платы разработки FPGA. Это решение имеет то преимущество, что позволяет вам писать код, который будет синхронизировать несколько / много АЦП одновременно и форматировать ваши данные таким образом, чтобы они были презентабельными для Raspberry Pi.
Вы упомянули, что рассматриваете MCP3008. Этот чип является SPI, поэтому вы можете соединить несколько устройств на одной шине с разными контактами CS. Предположим, вы подключили три шины к шине, что дает вам 24 канала АЦП на 6 контактов (три линии данных и три линии CS). Это означает 240 каналов на 60 выводов, что легко соответствует возможностям FPGA.
Если вы используете тактовую линию MCP3008 с максимальной частотой 2 МГц, потребуется (15 тактов / канал) * (8 каналов / чип) * (3 чипа / шина) * (1/2000000 секунд / такт) = 0,18 мс до прочитать все 240 датчиков, соответствующие частоте выборки 5,56 кГц.
источник
Очевидный ответ - мультиплексирование, это означает, что вы прокладываете электрический путь динамически. Так что просто перебирайте всю матрицу, по одному за раз, или столько входов АЦП (аналого-цифрового преобразователя), сколько у вас есть.
Если у вас есть 3 АЦП, вы можете читать по одной строке за раз, затем вы меняете входы на мультиплексор и голос, теперь вы читаете второй ряд, а затем продолжаете. Проблема с этой настройкой состоит в том, что у вас есть 80 строк, и я не знаю, какой мультиплекс 80: 1 (восемьдесят входов на один вход). Но есть мультиплексоры 16: 1, которые вы можете собрать, чтобы получить 16 * 5 = 80 входов.
Это будет выглядеть примерно так:
4 входных сигнала к мультиплексорам 16: 1 могут быть соединены вместе.
Итак, в конце у вас есть байт с управляющими сигналами в этом паттерне:
Это означает, что вам понадобится 5 × 16: 1 мультиплексоров и один 8: 1 мультиплексор = 6 микросхем,
Умножьте это на 3, потому что вы можете читать по одной строке за раз.
Это означает, что у вас будет 18 микросхем, 7 контрольных сигналов. Вы можете уменьшить количество микросхем, если увеличите количество аналоговых входов. Это 18 с 3 аналоговыми входами.
Если вместо этого вы использовали 240/16 = 15 микросхем, то вы получили 15 аналоговых выходов от мультиплексоров 15 × 16: 1. Затем вы можете каскадировать его с помощью 16: 1 или 16: 8. В конце концов, было бы 16 микросхем, если бы вы «оптимизировали» их с помощью мультиплексоров 16: 1. Но это будет означать, что ваше программное решение не будет таким ... изящным, как указано выше, оно будет перекрещенным, модульным и прочим, но эй, вы сэкономите 2 микросхемы.
Это возможно, но это не очень хороший дизайн.
Давайте решим это по-другому ... больше места и денег эффективным способом.
* 20 минут спустя * Хммм ... все решения, которые я придумал, либо слишком сложны в настройке, и / или требуют некоторой расширенной калибровки ...
Ну что ж, тогда я предполагаю, что ваш дизайн подходит для вашей задачи под рукой.
Удачи.
ОП хочет измерить положение и давление. Это два параметра. Это означает, что нам нужно упаковать эту информацию в сигнал напряжения, чтобы мы могли ее прочитать и расшифровать. Или нам нужно упаковать его в какой-то другой блок, например, в ОМ, индуктивность, емкость.
Вот некоторые из моих идей, где я думаю только об одном столбце. Просто умножьте идею на 3, и вы получите полное решение для гитары с 3 колонками.
Первая идея:
Используйте два параллельных провода (с низким сопротивлением), идущих от нижней части гитары к шее гитары. Подключите заземление к одному из проводов в нижней части гитары. Создайте систему измерения LR и измерьте индуктивность и сопротивление другого провода, также внизу.
Когда вы дотрагиваетесь до обоих проводов пальцем, вы соедините два провода, и здесь будет некоторая индуктивность. Чем дальше вы дотрагиваетесь до гитары, тем дольше будет цепь и тем больше индуктивности вы будете измерять. Чем сильнее вы нажимаете, тем больше площадь поверхности между двумя проводами и тем меньше его сопротивление.
Это не должно быть два «провода», это могут быть две токопроводящие ленты или что-то еще.
Почему я не поделился этим раньше: чтобы это было надежным, вам нужно откалибровать датчики для каждого человека, потому что у каждого разное сопротивление на его коже. Всякий раз, когда вы играете, вы потеете и, следовательно, уменьшаете сопротивление дальше, поэтому вам придется компенсировать это. Все сильно потеют по-разному, так что это также нужно будет откалибровать на человека.
Так что индуктивность => позиционная от пальца. Сопротивление => как сильно вы нажимали.
Отклонение значений, которые вы будете измерять, будет в nano Ω и nano H, это означает, что вам потребуются некоторые надлежащие знания относительно CMRR и SNR. В противном случае все, что вы увидите, будет сетевым напряжением, при условии, что это будет сделано в помещении. Или некоторые другие частоты от Wi-Fi или ламп или других источников шума. Так что, возможно, понадобится правильный цифровой фильтр. И ... это, вероятно, уже выходит за рамки возможностей ОП и приемлемых умственных усилий. Так что эта идея выброшена.
Вторая идея:
Сделайте плоскую проводящую поверхность на гитаре, которая связана с землей.
Используйте один провод, или проводящую ленту, или просто плоский проводник. Нанесите поверх него непроводящую краску или обычную непроводящую ленту.
Пристегните это через гитару от основания до шеи гитары. Подключите провод в нижней части гитары к высоким частотам в диапазоне сотен МГц. Теперь вы начнете получать заметные отражения. Потому что технически у вас есть плохая линия электропередачи, где только одна сторона защищена.
Таким образом, вы отправите какой-нибудь короткий прямоугольный импульс и измерите, сколько времени потребуется для его возвращения из-за отражения от того, что ваш палец находится на вершине изолированного провода. А затем вы измеряете амплитуду отраженного пика в нижней части гитары. Так что время прохождения => положение пальца. Амплитуда отражения => как сильно вы нажимали.
Это не самая простая вещь для настройки ... если вы не знаете, что делаете. Итак, еще раз, это может быть слишком много усилий для OP, чтобы заняться. Так что эта идея выброшена.
Это будет выглядеть примерно так:
Я принял характеристическое сопротивление 150 Ом, другими словами, очень плохую линию передачи. На самом деле это может быть хуже, я не знаю, я никогда не делал этого.
Вот ссылка на случай, если кто-то захочет возиться.
Одной из самых сложных задач будет сопоставление конечных точек с некоторым сопротивлением, для этого вам может понадобиться осциллограф или какой-либо другой дорогой инструмент.
Другая сложная часть будет состоять в том, чтобы фактически измерить TOF (время полета), есть некоторые микросхемы, но они недешевы ... но вы всегда можете просто сделать источник постоянного тока и заполнить небольшой конденсатор, а затем просто читать напряжение
Идея заключается в том, что когда палец приближается к проводу, он становится частью цепи и действует как конденсатор. Чем ближе ваш палец, тем больше емкость. Вот почему сопротивление в точке пальца уменьшится.
https://en.wikipedia.org/wiki/Transmission_line прокрутите немного вниз, и вы увидите, что емкостный параметр является частью знаменателя.
Всякий раз, когда точка на проводе будет не соответствовать, тогда будет отражение, и вы можете прочитать это на «выходе», откуда исходит ваш сигнал. Если нигде нет отражения, ваш сигнал будет прерван в любой из конечных точек.
Чем сильнее вы нажимаете, тем больше площадь вашего пальца становится плоской => больше емкость из-за площади. Кроме того, любой непроводящий материал, который вы получили между проводом и пальцем, будет слегка сжиматься, чтобы еще больше увеличить емкость.
Третья идея:
Вставьте термен в гитаре и измерьте частоту и амплитуду. Я не знаю точно, что выдаст термен, но наверняка что-то можно использовать.
На данный момент у меня заканчиваются идеи и я говорю, что потратил 20 минут. Когда на самом деле я, возможно, провел 10. Хорошо. Теперь я наверняка потратил еще 10 минут, чтобы написать это, так что все складывается.
источник
Три идеи:
1. Сделайте мультиплексирование на стороне предложения
По сути, схема, которую вы описали, представляет собой большое количество переменных сопротивлений, каждое из которых имеет один конец, общий для напряжения питания. Вы хотите прочитать все значения сопротивления, и в других ответах до сих пор в основном предлагались подходы к мультиплексированию сигнала на аналоговой стороне.
Но вы также можете выполнить некоторые или все это мультиплексирование на стороне предложения , разделив «рельс» подачи на n секций. Соедините вместе наборы из n сенсорных площадок, каждая из которых имеет отдельную шину питания. Теперь включайте только одну шину питания и используйте один вход АЦП для считывания каждого набора пэдов. (Вот как обычно работает схема, считывающая клавиатуру компьютера, и способ подключения коммутаторов часто называют «коммутатором точки пересечения».) В конечном итоге вы можете просто использовать один АЦП, подключенный ко всем «рельсам», и выполнить все мультиплексирование путем подключения питания к каждому пэду по очереди.
Единственный недостаток заключается в том, что все остальные контактные площадки должны быть изолированы от шины питания, а не заземлены, что было бы в случае, если бы вы просто использовали цифровой выход для каждого из них. Есть несколько способов решить эту проблему, включая подключение каждой площадки через диод, биполярный транзистор или полевой транзистор, или - я не знаю, насколько быстро это можно сделать на практике, но в принципе это возможно - используя входной-выходной контакт микроконтроллер и установка его либо на высокий уровень выхода, либо на вход, когда он должен иметь относительно высокий импеданс.
Точность измерения ваших датчиков с помощью этой техники может быть не идеальной по сравнению с использованием одного источника постоянного напряжения и высококачественных аналоговых мультиплексоров, но я подозреваю, что это будет достаточно хорошо, особенно потому, что я уверен, что датчики давления будут иметь некоторый допуск на их сопротивление - вам может понадобиться для калибровки этого для каждого датчика с помощью опорной силы в любом случае.
2. Используйте некоторые микроконтроллеры с большим количеством входов АЦП.
Например, PICAXE 40X2 имеет 27 контактов, которые можно использовать как аналоговый вход , так что вы можете удовлетворить свои потребности с помощью 9 из них. Он запрограммирован на простом языке BASIC и может выступать в качестве ведомого устройства i2c - так что вы можете считывать 9 микросхем с помощью еще одного микроконтроллера - или вы можете просто отправить выходные данные с каждого чипа в виде последовательных данных и прочитать их на главном компьютере через последовательные USB-конвертеры. Я не могу точно сказать, как быстро это будет происходить, но я думаю, что это должно работать нормально, если вы синхронизируете PICAXE на максимальной скорости (64 МГц, используя внешний резонатор 16 МГц). Конечно, если вы довольны программированием микроконтроллера в C, то вы можете сделать то же самое с PIC18F45K22, на котором основан PICAXE.
3. Используйте стандартные аналоговые устройства ввода
Наконец, если вы не возражаете тратить деньги, чтобы сэкономить время, и мобильность не является первоочередной задачей - например, если это нормально для привязки инструмента к стойке оборудования с помощью некоторых более толстых кабелей - вы можете просто купить достаточно высокое устройства аналогового ввода с подсчетом каналов для одновременного измерения всех датчиков. Например, измерительный компьютер USB-2633 считывает 64 аналоговых входа за чуть более 1 тыс. Долларов США.
источник
Возможно, стоит подумать о формировании сигнала грубой силы (возможно, пассивного), за которым следуют небольшие АЦП или MCU / ADC с 16 или более входами MUX ADC. Это всего 40 фишек. Одним из примеров чипа, который может работать, является ADS7961QDBTRQ1 , который имеет режим канала с автоинкрементом и 16 входов.
Общая скорость передачи данных даже при частоте дискретизации 4 кГц и 240 байт на выборку составляет около 1 МБ / с, что не так уж страшно. Возможно, главный процессор с шиной SPI 10 МГц или 20 МГц, соединяющейся с подчиненными. Используйте 2 шины SPI, если пропускной способности нет. Часть, упомянутая выше, работает на частоте 20 МГц, поэтому подойдет один SPI.
Или, может быть, вы можете использовать один чип TI- микросхему DDC2256AZZF , которая имеет 64-канальную одновременную выборку и 256 входов ... но это не особенно недорого (около $ 350 долларов США) и поставляется в виде 32-контактного массива LFBA 14x14 мм, поэтому он не собирается работать с макетной доской.
источник
Для приложения интерфейса пользователя в реальном времени общая частота дискретизации в несколько килогерц кажется высокой. 50Гц наверное хватит ( https://en.wikipedia.org/wiki/Input_lag#Typical_overall_response_times ). Это означает, что вы должны отобрать все датчики за <20 мс, поэтому 80 мкс на датчик. Это не так уж сложно, и может управляться практически всеми обычными 8-битными микроконтроллерами (т.е. Atmega88 может сделать это за <30 мкс).
Вы можете также измерить все взаимодействия, а затем просто отбросить те, которые вам не нужны, так как измерить их все не сложно с технической точки зрения. Проблема исходит от мультиплексирования. Я немного запутался в вашем посте, потому что там написано, что датчики питаются по 80 одновременно? Как вы обычно говорите, это мультиплексные столбцы и строки. Если вы этого не сделаете, вам придется иметь дело с> 80 проводами, выходящими из вашего устройства, что на самом деле не очень хорошая идея. Вам нужно найти способ разбить его на матрицу, чтобы вы получили 30 проводов (что все еще много). Затем вы могли бы их мультиплексировать и т. Д., Но на вашем месте у меня было бы только несколько микроконтроллеров и их подключение к мастеру. Вы можете использовать выделенный АЦП вместо подчиненных микроконтроллеров, но я лично буду придерживаться микроконтроллеров.
Вы правильно определили, что связь может быть проблемой, но это не имеет большого значения, по крайней мере, между MCU. Atmega на 8 МГц может выполнять SPI на 2 МГц, поэтому отправка всех данных датчика займет <1 мс. Вопрос в том, что вы хотите делать с этими данными после того, как мастер MCU получит их.
источник
Ваш самый простой способ может состоять в том, чтобы построить все это на длинной гибкой схеме с цепочкой из 10 восьмибитных открытых коллекторов, последовательно соединенных с параллельными регистрами, распределенными по гибкому кабелю для питания каждого столбца пэдов по отдельности.
Вы можете использовать их для одновременного управления каждым столбцом во всех строках и мультиплексирования общих обратных линий на свой АЦП. Для обратных линий потребуются соответствующие подтяжки, поэтому вы получите резистор делителя напряжения с сопротивлением кнопки.
смоделировать эту схему - схема, созданная с использованием CircuitLab
Затем управляющий микроэлемент посылает один нулевой бит по цепочке регистров, так что за один раз включается только один столбец. Остальные соединения будут плавающими.
источник
очевидный способ сделать это (видя, что вам нужно увидеть только одно прикосновение к каждой струне) - это подключить лады к делителю напряжения, а затем измерить напряжение на каждой струне.
это скажет вам место касания.
чтобы получить давление прикосновения, поместите конденсатор с земли на каждый лад и измерьте сопротивление переменного тока на каждой струне.
Недостатком этого подхода является то, что струны будут реагировать на более высокие прикосновения
источник
Если вы можете получить какой-то провод, который имеет достаточно равномерное сопротивление на дюйм, что составляет от 100 Ом до 100 К для длины гитары, вы можете просто сделать шейку из материала, который является умеренно проводящим, с поверхностным сопротивлением который уменьшается с давлением, а затем измерьте сопротивление между шеей и каждым концом каждой струны. Сумма сопротивлений, за вычетом сопротивления струны, будет указывать в два раза больше сопротивления точки контакта. После вычитания сопротивления точки контакта из каждого измеренного сопротивления, соотношение оставшихся сопротивлений будет указывать точку контакта на шее.
Обратите внимание, что этот подход будет способен обнаруживать одновременные нажатия на все три строки, но не будет работать, если строка может быть нажата в нескольких местах. На гитаре такой дизайн исключает использование аккордов - довольно серьезное ограничение - но другие инструменты могут не требовать касания струн в нескольких местах.
источник
Я видел этот пост, и я думал, что это может быть возможно с одним чипом. Я бы посоветовал вам взять какую-нибудь доску с микроконтроллером, такую как дешевая доска с голубыми таблетками. Он имеет ARM M3, с 10 бесплатными каналами АЦП. Если вы разместите столбцы в 3 кластера по 3 строки, подключите их к 9 свободным каналам АЦП. Используйте остальные 21 штифт, чтобы переключать ряды штырей, в общей сложности 63 «лада». Микроконтроллер имеет два 12-битных АЦП по 1 Мбит / с, которые можно использовать с фазовой задержкой для поддержки 2 Мбит / с, что должно быть достаточно, чтобы никогда не пропустить удар или не заметить какую-либо модуляцию. Я думаю, вы можете использовать USB-соединение и заставить его работать как USB-миди-контроллер. Вы могли бы использовать больший микроконтроллер для большего количества входов, но я не понимаю, как вы собираетесь управлять интервалом «лада» с более чем 30 ладами, или это будет больше похоже на сенсорный экран?
Я не знаю точно, как работают эти листы велостата, но разве вы не можете поместить маленькие точки завершения на нижней части большего листа и соотнести местоположение и давление пальца с напряжением в нескольких точках? Тогда вы, вероятно, можете избежать неприятных ощущений и поддерживать такие вещи, как изгибы и вибрато.
источник