Главная
Блог разработчиков phpBB
 
+ 17 предустановленных модов
+ SEO-оптимизация форума
+ авторизация через соц. сети
+ защита от спама

Сбор показаний датчиков и их отображение

Anna | 16.06.2014 | нет комментариев
Людям нравятся прекрасные презентации. Прекрасные картинки, немножко текста, меняющиеся слайды. Прекрасная картинка разрешает стремительно передать информацию человеку, известить самое главное. Мы все это знаем. Я вот думаю, как «скрестить ежа и ужа»?

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

Вообще-то верный результат я знаю – необходимо применять SCADA системы.
SCADA – это supervisory control and data acquisition, диспетчерское управление и сбор данных. Но мы не ищем легких путей, мы хотим немного изобрести своего велосипеда.

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

Здесь, раньше каждого, необходимо поделить три компоненты:

  • протокол передачи данных. Необходимо как-то кодировать передаваемую от контроллера к компьютеру информацию.
  • firmware в системе автоматики, в микроконтроллере либо ПЛИС. Данный модуль должен собарать показания датчиков и передавать их на компьютер для отображения в «прекрасном виде»
  • программное обеспечение визуализации. Показывает состояние и значения датчиков. Может строит какие-то графики.

Вот так, по порядку испробую рассказать.

Протокол передачи данных.

В реальное время физических вероятностей подключить какое-то устройство к компьютеру либо ноутбуку реально осталось только две: сетевое подключение через Ethernet/WiFi либо USB. Фактически ушли в прошлое «реальные» параллельные и последовательные порты. С ними было легко. Безусловно их еще дозволено обнаружить, если поискать. Но отменнее в эту сторону и не думать.

Ethernet пока отставляю в сторону. Для передачи по сети необходимо в контроллере иметь драйвера стека TCP/IP, как правило это тянет за собой присутствие ОС, обыкновенно Linux либо ucLinux. Потом понадобится интерфейс настройки сети: а какой IP адрес? А статический либо динамический? А какая маска и gateway? В всеобщем не дюже легко в реализации и настройке.

USB кажется значительно проще, правда и здесь много подводных камней: а какой класс/субкласс устройства? А необходимо ли ему драйвера либо применяются типовые драйвера той же Windows?
И вновь возвращаемся «на круги своя» — проще каждого применять ступенчатый порт через USB. В простейшем случае есть шнуры типа USB2Serial. Ну либо как чудесный вариант для разработчика плат и контроллеров – разные микросхемы FTDI.

ОК, все же выбираем ступенчатый порт через USB. А раз так, то значит пересылка данных может быть в виде последовательности символов. Значит дальше еще проще: показания датчиков дозволено передавать в виде строк вида «НАЗВАНИЕ_ДАТЧИКА=ЗНАЧЕНИЕ»

При таком подходе мы сумеем легко увеличивать число опрашиваемых сенсоров, и легко менять их тип. Состояние концевика либо геркона будет передваться, скажем, в виде строк «but0=1» либо «but1=0». Значение температуры дозволено передавать в виде строки «t0=36,6». Строки проще каждого разделять символами «перевода каретки»: 0x0D 0x0A.

Так, на первых порах даже и программа визуализации на компьютере не необходима. Дозволено легко запустить программу терминала как бы Putty и глядеть на показания датчиков из контроллера.

Контроллер.

Мой контроллер исполнен на базе ПЛИС Altera Cyclone III. На самом деле это знаменитая разработчикам платаМарсоход2. Я теснее писал про некоторые планы, исполненные на ней. Скажем, когда-то мы сделали на этой плате на чистой ПЛИС FM радио передатчик. А еще мы сделали на ней USB Tracker. Есть и другие планы.

Вот такая плата:

На плате теснее есть 2 кнопочки – это первые два датчика для моих экспериментов.
Еще я подключил микросхему термометра ds18b20 – это 2-й датчик.
Дозволено еще применять АЦП платы для измерения чего-то-пока-не-знаю-чего. Пока тут легко переменный резистор вместв окне визуализации, ширину и высоту столбика.

Столбик термометра как бы состоит из 2-х частей нижняя красная и верхняя ясная.
Дозволено было бы сделать один Tkinter canvas и на нем нарисовать эти столбики, но отчего-то я сделал не так. Сделал два canvas различного цвета и в функции set() меняю им вертикальный размер. В тезисе это не значимо. Работает. Кстати, если хочется видеть именно изображение термометра в окне визуализации, то его дозволено нарисовать на фоновом изображении окна, а поверх него поместить экземпляр vBarSensor.

Вероятно будет привлекательно.

Написал еще один класс GridDisplay для отображения показаний датчика и изменении их во времени. Его начальный код приводить тут не буду, Дабы не перегружать статью излишними подробностями. Кому будет необходимо скачает с сайта каждый план, совместно с исходниками для ПЛИС для Altera Quartus II.

А вот основную программу alls.py вероятно покажу. Тут не дюже много каждого:

#!/usr/bin/env python

import sensor
from sensor import *

import serial
from serial import *

class AllSensors:
  def __init__(self):
    #open serial port
    self.s=serial.Serial("COM27",115200,timeout=10)
    #load background image
    self.bgnd=PhotoImage(file="bgnd.gif")
    self.label_bgnd=Label(root,image=self.bgnd)
    self.label_bgnd.place(x=0,y=0)
    #add all sensors and indicators
    self.all=[]
    self.all.append( BinSensor("b0","f0.gif","f1.gif",32,32) )
    self.all.append( BinSensor("b1","f0.gif","f1.gif",32,128) )
    self.all.append( vBarSensor("a0",1,0,255,128,32,32,160) ) 
    self.all.append( GridDisplay("t0",16,-55,125,10,16,180,32,256,160) ) 
  def set(self,name,val):
    for sens in self.all:
      if(sens.name==name):
        sens.set(val)
        return
  def setline(self,line):
    p=line.split("=")
    if(len(p)==2):
      self.set( p[0], p[1] )
  def run(self):
    while(1):
      line=self.s.readline()
      line=line.rstrip()
      #print(line)
      self.setline(line)
      root.update()

a=AllSensors()
a.run()

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

Запустить программу из Python легко: «import alls», где alls — это имя основной программы файл alls.py. Вот так теперь выглядит моя программа:

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

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

Источник: programmingmaster.ru
Оставить комментарий
Форум phpBB, русская поддержка форума phpBB
Рейтинг@Mail.ru 2008 - 2017 © BB3x.ru - русская поддержка форума phpBB