Поиск решения - управление светодиодами и кнопками из IBM PC (linux)
- Войдите на сайт для отправки комментариев
Заранее прошу прощения за возможные ошибки в постановке задачи - с Arduino я не имел дела.
Подскажите, существует ли готовое изделие с подобным или близким функционалом?
Есть обычный IBM PC компьютер (примерно Ubuntu 16.04).
Надо добавить интерфейс с кнопками и светодиодами:
1) добавить возможность получать сигналы от нескольких кнопок:
- нажата/отжата
- запрашивать состояние всех кнопок
2) управлять светодиодами:
- зажечь/потушить
- мигать с заданной частотой
Сигналы от кнопок - для запуска/остановки каких-то процессов.
Светодиоды - для индикации состояния и хода выполнения процесса.
Предположительно это можно сделать на основе Arduino Nano, который должен при подключении к PC создать COM порт, с которого мождно будет получать события и в который модно будет посылать управляющие команды.
Возможно, вместо светодиодов будет удобнее использовать маленький экран, на который выводить текстовую информацию, но интерфейс с кнопками всё равно нужен. К тому же вопрос энергосбережения не на последнем месте.
А чё, PC настолько немощный, что без ардуины не в состоянии три кнопки прочитать и два светодиода зажечь? Или ардуина тут нужна из религиозных соображений?
Если достоточно сотни кнопок и трех светодиодов:
А чё, PC настолько немощный, что без ардуины не в состоянии три кнопки прочитать и два светодиода зажечь? Или ардуина тут нужна из религиозных соображений?
Для стандартного PC нужен аппаратный интерфейс для согласования ... особенно если этих кнопок с светодтодами достаточно много (>1). И в мире PC аппартаные устройства, даже простейшие, достаточно дороги. Кроме того, стандартный PC может быть ноутбуком, где с конструктивами интерфейсов совсем не так просто...
А Arduino как исполнительное оконечное устройство ... чуть ли не самое дешёвое из всех возможных + самое скорое по времени реализации задумки - очень даже могло бы быть.
Мне так думается...
Начните с малого - на стороне "наны" светодиод и кнопка, на стороне компа - простая программа на любом доступном Вам языке, которые по Serial (через USB) будут пересылать друг-другу и принимать простые команды. Ну а там сами поймёте, в каком направлении двигаться.
Ну, или обратиться к участникам форума через раздел "Ищу исполнителя", описав конкретное тех. задание...
А Arduino как исполнительное оконечное устройство ...
Тем более, что и последующую программную поддержку (и даже замысловатую) такого оконечного устройства со стороны PC/Linux можно осуществить типовыми и простейшими способами:
1. Если владеете Python - то доступом к /dev/ttyUSB*, представляющим Arduino на шине ... и далее очень гибко...
2. Или использованием проекта Processing, с последующим экспортированием отработанного в нём скетча в автономное приложение Linux.
И в том и в другом (и во всех подобных случаях) всё это очень органично вписывается в привычную экоструктуру Linux.
Вот ведь зануда! Портит все удовольствие от "поглумиться"! ;) ;) ;).
ТС все равно не поймет, у него:
или не модно...
В общем то мой вопрос больше относился к поиску готового решения. Я программист и представляю как это всё сделать и представляю где могут быть проблемы. Если нет готового решения, то буду наверно искать исполнителя.
IBM PC, о котором я писал - это Intel NUC или похожие, без клавиатуры и без всего кроме USB порта. То есть проблема - разбор на стороне Arduino команд от компьютера и отправка событий нажатий клавиш. А опыта работы с ардуиной нет вообще.
Ну елки-палки! Ардуино - это просто контроллер, который программируют на обычном С++, используя полдюжины простых функций и классов, для доступа к периферии.
И да, это самый естественный способ соединить комп с физическим миром.
Если нет USB, то как ты собрался соединяться с ардуинкой? Каким интерфейсом? В принципе можно любым, подо все есть готовые решения.
================
сорри, не заметил, что у тебя есть USB - тогда вообще не понятен тупой вопрос... просто подключай и пиши скрипт, потрать 5 минут своей драгоценной жизни. На стороне Ардуино есть готовые примеры работы с сериал портом.
Да и не нужно позориться - в мире Линукса никто не назывет это COM-портом. Это словечко от виндусоводов. Но это так - придирки.
...есть проблема... А опыта работы с ардуиной нет вообще.
типа
if (проблема(проблема) == 1) {О_О;}if (проблема(проблема) == 1) {О_О;}(0o0) ...как-то так ...или (o0o)
ладно хоть не так 0т0
Я просто поражён уровнем дружелюбности местного сообщества.
IBM PC, о котором я писал - это Intel NUC или похожие, без клавиатуры и без всего кроме USB порта. То есть проблема - разбор на стороне Arduino команд от компьютера и отправка событий нажатий клавиш. А опыта работы с ардуиной нет вообще.
Тут вопрос возникает сразу - ардуина должна прикидываться нативной клавиатурой и слать нормальные скан-коды или допустимо, что на стороне хоста будет демон, взаимодействующий с ардуиной через Serial Port (по самописному протоколу)?
Я просто поражён уровнем дружелюбности местного сообщества.
Так ото ж! Сами страдаем, но как те ежики - лезем и лезем голым брюхом на кактус :(
pilat66 , мои контакты на сайте http://www.yakorev.com.ru/
пишите на почту или скайп , поможем
Тут вопрос возникает сразу - ардуина должна прикидываться нативной клавиатурой и слать нормальные скан-коды или допустимо, что на стороне хоста будет демон, взаимодействующий с ардуиной через Serial Port (по самописному протоколу)?
Вообще не клавиатурой. В идеале самописный протокол, вроде NMEA. Текстовый в общем.
Тут вопрос возникает сразу - ардуина должна прикидываться нативной клавиатурой и слать нормальные скан-коды или допустимо, что на стороне хоста будет демон, взаимодействующий с ардуиной через Serial Port (по самописному протоколу)?
Вообще не клавиатурой. В идеале самописный протокол, вроде NMEA. Текстовый в общем.
Тогда особых проблем в изготовлении это не вызовет. Я так понимаю, что это типа интернет-киоска что-то?
Готовое устройство может разве что у МастерКита есть.
Однако, я думаю, что такие девайсы в заводском исполнении будут скорее HID-совместимыми. Но я не встречал таковых. Только вот на работе валяется какая-то "рекламная USB кнопка" - жмешь на нее, на компе открывается какой-то сайт.
У МастерКита есть с похожим функционалом, но либо с реле и без кнопок, либо с Ethernet. А с Nano получается маленькая совсем.
Да, помнится лет 10 назад я у них прикупил USB-реле, так и не юзал. Ибо задач ему не нашлось - формформат неудобный.
На мелкой ардуине выстроить такую штуку интересней гораздо. Тем более, если основная логика будет вынесена на большую машину.
В общем то мой вопрос больше относился к поиску готового решения. Я программист и представляю как это всё сделать и представляю где могут быть проблемы. Если нет готового решения, то буду наверно искать исполнителя.
"Я программист и представляю как это всё сделать" и "буду искать исполнителя" - как-то мало сочетается. Скрипт, связывающий ардуину и комп на линуксе - это пара десятков строк на Перле или Питоне...
пример "шлюза" между Нано и линукс - скрипта, получающего параметры с Ардуино по Ком-порту и отправляющего их HTTP-запросом на Thingspeak.com. Принимает три типа сообщений - текущую температуру "Temperature = 26.76" и флаги "HEAT ON" и "HEAT OFF". Большая часть скрипта - это формирование HTTP-запроса, общение с Ардуиной совсем небольшое. Прикрутить передачу команд в обратную сторону, думаю, не составит труда.
#!/usr/bin/perl -w use LWP::Simple; # From CPAN use LWP::UserAgent; use Device::SerialPort; # Thingspeak API key my $API_KEY = 'XXX'; # Set up the serial port my $device = "/dev/ttyUSB0"; my $port = Device::SerialPort->new($device); # Name for logfile as current date: 2018_03_12.log my @lt = localtime(); my $filename = sprintf('%4d_%02d_%02d.log', $lt[5] + 1900, $lt[4]+1, $lt[3]); if( ! defined($port) ) { die("Can't open $device: $^E\n"); } $port->baudrate(9600); # you may change this value $port->databits(8); # but not this and the two following $port->parity("none"); $port->stopbits(1); $port->dtr_active(0); $port->write_settings() or die "write settings"; # Create an HTTP client my $ua = LWP::UserAgent->new; $ua->agent('Perl/ComPort'); my $buffer = ""; my $measure_cnt = 0; my $heater_flag =0; while (1) { # and all the rest of the gremlins as they come in one piece my ($count, $text) = $port -> read(255); if ($count > 0) { $buffer.= $text; if ( $text =~ /\n/m ) {if ($buffer =~ /HEAT ON/) {$heater_flag =1;} if ($buffer =~ /HEAT OFF/) {$heater_flag =0;} if ($buffer =~ /Temperature = (\-?\d{1,2}\.\d\d)/) { my $temp = $1; $measure_cnt++; if ($measure_cnt >=5 ) { # Create a HTTP request my $url = "&field1=".$temp."&field4=".$heater_flag; my $req = HTTP::Request->new(POST => "http://api.thingspeak.com/update?key=$API_KEY".$url); # Make the request my $res = $ua->request($req); unless ($res->is_success) { print STDERR $res->status_line, "\n"; print STDERR $res->content, "\n"; } my $now_string = localtime(); open (my $fh, ">>", $filename) or die "Failed to open $filename for append - $!"; print $fh "$now_string "; print $fh ",$temp, $heater_flag\n"; close $fh; $measure_cnt = 0;} } print $buffer; $buffer ="";} } else {sleep(1);} } $port->close();Update: строка POST-запроса корежится при публикации сообщения, хотя при редактировании нормальная.
Вот с перловой частью у меня проблем нет вообще, хотя я такие интерфейсы предпочитаю делать на POE или AnyEvent. Проблема с ардуинской.
Вот с перловой частью у меня проблем нет вообще, хотя я такие интерфейсы предпочитаю делать на POE или AnyEvent. Проблема с ардуинской.
плохо с Си? - в чем проблема прочитать из порта строку и сравнить со списком команд?
PS - что касается систем управления событиями в Перле - то в данном скрипте в ней нет нужды - программа однопоточная.
самое сложное это по видимому определение девайса -
my $device ="/dev/ttyUSB0"; ???В винде под CP21хх это делается нараз, на СH340 такой возможности нет (или я о ней не знаю).
Или по русски: КАК под Линуксом сделать однозначность инициализации девайса в не зависимости от того, в какой из USB портов была воткнута ардуина???
Или по русски: КАК под Линуксом сделать однозначность инициализации девайса в не зависимости от того, в какой из USB портов была воткнута ардуина???Если я правильно понял вопрос, то через udev magic: http://rus-linux.net/lib.php?name=/MyLDP/sys-conf/udev.html
Это зависит от того как Ардуина превращается в последовательное устройство (у меня её нет, может быть в документации написано). Например, мой GPS приёмник при подключении создаёт устройства с именами, в которых присутствует какой-то идентификатор уникальный для устройства, например
/dev/serial/by-id/usb-Intel_Edison_7b9ebb433924db0d505453b244e54c83-if02
/dev/serial/by-id/usb-Intel_Edison_04a1976961427dc1fe3be80927065918-if02
другое устройство создаёт одно и то же имя для всех устройств (может поменять и можно, я не пробовал)
/dev/serial/by-id/usb-Silicon_Labs_CP2102_USB_to_UART_Bridge_Controller_0001-if00-port0
Или по русски: КАК под Линуксом сделать однозначность инициализации девайса в не зависимости от того, в какой из USB портов была воткнута ардуина???
Видимо, под "однозначностью" вы понимаете автоопределение ... В модуле CH341 это давно встроено, в момент подключения девайса к порту модуль посылает в системный лог сообщение о найденном устройстве. Очевидно, что если вам нужно автоопределение - в своем скрипте вы должны предусмотреть поиск нужного порта. Вы можете использовать для этого системные сообщения модуля или придумать что-то свое...
В приведенном выше примере никакого автопределения нет, порт задается фиксировано.
плохо с Си? - в чем проблема прочитать из порта строку и сравнить со списком команд?
Если бы я с ардуино имел дело - было бы просто. Перед "C" мне надо прочитать как заливать программу, узнать что нужно для этого докупить если нужно, какие резисторы-конденсаторы купить (меня впечатлила тема на форуме про управление одной кнопкой), какие светодиоды выбрать чтобы 10 штук одновременно горели, даст ли энергосберегающий эффект перевод светодиодов в мерцающий режим и для каких светодиодов это вообще возможно, какие кнопки не склонны к дребезгу и что с дребезгом вообще делать, какие клоны устойчивы к каким температурам и вибрации, и что-то ещё что не приходит в голову.
PS - что касается систем управления событиями в Перле - то в данном скрипте в ней нет нужды - программа однопоточная.
Программа и с AnyEvent однопоточная. Это дискуссионный вопрос, но все более-менее сложные программы имеют тенденцию переставать работать если использовать нативные интерфейсы - они превращаются в тот же AnyEvent но самодельный. Проще сразу делать как надо.
1) какие светодиоды выбрать чтобы 10 штук одновременно горели,
2) даст ли энергосберегающий эффект перевод светодиодов в мерцающий режим и для каких светодиодов это вообще возможно,
3)какие кнопки не склонны к дребезгу
4) и что с дребезгом вообще делать,
5) какие клоны устойчивы к каким температурам и вибрации,
6) и что-то ещё что не приходит в голову.
1) 3мм диаметром;
2) Даст небольшой, но электросчетчик не остановится;
3) Немеханические;
4) Давить программно/припаивать конденсатор/пропускать через триггер Шмитта;
5) Ruggeduino ;
6) 42;
Если бы я с ардуино имел дело - было бы просто. Перед "C" мне надо прочитать как заливать программу, узнать что нужно для этого докупить....
до прочтения этого думал предложить вам свою помощь - но этот список меня впечатлил. Вы, видно, требуете от задачи космического или медицинского уровня надежности - и при таком подходе урывками работать не выйдет, а содержать меня полностью вы вряд ли осилите :)
это действительно дискуссионный вопрос - и я с вами не согласен. Я пишу на Перле более 20 лет и многие мои программы работают годами в автоматическом режиме (самая старая - 20 лет, причем вот уже более 12 лет я вообще не имею к ней доступа). Большинство из них прекрасно обходятся без AnyEvent или аналогов - системы Event-драйвинга я использую только в многопоточных клиент-серверных приложениях
Если бы я с ардуино имел дело - было бы просто. Перед "C" мне надо прочитать как заливать программу, узнать что нужно для этого докупить....
до прочтения этого думал предложить вам свою помощь - но этот список меня впечатлил. Вы, видно, требуете от задачи космического или медицинского уровня надежности - и при таком подходе урывками работать не выйдет, а содержать меня полностью вы вряд ли осилите :)
А как без надёжности работать? Мне игрушку на коврике не нужно.
Я сюда в основном написал в поисках готового решения. Не верится, что такая простая вещь не сделана кем-то.
это действительно дискуссионный вопрос - и я с вами не согласен. Я пишу на Перле более 20 лет и многие мои программы работают годами в автоматическом режиме (самая старая - 20 лет, причем вот уже более 12 лет я вообще не имею к ней доступа). Большинство из них прекрасно обходятся без AnyEvent или аналогов - системы Event-драйвинга я использую только в многопоточных клиент-серверных приложениях
[/quote]
У меня несколько USB источников, Ethernet, да ещё надо отправлять команды на нано. Если писать просто, то на одних блокировках можно разориться.
У меня несколько USB источников, Ethernet, да ещё надо отправлять команды на нано. Если писать просто, то на одних блокировках можно разориться.
это и называется "многопоточная система"...
А как без надёжности работать? Мне игрушку на коврике не нужно.
А вы на Arduino-игрушке собираетесь получить 0.99999 ?
И каковы критерии/показатели надежности проектируемой системы?
Я сюда в основном написал в поисках готового решения. Не верится, что такая простая вещь не сделана кем-то.
Не сделано потому что:
а) нет общности - каждому нужно свое
б) нет нужды в готовом, проще сделать самому
Без учета супер устойчивости к дребезгу, температуре и вибрациям подобную игрушку можно собрать за один вечер
чтобы при перевозке до -10 не портилось и запускалось, чтобы нажатие на кнопку было чётко фиксировано. Остальное мелочи.
Может быть и сам сделаю.
[это и называется "многопоточная система"...
Это что считать потоками. В программировании традиционно поток - это одно, в водоснабжении - другое.
чтобы при перевозке до -10 не портилось и запускалось, чтобы нажатие на кнопку было чётко фиксировано. Остальное мелочи.
Может быть и сам сделаю.
Не испортится. Сначала рисуйте схему, потом подбирайте комплектуху.
А вы на Arduino-игрушке собираетесь получить 0.99999 ?
Я в первой строчке первого поста написал что не разбираюсь в ардуинах. Я мог бы ориентироваться на Moxa какой-нибудь, но это слишком во всех отношениях.
А вы на Arduino-игрушке собираетесь получить 0.99999 ?
Я в первой строчке первого поста написал что не разбираюсь в ардуинах.
Я тоже.
Но по картинкам то вы должны были видеть: макетки, шнурочки, штырёчки... ;-)
Но по картинкам то вы должны были видеть: макетки, шнурочки, штырёчки... ;-)
там ещё батареечка есть и какие-то маленькие плоские ящички
Но по картинкам то вы должны были видеть: макетки, шнурочки, штырёчки... ;-)
там ещё батареечка есть и какие-то маленькие плоские ящички
Ну вот же ж : Повезло!