как считать код с ардуино

Есть ли способ скачать скетч из Arduino?

Я сделал эскиз, но потом потерял его. Тем не менее, я загрузил его в Arduino, прежде чем потерять его. Можно ли как-нибудь вернуть его обратно?

Это должно быть возможно, пока бит безопасности не установлен. Этот вопрос был задан на EE некоторое время назад.

Но вы не получите код Arduino, который вы написали обратно. Код скомпилирован в сборку, и вам придется преобразовать его обратно в C самостоятельно.

Этот ответ не дает прямого ответа на вопрос, но все равно приведет к тому же конечному результату.

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

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

Кроме того, по умолчанию Crashplan, Backblaze и Time Machine выполняют резервное копирование этих расположений, поэтому даже если они были удалены, они все равно могут находиться в резервной копии.

Преимущество здесь в том, что вы будете восстанавливать код C, а не ASM.

Вы можете скачать шестнадцатеричный дамп файла, но нет простого способа получить весь код C ++ и комментарии. Если вы понимаете сборку, вы можете пересоздать программу, но это займет некоторое время. Для некоторых устройств доступны дизассемблеры, я не знаю насчет arduino.

Я думаю, что есть другой способ сделать это, не извлекая код из платы Arduino. Поменяйте дату создания эскиза и найдите его в C: \ Users \ User \ AppData \ Local \ Temp \ (например: C: \ Users \ User \ AppData \ Local \ Temp \ untitled4390292704786567977.tmp \ sketch_jan19a). Вы можете найти свой несохраненный код, если он не был удален какой-либо «программой освобождения места». Удачи!

Если ваша цель не состоит в том, чтобы просто скопировать идентичный код на другое устройство, простой ответ: нет

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

Например (когда вы скопировали код с устройства обратно на диск):

Запустите на одном из файлов загрузчика я получаю эти результаты (частично):

Как видите, не особенно полезно для воспроизведения того, что сделал ваш эскиз. Вероятно, будет один из двух сценариев:

Источник

Монитор порта, отладка

Как мы с вами знаем из урока “О платформе“, на платах Ардуино стоит USB-TTL конвертер, позволяющий микроконтроллеру в текстовом режиме “консоли” общаться с компьютером по последовательному интерфейсу, Serial. На компьютере создаётся виртуальный COM порт, к которому можно подключиться при помощи программ-терминалов порта, и принимать-отправлять текстовые данные. Через этот же порт загружается прошивка, т.к. поддержка Serial является встроенной в микроконтроллер на “железном” уровне, и USB-TTL преобразователь подключен именно к этим выводам микроконтроллера. На плате Arduino Nano это кстати пины D0 и D1.

К этим же пинам можно подключаться при помощи отдельных плат “программаторов”, например на чипах CP2102 или том же CH340 с целью загрузки прошивки или просто общения с платой. В самой Arduino IDE тоже есть встроенная “консоль” – монитор порта, кнопка с иконкой лупы в правом верхнем углу программы. Нажав на эту кнопку мы откроем сам монитор порта, в котором будут настройки:

Если с отправкой, автопрокруткой, отметками времени и кнопкой “очистить вывод” всё понятно, то конец строки и скорость мы рассмотрим подробнее:

Объект Serial

Запустить связь по Serial на скорости speed (baud rate, бит в секунду). Скорость можно поставить любую, но есть несколько “стандартных”. Список скоростей для монитора порта Arduino IDE:

Отправляет в порт значение val – число или строку. В отличие от write выводит именно символы, т.е. отправив 88 вы получите 88: Serial.print(88); выведет 88. Также метод print/println имеет несколько настроек для разных данных, что делает его очень удобным инструментом отладки:

format позволяет настраивать вывод данных: BIN, OCT, DEC, HEX выведут число в соответствующей системе исчисления, а цифра после вывода float позволяет настраивать выводимое количество знаков после точки

Читает данные из буфера и ищет набор символов target (тип char), опционально можно указать длину length. Возвращает true, если находит указанные символы. Ожидает передачу по таймауту

Плоттер

Помимо монитора последовательного порта, в Arduino IDE есть плоттер – построитель графиков в реальном времени по данным из последовательного порта. Достаточно отправить значение при помощи команды Serial.println(значение) и открыть плоттер по последовательному соединению, например построим график значения с аналогового пина A0:

