Поиск решения - управление светодиодами и кнопками из IBM PC (linux)

pilat66
Offline
Зарегистрирован: 11.03.2018

Заранее прошу прощения за возможные ошибки в постановке задачи - с Arduino я не имел дела.

Подскажите, существует ли готовое изделие с подобным или близким функционалом?

Есть обычный IBM PC компьютер  (примерно Ubuntu 16.04).

Надо добавить интерфейс с кнопками и светодиодами:

    1) добавить возможность получать сигналы от нескольких кнопок:
      - нажата/отжата
      - запрашивать состояние всех кнопок

    2) управлять светодиодами:
      - зажечь/потушить
      - мигать с заданной частотой

Сигналы от кнопок - для запуска/остановки каких-то процессов.
Светодиоды - для индикации состояния и хода выполнения процесса.

Предположительно это можно сделать на основе Arduino Nano, который должен при подключении к PC создать COM порт, с которого мождно будет получать события и в который модно будет посылать управляющие команды.

Возможно, вместо светодиодов будет удобнее использовать маленький экран, на который выводить текстовую информацию, но интерфейс с кнопками всё равно нужен. К тому же вопрос энергосбережения не на последнем месте.

 

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

А чё, PC настолько немощный, что без ардуины не в состоянии три кнопки прочитать и два светодиода зажечь? Или ардуина тут нужна из религиозных соображений?

andriano
andriano аватар
Offline
Зарегистрирован: 20.06.2015

Если достоточно сотни кнопок и трех светодиодов:

 

Olej
Olej аватар
Offline
Зарегистрирован: 05.03.2018

ЕвгенийП пишет:

А чё, PC настолько немощный, что без ардуины не в состоянии три кнопки прочитать и два светодиода зажечь? Или ардуина тут нужна из религиозных соображений?

Для стандартного PC нужен аппаратный интерфейс для согласования ... особенно если этих кнопок с светодтодами достаточно много (>1). И в мире PC аппартаные устройства, даже простейшие, достаточно дороги. Кроме того, стандартный PC может быть ноутбуком, где с конструктивами интерфейсов совсем не так просто...

А Arduino как исполнительное оконечное устройство ... чуть ли не самое дешёвое из всех возможных + самое скорое по времени реализации задумки - очень даже могло бы быть.

Мне так думается...

 

OlegK
OlegK аватар
Offline
Зарегистрирован: 26.11.2014

pilat66 пишет:
Предположительно это можно сделать на основе Arduino Nano, который должен при подключении к PC создать COM порт, с которого мождно будет получать события и в который модно будет посылать управляющие команды.

Начните с малого - на стороне "наны" светодиод и кнопка, на стороне компа - простая программа на любом доступном Вам языке, которые по Serial (через USB) будут пересылать друг-другу и принимать простые команды. Ну а там сами поймёте, в каком направлении двигаться.

Ну, или обратиться к участникам форума через раздел "Ищу исполнителя", описав конкретное тех. задание...

Olej
Olej аватар
Offline
Зарегистрирован: 05.03.2018

Olej пишет:

А Arduino как исполнительное оконечное устройство ... 

Тем более, что и последующую программную поддержку (и даже замысловатую) такого оконечного устройства со стороны PC/Linux можно осуществить типовыми и простейшими способами:

1. Если владеете Python - то доступом к /dev/ttyUSB*, представляющим Arduino на шине ... и далее очень гибко...

2. Или использованием проекта Processing, с последующим экспортированием отработанного в нём скетча в автономное приложение Linux.

И в том и в другом (и во всех подобных случаях) всё это очень органично вписывается в привычную экоструктуру Linux.

 

wdrakula
wdrakula аватар
Онлайн
Зарегистрирован: 15.03.2016

Olej пишет:
... 

Вот ведь зануда! Портит все удовольствие от "поглумиться"! ;) ;) ;).

ТС все равно не поймет, у него:

pilat66 пишет:
... и в который модно будет посылать управляющие команды.

