So Tired !_! 逆水行舟, 不进则退!

18Aug/20

常用基本AT指令

Posted by Nick Xu

常用基本AT指令

 

命令
作用

AT
测试连接是否正确

ATE0
关闭回显。程序初始化AT部分首先关闭回显。

ATE1
打开回显。使用超级终端测试命令时打开。

AT+CGMI
得到厂商信息

AT+CGMR
得到手机版本号

AT+CGSN
得到手机序列号(IMEI)

AT+CIMI
得到手机IMSI号码

AT+CSCS
获取、设置手机当前字符集。可设置为GSM或UCS2

AT+CBC
获取手机电量

AT+CCLK
获取设置手机时钟

AT+CNUM
机身号码。分为线路一和线路二

AT+CSQ
当前信号

AT+COPS
网络营运商

AT+CSCA
短信中心号码

以上这些指令都用于与手机连接的时候初始化用。取得手机IMEI及IMSI可以给使程序支持更多的手机连接

并且保持数据独立。

短信部分

 

命令
作用

AT+CPMS
选择短信储存地点。可选择ME(SIM卡)和MT(机身)

AT+CMGL
列出指定状态的短信息的PDU代码

AT+CMGR
列出指定序号的短信息PDU代码

AT+CMGS
发送短信

AT+CMGD
删除指定的短信

AT+CMGF
短信格式。分为Text模式和PDU模式

AT+CNMI
设置新短消息通知电脑端

AT+CSCA
短信中心

以上命令是短消息部分最经常使用的命令。

一、一般命令
 AT+CGMI给出模块厂商的标识。
 AT+CGMM获得模块标识。这个命令用来得到支持的频带(GSM900,DCS1800或PCS1900)。当模块有多频带时,回应可能是不同频带的结合。
 AT+CGMR获得改订的软件版本。
 AT+CGSN获得GSM模块的IMEI(国际移动设备标识)序列号。
 AT+CSCS选择TE特征设定。这个命令报告TE用的是哪个状态设定上的ME。ME于是可以转换每一个输入的或显示的字母。这个是用来发送、读取或者撰写短信。
 AT+WPCS设定电话簿状态。这个特殊的命令报告通过TE电话簿所用的状态的ME。ME于是可以转换每一个输入的或者显示的字符串字母。这个用来读或者写电话簿的入口。
 AT+CIMI获得IMSI。这命令用来读取或者识别SIM卡的IMSI(国际移动签署者标识)。在读取IMSI之前应该先输入PIN(如果需要PIN的话)。
 AT+CCID获得SIM卡的标识。这个命令使模块读取SIM卡上的EF-CCID文件。
 AT+GCAP获得能力表。(支持的功能)
 A/ 重复上次命令。只有A/命令不能重复。这命令重复前一个执行的命令。
 AT+CPOF关机。这个特殊的命令停止GSM软件堆栈和硬件层。命令AT+CFUN=0的功能与+CPOF相同。
 AT+CFUN设定电话机能。这个命令选择移动站点的机能水平。
 AT+CPAS返回移动设备的活动状态。
 AT+CMEE报告移动设备的错误。这个命令决定允许或不允许用结果码“+CMEERROR:<xxx>”或者“+CMSERROR:<xxx>”代替简单的“ERROR”。
 AT+CKPD小键盘控制。仿真ME小键盘执行命令。
 AT+CCLK时钟管理。这个命令用来设置或者获得ME真实时钟的当前日期和时间。
 AT+CALA警报管理。这个命令用来设定在ME中的警报日期/时间。(闹铃)
 AT+CRMP铃声旋律播放。这个命令在模块的蜂鸣器上播放一段旋律。有两种旋律可用:到来语音、数据或传真呼叫旋律和到来短信声音。
 AT+CRSL设定或获得到来的电话铃声的声音级别。
二、呼叫控制命令
 ATD拨号命令。这个命令用来设置通话、数据或传真呼叫。
 ATH挂机命令。
 ATA接电话。
 AT+CEER扩展错误报告。这个命令给出当上一次通话设置失败后中断通话的原因。
 AT+VTD给用户提供应用GSM网络发送DTMF(双音多频)双音频。这个命令用来定义双音频的长度(默认值是300毫秒)。
 AT+VTS给用户提供应用GSM网络发送DTMF双音频。这个命令允许传送双音频。
 ATDL重拨上次电话号码。
 AT%Dn数据终端就绪(DTR)时自动拨号。
 ATS0自动应答。
 AT+CICB来电信差。
 AT+CSNS单一编号方案。
 AT+VGR
 AT+VGT增益控制。这个命令应用于调节喇叭的接收增益和麦克风的传输增益。
 AT+CMUT麦克风静音控制。
 AT+SPEAKER喇叭/麦克风选择。这个特殊命令用来选择喇叭和麦克风。
 AT+ECHO回音取消。
 AT+SIDET侧音修正。
 AT+VIP初始化声音参数。
 AT+DUI用附加的用户信息拨号。
 AT+HUI用附加的用户信息挂机。
 AT+RUI接收附加用户信息。
三、网络服务命令
 AT+CSQ信号质量。
 AT+COPS服务商选择。
 AT+CREG网络注册。获得手机的注册状态。
 AT+WOPN读取操作员名字。
 AT+CPOL优先操作员列表。
四、安全命令
 AT+CPIN输入PIN。
 AT+CPIN2输入PIN2。
 AT+CPINCPIN的剩余的尝试号码。
 AT+CLCK设备锁。
 AT+CPWD改变密码。
五、电话簿命令
 AT+CPBS选择电话簿记忆存储。
 AT+CPBR读取电话簿表目。
 AT+CPBF查找电话簿表目。
 AT+CPBW写电话簿表目。
 AT+CPBP电话簿电话查询。
 AT+CPBN电话簿移动动作。这个特殊命令使电话簿中的条目前移或后移(按字母顺序)
 AT+CNUM签署者号码。
 AT+WAIP防止在下一次重起时初始化所有的电话簿。
 AT+WDCP删除呼叫电话号码。
 AT+CSVM设置语音邮件号码。
六、短消息命令
 AT+CSMS选择消息服务。支持的服务有GSM-MO、SMS-MT、SMS-CB。
 AT+CNMA新信息确认应答。
 AT+CPMS优先信息存储。这个命令定义用来读写信息的存储区域。
 AT+CMGF优先信息格式。执行格式有TEXT方式和PDU方式。
 AT+CSAS保存设置。保存+CSAS和+CSMP的参数。
 AT+CRES恢复设置。
 AT+CSDH显示文本方式的参数。
 AT+CNMI新信息指示。这个命令选择如何从网络上接收短信息。
 AT+CMGR读短信。信息从+CPMS命令设定的存储器读取。
 AT+CMGL列出存储的信息。
 AT+CMGS发送信息。
 AT+CMGW写短信息并存储。
 AT+CMSS从存储器中发送信息。
 AT+CSMP设置文本模式的参数。
 AT+CMGD删除短信息。删除一个或多个短信息。
 AT+CSCA短信服务中心地址。
 AT+CSCB选择单元广播信息类型。
 AT+WCBM单元广播信息标识。
 AT+WMSC信息状态(是否读过、是否发送等等)修正。
 AT+WMGO信息覆盖写入。
 AT+WUSS不改变SMS状态。在执行+CMGR或+CMGL后仍保持UNREAD。
七、追加服务命令
 AT+CCFC呼叫继续。
 AT+CLCK呼叫禁止。
 AT+CPWD改变追加服务密码。
 AT+CCWA呼叫等待。
 AT+CLIR呼叫线确认限制。
 AT+CLIP呼叫线确认陈述。
 AT+COLP联络线确认陈述。
 AT+CAOC费用报告。
 AT+CACM累计呼叫计量。
 AT+CAMM累计呼叫计量最大值。
 AT+CPUC单价和货币表。
 AT+CHLD呼叫相关的追加服务。
 AT+CLCC列出当前的呼叫。
 AT+CSSN追加服务通知。
 AT+CUSD无组织的追加服务数据。
 AT+CCUG关闭的用户组。

 

 

AT命令交互之-COPS选择营运商

