我买了一块中国usb 8继电器开关板。它在ubuntu服务器中显示为串行设备。我想出了让它工作的命令。
*设置中继板的波特率
stty -F /dev/ttyUSB0 9600 -parity cs8 -cstopb
启动继电器控制器:
echo -e -n "x50" > /dev/ttyUSB0
激活指令继电器:
echo -e -n "x51" > /dev/ttyUSB0
打开继电器
echo -e -n "x(number)" > /dev/ttyUSB0*
但我的问题是,如果我打开继电器1(/x01(,然后打开继电器2(/x02(,继电器1就会关闭。我正在尝试自动化,需要它一次打开多个继电器。我通过了测试人员,开始绘制每个数字,比如03打开继电器01和02。但必须有一个更简单的方法。任何帮助都将不胜感激。
它是一个逐位控件。
例如,要只打开端口0(第一个(,请发送\xFE。
(echo "obase=16" ; echo $((255 ^ 1)))|bc| sed -e 's/^/\x/'
0xFE
基本上取255,并为您希望启动的每个端口减去这些值:|端口|编号||--|---||0|1||1|2||2|4||3|8||2016年4月||5|32||6 | 64||7 | 128 |
要转动继电器1、4、5和7,您需要发送:
255 (all 8 bits stop) - 2 (bit 1 start) - 16 (bit 4 start) - 128 (bit 7 start) = 109.
在十六进制109中是6D,所以将\x6D发送到设备。
一个更直观的例子:
#!/bin/bash
varfolder=/dev/shm
for i in $(find -L /sys/bus/usb/devices/ -maxdepth 2 -name "ttyUSB*"); do
usb=$(egrep -i "2303" $i/../modalias >/dev/null && echo "${i##*/}")
check=$(grep PRODUCT= /sys/bus/usb-serial/devices/$usb/../uevent)
if [ "$check" == "PRODUCT=67b/2303/300" ]; then
releport=/dev/$usb
fi
done
## this word "modif" depends on the linux interface language
modf_time=$(stat /sys/bus/usb-serial/devices/$usb | grep modif)
init_time=$(<$varfolder/init_usb_relay)
if [ "$modf_time" != "$init_time" ] ; then
echo -e -n "x50" > $releport
echo -e -n "x51" > $releport
echo $modf_time > "$varfolder/init_usb_relay"
fi
# 87654321
# turn off 6 and 5 relay
relstatusbin=11001111
relstatus16=$(echo "ibase=2;obase=10000;$relstatusbin"|bc)
echo -e -n "x$relstatus16" > $releport
已知问题:
- 如果USB线没有携带足够的电力来固定继电器线圈,则继电器将不会通电。在这种情况下,需要额外的电源。或者同时关闭少量继电器
- 触点可能会卡住
- 触点可能会烧坏
- 如果设备停止接受命令,那么为了不重新启动Linux,您需要删除设备
rm -f /dev/ttyUSB0