или не модно...

pilat66
Offline
Зарегистрирован: 11.03.2018

В общем то мой вопрос больше относился к поиску готового решения.  Я программист и представляю как это всё сделать и представляю где могут быть проблемы. Если нет готового решения, то буду наверно искать исполнителя.

IBM PC, о котором я писал - это Intel NUC или похожие, без клавиатуры и без всего кроме USB порта. То есть проблема - разбор на стороне Arduino команд от компьютера и отправка событий нажатий клавиш. А опыта работы с ардуиной нет вообще.

wdrakula
wdrakula аватар
Онлайн
Зарегистрирован: 15.03.2016

Ну елки-палки! Ардуино - это просто контроллер, который программируют на обычном С++, используя полдюжины простых функций и классов, для доступа к периферии.

И да, это самый естественный способ соединить комп с физическим миром.

Если нет USB, то как ты собрался соединяться с ардуинкой? Каким интерфейсом? В принципе можно любым, подо все есть готовые решения.

================

сорри, не заметил, что у тебя есть USB - тогда вообще не понятен тупой вопрос... просто подключай и пиши скрипт, потрать 5 минут своей драгоценной жизни. На стороне Ардуино есть готовые примеры работы с сериал портом.

Да и не нужно позориться - в мире Линукса никто не назывет это COM-портом. Это словечко от виндусоводов. Но это так - придирки.

Клапауций 555
Offline
Зарегистрирован: 10.03.2018

pilat66 пишет:

...есть проблема... А опыта работы с ардуиной нет вообще.

типа


if (проблема(проблема) == 1) {О_О;}

 

wdrakula
wdrakula аватар
Онлайн
Зарегистрирован: 15.03.2016

Клапауций 555 пишет:

if (проблема(проблема) == 1) {О_О;}

 

(0o0)  ...как-то так ...или (o0o)

qwone
qwone аватар
Offline
Зарегистрирован: 03.07.2016

ладно хоть  не так 0т0

pilat66
Offline
Зарегистрирован: 11.03.2018

Я просто поражён уровнем дружелюбности местного сообщества.

 

sadman41
Онлайн
Зарегистрирован: 19.10.2016

pilat66 пишет:

IBM PC, о котором я писал - это Intel NUC или похожие, без клавиатуры и без всего кроме USB порта. То есть проблема - разбор на стороне Arduino команд от компьютера и отправка событий нажатий клавиш. А опыта работы с ардуиной нет вообще.

Тут вопрос возникает сразу - ардуина должна прикидываться нативной клавиатурой и слать нормальные скан-коды или допустимо, что на стороне хоста будет демон, взаимодействующий с ардуиной через Serial Port (по самописному протоколу)?

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

pilat66 пишет:

Я просто поражён уровнем дружелюбности местного сообщества.