Читайте также:  коды на парагоны в скайриме

Плоттер поддерживает несколько линий графиков одновременно, для их отображения нужно соблюдать следующий протокол отправки данных: значение1 пробел_или_запятая значение2 пробел_или_запятая значение3 пробел_или_запятая значениеN перенос_строки, то есть значения выводятся в одну строку, одно за другим по порядку, разделяются пробелом или запятой, и в конце обязательно перенос строки. Давайте выведем несколько случайных величин:

Вывод значений происходит каждые 10 миллисекунд, а каждые 300 миллисекунд значения обновляются. Получаем вот такой график: В Arduino IDE с версии 1.8.10 добавили возможность подписать графики, для этого перед выводом нужно отправить названия в виде название 1, название 2, название n с переносом строки, и дальше просто выводить данные:

Использование пинов

Как я писал выше, аппаратный Serial имеет выводы на ноги микроконтроллера, для Nano/Uno/Mini это выводы D0 и D1. Можно ли работать с этими пинами, как с обычными цифровыми пинами? При отключенном Serial – можно, при включенном – нет. После вызова Serial.begin() ноги перестают функционировать как цифровые пины в ручном режиме, но после вызова Serial.end() можно снова ими пользоваться!

Отправка и парсинг

Рассмотрим самый классический пример для всех языков программирования: Hello World! Отправка данных в порт не должна вызывать трудностей и вопросов, потому что всё понятно/очевидно, да и чуть выше в описании метода print мы рассмотрели все варианты вывода. Отправка в порт позволяет узнать значение переменной в нужном месте программы, этот процесс называется отладка. Когда код работает не так, как нужно, начинаем смотреть, где какие переменные какие значения принимают. Или выводим текст из разных мест программы, чтобы наблюдать за правильностью (порядком) её работы. Давайте вспомним урок циклы и массивы и выведем в порт массив:

Вывод: 0 50 68 85 15 214 63 254 – элементы массива, разделённые пробелами! Проблемы возникают при попытке принять данные в порт. Дело в том, что метод read() читает один символ, даже если вы отправите длинное число – программа получит его по одной цифре, и составлять число из цифр придётся вручную. Проблема усугубляется тем, что read() читает именно символ, то есть код символа в таблице ASCII. Посмотрим вот такой пример, в котором в порт отправляются принятые в него данные (так называемое эхо):

Так как же принять именно цифру? Есть хитрость – вычитать из полученного кода символа код цифры 0, либо сам 0 в виде символа: ‘0’

Также для принятия одиночных чисел у нас есть готовый метод – parseInt() / parseFloat() – для целочисленных и рациональных чисел соответственно. Процесс приёма и расшифровки данных называется парсинг (parsing). Давайте примем в порт число 1234, используя готовый метод парсинга.

Теперь после отправки цифры программа будет ждать всего 50 мс, и сразу же вам ответит. Остальные алгоритмы отправки и парсинга, в том числе обмена разнотипными данными между Ардуинами и другими платами смотри в уроке общение по Serial.

Управляющие символы

Существуют так называемые управляющие символы, позволяющие форматировать вывод. Их около десятка, но вот самые полезные из них

Также если для вывода вы захотите использовать одинарные или двойные кавычки, или обратный слэш \ – нужно выводить их при помощи соответствующего спецсимвола, иначе ваш вывод “поломается”, я думаю, не нужно объяснять, почему:

Как использовать? Просто писать в вывод. Например комбинация \r\n переведёт строку и вернёт курсор в левое положение:

Результат скопируем и вставим в excel Удобно!

Видео

Источник

Чтение цифрового входа и вывод результатов на монитор

Аппаратное обеспечение:

Электрическая цепь:

Соедините три провода с Arduino. Первые два (красный и черный) присоедините к двум длинным вертикальным рядам на краю макетной платы для получения доступа к 5 вольтам питания и земли. Третий вывод идет от цифрового вывода 2 к одному из выводов кнопки. Этот же вывод кнопки подсоединен через стягивающий резистор (10кОм) к земле. Второй вывод кнопки подсоединен к 5 вольтам питания.
При нажатии кнопки соединяются две точки цепи. Когда кнопка не нажата нет никакой связи между двумя ее выводами, так что вывод подключен к земле через стягивающий резистор и находится в состоянии LOW. При нажатии на кнопку устанавливается соединение между двумя выводами, подключается 5 вольт и вывод 2 переходит в состояние HIGH, или 1.
Если не использовать резистор и оставить вывод 2 неподключенным, то напряжение на нем будет изменяться хаотично. Это приведет к случайному формированию на выводе 2 напряжения высокого или низкого уровня. Поэтому необходим стягивающий резистор.

