![](https://habrastorage.org/webt/ie/gh/yy/ieghyyotouorivunrhyp5uv1_9e.png)
Ведь всем нам известно, что лучший способ сохранить данные в безопасности – это их уничтожить, не так ли?
Что ж, для большинства из нас более актуальным ответом стало бы шифрование. Но задумайтесь о случаях, в которых устройство может попасть в руки тех, кого шифрование не остановит…
Мой замысел – создать USB-накопитель, который косметически и функционально будет полностью идентичен типичной флешке, за одним отличием – при подключении стандартным образом он не будет показывать никаких данных.
А что разумный человек точно не станет делать, прежде чем подключать обычную флешку? Лизать пальцы!
Всё верно. Носитель будет оснащён скрытыми электродами, измеряющими сопротивление вставляющего его в устройство пальца. В обычном состоянии сопротивление пальца равно 1.5МОм, а вот во влажном около 500кОм. При загрузке такая флешка будет отображаться пустой, если сопротивление между парой электродов окажется выше заданного порога. Это не самое изящное решение, но, на мой взгляд, оно удачно балансирует между смехотворностью и функциональностью. Что же касается людей с гермофобией, то они могут смачивать палец под краном.
Прим. пер.: в оригинале реализация проекта разбита на две коротких статьи, которые ради удобства восприятия были объединены в одну.
▍ Как устроена флешка
Флешка является относительно простым электронным устройством. В реализации первой версии я буду ориентироваться на достижение скоростей USB 2.0.
![](https://habrastorage.org/webt/uu/-o/1n/uu-o1nfduxykapfeej5ymirkxxk.png)
Стандартный USB-накопитель состоит из USB-контроллера (в синей рамке), подключённого к микросхеме флеш-памяти NAND (красная рамка). Эта микросхема выполняет функцию фактического носителя данных, а контроллер хранит USB-фронтенд и логику для взаимодействия с ней.
Чтобы реализовать задуманную функциональность, я буду использовать контроллер в паре с микроконтроллером для считывания электродов и возможного отключения микросхемы.
При проектировании аппаратных устройств важно понимать экономическую специфику использования тех или иных компонентов. Микросхемы флеш-памяти являются универсальными и могут применяться где угодно: в смарт-ТВ, BIOS компьютера, машинах и так далее. А вот USB-контроллер представляет специализированный компонент, используемый конкретно для флеш-накопителей.
Специализированные платы появляются в условиях огромного рынка, когда производители стремятся сократить маржу. В мире существует всего пара десятков производителей флеш-накопителей, и новые не появляются. Львиная доля объёма поступает от нескольких огромных фабрик, продающих продукцию с незначительной маржой. В таких условиях ни один новый стартап по производству USB-носителей не сможет повлиять на рынок. Digikey или Mouser явно не подойдут в качестве поставщиков необходимых специализированных компонентов.
Я шерстил интернет в поиске разобранных флешек, выискивая надписи на микросхемах, когда обнаружил золотую жилу: базу данных флеш-накопителей, в которой перечислены парт-номера некоторых плат USB-контроллеров. Затем, остановив свой выбор на SM3257EN, я отыскал его спецификацию и поставщика.
![](https://habrastorage.org/webt/s1/1p/4e/s11p4edem6c5ac628fhrmupifjs.png)
Блок-схема SM3257EN
Эта микросхема должна с задачей справиться. Спецификация написана хорошо и содержит достаточно информации. Я спроектировал эту деталь в Kicad и объединил с микросхемой NAND и Usb-разъёмом.
Теперь мне нужно заставить это устройство скрывать данные, если пользователь не смочит пальцы.
Сигнал активации микросхемы (CE) с контроллера USB поступает к ней напрямую. Когда этот сигнал находится на низком уровне, микросхема включается. Я же для силового отключения памяти задействую совместно с управляющим сигналом «вентиль ИЛИ».
![](https://habrastorage.org/webt/4r/dy/tm/4rdytmy0zha8je2xsbuobd4c7ko.png)
При высоком уровне моего отключающего сигнала состояние CE будет уже не важно. Вывод вентиля будет высоким, что приведёт к отключению памяти.
Что касается управления самого отключающего сигнала, то для этого я использую ATtiny24 и подключённый к электродам усилитель проводимости. Во второй части я расскажу об этом подробнее.
▍ Миссия
Я создаю оборудование для решения различных проблем и параллельно выстраиваю вокруг сообщество. Если вы считаете, что можете найти применение устройству, описываемому в этой статье, или же хотите помочь, то буду рад пообщаться. Я специально создал Discord-сервер для единомышленников. Все материалы доступны на GitHub.
![](https://habrastorage.org/webt/hn/uq/pg/hnuqpgoy7qbkwtgtf8ra4d7nibu.png)
Часть 2
Далее я опишу сам процесс проектирования USB-флешки с секретом и возникшие сложности. Речь пойдёт о прототипировании, схеме устройства, его макете, а также поиске механических компонентов.
К предыдущей части было немало комментариев о том, что флешка на деле не самоуничтожается. В качестве ответа на подобные заявления теперь у нее будет два варианта реализации: с функцией сокрытия данных и с полноценным самоуничтожением.
▍ Корпус
Я нашёл заморский магазин, в котором продают USB-корпуса без внутренностей, что избавило меня от разработки собственного. Мне не доводилось проектировать корпуса для литья под давлением, и сегодня тот день ещё не настал.
![](https://habrastorage.org/webt/td/4v/a3/td4va30ziexnha7f3fz6jscxhdg.jpeg)
Корпуса USB-носителей
Из четырёх полученных образцов я предпочёл чёрный (на фото крайний слева). К сожалению, поставщик не смог предоставить мне 3D-файлы CAD, лишь DXF. Если вы не знали, DXF – это открытый векторный формат, использующийся для обмена графическими данными; не идеальный вариант, но лучше, чем ничего.
![](https://habrastorage.org/webt/vt/ap/hz/vtaphzoc7dykawhhwjkmb4bfexo.png)
Эскиз корпуса
Я взял эти DXF-эскизы, импортировал их во FreecAD, а затем «экструдировал» в 3D-модели. Получился странноватый способ рисования модели. Линии DXF преобразовались в безразмерные объекты эскизов FreeCAD, после чего были экструдированы. Затем я вставил в макет печатную плату, и получилось вот что:
![](https://habrastorage.org/webt/zg/7n/8b/zg7n8bx2njocy8uvci2uj4f40ws.png)
Макет устройства
Надеюсь, в готовом виде девайс будет выглядеть примерно так.
▍ Полное самоуничтожение
Моя задача – создать полностью дискретное устройство, чтобы при попадании вашей флешки в руки серьёзных заинтересованных людей, у них не возникло подозрений относительно её пустоты. При этом во время подключения она не должна взрываться, плавиться, высвобождать корродирующее вещество или производить иное безумие (несмотря на то, что это бы сделало статью намного интереснее). Накопителю нужно будет тихо повредить себя без возможности восстановления.
И реализую я это с помощью перегрузки линии напряжения микросхемы памяти. Должен сказать, что это первый раз, когда я в действительности заглянул в раздел, где указаны максимальные номиналы компонента.
![](https://habrastorage.org/webt/oo/tl/ye/ootlyeird_zcrfge3jwdtpw6rvi.png)
Чтобы окончательно вывести микросхему из строя, на неё необходимо подать более 4.6В. Для этого можно использовать на линии 5В простой удвоитель напряжения.
![](https://habrastorage.org/webt/ns/ph/v9/nsphv9_a1hosmkdobh3f85hq9dw.png)
Принцип работы данной схемы довольно прост. Когда Distruct_PWM находится в низком состоянии, C1 (сверху) заряжается до 4.3В, то есть 5В минус 0.7В падения на светодиоде. Если я установлю Distruct_PWM на высокий уровень с микроконтроллера, это поднимет нижний уровень C1 до 5В, что в общей сложности даст потенциал 9.3В. Далее это напряжение попадёт в C2 (сверху), где задержится до следующего цикла. Когда вам потребуется подать это напряжение на микросхему памяти, активируйте Q1 и можете попрощаться с фотками милых пёсиков.
▍ Схема считывания
Хорошо, а откуда устройство узнает, лизнул его пользователь пальцы или нет, чтобы принять решение об уничтожении данных? Это можно реализовать с помощью измерения сопротивления тела, а именно кожи человека. Если сопротивление кожи пальца низкое (500кОм и меньше), то можно предположить, что он мокрый. Для измерения сопротивляемости организма наверняка существует микросхема, но ввиду их дефицита я был вынужден обойтись стандартными компонентами.
![](https://habrastorage.org/webt/ks/7u/ge/ks7uge1oeq_5m8ya-iue4few408.png)
Эту схему источника тока я взял из книги «Искусство схемотехники». Разберём принцип её действия. Стабилитрон U1 является источником опорного напряжения; при подаче на него напряжения он будет пропускать ровно 2.5В. Катод подключён к R2, а анод к неинвертирующему входу операционного усилителя. Выход этого усилителя будет подавать ток, необходимый для удержания двух входов на одинаковом напряжении. Следовательно, можно предположить, что через R2 также проходит 2.5В. В таком случае ток, проходящий через R2, будет равен:
![](https://habrastorage.org/webt/o8/rp/vm/o8rpvmiqgwtbgh0s80lcpi4thp0.png)
Наши электроды подключены через J1, и напряжение в Vx и Vs снова определяется законом Ома:
![](https://habrastorage.org/webt/ir/xo/ot/irxoot5tj3o4ziixw-ezwji5xcs.png)
Теперь можно использовать эти два уравнения для нахождения нагрузочного сопротивления, RL:
![](https://habrastorage.org/webt/vt/9f/tq/vt9ftqq2_kycex6epqtyi7jxrha.png)
Именно эту формулу мы используем для вычисления сопротивления кожи.
▍ Микроконтроллер
В качестве мозга проекта я выбрал простой ATtiny25. Он на шаг ниже 32-битных микросхем ARM, которые я обычно использую. Было приятно уместить всё приложение в 55 строк кода при всего одном заголовочном файле.
Для тестирования кода я настроил канал ШИМ. Калибровку я проводил, считывая напряжение с выводов АЦП и ШИМ мультиметром в режиме измерения постоянного тока.
Код
#include <avr/io.h>
// PWM PA6
// ADC PA1
// LED PA2
const float R2 = 747e3; // R2 на схеме
const float Rth = 0.4e6; // Если r > 1МОм, значит палец сухой
void init_pwm() {
DDRA |= (1 << PA6); // PA6 как вывод
OCR1A = 0x0000;
TCCR1A |= (1 << COM1A1); // установка неинвертирующего режима
TCCR1A |= (1 << WGM11) | (1 << WGM10); // установка 10-битного режима ШИМ с фазовой корректировкой
TCCR1B |= (1 << CS11); // установка предварительного делителя частоты на 8 и запуск ШИМ
}
void set_pwm(float voltage) {
OCR1A = ( voltage / 5 )* 0x400;
}
void init_adc() {
ADMUX &= ~(1 << REFS0); // использование 5В в качестве опорного напряжения
ADMUX &= ~(1 << REFS1);
ADMUX |= (1 << MUX0); // использование ADC1 (PA1)
ADCSRB |= (1 << ADLAR); // операция левого выравнивания (8 бит) в порядке
ADCSRA |= (1 << ADEN); // включение АЦП
}
float read_adc() {
float voltage;
ADCSRA |= (1 << ADSC);
while(ADCSRA & (1 << ADSC)) {};
voltage = ADCH;
voltage = voltage * 5 / 0xff;
return voltage;
}
int main(void) {
DDRA = 1 << PA2; // светодиод
init_pwm();
init_adc();
while(1)
{
float v, r = 0;
v = read_adc();
set_pwm(v);
r = v * (R2/2.5);
(r > Rth) ? (PORTA &= ~(1 << PA2)) : (PORTA |= 1 << PA2);
}
}
▍ Сборка
Как правило, при работе на заказ я не использую макетные платы. Выходит слишком накладно, да и бессмысленно при наличии современных SMD-компонентов. Обычно я перехожу от моделирования сразу к составлению схемы и проектированию платы. Однако в этом проекте макетку я всё же задействовал. Сделал я это, чтобы не сжечь преждевременно микросхему памяти. Нахлынула ностальгия, будто я снова в школе, работаю с DIP-компонентами и бумажными схемами.
![](https://habrastorage.org/webt/d5/ag/sv/d5agsvchxshc7v-iz6e_88u8zkm.gif)
Да будет свет!
Логика работает прекрасно. Все нюансы, выявленные при работе с этим прототипом, я интегрировал в конечный дизайн.
Если всё пойдёт складно, то вскоре я планирую запустить небольшую краудфандинг-кампанию, чтобы собрать несколько таких устройств для нужд сообщества.
Всем успехов!
Telegram-канал и уютный чат для клиентов
![](https://habrastorage.org/webt/sz/7j/pf/sz7jpfj8i1pa6ocj-eia09dev4q.png)