模块默认一般都可以自动搜网注册,比如移动的就注册到移动,联通的就注册到联通。但是在不同的国家多网覆盖的使用情况下,有时候就算使用了自动搜网注册网络,也会出现注册不上网络的现象,这时候就需要使用手动搜网然后选择一个运营商进行强制注册。

 

1.AT+COPS命令说明

image.png

  1. 上面格式里面,stat这个值比较重要,他会直接告诉我们哪些运营商可用。
  2. <stat>
  3. 0 未知
  4. 1 可用
  5. 2 当前
  6. 3 禁用
  7. <oper>
  8. 运营商名称,根据 format 给出
  9. <mode>
  10. 0 自动注册 (忽略<format> <oper> 参数)
  11. 1 手动注册
  12. 2 强制注销
  13. 3 只设置格式
  14. 4 先手动再自动
  15. <format>
  16. 0 长字符格式<oper>
  17. 1 短字符格式<oper>
  18. 2 数字格式<oper>
  19. <AcT> 接入技术
  20. 0 GSM
  21. 1 GSM COMPACT
  22. 2 UTRAN
  23. 1. 配置命令选择并注册 GSM 网络营运商。<mode>设置 ME 是自动选择营运商<oper>,还是使用该命
  24. 令强制选择营运商<oper>
  25.  当<mode>=0 时,ME 将自动尝试选择可使用的运营商。
  26.  当<mode>=1 时,ME 将强制注册选择的<oper>运营商,若该运营商无效则当前 ME 不会搜索
  27. 其他可用运营商,直到<mode>=0 时 ME 才会重新注册网络。如果 ME 重启后仍然在<mode>=1
  28. 下且没有 RPLMN 的话,ME 会保持在不注册网络的状态直到使用命令改变成自动注册模式。
  29.  当<mode>=4 时,若手动选择运营商不可用,ME 会自动选择当前网络中可用运营商继续尝试注
  30. 册。
  31. 2. 该命令设置成功后会自动保存。

2.AT+COPS=?搜网

1.模块未插入SIM卡

我们想使用AT+COPS=?进行搜网,这时会有两种情况,一种是模块没插入卡,返回如下:

 

image.png

如上面所示,没插卡的时候返回的运营stat都是1,都是可以用运营商。

2.模块插入指定运营商的SIM卡

现在插入电信卡,在进行搜网操作

image.png

可以看到虽然返回了三个运营商,但是只有电信的stat是1,其他两个stat都是3,forbidden。

3.AT+COPS=设置网络

1.手动设网,已知要设置的网络

  1. 1.强制注销网络 AT+COPS=2,2
  2. 2.设置要使用的网络 AT+COPS=1,2,"46001",2
  3. 3.设置查询格式 AT+COPS=3,2 数字型
  4. 4.查询当前运营商 AT+COPS?

image.png

2.手动设网,未知要设置的网络

  1. 1.设置格式 AT+COPS=3,0 长字符型
  2. 2.查询可用运营商 AT+COPS=?
  3. 3.强制注销网络 AT+COPS=2,2
  4. 4.设置要使用的网络 AT+COPS=1,2,"46001",2
  5. 5.设置查询格式 AT+COPS=3,2 数字型
  6. 6.查询当前运营商 AT+COPS?

image.png

 

联通2G基本退网了

 

 

查询命令:AT+CGREG?
返回:+CGREG:<n>,<stat>[,<lac>,<ci>]   OK

参数  取值 说明
n  [0] 禁用网络注册非请求结果码+CGREG:
[1] 启用网络注册非请求结果码
[2] 启用网络注册和位置信息非请求结果码+CGREG:<stat>[,<lac>,<ci>]

<stat> [0] 未注册;ME 当前没有搜索注册业务的新运营商
[1] 已注册,本地网
[2] 未注册,但ME 正在搜索注册业务的新运营商
[3] 注册被拒绝
[4] 未知
[5] 已注册,漫游

<lac> 字符型;2 位十六进制位置区代码(比如:00C3相当于十进制中的195)
<ci> 字符型;2 位十六进制小区编号

Filed under: 其它 Comments Off
24Dec/19

适合跑步的心率区间是什么?

Posted by Nick Xu

你好,关于“适合跑步的心率区间是多少?”这个问题我们先从什么是心率开始说起。

心率是指心脏在一定时间内跳动的次数,也就是在一定时间内,心脏跳动快慢的意思。

接下来我们通过几个小步骤来完成适合你跑步区间的心率测算:

1、了解自己的最大心率和安静心率,从而确定你的心率波动范围。

2、判断当前心率值处于什么区间,是高还是低,由此来把握训练强度的大小。

3、将安静心率与最大心率填入你手表的“个人设置”中,将各区间百分比数值设置正确。

4、在比赛前,将“心率区间”添加到你手表的数据页面中。在比赛时,“心率区间”是最重要的监测指标,需要时刻关注——全马比赛将其保持在3.0以下,半马比赛保持在4.0以下。

具体方法如下:

1、测量最大心率与安静心率

不同的人,心率高低可以互相比较吗?

——不可以。

最大心率就是用220-年龄来计算吗?

——不是。

maf180训练法适合马拉松跑者吗?

——适合,但不是最好的方法。

实际上,单纯的心率数据,是没有太多的训练指导意义的。因为你并不清楚,这个数值究竟是高了还是低了,更有意义的数值是“心率区间”。

所以,你首先要了解自己的最大心率和安静心率,从而确定你的心率波动范围。

(1)测量安静心率

安静心率很好理解,就是静止不动时的最低心率。测量方法如下:

选择一天睡眠充足的早晨,起床后站在床边,静止1分钟。1分钟之后,跑表上显示出的心跳数值,就是你的安静心率。

这里需要注意的是,我们跑步是站着跑的,所以安静心率也需要站着来测量。

(2)测量最大心率

很多人见过“220-年龄”这个最大心率的计算公式,但不清楚这只是学术研究用来写论文的,不能用在真正的跑步指导中。

最大心率数据必须通过实际跑测来获得,测试方法如下:

630-600配速800米,

原地休息2分钟。

600-530配速800米,

原地休息2分钟。

530-500配速800米,

原地休息2分钟。

500-430配速800米,

原地休息2分钟。

430-400配速800米,

原地休息2分钟。

400-330配速800米,

原地休息2分钟。

330-300配速800米,

原地休息2分钟。

300-230配速800米。

要注意的是,不用把所有配速组跑完,当本组已经跑到你的9成力时,最后加速冲刺跑完本组,完成测试即可。

除了操场跑圈之外,还有跑步机测试、坡度测试等方法,大家可以自行查找资料来学习。

每次测试并不一定都会成功,测试效果会受到体能疲劳、气温、精神兴奋度等因素影响。所以,建议跑力相近的跑者组团一起测试,更容易“逼出”最大心率。一般来说,比赛的时候,我们都会更兴奋,心率容易升高,所以在5公里、10公里测试中,也可能更容易跑出最大心率。

对一般的跑步爱好者来讲,最大心率测试是比较安全的。人体自我有较强保护机制,800米跑虽然速度快,但最后冲刺的距离较短,还没到生理极限,觉得呼吸不过来时,大脑就会命令你停下。所以更多时候,我们会因为自我保护机制太强大,测不出实际的最大心率。

但对于有心脏、血压类疾病的人,或是长期缺乏运动、体质较弱的人,出于安全考虑,建议用原地跑的方式来测试最大心率,或是先以过去跑到过的最大心率值为准。

2、划分好心率区间

当你知道了自己的心率高点和低点之后,就可以判断当前心率值处于什么位置,是高还是低,由此来把握训练强度的大小。

丹尼尔斯博士的储备心率法,正是将我们的心率范围划分成5个区间,由此来判断当前的训练强度以及效果。

这五个区间分别是E轻松跑(Easy zone)、M马拉松配速跑(Marathon zone)、T乳酸阈值强度(Threshold zone)、A无氧耐力区间(Anaerobic zone)、I最大摄氧强度(Interval zone)。(注:A强度是徐国峰老师后续补充加入的)

其中,E、M为有氧区间,A、I为无氧区间,T为无氧有氧过渡区间。

(1)E强度:轻松跑

E心率区间:【(最大心率-安静心率)*59%+安静心率,(最大心率-安静心率)*74%+安静心率】

E跑也就是我们俗称的“慢跑”,也是LSD的配速。那么,何谓“慢”呢?就是需要将心率保持在上述区间内。