Читайте также:  коды на нпс готика 2 возвращение

Схема:


Первым делом нужно в функции настройки включить последовательную передачу данных между ПК и Arduino со скоростью 9600 бит в секунду следующей строкой:
Serial.begin(9600);

Далее инициализируем вывод 2. Он должен читать состояние кнопки, тобто быть настроенным как вход:
pinMode(2,INPUT);

Теперь, когда установки завершены, переходим к основному циклу вашего кода. Когда кнопка нажата, 5 вольт будут свободно проходить через цепь, а когда она не нажата вход будет соединен с землей через резистор 10 кОм. Это цифровой вход, а значит он может быть только во включенном состоянии (читается вашим Arduino как 1 или HIGH) или в выключенном состоянии (читается вашим Arduino как 0 или LOW). Промежуточных состояний не существует.
Первое что нужно сделать в основном цикле это создать переменную для хранения информации поступающей от кнопки. Поскольку сигнал, приходящий от кнопки может иметь только значения «1» или «0», вы можете использовать целочисленный тип данных int. Назовем эту переменную sensorValue и присвоим ей значение, равное значению считанному с входа 2. Вы можете сделать это с помощью следующей строки:
int sensorValue = digitalRead(2);

Как только Arduino считает значение на входе мы передадим его в ПК и выведем на экран как десятичное значение. Вы можете сделать это используя команду Serial.println(), как показано в следующей строке:
Serial.println(sensorValue);

Теперь, когда вы откроете ваш монитор последовательной передачи (Serial Monitor в среде Arduino), вы сможете увидеть последовательность нулей, когда кнопка разомкнута и последовательность единиц, когда кнопка замкнута.

Полный текст программы:

Читает состояние цифрового входа 2, выводит результат на монитор

// цифровой вход 2 присоединен к кнопке. Назовем его:

int pushButton = 2;

// проведем необходимые установки:

void setup() <

// инициализируем последовательную передачу данных со скоростью 9600 бит в секунду:

Serial.begin (9600);

// назначим вывод 2 входом:

pinMode (pushButton, INPUT);

void loop() <

// читаем значение на входе:

int buttonState = digitalRead(pushButton);

Serial.println (buttonState);

delay (1); // задержка для стабильного считывания

Источник

Чтение данных из последовательного порта. Урок 6. Ардуино

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

Отдельное питание сервопривода

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

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

В этой статье рассмотрим методы объекта Serial, их использование и примеры кода для реализации программ. Также соберем простую схему с сервоприводом и будем управлять ей с помощью монитора последовательного порта в ардуино ide.

Мы уже делали схему управления сервоприводом с помощью потенциометра, в одном из предыдущих уроков. Пожалуйста, посмотрите его, если пропустили.

Для выполнения этого урока нам понадобятся

Serial.read()

Команды Serial.print() и Serial.println() мы уже знаем. Они записывают данные в последовательный порт. Команда для чтения данных, как не трудно догадаться — Serial.read().

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

Тип данных будет int.

Хитрость этой функции, с которой обязательно придется столкнуться в том, что она считывает именно байт информации и представляет его в виде кода символа из таблицы ASCII. Это значит, если вы введете слово из 5 букв, то каждый символ будет считан отдельно и его код из таблицы будет выведен в монитор последовательно. Например, код символа 0 — это 48, А код символа F — это 70. Причем только в десятичной системе счисления. Естественно, с символами Кириллицы все еще сложнее.

Попробуем загрузить в ардуино несколько примеров.

Serial.available()

Эта функция получает доступную для чтения из последовательного порта информацию. Максимум в буфере может быть до 64 байт. Эта те данные, которые записаны в порт и ожидают чтения. Следовательно, это удобно использовать для проверки последовательного порта на готовность к чтению. Если функция возвращает состояние отличное от 0, значит можно получить данные из порта. Попробуйте загрузить такой скетч в ардуино и проверить монитор порта.