Так ото ж! Сами страдаем, но как те ежики - лезем и лезем голым брюхом на кактус :(

smart_pic
Offline
Зарегистрирован: 17.04.2016

pilat66 , мои контакты на сайте http://www.yakorev.com.ru/

пишите на почту или скайп , поможем

pilat66
Offline
Зарегистрирован: 11.03.2018

sadman41 пишет:

Тут вопрос возникает сразу - ардуина должна прикидываться нативной клавиатурой и слать нормальные скан-коды или допустимо, что на стороне хоста будет демон, взаимодействующий с ардуиной через Serial Port (по самописному протоколу)?

Вообще не клавиатурой. В идеале самописный протокол, вроде NMEA. Текстовый в общем.

 

sadman41
Онлайн
Зарегистрирован: 19.10.2016

pilat66 пишет:

sadman41 пишет:

Тут вопрос возникает сразу - ардуина должна прикидываться нативной клавиатурой и слать нормальные скан-коды или допустимо, что на стороне хоста будет демон, взаимодействующий с ардуиной через Serial Port (по самописному протоколу)?

Вообще не клавиатурой. В идеале самописный протокол, вроде NMEA. Текстовый в общем.

Тогда особых проблем в изготовлении это не вызовет. Я так понимаю, что это типа интернет-киоска что-то?

Готовое устройство может разве что у МастерКита есть.

Однако, я думаю, что такие девайсы в заводском исполнении будут скорее HID-совместимыми. Но я не встречал таковых. Только вот на работе валяется какая-то "рекламная USB кнопка" - жмешь на нее, на компе открывается какой-то сайт.

pilat66
Offline
Зарегистрирован: 11.03.2018

У МастерКита есть с похожим функционалом, но либо с реле и без кнопок, либо с Ethernet. А с Nano получается маленькая совсем.

 

sadman41
Онлайн
Зарегистрирован: 19.10.2016

Да, помнится лет 10 назад я у них прикупил USB-реле, так и не юзал. Ибо задач ему не нашлось - формформат неудобный. 

На мелкой ардуине выстроить такую штуку интересней гораздо. Тем более, если основная логика будет вынесена на большую машину.

b707
Онлайн
Зарегистрирован: 26.05.2017

pilat66 пишет:

В общем то мой вопрос больше относился к поиску готового решения.  Я программист и представляю как это всё сделать и представляю где могут быть проблемы. Если нет готового решения, то буду наверно искать исполнителя.

"Я программист и представляю как это всё сделать" и "буду искать исполнителя" - как-то мало сочетается. Скрипт, связывающий ардуину и комп на линуксе - это пара десятков строк на Перле или Питоне...

b707
Онлайн
Зарегистрирован: 26.05.2017

пример "шлюза" между Нано и линукс - скрипта, получающего параметры с Ардуино по Ком-порту и отправляющего их 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-запроса корежится при публикации сообщения, хотя при редактировании нормальная.

pilat66
Offline
Зарегистрирован: 11.03.2018

Вот с перловой частью у меня проблем нет вообще, хотя я такие интерфейсы предпочитаю делать на POE или AnyEvent. Проблема с ардуинской.

b707
Онлайн
Зарегистрирован: 26.05.2017

pilat66 пишет:

Вот с перловой частью у меня проблем нет вообще, хотя я такие интерфейсы предпочитаю делать на POE или AnyEvent. Проблема с ардуинской.

плохо с Си? - в чем проблема прочитать из порта строку и сравнить со списком команд?

PS - что касается систем управления событиями в Перле - то в данном скрипте в ней нет нужды - программа однопоточная.

ua6em
ua6em аватар
Онлайн
Зарегистрирован: 17.08.2016

самое сложное это по видимому определение девайса - my $device = "/dev/ttyUSB0"; ???
В винде под CP21хх это делается нараз, на СH340 такой возможности нет (или я о ней не знаю).
Или по русски: КАК под Линуксом сделать однозначность инициализации девайса в не зависимости от того, в какой из USB портов была воткнута ардуина???

 

sadman41
Онлайн
Зарегистрирован: 19.10.2016

ua6em пишет:

Или по русски: КАК под Линуксом сделать однозначность инициализации девайса в не зависимости от того, в какой из USB портов была воткнута ардуина???

Если я правильно понял вопрос, то через udev magic: http://rus-linux.net/lib.php?name=/MyLDP/sys-conf/udev.html

pilat66
Offline
Зарегистрирован: 11.03.2018

Это зависит от того как Ардуина превращается в последовательное устройство (у меня её нет, может быть в документации написано). Например, мой 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

b707
Онлайн
Зарегистрирован: 26.05.2017

ua6em пишет:

Или по русски: КАК под Линуксом сделать однозначность инициализации девайса в не зависимости от того, в какой из USB портов была воткнута ардуина???
 

Видимо, под "однозначностью" вы понимаете автоопределение ... В модуле CH341 это давно встроено, в момент подключения девайса к порту модуль посылает в системный лог сообщение о найденном устройстве. Очевидно, что если вам нужно автоопределение -  в своем скрипте вы должны предусмотреть поиск нужного порта. Вы можете использовать для этого системные сообщения модуля или придумать что-то свое...

В приведенном выше примере никакого автопределения нет, порт задается фиксировано.

pilat66
Offline
Зарегистрирован: 11.03.2018

b707 пишет:

плохо с Си? - в чем проблема прочитать из порта строку и сравнить со списком команд?

Если бы я с ардуино имел дело - было бы просто. Перед "C" мне надо прочитать как заливать программу, узнать что нужно для этого докупить если нужно, какие резисторы-конденсаторы купить (меня впечатлила тема на форуме про управление одной кнопкой), какие светодиоды выбрать чтобы 10 штук одновременно горели, даст ли энергосберегающий  эффект перевод светодиодов в мерцающий режим и для каких светодиодов это вообще возможно, какие кнопки не склонны к дребезгу и что с дребезгом вообще делать, какие клоны устойчивы к каким температурам и вибрации, и что-то ещё что не приходит в голову.

b707 пишет:

PS - что касается систем управления событиями в Перле - то в данном скрипте в ней нет нужды - программа однопоточная.

Программа и с AnyEvent однопоточная. Это дискуссионный вопрос, но все более-менее сложные программы имеют тенденцию переставать работать если использовать нативные интерфейсы - они превращаются в тот же AnyEvent но самодельный. Проще сразу делать как надо.

sadman41
Онлайн
Зарегистрирован: 19.10.2016

pilat66 пишет:

1) какие светодиоды выбрать чтобы 10 штук одновременно горели,
2) даст ли энергосберегающий  эффект перевод светодиодов в мерцающий режим и для каких светодиодов это вообще возможно,
3)какие кнопки не склонны к дребезгу
4)  и что с дребезгом вообще делать,
5) какие клоны устойчивы к каким температурам и вибрации,
6) и что-то ещё что не приходит в голову.

