Как передать данные с датчика движения на компьютер?
Всем привет! С микроэлектроникой я не знаком от слова совсем и тяжело понять, с чего начать. Собственно, задумка такая: стоит где-то в комнате датчик движения, как я понимаю, когда он срабатывает — происходит размыкание цепи, этот сигнал я хочу получить на компьютере. Теперь вопрос как эти данные передать на компьютер и обработать? С программированием дружу.
Я читал про некоторые варианты:
1) Использовать микроконтроллер типа arduino
2) Передавать данные как-то через LPT-порт.
Вообще, изначально задумка была проще — что-то типа сигнализации. Датчик сработал, врубился какой-то динамик с сиреной, но стало интереснее все это записать в какой-то лог, сформировать почтовое сообщение и т.п.
Подскажите, в какую сторону смотреть, чего почитать? Спасибо 🙂
- Вопрос задан более трёх лет назад
- 7508 просмотров
Подключение DS18B20 к ПК
Помню понадобилось мне подключить пару датчиков температуры от Dallas DS18B20 в ПК и мониторить показания с записью их в лог-файл. Собирать отдельно устройство для этого дела мне не хотелось, а помниться, что я краям ухом слышал, что есть возможность их подключения к RS232, в простонародье Com-порт. Но так как у меня нет этого порта, на самом деле он распаян на печатной плате доски, но переходника у меня не было, но было куча разных преобразователей с USB в RS232 . Начал искать по просторам сети, кто как реализовывал данную идею, чтобы знать какие камни меня из-за угла подстригают. Нашел в сети пару схем и начал их паять, деталей там было, «кот на плакал», но почему-то не одна из схем не заработала у меня Начал спрашивать на данном форуме, мне сказали, что это не возможно, но сдаваться было глупо, ведь у кого-то заработало.
Начал дальше искать и наткнулся на один замечательный форум про спиртные напитки, кому как не им знать про температуру. Там было довольно простое решение, я с начало засомневался на счет его работоспособности, но решил повторить, ведь даже ничего паять не пришлось и куча положительных отзывов. Взял из кучи первый попавшийся преобразователь на CP2102 и подключил датчики к нему, и о чудо все сразу заработало. Сразу подключил 3 датчика, так как мне нужно было именно такое количество, все замечательно заработало. Тестирования я проводил на Win 7 x64 и XP в программе Термомониторинг Но пользоваться советую программой Temp. Keeper правда она платная, но цена ее очень маленькая. Но если Вам по какой-то причине нет возможно приобрести ее на просторах сети имеется ключик для нее.
К чему все это было, дело в том, что мой знакомый заметив такую игрушку попросил и ему сварганить подобное устройство, но на 5 датчиков. Для мониторинга температуры в помещении, систему отопления. Чтобы узнать в какой из комнат большие теплопотери и последить за работой газового котла. Я с начало отказывался и искал любой выход из капкана, но когда он принес бутылек темного и посидев пару часиков, мое желание помочь поднялось. На следующий день я начал искать преобразователи и варганить датчики.
Какое было ТЗ: преобразователь втыкается в USB ПК, преобразователь на СР2102, по шнуру длиной 2 метра идет в распределительную коробку и оттуда каждый датчик по 1,5 метра, 5 штук, расходиться.
Спаял датчики и все поместив в термоусадку подключил все к распределительной коробке. В коробке у меня было два конденсатора на 1000 мкф/10В и 0,1, так-же и резистор на 4к7. Втыкаю я в ПК все это, но устройство не работает, я давай все проверять, все правильно косяков нет, но почему не работает. Начал отключать датчики по очереди, результата не дало, откинул резистор и подключил датчик, все сразу начало работать. Начал потихоньку накидывать датчики, когда дошел до пятого все опять перестало работать. Начал разбираться в чем причина, а оказалось, что провод на котором был пятый датчик имеет экран, все остальные четыре были без экрана и не переплитались между собой, прямая укладка была. Возможно это повлияло, что я Rx и Tx соединил в распределительной, а не на плате преобразователя, выяснять было лень поэтому был просто заменен провод. Витая пара тоже не подошла, из-за того что проводники свиты между собой, а нужно чтобы провода шли параллельно друг другу.
Хотя взял витую пару, 20 метров, и подав по ней только питания датчика, а сигнал по отдельному проводом, не из витой пары, все замечательно заработало. Видимо наводка питание глушило сигнал.
При использовании на большое расстояние может понадобиться внешний БП на 5В, если он вблизи от датчиков, либо на 12/24В если далеко, но в распредилительной коробке должен стоять стабилизатор на +5В.
Вот такие пироги. Всем удачных запусков.
Сбор показаний датчиков и их отображение
Людям нравятся красивые презентации. Красивые картинки, немного текста, меняющиеся слайды. Красивая картинка позволяет быстро передать информацию человеку, сообщить самое важное. Мы все это знаем. Я вот думаю, как «скрестить ежа и ужа»?
Как наглядно на мониторе компьютера представить процессы, происходящие внутри микроконтроллера или ПЛИС? Или как показать, что происходит внутри всей системы автоматики, реализованной на микроконтроллере или ПЛИС?
Вообще-то правильный ответ я знаю – нужно использовать 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 – это второй датчик.
Можно еще использовать АЦП платы для измерения чего-то-пока-не-знаю-чего. Пока здесь просто переменный резистор вместо датчика.
Важно, что на плате уже стоит микросхема FTDI FT2232HL, которая обеспечивает связь с компьютером через USB в виде виртуального последовательного порта. Скорость передачи аж 12Мбит/сек. Это условно 1,2 Мбайта/сек. Если, например, плата опрашивает датчики каждые 100 миллисекунд, то получается можно за каждый опрос передавать компьютеру более 100Кбайт данных. Вполне прилично.
Сейчас не буду рассказывать о проекте для платы и ПЛИС Cyclone III. Для этого есть отдельная статья. В этой статье подробно рассказано, как опрашиваются данные и передаются результаты в компьютер через последовательный порт. Лучше перейдем к рассмотрению 3-ей компоненты – программы визуализации значений датчиков, которая работает на компьютере.
Программа визуализации данных.
Тут хотелось все сделать быстро и просто. На чем писать программу, чтоб было просто написать, менять, дополнять?
Я выбираю Питон, хотя честно говоря опыта нет. Просто кажется, что это будет хорошо. Как сказал один из хабражителей (извините, не помню кто) – дополнительно хотелось бы «потреннировать своего питона».
Итак, поскольку программа будет графическая, то попробую встроенный в питон Tkinter. Для работы с последовательным портом буду использовать pyserial.
Хочется написать эдакий набор классов — для каждого типа датчиков свой класс.
Самый простой класс – двоичный датчик. Это может быть кнопка, концевик, геркон. Его значения 0 или 1. Соответствующий этому датчику питоновский класс BinSensor отображает всего 2 состояния. Предлагаю каждому состоянию нарисовать свое изображение. Изображение прикрепляется к фиксированным координатам окна программы поверх фонового изображения.
Как только пришло значение «0» показываем первую картинку. Если пришло значение «1», то показываем вторую картинку. Изображения могут быть любыми — все зависит от нашей фантазии.
#!/usr/bin/env python import Tkinter from Tkinter import * root = Tk() class BinSensor: def __init__(self,name,img0,img1,x,y): self.name=name self.x=x self.y=y self.img0=PhotoImage(file=img0) self.img1=PhotoImage(file=img1) self.val=0 self.label_img=Label(root,image=self.img0) self.label_img.place(x=self.x,y=self.y) def set(self,state): if(self.val==state): return self.val=state if( int(state)==0 ): self.label_img.configure(image=self.img0) else: self.label_img.configure(image=self.img1)
В функцию __init__, которая вызывается при создании экземпляра класса, передаются параметры:
Name – название датчика
Img0 и img1 – имена файлов картинок, используемых для отображения состояния датчика.
X и y – координаты окна, где будет отображаться датчик.
При создании объекта датчика сразу создается Label с картинкой и размещается в окне Tkinter.
Функция set принимает параметр строку – это новое состояние датчика «0» или «1». В зависимости от нового значения картинка внутри Label переконфигурируется, меняется на другую. В общем это и все.
Аналогичным образом реализуется второй класс vBarSensor.
class vBarSensor: def __init__(self,name,scale,min,max,x,y,w,h): self.name=name self.scale=scale self.x=x self.y=y self.h=h self.val=min self.min=min self.max=max self.delta=max-min h1=self.h*(self.val-self.min)/self.delta h0=self.h-h1 self.canv0 = Canvas(root, width = w, height = h0, bg = "lightblue", bd=1, relief='ridge') self.canv1 = Canvas(root, width = w, height = h1, bg = "red", bd=1, relief='ridge') self.barLabel = Label(root, text = "0") self.canv0.place(x=self.x,y=self.y) self.canv1.place(x=self.x,y=self.y+h0) self.barLabel.place(x=self.x,y=self.y+h+5) def set(self,newval): #newval is signed hex string like "83A5" val=int(newval,16) if(val>0x7fff): val=-val val=val/self.scale if(self.val==val): return self.val=val h1=self.h*(self.val-self.min)/self.delta h0=self.h-h1 self.barLabel.configure(text=str(self.val)) self.canv0.configure(height = h0) self.canv1.configure(height = h1) self.canv1.place(y=self.y+h0)
Этот класс графически представляет датчик типа термометра. Значения из датчика могут меняться в некотором диапазоне. Так же при создании экземпляра этого класса нужно указать имя датчика. Кроме этого у термометра есть возможное минимальное и максимальное значение, и еще указываем координаты столбика в окне визуализации, ширину и высоту столбика.
Столбик термометра как бы состоит из двух частей нижняя красная и верхняя светлая.
Можно было бы создать один 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(» https://habrastorage.org/r/w1560/storage3/ac8/7d3/b08/ac87d3b08d8cda9eea5762d1451c2111.png» data-src=»https://habrastorage.org/storage3/ac8/7d3/b08/ac87d3b08d8cda9eea5762d1451c2111.png»/>
Вот видео, которое показывает, как все это работает (только не пугайтесь, я там фен включаю для нагрева датчика температуры, так что звук лучше прикрутить):
Теперь, когда «скелет» приложения работает, то можно приступать к детальному рисованию плана помещения и установленных в нем датчиков.
Контроль температуры. Как подключить датчик температуры DS1820 через COM-порт копьютера и мониторить температуру.
Иногда перед человеком встает необходимость контролировать температуру, скажем, в помещении серверной или в любимом инкубаторе для крокодильчиков. Те, кто не хотят заморачиваться, имеют деньги или не владеют руками, тупо покупают специализированные приборы. Те же, кто дружит с паяльником, или хотя бы знает, что такое припой и для чего нужна канифоль, ищут возможности проще и дешевле.
Недавно передо мной стала задача дистанционного контроля температуры в серверных помещениях моей конторы. Как тру-инженер прекрасно владеющий паяльником и знающий что такое DS1820, я решил собрать контроль самостоятельно и сэкономить конторе денежку.
В интернетах не мало сломано копий по данному вопросу. Материал везде достаточно одинаковый и сводится к одному: берем датчик температуры DS1820 фирмы Dallas и путем довешивания дополнительно двух диодов Шоттки, двух стабилитронов и одного резистора, получаем приблуду на COM-порт, которая в состоянии замерять температуру.
Все бы хорошо, однако нормального ПО для работы с такой приблудой я так и не нашел. Точнее, оно есть, но за него хотят денег. Что я понимаю под нормальным ПО? Да мне всего-то и надо что контролировать температуру в помещении, и, когда она превысит, скажем, 30 градусов, оповестить меня об этом. Вот тут-то и загвоздка: есть ПО которое бесплатное, но оно просто показывает температуру, что мне нафиг не надо. И есть ПО, которое еще позволяет что-то делать, когда температура выше определенного предела, но оно стоит денег.
Поскольку денег платить я не хочу, а использовать ломаное ПО в организации нельзя, я пошел своим путем и написал программу контроля температуры, которая, при определенных пользователем условиях, позволяет производить какие-либо действия. А поскольку я не жадный, выкладываю программу здесь, глядишь, еще кому пригодится.
Итак. Прежде всего схема. Она валяется везде в интернете и собрать ее совсем не сложно. По стоимости деталек: в моем городе на расстоянии 500 км от столицы все детали обошлись мне в 300 рублей. Самый дорогой был именно датчик температуры DS1820, остальное — копейки.
Собираем схему, можно прямо на разъеме для com-порта. На рисунке показано сразу 3 датчика. Это как пример того, как подключить к одной одной линии много датчиков. Для работы достаточно только одного. Подключаем собранную схему к компьютеру и дальше в действие вступает специальная программулина.
Моя программа на самом деле не замеряет температуру, а является посредником. Температуру замеряет портированная под Windows линуксовая программа DigiTemp. А моя программа анализирует работу консольной DigiTemp и соответственно реагирует. Ничего дополнительно устанавливать не нужно, все уже есть внутри.
Для работы программы требуется установленная платформа .NET версии не ниже 3.5, она сейчас есть практически везде.
1. Запускаем программу. При первом запуске она сразу открывает раздел настроек. Там нужно указать COM-порт, и просто нажать кнопку «Поиск сенсоров».
2. Если железо в порядке, com-порт работает и ничем больше не занят и наш адаптер спаян правильно, программа обнаружит подключенные сенсоры, отобразит табличку с их названиями, типом и прочей служебной информацией.
3. Двойным кликом на обнаруженных датчиках открываем их настройки, где можно изменить имя датчика (чтобы было понятно, где он) и добавить действие, которое будет выполняться при определенных условиях.
По кнопке «Добавить» добавляется действие. На текущий момент программа поддерживает только одно действие — запуск внешней программы. Я посчитал это действие самым важным и реализовал его в первую очередь. Далее, если будет желание читателей и хорошие идеи — добавим еще. Окошко действия «Запуск программы» выглядит так:
Тут все просто — указываем выше/ниже какой температуры срабатывать, выбираем программу, рабочий каталог, если нужно и параметры командной строки, опять же, если нужно.
После всех настроек, можно нажать кнопку «Пуск» основного окна программы и она начнет свой монотонный никому не нужный труд. С интервалом, заданным в параметре «Интервал опроса сенсоров» программа будет запускать опрос, обрабатывать данные и выводить их в таблицу. Заодно будет проверять условия срабатывания действий, и при их совпадении — запускать действие.
Поле «Количество попыток опроса» предназначено для увеличения количества циклов чтения за один интервал опроса. При неуверенном чтении датчиков можно попытаться увеличить это значение в разумных пределах (скажем, до 5).
Время чтения одного датчика где-то 0,7 — 1 секунда, соответственно, опрос 3х датчиков будет длиться в районе 3х секунд.
При установленной галке «Автозапуск мониторинга при старте программы» мониторинг будет запускаться автоматически, что даст возможность запихнуть программу в автозагрузку.
А вот, собственно, и сама программа:
Предложения, пожелания и прочий флуд приветствуется.