E跑是有氧能力的基础,所有的业余跑者,都应该从E心率开始练起,并且在跑了一段时间后,不要急着加速,而是适当将距离加长。

在E心率区间内的长期训练,可以帮助我们打下扎实的有氧基础,并且提高肌肉端燃脂有氧的能力,增强心脏收缩的力量,并使肌纤维变得强韧,避免受伤。

对马拉松跑者而言,平时训练,E跑30分钟以上才会有训练效果,但最长也需要不超过2.5小时。

(2)M强度:马拉松配速

M心率区间:【(最大心率-安静心率)*74%+安静心率,(最大心率-安静心率)*84%+安静心率】

M跑是马拉松跑,M跑可以帮助我们模拟全马比赛强度、提升掌握配速的能力。

M跑的训练效果与E跑相似,但它的强度比E跑更大,单次训练时间建议不要超过110分钟。

M心率区间是我们全马比赛时应当参照的心率区间。换句话说,当你在跑全马比赛时,监控心率,就是需要将心率尽量维持在M区间值的峰值以内。(即使最后冲刺时会超出M区间,也要格外留心,关注体感变化)。

在你跑崩之前,你的心率一定会先崩,只是你没有察觉、没有概念,或者压根没有重视。

我们跑步监测心率,一是为了保证安全,二是为了确保成效。当你理解了马拉松的本质是一项有氧运动,你就会明白,只有将心率控制在有氧范围内(也就是M强度以下),才能安全、顺利、漂亮地完成一场全马赛事。

(3)T强度:乳酸阈值强度

T心率区间:【(最大心率-安静心率)*84%+安静心率,(最大心率-安静心率)*88%+安静心率】

T跑很特别,它是无氧与有氧的过渡区间,在这个区间里,乳酸生成的速度与排除的速度相当。

所以,当我们经常训练T跑,乳酸临界速度会提升,利用乳酸供能的能力会提高,有氧区间也会跟着扩大,进而提升我们的有氧运动表现。

T跑相当于我们的半马配速。即便是高手,也最多只能连续跑60分钟,顶尖选手的半马成绩是在60分钟左右,这也是侧面的印证。

这也意味着,当你跑半马的时候,如果想在安全范围内跑出更好的成绩,就需要监控心率维持在T区的上限以下。

换句话说,假使你跑半马时,不管心率,一路狂飙到T区以上,那后果要么是掉速,要么是跑晕,反正跑崩是必然。

(4)A强度:无氧耐力

A心率区间:【(最大心率-安静心率)*88%+安静心率,(最大心率-安静心率)*95%+安静心率】

A跑可以当做5-10公里的比赛配速。它的主要训练目的是让身体学会从乳酸过量恢复到有氧区间的能力。

它的训练效果与I跑相似,对于从没有跑过间歇跑的跑者,跑A强度的间歇跑就可以有效提升最大摄氧量。

(5)I强度:最大摄氧强度

I心率区间:【(最大心率-安静心率)*95%+安静心率,(最大心率-安静心率)*100%+安静心率】

I跑就是我们通常说的“亚索800”训练,可以用来当做3-5公里配速。

它的训练目的是为了刺激最大摄氧量,提升跑步经济性。同时,I跑也是锻炼意志力的好时机,因为你必须在心率飚到高峰值时,咬牢坚持到底,这也是出效果的关键所在。

3、跑步监控心率区间

(1)设置好手表参数

很多跑者虽然有心率装备,但是不知道该怎么用好它。

当你测量好安静心率与最大心率后,将它们填入你手表的“个人设置”中,并选择“基于储备心率百分比”,然后将各区间百分比数值设置正确,这样你就可以用手表来做训练指导。

另外,在比赛前,将“心率区间”添加到你手表的数据页面中。在比赛时,“心率区间”是你最重要的监测指标,需要时刻关注——全马比赛将其保持在3.0以下,半马比赛保持在4.0以下。

我们要知道,心率是一个被动指标,它不仅受到运动剧烈程度的影响,还与气温、坡度、身体疲劳指数等因素直接相关。

就像今年的上海半马、伦敦马拉松,之所以有这么多人出现不适,与气温偏高有很大关系。

在这样的赛况下,如果你还按照平时的配速来跑,心率必然会飘高,甚至会高到无氧区。所以,有经验的跑者就会选择降速,而其本质就是要维持心率在目标区间范围内。

天意难为,赛况是无法人为控制的。我们能做的,就是在现有的赛况下“尽人力”,将心率维持在目标区间内,这既是为了安全顺利完赛,也是为了跑出理想成绩。

(2)守住有氧底线

E、M、T、A、I这五个心率区间,既是日常训练时保证效果的强度标准,也是比赛时在确保安全的前提下,获得好成绩的监测标准。

其中,有氧区间的E跑和M跑是关键的基石,尤其是E跑。安心练好有氧跑,你就可以顺利完成马拉松赛,并且成绩不会太差。

无氧区间的A跑和I跑是进阶的练习,进阶的前提是你的有氧基础已经打得足够扎实,否则练了无氧速度,也是空中楼阁。

乳酸阈值区间的T跑是耐力提升的窍门,可以让我们能更好地适应、利用和排除乳酸。

从体感上讲,E跑是最舒适的,I跑是最痛苦的。当我们跑步处于A和I心率区间时,乳酸和各种代谢副产物迅速积累,呼吸急促,分分钟想放弃。

在日常跑步中,我们一旦进入无氧区间后会很痛苦,想要慢下来,就像我们都很讨厌的800米跑一样。

但是,切换到比赛中,当我们被心中强烈的完赛目标所驱动,被赛道旁热烈的加油声所鼓动,甚至强大的意志力、兴奋的肾上腺素,会让我们忽视了肉体的痛苦,任由心率在高位盘旋,那后果将很可能是:体力不支,抽筋,跑崩,甚至出现不幸的意外。

这也是为何明明是有氧运动的马拉松项目,心率本不应该那么高,不该是那么剧烈的运动,却在赛道上多次发生猝死的意外。

因此,想要知道自己适合跑步的心率区间是多少,可以按照上面给出的方法尝试一下哦。

 

 

 

 

 

想在秋季获得收获,此前的汗水必不可少。距离比赛前的3个月/12周是马拉松备战的黄金期,能否实现目标全看这几个月的执行了——在汇总并解读这些训练计划之前我们依然要强调几点:

  • 靠谱的训练计划一定是针对个体当下情况和未来现实(时间/目标)情况,订制的。即,你可以根据自己实际调整计划,而不用刻意按部就班的照着训练;
  • 马拉松是一项较高风险的运动,不要轻易去“越级”。我们建议具备轻松完成半马的选手去尝试挑战马拉松、全马具备4小时实力的选手去尝试突破330,而非直接越级去追求太远的目标;
  • 接下来高温多雨的夏季会为跑步造成不少困扰,建议跑者选择合适的训练装备,多关注心率等运动数据,出现训练伤病或感冒等疾病,请务必调整或终止训练计划;

理论上,一个训练计划执行度能达到85%,即是一个非常不错的完成度了。

训练计划解读

  • 跑的更慢一些

要知道,即便是川内优辉这样的精英级选手,平日里他依然会花大量时间去「慢慢跑步」,而不是大量的高频速度训练。马拉松本质上依然是一项有氧运动,身体消耗的能量99%来自你的有氧系统。所以对目标完赛的新人而言,并没有太多必要去进行太多导致大量乳酸堆积的训练;

  • 不要过量训练

跑的过于频繁也是不可取的。全马新手往往过于担心自己的训练量是否满足需要,但即便训练量普遍较高的日本跑者,他们依然会花大量的时间去休息和调整,以让自己身体恢复。切记好的训练一定是训练+休息共同组成,跑的太过频繁除了让自己可能增加受伤风险、降低训练质量外,未必最终一定就能跑的更好。

对多数马拉松爱好者而言,每周跑3-4次即可。

  • 重视每一次慢跑的热身/冷身

无论接下来进行何种强度的训练,每次跑步前都至少需要15-20分钟时间让自己热身,完成训练后也尽量慢慢停下来,认真做好拉伸/冷身才算训练正式结束。

计划中提到的训练内容——