1) 3мм диаметром;
2) Даст небольшой, но электросчетчик не остановится;
3) Немеханические;
4) Давить программно/припаивать конденсатор/пропускать через триггер Шмитта;
5) Ruggeduino ;
6) 42;

 

b707
Онлайн
Зарегистрирован: 26.05.2017

pilat66 пишет:

Если бы я с ардуино имел дело - было бы просто. Перед "C" мне надо прочитать как заливать программу, узнать что нужно для этого докупить....

до прочтения этого думал предложить вам свою помощь - но этот список меня впечатлил. Вы, видно, требуете от задачи космического или медицинского уровня надежности - и при таком подходе урывками работать не выйдет, а содержать меня полностью вы вряд ли осилите :)

pilat66 пишет:
Программа и с AnyEvent однопоточная. Это дискуссионный вопрос, но все более-менее сложные программы имеют тенденцию переставать работать если использовать нативные интерфейсы - они превращаются в тот же AnyEvent но самодельный. Проще сразу делать как надо.

это действительно дискуссионный вопрос - и я с вами не согласен. Я пишу на Перле более 20 лет и многие мои программы работают годами в автоматическом режиме (самая старая - 20 лет, причем вот уже более 12 лет я вообще не имею к ней доступа). Большинство из них  прекрасно обходятся без AnyEvent или аналогов -  системы Event-драйвинга я использую только в многопоточных клиент-серверных приложениях

pilat66
Offline
Зарегистрирован: 11.03.2018

b707 пишет:

pilat66 пишет:

Если бы я с ардуино имел дело - было бы просто. Перед "C" мне надо прочитать как заливать программу, узнать что нужно для этого докупить....

до прочтения этого думал предложить вам свою помощь - но этот список меня впечатлил. Вы, видно, требуете от задачи космического или медицинского уровня надежности - и при таком подходе урывками работать не выйдет, а содержать меня полностью вы вряд ли осилите :)

А как без надёжности работать? Мне игрушку на коврике не нужно.

Я сюда в основном написал в поисках готового решения. Не верится, что такая простая вещь не сделана кем-то.

