数据专栏

智能大数据搬运工,你想要的我们都有

科技资讯:

科技学院:

科技百科:

科技书籍:

网站大全:

软件大全:

「深度学习福利」大神带你进阶工程师,立即查看>>>
本篇文章基于itop4412开发板
5.3.2.1源码目录
Linux 内核源码在光盘“06_源码_uboot 和 kernel”目录下,如下图所示。
5.3.2.2 编译器
内核的编译器和 uboot 的编译器一样,参考“5.3.1.2 编译器”。
5.3.2.3 参数配置
内核的编译是组合式配置文件,基本的配置文件名是“config_for_android_YY_elite”,
YY 表示用下表所示的参数替代。
5.3.2.4 编译生成内核镜像举例
这里以 SCP 1G 核心板为例编译 zImage 内核镜像,那么配置文件为
“config_for_android_scp_elite”。
将光盘“06_源码_uboot 和 kernel”目录下的压缩包
“iTop4412_Kernel_3.0_xxx.tar.gz”拷贝到 Ubuntu,然后解压,得到文件夹
“iTop4412_Kernel_3.0 ”,如下图所示。
进入文件夹“iTop4412_Kernel_3.0 ”,使用命令
“cp config_for_android_scp_elite .config”覆盖自带的配置文件,如下图所示。
如果用户要使用 5 寸屏幕,先要参考用户手册“5.5 支持 5 寸屏的内核补丁文件”,给内
核打补丁,然后使用命令“vim .config”,在文件中搜索关键词
“CONFIG_TOUCHSCREEN_GT9XX=y”,在“CONFIG_TOUCHSCREEN_GT9XX=y”之
后添加一行“CONFIG_TOPEET_LCD5X0=y”,添加完成之后,如下图所示。如果用户不使
用 5 寸屏幕,则可以跳过这一步。
然后使用编译命令“make zImage”,如下图所示
编译中,如下图所示。
编译完成,如下图所示。
文件夹“iTop4412_Kernel_3.0 ”下的“arch”-->“arm”-->“boot”会生成镜像文
件“zImage”,这个 zImage 镜像可以给 SCP 1G 和 SCP 2G 的核心板使用,如下图所示。
由于 Android 代码中需要内核中 wifi 驱动,在编译好内核之后,还需要在内核目录中,
执行编译模块的命令“make modules”,再执行编译后面 Android4.0.3 文件系统的脚本,
Android4.0.3 源码才能通过。
硬件开发
2019-06-17 10:16:00
「深度学习福利」大神带你进阶工程师,立即查看>>>
每天工作20小时以上高强度搬砖了两个月,被压榨地太惨了,还好身体没出问题……

项目终于要结束了,希望一切顺利。
硬件开发
2019-06-09 00:04:00
「深度学习福利」大神带你进阶工程师,立即查看>>>
转载请注明文章来源,更多教程可自助参考docs.tpyboard.com,QQ技术交流群:157816561,公众号:MicroPython玩家汇
实验目的
- 学习ESP8266模块(ESP-01)的使用。
- 进一步学习TPYBoardv10x中UART模块的使用。
- 结合ESP-01模块完成局域网内的TCP通信实验。
所需元器件
- ESP-01 WIFI模块 1个
- TPYBoard v102板子 1块
- USB转TTL 1个
- micro USB数据线 1条
- 杜邦线 若干
本实验采用TPYBoardv102串口AT指令的方式,去连接控制ESP8266模块(型号ESP-01)。
第一步:烧写AT指令的固件
下载AT指令相应固件
这里我下载了一个AiCloud 2.0 AT (512+512map)版本的,版本号:v0.0.0.6。
http://wiki.ai-thinker.com/_media/aicloud/sdk/ai-thinker_esp8266_dout_aicloud_v0.0.0.6_20170517.7z
安信可科技关于ESP8266相关模组的资料地址。 http://wiki.ai-thinker.com/esp8266
AT指令固件其他版本下载。 http://wiki.ai-thinker.com/esp8266/sdk
下载烧写工具ESPFlashDownloadTool
http://wiki.ai-thinker.com/_media/esp8266/flash_download_tools_v3.6.4.rar
硬件连接
ESP-01模块的引脚图:

烧写固件还需用到USB转TTL,ESP-01模最好使用其他外部器件进行供电。这里,我用的TPYBoardv102开发板。但是,别忘记了开发板与TTL之间需要共地。
接线图:
ESP-01模块 TPYBoard v102
|VCC 3V3
GND GND
CH_PD 3V3
GPIO 0 悬空
GPIO 2 悬空
TXD
RXD
X2(UART 4 )
X1(UART 4 )








开始烧写
USB转TTL插上电脑,设备管理器查看端口号。
打开ESPFlashDownloadTool工具,选择【ESP8266 DownloadTool】。
我这里下载的是合成的固件,所以地址直接设置为0x00000,其他设置参考如下:

选择好端口,点击【START】开始烧写。

出现等待上电同步,这时给ESP-01模块上电,或者复位一下,等待下载成功。

第二步:测试AT指令
烧写固件完成之后,将GPIO 0 连接的线拔掉,使其悬空,ESP-01模块会进入正常模式。
打开串口助手工具 http://old.tpyboard.com/download/tool/198.html ,默认波特率115200。
ESP-01模块启动时,会输出一堆乱码。(其实不是乱码,是一些内部信息)如下:
出现乱码的原因,如下:
输出的内部信息,我们可以忽略掉,只要输出ready,就说明模块一切正常。
进入AT指令模式
AT指令说明文档、AT固件、烧写工具。 http://old.tpyboard.com/download/tool/ESP-01.rar
发送指令:AT
(注意:后面需跟一个回车换行,选择在工具中勾选加回车换行)
模块返回AT\\r\\nOK,说明模块已经成功进入AT指令模式。
查询固件版本
发送指令:AT+GMR
第三步:局域网TCP通信测试
1、首先,让ESP-01接入我们的路由器。
AT指令 功能
AT+CWMODE_CUR? 查询当前WIFI模式
1 : station 模式
2 : softAP 模式
3 : softAP+station 模式
AT+CWMODE_CUR=1
AT+CWJAP_CUR="essid","password"
设置WIFI为station 模式
连接AP






2、接下来,我们做一个局域网内TCP通信的测试。本地用网络调试助手建立一个TCP Server如下:
ESP-01作为TCP Client连接Server。发送指令AT+CIPSTART="TCP","192.168.101.116",80
TCP链接建立,开始发送数据。单路链接时发送指令为AT+CIPSEND=x,x为发送的字节数。出现符号">"后就可以发送数据了。
模块会把收到的数据自动通过串口透传过来。
以上,我们都是结合USB转TTL实现的AT指令转发。接下来,我们通过TPYBoardv102开发板实现上面的功能。
接线图:
ESP-01模块 TPYBoard v102
VCC
GND GND
CH_PD 3V3
GPIO 0 | 悬空
GPIO 2 悬空
TXD
RXD
X2(UART 4 )
X1(UART 4 )







程序源码: from pyb import UART from pyb import LED #等待ESP-01模块初始化,忽略启动时的内部信息 pyb.delay(1000) ESP_UART = UART(4,115200,timeout=100) def sendToUart(msg): ESP_UART.write(msg+'\r\n') CWMODE_CUR = 'AT+CWMODE_CUR=1' CWJAP_CUR = 'AT+CWJAP_CUR="TurnipSmart","turnip2016"' CIPSTART = 'AT+CIPSTART="TCP","192.168.1.116",80' CIPSEND = 'AT+CIPSEND=%s' msg = 'Hello,I am TPYBoard.' if __name__ == '__main__': sendToUart('AT') while True: if ESP_UART.any() > 0: buf = ESP_UART.read().decode().replace('\r','').replace('\n','').replace(' ','') print(buf) if buf.find('busyp') > -1 or buf.find('ERROR') > -1: # AT指令执行失败 # 结束程序排查原因 break elif buf.find('ATOK') > -1: # 说明AT指令执行成功 # 成功进入AT指令模式 # 设置WIFI模式为sta模式 sendToUart(CWMODE_CUR) elif buf.find(CWMODE_CUR) > -1: # 设置sta模式成功,连接AP sendToUart(CWJAP_CUR) LED(1).on() elif buf.find('WIFIGOTIP') > -1: # 连接AP成功 # 开始连接TCP Server pyb.delay(150) sendToUart(CIPSTART) LED(2).on() elif buf.find(CIPSTART) > -1: # 连接TCP Server成功,发送数据 CIPSEND = CIPSEND % str(len(msg)) sendToUart(CIPSEND) LED(3).on() elif buf.find('>') > -1: # 发送数据 sendToUart(msg) LED(4).on()

