Оглавление:
- Шаг 1. Что вам понадобится
- Шаг 2: чтение и запись регистров
- Шаг 3: чтение и запись предохранителей
- Шаг 4: другие команды
- Шаг 5: настройка оболочки
- Шаг 6: Резюме
Видео: AVRSH: оболочка командного интерпретатора для Arduino / AVR: 6 шагов (с изображениями)
2024 Автор: John Day | [email protected]. Последнее изменение: 2024-01-30 11:55
Вы когда-нибудь хотели «войти» в свой микроконтроллер AVR? Вы когда-нибудь думали, что было бы круто "катить" регистр, чтобы увидеть его содержимое? Вы всегда хотели иметь способ включать и выключать отдельные периферийные подсистемы вашего AVR или Arduino в * реальном времени *? Я тоже, поэтому я написал AVR Shell, UNIX-подобную оболочку. Он похож на UNIX, потому что он напоминает учетную запись оболочки, которую вы купили для запуска своих ботов столкновения irc-ников, а также наличие одной или двух общих команд. У него также есть файловая система, напоминающая UNIX extfs, использующая внешнюю EEPROM, но она стала отдельным проектом, поэтому я буду выпускать этот модуль отдельно под другой инструкцией, когда он будет готов к производству. Вот список того, что вы можете делать в настоящее время с помощью оболочки AVR:
- Чтение всех ваших регистров направления данных (DDRn), портов и контактов в режиме реального времени
- Запись на все ваши DDRn, порты и контакты для включения двигателей, светодиодов или считывания датчиков в режиме реального времени
- Список всех известных регистров в системе
- Создавайте и сохраняйте значения в определяемых пользователем переменных с резервной копией EEPROM.
- Создайте пароль root и авторизуйтесь по нему (используется для доступа по telnet)
- Считайте настроенную тактовую частоту процессора
- Измените тактовую частоту процессора, установив предварительный делитель
- Запуск и остановка 16-битных таймеров для измерения времени различных вещей
- Включение и / или отключение питания периферийных подсистем: аналого-цифровые преобразователи (АЦП), последовательный периферийный интерфейс (SPI), двухпроводной интерфейс (TWI / I2C), UART / USART. Полезно, когда вы хотите снизить энергопотребление микроконтроллера или включить определенные функции.
- Написано на C ++ с многоразовыми объектами.
Это руководство проведет вас через установку, использование и настройку avrsh.
Шаг 1. Что вам понадобится
Эта инструкция не требует многого, кроме того, что вы:
- У вас есть Arduino или ATmega328P. Другие AVR могут работать, но вам может потребоваться изменить код, чтобы перечислить все регистры, уникальные для вашего MCU. Имена должны совпадать только с тем, что указано в файле заголовка, уникальном для вашего MCU. Многие из имен регистров у AVR одинаковы, поэтому ваш пробег может отличаться при портировании.
- Есть способ подключиться к последовательному USART вашего Arduino / AVR. Система была наиболее тщательно протестирована с помощью AVR Terminal, приложения для Windows, которое устанавливает последовательное соединение через USB- или COM-порт. Работает с Arduinos через USB-соединение и с любым AVR через USB-BUB от Moderndevice.com. Другие варианты терминала включают: Putty, minicom (Linux и FreeBSD), screen (Linux / FreeBSD), Hyperterminal, Teraterm. Я обнаружил, что putty и teraterm отправляют мусор при подключении, поэтому ваша первая команда может быть испорчена.
- У вас должна быть установлена и запущена прошивка AVR Shell, которую вы можете скачать с этих страниц, или всегда скачивайте последнюю версию на BattleDroids.net.
Чтобы установить терминал AVR, просто распакуйте его и запустите. Чтобы установить микропрограмму AVR Shell, загрузите ее и либо напрямую загрузите шестнадцатеричный файл и подключите свой последовательный терминал со скоростью 9600 бод, либо скомпилируйте его самостоятельно с помощью «make», а затем «make program» для загрузки шестнадцатеричного файла. Обратите внимание, что вам может потребоваться изменить настройки AVRDUDE, чтобы они соответствовали вашему COM-порту. Примечание. Атрибут PROGMEM не работает в текущей реализации AVR GCC для C ++, и это известная ошибка. Если вы скомпилируете его, ожидайте появления множества предупреждающих сообщений: «Предупреждение: только инициализированные переменные могут быть помещены в область памяти программы». Это предупреждение не только раздражает, но и безвредно. Поскольку C ++ на встроенной платформе не занимает высокие позиции в списке приоритетов AVR GCC, неизвестно, когда это будет исправлено. Если вы просмотрите код, вы увидите, где я сделал обходные пути, чтобы уменьшить это предупреждение, реализовав свои собственные операторы атрибутов. Довольно просто. Загрузите и установите все, что вам может понадобиться, затем переверните страницу и приступайте к делу.
Шаг 2: чтение и запись регистров
Оболочка AVR была написана в первую очередь для доступа к некоторым датчикам, которые я подключил к своему AVR. Все началось с простого светодиода, затем перешло к датчикам света, датчикам температуры и, наконец, к двум ультразвуковым преобразователям. avrsh может устанавливать цифровые компоненты этих датчиков, записывая в регистры, которые их контролируют. Управление регистрами AVR во время работы Чтобы получить список всех известных регистров на вашем Arduino, введите:
регистры печати и вы получите такую распечатку
Я знаю о следующих регистрах:
TIFR0 PORTC TIFR1 PORTD TIFR2 DDRD PCIFR DDRB EIFR DDRC EIMSK PINB EECR Pinc EEDR PIND SREG EEARL GPIOR0 EEARH GPIOR1 GTCCR GPIOR2 TCCR0A TCCR0B TCNT0 OCR0A OCR0B SPCR SPDR ACSR SMCR MCUSR MCUCR SPMCSR WDTCSR CLKPR ПРР OSCCAL PCICR EICRA PCMSK0 PCMSK1 TIMSK0 TIMSK1 TIMSK2 ADCL СВК ADCSRA ADCSRB ADMUX DIDR0 DIDR1 TCCR1A TCCR1B TCCR1C TCNT1L TCNT1H ICR1L ICR1H OCR1AL OCR1AH OCR1BL OCR1BH TCCR2A TCCR2B TCNT2 OCR2A OCR2B ASSR TWBR TWSR TWARB UTARC USR TWBR TWSR TWARC U32 USR, TWSR, TWSR, USR, USR, TWSR, UTSR, USR, TWSR, USR, UTSR, UTSR, UTSR, UTSR, UTSR, URT, U32, TWARC, URI Чтобы увидеть, как устанавливаются отдельные биты в любом регистре, используйте команду cat или echo
cat% GPIOR0 Здесь я прошу интерпретатор команд отобразить или отобразить содержимое регистра ввода-вывода общего назначения №0. Обратите внимание на знак процента (%) перед именем регистра. Это необходимо, чтобы указать оболочке, что это зарезервированное ключевое слово, идентифицирующее регистр. Типичный вывод команды echo выглядит следующим образом
GPIOR0 (0x0) установлен на [00000000] Выходные данные показывают имя регистра, шестнадцатеричное значение, найденное в регистре, и двоичное представление регистра (показывая каждый бит как 1 или 0). Чтобы установить конкретный бит в любом регистре, используйте оператор «индекс» . Например, скажем, я хочу, чтобы 3-й бит был 1
% GPIOR0 [3] = 1 и оболочка выдаст вам ответ с указанием своего действия и результата
GPIOR0 (0x0) установлен на [00000000] (0x8) установлен на [00001000] Не забудьте знак процента, чтобы сообщить оболочке, что вы работаете с регистром. Также обратите внимание, что при установке 3-го бита это 4 бита, потому что наш AVR использует индекс, отсчитываемый от нуля. Другими словами, считая до 3-го бита, вы считаете 0, 1, 2, 3, что является 4-м местом, но 3-м битом. Вы можете очистить бит таким же образом, установив бит на ноль. Устанавливая такие биты, вы можете изменять работу вашего AVR на лету. Например, изменив значение совпадения таймера CTC, найденное в OCR1A. Это также позволяет вам заглянуть в определенные настройки, которые вам придется программно проверять в своем коде, например, значение UBBR для вашей скорости передачи данных. Работа с DDRn, PORTn и PINn Контакты ввода / вывода также назначены регистрам и могут быть установлены точно так же, но для работы с этими типами регистров был создан специальный синтаксис. В коде есть нормальный процесс, скажем, для включения светодиода или другого устройства, для которого требуется цифровой высокий или низкий уровень. Для этого требуется настроить регистр направления данных, чтобы указать, что вывод предназначен для вывода, а затем записать 1 или 0 в конкретный бит в правильном порту. Предполагая, что у нас есть светодиод, подключенный к цифровому контакту 13 (PB5), и мы хотим его включить, вот как это сделать, пока ваш AVR работает.
установить вывод pb5 на вывод записать вывод pb5 на высокий уровень Выходной сигнал, помимо возможности видеть, как загорается светодиод, будет выглядеть так:
root @ ATmega328p> установить вывод pb5, установить вывод pb5 для вывода root @ ATmega328p> записать вывод pb5 high, записать высокий логический уровень на вывод pb5 «Root @ ATmega328p>» - это приглашение оболочки, указывающее, что она готова принимать от вас команды. Чтобы выключить светодиод, вы должны просто записать низкий уровень на вывод. Если вы хотите считать цифровой вход с пина, используйте команду чтения. Используя наш пример выше
root @ ATmega328p> читать контакт pb5Pin: pb5 ВЫСОКИЙ В качестве альтернативы просто отобразите регистр контактов, который управляет этим портом контактов. Например, если у нас есть микропереключатели, подключенные к цифровым контактам 7 и 8 (PD7 и PD8), вы можете отправить команду
эхо% PIND и оболочка затем отобразит содержимое этого регистра, показывая вам все состояния ввода / вывода подключенных устройств и то, было ли состояние переключателя включено или выключено.
Шаг 3: чтение и запись предохранителей
Предохранители - это особые типы регистров. Они контролируют все, от тактовой частоты вашего микроконтроллера до доступных методов программирования для защиты EEPROM от записи. Иногда вам может потребоваться изменить эти настройки, особенно если вы создаете автономную систему AVR. Я не уверен, что вам следует менять настройки предохранителя на Arduino. Будьте осторожны со своими предохранителями; вы можете заблокировать себя, если установили их неправильно. В предыдущем руководстве я продемонстрировал, как вы можете читать и устанавливать предохранители с помощью вашего программатора и avrdude. Здесь я покажу вам, как считывать данные о предохранителях во время выполнения, чтобы увидеть, как ваш MCU на самом деле их установил. Обратите внимание, что это не настройка времени компиляции, которую вы получаете из определений, а фактические предохранители, когда MCU считывает их во время выполнения. Из Таблицы 27-9 в таблице данных ATmega328P (сборник данных, больше похожий на нее) биты младшего байта предохранителя выглядят следующим образом:
CKDIV8 CKOUT SUT1 SUT0 CKSEL3 CKSEL2 CKSEL1 CKSEL0Интересно отметить, что с предохранителями 0 означает запрограммировано, а 1 означает, что этот конкретный бит не запрограммирован. Несколько нелогично, но как только вы это узнаете, вы это поймете.
- CKDIV8 устанавливает частоту вашего процессора, деленную на 8. ATmega328P поставляется с завода, запрограммированным на использование своего внутреннего генератора на частоте 8 МГц с запрограммированным CKDIV8 (т.е. установленным на 0), что дает вам конечную частоту F_CPU или процессора 1 МГц. На Arduino это изменено, поскольку они настроены на использование внешнего генератора на частоте 16 МГц.
- CKOUT при программировании будет выводить часы вашего процессора на PB0, который является цифровым выводом 8 на Arduinos.
- SUT [1..0] определяет время запуска вашего AVR.
- CKSEL [3..0] устанавливает источник синхронизации, такой как внутренний RC-генератор, внешний генератор и т. Д.
Когда вы прочтете свои предохранители, они вернутся вам в шестнадцатеричном формате. Это тот формат, который вам нужен, если вы хотите записывать предохранители через avrdude. На моем Arduino я получаю следующее, когда читаю младший байт предохранителя:
root @ ATmega328p> прочитать lfuseLower Fuse: 0xffИтак, все биты установлены в 1. Я проделал ту же процедуру на клоне Arduino и получил то же значение. Проверяя одну из моих автономных систем AVR, я получил значение 0xDA, которое я установил некоторое время назад при настройке микросхемы. Та же процедура используется для проверки байтов старшего предохранителя, байта расширенного предохранителя и предохранителей блокировки. Байты предохранителя калибровки и сигнатуры были отключены в коде с помощью директивы препроцессора #if 0, которую вы можете изменить, если почувствуете нечеткость.
Шаг 4: другие команды
Интерпретатор команд по умолчанию понимает несколько других команд, которые могут оказаться полезными. Вы можете увидеть все реализованные и будущие команды, выполнив справку или меню в командной строке. Я быстро расскажу о них здесь, поскольку они в основном не требуют пояснений. Настройки тактовой частоты ЦП Вы можете узнать, какая прошивка была настроена для использования в качестве настроек тактовой частоты ЦП, с помощью команды fcpu:
root @ ATmega328p> fcpuCPU Freq: 16000000Это 16 миллионов или 16 миллионов герц, более известных как 16 МГц. Вы можете изменить это на лету по любой причине с помощью команды clock. Эта команда принимает один аргумент: предделитель, используемый при делении вашей тактовой частоты. Команда clock понимает эти значения предварительного делителя:
- ckdiv2
- ckdiv4
- ckdiv8
- ckdiv16
- ckdiv32
- ckdiv64
- ckdiv128
- ckdiv256
Используя команду:
часы ckdiv2 когда скорость вашего процессора составляет 16 МГц, ваша тактовая частота будет изменена на 8 МГц. Использование предделителя ckdiv64 с начальной тактовой частотой 16 МГц приведет к конечной тактовой частоте 250 кГц. Зачем вам делать свой MCU медленнее? Ну, во-первых, более низкая тактовая частота потребляет меньше энергии, и если у вас есть ваш MCU, работающий от батареи в корпусе проекта, вам может не понадобиться, чтобы он работал на максимальной скорости, и, следовательно, можно было бы снизить скорость и снизить энергопотребление., увеличивая время автономной работы. Кроме того, если вы используете часы для каких-либо проблем с синхронизацией с другим MCU, скажем, для реализации программного UART или чего-то подобного, вы можете установить его на определенное значение, которое легко получить хорошую равномерную скорость передачи с более низкий уровень ошибок. Включение и выключение периферийных подсистем Наряду с сокращением энергопотребления, упомянутым ранее, вы можете дополнительно снизить энергопотребление, отключив некоторые встроенные периферийные устройства, которые вы не используете. Интерпретатор команд и оболочка в настоящее время могут включать и выключать следующие периферийные устройства:
- Аналого-цифровой преобразователь (АЦП). Это периферийное устройство используется, когда у вас есть аналоговый датчик, предоставляющий данные (например, температура, свет, ускорение и т. Д.), И вам необходимо преобразовать их в цифровое значение.
- Последовательный периферийный интерфейс (SPI). Шина SPI используется для связи с другими устройствами с поддержкой SPI, такими как внешняя память, драйверы светодиодов, внешние АЦП и т. Д. Части SPI используются для программирования ISP или, по крайней мере, контакты, поэтому будьте осторожны при выключении. если вы программируете через интернет-провайдера.
- Двухпроводной интерфейс. Некоторые внешние устройства используют шину I2C для связи, хотя они быстро заменяются устройствами с поддержкой SPI, поскольку SPI имеет большую пропускную способность.
- USART. Это ваш последовательный интерфейс. Вы, вероятно, не захотите выключать это, если вы подключены к AVR через последовательное соединение! Однако я добавил это здесь как основу для переноса на устройства с несколькими USART, такие как ATmega162 или ATmega644P.
- все. Этот аргумент команды powerup или powerdown включает все упомянутые периферийные устройства или выключает их все одной командой. Опять же, используйте эту команду с умом.
root @ ATmega328p> powerdown twi Отключение twi complete.root@ATmega328p> powerup twi Включение twi завершено.
Запуск и остановка таймеров Оболочка имеет встроенный 16-битный таймер, доступный для использования. Вы запускаете таймер с помощью команды таймера:
запуск таймераи остановите таймер с помощью аргумента остановки
остановка таймераЭтот таймер не конфликтует с внутренним таймером USART. См. Код для деталей реализации таймера USART, если вас интересуют такие кровавые подробности.
root @ ATmega328p> timer startStarted timer.root@ATmega328p> timer stop Прошедшее время: ~ 157 секунд Аутентификация Оболочка может хранить 8-значный пароль в EEPROM. Этот механизм пароля был создан для поддержки возможностей входа в систему telnet, но его можно было расширить для защиты других вещей. Например, вы можете потребовать определенные команды, такие как изменение значений регистров, через механизм аутентификации. Установите пароль с помощью команды password.
root @ ATmega328p> passwd blah Записал пароль root в EEPROMАвторизуйтесь, используя пароль (или требуйте авторизацию программно через код) с помощью команды auth. Обратите внимание, что если вы пытаетесь изменить пароль root, а пароль root уже установлен, вы должны авторизоваться со старым паролем, прежде чем вам будет разрешено изменить его на новый пароль.
root @ ATmega328p> passwd blinky Сначала вы должны авторизоваться. root@ATmega328p> auth blahAuthorized.root@ATmega328p> passwd blinky Записал НОВЫЙ пароль root в EEPROMКонечно, вам нужно будет загрузить файл avrsh.eep, если вы удалите прошивку, чтобы восстановить старые значения и переменные. Makefile создаст для вас файл EEPROM. Переменные Оболочка понимает понятие пользовательских переменных. Код ограничивает это значение 20, но вы можете изменить это, если хотите, изменив определение MAX_VARIABLES в script.h. Вы можете сохранить любое 16-битное значение (то есть любое число до 65, 536) в переменную для последующего вызова. Синтаксис аналогичен регистрам, за исключением того, что для обозначения переменных в оболочке используется знак доллара ($). Перечислите все свои переменные с помощью команды печати переменных
переменные печати Пользовательские переменные: Имя индекса -> Значение (01): $ FREE $ -> 0 (02): $ FREE $ -> 0 (03): $ FREE $ -> 0 (04): $ FREE $ -> 0 (05): $ БЕСПЛАТНО $ -> 0 (06): $ БЕСПЛАТНО $ -> 0 (07): $ БЕСПЛАТНО $ -> 0 (08): $ БЕСПЛАТНО $ -> 0 (09): $ БЕСПЛАТНО $ -> 0 (10): $ БЕСПЛАТНО $ -> 0 (11): $ БЕСПЛАТНО $ -> 0 (12): $ БЕСПЛАТНО $ -> 0 (13): $ БЕСПЛАТНО $ -> 0 (14): $ БЕСПЛАТНО $ -> 0 (15): $ БЕСПЛАТНО $ -> 0 (16): $ БЕСПЛАТНО $ -> 0 (17): $ БЕСПЛАТНО $ -> 0 (18): $ БЕСПЛАТНО $ -> 0 (19): $ БЕСПЛАТНО $ -> 0 (20): $ FREE $ -> 0 Завершить. Установить переменную
$ newvar = 25 $ timeout = 23245Получить значение заданной переменной
корень @ ATmega328p> echo $ newvar $ newvar 25Вы можете увидеть, какие все переменные вы в настоящее время создали с помощью команды печати, которую вы уже знаете.
Пользовательские переменные: Имя индекса -> Значение (01): newvar -> 25 (02): тайм-аут -> 23245 (03): $ FREE $ -> 0 (04): $ FREE $ -> 0 (05): $ БЕСПЛАТНО $ -> 0 (06): $ БЕСПЛАТНО $ -> 0 (07): $ БЕСПЛАТНО $ -> 0 (08): $ БЕСПЛАТНО $ -> 0 (09): $ БЕСПЛАТНО $ -> 0 (10): $ БЕСПЛАТНО $ -> 0 (11): $ БЕСПЛАТНО $ -> 0 (12): $ БЕСПЛАТНО $ -> 0 (13): $ БЕСПЛАТНО $ -> 0 (14): $ БЕСПЛАТНО $ -> 0 (15): $ БЕСПЛАТНО $ -> 0 (16): $ БЕСПЛАТНО $ -> 0 (17): $ БЕСПЛАТНО $ -> 0 (18): $ БЕСПЛАТНО $ -> 0 (19): $ БЕСПЛАТНО $ -> 0 (20): $ FREE $ -> 0Завершить. Имя $ FREE $ просто указывает, что эта переменная свободна и ей еще не присвоено имя.
Шаг 5: настройка оболочки
Вы можете взломать код и настроить его под свои нужды, если хотите. Если бы я знал, что выпущу этот код, я бы создал отдельный класс интерпретатора команд и структуру команды и просто повторил бы этот вызов указателя функции. Это уменьшило бы объем кода, но в его нынешнем виде оболочка анализирует командную строку и вызывает соответствующий метод оболочки. Чтобы добавить свои собственные пользовательские команды, выполните следующие действия: 1. Добавьте свою команду в список синтаксического анализа. проанализируйте командную строку и дайте вам команду и любые аргументы отдельно. Аргументы передаются как указатели на указатели или как массив указателей, как бы вы ни работали с ними. Он находится в shell.cpp. Откройте shell.cpp и найдите метод ExecCmd класса AVRShell. Вы можете добавить команду в память программы. Если да, добавьте команду в progmem.h и progmem.cpp. Вы можете добавить команду в программную память напрямую, используя макрос PSTR (), но вы получите другое предупреждение того типа, о котором говорилось ранее. Опять же, это известная ошибка при работе с C ++, но вы можете обойти это, добавив команду непосредственно в файлы progmem. *, Как это сделал я. Если вы не возражаете добавить к своему использованию SRAM, вы можете добавить команду, как я проиллюстрировал с помощью команды «clock». Допустим, вы хотите добавить новую команду под названием «newcmd». Перейдите в AVRShell:: ExecCmd и найдите удобное место для вставки следующего кода:
иначе, если (! strcmp (c, "newcmd")) cmdNewCmd (args);Это добавит вашу команду и вызовет метод cmdNewCmd, который вы напишете на следующем шаге. 2. Напишите свой собственный код команды. В том же файле добавьте свой собственный код команды. Это определение метода. Вы все равно захотите добавить объявление в shell.h. Просто добавьте его к другим командам. В предыдущем примере код может выглядеть примерно так
voidAVRShell:: cmdNewCmd (char ** args) {sprintf_P (buff, PSTR ("Ваша команда% s / r / n", args [0]); WriteRAM (buff);}Здесь есть несколько вещей. Во-первых, «buff» - это буфер массива из 40 символов, предоставленный в коде для вашего использования. Мы используем версию sprintf для программной памяти, так как мы передаем ему PSTR. Вы можете использовать обычную версию, если хотите, но убедитесь, что вы не передаете формат в PSTR. Кроме того, аргументы находятся в массиве args. Если вы набрали «newcmd arg1 arg2», вы можете получить эти аргументы с помощью индексов args [0] и args [1]. Вы можете передать максимум MAX_ARGS аргументов, как определено в коде. Не стесняйтесь изменять это значение при перекомпиляции, если вам нужно передать сразу много аргументов. WriteLine и WriteRAM - это глобальные функции, которые возвращают одноименные методы UART. Второй аргумент этой функции неявный. Если вы ничего не передадите, после этого будет написана командная строка. Если вы передадите 0 в качестве второго аргумента, приглашение не будет записано. Это полезно, когда вы хотите написать несколько отдельных строк для вывода до того, как командная строка будет возвращена пользователю. 3. Заставьте оболочку выполнить код команды. Вы уже указали исполнителю оболочки выполнить метод cmdNewCmd при настройке новой команды, но добавьте его в файл shell.h, чтобы он был понят объектом оболочки. Просто добавьте его под последней командой или перед первой командой, или где-нибудь там. И все. Перекомпилируйте и загрузите прошивку на ваш Arduino, и ваша новая команда будет доступна из оболочки в командной строке.
Шаг 6: Резюме
Вы должны знать, как установить и подключиться к вашему AVR / Arduino и получить живую подсказку на вашем работающем микроконтроллере. Вы знаете несколько команд, которые извлекают данные времени выполнения из MCU или устанавливают значения в MCU на лету. Вам также было показано, как добавить свой собственный код для создания ваших собственных уникальных команд в оболочку для дальнейшей настройки ее для ваших собственных нужд. Вы даже можете выпотрошить интерпретатор команд, чтобы он содержал только ваши пользовательские команды, если это соответствует вашим потребностям. Надеюсь, вам понравились эти инструкции и что оболочка AVR может быть полезна для вас, либо как интерпретатор команд в реальном времени, либо в качестве учебного процесса по реализации вашего собственного. Как всегда, я с нетерпением жду любых комментариев или предложений о том, как это руководство может быть улучшено! Получайте удовольствие от своего AVR!
Рекомендуемые:
Как вывести из строя любой компьютер с помощью командного файла!: 10 шагов
Как вывести из строя любой компьютер с помощью командного файла!: Легко вывести из строя любой компьютер или ноутбук
Солнечная оболочка: 6 шагов
Solar Shell: это обновление одного из моих проектов двухлетней давности - conch screamer: https://www.instructables.com/id/Solar-Powered-Conch-Screamer/. Традиционное продувание раковины на закате здесь, на Мауи, только с помощью микроконтроллера. Э
IOT123 - СОЕДИНИТЕЛЬНЫЙ КОНТРОЛЬ ДАТЧИКА: ОБЩАЯ ОБОЛОЧКА ICOS10 (ПРОВОД ДЛЯ ПОДКЛЮЧЕНИЯ) Сборка: 4 шага
IOT123 - СОЕДИНИТЕЛЬНЫЙ КОНТРОЛЬ ДАТЧИКА: ОБЩАЯ ОБОЛОЧКА ICOS10 (ПРОВОД ДЛЯ ПОДКЛЮЧЕНИЯ) Сборка: ОБНОВЛЕНИЕ Для большей надежности мы рекомендуем использовать схему IDC (не ПОДКЛЮЧЕНИЕ). Этот узел HOOKUP подходит для некритичной работы, если у вас есть время проверить цепь. Я нашел несколько проводов (верхний слой панелей: красный / желтый) недолго
Чехол / оболочка из клейкой ленты для нового Ipod Nano: 5 шагов
Чехол для клейкой ленты / обложка для нового Ipod Nano: только что купили новый Ipod Nano? Круто, да? Теперь ты разорен? Ага прикинул. Хотите защитить свои вложения от вреда? Дешево? Так и думал. Читайте на Ipod любители. О, да, это моя заявка на конкурс универсальных станков лазерной резки и конкурс Homemade Holidays Con
Пароль для USB-накопителя без шифрования с помощью командного файла: 8 шагов
Пароль для USB-накопителя без шифрования с помощью командного файла: программа, которая не позволит пользователю использовать диск без пароля и покажет файл владельца, который вы можете изменить по своему желанию, это покажет вам, как с легкостью использовать созданную мной программу