有氧慢跑:一般距离不超过16公里,强度约储备心率*的62%-75%。

长距离跑:一般指超过26公里的跑步训练,为了提升耐力,为全马距离做准备。强度约为储备心率的65%-75%。

中长距离跑:18-26公里之间,配速与长距离跑接近。

马拉松配速跑:训练中很大一部分距离以目标马拉松配速完成。

乳酸门槛跑/节奏跑:训练中有超过20分钟是以乳酸阈值配速进行的节奏跑,目标提高乳酸阈值,帮助提升跑马拉松时的比赛配速。强度一般在储备心率的77-88%。

恢复跑**:配速轻松的放松慢跑,加速身体恢复,为下次训练作准备。

XT/rest:休息或者非跑步的其它运动,但强度不要太高。

最大摄氧/间隙(VO2Max):间歇跑总距离不长,强度很大,场地也尽量选择操场或环形封闭公路。

*注:心率作为衡量训练强度的主要参数,其中储备心率=最大心率-静息心率。

最大心率:网上有诸多最大心率的计算方式,建议可以搜索一下,选择其中较为接近的结果取平均值。这里提供一个计算公式作为参考:最大心率=217-(0.85x年龄);

静息心率:早上醒来后别起床,靠床上坐一分钟,让身体和思维放空,此时测量出的心率数值,大体就是静息心率了;

储备心率的比例百分比再加上静息心率,即训练要求的目标心率区间。

一些有氧/恢复跑中的ST指冲刺跑,一般在有氧或者恢复跑后进行,每组100米指前70米加速,后30米减速,不要求像百米冲刺那样尽力,加速跑时留意下跑姿,做针对性的纠正。

  • 安全完成马拉松训练计划

这是一份12周(3个月)、针对马拉松新手的训练计划——开始这个训练计划前,希望跑者已经完成过半程马拉松,或具备了跑完半马(21.0975公里)的实力。

  • 马拉松破4训练计划

相比轻松完成马拉松,跑进4小时对绝大多数人而言都需要更为系统的训练。除了有氧能力的继续加强,也增加了最大摄氧量训练和节奏跑这样偏速度的练习。

在跑量方面也有增加——考虑到接下来夏季普遍高温天及多雨水,跑者可以根据具体情况适当删减。但每月达到至少200公里跑量,依然是比较建议的。

  • 马拉松跑进330计划

马拉松完赛计划的月跑量接近200公里,破4训练计划的月跑量接近240公里,成就330计划的月跑量并不只是再次增加而已,它要求在保证训练“量”的同时,“质”是更值得注意的一个点。即,只是单纯的堆跑量未必就能实现目标,过于超纲的训练强度亦不会是成功保障。

这份计划里,心率、配速或时间都可以作为训练的参照——如果你已经具备跑进4小时或者3小时45的水准,相信已经对自己不同强度下心率/配速或者时间有了一定了解。后面我们也以心率这个对每个人最客观的数据,谈一下在比赛中如何通过心率制定参赛策略。

训练计划由有氧、马拉松配速、间歇、节奏、中距离、长距离等组成,每份合格的训练计划理应针对不同个体量身定做,所以你可以结合自己的时间和习惯做调整。有些人每周跑3-4次,有些人会跑5-6次,也有人有足够条件一天多练——这都是正常的情况,并不意味着强行要去采用统一的安排。但是切记每周的较高强度训练间,确保至少两天时间是XT/rest、有氧或恢复跑这样低强度的训练,避免负荷过大带来潜在伤病。

更高强度也意味着身体需要更多休息,3个月的备战是训练黄金期,也是调整身体状态的必要期,饮食、睡眠和对肌肉关节的放松按摩与训练一样重要。

全程马拉松比赛策略

  • 热身

如果只是为了跑完马拉松,赛前热身并非是重头戏——你可以用比赛开始后的几公里作为热身的一部分,也为了避免浪费体能。而对于进阶跑者而言,及早进入比赛状态就是件很重要的事情。

热身应该安排在赛前30-40分钟,慢慢进行5分钟的热身跑,而后将配速达到6分/公里,热身跑完后进行10分钟的拉伸,包括对腿部肌肉的按摩、放松肩膀,随后再进行一次5分钟的热身跑,这次要求达到比赛配速(全马4小时配速约为5分40/公里),再进行拉伸调整。

热身也是检查比赛装备的最后机会,比如号码簿是否佩戴平整,鞋带和鞋垫是否需要调整松紧,等等。

  • 前半程

很多跑者知道,想完成马拉松目标,匀速是很关键的。但客观上跑者的跑步经济性会随着运动时间的推移变得更差。所以比赛中的配速很难以全程匀速去执行。

前面两公里可以考虑比目标配速慢20-30秒/公里,如今马拉松都会安排兔子,但多数比赛参赛选手诸多,可能你在比赛发枪时与兔子保持较远距离,即便这样也不要过于焦急的去追兔子。比赛开始前虽然经过热身,但身体未必在最佳状态,比赛一开始就跑得太快,身体也会消耗过多的糖原储备并堆积过多的乳酸。

对很多有经验的马拉松选手而言,42公里的比赛,可能前5公里都是一个调整期——今天的比赛状态如何,是否应该调整比赛策略和目标,都会在跑完前5公里后根据身体反馈来更改。

如果一切顺利,5公里之后你应该就会处于很好的比赛状态,按照目标配速前行。

  • 最后十公里

有句话叫,马拉松是32公里的热身外加最后10公里的发挥。从半程到32公里是段容易产生疲惫感的距离,但还有最后10公里要完成。比赛进行到这个时候,掉速变得很常见,其中主要原因未必只是你身体没有能力维持配速,还包括注意力开始不集中。

在最后十公里,尽量跟住兔子或者配速较为一致的选手同步行进,随着不断接近终点,告诉自己“还有5公里”或者“只剩下15分钟了”也将非常有激励作用。

另外切记一点,无论是否口渴,后半程每个补水点都应该补充适当的水分,直到最后一公里。

对进阶选手而言,如何通过心率掌控比赛

我们知道全程马拉松想跑进330,42公里平均配速要达到4分55秒左右——比赛中选手实际跑过的距离往往要比42.195公里多出2、3百米,且经过补给站也容易出现速度下降的情况,实际跑步的配速兴许还要更快一些。

每个人都有自己的跑步节奏和补给习惯,可能同样是目标330的选手,他们也未必全程都是一前一后的。这里给出一种以最大心率比例为参考的策略。

留意配速的同时关注自己心率,可以获知当下处于的状态——可能为了达到目标而过快的消耗体能,还是一切尽在掌握能超预期的发挥?

  • 0-3公里

比赛前需要充分的热身,确保比赛开始后心率能平稳进入有氧心率区间,并在3公里完成时接近最大心率的75%-80%。

  • 4-21公里

维持心率在最高心率的75%-80%,尽量不要超过84%。过高的心率非常容易导致过早消耗。留意心率的同时,确保配速稳定,避免忽快忽慢。

  • 22-30公里

心率可维持在最高心率的80%-85%。

  • 31-39公里

心率可维持在最高心率的85%左右。此时随着跑步时长的进行,你可能会意识到心率略有提升但配速并未有增长(或者说,维持配速的同时,心率也会有一定提升)。在马拉松最艰苦的赛段,你的跑步效率会出现下降,这是很正常的情况。

  • 39-42公里

尚有余力或力争最后阶段“冲击”一下成绩的选手,往往此时会选择咬牙加速。注意此时的心率也尽量不要超过92%,也需要特别留意把能量均匀消耗到终点,不要贸然提速。相比漫长的42公里,最后几百米的冲刺未必对成绩有太大影响,匀速且微笑着冲线吧!

Filed under: 其它 Comments Off
5Dec/19

小米小白摄像头云台版无法更新固件

Posted by Nick Xu

之前买的小米的米家的 小白智能摄像机 摄像头 1080P云台版

之前用的好好的,前不久,无法正常升级固件了:

进去了固件升级页面

当前版本:3.3.6_2018061418

最新版本:3.3.6_2018121218

升级后,还是旧版本

更郁闷的是:监控界面中

(此刻已断点,所以是离线)

反应非常迟钝:

点击摄像头移动方向,结果半天才反应

而且录制存储的历史视频,也是点击了半天才能看,而且很卡顿,不流畅。

