03:59 Ардуино пишет письма. часть 2 ( Arduino, Processing, Serial, E-mail) |
Вторая часть. Исходя из нашего плана в первой части, следующее что нам нужно - это принимать данные с последовательного порта в наш компьютер. Для этого мы будем использовать язык PROCESSING. Это родственник ARDUINO IDE, поэтому не должно возникнуть сложностей в его освоении. Он открытый (Open Sourse), и бесплатный (Free). Конечно же желающие могут поддержать и внести свой вклад в его развитие. Скачать PROCESSING можно с официального сайта. Там же можно найти много полезной информации. Мы надеемся что вы самостоятельно сможете скачать и запустить среду PROCESSING. Если наши надежды напрасны, возвращайтесь после прокачки данных параметров. Надеемся вы не разобрали проект с прошлой части. И в Ардуино залит правильный скетч. Запускаем PROCESSING. Ни чего настраивать не надо. Все работает и так. В появившемся окне пишем следующее, кстати программа на PROCESSING тоже называется скетч. import processing.serial.*; // Импортируем библиотеку ПОСЛЕДОВАТЕЛЬНОГО ПОРТА Serial Myport; // Создаем объект Myport. Serial указывает на тип объекта. // Типы объектов схожи с типами переменных, только более продвинутые. // Если понимаете о чем речь. Если нет, это и не важно, пока. void setup() { Myport = new Serial ( this, "COM17", 9600); // Создаем новый ПОСЛЕДОВАТЕЛЬНЫЙ ПОРТ // COM17 это имя USB (эмулированного COM) порта на котором висит Ардуино. // 9600 это скорость передачи. // Скорость должна быть одинаковой в Ардуино и здесь. 9600 довольно распространенное значение. } void draw() { print (Myport.readStringUntil('\n')); // Печатаем в консоль данные с ПОСЛЕДОВАТЕЛЬНОГО ПОРТА } Создавая новый Serial (последовательный) порт нам необходимо указать его физическое имя. То есть имя порта (USB) к которому подключен Ардуино. Оно указано в правом нижнем углу ARDUINO IDE. Теперь подключим плату и запустим скетч на PROCESSING. Именно в таком порядке. Сначала подключаем Ардуино, после запускаем скетч. В консоль (КОНСОЛЬ - это черный прямоугольник под редактором кода) PROCESSING начинаем получать данные от Ардуино. ВОТ ТАК... ИЛИ ТАК... Почему может быть разный результат? Причина этого - задержка в выполнении программы на Ардуино. Во многих тестовых скетчах для температурных датчиков присутствует задержка выполнения программы. Это строка delay ( [количество миллисекунд] ). Введенная для замедленного отображения данных в МОНИТОРЕ ПОРТА, для удобного чтения информации. И если в вашем скетче на Ардуино нет этой задержки то в консоли последовательно выводятся данные температуры. А если задержка присутствует это приводит к тому, что наша программа на PROCESSING считывает данные чаще, чем их предоставляет Ардуино. И поэтому вместо ожидаемых цифр мы видим null - то есть ничего (Словом null обозначается ничего, не путать с нулём). Нас устраивают оба результата. Но прежде чем продолжать обратим внимание на следующее: 1) Если запустим скетч на PROCESSING прежде чем подключим Ардуино - это вызовет ошибку и зависание приложения. 2) Если Ардуино будет подключен в другой USB - это также вызовет ошибку. На стадии разработки приложения с этим можно мериться. Но нам придется к этому возвращаться, так как подобные ошибки недопустимы в скомпилированном приложении. Тем более очень маловероятно что пользователь нашего приложения будет использовать то же USB (COM) что и мы, да и у вас COM порт скорее всего отличается от нашего. Поэтому нам нужно будет автоматически определять подключена ли Ардуино, и если да, то к какому USB (COM порту). Вернемся к этому чуть позже. Пока продолжим, далее по плану - создание окна приложения. Окно приложения в PROCESSING создается автоматически и при прошлых запусках скетча вы наверняка его видели. Оно создавалось, но нами не использовалось. Запустим на PROCESSING код приведенный ниже. Предполагается что Артуино подключен к компьютеру и ошибки последовательного порта не возникнет. import processing.serial.*; int temperature = 0; Serial Myport; void setup() { size(400,300); Myport = new Serial ( this, "COM17", 9600); Myport.bufferUntil('\n'); textSize(100); textAlign(CENTER); } void draw() { background(0); text (temperature + "°C",200,200); } void serialEvent (Serial Myport) { temperature = int (Myport.readStringUntil('\n')); } Если вы не скопировали код программы, а переписываете вручную, что для новичков желательно. Для вас может оказаться загадкой как писать знак градусов [ ° ]. Для этого нужно удерживая ALT на дополнительной клавиатуре ввести 0176 и отпустить ALT. Результат выполнения программы. Теперь разберем код построчно. Кто уже разобрался или не желает разбираться, может переходить к следующей части. Все остальные... - продолжаем. import processing.serial.*; Этой строкой мы импортируем программные компоненты которые будут участвовать в создании СЕРИАЛ СОЕДИНЕНИЯ. Мы их не увидим в программе, но они безусловно нужны. int temperature = 0; Далее мы создаем целочисленную переменную TEMPERATURE и присваиваем ей значение НОЛЬ. Тип INT указывает на то, что переменная будет в себе хранить целые числа. INT - это сокращение от INTEGER, что переводится как ЦЕЛОЕ. Serial Myport; Здесь мы создаем объект MYPORT. И подобно переменной, тип SERIAL указывает на принадлежность объекта. MYPORT - это имя переменной и может быть любым. Если последовательных портов будет несколько, для удобства лучше давать осмысленные имена. Так наш порт мы могли бы назвать TERMOMETR. Далее функция VOID SETUP. В ней задаются стартовые установки приложения. Так же программным вызовом этой функции можно организовать РЕСТАРТ приложения, например при сбое. size(400,300); Этим оператором задаем размер окна нашего приложения в пикселях. 400 это ширина, 300 это высота. Myport = new Serial ( this, "COM17", 9600); Здесь мы назначаем нашему MYPORT задачу. Создаем из него последовательный порт. COM17 - это имя порта, оно должно совпадать с именем USB куда подключен Ардуино. 9600 - это скорость передачи информации. 9600 самое распространенное значение для проводных соединений такого рода. THIS - переводится - ЭТОТ. Это "родитель" порта (обычно используется именно THIS). Myport.bufferUntil('\n'); Устанавливаем символ, после получения которого будет срабатывать SERIAL EVENT. В нашем случае это -"перевод строки". textSize(100); Устанавливаем размер шрифта, которым будем выводить информацию на экран. textAlign(CENTER); Этим оператором определяем выравнивание текста. Относительно какой точки он будет располагаться в окне приложения. Далее следует функция VOID DRAW. Так называемый основной цикл. операторы внутри него выполняются по очереди, без перерыва. background(0); Задаем цвет фона. В данном синтаксисе доступны значения от 0 (черный) до 255 (белый). text (temperature + "°C",200,200); Пишем текст на экране. Выводим значение переменной TEMPERATURE, следом за ней печатаем символ градусы Цельсия. + это логическое И. За ним идут координаты точки окна нашего приложения, в которой будет размещен данный текст. void serialEvent (Serial Myport) { temperature = int (Myport.readStringUntil('\n')); } Последним в нашем скетче стоит функция SERIAL EVENT. Она выполняется когда на последовательный порт поступает что-то отличное от NULL (то ничего) и прекращает прием при получении знака указанного в скобках. И когда это происходит, оператор внутри функции присваивает полученные данные переменной TEMPERATURE. В нашем случае это число соответствующее градусам Цельсия. Именно из-за того что мы получаем данные только при их наличии. Нас больше не волнует задержка передачи данных, delay, в скетче Ардуино (описывалось в начале этой части). Вторая часть на этом не заканчивается. В продолжении будет много интересного. |
Категория: ЖЕЛЕЗО/ПРОГРАММИРОВАНИЕ. | Просмотров: 1250 | | |
Всего комментариев: 0 | |