很久没有把玩M5Stack 玩具 开发板 了。本来说研究一下用Arduino IDE给M5Stack编程,但是一直都没空实施(懒~),回头再说吧。 最近看到M5Stack的新产品,ATOM,一个很小的小玩意,没有电池,没有显示屏,不过有一个Reset按键,一个用户按键,一个三色LED,红外发射,三轴…… 反正是麻雀虽小五脏俱全。
但是,我一时也想不起来能用这个干点啥。
不过,突然想到我有个咸鱼淘的蜗牛星际主机(好像是A款)改的NAS。我淘到的这个机子有个特点,插电就自动开机,不需要再按主机上的开关键。这倒也方便,因为主机放置在一个角落里,并不能很方便的接触到主机开关,每次通电自动开机也好。不过关机和重启就没那么舒服了,需要ssh进去sudo poweroff或者sudo reboot。 于是我想到能不能用ATOM做一个外置的关机和重启按键。 嗯,有点大材小用(怎么个大材法?因为花了45块啊!我买的ATOM Lite,如果是Martrix大概两倍价钱),但是完全可以!
+------+ USB +-----+
| ATOM | ========= | NAS |
+------+ +-----+
将ATOM通过USB线连接到NAS上,NAS会识别ATOM为一个串口设备。
zzzz@nas:~$ ls /dev/ttyUSB*
/dev/ttyUSB0
然后ATOM内的MicroPython的repl是以115200波特率在串口上通信的。 那么我在NAS上写一段代码,同ATOM通信,就可以接受ATOM发出的命令了,然后相应做出重启或是关机的动作。
首先把ATOM刷成UIFlow-v1.4.5系统,目前最新的系统。 不过我并不会使用UIFlow IDE,而只会用它基于的MicroPython。 当然用Arduino的方式+C语言也可以,不过还是python方便嘛(其实是Arduino的方式我不会)。
系统自带的boot.py内容比较复杂,在我们的应用里不需要了,可以在本地新建一个只有如下一行内容的boot.py,用mpfshell上传到ATOM里。
import main
同boot.py一样,main.py也需要改头换面。 main.py内是我们的主程序,编程思路如下:
如下是代码
import time, sys
from m5stack import *
OFF = 0x0
WHITE = 0xffffff
RED = 0xff0000
BLUE = 0x0000ff
BLUE_L = 0x00002F # 蓝色,低亮度
YELLOW = 0xffff00
GREEN = 0x00ff00
REBOOT = 1 # 标志常量
POWEROFF = 2 # 标志常量
cnt_in = 0 # NAS发送.字符的计数
led_flag = True # 是否点亮LED
while True:
cnt = 0 # 主循环循环次数
state = 0 # 标志变量
in_key = sys.stdin.read(1) # 堵塞式读取1个字符
if in_key == '.':
cnt_in += 1
if cnt_in > 6:
led_flag = not led_flag # LED亮灭切换
cnt_in = 0
if led_flag:
rgb.setColorAll(BLUE_L)
else:
rgb.setColorAll(OFF)
while btnA.isPressed():
if cnt > 70: # 7秒
cnt = 0
state = 0
elif cnt > 50: # 5秒
rgb.setColorAll(WHITE)
state = 0
elif cnt > 30: # 3秒
rgb.setColorAll(RED)
state = POWEROFF
elif cnt > 10: # 1秒
rgb.setColorAll(YELLOW)
state = REBOOT
else:
rgb.setColorAll(GREEN)
state = 0
cnt = cnt + 1
time.sleep(0.1)
if state == POWEROFF:
print('NAS.POWEROFF')
elif state == REBOOT:
print('NAS.REBOOT')
time.sleep(0.05)
在用户主目录下,建立文件nas-remote.py,并添加如下代码,作为NAS上接受ATOM指令的服务程序:
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
import serial
import os
import time
# 打开串口,先用ls /dev/tty* 确认一下串口名称对不对
ser = serial.Serial('/dev/ttyUSB0', 115200, timeout=0.1)
while True:
ser.write(b'.') # 不断发送字符 .
cmd = ser.readline()
#print(len(cmd))
if len(cmd)>=9: # 如果长度太短就不是有效指令
if cmd[0:12]==b"NAS.POWEROFF": # 检查头12个字符
os.system("poweroff")
time.sleep(180) # 发送关机指令后停止180秒
#print("poweroff")
elif cmd[0:10]==b"NAS.REBOOT": # 检查头10个字符
os.system("reboot")
time.sleep(180) # 发送复位指令后停止180秒
#print("reboot")
time.sleep(0.1)
在用户主目录下建立一个文件nas-remote,并把内容编辑为如下脚本
#!/bin/bash
### BEGIN INIT INFO
#
# Provides: location_server
# Required-Start: $local_fs $remote_fs
# Required-Stop: $local_fs $remote_fs
# Default-Start: 2 3 4 5
# Default-Stop: 0 1 6
# Short-Description: initscript
# Description: This file should be used to construct scripts to be placed in /etc/init.d.
#
### END INIT INFO
## Fill in name of program here.
PROG="nas-remote.py"
PROG_PATH="/home/zzzz/" ## Not need, but sometimes helpful (if $PROG resides in /opt for example).
PROG_ARGS=""
PID_PATH="/var/run/"
start() {
if [ -e "$PID_PATH/$PROG.pid" ]; then
## Program is running, exit with error.
echo "Error! $PROG is currently running!" 1>&2
exit 1
else
## Change from /dev/null to something like /var/log/$PROG if you want to save output.
$PROG_PATH/$PROG $PROG_ARGS 2>&1 >/var/log/$PROG &
pid=`ps ax | grep -i 'nas-remote.py' | sed 's/^\([0-9]\{1,\}\).*/\1/g' | head -n 1`
echo "$PROG started"
echo $pid > "$PID_PATH/$PROG.pid"
fi
}
stop() {
echo "begin stop"
if [ -e "$PID_PATH/$PROG.pid" ]; then
## Program is running, so stop it
#pid=`ps ax | grep -i 'nas-remote.py' | sed 's/^\([0-9]\{1,\}\).*/\1/g' | head -n 1`
pid=`ps ax | grep -i 'nas-remote.py' | sed 's/^\([0-9]\{1,\}\).*/\1/g' | awk '{print $1}'`
kill $pid
rm -f "$PID_PATH/$PROG.pid"
echo "$PROG stopped"
else
## Program is not running, exit with error.
echo "Error! $PROG not started!" 1>&2
exit 1
fi
}
## Check to see if we are running as root first.
## Found at http://www.cyberciti.biz/tips/shell-root-user-check-script.html
if [ "$(id -u)" != "0" ]; then
echo "This script must be run as root" 1>&2
exit 1
fi
case "$1" in
start)
start
exit 0
;;
stop)
stop
exit 0
;;
reload|restart|force-reload)
stop
start
exit 0
;;
**)
echo "Usage: $0 {start|stop|reload}" 1>&2
exit 1
;;
esac
然后执行如下命令
chmod +x /home/zzzz/nas-remote
sudo ln -s /home/zzzz/nas-remote /etc/init.d/nas-remote
sudo update-rc.d nas-remote defaults
sudo service nas-remote start
这样就把程序注册为service并启动了
停止服务
sudo service nas-remote stop
启动服务
sudo service nas-remote start
查看服务的信息
sudo systemctl status nas-remote.service
删除服务
sudo update-rc.d -f nas-remote remove
列出系统所有服务
sudo service --status-all
http://www.mikewootc.com/wiki/linux/usage/ubuntu_service_usage.html
https://blog.csdn.net/littlefishzhang/article/details/8203183
我的邮箱: m a c r o a u ﹫﹫ f o x mail.com