注意: ESP-01模块上电启动时电流比较大,会导致板子的REPL无反应。关闭putty等工具,按板子的RST复位一下,再连接就好。最好方式采用外部电源给ESP-01模块供电,注意要与板子共地。
综上,TCP的测试实验完毕。本实验只是做了一些简单的示例,大家可根据自己的想法结合文档开发出更有意思的作品,比如智能控制开关、智能WIFI小车等。
下载源码: https://github.com/TPYBoard/TPYBoard-v102
硬件开发
2019-06-04 10:42:00
「深度学习福利」大神带你进阶工程师,立即查看>>>
1.1 计算机系统简介
1.1.2 计算机系统层次结构
系统软件利用硬件提供的接口,实现自己的功能。
应用软件利用系统软件提供的接口,调用系统软件功能,实现自己的功能。
对于一个系统,可以从不同的角度来抽象:物理构成和程序员的角度
这门课主要研究的是 逻辑层 和 微体系结构层 ,学习计算机中主要部件的逻辑实现,和主要部件间的连接
最早出现的是机器语言,利用机器提供的指令集,使用0101直接对硬件进行编程
为了简化程序的编写,将机器语言符号化,产生了汇编语言。
然而,实际的机器不能识别汇编语言写的程序,必须为这台机器提供汇编程序,把汇编语言编写的程序转化为机器语言编写的程序。相当于,在硬件机器的外层罩了一层软件,这层软件完成了对汇编语言->机器语言的翻译。
把罩有汇编程序的机器,抽象成一个新的机器M2,对于高级语言来讲,M2不能识别高级语言,所以在M2的外层罩了一层软件,这层软件完成对高级语言->汇编语言的翻译。这样,对于高级语言程序员来讲,就抽象成了一个新的机器M3,M3可以直接识别高级语言。
一条机器语言的指令,执行也是很复杂的,比如,要把一条机器语言的指令从存储器中取出来,要先把这条指令的地址传送给存储器,要告诉存储器进行读,之后。。。这些操作有先后关系,有些可以同时、有些不可以,把这些操作指令句句细化,把他们放到微指令中。 //汇编语言摆脱不了实际机器的指令系统,不同机器都有与其对应的汇编语言 //这要求程序员要掌握不同机器的指令系统。 //翻译程序有两种,编译程序和解释程序 //编译是一次性全部翻译成机器语言,以后永远不用再翻译了 //解释是一条一条的翻译成机器语言,下次执行还翻译
在机器语言和汇编语言间,还留有一个部分。汇编语言程序员可以利用操作系统的功能进行编程,操作系统可以管理软硬件的资源。操作系统提供了在汇编语言和高级语言的使用和实现过程中所需的某些基本操作,还起到了控制并管理计算机全部硬件和软件资源的作用。 MOV AH, 4H INT 21H //上面两条指令完成了汇编语言应用程序的退出,返回了dos系统 //这是汇编语言调用了dos系统提供的中断功能,实现了程序的退出
//M1也叫传统机器(机器语言机器) //M0叫微程序机器(微指令系统)
软、硬件分界线不是一成不变的,一部分软件功能由硬件实现,例如,目前操作系统已经实现了部分固化(把软件永远存放在只读存储器中),称为固件。
本课程主要研究M0和M1
1.1.3 计算机组成和计算机体系结构
计算机体系结构 ,定义了计算机系统的软硬件的交界面,定义了哪些功能由软件,哪些由硬件实现。提供了上层软件和硬件的接口;
机器语言程序员见到的计算机系统的属性(指令集、寄存器文件组织、内存编址单位)
概念性的结构与功能特性
计算机组成 :实现计算机体系结构所体现的属性;例如:具体指令的实现,在 计算机体系结构 中,有乘法指令的规定,那么在 计算机组成 中要利用上面的规定,想办法实现乘法指令,这个实现是指逻辑实现。
两种机器,是否具有乘法指令,这是结构问题。
实现乘法指令采用什么方式,这是组成问题。实现乘法指令可以采用一个专门的乘法电路,也可以用连续相加的加法电路实现。这两种区别就是计算机组成的区别。
本课程主要研究计算机组成
1.2 计算机的基本组成
1.2.2 计算机的工作步骤 数学建模:对于很多科技问题,我们可以建立数学模型,例如圆周运动,可以建立它的运动方程 确定计算方法:计算机只能进行四则运算,对于 sinX 相关的方程组,使用泰勒公式,对于开方,使用迭代公式 编写解题程序:程序(运算的全部步骤)| 指令(每一个步骤)
把上述运算步骤写成某计算机一 一对应的机器指令,就完成了运算程序的编写。
设某机器的指令字长为16位,其中操作码占6位,地址码10位。
操作码 :表示机器所执行的各种操作,如取数,存数,加减乘除,停机,打印等。
地址码 :参加运算的数在存储器内的位置。
机器指令的操作码和地址码都用 0、1 代码组合来表示。
上图,取数a,默认把数取出放入到ACC当中。 000001 表示取操作, 0000001000 表示数a的地址。
运算器
运算器最少包括 3个寄存器 (现代计算机内部往往有通用寄存器组),还有一个 算数逻辑单元(ALU) 。
核心是ALU,ALU通常是一个组合电路,他的特点是如果输入撤销,那么输出结果也会撤销。为了完成功能,能对结果进行保存,必须在ALU输入端加入寄存器,寄存器保存参与计算的数据,就需要两个寄存器作为输入数据的保存设备。一个是ACC,还有一个是X;以为乘法会让数据的长度翻倍,所以要额外添加一个寄存器MQ;
ACC(Accumulate)为累加器,MQ为乘商寄存器,X为操作数寄存器。
ACC和X作为运算的输入,ACC也用于保存运算结果。对于乘法,由于结果长度要增加一倍,那么把多出来的部分放在MQ;
不同的机器的运算结构是不同的,图1.11,也就是上图中的运算器,可以把运算结果从ACC送至存储器中的MDR,而存储器的操作数也可以从MDR送至运算器中的ACC、MQ或X。有的机器用MDR取代X寄存器。 对于不同的机器,会有不同数量的寄存器,实际的情况也会不同。
下面简要分析一下 上图这种机器 的运算器四则运算的操作过程。
M代表存储器的任一地址号,[M]代表对应M地址号单元中的内容;X表示X寄存器,[X]表示寄存器中的内容;
假设ACC中已经有前一时刻的运算结果,并且作为下述运算中的一个操作数,则 加法操作过程: [M] -> X [ACC] + [X] -> ACC //即把[ACC]看做被加数,先从主存中取[M],送到X中 //然后把被加数[ACC]和加数[X]相加,结果(和)保留在ACC中 减法操作 [M] -> X [ACC] - [X] -> ACC //把[ACC]看做被减数,把[M]放入X //把结果(差)保留在ACC中 乘法操作 //乘法在计算机中可以用加法和移位的方式来进行计算 //我们在纸上计算乘法,是几行数字错位相加,在计算机中类似 //进行相加的时候,需要一个累加器,不能像纸上那样一次性全加在一起 //累加器选择ACC,被乘数在X,乘数在MQ [M] -> MQ [ACC] -> X 0 -> ACC //ACC清0 [X] * [MQ] -> ACC | MQ //高位放在ACC,低位放在MQ //把[ACC]看做被乘数 除法操作 [M] -> X [ACC] ÷ [X] -> MQ //商暂留在MQ 余数R在ACC中 //[ACC]看做被除数 //若要把商保存在ACC中,只要[MQ] -> [ACC]
控制器
控制器是计算机的神经中枢,他指挥各部件自动、协调工作。具体而言,他首先命令存储器读出一条指令,称为 取指过程(取指阶段) ;接着,对此指令分析,指出该指令要完成什么操作,并按寻址特征指明操作数的地址,称为 分析过程(分析阶段) ;最后根据操作数所在地址和指令的操作码完成某种操作,称为 执行过程(执行阶段) ;这就是完成一条指令的三个阶段。
控制器由程序计数器(program counter,PC)、指令寄存器(Instruction register,IR)、控制单元(CU)组成。
PC存放当前欲执行指令的地址,它与主存的MAR间有一条直接通路,且有自动加1的功能,即可以自动形成下一条指令的地址。IR用来存放当前指令,IR的内容来自主存MDR。IR中的操作码(OP(IR))送到CU,记做 OP(IR) -> CU ,用来分析指令;其地址码(AD(IR))作为操作数的地址送至存储器的MAR,记做 AD(IR) -> MAR 。CU用来分析当前指令所需完成的操作,并发出各种微操作命令序列,用以控制所有被控制对象。
控制器的功能:解释指令(执行指令是运算器) + 保证指令的按序执行
接下来分析: 一条指令在主机上的完成过程 程序在主机上是如何执行的
完成一条指令有3个阶段: 取指令 分析指令 执行指令 要完成取数指令 取指令(要知道指令的地址在哪) 欲执行指令地址保存在PC中 指令保存在存储体中 1. PC把指令地址送给MAR 2. MAR送给存储体 3. 在控制器(CU)的控制下,存储体把指定存储单元中保存的那条<取数指令>取出送入MDR 4. MDR把保存的指令送入IR //------完成取指工作,下一步,分析指令-------- 5. IR中保存的操作码部分送入CU //<取数指令>是把[M] -> ACC,为了完成这个操作,在控制器的控制下 //把指令中的地址部分送给存储器,以便把数据从存储体中取出 //IR保存了当前的指令,还有当前指令操作数的地址 6. 从IR的地址码部分取出地址,送入MAR 7. MAR把地址送给存储体 8. 在控制器的控制下,从存储体中把取数指令要取的数取出,存入MDR 9. 把MDR中的数送入ACC //完成取数操作
//对于存数指令,第一步还是取指令 1. PC把指令地址送给MAR 2. MAR送给存储体 3. 在控制器(CU)的控制下,存储体把指定存储单元中保存的那条<取数指令>取出送入MDR 4. MDR把保存的指令送入IR //------完成取指工作,下一步,分析指令-------- 5. IR中保存的操作码部分送入CU,由CU对指令进行分析,分析这条指令要做什么操作 6. 从IR的地址码部分取出地址,送入MAR 7. MAR把地址送给存储体,告诉存储体有数据要存进来,地址是多少 8. 在控制器的控制下,把ACC中的数据存入MDR 9. 在控制器的控制下,把MDR中的数据保存在存储体中
程序由一条条指令构成,执行程序就是执行一条条指令
1.3 计算机硬件的主要技术指标 机器字长:CPU一次能处理数据的位数,与CPU中 寄存器的位数 有关 /**我的CPU可以对两个8位二进制数做加法,结果还是一个8位的二进制数。那么在 这种情况下,CPU一次能处理的数据位数是8位,不是24位。我们上面讨论的机器 字长,和ACC、X、MQ的字长相同。为了简化问题,我们存储单元的长度,也就是存储 字长,和寄存器的长度也都是相同的。这只是模型机里的假设,并不是所有计算机 都这样。 机器字长越长,机器性能越好。例如我们把两个64位的数相加,把他们的和保存在 64位寄存器中。如果机器字长是8位,寄存器也是8位,那么要完成这64位的加法, 我们就要做8次加法运算(相对应的8位进行相加)。如果机器字长就是64,寄存器 也是64,那么就是一次计算。 */ 运算速度 /** 主频:频率越高,速度越快 核数:每个核支持的线程数 主存:主存速度快,取指、取数速度快 吉普森法:曾经用过 现代指标:单位时间内执行指令的平均条数来衡量,用MIPS(百万条指令每秒)做 计量单位。例如,某机每秒执行200万条指令,记做2MIPS。 也可以用CPI,也就是执行一条指令所需的时钟周期(机器主屏的倒数)数,CPI越小越好 或者用FLOPS(浮点运算次数每秒)来衡量计算速度 */
存储容量
硬件开发
2019-05-31 22:07:00
「深度学习福利」大神带你进阶工程师,立即查看>>>
树莓派(Raspberry Pi)运行的系统是基于Debian的,不仅可以运行Shell,还支持systemd和docker,可以编写一个简单的服务,让其在启动时运行,执行一些自动化的操作。这里在RaspPi Zero W上使用shell、systemd和Docker 18.06.1完成,详细步骤介绍如下。
1、初始化系统
从树莓派官网( https://www.raspberrypi.org/ )下载镜像,烧写到SD卡(我用Etcher)。 下载: https://www.raspberrypi.org/downloads/raspbian/ 福利: 一个开源的超好用的SD卡/U盘烧写工具
将SD卡插入树莓派,加电启动。
登录使用:pi,raspberry。
如果想要通过ssh远程操作,还需要安装和启用sshd服务开机启动(下面介绍)。
当然,首先是要开通WiFi,能够联网。
2、WiFi 设置
Wifi AP设置,使用命令 “nano /etc/wpa_supplicant/wpa_supplicant.conf” 编辑配置文件,参照下面的方法添加WiFi热点: ctrl_interface=DIR=/var/run/wpa_supplicant GROUP=netdev update_config=1 network={ ssid="HiWiFi_xxxxxx" psk="mypassword" }
建立服务需要使用静态地址。修改文件dhcpcd(使用nano /etc/dhcpcd),编辑如下内容: interface wlan0 noipv6rs noipv6 static ip_address=192.168.199.190 static routers=192.168.199.1 domain_name_servers=192.168.199.1 8.8.8.8 9.9.9.9
将上面的IP地址和DNS改为自己的,其中8.8.8.8/9.9.9.9为公共的DNS服务地址,不需修改。
重启dhcpcd服务(或者需要重启树莓派)。
联网成功后,执行软件版本更新操作。如下: sudo apt update && sudo apt upgrade -y
3、编写WatchDog和Service
创建一个自己的目录,创建下面三个文件: sshp.service,由systemd调用的服务配置文件。 sshp.daemon,执行服务控制(启动、停止、状态)的脚本文件。 sshp.worker,执行服务的任务脚本文件。
文件的内容如下。
3.1 sshp.service文件 [Unit] Description=Secure Shell server proxy After=network.target [Service] Type=forking ExecStart=/home/pi/openthings/tutools/sshp.daemon start ExecStop=/home/pi/openthings/tutools/sshp.daemon stop TimeoutSec=0 RemainAfterExit=yes [Install] WantedBy=multi-user.target Alias=sshp.service
3.2 sshp.daemon文件 #!/bin/sh echo "SSHP tools." #======================= start() { now=`date '+%Y-%m-%d %H:%M:%S'` echo "$now Start SSHP worker ..." >> /home/pi/openthings/tutools/sshp.log nohup /home/pi/openthings/tutools/sshp.worker & } #======================= stop() { PID=`ps -aux | grep "sshp.worker" | grep -v grep | awk -F " " '{print $2}'` kill -9 $PID echo "Stop SSHP worker, PID="$PID >> /home/pi/openthings/tutools/sshp.log } #======================= restart() { echo "Restart Service..." Stop Start echo "Restarted SSHT worker, PID="$PID } #======================= status() { now=`date '+%Y-%m-%d %H:%M:%S'` echo "$now Service status ssht." ps -aux | grep "sshp.worker" | grep -v grep } case "$1" in start) start ;; stop) stop ;; restart) restart ;; status) status ;; *) echo "Usage: (start|stop|restart|status)" exit 1 ;; esac echo "Service SSHP tools done." exit 0
3.3 sshp.worker文件 #!/bin/sh while true; do sshpass -p mypassword ssh -o "ExitOnForwardFailure yes" -o "StrictHostKeyChecking no" -y -p 22000 -NgD *:5555 root@myserver done 这里仅使用ssh演示worker编写方法,具体可以参考: SSH 命令行参数详解【英】 这里有个坑是,以服务启动时的账户是root,与当前用户pi的配置信息和缺省参数是不同的。
3.4 设为启动时运行
使用下面的命令将刚才编写的服务设为启动时运行: sudo systemctl enable sshp.service
查看一下,系统里的启动运行服务: # ls -l /etc/systemd/system/multi-user.target.wants/ total 0 lrwxrwxrwx 1 root root 40 Nov 29 2017 avahi-daemon.service -> /lib/systemd/system/avahi-daemon.service lrwxrwxrwx 1 root root 41 Nov 29 2017 console-setup.service -> /lib/systemd/system/console-setup.service lrwxrwxrwx 1 root root 38 Apr 12 05:45 containerd.service -> /lib/systemd/system/containerd.service lrwxrwxrwx 1 root root 32 Nov 29 2017 cron.service -> /lib/systemd/system/cron.service lrwxrwxrwx 1 root root 34 Nov 29 2017 dhcpcd.service -> /lib/systemd/system/dhcpcd.service lrwxrwxrwx 1 root root 34 Dec 25 2017 docker.service -> /lib/systemd/system/docker.service lrwxrwxrwx 1 root root 35 Nov 29 2017 hciuart.service -> /lib/systemd/system/hciuart.service lrwxrwxrwx 1 root root 38 Nov 29 2017 networking.service -> /lib/systemd/system/networking.service lrwxrwxrwx 1 root root 37 Nov 29 2017 nfs-client.target -> /lib/systemd/system/nfs-client.target lrwxrwxrwx 1 root root 48 Nov 29 2017 raspberrypi-net-mods.service -> /lib/systemd/system/raspberrypi-net-mods.service lrwxrwxrwx 1 root root 36 Nov 29 2017 remote-fs.target -> /lib/systemd/system/remote-fs.target lrwxrwxrwx 1 root root 33 Nov 29 2017 rsync.service -> /lib/systemd/system/rsync.service lrwxrwxrwx 1 root root 35 Nov 29 2017 rsyslog.service -> /lib/systemd/system/rsyslog.service lrwxrwxrwx 1 root root 40 Apr 12 15:43 sshp.service -> /home/pi/openthings/tutools/sshp.service lrwxrwxrwx 1 root root 31 Apr 12 12:40 ssh.service -> /lib/systemd/system/ssh.service lrwxrwxrwx 1 root root 37 Nov 29 2017 sshswitch.service -> /lib/systemd/system/sshswitch.service lrwxrwxrwx 1 root root 40 Nov 29 2017 triggerhappy.service -> /lib/systemd/system/triggerhappy.service lrwxrwxrwx 1 root root 47 Dec 25 2017 unattended-upgrades.service -> /lib/systemd/system/unattended-upgrades.service lrwxrwxrwx 1 root root 40 Mar 24 2018 wifi-country.service -> /lib/systemd/system/wifi-country.service lrwxrwxrwx 1 root root 42 Apr 12 05:46 wpa_supplicant.service -> /lib/systemd/system/wpa_supplicant.service
3.5 测试服务启停
使用下面的命令来控制服务。 # 查看服务运行状态。 sudo systemctl status # 启动服务。 sudo systemctl start # 然后,可以使用ps -aux查看ssh进程是否已经启动。 # 停止服务。 sudo systemctl stop # 然后,可以使用ps -aux查看ssh进程是否已经关闭。
这里设置了一个日志文件,为上面的目录下sshp.log,可以查看输出的信息。
可以修改上面的脚本,添加自己的日志信息输出。
4、Docker安装
也可以把任务放到Docker中运行。我这里用于创建一个Nginx服务,然后运行pac信息提供者,为iPhone等设备提供网络配置参数时使用。
获取docker自动安装脚本并执行: wget https://get.docker.io -O docker.sh sudo chmod docker.sh ./docker.sh
目前,最新的Docker版本是18.09,但是运行时有Bug,暂时还没有解决。
我们使用18.06.1版。安装指定的Docker版本: sudo apt install docker-ce=18.06.1-ce
将版本锁定,以避免apt upgrade时自动升级到最新版本,命令如下: sudo echo "docker-ce hold" | sudo dpkg --set-selections
测试一下Docker,看看安装是否成功: docker info
5 构建PAC服务
pac是什么?
pac是一种网络配置的机制,客户端通过获取pac文件来自动获取一系列配置参数,从而对网络进行初始化设置。
编写一个pac文件,如下: function FindProxyForURL(url, host) { return "SOCKS 192.168.199.190:5555"; }
pac服务构建
然后,将pac文件放入Web服务器,构建一个文件服务(也可以动态生成)。
这里使用Nginx的Docker镜像来提供服务(注意Nginx有多种Docker镜像,只有为树莓派编译的才可以在上面运行)。
运行: docker run --name nginx -v /home/pi/openthings/web:/usr/share/nginx/www:ro -d -p 80:80 akkerman/rpi-nginx
这个安装说明运行了后,所编写的文件并没有发布出来,进去看是因为Nginx缺省路径为/var/www/html,而不是/usr/share/nginx/www。可以修改上面的命令为: docker run --name nginx -v /home/pi/openthings/web:/var/www/html:ro -d -p 80:80 akkerman/rpi-nginx
或者执行Exec进入Docker进行修改,如下: docker exec -it nginx /bin/sh
查看Nginx的service目录: cat /etc/nginx/sites-available/default
建立软连接: ln -s /usr/share/nginx/www /var/www/html
在目录下,建立一个index.html文件,然后到浏览器输入http://my-raspberrypi-ip,看是否能够发布出来。
然后, 将上面的pac文件放到该发布目录下 。
6、测试可用性
现在,可以测试一下,上面建立的服务是否可用。 使用浏览器
打开setting页面,进入网络设置,勾选sokcs5,填入上面的pac地址,勾选dns over https等选项。
输入任何想要访问的地址,等待奇迹出现。 使用iPhone
进入setting,选择网络设置,里面有个“自动”选项,填入上面的pac地址。
7、小结
编写一个Linux服务还是有一些难度的,上面提供了一个极简的框架。
树莓派体积虽小,运行一些控制性服务也是足够了,关键是功耗足够低,还没有任何噪音。
一些定期执行的任务,如缩时摄影、温湿度监测、自动浇水等等有趣的事都可以使用上面的机制来完成。
8、更多参考 使用shell编写的极简Ubuntu Service AutoSSH-增强ssh的用法【英】 SSH 命令行参数详解【英】 vi、vim、nano如何退出? wget 持续下载确保完成 scp实现断点续传的方法 使用shell编写的极简WatchDog
硬件开发
2019-04-14 07:03:00
「深度学习福利」大神带你进阶工程师,立即查看>>>
Git是一款免费、开源的分布式版本控制系统,用于敏捷高效地处理任何或小或大的项目。 Git的读音为/gɪt/。
Git是一个开源的分布式版本控制系统,可以有效、高速的处理从很小到非常大的项目版本管理。 Git 是 Linus Torvalds 为了帮助管理 Linux 内核开发而开发的一个开放源码的版本控制软件。
Torvalds 开始着手开发 Git 是为了作为一种过渡方案来替代 BitKeeper,后者之前一直是 Linux 内核开发人员在全球使用的主要源代码工具。开放源码社区中的有些人觉得BitKeeper 的许可证并不适合开放源码社区的工作,因此 Torvalds 决定着手研究许可证更为灵活的版本控制系统。尽管最初 Git 的开发是为了辅助 Linux 内核开发的过程,但是我们已经发现在很多其他自由软件项目中也使用了 Git。例如 很多 Freedesktop 的项目迁移到了 Git 上。
关于学习Git的详细教程: 学习Git(使用手册)
特点:
分布式相比于集中式的最大区别在于开发者可以提交到本地,每个开发者通过克隆(git clone),在本地机器上拷贝一个完整的Git仓库。
下图是经典的git开发过程。
Git的功能特性:
从一般开发者的角度来看,git有以下功能: 从服务器上克隆完整的Git仓库(包括代码和版本信息)到单机上。 在自己的机器上根据不同的开发目的,创建分支,修改代码。 在单机上自己创建的分支上提交代码。 在单机上合并分支。 把服务器上最新版的代码fetch下来,然后跟自己的主分支合并。 生成补丁(patch),把补丁发送给主开发者。 看主开发者的反馈,如果主开发者发现两个一般开发者之间有冲突(他们之间可以合作解决的冲突),就会要求他们先解决冲突,然后再由其中一个人提交。如果主开发者可以自己解决,或者没有冲突,就通过。 一般开发者之间解决冲突的方法,开发者之间可以使用pull 命令解决冲突,解决完冲突之后再向主开发者提交补丁。
从主开发者的角度(假设主开发者不用开发代码)看,git有以下功能: 查看邮件或者通过其它方式查看一般开发者的提交状态。 打上补丁,解决冲突(可以自己解决,也可以要求开发者之间解决以后再重新提交,如果是开源项目,还要决定哪些补丁有用,哪些不用)。 向公共服务器提交结果,然后通知所有开发人员。
优点: 适合分布式开发,强调个体。 公共服务器压力和数据量都不会太大。 速度快、灵活。 任意两个开发者之间可以很容易的解决冲突。 离线工作。 缺点: 资料少(起码中文资料很少)。 学习周期相对而言比较长。 不符合常规思维。 代码保密性差,一旦开发者把整个库克隆下来就可以完全公开所有代码和版本信息。
更多精品课程:
阿里云大学官网( 阿里云大学 - 官方网站,云生态下的创新人才工场 )
硬件开发
2019-04-12 16:02:00
「深度学习福利」大神带你进阶工程师,立即查看>>>
Python在国外是一门非常热门的编程语言,近些年在国内也被发掘与追捧, Python的开放、简洁、黏合正符合了现发展阶段对大数据分析、可视化、各种平台程序协作产生了快速的促进作用。它具有丰富而强大的库,能够把用其他语言制作的各种模块(尤其是C/C++)很轻松地联结在一起,应用于任何平台,而且还有我们最喜欢的开源 、免费噢!
关于MicroPython?
MicroPython是以Python语言为基础,运行在一系列微控制器硬件平台上的系统的名称,类似于Arduino。是近年来开源社区中非常热门的项目之一。它功能强大、使用简单,是创客、DIY爱好者、工程师非常好的工具。同时适用于从小学到大学各个年龄段的同学完成Python的入门学习。
和其他类似软件相比,MicroPython是真正可以用在产品开发中的软件。以其开放的架构和MIT授权方式,在很短时间内就风靡世界。MicroPython开发产品原型的速度更快,程序也更加容易实现模块化,更方便进行维护。
MicropPython的学习,如何从0到1?
1、选择合适的硬件平台
MicroPython通常理解为一个软件系统,还需要一个硬件平台来运行它。而TPYBoardv102开发板就是运行MicroPython的硬件平台,同时也是一款STM32核心板。同时作为国内MicroPython研究的先行者,TPYBoard已经陆续推出了基于无线网通信的v202、基于以太网通信的v201、基于GPS通信定位的v702、STM32F407系列开发板以及多本教材。并配有完善的技术支持及教程资料,是MicroPython入门及研究的不二之选。
2、在线编程工具
TPYBoard拥有国内首款从代码到图形编程同时进行的IDE-PythonEditor:
PythonEditor主界面包含左侧的拖拽块选择区、中间的模块编辑区、右侧的代码显示区、下方的程序保存运行区、以及上方的拖拽代码切换区域,拥有以下几个特点:
1、可视化编程,操作简单
2、图形化操作,无需代码拖拖拽拽就能编程
3、左边拼插,右边显示对应代码,轻松学编程
3、一站式采购平台
TPYBoard TB商城萝卜城,零基础实现你物联网创意的开发板购买,还有各类元器件可实现一站式元器件采购!
4、完善的技术支持
TPYBoard拥有在线学习网站、独立的教程网站、千人QQ技术交流群以及MicroPython玩家汇微信公众号。真正满足小白零基础入门,同时也是MicroPython爱好者、学生毕设以及工业产品研发的首选。
MicroPython新手友好、功能强大、高效灵活的,学会之后无论是想进入数据分析、人工智能、嵌入式开发这些领域,还是希望掌握第一门编程语言,都可以用MicroPython来开启无限未来的无限可能!
硬件开发
2019-03-29 17:05:00
「深度学习福利」大神带你进阶工程师,立即查看>>>
说到MicroPython,也许有人会感到陌生。而说到和它密切相关的Python,是否会恍然大悟呢?Python属于解释型语言,1989年才开发完成的Python显然非常年轻。然而经过数十年的磨砺,如今Python已经成为最具人气的开源编程语言之一。MicroPython顾名思义就是运行在MCU的Python,换句话说单片机可以使用Python语言来控制了。
MicroPython:利用Python与MCU通信
目前C/C++语言在嵌入式系统中的代码占比中一直处于王者地位,但近几年MicroPython的发展和普及证明,Python无疑将在未来几年内快速抢占和蚕食C/C++的份额。包括现在比较火爆的机器人、无人机以及其他开源硬件诸如Arduino与Raspberry Pi的项目正吸引到众多拥有Python技能背景的爱好者,而借助MicroPython,用户完全可以通过Python脚本语言实现硬件底层的访问和控制。
MicroPython的概述与展望
可以说MicroPython是目前非常流行的嵌入式Python VM和开发环境。拥有自家的解析器、编译器、虚拟机和类库等。目前他支持基于32-bit的ARM处理器,比如说STM32F405。也就是说ARM处理器STM32F405上直接可运行Python语言,Python语言来控制单片机。
几款主流的MicroPython开发板,你和它会有什么火花?
TPYBoardv102
TPYBoard v102是一款典型的MicroPython开发板,搭载STM32F405芯片,支持DFU和SWD两种调试方式,可兼容MicroPython官方板的固件,大小64mm*54mm。价格低至官方板售价的三分之一,功能上却能完美的兼容PYBoardv1.0、v1.1的固件。是MicroPython开发和入门的不二选择!
TPYBoardv202
TPYBoardv202支持Lua和MicroPython两种开发语言,支持MicroPython兼容NodeMCU,一款高性价比的MicroPython开发板,板载ESP8266模块,轻松将你带入物联网领域!
TPYBoardv201
TPYBoardv201,板载以太网串口功能,带以太网的MicroPython开发板。商业级网口、10/100M自适应、支持DHCP、稳定简单易上手。
TPYBoardv702
TPYBoardv702支持通信定位功能的MicroPython开发板。支持北斗&GPS双模定位、GPRS通信、短信、蓝牙、电话等功能。板载重力传感、温湿度、加速度传感器、蜂鸣器、LCD5110显示屏灯。
目前TPYBoard现已形成了完善的MicroPython开发体系,并形成了完善的技术文档以及技术支持服务。实践证明,加上稳定可靠的外围电路和抗干扰电源,以TPYBoard为核心的产品能成功应用于苛刻的工业环境,使开源硬件和开发平台得到更广泛的应用,产品多样性远远高于官方开发板,是MicroPython学习的首选。
硬件开发
2019-03-28 15:57:00
「深度学习福利」大神带你进阶工程师,立即查看>>>
前言
倒车雷达是汽车驻车或者倒车时的安全辅助装置,能以声音或者更为直观的显示告知驾驶员周围障碍物的情况,解除了驾驶员驻车、倒车和起动车辆时前后左右探视所引起的困扰,并帮助驾驶员扫除了视野死角和视线模糊的缺陷。倒车雷达主要由超声波传感器、控制器和显示器或蜂鸣器等组成,如下:
关注公众号“MicroPython玩家汇”可获取完整源代码
超声波传感器:主要功能是发出和接收超声波信号,然后将信号输入到主机里面,通过显示设备显示出来。
控制器:对信号进行处理,计算出车体与障碍物之间的距离及方位。
显示器或蜂鸣器:当传感器探知汽车距离障碍物的距离达到危险距离时,系统会通过显示器和蜂鸣器发出警报,提醒驾驶员。
本次我们结合TPYBoard v102结合超声波模块、数码管以及蜂鸣器模块,模拟倒车雷达的功能。
系统主要的技术特点:
探测系统:采用HC-06超声波模块,根据声波信号来计算与障碍物的距离。
显示系统:采用4位数码管,将超声波模块探测出来的距离数据进行显示,以米为单位。
主控系统:采用TPYBoard v102开发板为主控系统,将超声波探测的数据进行实时的收集与判断,当距离小于安全距离时进行蜂鸣器报警,告知驾驶员注意障碍物,谨慎驾驶。
所需器件
实物图:(部分主要器件)
程序设计
(1)初始化模块后,循环不断启动超声波进行障碍物检测;
(2)获取到超声波数据后,判断是否小于安全距离值;
(3)小于安全距离值后,启动蜂鸣器模块进行报警提示,反之关闭;
实物连接
先连接电源部分。电源部分主要涉及到降压模块和按键开关。先用万用表,找出按键开关中哪两个引脚是按下导通,弹起不导通的。这里,我们假设为引脚A和引脚B。
接下来,我们做开发板与超声波模块、4位数码管、蜂鸣器之间的连线。
4位数码管的引脚图:

程序调试
接线完毕后,就要将最重要的程序放到开发板上。首先,通过USB数据线将开发板接入电脑,电脑上会出现一个类似U盘的可移动设备,名称为【TPYBFLASH】,把程序拷贝到里面即可。
注意:操作开发板磁盘时,板载的红色LED会亮,说明开发板正在保存操作,需等待红灯熄灭再进行其他操作。
演示效果
程序调试完,拔掉USB数据线。放入18650电池,按下按键开关即可。
大家可以根据上面的模型基础上,再丰富一些功能。比如,不同的距离下,蜂鸣器的鸣叫频率不一样,距离越近越急促等。
硬件开发
2019-03-23 10:24:00
「深度学习福利」大神带你进阶工程师,立即查看>>>
在单片机编程使用中,会涉及到将某些函数定义到指定的code区。此时需要对工程文件进行配置修改才可完成。本期针对单片机平台做出说明介绍
1、测试目标
将函数testaddr定义到0x6000地址
2、测试环境
LKT4106加密芯片算法工程、KEIL-C51编译软件、
3、实现步骤
3.1 使用KEIL软件导入LKT4106算法工程(KEIL软件基本操作不再敷述,如不清楚请自行百度)
3.2 在App_Main.c文件中声明测试函数testaddr:
extern void testaddr(u8 xdata *in,u8 xdata *out,u8 len);
3.3 在App_fun.c文件中实现测试函数testaddr:
void testaddr(u8 xdata *in,u8 xdata *out,u8 len){
u8 i;
for(i=0;i < len;i++)
out[i]= in[i]+1;
}
3.4 在App_Main.c文件中调用测试函数testaddr,此处省略
3.5 编译算法工程后,在\LKT4106_AppDemo\Out\Bin\路径下找到 LKT4106_AppDemo.M51,打开该文件。
3.6 找到* * C O D E M E M O R Y * * 部分,寻找到testaddr编译后存储的地址,注意:根据编译规则,testaddr函数会转换为大写格式,并加上函数所在文件的名称。本例中,编译后的默认地址如图1所示。
图1. 默认编译链接地址
3.7 回到算法工程,选择 Project->Options for Target ...-> BL51 Misc,点击Edit按钮调出lin文件,如图2所示
图2. 打开lin文件
3.8 在LKT4106_App.lin文件中,按照下图所示,将testaddr函数指定到程序区的目标地址,本例将其由默认的0x48B0地址更改到0x6000地址,如图3所示。
图3. 更改目标函数存储的地址
3.9 编译算法工程,并重新打开LKT4106_AppDemo.M51文件,查看testaddr函数所在地址,如图4所示,该函数已经更换到0x6000地址上。
图4. 重定义后目标函数所在地址
至此,51单片机将函数定义到指定程序地址的方法已经实现。下一篇将介绍如何将ARM中的函数地址进行更改。
硬件开发
2019-03-22 17:21:00
「深度学习福利」大神带你进阶工程师,立即查看>>>
首先记牢,运放的输出受限于接入运放的电源电压。
然后,我们以输入端到输出端为正方向,则:
当电流从输入端经电容流到输出端,输出端(电容)电压逐渐下降(负压逐渐增大)。当下降到电源地,由于电压不再变动,于是电流消失,电容相当于断路,积分电路呈现比较器,输出稳定在电源地;
当电流从输出端经电容流到输入端,输出端(电容)电压逐渐增大(正压逐渐增大)。当上升到电源电压,电压不再变大,电流消失,电容相当于断路,积分电路又呈现比较器,输出稳定在电源正。
硬件开发
2019-03-21 16:18:00
「深度学习福利」大神带你进阶工程师,立即查看>>>
欧拉公式表达式

欧拉公式的几何意
cos θ + j sin θ 是个复数,实数部分也就是实部为 cos θ ,虚数部分也就是虚部为 j sin θ ,对应复平面单位圆上的一个点。
根据欧拉公式和这个点可以用 复指数 表示,如图:
复指数 对应的单位向量:起始端为原点,模长为1, 辐角 为 θ。
复数 z 与复指数 相乘可以用向量旋转来理解。

表示 z 逆时针转动 θ,如果 θ 实际是个小于0的值,那 z 就顺时针转动 θ。
用泰勒级数展开式证明欧拉公式

硬件开发
2019-03-20 22:48:00
「深度学习福利」大神带你进阶工程师,立即查看>>>
  树莓派、龙芯智龙这类mini开发板上的Linux系统,一般都提供了像Arduino一样操作引脚电路的功能,统称GPIO接口(General-purpose input/output,通用目的输入输出)。但与Arduino不同,使用上涉及稍复杂的Linux内核概念。不同于Arduino直接将物理硬件暴露给用户的形式(直接进行编程和操作,并烧写芯片),Linux系统必须通过一个叫“驱动”的程序将物理硬件进行封装,然后把其包装好的接口按照linux文件系统的方式,提供给用户进行操作,用户操作硬件的时候必须通过这个文件系统进行输入输出,也就是所谓的“用户态编程”。总结起来就是3种方式: 内核编程,将源代码跟linux源码放在一起编译,将编译好的操作系统安装到目标机子(开发板)上 内核模块编程,编译成.ko文件,通过安装驱动的方式把编译好的文件放在系统内核中 用户态编程,编译成普通可执行文件,通过fopen等操作文件的方式,打开/sys/class/gpio/下面的用户态接口(或者/dev下面自己编译的内核驱动接口),像读写文件一样操作电路。
闪烁led灯
(用户态编程,此时龙芯智龙V2上的LED对应的GPIO口为51号) #include #include #include #include int main(void){ FILE *p=NULL; int i=0; int port=51; p = fopen("/sys/class/gpio/export","w"); fprintf(p,"%d",port); fclose(p); p = fopen("/sys/class/gpio/gpio51/direction","w"); fprintf(p,"out"); fclose(p); for(i=0;i<100;i++){ p = fopen("/sys/class/gpio/gpio51/value","w"); fprintf(p,"%d",1); sleep(1); fclose(p); p = fopen("/sys/class/gpio/gpio51/value","w"); fprintf(p,"%d",0); sleep(1); fclose(p); } p = fopen("/sys/class/gpio/unexport","w"); fprintf(p,"%d",port); fclose(p); return 0; }
在VMware虚拟机安装的Kylin Ubuntu上通过交叉编译工具进行编译: mipsel-linux-gcc led51.c -o led51_mips
将编译好的led51_mips可执行文件考到u盘,通过u盘考到智龙主板上,远程链接智龙并进入智龙的linux系统,输入./led51_mips运行该可执行文件,可以看到智龙主板上5颗led灯在不停地闪烁,说明程序成功。

按键接收和控制代码
(用户态编程,此时龙芯智龙V2上的S3按键对应的GPIO口为92号): #include #include #include #include int main(void){ FILE *p=NULL; char i[100]={0,}; p = fopen("/sys/class/gpio/export","w"); fprintf(p,"%d",92); fclose(p); p = fopen("/sys/class/gpio/gpio92/direction","w"); fprintf(p,"in"); //配置成输入 fclose(p); while(1){ //以只读方式打开 p = fopen("/sys/class/gpio/gpio92/value","r"); //使文件读写定位到0位置 fseek(p , 0 , 0); #if 0 //将文件内容输出到存储器i中,注意要以字符串的方式,否则会出错 fscanf(p,"%s",i); #else //从文件中读出数据到存储器i中 fread(i , 1, 1 ,p); #endif //以字符的方式将读到的值打印出 printf("key = %c \r\n",i[0]); sleep(1); //注意这里必须要关闭,然后再次读时再重新打开,这样只面的内容才会更新 fclose(p); } return 0; }
在VMware虚拟机安装的Kylin Ubuntu上通过交叉编译工具进行编译: mipsel-linux-gcc button92.c -o button92_mips
将编译好的button92_mips可执行文件考到u盘,通过u盘考到智龙主板上,远程链接智龙并进入智龙的linux系统,输入./button92_mips运行该可执行文件,可以看到程序在不断地打印按钮的状态,我们按下智龙主板上的按键,就会看到按钮的状态会在1、0之间变化,说明程序成功了。

内核模块编程:
参考: 【Linux】【Kernel】一个简单的内核模块例子 编写一个简单的内核模块程序Hello World! Linux GPIO用户空间操作 Linux GPIO 使用示例 (带中断、内核模块编程、用户态编程) 【龙印】龙芯1c的gpio输出高低电平的linux驱动 (自定义内核驱动、安装、与用户态编程) 勤为本的封装代码系列:A、 【龙芯1c库】封装gpio接口和使用示例 ;B、 【龙芯1c库】封装硬件I2C接口和使用示例 ;


硬件开发
2019-05-14 15:18:00
「深度学习福利」大神带你进阶工程师,立即查看>>>
Arduino 自动避障智能小车制作教程
材料: Arduino UNO r3 L298N电机驱动模块 小车底盘一个,万向轮一个 2个电机及匹配的车轮 9V电池盒及6个1.5V电池 超声波测距模块及其支架 9G舵机一个及其支架 杜邦线若干
小车图片:
连线说明: Arduino UNO 2 ---> Trlg 3 ---> Echo 右轮 4 ---> IN4 5 ---> IN3 左轮 6 ---> IN2 7 ---> IN1 9 ---> 舵机橙线(数字端口) VIN ---> L298N模块5V供电口 5V ---> 舵机红线、超声波VCC GNG ---> 超声波GND、公共端COM、舵机棕线(接地) L298N模块 12V供电 ---> 电源正极 COM公共端 ---> GND、电源负极 5V供电 ---> VIN 输出A ---> 左侧电机 输出B ---> 右侧电机
小车代码: #include #define Trig 2 //引脚控制超声波发出声波 #define Echo 3 //引脚反应接收到返回声波 #define LIN1 7 //左侧轮子 #define LIN2 6 #define RIN1 5 //右侧轮子 #define RIN2 4 //#define Steeringpin 9 //舵机控制端口 int S = 0; //初始化距离 Servo Steering; //转向舵机 void setup() { // put your setup code here, to run once: Serial.begin(9600); //设置比特率 pinMode(Trig, OUTPUT); pinMode(Echo, INPUT); pinMode(LIN1, OUTPUT); pinMode(LIN2, OUTPUT); pinMode(RIN1, OUTPUT); pinMode(RIN2, OUTPUT); // pinMode(Steeringpin, OUTPUT); Steering.attach(9); //定义舵机所用引脚 Steering.write(90); //初始化舵机角度 delay(2000); //开机延时 } void loop() { // put your main code here, to run repeatedly: Steering.write(90); Range(); //测距函数 if(S <= 5) //距离太近不足以转弯 { Back(); //执行后退函数 delay(300); //后退持续时间 } else if(S >= 5 && S <= 15) //距离中等可以转弯 { Turn(); //执行转弯判断函数 } else //距离充足 { Line(); //执行直行函数 } } void Range() //测距函数 { digitalWrite(Trig,LOW); //测距 delay(2); //延时2微秒 digitalWrite(Trig,HIGH); delay(10); digitalWrite(Trig,LOW); float distance = pulseIn(Echo,HIGH); //读取高电平时间 S = float( distance * 17 )/1000; //把值赋给S Serial.println(S); //向串口发送S的值,可以在显示器上显示距离 } // float distance = pulseIn(Echo,HIGH); // S = float( distance * 17 )/1000; // 将回波时间换算成cm // 读取一个引脚的脉冲(HIGH或LOW)。例如,如果value是HIGH,pulseIn()会等待引脚变为HIGH,开始计时,再等待引脚变为LOW并停止计时。 // 返回脉冲的长度,单位微秒。如果在指定的时间内无脉冲函数返回。 // 此函数的计时功能由经验决定,长时间的脉冲计时可能会出错。计时范围从10微秒至3分钟。(1秒=1000毫秒=1000000微秒) // 接收到的高电平的时间(us)* 340m/s / 2 = 接收到高电平的时间(us) * 17000 cm / 1000000 us = 接收到高电平的时间 * 17 / 1000 (cm) void Turn() //转向函数 { Lull(); //停止 Steering.write(170); //使舵机转到170度(左侧) delay(1000); //留时间给舵机转向 Range(); //测距 Steering.write(90); //使舵机回复原位 delay(1000); if(S >= 15) //距离充足 { turnLeft(); //左转弯后退 } else //距离不足 { Steering.write(10); //使舵机转到10度(右侧) delay(1000); Range(); Steering.write(90); //使舵机回复原位 delay(1000); if(S >= 15) //距离充足 { turnRight(); //右转弯后退 } else { Back(); //后退 int x = random(1); //产生一个随机数使小车随机转向 if(x == 0) turnLeft(); else turnRight(); } } } void Back() //后退函数(使电机反转) { digitalWrite(LIN1, LOW); digitalWrite(LIN2, HIGH); digitalWrite(RIN1, HIGH); digitalWrite(RIN2, LOW); } void Line() //直线行驶函数(使电机正转) { digitalWrite(LIN1, HIGH); digitalWrite(LIN2, LOW); digitalWrite(RIN1, LOW); digitalWrite(RIN2, HIGH); } void turnLeft() //小车左转后退 { digitalWrite(LIN1, LOW); digitalWrite(LIN2, HIGH); digitalWrite(RIN1, LOW); digitalWrite(RIN2, LOW); delay(1000); } void turnRight() //小车右转后退 { digitalWrite(LIN1, LOW); digitalWrite(LIN2, LOW); digitalWrite(RIN1, HIGH); digitalWrite(RIN2, LOW); delay(1000); } void Lull() //停止 { digitalWrite(LIN1, LOW); digitalWrite(LIN2, LOW); digitalWrite(RIN1, LOW); digitalWrite(RIN2, LOW); }
制作心得:
自己本身也是个小白,出于好玩尝试做了一个,翻了很多教程都看得似懂非懂自己写了一篇希望能对大家有所帮助,也方便我以后查阅
硬件开发
2019-05-09 00:17:00
「深度学习福利」大神带你进阶工程师,立即查看>>>
交叉编译:在x86 CPU环境下编译适用于MIPS CPU架构的二进制程序
所需环境:x86(32位)linux系统【注意,一定得是32位的,不然无法使用提供的32位mips交叉编译程序。而且,智龙上的芯片也是32位的。之前安装64位的结果编译出来的程序也是64的,造成运行失败】

编译好的程序通过USB线连接,通过putty使用Series模式登录到龙芯智龙的linux操作系统:
设置上注意Flow Control和通讯Speed为115200

这里给出一个benchmark程序: #include #include #include int main(){ int t, len1, len2; len1 = 181000000; len2 = 81000000; struct timeval start, end; gettimeofday( &start, NULL ); for(t=0;t编译命令为: 编译为x86程序: gcc benchmark.c -o benchmark_x86 编译为MIPS程序: mipsel-linux-gcc benchmark.c -o benchmark_mips
注意:putty刚连接上智龙开发板的时候,是一片漆黑的,这时候会误以为还在连接中,一直等着。其实按一下回车就进入到shell界面了……真是囧死


出现bus error和segment fault是同理的,mips上是bus error
开启网络 ifconfig eth0 up
设置静态IP ifconfig eth0 192.168.3.2
【注意】这里不能直接通过设置静态IP来启动网卡,必须先eth up再eth ip地址,否则ping不通,找不到网络。
跟电脑端网线直连(不通过路由器),电脑端只需要设置
IP地址
192.168.3.1
子网掩码
255.255.255.0

这两个即可
设置完后,通过putty链接,链接方式选择telnet即可
登录账户为root,如果没改过是不需要密码的
【设置动态获取DNS】
此时虽然设置了静态ip,我们会发觉我们ping内网ping得通,外网完全不行,dns也全部失效无法解析www.baidu.com等域名。这就需要开启动态dhc客户端,自动更新ip地址以及dns:
修改如下文件: # 如果是debian系统,则应该修改这个文件: vi /etc/network/interfaces # 如果是ubuntu系统,则应该修改这个文件: vim /etc/sysconfig/network-scripts/ifcfg-eth1
添加如下代码: # 启动系统激活设备. # Loop回环地址. auto lo iface lo inet loopback # 启动系统激活设备. # 网卡eth0设置为DHCP类型. auto eth0 iface eth0 inet dhcp
添加后需要重启网络服务: /etc/init.d/networking restart 如果发觉重启networking后不起作用,可以尝试执行以下语句: dhclient eth1
如果还不行,尝试如下配置再重启: # DNS地址设置 vi /etc/resolv.conf # 必须设置.否则无法访问任何URL nameserver x.x.x.x nameserver x.x.x.x



编译大型带configure的项目的时候,需要注意工具链等一系列问题,例如编译openssh,参考编译代码如下: ./configure --with-zlib=/home/liangzulin/Downloads/zlib-1.2.11/ --host=mipsel-linux --with-cflags=-I/home/liangzulin/Downloads/openssl/include --with-ldflags=-L/home/liangzulin/Downloads/openssl/final_mips_openssl make CC="mipsel-linux-gcc" AR="mipsel-linux-ar rc" RANLIB="mipsel-linux-ranlib"
一键拷贝所有生成的可执行文件: for i in scp ssh ssh-keyscan sshd sftp ssh-add ssh-keysign sftp-server ssh-keygen ssh-pkcs11-helper; do cp $i mipsel_file_2/; done;
小插曲:使用的kylin ubuntu系统缺乏vim,然后apt源也比较旧了



【传输文件的问题】
由于没有SSH,传输文件暂时比较麻烦。我们可以交叉编译一个小工具,使用xshell来解决:
lrzsz is a portable and fast implementation of the X/Y/Zmodem protocols.
Linux上安装rz和sz命令


老版本的debian系统可能不含gcc,但是含有cpp、cc1、as、ld等编译工具链,可以采用如下方式编译: mipsel-linux-cpp hello_mips_test.c -o hello_mips_test.i mipsel-linux-c++ hello_mips_test.i -o hello_mips_test.s mipsel-linux-as hello_mips_test.s -o hello_mips_test.o mipsel-linux-ld hello_mips_test.o -o hello_mips_test.out
四个步骤的说明:
Gcc的编译流程分为了四个步骤
龙芯社区开源项目源码库

硬件开发
2019-05-08 14:33:00
「深度学习福利」大神带你进阶工程师,立即查看>>>
2019年3月,教育部发布《2019年教育信息化和网络安全工作要点》,推动在中小学阶段设置人工智能相关课程,逐步推广编程教育。其实早在2017年,我国就将少儿编程纳入到国务院发展规划中,作为国家级战略推进。
2018年9月,Python语言正式首秀全国计算机等级考试,在这次考试中,萝卜教育11岁的的小学员夏启恒在系统学习针对青少年阶段的MicroPython培训课程后顺利过关。作为国内MicroPython创客理念的引入者和学科式编程的倡导者,萝卜教育还拥有国内第一块支持MicroPython的口袋编程计算机--TPYBoard。
小小开发板成就大大梦想
TPYBoard是萝卜教育推出的一款典型的MicroPython开发板,提供了用于控制各种单片机接口的底层Python操作系统。现有支持STM32F405的基础板、WIFI系列、物联网系列、通信系列以及国内支持MicroPython的STM32F407系列开发板。
凭借MicroPython高效的开发效率以及超强的硬件访问能力等,TPYBoard逐渐在物联网嵌入式系统中承当越来越大量的任务,已经逐渐成为物联网开发的一大利器。借助TPYBoard,青少年学生可以轻松的完成诸如各类智能小车、智慧农业、家庭气象站、温控小风扇、自动浇花系统等主流的竞赛作品。
通过对TPYBoard开发板的学习,很多小学生也可以轻松写出一些很有趣的程序,例如四则运算练习程序、登陆密码管理以及趣味猜数字游戏等。还能快速掌握排序、递推、树、图等算法,了解时间复杂度与空间复杂度的概念。还能帮助孩子脱离积木式编程思维,建立青少年逻辑编程思维,全面提升综合能力。从MicroPython到TPYBoard,小小开发板帮助孩子成就大大梦想。
从MicroPython开源硬件提供商到学科式编程领导者
2016年,萝卜教育将Python开源硬件引入中国,生产出国内第一块支持MicroPython的口袋编程计算机-TPYBoard开发板。次年,研发出面向青少年编程教育的TPYBoard代码自生成编辑器PythonEditor,将Python硬件与计算机语言学习相结合,提出学科式编程课程体系研发理念。
萝卜教育致力于为青少年和创客爱好者提供MicroPython开源硬件产品TPYBoard系列开发板以及零配件产品。现已推出多款自主研发产品,服务全球创客超过10万人。同时,萝卜教育向教育和培训机构提供创客教育产品和解决方案,持续为青少年学科编程教育提供严谨、专业的课程体系研发和服务,目前已在山东、辽宁、东莞、杭州和广州等多地市建立合作机构,广受客户好评。
从MicroPython到TPYBoard开发板,再到学科式编程教育。萝卜教育始终秉持专业严谨的创客理念。搭建了目前国内最健全的TPYBoard一站式技术网站,通过网站,创客们可以找到丰富的学习课程和MicroPython技术资料。除此之外,萝卜教育还发行出版了多本Python机器人编程专业着作,具有良好的市场口碑。致力于成为中国专业的青少年学科编程教育品牌,立足青少年学科编程培训,给孩子一个新的思考方式,让中国青少年与世界同步!
硬件开发
2019-05-06 15:08:00
「深度学习福利」大神带你进阶工程师,立即查看>>>
Redis实现了不定长压缩前缀的radix tree,用在集群模式下存储slot对应的的所有key信息。本文将详述在Redis中如何实现radix tree。
核心数据结构
raxNode是radix tree的核心数据结构,其结构体如下代码所示: typedef struct raxNode { uint32_t iskey:1; uint32_t isnull:1; uint32_t iscompr:1; uint32_t size:29; unsigned char data[]; } raxNode; iskey:表示这个节点是否包含key 0:没有key 1:表示从头部到其父节点的路径完整的存储了key,查找的时候按子节点iskey=1来判断key是否存在 isnull:是否有存储value值,比如存储元数据就只有key,没有value值。value值也是存储在data中 iscompr:是否有前缀压缩,决定了data存储的数据结构 size:该节点存储的字符个数 data:存储子节点的信息 iscompr=0:非压缩模式下,数据格式是: [header strlen=0][abc][a-ptr][b-ptr][c-ptr](value-ptr?) ,有size个字符,紧跟着是size个指针,指向每个字符对应的下一个节点。size个字符之间互相没有路径联系。 iscompr=1:压缩模式下,数据格式是: [header strlen=3][xyz][z-ptr](value-ptr?) ,只有一个指针,指向下一个节点。size个字符是压缩字符片段
Rax Insert
以下用几个示例来详解rax tree插入的流程。假设j是遍历已有节点的游标,i是遍历新增节点的游标。
场景一:只插入abcd
z-ptr指向的叶子节点iskey=1,使用了压缩前缀。
场景二:在abcd之后插入abcdef
从abcd父节点的每个压缩前缀字符比较,遍历完所有abcd节点后指向了其空子节点,j = 0, i < len(abcded)。
查找到abcd的空子节点,直接将ef赋值到子节点上,成为abcd的子节点。ef节点被标记为iskey=1,用来标识abcd这个key。ef节点下再创建一个空子节点,iskey=1来表示abcdef这个key。
场景三:在abcd之后插入ab
ab在abcd能找到前两位的前缀,也就是i=len(ab),j < len(abcd)。
将abcd分割成ab和cd两个子节点,cd也是一个压缩前缀节点,cd同时被标记为iskey=1,来表示ab这个key。
cd下挂着一个空子节点,来标记abcd这个key。
场景四:在abcd之后插入abABC
abcABC在abcd中只找到了ab这个前缀,即i < len(abcABC),j < len(abcd)。这个步骤有点复杂,分解一下: step 1:将abcd从ab之后拆分,拆分成ab、c、d 三个节点。 step 2:c节点是一个非压缩的节点,c挂在ab子节点上。 step 3:d节点只有一个字符,所以也是一个非压缩节点,挂在c子节点上。 step 4:将ABC 拆分成了A和BC, A挂在ab子节点上,和c节点属于同一个节点,这样A就和c同属于父节点ab。 step 5:将BC作为一个压缩前缀的节点,挂在A子节点下。 step 6:d节点和BC节点都挂一个空子节点分别标识abcd和abcABC这两个key。
场景五:在abcd之后插入Aabc
abcd和Aabc没有前缀匹配,i = 0,j = 0。
将abcd拆分成a、bcd两个节点,a节点是一个非压缩前缀节点。
将Aabc拆分成A、abc两个节点,A节点也是一个非压缩前缀节点。
将A节点挂在和a相同的父节点上。
同上,在bcd和abc这两个节点下挂空子节点来分别表示两个key。
Rax Remove
删除
删除一个key的流程比较简单,找到iskey的节点后,向上遍历父节点删除非iskey的节点。如果是非压缩的父节点并且size > 1,表示还有其他非相关的路径存在,则需要按删除子节点的模式去处理这个父节点,主要是做memove和realloc。
合并
删除一个key之后需要尝试做一些合并,以收敛树的高度。
合并的条件是: iskey=1的节点不能合并 子节点只有一个字符 父节点只有一个子节点(如果父节点是压缩前缀的节点,那么只有一个子节点,满足条件。如果父节点是非压缩前缀的节点,那么只能有一个字符路径才能满足条件)
结束语
云数据库Redis版(ApsaraDB for Redis)是一种稳定可靠、性能卓越、可弹性伸缩的数据库服务。基于飞天分布式系统和全SSD盘高性能存储,支持主备版和集群版两套高可用架构。提供了全套的容灾切换、故障迁移、在线扩容、性能优化的数据库解决方案。欢迎各位购买使用:云数据库 Redis 版
原文链接
本文为云栖社区原创内容,未经允许不得转载。
硬件开发
2019-04-30 13:12:00
「深度学习福利」大神带你进阶工程师,立即查看>>>
近日,技术媒体Linux中国的创始人王兴宇对蚂蚁金服SOFA开源负责人鲁直,就SOFA 5、ServiceMesh、Serverless、Seata等技术内容进行了探讨,以下为专访文章。
虽然我和鲁直在微信上已经联系很久了,但这还是第一次见面。交谈中,我了解到鲁直是2009 年加入阿里巴巴工作,已经有十年了。刚开始是在1688.COM 做业务系统,对中间件技术非常感兴趣,也会经常研究各种中间件的实现和功能。后来在 2013年时,为了更深入地学习研究中间件框架,转到了蚂蚁金服中间件团队,从那个时候开始就一直在做 SOFA。
目前鲁直在SOFA的团队主要负责的工作包括几个部分。其中一个主要部分就是 SOFA 开源相关的工作。SOFA 的产品体系非常广,包括已经对外开源的部分、内部整个微服务体系,以及 SOFA 框架等等——而这些开源相关的工作主要是由鲁直负责推动的。
当然,作为技术负责人,鲁直既要带技术团队也要做技术工作。谈及这一点,鲁直说:
“我觉得做技术管理,跟普通的管理不太一样,因为 技术管理最重要的一个点是除了管理之外,还要保持一定的技术判断力和敏锐度 。对一些新技术,包括团队中遇到一些重大的技术问题,你都要有一些方向性的判断。虽然最后不一定是你具体解决的,但是在整个团队的技术攻坚和技术选型上,要一起确立方向。”
我以前也做过十余年的技术管理,我很能够感受这种情况, 重大问题技术负责人更要迎难而上 。
SOFA 5 落子 Service Mesh
就我了解的情况,现在 SOFA 已经发展到了 SOFA5 了。在 SOFA4阶段,主要的任务是将开源体系捋清楚了,然后开始按步骤地开源;到现在发展到了 SOFA5。我想知道从 SOFA4 发展到 SOFA5,是什么让蚂蚁金服中间件团队判断 SOFA4 的阶段性目标已经达成,可以迈进到新的 SOFA5 阶段了呢?
“从整个业界趋势上来讲,SOFA4 的架构相对来说还是偏传统一些,更多是对我们之前的技术框架的整理和梳理。在这个阶段,SOFA 的代码经过了非常多的优化和重构,才达到了对外开源的要求,从而 SOFA 走上了开源核心的模式,逐步分阶段的将各个部分进行了开源。”鲁直讲到,“但是,从我们对业界的整体判断上来说,未来无疑是云的时代,所以说要考虑怎么让所有的业务系统能够提供云的能力,比如说 Serverless。”
接着这个话题,鲁直讲了他对云计算的理解:“一方面云计算肯定要为整个业务的发展提供更加方便的基础资源,可以不用去关心底层的基础设施。Serverless字面的意思就是说‘无服务器’——我不用关心服务器怎么来的,不用关心基础设施,只要关心业务代码就可以了。那反过来对于云服务商来说,经过了这一层抽象,其资源利用率会更高,可以有更多的利润空间,这是一个双赢的局面。对于用户来讲,这种好处是实实在在的,可以更少关注基础设施,只关心代码就可以了。”
“我们希望在 SOFA5 的方向上,在这个新的迭代中,去让业务——包括让未来我们开源出来各种功能、各样服务模式——都更多地去关心自己的业务代码,而不用再过多地关心基础设施。”鲁直说,
在 SOFA5 中,一个重要的方向就是 Service Mesh这个方向,这将是 SOFA5 中非常重要的特性。鲁直强调了其对 Service Mesh 技术的看好:“我认为 Service Mesh 是迈向未来往前走的非常关键的一步,让业务不用再关心基础设施。通过 Service Mesh,我们可以将很多技术能力直接放到基础设施里面,而业务可以不用感知到这一层。原来可能需要花几个小时或者更多的时间解决的基础设施问题,现在可以通过 Service Mesh解决掉。”
“目前我们我们已经在生产环境中应用了 Service Mesh。我们在这方面有非常大的决心,我们希望能够在今年,在更大的范围中去落地 Service Mesh。当前这个阶段更聚焦在这种技术的内部落地上,希望用好了,再给社区做更多的贡献。”
Service Mesh 这个词最早是由开发 Linkerd 的 Buoyant 公司于 2016 年提出的,随着 Linkerd 的传入,Service Mesh 也进入国内技术社区的视野。Service Mesh 也被翻译为“服务网格”。Linkerd 则是业界第一个 Service Mesh。
Service Mesh是一个基础设施层,用于处理服务间通信,负责实现请求的可靠传递。在实践中,服务网格通常实现为轻量级网络代理,通常与应用程序部署在一起,但是对应用程序透明。
Service Mesh 的部署模型,有两种情况:  对于一个简单请求,作为请求发起者的客户端应用实例,会首先用简单方式将请求发送到本地的 Service Mesh 实例。这是两个独立进程,它们之间是远程调用。Service Mesh 会完成完整的服务间调用流程,如服务发现负载均衡,最后将请求发送给目标服务。这就是 Sidecar,它在原有的客户端和服务端之间加多了一个代理。
 多个服务调用的情况,Service Mesh 出现在所有的服务的下面,这一层被称之为服务间通讯专用基础设施层。Service Mesh 会接管整个网络,把所有的请求在服务之间做转发。在这种情况下,上面的服务不再负责传递请求的具体逻辑,只负责完成业务处理。服务间通讯的环节就从应用里面剥离出来,呈现出一个抽象层。
如果有大量的服务,Sidecar 之间的连接就会形成一个网络,这个就是服务网格名字的由来。
Serverless这个概念虽然提出来已经有几年了,但是尤其在国内,Serverless、FaaS 这些技术的发展还是相对比较滞后。
“我们将以Service Mesh为跳板再往前走。”鲁直表示,“Serverless更多的还是应该聚焦在其字面本身,其含义就是‘无服务器’,后面的技术都是为了让无服务器承载具体的业务。”
而目前AWS在Serverless和 FaaS方面处于比较前沿的位置,据我所知,国内的云服务商在积极推进这方面,但是用户普及程度似乎不是特别高。
鲁直指出,“我觉得Serverless想要成功,还是要从覆盖业务的整个广度上打开,否则可能还是停留在 FaaS 上,那场景就比较受限。”
Service Mesh 将是微服务的下一个时代,关于它还在持续进行理论研究和实践探索。
鲁直说:“坦白来讲,我觉得istio的理念非常好,但是在整个工程设计上,如果放到蚂蚁金服这样体量较大的环境里面,可能跑起来还需要做一些工作。我们希望今年 Service Mesh 在蚂蚁金服有了更大规模落地之后,可以把我们在 Service Mesh 方面的一些实践经验用到产品环境的工程中去实践,然后贡献出去。目前更多的一些工作,是将整个体系上进一步完善,铺到更多业务上,然后将这些经验反哺到整个 Service Mesh 的设计上,让它走的更远。”
也就是说,蚂蚁金服在 Service Mesh 上跟 istio 的技术路线是一致的,但是会从工程的角度更多地推动它的发展。
鲁直:“我们希望能够在我们进行了生产验证之后,再慎重地推送给开源社区。这也是蚂蚁做开源贡献的一贯理念——我们希望一个东西经过了内部一段时间的成熟之后,再去开源。经过了大规模的内部验证之后,它的稳定性上有了一定的保障,就贡献给外部社区使用,再去拓展更多一些使用场景,包括完善和解决一些之前没有遇到一些问题。”
合力 Seata 分布式事务框架
2007 开始,蚂蚁金服自主研发了分布式事务中间件 XTS,在内部广泛应用并解决金融核心场景下的跨数据库、跨服务数据一致性问题,最终以 DTX 的云产品化展现并对外开放。
而与此同时,阿里巴巴中间件团队发布 TXC,为集团内应用提供分布式事务服务,经过多年的技术沉淀,于 2016 年产品化改造为 GTS,通过阿里云解决方案在众多外部客户中落地实施。
2019 年 1 月,基于技术积累,阿里巴巴中间件团队发起了开源项目 Fescar,蚂蚁金服也开源了自己的分布式事务框架,并与 Fescar 合并一起共建分布式事务解决方案。这个发展既在情理之中,也在意料之外,我确实好奇这期间发生了什么,是如何和 SOFA 中间件团队的发展结合的,他们下一步会有什么计划?
鲁直说:“分布式事务是蚂蚁金服在 2007 年做的创新,是基于TCC 原理,我们在内部实现了这个模式。TCC 理论相对还是比较简单的,但是它要落地,需要花费比较长的工程实现上的打磨才行。分布式事务这个技术在蚂蚁金服已经走过了12年的时间了。在蚂蚁金服最核心一些业务上,包括支付、交易、账务等等系统都在使用这套分布式事务框架解决和孵化的。”
在分布式事务这一块领域上,在业界来看目前相对来说比较空白,还没有非常好的分布式事务框架。说起来合并的初衷,鲁直表示,“既然阿里巴巴和蚂蚁金服都在这个方向做了一些开源的工作,所以我们把这两个部分的努力结合起来,取长补短,以适用于更多的分布式事务业务场景,蚂蚁金服加入 Seata 社区共建,在 Seata 0.4.0 版本中加入了 TCC 模式,为大家提供一个更加宽泛的分布式事务的解决方案。”
具体来说,“阿里巴巴的 Seata 提供是 AT 模式,对业务来说,不用有太多感知,但是它覆盖的场景有限,如果可以接受这样的情况,用 AT 模式更好。而蚂蚁金服因为有更强的金融方面的要求,就需要采用 TCC 模式,业务接入成本更高,但是它能做到非常好的分布式执行。未来还会提供像 XA 这样的模式,去适应更宽泛业务场景,这在这一块上,蚂蚁金服和阿里巴巴会结合在一起提供一个融合的框架。”
Seata 为解决微服务架构下的分布式事务问题交出了一份与众不同的答卷。而 Seata 的愿景是让分布式事务的使用像本地事务的使用一样简单和高效,希望可以让 Seata 适用于所有的分布式事务场景。
蚂蚁金服如何做开源
作为开源核心模式的项目,我希望了解蚂蚁金服中间件的开源一般会做哪些工作,是否有比较完善的流程和规则?
“首先,最基础的肯定是代码,并提供对应的示例,然后我们会提供贡献者指南这样的指引文档,因为本质上我们希望打造成一个开源社区,社区的参与度对我们来说是非常重要的东西,有人会上来提issue,也有人来解答,有人提功能需求,有人提 PR 等等”,鲁直说。
Linux中国曾经开发过一个用于测算开源项目活跃度的一个模型,我们认为从过去感性地看一个开源项目是不是活跃,已经开始逐渐进步到通过理性数据评估了,但是这需要排除一些数据作弊的情况,就像之前很多人会用项目的星标数来评估项目的活跃度,这当然很粗糙。我们今年还会继续配合 2019年度的开源年报,而提供数据支持,到时候我们肯定会给 SOFA 相关的项目做一个考察。希望可以切实地反映出来 SOFA 在开源方面的工作。
从之前的脉络上看,到了 SOFA5,还会继续沿袭开放核心的模式,即:核心部分开源,与本地业务强关联,但是跟核心不是强关联的部分不开源。
而对于开源核心模式,有人唱衰,也有人说好,各种观点都有。但从蚂蚁金服自身的实践来看,他们已经切实地践行了开源核心模式,这是我在国内第一个深入了解过的真实落地的开源核心模式项目。
说到开源模式,鲁直表示:“做开源,我觉得首先肯定要做一个心理准备,就是说你要有一个核心部分,再在这个基础上做扩展,在维护的成本上肯定有一定的上升,但是你要接受这样的成本——我觉得这种成本是可以接受的。……项目本身要设计好,具备一定分拆的可能性。如果不具备分拆可能性,那没法做了。像微内核这样的设计方式就会比较适合——就是开源一个核心模块,然后再去扩展,各种模块是可插拔的。”
而对于开源工作是如何做的,鲁直说:“我们没有专门做开源的人,也没有专门做内部代码的人,我们是把这两部分放在一起,既做开源又做内部代码,因为这样一个好处是,既熟悉外部的代码,又熟悉内部的代码,这个边界自己可以把握比较好。我们更多是制定一些规则。比如说跟业务层强相关的部分,你开源出去也没人用;如果说跟业务不相关的,你为什么不开源?因为你开源的这个产品想要做得更好,这些能力开源出去其实没有太大问题,所以一般我们的标准就是看是不是跟内部系统相关,是不是跟业务强相关,如果不相关就可以开源。”
谈话中,鲁直反问的“你为什么不开源?”这句话让我印象深刻,这其实代表了他们开源的初心,但是从商业者从公司的角度来说,开源有没有给公司带来真正的好处?这不仅仅是情怀的问题,我相信每一个热爱开源的人,其实存在开源情怀或者是更理想化的想法,但是从另一方面来说,无论是从公司的机制上,还是公司的业绩上,开源还是要有实实在在的收益,能够推动公司业务发展才行。作为一个开源项目的负责人,他是怎么感受到开源的好处呢?
对这个问题,显然他有过成熟的思考:“第一,最直接的好处就是更长效。从眼前看,你的名声出去了招聘是不是也容易找到更合适的人?这是最短期的收益。长期的好处,开源社区里面大家分享了非常多的观点,从实践来看,也是这样。比如说你在一家公司里面去做的话,公司的业务场景是有限的,虽然说蚂蚁金服覆盖了各种各样的业务,金融方面的基本上全覆盖了。但是其他的行业不一定都有,他们遇到这个问题,我们可能并不会遇到,但这些问题可能是未来能够遇到的,如果把一个项目以开源的方式运作,就意味着说,更大的用例场景更容易发现 bug,用的人越多,越有可能会触发这个bug,那对于就是有了进一步完善的可能。
另外,有了这样的一个社区化的发展,有更多人参与进来之后,这个项目可以更快往前发展,而不是只有你自己在。在一家公司里边,团队的人员数量肯定是有限的,而有这么多人来参与,那对于这个项目的往前演进来说有非常大的好处,反过来对公司也会带来更多好处——无论是潜在的还是直接的。
最后,如果你的产品有商业化的支持,比如说其他系统的支撑,也能够更好提供商业化的支持。”
SOFA开源以来,就我目前了解到的情况,大概已经有30家左右的企业用户在使用这套开源框架——就是直接拿开源的部分去用了。当然这主要是国内的用户,那么在国外影响力没有像国内这么大的原因在哪儿呢?是因为我们的项目不够国际化呢,还是知道这个框架的人不够多呢?
鲁直说:“我觉得可能是两方面的原因。一方面,我们的确在国际化方面做的并不是很多,在今年我们会去尝试做更多的国际化工作。另外一方面,更多的是文化方面的差异,大家的思维方式可能不太一样。当然我们会尝试走一下国际化的路线,因为开源本来就是不分国界的。”
进一步的 SOFA在社区治理这方面,“我们希望能够采用和参考 Apache 基金会的方式,这是一个很完善的治理模式,我们会尝试采用这样的方式去社区治理。这对于国际化产品是有很多好处的,它更多强调的是一种治理模式,是不是以社区的方式在运作,是不是在尊重整个社区等等。”鲁直表示,“我们会考虑跟 Apache基金会、CNCF进行直接接触,如果合适的话,我们会捐献项目给基金会。如果只是一家商业公司而没有基金会的支持,大家也会有更多的顾虑。把项目捐献给基金会,给大家更多的信心,通过基金会的托管,让更多一些参与方参与,而不只是有蚂蚁金服,大家也会有更大的信心参与进来。”
最后,鲁直希望致语开源社区,“其实蚂蚁金服开源的东西,也 不只是 SOFA 中间件框架,未来会开源更多 的东西,包括 AI 方面的一些技术,也希望整个社区能够多关注蚂蚁金服在开源上面未来的举措。”
作者:王兴宇
原文链接 ​
本文为云栖社区原创内容,未经允许不得转载。
硬件开发
2019-04-30 11:51:00
「深度学习福利」大神带你进阶工程师,立即查看>>>
关于阿里云弹性web托管的详细教程: 阿里云弹性web托管使用教程
产品概述
弹性Web托管:阿里云推出的新一代建站主机,基于先进的容器技术架构,资源隔离性好,且具有攻击隔离能力,更稳定、安全,带配套控制面板,管理体验同虚机一样简单。
应用支持:
选型推荐:
更多课程:
阿里云大学官网( 阿里云大学 - 官方网站,云生态下的创新人才工场 )
硬件开发
2019-04-29 16:33:00
「深度学习福利」大神带你进阶工程师,立即查看>>>
随着现代家庭用火、用电量的增加,家庭火灾发生的频率越来越高。家里一旦发生火灾,如果出现扑救不及时、灭火器材缺乏、以及在场人惊慌失措、逃生迟缓等不利情况下,最终就会导致产生重大的生命财产的损失。
消防部门的统计显示,在所有的火灾比例中,家庭火灾已经占到了全国火灾的30%左右。家庭起火的原因林林种种,可能在我们注意得到的地方,也可能就隐藏在我们根本就注意不到的地方。所以为了保护家庭人身财产的安全,为了悲剧不再上演,研究家庭火灾的特点及防火对策,对于预防家庭火灾,减少火灾损失具有很重要的现实意义。
本次我们使用TPYBoard v102结合烟雾检测模块(MQ-2)、温度传感器、LCD5110液晶显示屏以及蜂鸣器模块等,模拟实现智能火灾报警器。
系统主要的技术特点:
检测系统:
1)采用烟雾检测模块(MQ-2),实时检测当前环境中的烟雾浓度值。
2)采用温度传感器(DS18B20),实时检测当前环境中的温度值。
显示系统:采用LCD5110液晶显示屏,将温度数据和烟雾报警状态实时显示,方便人员第一时间获取到数据。
主控系统:采用TPYBoard v102开发板为主控系统,将温度数据和烟雾浓度数据进行实时的采集与判断。当烟雾浓度和温度达到阈值时,启动蜂鸣器报警,告知人员发现火情,请快速处理。
所需器件
实物图:(部分主要器件)
程序设计
(1)初始化模块后,循环不断启动超声波进行障碍物检测;
(2)获取到超声波数据后,判断是否小于安全距离值;
(3)小于安全距离值后,启动蜂鸣器模块进行报警提示,反之关闭;
实物连接
先连接电源部分。电源部分主要涉及到降压模块和按键开关。先用万用表,找出按键开关中哪两个引脚是按下导通,弹起不导通的。这里,我们假设为引脚A和引脚B。
接下来,我们做开发板与MQ-2模块、温度传感器、LCD5110显示屏、蜂鸣器等期间之间的连线。
ds18b20器件引脚图:



程序调试
接线完毕后,就要将最重要的程序放到开发板上。首先,通过USB数据线将开发板接入电脑,电脑上会出现一个类似U盘的可移动设备,名称为【TPYBFLASH】,把程序拷贝到里面即可。
注意:操作开发板磁盘时,板载的红色LED会亮,说明开发板正在保存操作,需等待红灯熄灭再进行其他操作。
演示效果
程序调试完,拔掉USB数据线。放入18650电池,按下按键开关即可。
本次实验进行了烟雾、温度的检测,通过检测到的数据判断出是否出现火灾。当出现火灾时,进行蜂鸣报警。可是当家中无人员时,该怎么办?大家可以根据该实验的基础上,增加网络模块,当出现异常情况时,可通过网络或电话等,第一时间通知相关人员进行处理。
硬件开发
2019-04-25 16:57:00
「深度学习福利」大神带你进阶工程师,立即查看>>>
Asus 的路由器AC86U(Merlin firmware 384.9/384.10.2)突然出现变慢,自己通过entware加载的程序运行失败,连ls -l都要等一分钟。
经过重启,不管用;拔网线,不管用。
后来发现插的Sandisk U盘比较烫,就拔了下来,然后重启,恢复。
把U盘插到PC机上,发现U盘已经读不出来了,估计是过热、或者长时间运行已经损坏。
换了个U盘,重启路由器,可以正常运行。
更多参考: Asus Merlin开机启动设置与服务脚本编写 在Asus Merlin固件的Dropbear使用及免密登录 使用shell编写的极简WatchDog 使用shell编写的极简Ubuntu Service 树莓派(Raspberry Pi)使用Shell编写的极简Service SSH 命令行参数详解【英】
硬件开发
2019-04-18 15:21:00
「深度学习福利」大神带你进阶工程师,立即查看>>>
作者:个推平台研发工程师 祥子
一、业务背景
在个推的推送场景中,消息队列在整个系统中占有非常重要的位置。 当 APP 有推送需求的时候, 会向个推发送一条推送命令,接到推送需求后,我们会把APP要求推送消息的用户放入下发队列中,进行消息下发;当同时有多个APP进行消息下发时,难免会出现资源竞争的情况, 因此就产生了优先级队列的需求,在下发资源固定的情况下, 高优先级的用户需要有更多的下发资源。
二、基于 Kafka 的优先级队列方案
针对以上场景,个推基于 Kafka 设计了第一版的优先级队列方案。Kafka 是 LinkedIn 开发的一个高性能、分布式消息系统;Kafka 在个推有非常广泛的应用,如日志收集、在线和离线消息分发等。
架构 在该方案中,个推将优先级统一设定为高、中、低三个级别。具体操作方案如下: 对某个优先级根据 task (单次推送任务)维度,存入不同的 Topic,一个 task 只写入一个 Topic,一个 Topic 可存多个 task; 消费模块根据优先级配额(如 6:3:1),获取不同优先级的消息数,同一优先级轮询获取消息;这样既保证了高优先级用户可以更快地发送消息,又避免了低优先级用户出现没有下发的情况。
Kafka 方案遇到的问题
随着个推业务的不断发展,接入的 APP 数量逐渐增多,第一版的优先级方案也逐渐暴露出一些问题: 当相同优先级的 APP 在同一时刻推送任务越来越多时,后面进入的 task 消息会因为前面 task 消息还存在队列情况而出现延迟。如下图所示, 当 task1 消息量过大时,在task1 消费结束前,taskN 将一直处于等待状态。 Kafka 在 Topic 数量由 64 增长到 256 时,吞吐量下降严重,Kafka 的每个 Topic、每个分区都会对应一个物理文件。当 Topic 数量增加时,消息分散的落盘策略会导致磁盘 IO 竞争激烈,因此我们不能仅通过增加 Topic 数量来缓解第一点中的问题。
基于上述问题,个推进行了新一轮的技术选型, 我们需要可以创建大量的 Topic, 同时吞吐性能不能比 Kafka 逊色。经过一段时间的调研,Apache Pulsar 引起了我们的关注。
三、为什么是 Pulsar
Apache Pulsar 是一个企业级的分布式消息系统,最初由 Yahoo 开发,在 2016 年开源,并于2018年9月毕业成为 Apache 基金会的顶级项目。Pulsar 已经在 Yahoo 的生产环境使用了三年多,主要服务于Mail、Finance、Sports、 Flickr、 the Gemini Ads platform、 Sherpa (Yahoo 的 KV 存储)。
架构
Topic 数量 Pulsar 可以支持百万级别 Topic 数量的扩展,同时还能一直保持良好的性能。Topic 的伸缩性取决于它的内部组织和存储方式。Pulsar 的数据保存在 bookie (BookKeeper 服务器)上,处于写状态的不同 Topic 的消息,在内存中排序,最终聚合保存到大文件中,在 Bookie 中需要更少的文件句柄。另一方面 Bookie 的 IO 更少依赖于文件系统的 Pagecache,Pulsar 也因此能够支持大量的主题。
消费模型 Pulsar 支持三种消费模型:Exclusive、Shared 和Failover。 Exclusive (独享) :一个 Topic 只能被一个消费者消费。Pulsar 默认使用这种模式。
Shared(共享) :共享模式,多个消费者可以连接到同一个 Topic,消息依次分发给消费者。当一个消费者宕机或者主动断开连接时,那么分发给这个消费者的未确认(ack)的消息会得到重新调度,分发给其他消费者。
Failover (灾备) :一个订阅同时只有一个消费者,可以有多个备份消费者。一旦主消费者故障,则备份消费者接管。不会出现同时有两个活跃的消费者。
Exclusive和Failover订阅,仅允许一个消费者来使用和消费每个订阅的Topic。这两种模式都按 Topic 分区顺序使用消息。它们最适用于需要严格消息顺序的流(Stream)用例。
Shared 允许每个主题分区有多个消费者。同一个订阅中的每个消费者仅接收Topic分区的一部分消息。Shared最适用于不需要保证消息顺序队列(Queue)的使用模式,并且可以按照需要任意扩展消费者的数量。
存储 Pulsar 引入了 Apache BookKeeper 作为存储层,BookKeeper 是一个专门为实时系统优化过的分布式存储系统,具有可扩展、高可用、低延迟等特性。具体介绍,请参考 BookKeeper官网 。
Segment BookKeeper以 Segment (在 BookKeeper 内部被称作 ledger) 作为存储的基本单元。从 Segment 到消息粒度,都会均匀分散到 BookKeeper 的集群中。这种机制保证了数据和服务均匀分散在 BookKeeper 集群中。
Pulsar 和 Kafka 都是基于 partition 的逻辑概念来做 Topic 存储的。最根本的不同是,Kafka 的物理存储是以 partition 为单位的,每个 partition 必须作为一个整体(一个目录)存储在某个 broker 上。 而 Pulsar 的 partition 是以 segment 作为物理存储的单位,每个 partition 会再被打散并均匀分散到多个 bookie 节点中。
这样的直接影响是,Kafka 的 partition 的大小,受制于单台 broker 的存储;而 Pulsar 的 partition 则可以利用整个集群的存储容量。
扩容 当 partition 的容量达到上限后,需要扩容的时候,如果现有的单台机器不能满足,Kafka 可能需要添加新的存储节点,并将 partition 的数据在节点之间搬移达到 rebalance 的状态。
而 Pulsar 只需添加新的 Bookie 存储节点即可。新加入的节点由于剩余空间大,会被优先使用,接收更多的新数据;整个扩容过程不涉及任何已有数据的拷贝和搬移。
Broker 故障 Pulsar 在单个节点失败时也会体现同样的优势。如果 Pulsar 的某个服务节点 broker 失效,由于 broker 是无状态的,其他的 broker 可以很快接管 Topic,不会涉及 Topic 数据的拷贝;如果存储节点 Bookie 失效,在集群后台中,其他的 Bookie 会从多个 Bookie 节点中并发读取数据,并对失效节点的数据自动进行恢复,对前端服务不会造成影响。
Bookie 故障 Apache BookKeeper 中的副本修复是 Segment (甚至是 Entry)级别的多对多快速修复。这种方式只会复制必须的数据,这比重新复制整个主题分区要精细。如下图所示,当错误发生时, Apache BookKeeper 可以从 bookie 3 和 bookie 4 中读取 Segment 4 中的消息,并在 bookie 1 处修复 Segment 4。所有的副本修复都在后台进行,对 Broker 和应用透明。
当某个 Bookie 节点出错时,BookKeeper会自动添加可用的新 Bookie 来替换失败的 Bookie,出错的 Bookie 中的数据在后台恢复,所有 Broker 的写入不会被打断,而且不会牺牲主题分区的可用性。
四、基于 Pulsar 的优先级队列方案
在设计思路上,Pulsar 方案和 Kafka 方案并没有多大区别。但在新方案中,个推技术团队借助 Pulsar 的特性,解决了 Kafka 方案中存在的问题。 根据 task 动态生成 Topic,保证了后进入的 task 不会因为其他 task 消息堆积而造成等待情况。 中高优先级 task 都独享一个 Topic,低优先级 task 共享 n 个 Topic。 相同优先级内,各个 task 轮询读取消息,配额满后流转至下一个优先级。 相同优先级内, 各个 task 可动态调整 quota, 在相同机会内,可读取更多消息。 利用 Shared 模式, 可以动态添加删除 consumer,且不会触发 Rebalance 情况。 利用 BookKeeper 特性,可以更灵活的添加存储资源。
五、Pulsar 其他实践 不同 subscription 之间相对独立,如果想要重复消费某个 Topic 的消息,需要使用不同的 subscriptionName 订阅;但是一直增加新的 subscriptionName,backlog 会不断累积。 如果 Topic 无人订阅,发给它的消息默认会被删除。因此如果 producer 先发送,consumer 后接收,一定要确保 producer 发送之前,Topic 有 subscription 存在(哪怕 subscribe 之后 close 掉),否则这段时间发送的消息会导致无人处理。 如果既没有人发送消息,又没有人订阅消息,一段时间后 Topic 会自动删除。 Pulsar 的 TTL 等设置,是针对整个 namespace 起效的,无法针对单个 Topic。 Pulsar 的键都建立在 zookeeper 的根目录上,在初始化时建议增加总节点名。 目前 Pulsar 的 java api 设计,消息默认需要显式确认,这一点跟 Kafka 不一样。 Pulsar dashboard 上的 storage size 和 prometheus 上的 storage size (包含副本大小)概念不一样。 把 dbStorage_rocksDB_blockCacheSize 设置的足够大;当消息体量大,出现backlog 大量堆积时, 使用默认大小(256M)会出现读耗时过大情况,导致消费变慢。 使用多 partition,提高吞吐。 在系统出现异常时,主动抓取 stats 和 stats-internal,里面有很多有用数据。 如果业务中会出现单 Topic 体量过大的情况,建议把 backlogQuotaDefaultLimitGB 设置的足够大(默认10G), 避免因为默认使用 producer_request_hold 模式出现 block producer 的情况;当然可以根据实际业务选择合适的 backlogQuotaDefaultRetentionPolicy 。 根据实际业务场景主动选择 backlog quota。 prometheus 内如果发现读耗时为空情况,可能是因为直接读取了缓存数据;Pulsar 在读取消息时会先读取 write cache, 然后读取 read cache;如果都没有命中, 则会在 RocksDB 中读取条目位子后,再从日志文件中读取该条目。 写入消息时, Pulsar 会同步写入 journal 和 write cache;write cache 再异步写入日志文件和 RocksDB; 所以有资源的话,建议 journal 盘使用SSD。
六、总结
现在, 个推针对优先级中间件的改造方案已经在部分现网业务中试运行,对于 Pulsar 的稳定性,我们还在持续关注中。 作为一个2016 年才开源的项目,Pulsar 拥有非常多吸引人的特性,也弥补了其他竞品的短板,例如跨地域复制、多租户、扩展性、读写隔离等。尽管在业内使用尚不广泛, 但从现有的特性来说, Pulsar 表现出了取代 Kafka 的趋势。在使用 Pulsar 过程中,我们也遇到了一些问题, 在此特别感谢翟佳和郭斯杰(两位均为 Stream Native 的核心工程师、开源项目 Apache Pulsar 的 PMC 成员)给我们提供的支持和帮助。
参考文献:
[1] 比拼 Kafka, 大数据分析新秀Pulsar 到底好在哪( https://www.infoq.cn/article/1UaxFKWUhUKTY1t_5gPq )
[2] 开源实时数据处理系统Pulsar:一套搞定Kafka+Flink+DB( https://juejin.im/post/5af414365188256717765441 )
硬件开发
2019-04-15 10:14:04
「深度学习福利」大神带你进阶工程师,立即查看>>>
操作系统的发展过程 无操作系统的计算机系统 单道批处理系统(50年代,系统资源利用率低) 多道批处理系统(60年代) 分时系统(70年代) 实时系统(80年代)
单道批处理系统 过程:一批作业以脱机方式输入到磁带上,在 监督程序 的控制下连续处理。 特征
(1)自动性 无人工干预
(2)顺序性 按进入内存的先后顺序执行
(3)单道性 内存中只保存一道作业
单道批处理系统的系统资源利用率太低,为了解决这个问题,出现了多道批处理系统。
多道批处理系统 多道:内存中同时存放多个相互独立的程序 多道技术是共享的基础
多道批处理特征 多道性 内存中有多道程序,可以并发执行 无序性 完成时间与进入内存先后无关 调度性 作业从提交(提交指的是送到系统的外存)到完成经两次调度
(1)作业调度 内存->外存(选多个),选多个作业,分配处理机
(2)进程调度 分配处理机(选一个,处理机其实就是CPU)
计算机中最重要的两个资源就是 CPU 和 内存
多道批处理的优缺点 资源的利用率高(资源主要指的是内存,CPU,外存,文件等) 系统吞吐量大
吞吐量:单位时间内完成的总工作量
原因:
(1)资源忙
(2)完成或运行不下去时才切换 平均周转时间长 无交互能力 平均周转时间长
作业周转时间:
从业从进入系统(进入外存就叫进入系统了)开始到完成并退出系统经历的时间。通常几小时,甚至几天。 无交互能力
修改和调试极不方便
作业进行的过程中不能进行调试,人为干预。
分时操作系统
定义:
一台主机上连接了多个终端,同时允许多个用户通过自己的终端,以交互方式使用计算机,共享主机中的资源。 生产动力
(1)人机交互 (边运行,边调试)
(2)共享主机(设备昂贵)
(3)便于用户上机(在终端上输入,控制)
分时系统特征 多路性 即同时性,宏观上同时,微观上轮流 独立性 每个用户感觉自己独占主机 及时性 较短时间内响应(2-3秒) 交互性
实时系统 实时性 及时响应外部事件请求 应用需求 :
(1)实时控制:
工业生产、武器控制、飞机的自动驾驶
(2)实时信息处理
订票系统
操作系统的基本特征 并发性(最重要特征,其他三个特征均基于并发性) 共享性 虚拟性 异步性
并发性 并行性 多个事件在同一时刻发生 并发性 多个事件在同一时间间隔内发生
单处理机系统:宏观并发,微观串行
多处理机系统:可能有并行
两种资源共享方式 (1)互斥共享方式 对临界资源(一次只运行一个进程访问)的访问,如:
打印机等硬件;栈,变量,表格等软件。 (2)同时访问方式 多个进程同时访问的资源,如:磁盘,重入码写的文件。
操作系统两个最基本的特种: 并发 和 共享 。 虚拟:通过某种技术把一个物理实体变为若干个逻辑上的对应物。
如,虚拟存储器,虚拟内存等。目前虚拟技术都是通过分时来实现的。 异步性:进程以不可预知的速度向前推进。
操作系统的五大功能 资源管理
(1)处理机管理(硬件)
(2)存储器管理(硬件)
(3)设备管理(硬件)
(4)文件管理(软件) (5)用户接口
1)命令接口(联机用户接口,脱机用户接口)
2)程序接口
3)图形接口
联机用户接口 适用:几乎所有计算机的操作系统中 组成:命令+终端处理程序+命令解释程序 过程:
用户在键盘上输入 命令 ;
终端处理程序 接收命令并显示在屏幕上
命令解释程序 解释并执行该命令
联机命令举例: UNIX:login;longout DOS:copy;format
命令解释程序 :操作系统的最高层,如:
MS-DOS:COMMAND.COM(一种命令解释程序)
UNIX:shell.
脱机用户接口 适用:批处理系统。又称批处理用户接口 组成:JCL+作业说明书+命令解释程序 JCL:作业控制语言( job control language ) 过程:用户把对作业的控制用JCL写在 作业说明书 上, 命令解释程序 按照 作业说明书 解释并执行
程序接口 目的:为用户程序访问系统资源而设置 组成:一组系统调用 系统调用:一个系统调用是一个能完成特定功能的子程序。
操作系统的结构设计 操作系统的发展阶段
第一代:无结构OS
第二代:模块化OS结构
第三代:分层式OS结构
第四代:为内核OS结构(20世纪90年代)
前三代为传统OS结构
硬件开发
2019-01-30 12:44:00
「深度学习福利」大神带你进阶工程师,立即查看>>>
MicroPython成功将Python引入到嵌入式领域,近几年MicroPython的发展和普及也证明,Python无疑将在未来几年内快速抢占和蚕食C/C++的份额。包括现在比较火爆的机器人、无人机以及其他开源硬件诸如Arduino与RaspberryPi的项目正吸引到众多拥有Python技能背景的爱好者。
截止到目前,已经有不少嵌入式硬件成功移植了Micropython,如STM32F4、esp8266、PYBoard等。而目前在MicroPython嵌入式领域最全、最专业的当属TPYBoard的MicroPython系列,是MicroPython从入门到实战的不二之选。
所谓知易行难,这次给MicroPython及硬件爱好者带来一个超级大福利,一套完整的MicroPython最全资料大集锦,让你秒变MicroPython大神。
MicroPython教程之TPYBoard全系列例程文档包
MicroPython教程之TPYBoard全系列例程源码包
56篇例程文档
32个例程源码
如果你对MicroPython感兴趣或者正在学习MicroPython,请快来领取全套资料包,建议学生党,硬件新人、极客爱好者收藏,还有教程资料以供学习。
TPYBoard全系列教程资料包
56篇例程文档
32个例程源码
本次资料为最全MicroPython全套教程及源码
同时也会不断更新
强裂推荐给大家
免费下载方式:
1、关注“MicroPython玩家汇”V信公众号
2、回复:“教程”
2、点击下载链接即可获取免费教程资料包
硬件开发
2019-01-28 12:28:00
「深度学习福利」大神带你进阶工程师,立即查看>>>
1 Micropython技术是什么?
MicroPython极精简高效的实现了Python3语言。它包含Python标准库的一小部分,能在单片机和受限环境中运行。
1.1 MicroPython发展
由剑桥大学的理论物理学家乔治.达明设计,遵循MIT许可协议,与Arduino类似,拥有自己的解析器、编译器、虚拟机和类库等,MicroPython更强大。目前它支持基于32-bit的ARM处理器,比如STM32F405、STM32f407等,也就是说ARM处理器STM32F405上直接可运行Python语言,用Python语言来控制单片机。在单片机上能运行Python,实际上Python已经完全脱离系统,也就是说,你可以通过Python脚本语言开发单片机程序。
1.2 MicroPython支持的芯片
支持的mcu系列有:stm32f405、stm32f407,也支持esp8266,接下来会增强stm32f103和esp32的稳定性,芯片将会扩展到FPGA和A7。
1.3 MicroPython固件
固件就是写入EROM(可擦写只读存储器)或EEPROM(电可擦可编程只读存储器)中的程序。是指设备内部保存的设备“驱动程序”,通过固件,操作系统才能按照标准的设备驱动实现特定机器的运行动作,比如光驱、刻录机或手机等都有内部固件。
主要由以下构成:
py/--核心python实现,包括编译器、运行时和核心库。
mpy cross/--用于将脚本转换为预编译字节码的Micropyhon交叉编译器。
ports/unix/--在unix上运行的微星版本。
ports/stm32/--运行在Pyboard和类似的stm32板上的Micropyhon版本(使用st的cube-hal驱动程序)。
ports/minimal/--最小的Micropython端口。
tests/--测试框架和测试脚本。
docs/——sphinx格式的用户文档。呈现的HTML文档可在http://docs.tpyboard.com上找到。
其他组件
ports/bare-arm/--用于ARM MCU的最小MicroPython版本。主要用于控制代码大小。
ports/teensy/--运行在teensy 3.1上的MicroPython版本(初步但功能正常)。
ports/pic16bit/--16位pic微控制器的MicroPython版本。
ports/cc3200/--在TI的cc3200上运行的Micropython版本。
ports/esp8266/--运行在espressf的esp8266 soc上的MicroPython版本。
ports/esp32/--运行在espressf的esp32 soc上的MicroPython版本。
ports/nrf/--在nrf51和nrf52 mcu上运行的MicroPython版本。
extmod/--在C中实现的附加(非核心)模块。
tools/--各种工具
example/--几个Python脚本示例。
Micropython当前最新版本是1.94,TPYBoard增加了显示屏,红外等常用接口驱动程序,可以直接使用这些设备。
1.4 TPYBoard是什么?
TPYBoard是一块能裸机运行MicroPython的紧凑型电路板,提供了用于控制各种单片机接口的底层Python操作系统。它是萝卜设计一块支持MicroPython的开发板。
MicroPython包含了诸如交互式提示,任意精度整数,关闭,列表解析,生成器,异常处理等高级功能。适合运行在只有256k的代码空间和16k的RAM的芯片上。MicroPython旨在尽可能与普通Python兼容,让您轻松将代码从桌面传输到微控制器或嵌入式系统。
当前TPYBoard有
V10x—主要是基础的TPYBoard开发板。
V201—局域网通信,有LAN网口的TPYBoard开发板。
V202—wifi通信,支持wifi模块的TPYBoard开发板。
V702—远距离通信的,支持SIM卡的TPYBoard开发板。
2、MicroPython能干什么
既然MicroPython是用Python语言能来控制单片机,那么单片机能做什么基本能反映出它能做什么。还是让我们一起看一下单片机能干什么?
2.1 智能仪器
单片机具有体积小、功耗低、控制功能强、扩展灵活、微型化和使用方便等优点,广泛应用于仪器仪表中,结合不同类型的传感器,可实现诸如电压、电流、功率、频率、湿度、温度、流量、速度、厚度、角度、长度、硬度、元素、压力等物理量的测量。采用单片机控制使得仪器仪表数字化、智能化、微型化,且功能比起采用电子或数字电路更加强大。 例如精密的测量设备(电压表、功率计,示波器,各种分析仪)。
2.2 工业控制
单片机具有体积小、控制功能强、功耗低、环境适应能力强、扩展灵活和使用方便等优点,用单片机可以构成形式多样的控制系统、数据采集系统、通信系统、信号检测系统、无线感知系统、测控系统、机器人等应用控制系统。例如工厂流水线的智能化管理,电梯智能化控制、各种报警系统,与计算机联网构成二级控制系统等。在工业疏水阀检测已经的到了实质性推广应用。
2.3 家用电器
现在的家用电器广泛采用了单片机控制,从电饭煲、洗衣机、电冰箱、空调机、彩电、其他音响视频器材、再到电子秤量设备和白色家电等。
2.4 网络和通信
现代的单片机普遍具备通信接口,可以很方便地与计算机进行数据通信,为在计算机网络和通信设备间的应用提供了极好的物质条件,现在的通信设备基本上都实现了单片机智能控制,从手机,电话机、小型程控交换机、楼宇自动通信呼叫系统、列车无线通信、再到日常工作中随处可见的移动电话,集群移动通信,无线电对讲机等。
2.5 医用设备领域
单片机在医用设备中的用途亦相当广泛,例如医用呼吸机,各种分析仪,监护仪,超声诊断设备及病床呼叫系统等等。
2.6 模块化系统
某些专用单片机设计用于实现特定功能,从而在各种电路中进行模块化应用,而不要求使用人员了解其内部结构。如音乐集成单片机,看似简单的功能,微缩在纯电子芯片中(有别于磁带机的原理),就需要复杂的类似于计算机的原理。如:音乐信号以数字的形式存于存储器中(类似于ROM),由微控制器读出,转化为模拟音乐电信号(类似于声卡)。 在大型电路中,这种模块化应用极大地缩小了体积,简化了电路,降低了损坏、错误率,也方便于更换。
2.7 汽车电子
单片机在汽车电子中的应用非常广泛,例如汽车中的发动机控制器,基于CAN总线的汽车发动机智能电子控制器、GPS导航系统、abs防抱死系统、制动系统、胎压检测等。
2.8 其他
单片机在工商、金融、科研、教育、电力、通信、物流和国防航空航天等领域都有着十分广泛的用途。
3 MicroPython的应用
萝卜电子致力于MicroPython在国内的普及和推广,是专业的MicroPython培训和应用专家。萝卜电子除了TPYBoard开发板系列,在MicroPython的青少年编程领域以及工业应用领域都获得了实质性进展并取得了不俗成绩。
3.1 TMS无线疏水阀检控系统
TMS疏水阀检测系统将MicroPython成功应用到工业领域,是真正意义上的智能化疏水阀在线监测系统。系统利用压电振动检测,实现实时阀门泄漏的定量监测,准确判断系统中泄漏点和泄漏状态。TMS疏水阀无线监测系统能高效地监测和诊断蒸汽疏水阀的工作状况,以防止因泄漏造成能源损失去。
TMS无线疏水阀检控系统现已在蒙牛乳业, 青岛双星, 万达宝通, 飞鹤乳业, 遵义烟厂, 贵定烟厂等企业成功安装上线。