pilat66 пишет:
Программа и с AnyEvent однопоточная. Это дискуссионный вопрос, но все более-менее сложные программы имеют тенденцию переставать работать если использовать нативные интерфейсы - они превращаются в тот же AnyEvent но самодельный. Проще сразу делать как надо.

это действительно дискуссионный вопрос - и я с вами не согласен. Я пишу на Перле более 20 лет и многие мои программы работают годами в автоматическом режиме (самая старая - 20 лет, причем вот уже более 12 лет я вообще не имею к ней доступа). Большинство из них  прекрасно обходятся без AnyEvent или аналогов -  системы Event-драйвинга я использую только в многопоточных клиент-серверных приложениях

[/quote]

 

У меня несколько USB источников, Ethernet, да ещё надо отправлять команды на нано. Если писать просто, то на одних блокировках можно разориться.

b707
Онлайн
Зарегистрирован: 26.05.2017

pilat66 пишет:

У меня несколько USB источников, Ethernet, да ещё надо отправлять команды на нано. Если писать просто, то на одних блокировках можно разориться.

это и называется "многопоточная система"...

Olej
Olej аватар
Offline
Зарегистрирован: 05.03.2018

pilat66 пишет:

А как без надёжности работать? Мне игрушку на коврике не нужно.

А вы на Arduino-игрушке собираетесь получить 0.99999 ?

 

sadman41
Онлайн
Зарегистрирован: 19.10.2016

И каковы критерии/показатели надежности проектируемой системы?

b707
Онлайн
Зарегистрирован: 26.05.2017

pilat66 пишет:

Я сюда в основном написал в поисках готового решения. Не верится, что такая простая вещь не сделана кем-то.

Не сделано потому что:

а) нет общности - каждому нужно свое

б) нет нужды в готовом, проще сделать самому

Без учета супер устойчивости к дребезгу, температуре и вибрациям подобную игрушку можно собрать за один вечер

pilat66
Offline
Зарегистрирован: 11.03.2018

чтобы при перевозке до -10 не портилось и запускалось, чтобы нажатие на кнопку было чётко фиксировано. Остальное мелочи.

Может быть и сам сделаю.

pilat66
Offline
Зарегистрирован: 11.03.2018

b707 пишет:

[это и называется "многопоточная система"...

Это что считать потоками. В программировании традиционно поток - это одно, в водоснабжении - другое.

 

sadman41
Онлайн
Зарегистрирован: 19.10.2016

pilat66 пишет:

чтобы при перевозке до -10 не портилось и запускалось, чтобы нажатие на кнопку было чётко фиксировано. Остальное мелочи.

Может быть и сам сделаю.

Не испортится. Сначала рисуйте схему, потом подбирайте комплектуху.

pilat66
Offline
Зарегистрирован: 11.03.2018

Olej пишет:

А вы на Arduino-игрушке собираетесь получить 0.99999 ?

Я в первой строчке первого поста написал что не разбираюсь в ардуинах. Я мог бы ориентироваться на Moxa какой-нибудь, но это слишком во всех отношениях.

 

Olej
Olej аватар
Offline
Зарегистрирован: 05.03.2018

pilat66 пишет:

Olej пишет:

А вы на Arduino-игрушке собираетесь получить 0.99999 ?

Я в первой строчке первого поста написал что не разбираюсь в ардуинах.

Я тоже.

Но по картинкам то вы должны были видеть: макетки, шнурочки, штырёчки... ;-)

 

pilat66
Offline
Зарегистрирован: 11.03.2018

Olej пишет:

Но по картинкам то вы должны были видеть: макетки, шнурочки, штырёчки... ;-)

там ещё батареечка есть и какие-то маленькие плоские ящички

Olej
Olej аватар
Offline
Зарегистрирован: 05.03.2018

pilat66 пишет:

Olej пишет:

Но по картинкам то вы должны были видеть: макетки, шнурочки, штырёчки... ;-)

там ещё батареечка есть и какие-то маленькие плоские ящички

Ну вот же ж : Повезло!