Читайте также:  карта ленты фото штрих код

Serial.readString()

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

Serial.parseInt()

Эта функция ищет целое число во входном потоке. Если число не было введено, выведет 0. Если ввести строку знаков, в которой будут числа, выведет только числа.

Принципиальная схема подключения мотора для записи данных в порт

Программа

Ок. Давайте попробуем собрать схему и написать программу управления сервоприводом на основе данных вводимых в последовательный порт.

Программа будет принимать данные из порта, анализировать их, и если данные подходят для сервопривода отправлять на привод угол для перемещения вала.

В простейшем варианте такой программы используем функцию Serial.parseInt() чтобы получить только цифру и установить ее на сервопривод. Не забудьте ограничить максимальное и минимальное значение переменной функцией constrain().

Но, что если мы хотим принимать не только числовые данные, но и обрабатывать строковые команды. Тогда необходимо принимать все символы и обрабатывать их. Воспользуемся функцией Serial.readString(), чтобы организовать чтение данных из последовательного порта.

Затем сравним строку с несколькими значениями, которые уже будут внесены в программу. Если ни одна текстовая команда не подойдет, попробуем преобразовать строку в число и передать на сервомотор.

Сервопривод управляется из последовательного порта

Полный текст программы

Заключение

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

Источник

Считывание показаний датчиков с помощью Arduino

Легкость, с которой Arduino может получить значения с датчиков, является одной из особенностей, которая делает эти платы такими полезными.

Датчики – это устройства, которые преобразуют физические величины, например, яркость света или температуру, в электрическую величину. Например, термопара выдает напряжение, пропорциональное её температуре. Существует множество различных датчиков:

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

Эксперимент 1: датчик расстояния

В этом эксперименте мы будем использовать датчик расстояния Sharp GP2Y0A21YK для управления яркостью светодиода.

Инфракрасный (IR) датчик SHARP

Необходимые комплектующие

Схема соединений

Датчик расстояния Sharp может обнаруживать объекты на расстояниях от 10 до 80 см. Он излучает импульс инфракрасного света, а затем определяет угол, на котором отражается этот свет. Чем дальше объект, тем ниже выходное напряжение. Если датчик не принимает отраженный свет, то напряжение на его выходе составит 0 В. Если объект находится на расстоянии 10 см или ближе, выходное напряжение будет равно 5 В (в этом эксперименте мы подаем на датчик напряжение питания 5 В).

Выход датчика подключается к аналоговому входу Arduino. Аналого-цифровой преобразователь (ADC) Arduino затем преобразует это напряжение в значение от 0 до 1023. Затем это значение преобразуется в значение от 0 до 255, и это число используется для установки коэффициента заполнения сигнала на широтно-модулированном (ШИМ) выходе, который управляет яркостью светодиода. В результате, чем ближе объект к датчику расстояния, тем ярче светит светодиод.

Видео

Эксперимент 2: датчик температуры

В этом эксперименте Arduino будет измерять температуру с помощью микросхемы датчика LM35. LM35 – это низковольтная микросхема, которая требует питания постоянным напряжением от +4 до +20 вольт. Это идеально, потому что мы можем подключить датчик к выводу +5V на плате Arduino. LM35 имеет всего 3 вывода: два для питания и один для аналогового выхода. Выходной вывод представляет собой аналоговый выход, напряжение на котором линейно пропорционально температуре в градусах Цельсия. Выходной сигнал находится в диапазоне от 0 до 1,5 вольта. Выходное напряжение 9 В соответствует температуре 0°C, и при каждом повышении температуры на один градус оно увеличивается на 10 мВ. Чтобы преобразовать выходное напряжение в температуру, вам необходимо просто разделить выходное напряжение в мВ на 10. Например, если выходное напряжение равно 315 мВ (0,315 В), температура равна 31,5°C.

Назначение выводов микросхемы LM35

Необходимые комплектующие

Схема соединений

Выходной вывод LM35 (вывод 2) подключен к выводу A0 Arduino. Код использует функцию analogRead() для преобразования выходного напряжения в число между 0 и 1023. Умножение этого числа на 0.48828125 преобразует его в градусы Цельсия, которые и отображаются в мониторе последовательного порта.

Видео

Источник

Онлайн платформа