3.2 学科编程教育
萝卜教育学科式编程始终以“代码编程”教育为主要目标,从课程入门阶段便引导孩子脱离“积木式拖拽编程”思维模式,逐步形成“面向对象代码编程”思想。不仅教会孩子编程,更多的是不断地激发孩子的潜能,让孩子利用编程思维,创新、高效、全面地解决实际生活中的问题,增强孩子在人工智能时代的竞争能力。
萝卜教育专注于MicroPython的普及和推广,聚焦“新时代、新标准、新课程、新装备”致力于打造专业的MicroPython入门及应用培训。探究更适合中国孩子的编程教学方法,培养孩子学科应用能力的同时,全面提升综合素质,塑造真正能够驾驭未来的中国学生。
硬件开发
2019-01-19 09:35:00
「深度学习福利」大神带你进阶工程师,立即查看>>>
NanoPi NEO root@NanoPi-NEO:/xsz/led# cat ledon.sh echo 0 > /sys/class/leds/nanopi\:green\:pwr/brightness echo 1 > /sys/class/leds/nanopi\:green\:pwr/brightness echo 0 > /sys/class/leds/nanopi\:blue\:status/brightness echo 1 > /sys/class/leds/nanopi\:blue\:status/brightness root@NanoPi-NEO:/xsz/led# root@NanoPi-NEO:/xsz/led# cat ledoff.sh echo 0 > /sys/class/leds/nanopi\:green\:pwr/brightness #echo 1 > /sys/class/leds/nanopi\:green\:pwr/brightness echo 0 > /sys/class/leds/nanopi\:blue\:status/brightness #echo 1 > /sys/class/leds/nanopi\:blue\:status/brightness
CubieTruck ⚡ root@cubietruck ⮀ /xsz/xsz ⮀cat turnOffAllLed.sh #! /bin/bash # turn off 4 LED: blue , orange, green, white echo 0 > /sys/class/leds/orange\:ph20\:led2/brightness echo 0 > /sys/class/leds/blue\:ph21\:led1/brightness echo 0 > /sys/class/leds/green\:ph07\:led4/brightness echo 0 > /sys/class/leds/white\:ph11\:led3/brightness ⚡ root@cubietruck ⮀ /xsz/xsz ⮀ ./turnOnAllLed.sh ⚡ root@cubietruck ⮀ /xsz/xsz ⮀ cat turnOnAllLed.sh #! /bin/bash # turn off 4 LED: blue , orange, green, white echo 1 > /sys/class/leds/orange\:ph20\:led2/brightness echo 1 > /sys/class/leds/blue\:ph21\:led1/brightness echo 1 > /sys/class/leds/green\:ph07\:led4/brightness echo 1 > /sys/class/leds/white\:ph11\:led3/brightness
硬件开发
2019-01-15 22:15:00
「深度学习福利」大神带你进阶工程师,立即查看>>>
SI指Signal Integrity 即 信号完整性
PI指Power Integrity 即 电源完整性
EMC指Electromagnetic Compatibility 即 电磁兼容性
RF指Radio Frequency 即射频
NF指Noise Figure 即 噪声系数
VNA指Vector Network Analyzer 即矢量网络分析仪
DUT指device under test,即被测设备。
反射系数(Г): 反射电压/入射电压, 为标量(没有单位)。
电压驻波比(VSWR,Voltage Standing Wave Ration): 波腹电压/波节电压。
S参数:
S11为输入反射系数,也就是输入回波损耗。
S12为反向传输系数,也就是隔离。
S21为正向传输系数,也就是增益。
S22为输出反射系数,也就是输出回波损耗(Return Loss)。
硬件开发
2019-01-13 15:35:00
「深度学习福利」大神带你进阶工程师,立即查看>>>
PouchContainer 开源版本及内部版本一致性实践
为什么要做内外版本一致
对外开源是提升影响力、共建生态的有力手段。在项目对外开源的过程中,首先是将可以开源的部分抽离出来,发布一个“开源版本”,与内部基础设施相关的部分则留在内部版本中。在后续的开发中,开源版本随着社区不断演进,内部版本则随着内部的需求不断迭代。如果没有明确定义内外部版本的边界、代码同步不完全、不及时,将会导致内外版本越走越远,变成两个不相干的项目。
促使我们开始做内外版本一致事情的,主要是以下三点考虑: __降低维护成本: __这也是同步工作的出发点。减少多版本维护的工作负担,也方便团队的交流。 __发挥社区的优势: __吸收社区力量是开源的一个重要考虑,让社区的力量真正在内部发挥价值。社区会有一些我们没有考虑到的需求,有集结社区力量的更严格的 review,与 github 集成的强约束 CI 等。 __降低功能同步的风险: __在内外部版本不同源的情况下,将外部代码合并进来非常容易冲突。代码模块较多,解决冲突的过程中,一不小心就会引入非预期的修改,而这在合并的过程中,很难发现。
本文将详细说明 PouchContainer 是如何做到内外部版本一致的。
差异梳理及边界定义
PouchContainer 开源已经将近一年了,在内外部版本差异梳理之前,没有人能讲清楚两个版本之间的差异。于是我用 Beyond Compare4 等软件,进行文件级别的比对,一个个找出内外部不同的代码,进而梳理出内外部功能级别的差异。所幸内外部的差异比我想象中的要小。主要有以下几类差异: 对内部老系统的接口兼容 为内部系统开的后门接口 对接内部基础设施的逻辑,如存储,网络 bugfix, feature 没有互相同步
前三类差异是集团内针对 PouchContainer 的定制化内容。当然,有一些是目前迫不得已加上的临时逻辑。在后续的发展中,将会改造、下线。第四类的差异,主要原因在于开发者没有版本同步的意识:bugfix 在内部紧急修复之后,没有同步到社区。社区开发者的 bugfix, feature 没有及时同步进内部代码。
在差异梳理出来之后,需要明确内外部的功能边界。能开源的就开源,独有的功能继续保留。抹平非功能性的不一致。
一致性改造
__版本同步的根本还是提升软件的可拓展性__,允许共用一套核心代码,针对不同的业务场景进行定制。所以我们面对的问题不仅是内外部版本的一致问题,应该是三版本、四版本、多版本的一致问题。这也是 PouchContainer 赋能其他业务场景的基础。同样也是开源项目内部使用的必修课 所以,我们做的第二步是通过__插件机制__提升 PouchContainer 的可拓展性。目前我们支持 API, container, daemon, volume,cri 这五种插件。具体见 文档 。
插件的设计旨在提升软件的扩展性,但不允许插件改变原有的工作流程。PouchContainer 提供了对 container, daemon, volume, cri 关键步骤的 hook。以 daemon 插件为例,该插件提供了对启停接口的 hook。插件实现者可以在 daemon 启动前运行一些其他程序,比如 dfget。在 daemon 停止前,做一些清理操作。 // DaemonPlugin defines places where a plugin will be triggered in pouchd lifecycle type DaemonPlugin interface { // PreStartHook is invoked by pouch daemon before real start, in this hook user could start dfget proxy or other // standalone process plugins PreStartHook() error // PreStopHook is invoked by pouch daemon before daemon process exit, not a promise if daemon is killed, in this // hook user could stop the process or plugin started by PreStartHook PreStopHook() error }
而 API 插件通过将路由表传给插件,允许插件实现者扩展、删除、修改 API。这让接口有了很大的灵活性。 import "github.com/alibaba/pouch/apis/server/types" // APIPlugin provide the ability to extend PouchContainer HTTP API and change how handler behave. type APIPlugin interface { // The default handler of each API would be passed in while starting HTTP server. // UpdateHandler could register extra HTTP API to PouchContainer server, // change the behavior of the default handler. UpdateHandler([]*types.HandlerSpec) []*types.HandlerSpec }
通过插件化的改造,绝大部分的内部 PouchContainer 定制化逻辑都在插件中实现了。插件单独一个文件目录,在代码合入的时候几乎不会产生冲突。之后将内部插件逻辑和其他差异一个个 commit 到开源分支上。__做到内外部版本的同源。__
稳定性保障
PouchContainer 开源版本代表通用功能,如果外部开发者在通用版本上迭代的新增功能,集团内部用不到,该如何保障外部功能同步到内部之后,不影响内部的现有功能的?
首先内部版本是有一套完整的测试覆盖的,__内部测试在开源测试的基础上还包含针对内部场景的测试__。内部测试通过,我们便认为该版本是符合内部场景要求的,开源版本没有影响内部稳定性的。如果测试不通过,有两个选择,一是重新评估开源通用功能,是否有代码缺陷;二是在内部仓库打补丁。以此来保障开源代码同步至内部后的稳定性。
建立新的秩序
我们先来看看,在这之前的工作流是怎样的。开发者分别在内部仓库和开源仓库提代码,紧急一些的需求会先在内部仓库提 merge request,不那么重要的需求会先在社区提 PR。有人会定期将开源分支 merge 进内部仓库。这里有几个问题,一是内部也有一套测试流程,这套流程可能不像 travisCI 或 circleCI 对接 github 那么方便,有些设计好的测试在内部仓库甚至不会跑。二是没有插件化前,某些功能在内外部有两种不同的实现,这在每次手动 merge 代码的时候几乎都会冲突,解决冲突的过程很容易引入非预期的修改,下次又继续冲突。