之前是正常的。

最近这,无法升级,也不能正常使用。

想办法去解决。

看到

使用帮助中有个我要的:无法在线升级了怎么办

摄像机获取失败/黄灯常亮/无法在线升级怎么办?

您好,出现此问题可以尝试使用SD卡升级,具体方法如下:

1、使用读卡器将Micro-SD卡与电脑连接

2、在电脑端打开链接: http://cdn.cnbj2.fds.api.mi-img.com/chuangmi-cdn/product/ipc004/firmware/IPC004_3.3.6_2018061418.zip

3、下载固件文件:IPC004_3.3.6_2018061418.zip,下载成功后右击鼠标,选择“解压到当前文件夹”,点击进入文件夹

4、将 tf_recovery.img文件(不要解压)复制到Micro-SD卡里,不要放在任何文件夹下

5、摄像机断电->插入Micro-SD卡->摄像机插上电

6、此时摄像机 “黄灯常亮”,持续亮大概2分钟

7、升级成功后,设备自动启动,进入摄像机设置-通用设置-检查固件更新:版本号:3.3.6_2018061418

注:Micro-SD卡升级成功后,卡中的升级包名称,也会变更为:tf_recovery.img.bak

即,用SD卡升级。

所以去拔出摄像头的SD卡(注意:SD卡在摄像头 黑色的圆圈的下面一点,让摄像头方面向上调整,就看到了)

然后接着去想办法去通过SD卡升级固件

之前看到是:

当前版本:3.3.6_2018061418

最新版本:3.3.6_2018121218

此处提示的是:

http://cdn.cnbj2.fds.api.mi-img.com/chuangmi-cdn/product/ipc004/firmware/IPC004_3.3.6_2018061418.zip

不是最新版,试试最新版的地址:

http://cdn.cnbj2.fds.api.mi-img.com/chuangmi-cdn/product/ipc004/firmware/IPC004_3.3.6_2018121218.zip

能否下载,是可以的,下载后,解压得到:

好不容易,找了个micro sd卡读卡器,插上后,mac识别无法支持,所以去格式化为FAT:

然后拷贝进去tf_recovery.img:

即可。

然后放回到摄像头中,去重新上电,看看是否可以正常升级

的确常亮黄灯了:

稍等一下,然后

就正常使用了,可以正常快速的移动摄像头方向了:

去看了看固件版本也是最新的了:

当前版本:3.3.6_2018121218

存储卡也是正常的:

后记:

搜:

http://cdn.cnbj2.fds.api.mi-img.com

基本概念 · Xiaomi Galaxy FDS Doc

http://docs.api.xiaomi.com/fds/basic-concept.html

cnbj2

北京2区

北京-金山云

cnbj2

cnbj2.fds.api.xiaomi.com

cdn.cnbj2.fds.api.mi-img.com

-》

是金山云的cdn的存储

http://cdn.cnbj2.fds.api.mi-img.com/cdn/aqara/documents/Aqara_Product_Brochure.pdf

MI home security camera 360 (MIXJ04CM) – Page3 – Mi Gadgets – Xiaomi MIUI Official Forum

https://en.miui.com/thread-4999422-3-1.html

好像最新版本是:

http://cdn.cnbj2.fds.api.mi-img.com/chuangmi-cdn/product/ipc003/firmware/IPC003_3.4.5_2019010211.zip

-》不一定是适配当前相机的,

看到了,自己此处的地址:

http://cdn.cnbj2.fds.api.mi-img.com/chuangmi-cdn/product/ipc004/firmware/IPC004_3.3.6_2018121218.zip

中:

product=ipc004

上面的是:

product=ipc003

所以不是我们要的

试了试部分的地址直接打开,是不行的

http://cdn.cnbj2.fds.api.mi-img.com ipc004

小米智能摄像机云台版为何不能更新 – 小米社区官方论坛

http://bbs.xiaomi.cn/t-35016196

XIAOMI MIJIA 360 720P I THINK ITS BRICK. – Page2 – Mi Gadgets – Xiaomi MIUI Official Forum

https://en.miui.com/thread-1491166-2-1.html

关于米家智能摄像机在Android手机获取信息失败和苹果手机-1000问题 – 小米社区官方论坛

http://www.hfsgcjs.com/6727/t-34807300-u227177747

【总结】

对于此处的

小白智能摄像机 摄像头 1080P云台版

从产品中的帮助:

右上角设置-》使用帮助-》摄像头获取失败/黄灯常亮/无法在线升级失败怎么办?

摄像机获取失败/黄灯常亮/无法在线升级怎么办?

您好,出现此问题可以尝试使用SD卡升级,具体方法如下:

1、使用读卡器将Micro-SD卡与电脑连接

2、在电脑端打开链接: http://cdn.cnbj2.fds.api.mi-img.com/chuangmi-cdn/product/ipc004/firmware/IPC004_3.3.6_2018061418.zip

3、下载固件文件:IPC004_3.3.6_2018061418.zip,下载成功后右击鼠标,选择“解压到当前文件夹”,点击进入文件夹

4、将 tf_recovery.img文件(不要解压)复制到Micro-SD卡里,不要放在任何文件夹下

5、摄像机断电->插入Micro-SD卡->摄像机插上电

6、此时摄像机 “黄灯常亮”,持续亮大概2分钟

7、升级成功后,设备自动启动,进入摄像机设置-通用设置-检查固件更新:版本号:3.3.6_2018061418

注:Micro-SD卡升级成功后,卡中的升级包名称,也会变更为:tf_recovery.img.bak

得知升级流程。

而从产品固件升级失败的页面可以看到最新版本是:3.3.6_2018121218

所以下载地址是:

http://cdn.cnbj2.fds.api.mi-img.com/chuangmi-cdn/product/ipc004/firmware/IPC004_3.3.6_2018121218.zip

下载后,解压得到tf_recovery.img

放到sd卡根目录,插上,上电,等一会,就好了。

去看看最新版本,果然是最新的:3.3.6_2018121218

备注说明:

(1)其他不同型号的摄像头的产品编号和固件升级地址

Filed under: 其它 Comments Off
28Feb/18

一步步教你创建自己的数字货币(代币)进行ICO

Posted by Nick Xu

本文从技术角度详细介绍如何基于以太坊ERC20创建代币的流程.

写在前面

本文所讲的代币是使用以太坊智能合约创建,阅读本文前,你应该对以太坊、智能合约有所了解,如果你还不了解,建议你先看以太坊是什么

代币Token

如果不那么追求精确的定义,代币就是数字货币,比特币、以太币就是一个代币。 利用以太坊的智能合约可以轻松编写出属于自己的代币,代币可以代表任何可以交易的东西,如:积分、财产、证书等等。 因此不管是出于商业,还是学习很多人想创建一个自己的代币,先贴一个图看看创建的代币是什么样子。

今天我们就来详细讲一讲怎样创建一个这样的代币。

ERC20 Token

也许你经常看到ERC20和代币一同出现, ERC20是以太坊定义的一个代币标准。 要求我们在实现代币的时候必须要遵守的协议,如指定代币名称、总量、实现代币交易函数等,只有支持了协议才能被以太坊钱包支持。 其接口如下:

contract ERC20Interface {

    string public constant name = "Token Name";
    string public constant symbol = "SYM";
    uint8 public constant decimals = 18;  // 18 is the most common number of decimal places

    function totalSupply() public constant returns (uint);
    function balanceOf(address tokenOwner) public constant returns (uint balance);
    function allowance(address tokenOwner, address spender) public constant returns (uint remaining);
    function transfer(address to, uint tokens) public returns (bool success);
    function approve(address spender, uint tokens) public returns (bool success);
    function transferFrom(address from, address to, uint tokens) public returns (bool success);

    event Transfer(address indexed from, address indexed to, uint tokens);
    event Approval(address indexed tokenOwner, address indexed spender, uint tokens);
}

简单说明一下: name : 代币名称 symbol: 代币符号 decimals: 代币小数点位数,代币的最小单位, 18表示我们可以拥有 .0000000000000000001单位个代币。 totalSupply() : 发行代币总量。 balanceOf(): 查看对应账号的代币余额。 transfer(): 实现代币交易,用于给用户发送代币(从我们的账户里)。 transferFrom(): 实现代币用户之间的交易。 allowance(): 控制代币的交易,如可交易账号及资产。 approve(): 允许用户可花费的代币数。

