При создании многоканальных систем регистрации данных, требуется передать относительно большое число измеренных параметров в персональный компьютер, где происходит их обработка и сохранение. Данная задача довольно просто решается на Ардуино (многоканальный вольтметр на Ардуино). Ограничением может быть разве что АЦП Ардуино, разрешения которого (10 бит) может оказаться не достаточно для решения некоторых задач. Поэтому, при необходимости, можно подключать внешний АЦП. Ведь любой электронный датчик преобразует измеряемую величину в напряжение электрического тока.
Проблема здесь заключается в том, что при большом числе измеряемых параметров и высокой частоте опроса датчиков (частоте дискретизации) необходимо успеть передать всю эту информацию через последовательный интерфейс RS-232 (и USB) в персональный компьютер. При текстовой передаче данных информационный пакет получается сильно раздутым и не фиксированной длины.
Ведь каждый разряд десятичного числа передается в виде одного байта данных, а значит занимает один пакет протокола RS-232 (или UART микроконтроллера). Это очень не экономичный способ передачи, так как вместо 10…16 бит, требуется передать до 32 бит данных, не считая спецсимволов! Из-за этого могут возникнуть непрогнозируемые потери данных. Поэтому такой метод возможен для целей отладки и при небольшой числе передаваемых параметров.
Ардуино для начинающих. Загрузка скетча на плату. Установка Arduino IDE
В данной статье рассмотрим решение задачи построения многоканальной измерительной системы на Ардуино. Её задачами является:
- Измерение аналоговых сигналов с датчиков (подключение Ардуино);
- Кодирование измеренных параметров в набор бит;
- Отправка на персональный компьютер (ПК) в виде набора бит по интерфейсу USB (Ардуино serial);
- Получение данных в программе Lazarus и выделение из него отправленных чисел;
- Визуализация полученных чисел в форме графика в зависимости от времени;
- Сохранение в текстовый файл.
Надо отметить, что в Интернет данная информация разрозненна и сложно найти скомбинированную информацию по этой задаче!
Как получить и передать сигнал в текстовом виде было описано в предыдущей статье. Также желательно ознакомится с подробными описаниями способов сохранения сигнала в текстовом и бинарном форматах.
Подключение Ардуино в среде Lazarus (язык pascal)
Сделано в последней на данный момент версии Lazarus 2.0.8 (в других вервиях возможны незначительное изменения)
Для доступа к последовательному порту будет использован модуль synaser. Файлы synaser.pas, synafpc.pas, synautil.pas, нужно поместить в папку с проектом.
Разработка интерфейса в Lazarus
Вначале необходимо создать пустой проект и настроить его в меню Проект -> Параметры проекта.
Сохранить проект в отдельной папке: Проект -> Сохранить проект как…
На форму поместить следующие элементы:
Arduino для начинающих. Начало работы
- TEdit (из вкладки Standart) — Edit1 для ввода имени файла
- TLabel (из вкладки Standart) — Label1 для отображения надписи «Файл», Label2 для отображения надписи «Порт»
- TButton (из вкладки Standart) — StartB для старта мониторинга порта, StopB для остановки мониторинга
- TToggleBox (из вкладки Standart) — RecTB кнопка с фиксацией для разрешения записи в файл
- TChаrt (из вкладки Chart)
Должно получиться так:
Рассмотрим вариант измерения на Ардуино двух параметров, по тому же принципу можно измерять большее число параметров.
Под каждый параметр нужно создать серию для визуализации: Правой кнопкой мыши по графику -> Редактор диаграммы -> Добавить -> График.
Настройка исходного кода Pascal
Теперь нужно создать обработку событий в исходном коде программы.
Понадобятся три процедуры:
- Инициализации procedure TForm1.FormShow(Sender: TObject);
В инспекторе объектов выбрать Form1 -> вкладка События -> OnShow (нажать …) Функция автоматически создается средой - Обработка нажания на кнопку Старт procedure TForm1.StartBClick(Sender: TObject);
На форме совершить двойное нажатие на кнопку StartB - Обработка нажания на кнопку Стоп procedure TForm1.StopBClick(Sender: TObject);
На форме совершить двойное нажатие на кнопку StopB
Для доступа к компонентам порта нужно дописать в раздел uses исходного кода модуля: synaser,jwawinbase, jwawinnt.
Затем нужно задать объект доступа к порту (ser: TBlockSerial;) и признак разрешения мониторинга порта (mon:boolean;). Все это объявляется в разделе глобальных переменных var (перед implementation).
Протокол передачи данных
Теперь необходимо принять протокол передачи информации. Например, такой:
- Начало посылки отмечается двумя байтами, заполненными логическими единицами, т.е. каждый равен 255 или B11111111. Так как принимаемые из АЦП числа 10 бит, то два байта (16 бит) они никогда не заполнят полностью и они не будут повторять выбранный маркер старта. 2. измерение первого канала, состоящее из двух байт целого числа без знака. Вначале передается первая (младшая) часть числа, а затем остаток старшая часть). Причем если число больше 16 бит, то нужно выделять большее число байт под него. Но в Ардуино 10 битный АЦП и 2 байта достаточно.
- Измерение второго канала по такому же принципу, что и первое.
- Если параметров больше — можно добавлять в посылку еще измерения. Разделять их нет необходимости, так как размер точно фиксирован в 2 байта.
Коротко протокол выглядит так: FFLHLH (где F — стартовый байт, L — младший байт, H — старший байт)
Можно сравнить экономичность данного протокола с текстовым для двух параметров: бинарный требует 48 бит, текстовый — до 80 бит. Т.е. даже в случае 2 параметров выигрыш в 32 бита, который будет расти с повышением числа каналов измерения!
Разработка функций обработки событий на Рascal
Программа должна работать с Ардуино, получить биты данных из порта и разделить их склеть их нужным образов в две переменые, исходя из заданного протокола передачи.
Полный исходный код Pascal модуля Lazarus с пояснениями представлен ниже:
Работа с Ардуино
Теперь нужно собрать тестовый макет на базе Ардуино. Здесь представлен пример на Arduino UNO, однако должно работать на всех базовых моделях.
Можно сделать подключение только одного датчика, а второй эмулировать программно.
Программирование Ардуино
В среде Arduino IDE необходимо создать новый проект: Файл -> Новый
Затем сохранить его: Файл -> Сохранить как…
Затем можно написать программу для микроконтроллера.
Данная программа должна через строго определенное время выполнять аналого-цифровое преобразование (АЦП) и отправлять посылку в порт по определенному выше протоколу. Внимание! Использование обычной задержки delay не обеспечивает пригодной точности задания частоты дискретизации.
Ниже представлен исходный код для Arduino, реализующий правильный алгоритм задания периода дискретизации. Он основан на вычислении времени, прошедшего с момента предыдущего измерения, привязавшись к внутреннему таймеру. Данный таймер стабилизирован кварцевым резонатором на плате Ардуино, поэтому достаточно точен.
//Обучающий модуль передачи многоканальных данных в ПК в бинарном виде. // (с) Роман Исаков, 2020 // (с) LabData.ru, 2020 // Объявление внешних подключений const int analogInPin = A0; // Разъем для подключения аналогового датчика const int Fs = 200; // Частота дискретизации сигнала (Гц) // Объявление переменных unsigned int sensorValue1 = 0; // Результат измерения 1 unsigned int sensorValue2 = 0; // Результат измерения 2 uint32_t ms_old = 0; // Время предыдущего измерения // Процедура инициализации void setup() < Serial.begin(19200); // Настройка скорости передачи на ПК (бод) pinMode( analogInPin, INPUT );// Настройка входа аналоговой части ms_old = millis(); // Инициализировать предыдущее время измерения текущим временем в мс >// Процедура отправки оного числа в порт void SendValue(unsigned int Value) < byte LB = 0, HB = 0; // Инициализировать переменные старшего и младшего байтов // Разбить число на два 8 битных пакета LB = Value // Выбор первых 8 бит из числа HB = Value >> 8; // Сдвинуть на 8 бит и записать первые из них Serial.write(LB); // Отправть на ПК младший байт Serial.write(HB); // Отправить на ПК старший байт > // Процедура формирования протокола передачи и отправки двух переменных в порт void SendPacket(unsigned int Value1, unsigned int Value2) < // Сфомировать протокол передачи Serial.write(B11111111); // Стартовый байт 1 Serial.write(B11111111); // Стартовый байт 2 SendValue(Value1); // Первое число SendValue(Value2); // Второе число // можно добавлять еще. >// Главный цикл работы void loop() < if (millis()-ms_old >= (1000/Fs)) < // Ожидание периода дисткретизации sensorValue1 = analogRead(analogInPin); // Провести АЦП sensorValue2 = round(random(0,500)); // Сгенерировать параметр (якобы второй датчик) ms_old = millis(); // Сразу после АЦП нужно отметить время измерения SendPacket(sensorValue1, sensorValue2); // Запуск передачи >>
После этого нужно подключить макет к персональному компьютеру и не забыть выбрать правильный порт Инструменты -> Порт, а также используемую версию Ардуино: Инструменты -> Плата.
Если при загрузке не возникло ошибок, можно проверить выходные данные в мониторе порта среды Ардуино (выбрать частоту передачи 19200). Должна пойти одна строчка, состоящая из непонятных символов, включая буквы «я» (это стартовые биты). Значит микроконтроллер передает данные!
Тестирование системы
Затем можно проверить программу в Lazarus (не забыв закрыть монитор порта!).
Здесь изображено подключение ардуино к потенциометру (датчик).
Если нажималась Запись, то в папке с проектом появится файл data.csv. Его можно открыть в текстовом редакторе или в табличном процессоре типа Excel.
Все работает!
Кстати, есть модифицированные варианты Ардуино, которые имеют более точный АЦП!
При возникновении вопросов, пишите в комментариях здесь или в сообществе ВК!
- ← Система для быстрой оценки функционального состояния организма человека
- Какая маска лучше всего защитит от коронавируса? →
Источник: labdata.ru
Про Ардуино и не только
Есть у меня пара идей для будущих публикаций, но в них будет использоваться программатор. Поэтому сегодня я расскажу о том, как превратить Ардуино в ISP программатор, для чего он нужен и как им пользоваться. А в качестве примера будет описана процедура прошивки загрузчика в Ардуино.
Что такое ISP?
ISP (In-System Programming) расшифровывается как внутрисхемное программирование. Это технология, которая позволяет программировать микроконтроллер, установленный в устройство. До появления этой технологии микроконтроллеры программировались перед установкой в устройство, а для их перепрограммирования требовалось их извлечение из устройства.
Существует 2 основных подхода внутрисхемного программирования:
- С использованием программатора. В этом случае программатор работает напрямую с памятью микроконтроллера, самостоятельно размещая байты прошивки по нужным адресам. Микроконтроллер в этом процессе не участвует.
- С использованием загрузчика. Загрузчик, он же бутлоадер (от английского bootloader) — это программа, записанная обычно в конце ПЗУ микроконтроллера, которая берет на себя функции программатора. При включении микроконтроллера управление сначала передается загрузчику. Он проверяет наличие определенных условий, сообщающих о необходимости перейти в режим программирования. Если условия не выполнены, то управление передается основной программе, в противном случае загрузчик принимает данные по заранее определенному интерфейсу и размещает их в ПЗУ. Таким образом микроконтроллер перепрограммирует сам себя.
Одной из важнейших особенностей Ардуино является возможность программирования непосредственно через USB порт, без дополнительного программатора. Сразу после включения Ардуино запускается загрузчик, который работает несколько секунд. Если за это время загрузчик получает команду программирования от IDE по последовательному интерфейсу UART, то он принимает и загружает новую программу в память микроконтроллера.
Использование загрузчика существенно упрощает процесс перепрограммирования микроконтроллера, что особенно полезно при отладке. Но за удобство приходится платить. Во-первых, загрузчик занимает часть ПЗУ и для программы пользователя остается меньший объем памяти. Во-вторых, загрузчик не может изменить Fuse-биты и Lock-биты (в отличие от программаторов).
Ну и, конечно, не обойтись без программатора, если вы хотите обновить бутлоадер или загрузить его в чистый МК. Таким образом существует ряд задач, которые могут быть выполнены только с использованием программатора. Если же у вас нет аппаратного программатора, то вместо него можно воспользоваться Ардуино, о чем и будет рассказано дальше.
Arduino as ISP. Прошивка загрузчика в Ардуино.
Итак, мы решили превратить Ардуино в программатор. Для примера попробуем прошить загрузчик в целевую плату Ардуино. Сначала подготовим плату, которую будем использовать в качестве программатора. Для этого загрузим в нее скетч ArduinoISP, его можно найти в стандартных примерах:
Теперь подсоединим к ней плату, в которую хотим прошить загрузчик. При прошивке используются линии SPI (Serial Peripheral Interface — последовательный периферийный интерфейс). Выводы MOSI, MISO и SCK обеих плат должны быть соединены, а вывод SS Ардуино-программатора подключается к выводу Reset целевой платы. И еще 2 провода нужны чтобы запитать целевую плату.
Также может потребоваться предотвратить автоматическую перезагрузку платы-программатора, для этого между ее выводами Reset и GND нужно установить электролитический конденсатор на 10мкФ. Сначала можно попробовать без конденсатора, если же прошивка не начнется, то попробуйте добавить в схему конденсатор. По моим наблюдениям конденсатор нужен при использовании дешевых Ардуино-клонов (без контроллера ATmega8u2) в качестве программатора.
Если мы работаем с двумя платами Arduino Uno, то схема их подключения может выглядеть следующим образом:
Если используются не Uno, а другие платы Ардуино, то перед подключением программатора к целевой плате необходимо уточнить расположение на них выводов MOSI, MISO и SCK. Их расположение для различных плат приведено ниже в таблице. Как вы можете видеть, не на всех платах Ардуино линии SPI мультиплексированны с цифровыми выводами, поэтому для подключения к данному интерфейсу необходимо использовать разъем ICSP. Ниже показан пример подключения Uno в качестве программатора к плате Nano через ICSP разъем.
Uno, Duemilanove | 11 или ICSP-4 | 12 или ICSP-1 | 13 или ICSP-3 | 5В |
Nano | 11 или ICSP-4 | 12 или ICSP-1 | 13 или ICSP-3 | 5В |
Pro Mini | 11 | 12 | 13 | 3.3В или 5В |
Mega1280, Mega2560 | 51 или ICSP-4 | 50 или ICSP-1 | 52 или ICSP-3 | 5В |
Leonardo | ICSP-4 | ICSP-1 | ICSP-3 | 5В |
Due | ICSP-4 | ICSP-1 | ICSP-3 | 3.3В |
Zero | ICSP-4 | ICSP-1 | ICSP-3 | 3.3В |
101 | 11 или ICSP-4 | 12 или ICSP-1 | 13 или ICSP-3 | 3.3В |
![]() |
Подключение Uno в качестве программатора к плате Nano через ICSP |
Обратите внимание на нумерацию выводов ICSP платы Nano: она начинается с правого нижнего угла. Поэтому на приведенной схеме Arduino Nano перевернута.
Теперь необходимо вернуться в Arduino IDE и изменить в ней параметры:
- В меню Инструменты > Плата выбираем вариант, соответствующий нашей целевой плате.
- В меню Инструменты > Программатор выбираем Arduino as ISP.
Резюмируя вышеописанное, выделим основные шаги для прошивки загрузчика с использованием Ардуино в качестве ISP программатора:
- Запускаем Arduino IDE, открываем из примеров скетч ArduinoISP и загружаем его в плату Ардуино, которую будем использовать как программатор.
- Подключаем к Ардуино-программатору целевую плату по приведенной схеме.
- Меняем плату в Arduino IDE на целевую.
- Выбираем в IDE программатор Arduino as ISP.
- Записываем загрузчик в целевую плату командой из меню IDE.
Прошивка скетча с использованием Arduino as ISP
Еще один пример использования программатора — это загрузка скетча в целевую плату. Разумеется, это проще сделать привычным способом, подключив ее напрямую к компьютеру, но это может оказаться невозможным, например, при выходе из строя контроллера ATmega8u2/ATmega16u2 или преобразователя USB/UART. Если при этом основной микроконтроллер Ардуино остался рабочим, то мы можем прошить его, используя программатор. Для этого выполняем все шаги, описанные выше, но на последнем этапе вместо записи загрузчика необходимо:
- Открыть в Arduino IDE интересующий скетч.
- Загрузить скетч в целевую плату командой из меню IDE: Скетч > Загрузить через программатор.
Источник: tsibrov.blogspot.com
#13.1. Arduino SD карта. Создаем, удаляем файлы. Чтение, запись файлов.
Во втором уроке просвещенном работе с SD картой . Научимся создавать и удалять файлы с помощью Arduino. Также запишем информацию в файл и считаем её. Как получить информацию о карте памяти и файлах хоронящихся на карте смотрите в предыдущем уроке: Урок13. Библиотека SD Arduino. Выводим информацию о SD карте.
Для роботы нам понадобится библиотека SD.h которую можно установить через менеджер библиотек.
Для урока нам понадобиться:
Подключаем SD-модуль к Arduino UNO по такой схеме.
Давайте создадим файл на флешке, для этого используется функции SD.open(). Которая открывает файл на SD карте. Если файл открывается для записи, и если он еще не существует, то он будет создан (но содержащий его каталог уже должен существовать).
Remove() — Удаляет файл.
SD.exists() — проверяет существует ли файл.
Простой пример скетча для создания и удаления файлов с помощью библиотеки SD.
#include #include File myFile; // Измените это в соответствии с вашей платой расширения или модулем; const int chipSelect = 4; void setup() < // Открыть последовательное соединение и ждать открытия порта: Serial.begin(9600); Serial.print(«Initializing SD card. «); if (!SD.begin(chipSelect)) < Serial.println(«initialization failed!»); while (1); >Serial.println(«initialization done.»); // проверим есть ли такой файл на флешке if (SD.exists(«example.txt»)) < Serial.println(«example.txt Есть такой. «); >else < Serial.println(«example.txt нет. «); >// открыть новый файл и немедленно закрыть его Serial.println(» Создаем example.txt. «); myFile = SD.open(«example.txt», FILE_WRITE); myFile.close(); // проверить, существует ли файл: if (SD.exists(«example.txt»)) < Serial.println(» example.txt Есть такой. «); >else < Serial.println(«example.txt нет.»); >// удалить файл: Serial.println(» Удаляем example.txt. «); SD.remove(«example.txt»); if (SD.exists(«example.txt»)) < Serial.println(» example.txt есть такой. «); >else < Serial.println(» example.txt нет. «); >> void loop() < // после завершения настройки ничего не делать. >
После загрузке в мониторе порта мы увидим вот такую информацию.
Сперва мы проверяем на существование файла, создаем файл. Проверяем еще раз, что файл создан. Удаляем файл. И проверяем, что файла больше нет на карте памяти.
Если нам не нужно удалять файл, можно закомментировать строку отвечающую за удаления и уведомления, что будем удалять файл тоже лучше закомментировать.
// удалить файл: // Serial.println(» Удаляем example.txt. «); // SD.remove(«example.txt»);
Сейчас наш файл создан и не удален. С ним можно работать.
Давайте создадим файл и запишем информацию в него. Код будит не очень сильно измене.
#include #include File myFile; // Измените это в соответствии с вашей платой расширения или модулем; const int chipSelect = 4; void setup() < // Открыть последовательное соединение и ждать открытия порта: Serial.begin(9600); Serial.print(«Initializing SD card. «); if (!SD.begin(chipSelect)) < Serial.println(«initialization failed!»); while (1); >Serial.println(«initialization done.»); // Открыть файл. Обратите внимание, что в какой-либо момент может быть открыт только один файл, // поэтому вы должны закрыть один файл перед открытием следующего. myFile = SD.open(«test.txt», FILE_WRITE); // если файл открыт, то записать в него: if (myFile) < Serial.print(» Запись в файл test.txt. «); myFile.println(» Текст: 1, 2, 3.»); // закрыть файл: myFile.close(); Serial.println(«Ok.»); >else < // если файл не открыт, то вывести сообщение об ошибке: Serial.println(«ошибка открытия test.txt»); >// снова открыть файл для чтения: myFile = SD.open(«test.txt»); if (myFile) < Serial.println(«test.txt:»); // читать из файла, пока в нем ничего не останется: while (myFile.available()) < Serial.write(myFile.read()); >// закрыть файл: myFile.close(); > else < // если файл не открыт, то вывести сообщение об ошибке: Serial.println(«ошибка открытия test.txt»); >> void loop() < // после завершения настройки ничего не делать. >
В мониторе порта мы увидим, что файл создан и удачно сохранился наш текст.
Если перезагрузить Arduino. То текст запишется еще раз в файл.
Это отличное решение для сохранения показаний с датчика.
Файл на карте памяти выглядит вот так.
Не забывайте подписываться на канал Youtube и вступайте в группы в Вконтакте и Facebook.
Всем Пока-Пока. И до встречи в следующем уроке.
Понравилась статья? Поделитесь ею с друзьями:
Источник: portal-pk.ru