git flow 如图

在完成一致性改造之后,我们建立一套规则来保证后续不会再出现版本分离的事情。 原则上非私有增强,应该先在社区提交 PR,merge 之后通过同步机制进入内部版本 如果时间紧急,bugfix 先在内部版本上提交。后续 commiter 负责将其 cherry-pick 到社区。社区 review 发现需要继续修改的,将修改另提一个 commit,这样保证 commit 不与内部仓库冲突 代码同步,由机器人定时提交 merge request 将开源同步至内部
在 merge 的时候,保证是 fast-forward 的,这样内外部的 commit 是一一对应的,减少冲突。
总结
开源,能帮助项目吸收外部养分,加速项目的演进。在一致性的改造过程中,帮助开发者明确内外部版本的边界,打造同一份核心代码,提升核心代码的可定制化能力,更好地服务于不同的场景。
原文链接
硬件开发
2019-01-10 17:52:00
「深度学习福利」大神带你进阶工程师,立即查看>>>
MicroPython极精简高效的实现了Python3语言,包含Python标准库的一小部分,在单片机和受限环境中运行。
1.1、MicroPython发展
由剑桥大学的理论物理学家乔治?达明设计,遵循MIT许可协议,与Arduino类似,拥有自己的解析器、编译器、 虚拟机和类库等,MicroPython更强大。目前它支持基于32-bit的ARM处理器,比如STM32F405、STM32f407等,也就是说ARM处理器STM32F405上直接可运行Python语言,用Python语言来控制单片机。在单片机上能运行Python,实际上Python已经完全脱离系统,也就是说,你可以通过Python脚本语言开发单片机程序。
1.2、MicroPython支持的芯片
支持的mcu系列有:stm32f405、stm32f407,也支持esp8266,接下来会增强stm32f103和esp32的稳定性,芯片将会扩展到FPGA和A7。
1.3、MicroPython固件
固件就是写入EROM(可擦写只读存储器)或EEPROM(电可擦可编程只读存储器)中的程序。是指设备内部保存的设备“驱动程序”,通过固件,操作系统才能按照标准的设备驱动实现特定机器的运行动作,比如光驱、刻录机或手机等都有内部固件。
主要由以下构成:
py/--核心python实现,包括编译器、运行时和核心库。
mpy cross/--用于将脚本转换为预编译字节码的Micropyhon交叉编译器。
ports/unix/--在unix上运行的微星版本。
ports/stm32/--运行在Pyboard和类似的stm32板上的Micropyhon版本(使用st的cube-hal驱动程序)。
ports/minimal/--最小的Micropython端口。
tests/--测试框架和测试脚本。
docs/——sphinx格式的用户文档。呈现的HTML文档可在http://docs.tpyboard.com上找到。
其他组件
ports/bare-arm/--用于ARM MCU的最小MicroPython版本。主要用于控制代码大小。
ports/teensy/--运行在teensy 3.1上的MicroPython版本(初步但功能正常)。
ports/pic16bit/--16位pic微控制器的MicroPython版本。
ports/cc3200/--在TI的cc3200上运行的Micropython版本。
ports/esp8266/--运行在espressf的esp8266 soc上的MicroPython版本。
ports/esp32/--运行在espressf的esp32 soc上的MicroPython版本。
ports/nrf/--在nrf51和nrf52 mcu上运行的MicroPython版本。
extmod/--在C中实现的附加(非核心)模块。
tools/--各种工具
example/--几个Python脚本示例。
Micropython当前最新版本是1.94,TPYBoard增加了显示屏,红外等常用接口驱动程序,可以直接使用这些设备。
1.4、TPYBoard是什么?
TPYBoard是一块能裸机运行MicroPython的紧凑型电路板,提供了用于控制各种单片机接口的底层Python操作系统。是萝卜设计支持Micropython的开发板,国内第一块有自主实用新型专利和商标,可运行MicroPython单片机。
MicroPython包含了诸如交互式提示,任意精度整数,关闭,列表解析,生成器,异常处理等高级功能。适合运行在只有256k的代码空间和16k的RAM的芯片上。MicroPython旨在尽可能与普通Python兼容,让您轻松将代码从桌面传输到微控制器或嵌入式系统。
当前TPYBoard有
V10x—主要是基础的TPYBoard开发板。
V201—局域网通信,有LAN网口的TPYBoard开发板。
V202—wifi通信,支持wifi模块的TPYBoard开发板。
V702—远距离通信的,支持SIM卡的TPYBoard开发板。
2、MicroPython能干什么
既然MicroPython是用Python语言能来控制单片机,那么单片机能做什么基本能反映出它能做什么。还是让我们一起看一下单片机能干什么?
目前单片机渗透到我们生活的各个领域,几乎很难找到哪个领域没有单片机的踪迹。导弹的导航装置,飞机上各种仪表的控制,计算机的网络通讯与数据传输,工业自动化过程的实时控制和数据处理,广泛使用的各种智能IC卡,民用豪华轿车的安全保障系统,录像机、摄像机、全自动洗衣机的控制,以及程控玩具、电子宠物等等,这些都离不开单片机。更不用说自动控制领域的机器人、智能仪表、医疗器械以及各种智能机械了。因此,单片机的学习、开发与应用将造就一批计算机应用与智能化控制的科学家、工程师。单片机广泛应用于仪器仪表、家用电器、医用设备、航空航天、专用设备的智能化管理及过程控制等领域,大致可分如下几个范畴:
2.1、智能仪器
单片机具有体积小、功耗低、控制功能强、扩展灵活、微型化和使用方便等优点,广泛应用于仪器仪表中,结合不同类型的传感器,可实现诸如电压、电流、功率、频率、湿度、温度、流量、速度、厚度、角度、长度、硬度、元素、压力等物理量的测量。采用单片机控制使得仪器仪表数字化、智能化、微型化,且功能比起采用电子或数字电路更加强大。 例如精密的测量设备(电压表、功率计,示波器,各种分析仪)。
2.2、工业控制
单片机具有体积小、控制功能强、功耗低、环境适应能力强、扩展灵活和使用方便等优点,用单片机可以构成形式多样的控制系统、数据采集系统、通信系统、信号检测系统、无线感知系统、测控系统、机器人等应用控制系统。例如工厂流水线的智能化管理,电梯智能化控制、各种报警系统,与计算机联网构成二级控制系统等。在工业疏水阀检测已经的到了实质性推广应用。
2.3、家用电器
现在的家用电器广泛采用了单片机控制,从电饭煲、洗衣机、电冰箱、空调机、彩电、其他音响视频器材、再到电子秤量设备和白色家电等。
2.4、网络和通信
现代的单片机普遍具备通信接口,可以很方便地与计算机进行数据通信,为在计算机网络和通信设备间的应用提供了极好的物质条件,现在的通信设备基本上都实现了单片机智能控制,从手机,电话机、小型程控交换机、楼宇自动通信呼叫系统、列车无线通信、再到日常工作中随处可见的移动电话,集群移动通信,无线电对讲机等。
2.5、医用设备领域
单片机在医用设备中的用途亦相当广泛,例如医用呼吸机,各种分析仪,监护仪,超声诊断设备及病床呼叫系统等等。
2.6、模块化系统
某些专用单片机设计用于实现特定功能,从而在各种电路中进行模块化应用,而不要求使用人员了解其内部结构。如音乐集成单片机,看似简单的功能,微缩在纯电子芯片中(有别于磁带机的原理),就需要复杂的类似于计算机的原理。如:音乐信号以数字的形式存于存储器中(类似于ROM),由微控制器读出,转化为模拟音乐电信号(类似于声卡)。 在大型电路中,这种模块化应用极大地缩小了体积,简化了电路,降低了损坏、错误率,也方便于更换。
2.7、汽车电子
单片机在汽车电子中的应用非常广泛,例如汽车中的发动机控制器,基于CAN总线的汽车发动机智能电子控制器、GPS导航系统、abs防抱死系统、制动系统、胎压检测等。
2.8、其他
单片机在工商、金融、科研、教育、电力、通信、物流和国防航空航天等领域都有着十分广泛的用途。
在教育方面利用Python语言特性在青少年编程教育也得到了实质性推广应用。
硬件开发
2019-01-09 14:34:00
「深度学习福利」大神带你进阶工程师,立即查看>>>
为什么青少年编程突然间火了?背后有什么“阴谋”吗?
青少年编程真的有那么好吗?还是英美放的烟雾弹?又或者只是一种新的噱头?
青少年编程到底要不要跟风学?
今天,我们就来聊一聊“青少年编程”。
学编程,绝不仅仅是为了成为程序员!
愈刮愈烈的青少年编程风触动了很多家长的神经,可很多家长对于编程的认知都很模糊,对于孩子为什么要学习编程也没有清楚的认识,大部分家长都有这样的疑问:
考试不考,为什么要学
不想孩子做码农,为什么要学
对于有上述疑问的家长,你真的是out了!人工智能时代,编程早已不再是枯燥的代码、冷冰冰的电脑。所谓“编程思维”并不是编写程序的技巧,而是一种高效解决问题的思维方式,不当程序员也用得上。可以说编程思维=赢家思维,从学到玩都能用上!
那么,编程,为什么要学! 学编程,升学加分有有优势
编程已经进入小学教材,还被列入全国计算机等级考试!
编程已经列入高考内容之一!
编程在升学中的比重逐渐加大,已经成为高考加分的一大利器! 学编程,孩子思考更高效
每一行代码,每一个程序都能经过缜密思考产生
会编程,将大大提升孩子的逻辑思维和数学思维 学编程,还能贯穿语数外
用编程编写的小程序、制作的小物件以及小创作都是语文、数学、物理、英文等综合学
科的产物。
编程,该从哪学起?
聪明的家长,总能在时代变化时
为孩子做出正确的选择
那么,编程该从哪学起呢?