编写代币合约代码

代币合约代码:

pragma solidity ^0.4.16;

interface tokenRecipient { function receiveApproval(address _from, uint256 _value, address _token, bytes _extraData) public; }

contract TokenERC20 {
    string public name;
    string public symbol;
    uint8 public decimals = 18;  // 18 是建议的默认值
    uint256 public totalSupply;

    mapping (address => uint256) public balanceOf;  // 
    mapping (address => mapping (address => uint256)) public allowance;

    event Transfer(address indexed from, address indexed to, uint256 value);

    event Burn(address indexed from, uint256 value);


    function TokenERC20(uint256 initialSupply, string tokenName, string tokenSymbol) public {
        totalSupply = initialSupply * 10 ** uint256(decimals);
        balanceOf[msg.sender] = totalSupply;
        name = tokenName;
        symbol = tokenSymbol;
    }


    function _transfer(address _from, address _to, uint _value) internal {
        require(_to != 0x0);
        require(balanceOf[_from] >= _value);
        require(balanceOf[_to] + _value > balanceOf[_to]);
        uint previousBalances = balanceOf[_from] + balanceOf[_to];
        balanceOf[_from] -= _value;
        balanceOf[_to] += _value;
        Transfer(_from, _to, _value);
        assert(balanceOf[_from] + balanceOf[_to] == previousBalances);
    }

    function transfer(address _to, uint256 _value) public {
        _transfer(msg.sender, _to, _value);
    }

    function transferFrom(address _from, address _to, uint256 _value) public returns (bool success) {
        require(_value <= allowance[_from][msg.sender]);     // Check allowance
        allowance[_from][msg.sender] -= _value;
        _transfer(_from, _to, _value);
        return true;
    }

    function approve(address _spender, uint256 _value) public
        returns (bool success) {
        allowance[msg.sender][_spender] = _value;
        return true;
    }

    function approveAndCall(address _spender, uint256 _value, bytes _extraData) public returns (bool success) {
        tokenRecipient spender = tokenRecipient(_spender);
        if (approve(_spender, _value)) {
            spender.receiveApproval(msg.sender, _value, this, _extraData);
            return true;
        }
    }

    function burn(uint256 _value) public returns (bool success) {
        require(balanceOf[msg.sender] >= _value);
        balanceOf[msg.sender] -= _value;
        totalSupply -= _value;
        Burn(msg.sender, _value);
        return true;
    }

    function burnFrom(address _from, uint256 _value) public returns (bool success) {
        require(balanceOf[_from] >= _value);
        require(_value <= allowance[_from][msg.sender]);
        balanceOf[_from] -= _value;
        allowance[_from][msg.sender] -= _value;
        totalSupply -= _value;
        Burn(_from, _value);
        return true;
    }
}

代码的详细解读,请订阅我的小专栏

部署

在开发测试智能合约时,MetaMaskRemix Solidity IDE是两个非常好用的工具,今天就用他们来完成部署。

  1. 安装和配置MetaMask请参考开发、部署第一个去中心化应用,不同的上本文选择了以太坊的测试网络Ropsten,如果你没有余额请点击购买buy,进入的网站可以送一些测试以太币给你,配置好之后,界面应该如下:

  2. 浏览器打开Remix Solidity IDE,复制以上源码粘贴上,在右侧选项参考如图的设置:

    注意Environment和Account和MetaMask保持一致,然后选择合约TokenERC20,填入你想要的发行量,名称及代号,就可以创建合约了。 这时MetaMask会弹出一个交易确认框,点SUBMIT。待合约部署交易确认之后,复制合约地址。

  3. 打开Metamask界面,切换到TOKENS,点添加合约,出现如下对话框:

    填入刚刚复制的地址,点ADD,这时你就可以看到你创建的代币了,如图:

哈哈,你已经完成了代币的创建和部署(正式网络和测试网络部署方法一样),可以在Etherscan查询到我们刚刚部署的代币。可以用它进行ICO了,从此走上人生巅峰(玩笑话,不鼓励大家发行无意义的代币)。

代币交易

由于MetaMask插件没有提供代币交易功能,同时考虑到很多人并没有以太坊钱包或是被以太坊钱包网络同步问题折磨,今天我用网页钱包来讲解代币交易。

  1. 进入网页钱包地址, 第一次进入有一些安全提示需要用户确认。
  2. 进入之后,按照下图进行设置:

  3. 连接上之后,如图

    需要添加代币,填入代币合约地址。

  4. 进行代币转账交易

    在接下来的交易确认也,点击确认即可。

  5. 交易完成后,可以看到MetaMask中代币余额减少了,如图:

代币交易是不是很简单,只要明白了交易流程,使用其他的钱包也是一样的道理。

如果你在创建代币的过程中遇到问题,我的**知识星球**可为大家解答问题。

参考文档

深入浅出区块链 - 系统学习区块链,打造最好的区块链技术博客。

作者:Tiny熊
链接:https://juejin.im/post/5a65d25351882573485a13e3
来源:掘金
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

Filed under: 其它 Comments Off
26Dec/17

Window 下安装 Memcached

Posted by Nick Xu

官网上并未提供 Memcached 的Window平台安装包,我们可以使用以下链接来下载,你需要根据自己的系统平台及需要的版本号点击对应的链接下载即可:

在 1.4.5 版本以前 memcached 可以作为一个服务安装,而在 1.4.5 及之后的版本删除了该功能。因此我们以下介绍两个不同版本 1.4.4 及 1.4.5的不同安装方法:


memcached <1.4.5 版本安装

1、解压下载的安装包到指定目录。

2、在 1.4.5 版本以前 memcached 可以作为一个服务安装,使用管理员权限运行以下命令:

c:\memcached\memcached.exe -d install

注意:你需要使用真实的路径替代 c:\memcached\memcached.exe。

3、然后我们可以使用以下命令来启动和关闭 memcached 服务:

c:\memcached\memcached.exe -d start
c:\memcached\memcached.exe -d stop

4、如果要修改 memcached 的配置项, 可以在命令行中执行 regedit.exe 命令打开注册表并找到 "HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\memcached" 来进行修改。

如果要提供 memcached 使用的缓存配置 可以修改 ImagePath 为:

"c:\memcached\memcached.exe" -d runservice -m 512

-m 512 意思是设置 memcached 最大的缓存配置为512M。

此外我们还可以通过使用 "c:\memcached\memcached.exe -h" 命令查看更多的参数配置。

5、如果我们需要卸载 memcached ,可以使用以下命令:

c:\memcached\memcached.exe -d uninstall

memcached >= 1.4.5 版本安装

1、解压下载的安装包到指定目录。

2、在 memcached1.4.5 版本之后,memcached 不能作为服务来运行,需要使用任务计划中来开启一个普通的进程,在 window 启动时设置 memcached自动执行。

我们使用管理员身份执行以下命令将 memcached 添加来任务计划表中:

schtasks /create /sc onstart /tn memcached /tr "'c:\memcached\memcached.exe' -m 512"

注意:你需要使用真实的路径替代 c:\memcached\memcached.exe。

注意:-m 512 意思是设置 memcached 最大的缓存配置为512M。

注意:我们可以通过使用 "c:\memcached\memcached.exe -h" 命令查看更多的参数配置。

3、如果需要删除 memcached 的任务计划可以执行以下命令:

schtasks /delete /tn memcached
31Aug/17

峰值QPS/QPS/PV/UV/服务器数量/并发数/吐吞量/响应时间计算公式

Posted by Nick Xu

QPS:
每秒查询率(Query Per Second) ,每秒的响应请求数,也即是最大吞吐能力。
QPS = req/sec = 请求数/秒
QPS统计方式 [一般使用 http_load 进行统计]
QPS = 总请求数 / ( 进程总数 * 请求时间 )
QPS: 单个进程每秒请求服务器的成功次数
峰值QPS:
原理:每天80%的访问集中在20%的时间里,这20%时间叫做峰值时间
公式:( 总PV数 * 80% ) / ( 每天秒数 * 20% ) = 峰值时间每秒请求数(QPS)
PV:
访问量即Page View, 即页面浏览量或点击量,用户每次刷新即被计算一次
单台服务器每天PV计算
公式1:每天总PV = QPS * 3600 * 6
公式2:每天总PV = QPS * 3600 * 8
UV:
独立访客即Unique Visitor,访问您网站的一台电脑客户端为一个访客。00:00-24:00内相同的客户端只被计算一次
服务器数量:
机器:峰值时间每秒QPS / 单台机器的QPS = 需要的机器
机器:ceil( 每天总PV / 单台服务器每天总PV )
并发数:
并发用户数是指系统可以同时承载的正常使用系统功能的用户的数量
吐吞量:
吞吐量是指系统在单位时间内处理请求的数量
响应时间(RT):
响应时间是指系统对请求作出响应的时间

例子:
每天300w PV 的在单台机器上,这台机器需要多少QPS?
答:( 3000000 * 0.8 ) / (86400 * 0.2 ) = 139 (QPS)
如果一台机器的QPS是58,需要几台机器来支持?
答:139 / 58 = 3

Tagged as: Comments Off
16Mar/17

Prusa i3 自動調平—改用 BLTouch 探針接觸感應式

Posted by Nick Xu

转自:http://www.kenming.idv.tw/prusa-i3-auto-bed-leveling_using-bltouch

我的 Prusa i3 第一個版本的自動調平,是使用電容電感近接開關,優點是便宜也容易安裝;缺點是只能探測金屬材質。可參考:Prusa i3 自動調平設定—硬體與電路部分

我的熱床是 MK3 鋁材質,原來使用上其實是可以配合。但 MK3 相當不平,即使採用了自動調平偵測還是有限,尤其是列印大面積的列印件時,兩側常無法黏住。

徵詢 Reprap.Taipei FB 社團的諸多高手所綜合的建議,在 MK3 熱床上再鋪上一片 3mm 以上的玻璃,會平坦很多。所以我從對岸淘了兩片從秦皇島店家購買的兩片鋼化高硼矽磨砂耐熱玻璃,據說可以黏住 PLA 材質的列印,而不需要塗上膠水或貼上美紋紙。

加上玻璃後,連帶電容電感近接開關就無法使用,因為無法偵測非金屬材質。我曾在玻璃後邊貼上鋁箔膠帶測試時還能偵測到,但打印幾次卻發現很不穩定,總有某些點會突然失靈,太過不穩定。

爬文作了一堆功課,發現到有種探針式的接觸感測近接開關,就沒有非金屬就無法感測的問題了。其中這一款 — BLTouch,我看從 Youtube 視頻上看到許多先進玩家的使用分享,效果挺不錯的樣子。

不過原廠價格可不便宜,且從 Amazon 還要多擔負一筆航空運費,並不划算。還是仍從對岸淘寶買的這支號稱是復刻版本的 TLTouch (BLTouch 克隆版),含順豐快遞到家共 RMB 159 (約台幣七百多元),還可以接受。

先瞧下我錄製下來的視頻,關於 BLTouch 在執行歸零與自動底床調平 (G28/G29)時的情形。

Prusa i3 with auto bed leveling using TLTouch (BLTouch Clone)

2:01 / 2:38

<div class="player-unavailable"><h1 class="message">出现错误。</h1><div class="submessage"><a href="http://www.youtube.com/watch?v=QHDz6-kx5aE" target="_blank">请尝试在 www.youtube.com 上观看此视频</a>,或者在浏览器中启用 JavaScript(如果已停用)。</div></div>

雖然是復刻版,但包裝與內附的零件與原廠是一樣的 (還附了一張原廠的原文說明紙),還裝在一個透明盒收納。

其實這些零件多是小螺絲與杜邦延長端子之類的,反正就是要自行再拉延長線接到 Ramps 1.4 的 5V servo 腳位,以及限位開關腳位的。

要如何設計一個 BLTouch 的 Holder 並盡量靠近到熱端 (Hotend)處,這類 3D繪圖設計問題,對我永遠都是挑戰。花了有大半天時間,趁此次改使用 Fusion 360 3D 繪圖,因為 123D Design 據說不再釋出新版本 (且實在不太好用)。

哇喔! 原來比較專業性質的 3D繪圖功能是這麼強大啊,早應該要轉用這套免費提供給教師/學生,以及年收入10萬美金以下的商業人士 (真是佛心來著)。大約花個半天時間熟悉下使用介面就可以上手了;然後設計了三次版本演進的 BLTouch Holder。

打印了幾次樣本,總算確定了高度與接合距離,印出來的模樣。

這是套進去後的樣子。因為螺絲鎖住的高度剛好差點頂住 X軸鋁合金安裝座 (Mount),所以我還用電烙鐵頂住螺絲讓其陷進熱熔後的列印座內,下一個版本應該要把螺絲的高度給考慮進來的,目前這樣先能用就好。

設計這 Holder 比較大的挑戰就是 BLTouch 的高度相對於噴嘴高度的問題,主要就是當探針伸出來 (pull)時要比噴嘴高,但縮回去 (push)時要比噴嘴低,原廠建議探針出口處距離噴嘴高度約 8mm 距離左右。

嗯嗯,Holder 確實可以套用後,再來就是連接線路,然後開始 Marlin 設定。

上文有提到要用杜邦延長端子連接延長線,主要就是限位開關2條 (白-觸發訊號/黑-接地),servo 電源輸入腳位3條 (橘-觸發訊號/紅-+5V/棕-接地),說明紙都有提的,顏色確實接正確連到 Ramps 1.4 主板上即可。

大概就是注意下,servo 電源輸入腳位要能供應 +5V 的電壓,就在位於 servo 前面的腳位上要用 Jumper 短路前兩根腳,這在 Ramps 1.4 的規格都有提的。

線路接完後再來就是 marlin 的設定。本來以為很簡單,結果耗費整整一天的時間 try-error,原來竟然是這克隆版與原版的電位剛好相反,限位開關的訊號觸發 (inverting)要設為 true,且不能直接開啟 1.1.0 RC8 內有個預設的 #define BLTouch,因為並不相容。

為何要與原版的相反?這反而克隆版廠商的好意,為了修正原廠因為觸發訊號時只有 5ms 脈衝,這太小很容易就會被板子上的電容給當成雜訊過濾掉,所以就反過來讓其設計為反相訊號。原廠與克隆版廠商都準備下一個版本改為 10ms 脈衝訊號,對岸我買的那家,技術客服還特別因為覺得讓我花太多時間,所以承諾下一個版本免費送給我,哈,真是不錯,當然屆時幫他們簡單開箱介紹下。

這裡就把主要與 BLTouch 相關的 marlin 設定給列出來參考 (configuration.h),其它有關自動調平與前述使用電容電感式的設定是一樣的。

#define Z_MIN_ENDSTOP_INVERTING true // set to true to invert the logic of the endstop.

#define Z_MIN_PROBE_ENDSTOP_INVERTING false // set to true to invert the logic of the endstop.

#define Z_ENDSTOP_SERVO_NR 0

#define Z_SERVO_ANGLES {10,90} // Z Servo Deploy and Stow angles

#define PROBE_DOUBLE_TOUCH

#define NUM_SERVOS 1

好啦,寫入 EPROM、Z軸高度校正等,都是與前一篇設定文一樣的方式,就是要注意下噴嘴當接近Z軸零點時,已收起來的探針不要碰觸到表面,若有就是要回頭調整 BLTouch 的高度。

設定正確後重新啟動 Marlin,此時 BLTouch 會自我測試伸縮探針,並顯示紅色燈號 (如果是閃爍的紅色燈號那代表有問題)。

新裝上磨砂玻璃,準備不塗上膠水與貼上美紋紙,只有底床加熱 (PLA 約為60度左右)。順便瞧下帶顏色的馬尾夾,從大創百貨買回來的,比起純黑色好看太多了。

執行 G28 歸零 (Homing)/G29 自動探測各點距離,然後開始打印從 thingiverse 下載底床調平校正模型,打印出來成果相當令人滿意。

試著打印小貓咪吊飾模型,直接就是打印在玻璃上,沒有塗上膠水與黏貼美紋紙,第一層仍可以牢靠黏著。

當晚我就給它整夜打印 68%縮小原比例的穿山甲,整整要花上快9個小時,但效果真的相當好,關節都不會黏住,自動調平校正後第一層平坦時就會顯現這樣的威力。