1、学科式编程引领青少年编程新风尚

所谓学科式编程是把计算机语言作为一种辅助工具,在学习编程的过程中融入数学、
英语、物理、几何、科学、语文等综合学科的知识,大大提升学习性价比,进而提升综合能力。为青少年升学考试、参加信奥竞赛、高考加分等打下坚实的基础。
所以学科式编程一定是家长孩子的编程启蒙首选。
萝卜教育:立足青少年学科式编程,给孩子一个新的思考方式

作为国内青少年编程领域的先行者,萝卜教育始终本着以学科式编程为出发点、以编程为途径、以提升孩子综合学科能力为目标的理念。引导孩子从积木块状思维向代码逻辑思维转变。脱离积木式编程思维,建立青少年逻辑编程思维,全面提升综合能力。

萝卜教育学科式编程特色
从积木式编程向代码编程过渡

萝卜教育学科式编程始终以“代码编程”教育为主要目标,从课程入门阶段便引导孩子脱离“积木式拖拽编程”思维模式,逐步形成“面向对象代码编程”思想。
萝卜学科编程不仅教会孩子编程,更多的是不断地激发孩子的潜能,让孩子利用编程思维,创新、高效、全面地解决实际生活中的问题,增强孩子在人工智能时代的竞争能力。

编程融入学科知识

萝卜学科编程在编程学习中融入数学、逻辑、几何、物理、甚至语文、科学等其它知
识,全面提升学科成绩和综合能力,为孩子高考加分、走向社会等打下坚实的基础。


3、大品牌,课程优质,青少年学科式编程首选

萝卜教育作为国内青少年编程教育的先行者,不仅率先提出了学科式编程的理念,并创造性的推出了国内首款拖拽编程到代码编程同时进行的编辑器--PythonEdiotr。首创硬件与软件结合的物联网教学模式。丰富的教研教学、师资运营培训经验,确保为孩子提供优质靠谱的青少年编程课程。

课程体系


萝卜学科编程共分为5个级别,包括入门一级、入门二级、小成、Python编程以及C++竞赛编程。咱们本次一起看一下入门二级的第二课。孩子学完后,还可以按照体系继续学习进阶课程。




在萝卜孩子们能收获什么?


孩子童年的时间是有限的,
聪明的家长,总能在时代变化时
为孩子做出正确的选择
让孩子与时代一同前行
真正掌握人生的主动权。

现在我们能做的就是帮他们推开编程这扇大门
让他们看到未来世界的神奇与魅力
萝卜学科编程则是这扇大门的钥匙
硬件开发
2019-01-08 10:53:00
「深度学习福利」大神带你进阶工程师,立即查看>>>
1、加速度传感器的使用
开发板上有一个能够检测角度和运动状态的加速度传感器(小封装小模块?)。X ,Y, Z 轴上各有不同的传感器。通过创建一个 pyb.Accel( ) 对象和调用 x( ) 方法可以获取加速度传感器的数值。萝卜教育tpyboard。com
>>> accel = pyb.Accel()
>>> accel.x()