結論這 BLTouch 的克隆版在自動調平功能上頗為滿意,無怪乎國外的許多玩家對其還蠻

推薦的。

不過這物件真有些貴,其實這可以 DIY,只要有光學限位開關或霍爾感應器,加上小磁鐵

與彈簧、探針(用鐵釘或螺絲就可),成本並不高,但當然不容易能像 BLTouch 這般小巧

精緻。

Crash Probe with optical switch

<div class="player-unavailable"><h1 class="message">出现错误。</h1><div class="submessage"><a href="http://www.youtube.com/watch?v=hqBF5s-aBCQ" target="_blank">请尝试在 www.youtube.com 上观看此视频</a>,或者在浏览器中启用 JavaScript(如果已停用)。</div></div>

原理比想像的簡單,如果使用現成的光學限位開關 (機械限位應該也可以),就只是想辦法在歸零的時候讓原來黏在磁鐵的探針 (可以用釘子或迴紋針就可)落下比噴嘴還低的位置。(影片是利用穿過小彈簧的水平桿觸及左側X軸)

然後在 G28/G29 歸零/自動偵測後,噴嘴會降到Z軸0點位置,此時探針會往下壓而被頂上來,自然就會磁鐵黏回去而比噴嘴位置高了。

Thingiverse 的模型檔與基本說明:http://www.thingiverse.com/thing:1714315

當然也可以直接使用霍爾傳感器 (Hall sensor)直接取代光學限位開關,實作上會更簡單。即使不弄成自動調平偵測,當成Z軸限位開關也很不錯的方式。

15Nov/16

KVM虚拟机Linux系统增加硬盘

Posted by Nick Xu

Linux虚拟机在使用过程中,硬盘空间不够使用。由于前期没有做LVM,所以只能手动添加新的硬盘。

给虚拟机添加硬盘有两种方法:

1、通过virsh attach-disk命令添加一块硬盘到系统中,即时生效,但系统重启后新硬盘会消失。

2、通过修改虚拟机配置文件进行添加,永久生效。

现在我来一一介绍方法一和方法二。

方法一、通过virsh attach-disk命令添加硬盘

首先看看在未添加新硬盘系统的分区情况。

fdisk –l

df –h

clip_image001

从上图我们可以看到目前系统中只有一块硬盘vda,而且被分成3个分区,其中vda1为系统启动分区。

下面开始添加硬盘:

先使用 qemu-img添加一块新的硬盘

qemu-img create -f raw /vhost/testdisk.img 20G

clip_image002

现在开始使用virsh attach-disk命令把新硬盘添加到虚拟机上。

virsh attach-disk ilanni01 /vhost/testdisk.img vdb

clip_image003

该命令的意思是把/vhost/testdisk.img硬盘添加到虚拟机ilanni01中,并且该硬盘在虚拟机系统中显示的硬盘名称为vdb。

现在在系统中查看是否已经挂载该硬盘,使用fdisk命令,如下图:

clip_image004

以上操作是在虚拟机运行是,进行操作的。

现在我们把虚拟机关闭然后,再添加看看。

virsh destroy ilanni01

virsh list –all

clip_image005

再次使用virsh attach-disk添加新的硬盘vdc,如下命令:

virsh attach-disk ilanni01 /vhost/test1.img vdc

clip_image006

通过上图我们可以发现,通过virsh attach-disk添加硬盘时,只能是虚拟机运行时才能添加,而且是即时生效的。

现在我们重新启动虚拟机看看,如下图:

fdisk –l

clip_image007

通过上图,我们可以看到通过virsh attach-disk命令添加的硬盘在重启系统后,添加的新硬盘失效。

那么现在我们来看第二种方法通过修改配置文件来添加新硬盘。

要通过修改配置文件来添加硬盘,我们首先要关闭虚拟机,否则无法正常添加。

关闭虚拟机,然后使用virsh edit命令修改虚拟机的主配置文件。

虚拟机的所有配置文件都存放在/etc/libvirt/qemu,如下图:

clip_image008

编辑虚拟机配置文件,如下图:

clip_image009

配置文件中,我们找到有关硬盘的代码:

<disk type=’file’ device=’disk’>

<driver name=’qemu’ type=’qcow2′ cache=’none’/>

<source file=’/vhost/ilanni01.img’/>

<target dev=’vda’ bus=’virtio’/>

<address type=’pci’ domain=’0x0000′ bus=’0x00′ slot=’0x04′ function=’0x0’/>

</disk>

现在我们在</disk>这之后,添加如下的代码

<disk type=’file’ device=’disk’>

<driver name=’qemu’ type=’qcow2′ cache=’none’/>

<source file=’/vhost/testdisk.img’/>

<target dev=’vdb’ bus=’virtio’/>

</disk>

注意其中type表示硬盘的格式

file表示硬盘所在的路径

dev表示硬盘在系统中显示的硬盘名称

bus表示硬盘的接线类型,如果是windows系统一般是ide。

clip_image010

clip_image011

添加完毕后,我们来启动虚拟机看看实际的效果。

clip_image012

clip_image013

可以看到硬盘已经被添加进来了。

第一种方法和第二种方法的区别,以上两种方法都能添加硬盘。

但是如果是使用第一种方法添加的硬盘,使用virsh edit ilanni01编辑时,是无法看到第一种方法添加的硬盘的,同时在系统重启添加的硬盘会消失。也就是说使用第一种方法添加的硬盘是在ilanni01.xml这个配置文件中看不到的。

除此之外,如果是卸载硬盘,通过第一种方法添加的一定要在虚拟机运行时卸载。否则会报错,但是还会把该磁盘卸载掉。而且在此之前对硬盘的操作、分区,等都还存在。

卸载硬盘我们可以使用virsh detach-disk命令,如下图:

virsh detach-disk ilanni01 –target vdb

clip_image014

使用virsh detach-disk ilanni01 –target vdb 也可以卸载通过virsh edit ilanni01添加的硬盘。但是此时配置文件ilanni01.xml中还是有此信息的。使用 virsh attach-disk ilanni01 /vhost/testdisk.img vdb命令可以再增加,系统重启后还是存在的。

综上所述,在我们添加硬盘时,建议还是使用第二种方法。

Tagged as: Comments Off
6Jun/16

mini osd 手动接isp引脚刷bootloader

Posted by Nick Xu

发现mini osd很容易出问题, 第一次刷了对应f3飞控的osd后用了几次就没有osd信息了, 只有图像, 后来又刷了一次, 结果还是用几次后又没了, 而且这次还无法用USB2TTL线刷系统, 听说只能用ISP线来刷单片机, 结果发现这MINI OSD根本没有接上ISP的引脚, 又不知道哪个才是ISP引脚, 找了N久, 在即将要放弃时, 终于找到了ISP引脚图(其实最重要的只是这张图, 其它都是次要)

 

MINI OSD ISP 引脚标注图, 触点很小, 接线时小心, 别短路了.

BOOTLOADER FLASH

下图是我的接线, 这是已经刷完BOOTLOADER后测试刷OSD系统了

IMG20160603223727

然后就是刷BOOTLOADER了, 当然你得先有ISP刷写器,我是USBasp刷写器, 装progisp1.72, 懒得打字了, 直接看图吧, 从论坛上找过来的

522F9946-4E0F-4922-991D-28FA57CDB229

第四步, 固件位置在 arduino-1.0.1\hardware\arduino\bootloaders\atmega\ATmegaBOOT_168_atmega328.hex ,根据自己的arduino安装目录找吧

刷完BOOTLOADER就回到 arduino 刷OSD系统吧.

貌似手动刷了BOOTLOADER后变稳定了, 不会出现用几次就无法显示osd信息的情况, 估计是出厂时预刷有问题或者是出厂BOOTLOADER有问题. 还有一种可能是我的USB2TTL前两次刷的时候是跳线到3.3v而不是5v, 虽然接线还是接到5v的位置, 不过目前已无法考究具体是哪个原因导致的了.

 

 

Filed under: 其它, 单片机 Comments Off
16Oct/15

RACADM Command Line Reference Guide for iDRAC7

Posted by Nick Xu

dell-poweredge-drac7-1.50.50-command-line.pdf

site
site