上述例子返回-30 到 30 之间的带符号的角度值。注意其测量结果不算精准,着意味着即使保持 tpyboard 的完全静止不动依旧会有测量数据出现。因此,x( ) 方法得到的数据不能当成精确值使用,而应视其为一定精度的范围值。萝卜教育tpyboard。com
倾斜开发板,通过加速度传感器点亮 LED 灯的 代码如下所示: accel = pyb.Accel() light = pyb.LED(3) SENSITIVITY = 3 while True: x = accel.x() if abs(x) > SENSITIVITY: light.on() else: light.off()
上述代码中我们创建了 Accel 和 LED 两个对象,然后直接获得加速度传感器在 X 方向上的数值。如果 x 值的大小比定值 SENSITIVITY 大,LED 灯将被点亮,否则将被熄灭。循环中调用了 pyb.delay( ) 函数,否额当 x 的值接近 SENSITIVITY 时LED灯将闪烁得十分频繁。尝试在 tpyboard 开发板上运行该程序,直到左右倾斜开发板使 LED 灯亮或灭。萝卜教育tpyboard。com
练习:改变上述脚本使得倾斜的角度越大蓝色的LED灯更加亮。
提示: 你需要重新调整数值,其大小在 0 到 255 之间
2、制作水平仪
上述例程仅只使用了 x 方向上的角度值,然而我们可以通过 y( ) 函数的值和更多的LED灯将 tpyboard 开发板打造成一个水平仪。 xlights = (pyb.LED(2), pyb.LED(3)) ylights = (pyb.LED(1), pyb.LED(4)) accel = pyb.Accel() SENSITIVITY = 3 while True: x = accel.x() if x > SENSITIVITY: xlights[0].on() xlights[1].off() elif x < -SENSITIVITY: xlights[1].on() xlights[0].off() else: xlights[0].off() xlights[1].off() y = accel.y() if y > SENSITIVITY: ylights[0].on() ylights[1].off() elif y < -SENSITIVITY: ylights[1].on() ylights[0].off() else: ylights[0].off() ylights[1].off() pyb.delay(100)
一开始我们创建了 一个包含 x 和 y 方向上的 LED 对象的元组。python 语言中元组是不可更改的对象,即意味着一旦创建后就不能被改变。然后我们像上个例程开始的那样,但当 x 的值为正或为负时分别点亮不同的 LED 灯。y 方向上也是同样的原理。这看起来不算很牛 B 但确实实现了水平仪的功能。在你的 tpyboard 板上运行这个程序,现象为向不同方向倾斜开发板点亮不同的 LED 灯。萝卜教育tpyboard。com
硬件开发
2019-01-07 14:46:00
「深度学习福利」大神带你进阶工程师,立即查看>>>
秋冬季节,雾霾天气的持续,让人们对空气质量的关注程度提升。而近期人们对于空气质量的关注总也绕不开一个词——“PM2.5”。《环境空气质量标准》将PM2.5、臭氧(8小时浓度)纳入常规空气质量评价,是我国首次制定关于PM2.5的监测标准。细颗粒物又称细粒、细颗粒、PM2.5.细颗粒物指环境空气中空气动力学当量直径小于等于 2.5 微米的颗粒物。PM2.5粒径小、面积大、活性强、易附带有毒、有害物质(例如,重金属、微生物等)。PM2.5对人体健康有着致命的危害。萝卜教育学科式编程tpyboard。com
那么PM2.5(细颗粒物)是什么?
因为各国标准不一样,天气预报也报空气质量,预报的空气质量与实际的空气质量一样吗?但这个问题,想动手制作一个PM2.5检测仪,有了自己动手制作的PM2.5检测仪的话,当空气质量较差或者严重污染的时候,提醒家人,同学和身边的人尽量减少户外活动,真正减少吸入细颗粒物。
制作一个PM2.5检测仪的想法是好,在1个小时内能否制作出一个PM2.5检测仪呢?利用C/C++是贴近硬件的语言来做的话,要花好长一段时间甚至半年先学习C语言以后,再考虑动手制作,更不用说1个小时内制作出一个PM2.5检测仪。
接下来我介绍一个在1个小时内制作一个PM2.5的方法,也就是利用拥有自家的解析器、编译器、虚拟机和类库等,也就是具备二次开发和环境的TPYBoard开发板制作一个PM2.5检测仪吧。萝卜教育学科式编程tpyboard。com
1. PM2.5检测仪的目的
采用TPYBoard开发板为控制处理器,通过串口由PM2.5灰尘传感器GP2Y1010AU0F检测低程度的空气污染PM2.5能够甄别香烟和室内/室外灰尘,并通过SPI接口由LCD5110显示屏显示当前空气粉尘浓度(ug/m?)。当空气中粉尘浓度达到所设定限度点亮不同的LED灯来知道当前空气质量等级。
本系统电路简单、工作稳定、集成度高,调试方便,测试精度高,具有一定的实用价值。该检测仪通过Python脚本语言实现硬件底层的访问和控制细颗粒物检测传感器,每间隔一定时间,传感器自动进行检测,检测到的空气粉尘浓度数据通过串口上传至主控板,主控板收集到数据后,同样使用Python脚本语言将PM2.5的检测结果显示到LCD5110上。萝卜教育学科式编程tpyboard。com
参照1:TPYBoardLED亮灯状态与 PM2.5日均浓度对应的指数等级对应表:
参照2: TPYBoard的硬件特点:
————————————————————————————
üSTM32F405RG MCU.
ü168 MHz Cortex-M4 CPU with 32-bit hardware floating point.
ü1 MiB flash storage, 192 KiB RAM.
üUSB口, 支持 串口,通用存储,HID协议。
üSD卡插槽。
üMMA76603轴加速度计.
ü4 LEDs, 1复位按钮, 1通用按钮.
ü3.3V0.3A板载 LDO , 可从USB口或者外置电池供电。
ü实时时钟。
ü30个通用IO口,其中28个支持5V输入输出。
ü2个 SPI接口, 2个 CAN接口, 2个I2C接口, 5个USART接口.
ü14个 12-bit ADC引脚。
ü2个DAC 引脚。
————————————————————————————
2. 材料准备
制作PM2.5检测仪所需材料如下:
1.PM2.5粉尘传感器1个,检测PM2.5(细颗粒物)传感器,TXD串口输出。
2.TPYBoard开发板1块,主要用来当主控开发板,读入传感器数据。
3.Lcd5110显示屏1个,主要用来显示检测的信息。
4.杜邦线若干。
5.数据线一条。
3.硬件接线方法
3.1 传感器的针脚
传感器上一共六根线,从1到6依次是GND,VCC,NC,NC,RX,TX。其中我们只用三根线,电源(GND,VCC)和串口(TX),传感器与TPYBorad接线参照图1,具体用哪个串口请参照官方网站上文档TPYBoard 关于串口的使用,小编用的串口为 UART(2) is on: (TX, RX) = (X3, X4) = (PA2, PA3),因为只需要将数据传到PTYBoard,所以只用到RED即PTYBoard的X4引脚。萝卜教育学科式编程tpyboard。com
3.2 LCD5110的针脚
先看一下LCD5110针脚含义吧(注意:LCD5110的针脚有些不一样的
TPYBoard的针脚与5110的针脚对应关系如图2:
TPYBoard?????? LCD5110??? memo
————————————————————————————
# any ? Pin???? => RST?????? Reset pin (0=reset, 1=normal)
# any ? Pin???? => CE??????? Chip Enable (0=listen for input, ? 1=ignore input)
# any ? Pin???? => DC??????? Data/Command (0=commands, 1=data)
# MOSI? ??????=> DIN?????? data flow (Master out, Slave in)
# SCK????????=> CLK?????? SPI clock
# 3V3 or any Pin ? => VCC?????? 3.3V logic voltage (0=off, 1=on)
# any Pin????? => LIGHT???? Light (0=on, 1=off)
# GND????????=> GND
还是看不明白的话,直接上针脚编号吧
TPYBoard?????? LCD5110??? memo
————————————————————————————
Y10??????? => RST?????? Reset pin (0=reset, 1=normal)
Y11??????? => CE??????? Chip Enable (0=listen for input, 1=ignore input)
Y9 ???????? => DC??????? Data/Command (0=commands, 1=data)
X8??????? ? => DIN?????? data flow (Master out, Slave in)
X6 ???????? => CLK?????? SPI clock
VCC
Y12??????? => LIGHT???? Light (0=on, 1=off)
GND
3.3 PM2.5检测仪整体接线方法
按照图1、图2所示将PM2.5粉尘传感器以及5110显示屏与PTYBoard连接起来,硬件连接完毕,如图3:
4.PM2.5粉尘传感器工作原理及数据处理
4.1 PM2.5粉尘传感器工作原理
PM2.5粉尘传感器的工作原理是根据光的散射原理来开发的,微粒和分子在光的照射下会产生光的散射现象,与此同时,还吸收部分照射光的能量。萝卜教育学科式编程tpyboard。com
当一束平行单色光入射到被测颗粒场时,会受到颗粒周围散射和吸收的影响,光强将被衰减。如此一来便可求得入射光通过待测浓度场的相对衰减率。而相对衰减率的大小基本上能线性反应待测场灰尘的相对浓度。光强的大小和经光电转换的电信号强弱成正比,通过测得电信号就可以求得相对衰减率,进而就可以测定待测场里灰尘的浓度。在传感器的中间有一个洞,这个洞可以让空气在里面流通。在洞的两个边缘 ,一面安装有一个激光发射qi,另一面安装有激光接收器。这样一来,空气流过这个小洞,空气里的颗粒物呢就会挡住激光,从而产生散射,另一面的接收器,是依据接收到的激光强度来发出不同的信号的(其实就是输出不同的电压值)。这样一来,空气里的颗粒物越多,输出的电压越高,颗粒物越少,输出的电压越低。萝卜教育学科式编程tpyboard。com
内部结构如图内部结构仿真图所示:
4.2 PM2.5粉尘传感器传感器数据处理
上面说了传感器的原理,接下来就说说它传出来的信号和对于接收到的信号的计算吧。
这个传感器的输出数据是靠串口进行传输的,传感器会通过串口每10ms不到(一般3~4ms)发送一个数据,数据的类型大致是个“0X00”这样的16进制的数据。每次的数据会以“0XAA”作为起始端,以“0XFF”作为结束端。共7个数据位,7个数据位中包含了起始位,结束位,数据高位,数据低位,数据高校验位,数据低校验位和校验位(校验位是怎样计算出来的,下面会讲到)。数据格式大致如下:
其中校验位长度=Vout(H)+Vout(L)+Vref(H)+Vref(L)的长度。
数据的组成一共是有7个数据位,但是只有Vout(H)和Vout(L)这两个数据才是我们真正所需要的。我们需要依照这两个数据算出来串口输出的数字数据,从而通过数模转换公式来计算出输出的电压。进一步的通过比例系数计算出空气中颗粒物的数量。下面来说一下怎么计算。
传感器输出的数据分为高位和低位,其中呢Vout(H)为高位,Vout(L)为低位。因为串口传进来的Vout(H)和Vout(L)是16进制的,第一步先转化成10进制的(这个大家都会,不多说了)。然后根据这两个输出值的10进制数计算出串口输出数值的电压。
公式如下(其中Vout(H)和Vout(L)是已转化为10进制的):
Vout=(Vout(H)*256+Vout(L))/1024*5
这样就算出来了他输出出来的电压了,再根据比例系数A,就可以计算出空气中的颗粒物的值了。(A的值一般是在800到1000,具体的数值还要根据你买到的传感器的精度,准确度和误差值进行确定。我现在用的是800。)
5.PM2.5粉尘传感器的采样频率及程序编码
5.1PM2.5粉尘传感器的采样频率
PM2.5粉尘传感器的采样频率是非常高的,一般3~4ms发送一个16进制的采样数据,也就是说传感器通电(接通VCC和GND)后,每隔3~4ms发送一个16进制的采样数据,这么高的采样频率作为一个检测仪来说显然是没有必要的。
TPYBoard通过串口接收粉尘传感器数据,使用串口当然先定义串口,通过打开就可以接收串口数据,关闭串口就停止接收数据的特点,来自由控制PM2.5粉尘传感器的采样频率。萝卜教育学科式编程tpyboard。com
5.2程序编码
我们main.py中,采用首先定义串口,其次是打开串口接收采样数据,最后关闭串口,并且处理采样数据及显示,依次循环。
6.运行测试
接线ok后,导入font.py文件和upcd8544.py文件(主要用于5110显示数据),再运行main.py即可看到当前的空气质量等级以及PM2.5的浓度值了。
7.源代码
把我写的程序的源码分享给大家,有需要的可以参考一下。
#main.py import pyb import upcd8544 from machine import SPI,Pin from pyb import UART from ubinascii import hexlify from ubinascii import * #M0 = Pin('X1', Pin.OUT_PP) i=0 K=1 T=0 E=0 F=0 W=0 P=0 L=0 SHUCHU=0 A=800#A比例系数,在北方一般使用800-1000.南方空气好一些,一般使用600-800.这个还和你使用的传感器灵敏度有关的,需要自己测试再定下来。 G=1024/5#G为固定系数,是为了把串口收到的数据转换成PM标准值。 SHI=0#后面会赋值转换成十进制的数值。 #*******************************主程序********************************** #pyb.delay(5000) SPI = pyb.SPI(1) #DIN=>X8-MOSI/CLK=>X6-SCK #DIN =>SPI(1).MOSI 'X8' data flow (Master out, Slave in) #CLK =>SPI(1).SCK 'X6' SPI clock RST = pyb.Pin('Y10') CE = pyb.Pin('Y11') DC = pyb.Pin('Y9') LIGHT = pyb.Pin('Y12') while True: u2 = UART(2, 2400) pyb.delay(1000) #print('kaishi ') u2.deinit() pyb.delay(10) if(u2.any()>0): W=1 _dataRead=u2.readall() #print('_dataRead=',_dataRead) R=0 while (W>0): #print('截取开始') T=_dataRead[R] if(T==170): E=R+1 F=R+2 #R=_dataRead[65] #print('十位=',_dataRead[E]) #print('个位=',_dataRead[F]) W=0 R=R+1 P=_dataRead[E] L=_dataRead[F] SHI=P*256+L#把串口收到的十六进制数据转换成十进制。 SHUCHU=SHI/G*A if(SHUCHU<35): Quality = 'Excellente' print('环境质量:优','PM2.5=',SHUCHU) pyb.LED(1).off() pyb.LED(2).on() pyb.LED(3).off() pyb.LED(4).off() elif(35
硬件开发
2019-01-04 09:07:00
「深度学习福利」大神带你进阶工程师,立即查看>>>
1.引言
USB-HID是Human Interface Device的缩写,属于人机交互操作的设备,如USB鼠标,USB键盘,USB游戏操纵杆,USB触摸板,USB轨迹球、电话拨号设备、VCR遥控等等设备。 TPYBV101除了具有usb host功能以外,还可作为USB-HID设备来应用,这里重点讲述如果作为鼠标和键盘使用。(萝卜学科编程tpyboard。com)
2.TPYBV101作为鼠标应用
TPYBV101作为鼠标的应用可以参考micropython官方实例中的usb-mouse应用。这里以官方实例为例。 编辑 boot.py 文件以更改 USB—mouse 的确认方式。具体如下:


# boot.py -- run on boot-up

# can run arbitrary Python, but best to keep it minimal
import pyb

#pyb.main('main.py')

# main script to run after this one
#pyb.usb_mode('CDC+MSC')

# act as a serial and a storage device
pyb.usb_mode('CDC+HID')

# act as a serial device and a mouse

其实就是去掉了pyb.usb_mode('CDC+HID')前的注释符。这里pyb.usb_mode(),
定义了HID的设备,默认为mouse,也可以用

pyb.usb_mode('CDC+HID',hid=pyb.hid_mouse)
如果是键盘,应改为

pyb.usb_mode('CDC+HID',hid=pyb.hid_keyboard)
(2)REPL调试鼠标事件
这里依然用putty进行REPL调试。当进行完(1)再次启动时,会发现原本会出现的u盘没有了,此时设备的串口也可能发生了改变,因此在连接Putty前要先确认一下串口。在putty中,输入:(萝卜学科编程tpyboard。com)


pyb.hid((0,10,0,0)) #注意这里两层括号
回车后,会发现鼠标向右移动了10个像素。pyb.hid()的具体用法:
pyb.hid((buttons, x, y, z))
这里buttons取0,1,2,3分别表示0移动,1按下左键,2按下中键,3按下右键。这句也可以用pyb.USB_HID().send((buttons, x, y, z)),效果是一样的。
(3)鼠标左右摇晃,代码如下:
>>> import math
>>> def osc(n, d):
... for i in range(n):
... pyb.hid((0, int(20 * math.sin(i / 10)), 0, 0))
... pyb.delay(d)
...
>>> osc(100, 50)
这段代码也可以写到main.py中,这时大家可能会问,u盘没了,main.py怎么编辑啊。这里需要进入TPYBV101的安全模式。按住usr键,按一下reset,此时led2与led3交替亮,当led3亮起,led2没亮时,松开usr,此时led3快闪后,可以发现u盘挂载出来了,这时可以修改main.py文件。(萝卜学科编程tpyboard。com)

#main.py
import math
import pyb
def osc(n, d):
for i in range(n):
pyb.hid((0, int(20 * math.sin(i / 10)), 0, 0))
pyb.delay(d)
osc(100, 50)
保存后,按reset重启后,就可以看到效果了。
(4)加上加速度传感器的鼠标(官方例程)
用加速度传感器制作一个能根据 TPYBoard 板角度移动而移动的鼠标。相关的代码可以直接在交互式解释器里边完成,或者放入 main.py 文件中。在这里我们选择放入 main.py 文件。(萝卜学科编程tpyboard。com)

在 main.py 中代码:
import pyb
switch = pyb.Switch()
accel = pyb.Accel()
while not switch():
pyb.hid((0, accel.x(), accel.y(), 0))
pyb.delay(20)
保存文件,退出或卸载 TPYBoard 设备。通过复位按键重置,其将再次成为鼠标,且根据板的倾斜角度移动鼠标。你应该能注意到 y轴方向是颠倒的。这个问题很容易解决:在上述的 pyb.hid( )行里,y 轴方向前边加上负号即可。(萝卜学科编程tpyboard。com)
3、TPYBV10x作为键盘应用
(1) 编辑 boot.py 文件,定义usb-keyboard
# boot.py -- run on boot-up
# can run arbitrary Python, but best to keep it minimal

import machine
import pyb
#pyb.main('main.py') # main script to run after this one
#pyb.usb_mode('CDC+MSC') # act as a serial and a storage device
pyb.usb_mode('CDC+HID',hid=pyb.hid_keyboard) # act as a serial device and a keyboard
(2)按键测试,这里为了便于查看,我们修改main.py文件:
# main.py -- put your code here!
hid=pyb.USB_HID()
def release_key_once():
buf = bytearray(8) # report is 8 bytes long
buf[2] = 0
hid.send(buf) # key released
pyb.delay(10)
def press_key_once(key):
buf = bytearray(8) # report is 8 bytes long
buf[2] = key
hid.send(buf) # key released
pyb.delay(10)
def press_2key(key1,key2):
buf = bytearray(8) # report is 8 bytes long
buf[2] = key1
buf[3] = key2
hid.send(buf) # key released
pyb.delay(10)
def release_2key():
buf = bytearray(8) # report is 8 bytes long
buf[2] = 0
buf[3] = 0
hid.send(buf) # key released
pyb.delay(10)
pyb.delay(1000)
press_key_once(0x04)
release_key_once()
pyb.delay(1000)
press_key_once(0x05)
release_key_once()
pyb.delay(1000)
press_key_once(0x2B)
release_key_once()
pyb.delay(1000)
press_key_once(0x28)
release_key_once()
pyb.delay(1000)
press_key_once(0x06)
release_key_once()
pyb.delay(1000)
press_key_once(0x07)
release_key_once()
pyb.delay(1000)
press_2key(0x08,0x09)
release_2key()
pyb.delay(1000)
这个程序定义了按下一个键press_key_once(key),抬起一个键 release_key_once(),按下两个键press_2key(key1,key2),抬起两个键release_2key()的方法。具体运行效果,可先打开一个记事本,然后按一下reset键,或者插拔一次usb口,最后可以看到在记事本里,先打入ab,接着是tab,回车,接着cdef,除了ef几乎同时出现,前面的输入间都间隔了1秒。(萝卜学科编程tpyboard。com)

(3)按键值的定义
为什么上面的0x04是a,0x05是b呢,这里的定义具体如下:
#define KEY_NONE 0x00
#define KEY_ERRORROLLOVER 0x01
#define KEY_POSTFAIL 0x02
#define KEY_ERRORUNDEFINED 0x03
#define KEY_A 0x04
#define KEY_B 0x05
#define KEY_C 0x06
#define KEY_D 0x07
#define KEY_E 0x08
#define KEY_F 0x09
#define KEY_G 0x0A
#define KEY_H 0x0B
#define KEY_I 0x0C
#define KEY_J 0x0D
#define KEY_K 0x0E
#define KEY_L 0x0F
#define KEY_M 0x10
#define KEY_N 0x11
#define KEY_O 0x12
#define KEY_P 0x13
#define KEY_Q 0x14
#define KEY_R 0x15
#define KEY_S 0x16
#define KEY_T 0x17
#define KEY_U 0x18
#define KEY_V 0x19
#define KEY_W 0x1A
#define KEY_X 0x1B
#define KEY_Y 0x1C
#define KEY_Z 0x1D
#define KEY_1_EXCLAMATION_MARK 0x1E
#define KEY_2_AT 0x1F
#define KEY_3_NUMBER_SIGN 0x20
#define KEY_4_DOLLAR 0x21
#define KEY_5_PERCENT 0x22
#define KEY_6_CARET 0x23
#define KEY_7_AMPERSAND 0x24
#define KEY_8_ASTERISK 0x25
#define KEY_9_OPARENTHESIS 0x26
#define KEY_0_CPARENTHESIS 0x27
#define KEY_ENTER 0x28
#define KEY_ESCAPE 0x29
#define KEY_BACKSPACE 0x2A
#define KEY_TAB 0x2B
#define KEY_SPACEBAR 0x2C
#define KEY_MINUS_UNDERSCORE 0x2D
#define KEY_EQUAL_PLUS 0x2E
#define KEY_OBRACKET_AND_OBRACE 0x2F
#define KEY_CBRACKET_AND_CBRACE 0x30
#define KEY_BACKSLASH_VERTICAL_BAR 0x31
#define KEY_NONUS_NUMBER_SIGN_TILDE 0x32
#define KEY_SEMICOLON_COLON 0x33
#define KEY_SINGLE_AND_DOUBLE_QUOTE 0x34
#define KEY_GRAVE ACCENT AND TILDE 0x35
#define KEY_COMMA_AND_LESS 0x36
#define KEY_DOT_GREATER 0x37
#define KEY_SLASH_QUESTION 0x38
#define KEY_CAPS LOCK 0x39
#define KEY_F1 0x3A
#define KEY_F2 0x3B
#define KEY_F3 0x3C
#define KEY_F4 0x3D
#define KEY_F5 0x3E
#define KEY_F6 0x3F
#define KEY_F7 0x40
#define KEY_F8 0x41
#define KEY_F9 0x42
#define KEY_F10 0x43
#define KEY_F11 0x44
#define KEY_F12 0x45
#define KEY_PRINTSCREEN 0x46
#define KEY_SCROLL LOCK 0x47
#define KEY_PAUSE 0x48
#define KEY_INSERT 0x49
#define KEY_HOME 0x4A
#define KEY_PAGEUP 0x4B
#define KEY_DELETE 0x4C
#define KEY_END1 0x4D
#define KEY_PAGEDOWN 0x4E
#define KEY_RIGHTARROW 0x4F
#define KEY_LEFTARROW 0x50
#define KEY_DOWNARROW 0x51
#define KEY_UPARROW 0x52
#define KEY_KEYPAD_NUM_LOCK_AND_CLEAR 0x53
#define KEY_KEYPAD_SLASH 0x54
#define KEY_KEYPAD_ASTERIKS 0x55
#define KEY_KEYPAD_MINUS 0x56
#define KEY_KEYPAD_PLUS 0x57
#define KEY_KEYPAD_ENTER 0x58
#define KEY_KEYPAD_1_END 0x59
#define KEY_KEYPAD_2_DOWN_ARROW 0x5A
#define KEY_KEYPAD_3_PAGEDN 0x5B
#define KEY_KEYPAD_4_LEFT_ARROW 0x5C
#define KEY_KEYPAD_5 0x5D
#define KEY_KEYPAD_6_RIGHT_ARROW 0x5E
#define KEY_KEYPAD_7_HOME 0x5F
#define KEY_KEYPAD_8_UP_ARROW 0x60
#define KEY_KEYPAD_9_PAGEUP 0x61
#define KEY_KEYPAD_0_INSERT 0x62
#define KEY_KEYPAD_DECIMAL_SEPARATOR_DELETE 0x63
#define KEY_NONUS_BACK_SLASH_VERTICAL_BAR 0x64
#define KEY_APPLICATION 0x65
#define KEY_POWER 0x66
#define KEY_KEYPAD_EQUAL 0x67
#define KEY_F13 0x68
#define KEY_F14 0x69
#define KEY_F15 0x6A
#define KEY_F16 0x6B
#define KEY_F17 0x6C
#define KEY_F18 0x6D
#define KEY_F19 0x6E
#define KEY_F20 0x6F
#define KEY_F21 0x70
#define KEY_F22 0x71
#define KEY_F23 0x72
#define KEY_F24 0x73
#define KEY_EXECUTE 0x74
#define KEY_HELP 0x75
#define KEY_MENU 0x76
#define KEY_SELECT 0x77
#define KEY_STOP 0x78
#define KEY_AGAIN 0x79
#define KEY_UNDO 0x7A
#define KEY_CUT 0x7B
#define KEY_COPY 0x7C
#define KEY_PASTE 0x7D
#define KEY_FIND 0x7E
#define KEY_MUTE 0x7F
#define KEY_VOLUME_UP 0x80
#define KEY_VOLUME_DOWN 0x81
#define KEY_LOCKING_CAPS_LOCK 0x82
#define KEY_LOCKING_NUM_LOCK 0x83
#define KEY_LOCKING_SCROLL_LOCK 0x84
#define KEY_KEYPAD_COMMA 0x85
#define KEY_KEYPAD_EQUAL_SIGN 0x86
#define KEY_INTERNATIONAL1 0x87
#define KEY_INTERNATIONAL2 0x88
#define KEY_INTERNATIONAL3 0x89
#define KEY_INTERNATIONAL4 0x8A
#define KEY_INTERNATIONAL5 0x8B
#define KEY_INTERNATIONAL6 0x8C
#define KEY_INTERNATIONAL7 0x8D
#define KEY_INTERNATIONAL8 0x8E
#define KEY_INTERNATIONAL9 0x8F
#define KEY_LANG1 0x90
#define KEY_LANG2 0x91
#define KEY_LANG3 0x92
#define KEY_LANG4 0x93
#define KEY_LANG5 0x94
#define KEY_LANG6 0x95
#define KEY_LANG7 0x96
#define KEY_LANG8 0x97
#define KEY_LANG9 0x98
#define KEY_ALTERNATE_ERASE 0x99
#define KEY_SYSREQ 0x9A
#define KEY_CANCEL 0x9B
#define KEY_CLEAR 0x9C
#define KEY_PRIOR 0x9D
#define KEY_RETURN 0x9E
#define KEY_SEPARATOR 0x9F
#define KEY_OUT 0xA0
#define KEY_OPER 0xA1
#define KEY_CLEAR_AGAIN 0xA2
#define KEY_CRSEL 0xA3
#define KEY_EXSEL 0xA4
#define KEY_KEYPAD_00 0xB0
#define KEY_KEYPAD_000 0xB1
#define KEY_THOUSANDS_SEPARATOR 0xB2
#define KEY_DECIMAL_SEPARATOR 0xB3
#define KEY_CURRENCY_UNIT 0xB4
#define KEY_CURRENCY_SUB_UNIT 0xB5
#define KEY_KEYPAD_OPARENTHESIS 0xB6
#define KEY_KEYPAD_CPARENTHESIS 0xB7
#define KEY_KEYPAD_OBRACE 0xB8
#define KEY_KEYPAD_CBRACE 0xB9
#define KEY_KEYPAD_TAB 0xBA
#define KEY_KEYPAD_BACKSPACE 0xBB
#define KEY_KEYPAD_A 0xBC
#define KEY_KEYPAD_B 0xBD
#define KEY_KEYPAD_C 0xBE
#define KEY_KEYPAD_D 0xBF
#define KEY_KEYPAD_E 0xC0
#define KEY_KEYPAD_F 0xC1
#define KEY_KEYPAD_XOR 0xC2
#define KEY_KEYPAD_CARET 0xC3
#define KEY_KEYPAD_PERCENT 0xC4
#define KEY_KEYPAD_LESS 0xC5
#define KEY_KEYPAD_GREATER 0xC6
#define KEY_KEYPAD_AMPERSAND 0xC7
#define KEY_KEYPAD_LOGICAL_AND 0xC8
#define KEY_KEYPAD_VERTICAL_BAR 0xC9
#define KEY_KEYPAD_LOGIACL_OR 0xCA
#define KEY_KEYPAD_COLON 0xCB
#define KEY_KEYPAD_NUMBER_SIGN 0xCC
#define KEY_KEYPAD_SPACE 0xCD
#define KEY_KEYPAD_AT 0xCE
#define KEY_KEYPAD_EXCLAMATION_MARK 0xCF
#define KEY_KEYPAD_MEMORY_STORE 0xD0
#define KEY_KEYPAD_MEMORY_RECALL 0xD1
#define KEY_KEYPAD_MEMORY_CLEAR 0xD2
#define KEY_KEYPAD_MEMORY_ADD 0xD3
#define KEY_KEYPAD_MEMORY_SUBTRACT 0xD4
#define KEY_KEYPAD_MEMORY_MULTIPLY 0xD5
#define KEY_KEYPAD_MEMORY_DIVIDE 0xD6
#define KEY_KEYPAD_PLUSMINUS 0xD7
#define KEY_KEYPAD_CLEAR 0xD8
#define KEY_KEYPAD_CLEAR_ENTRY 0xD9
#define KEY_KEYPAD_BINARY 0xDA
#define KEY_KEYPAD_OCTAL 0xDB
#define KEY_KEYPAD_DECIMAL 0xDC
#define KEY_KEYPAD_HEXADECIMAL 0xDD
#define KEY_LEFTCONTROL 0xE0
#define KEY_LEFTSHIFT 0xE1
#define KEY_LEFTALT 0xE2
#define KEY_LEFT_GUI 0xE3
#define KEY_RIGHTCONTROL 0xE4
#define KEY_RIGHTSHIFT 0xE5
#define KEY_RIGHTALT 0xE6
#define KEY_RIGHT_GUI 0xE7
4、恢复正常模式
TPYBoard V10x退出CDC+HID模式的方法有两个,一个是进入安全模式,将boot.py文件的pyb.usb_mode('CDC+HID')注释掉,另一种是恢复出厂设置,这种方法是按住usr键,按一下reset,然后led2和led3交替亮,当两个灯交替亮到三次,且均亮起时,松开usr,两个灯会快闪多次,然后TPYBV101恢复到出厂设置,此时main.py里的内容也都清空了。
硬件开发
2019-01-02 15:39:00
「深度学习福利」大神带你进阶工程师,立即查看>>>
配置文件xorg.conf生成并修改
查看是否有xorg.conf文件
# cd /etc/X11/
# ls
如果没有,需要重新生成。
备注:千万不要自己创建新文件,不然重启电脑将发现不能进入桌面系统。
生成方法:
root账号下:
#cp /var/log/Xorg.0.log /var/log/Xorg.1.log
#Xorg -configure :1(注意:configure后有空格)
此时,目录/root/下将生成xorg.conf.new,执行
#cp /root/xorg.conf.new /etc/X11/xorg.conf
此时,可以以xorg.conf为基础进行修改。
修改xorg.conf
#vi /etc/X11/xorg.conf
添加如下内容:
Section "ServerFlags"
Option "BlankTime" "0"
Option "StandbyTime" "0"
Option "SuspendTime" "0"
Option "OffTime" "0"
EndSection
Section "Monitor"
Option "DPMS" "false"
EndSection
保存后重启即可。
备注:添加“Monitor”部分的时候,如果发现已经有该部分了,我的如下:
Section "Monitor"
Identifier "Monitor0"
VendorName "Monitor Vendor"
ModelName "Monitor Model"
EndSection
只需要在该部分添加:Option "DPMS" "false"即可。
修改xorg.conf导致启动电脑不能进入系统的处理
网上很多人说用光盘修复,我的是用U盘进行安装进入不了,拿U盘进行修复,每次都是进入安装界面,不能解决。后来看到有人说用单用户模式登录,最终解决。
(1)在开机时,快速按f8(或者Ctrl+Alt+f2),进入GRUB模式界面,然后按"e"即可进入GRUB编辑界面。
(2)把光标移动到kernel ...那一行,再敲入“e”进入命令行编辑,
在kernel 一行的最后输入:空格1(single也可以),然后回车(注意1前的空格)
敲入“b”,启动系统,即进入单用户模式。
此时你就可以进入命令行系统,然后按前面所述的注意点重新修改你的xorg.conf文件。
硬件开发
2018-12-29 18:49:00
「深度学习福利」大神带你进阶工程师,立即查看>>>
之前自己给设备写的通信协议,一到工作环境就不停通信错误。思前想后,觉得原因是自己瞎写的协议不好,无法适应有噪音的环境。下定决定移植一个成熟的协议。查了资料,发现Modbus协议简单(容易学),稳定(不出错),应用广泛(轮子多)。就是它了。
Modbus通信协议定义了四种常用的寄存器,分别为:线圈状态(coil),离散输入状态(discrete),保持寄存器(holding)和输入寄存器(input)。
这四种寄存器的分类有其历史原因。因为Modbus起源于PLC通信,而PLC是基于非易失性存储介质的,所以使用了coil和holding来表示PLC内部的非易失性变量,使用了discrete和input来表示PLC外界的信号。但现在的系统,其寄存器基本都是掉电丢失的,无论使用哪个来称呼这些寄存器,都会感到有些困惑。
保守的做法,是利用自定义命令来读写这些易失性寄存器,但是这样做会丧失通用性,而且很多现成的移植也失效了。更方便的方法还是按读写能力来分类,单纯地将coil和holding理解为可读写寄存器,而把discrete和input理解为协议里的只读寄存器。
Modbus协议的coil和discrete,针对的是位寄存器;holding和input,针对的是16位寄存器。但这两者也是模糊的。光靠coil和discrete,或者光靠holding和input,其实都已足够。两套方法都可以用,让我这种选择困难患者感觉很难取舍。我最后的方案是,不管什么寄存器,全用holding和input。
定下来以后,就可以开始移植了。
硬件开发
2019-02-21 03:01:00
「深度学习福利」大神带你进阶工程师,立即查看>>>
关于NODEMCU和ESP8266之间的关系
我自己的理解:
ESP8266是核心芯片
NodeMcu开发板是以ESP8266为核心,扩展的开发板。

两者端口对应关系如下:
一些NodeMcu开发设计的软件和材料:
ESPlorer和入门教程 , 集成了串口调试界面和Lua开发环境的IDE,官方推荐 官方lua固件 ,包含源码,各模块的LUA例程和说明文档,编译后生成bin文件,可以烧写到flash中。 nodemcu flasher , nodemcu一键烧写工具,无需设置,一键烧写最新的nodemcu固件 nodemcu硬件资料 , nodemcu硬件原理图,gerber文件,管脚说明 nodemcu的lua应用程序 ,可以上传至nodemcu运行 nodemcu API 英文文档 和 中文文档
, 中文文档有错误,但是方便检索 NodeMCU custom builds ,可以在网站上订制自己的nodmcu固件,固件可以只包括需要的模块,减小运行内存。

对于ESP-12的固件: 我们拿到的esp-12模块可以发送AT指令,因为包含AT指令的固件已经烧进mcu。 我们能用lua语言编程程序上传运行,因为包含lua模块和执行器的固件已经烧进mcu
NodeMcu硬件和lua固件的关系 烧写进nodemcu的lua固件更像一个操作系统,它有对应的文件系统SPIFFS 用 ESPlorer 把.lua文件上传至nodemcu的文件系统统 SPIFFS ,在物理上是把这部代码上传到 flash ,放在文件系统对应的地址中。 lua固件和文件系统的.lua代码载入内存运行,固件负责解释代码并执行。 上传lua与烧写flash固件的区别是:烧写固件是将原固件擦除并更新,通常不会影响文件系统。而Esplore上传.lua只是更新文件系统。文件系统和固件占用flash的不同地址,互不影响。 要烧写nodemcu的固件,windows下需要VM虚拟系统下的linux编译源码(乐鑫官方的编译方式),或者用 安信 可的SDK,当然你也可以在网上订制,点击 NodeMCU custom builds ,你需要烧写工具 nodemcu flasher 把bin文件写入flash 切记,一旦你烧写nodemcu的固件,意味着你更新了操作系统。它可能增加或减少几个功能模块。而文件系统的 .lua 文件一般情况下会保留。这与重装电脑 c盘 ,d盘的文件不受影响是一个道理。
关于SPIFFS
SPIFFS 是nodemcu的文件系统,用于falsh中放置 .lua 文件,flash也放置固件。查看 nodemcu官方文档 对 SPIFFS 的说明,点击 这里 ,这里简单说一下: SPIFFS 全称是SPI Flash File System,用于SPI读写flash的文件系统,其实也可用于NOR flash SPIFFS 文件系统用于嵌入式平台的 SPI NOR flash设备,同样适用于MCU内部的falsh nodmcu的lua固件包含了SPIFFS文件系统的镜像工具。第一次烧写flash,没有检测到flash中的文件系统,会在flash中新建一个文件系统。文件系统的 起始地址 = 固件结束地址 + 64K~128K 。 如果 新固件大小 < 原固件大小 + 64K ,原有的文件系统就会保留,否则会新建,原有lua文件丢失
文章部分内容来自:https://blog.csdn.net/qq_32543253/article/details/53240071
硬件开发
2019-02-20 18:35:00
「深度学习福利」大神带你进阶工程师,立即查看>>>
当你看到这篇文章的时候,显然你已经阅读了很多类似的文章,那么本篇文章会深入讲解一些新手的需求,提供详细的建议,当然我不会告诉你具体怎么做,一切答案都是肤浅的。
就拿我自己来说,初步接触编程的阶段是兴奋与痛苦并存的。看着自己手打的代码是兴奋的,然而由于格式、缩进、代码规则等等出现的错误又是非常痛苦的。那么本文介绍的就是一个规避新手编程错误的编辑器,基于TPYBoard系列开发板的Micropython语言编辑器--Python Editor。
首先看一下python editor的编程界面:编程界面功能介绍,下文我会讲解。
网址:http://www.tpyboard.com/pythoneditor/#
说实话我看到拼插编程教学,脑海里第一印象是乐高的积木拼插,对于五六岁刚刚有自我认知的孩子们来说,乐高的积木拼插是非常成功的,通过自己动手动脑,拼插出复杂多变的图形,是公认的非常好的启发婴幼儿智力的简单玩具。但是他也仅仅是启发智力,认知世界的玩具而已。随着孩子们不断成长,简单的积木拼插已经慢慢不能满足孩子们的求知欲望,他们渴望更深层次的知识,很自然的就要接触到程序代码,孩子况且如此,更不用说求知欲更强的成年人了。
TPYBoard 开发板是什么呢?
继续回过头来看python editor编辑器,此编辑器是基于TPYBoard v10x系列开发板的Micropython语言编辑器,TPYBoard 开发板是什么呢?TPYBoard使用的是stm32主芯片,此开发板可直接连接PC端进行编程。
简单看下开发板规格,不做详细介绍。
Python Editor
以简单定时器为例,完整代码如下图:
当拼插好图形,系统会根据图形自动生成Micropython代码,在右侧区域显示,不需要考虑格式和缩进的问题。只需要掌握好图形拼插的原理,代码将是完全正确的。
TPYBoard 开发板运行程序
点击python editor 左下角的下载python,将系统生成的代码下载到TPYBoard盘符TPYBFLASH中即可运行程序。
当然针对想了解如何零基础学习编程的朋友,绝大多数都没有基础,就算有也是无关紧要的基础,更谈不上开发的基础。虽然上面说到python editor编辑器不需要什么基础,但是想要用好它,也不是纸上谈兵就能实现的,实践才是检验真理的唯一标准!
硬件开发
2019-02-14 10:44:00
「深度学习福利」大神带你进阶工程师,立即查看>>>
实验目的:
学习在PC机系统中扩展简单I/O 接口的方法
学习TurnipBit拼插编程
学习土壤传感器的工作原理以及使用方法
所需原器件:
TurnipBit开发板一块
TurnipBit扩展板一块
usb 数据线一条
土壤湿度检测模块
杜邦线若干
土壤湿度检测模块原理:
土壤湿度检测模块主要用来测量土壤容积含水量。它利用电磁脉冲原理、根据电磁波在介质中传播频率来测量土壤的表观介电常数(ε),从而得到土壤容积含水量(θv),当检测到土壤湿度达到某一设置标准则开始浇水。
接线方法:

TurnipBit扩展板与发光二极管接口对应如下表:
源代码:
打开TurnipBit可视化编程地址www.turnipBit.com
代码如下: from microbit import * while True: if pin5.read_digital(): pin8.write_digital(0) display.show(Image("09990:99999:09090:00000:00900")) else: pin8.write_digital(1) display.show(Image.HAPPY)
可视化编程图
硬件开发
2019-02-13 13:34:00
「深度学习福利」大神带你进阶工程师,立即查看>>>
是Java还是C++ ? 是Go还是Python?
你为你最爱或者最熟悉的编程语言打Call了吗?
Python在国外是一门非常热门的编程语言,近些年在国内也被发掘与追捧, Python的开放、简洁、黏合正符合了现发展阶段对大数据分析、可视化、各种平台程序协作产生了快速的促进作用。它具有丰富而强大的库,能够把用其他语言制作的各种模块(尤其是C/C++)很轻松地联结在一起,应用于任何平台,而且还有我们最喜欢的开源 、免费噢!
关于MicroPython?
MicroPython是以Python语言为基础,运行在一系列微控制器硬件平台上的系统的名称,类似于Arduino。是近年来开源社区中非常热门的项目之一。它功能强大、使用简单,是创客、DIY爱好者、工程师非常好的工具。同时适用于从小学到大学各个年龄段的同学完成Python的入门学习。
和其他类似软件相比,MicroPython是真正可以用在产品开发中的软件。以其开放的架构和MIT授权方式,在很短时间内就风靡世界。MicroPython开发产品原型的速度更快,程序也更加容易实现模块化,更方便进行维护。
MicropPython的学习,如何从0到1?
1、选择合适的硬件平台
MicroPython通常理解为一个软件系统,还需要一个硬件平台来运行它。而TPYBoardv102开发板就是运行MicroPython的硬件平台,同时也是一款STM32核心板。同时作为国内MicroPython研究的先行者,TPYBoard已经陆续推出了基于无线网通信的v202、基于以太网通信的v201、基于GPS通信定位的v702、STM32F407系列开发板以及多本教材。并配有完善的技术支持及教程资料,是MicroPython入门及研究的不二之选。
2、在线编程工具
TPYBoard拥有国内首款从代码到图形编程同时进行的IDE-PythonEditor:tpyboard.com/pythoneditor。
PythonEditor主界面包含左侧的拖拽块选择区、中间的模块编辑区、右侧的代码显示区、下方的程序保存运行区、以及上方的拖拽代码切换区域,拥有以下几个特点:
1、可视化编程,操作简单
2、图形化操作,无需代码拖拖拽拽就能编程
3、左边拼插,右边显示对应代码,轻松学编程
3、一站式采购平台
TPYBoard TB商城萝卜城,零基础实现你物联网创意的开发板购买,还有各类元器件可实现一站式元器件采购!
4、完善的技术支持
TPYBoard拥有在线学习网站、独立的教程网站、千人QQ技术交流以及MicroPython玩家汇V信公众号。真正满足小白零基础入门,同时也是MicroPython爱好者、学生毕设以及工业产品研发的首选。
MicroPython新手友好、功能强大、高效灵活,学会之后无论是想进入数据分析、人工智能、嵌入式开发这些领域,还是希望掌握第一门编程语言,都可以用MicroPython来开启无限未来的无限可能!
硬件开发
2019-02-12 14:24:00
「深度学习福利」大神带你进阶工程师,立即查看>>>
查询u盘位置 zylMBP:Downloads zhangyalin$ diskutil list /dev/disk0 (internal): #: TYPE NAME SIZE IDENTIFIER 0: GUID_partition_scheme 500.3 GB disk0 1: EFI EFI 314.6 MB disk0s1 2: Apple_APFS Container disk1 499.3 GB disk0s2 /dev/disk1 (synthesized): #: TYPE NAME SIZE IDENTIFIER 0: APFS Container Scheme - +499.3 GB disk1 Physical Store disk0s2 1: APFS Volume Macintosh HD 469.8 GB disk1s1 2: APFS Volume Preboot 45.6 MB disk1s2 3: APFS Volume Recovery 517.0 MB disk1s3 4: APFS Volume VM 1.1 GB disk1s4 /dev/disk2 (external, physical): #: TYPE NAME SIZE IDENTIFIER 0: FDisk_partition_scheme *7.8 GB disk2 1: DOS_FAT_32 KS 7.8 GB disk2s1
卸载u盘 zylMBP:Downloads zhangyalin$ diskutil unmountDisk /dev/disk2 Unmount of all volumes on disk2 was successful
写入镜像 zylMBP:Downloads zhangyalin$ sudo dd if=./openwrt-18.06.2-x86-generic-combined-ext4.img of=/dev/disk2 Password: 558080+0 records in 558080+0 records out 285736960 bytes transferred in 609.099414 secs (469114 bytes/sec)
推出u盘 zylMBP:Downloads zhangyalin$ diskutil eject /dev/disk2 Disk /dev/disk2 ejected
参考 第八章、檔案與檔案系統的壓縮,打包與備份 Mac下制作openwrt U盘启动盘
硬件开发
2019-02-11 12:01:00