diff --git a/docs/Advanced_development/zh/QuecPythonBus/LED.md b/docs/Advanced_development/zh/QuecPythonBus/LED.md index e69de29bb2d1d6434b8b29ae775ad8c2e48c5391..0bc7b3dd60bf7a419442331fed2e8c034cad3b78 100644 --- a/docs/Advanced_development/zh/QuecPythonBus/LED.md +++ b/docs/Advanced_development/zh/QuecPythonBus/LED.md @@ -0,0 +1,129 @@ +# 跑马灯实验 + +## 修订历史 + +| 版本 | 日期 | 作者 | 变更表述 | +| ---- | ---------- | ---- | -------- | +| 1.0 | 2021-09-15 | Grey | 初版 | + +文档主要介绍如何实现 GPIO控制外部器件,从硬件设计和软件设计两方面讲解,通过阅读本文,您将学会查看硬件连接关系、代码编写思路和验证实验理论。 + +有关API详解请参考 [QuecPython-machine - PIN](https://python.quectel.com/wiki/#/zh-cn/api/QuecPythonClasslib?id=pin) + + + +## 硬件描述 + +GPIO是最常用的外设之一,可以输出高电平和低电平,以便控制外部的器件。如下图标有GPIO 的 Pin 就是我们想要找的引脚。 + +![media_PIN_1](media/media_PIN_1.jpg) + + + +## 软件设计 + +首先确定要控制硬件的哪个引脚,然后通过官网的 API 类库找到对应的 GPIO编号 。详解请参考 [QuecPython-machine - PIN](https://python.quectel.com/wiki/#/zh-cn/api/QuecPythonClasslib?id=pin) + +例: ![media_PIN_2](media/media_PIN_2.jpg)EC600S/N的引脚10为GPIO1。 + +开始编写代码,在.py 文件里加入下面代码,用于对 GPIO 读写: + +```python +IOdictRead = {} # 记录已经初始化的 GPIO 口 +IOdictWrite = {} # 记录已经初始化的 GPIO 口 +def GPIO_Read(gpioX, Pull=Pin.PULL_DISABLE, level=1): + if IOdictWrite.get(gpioX, None): + del IOdictWrite[gpioX] + gpioIO = IOdictRead.get(gpioX, None) + if gpioIO: + return gpioIO.read() + else: + IOdictRead[gpioX] = (Pin(gpioX, Pin.IN, Pull, level)) + gpioIO = IOdictRead.get(gpioX, None) + return gpioIO.read() +def GPIO_Write(gpioX, level, Pull=Pin.PULL_DISABLE): + if IOdictRead.get(gpioX, None): + del IOdictRead[gpioX] + gpioIO = IOdictWrite.get(gpioX, None) + if gpioIO: + gpioIO.write(level) + else: + IOdictWrite[gpioX] = (Pin(gpioX, Pin.OUT, Pull, level)) + gpioIO = IOdictWrite.get(gpioX, None) + gpioIO.write(level) +``` + +定义需要控制的 GPIO 别名: + +```python +from machine import Pin + +LED1 = Pin.GPIO1 # 定义LED引脚 +LED2 = Pin.GPIO2 # 定义LED引脚 +LED3 = Pin.GPIO3 # 定义LED引脚 +LED4 = Pin.GPIO4 # 定义LED引脚 +LED5 = Pin.GPIO5 # 定义LED引脚 +``` + +对某一个引脚实现控制: + +```python +def IO_On(gpioX): # 某个引脚置 0 + GPIO_Write(gpioX, 0) # 调用写函数 +def IO_Off(gpioX): # 某个引脚置 1 + GPIO_Write(gpioX, 1) # 调用写函数 + +``` + +对全部引脚实现控制: + +```python +def IO_All_Off(): # 全部引脚置 1 + IO_Off(LED1) + IO_Off(LED2) + IO_Off(LED3) + IO_Off(LED4) + IO_Off(LED5) + +``` + +完成上面的代码后,我们可以编写主程序 +main(),主要实现思路,亮-灭-亮-灭,如此循环;仅点亮 LED1,延时 200 毫秒,看到LED1 亮,LED1 灭;仅点亮 LED2,延时 200 毫秒,LED2 灭;仅点亮 LED3,延时200 毫秒,LED3 灭;这样就能看到 LED 轮流点亮的效果。 + +```python +import utime + +def main(): + while True: + IO_All_Off() # 灭 IO_On(LED1) # 亮 + utime.sleep_ms(200) # 延时 + IO_All_Off() # 灭 IO_On(LED2) # 亮 + utime.sleep_ms(200) # 延时 + IO_All_Off() # 灭 IO_On(LED3) # 亮 + utime.sleep_ms(200) # 延时 + IO_All_Off() # 灭 IO_On(LED4) # 亮 + utime.sleep_ms(200) # 延时 + IO_All_Off() # 灭 IO_On(LED5) # 亮 + utime.sleep_ms(200) # 延时 +``` + +接下来就可以下载验证了,python 代码不需要编译,直接通过 QPYcom 工具把.py文件下载到模块中运行。 + + + +## 下载验证 + +下载.py 文件到模组运行: + +![media_PIN_3](media/media_PIN_3.jpg) + +下载之后,看到 LED 逐个点亮,有流水灯的效果: + +![media_PIN_4](media/media_PIN_4.jpg) + + + +## 配套代码 + + +下载代码 \ No newline at end of file diff --git a/docs/Advanced_development/zh/QuecPythonBus/code/code_LED.py b/docs/Advanced_development/zh/QuecPythonBus/code/code_LED.py new file mode 100644 index 0000000000000000000000000000000000000000..80821f9f2b9f0285a3d728d004a4b991497cc57a --- /dev/null +++ b/docs/Advanced_development/zh/QuecPythonBus/code/code_LED.py @@ -0,0 +1,80 @@ +# 实验1: 跑马灯 +# API资料参考连接: https://python.quectel.com/wiki/#/zh-cn/api/?id=pin + + +from machine import Pin +import utime + + +IOdictRead = {} # 记录已经初始化的GPIO口 +IOdictWrite = {} # 记录已经初始化的GPIO口 + + +def GPIO_Read(gpioX, Pull=Pin.PULL_DISABLE, level=1): + if IOdictWrite.get(gpioX, None): + del IOdictWrite[gpioX] + gpioIO = IOdictRead.get(gpioX, None) + if gpioIO: + return gpioIO.read() + else: + IOdictRead[gpioX] = (Pin(gpioX, Pin.IN, Pull, level)) + gpioIO = IOdictRead.get(gpioX, None) + return gpioIO.read() + + +def GPIO_Write(gpioX, level, Pull=Pin.PULL_DISABLE): + if IOdictRead.get(gpioX, None): + del IOdictRead[gpioX] + gpioIO = IOdictWrite.get(gpioX, None) + if gpioIO: + gpioIO.write(level) + else: + IOdictWrite[gpioX] = (Pin(gpioX, Pin.OUT, Pull, level)) + gpioIO = IOdictWrite.get(gpioX, None) + gpioIO.write(level) + + +LED1 = Pin.GPIO1 # 定义LED引脚 +LED2 = Pin.GPIO2 # 定义LED引脚 +LED3 = Pin.GPIO3 # 定义LED引脚 +LED4 = Pin.GPIO4 # 定义LED引脚 +LED5 = Pin.GPIO5 # 定义LED引脚 + + +def IO_On(gpioX): # 某个引脚置0 + GPIO_Write(gpioX, 0) # 调用写函数 + + +def IO_Off(gpioX): # 某个引脚置1 + GPIO_Write(gpioX, 1) # 调用写函数 + + +def IO_All_Off(): # 全部引脚置1 + IO_Off(LED1) + IO_Off(LED2) + IO_Off(LED3) + IO_Off(LED4) + IO_Off(LED5) + + +def main(): + while True: + IO_All_Off() # 灭 + IO_On(LED1) # 亮 + utime.sleep_ms(200) # 延时 + IO_All_Off() # 灭 + IO_On(LED2) # 亮 + utime.sleep_ms(200) # 延时 + IO_All_Off() # 灭 + IO_On(LED3) # 亮 + utime.sleep_ms(200) # 延时 + IO_All_Off() # 灭 + IO_On(LED4) # 亮 + utime.sleep_ms(200) # 延时 + IO_All_Off() # 灭 + IO_On(LED5) # 亮 + utime.sleep_ms(200) # 延时 + + +if __name__ == "__main__": + main() diff --git a/docs/Advanced_development/zh/QuecPythonBus/media/media_PIN_1.jpg b/docs/Advanced_development/zh/QuecPythonBus/media/media_PIN_1.jpg new file mode 100644 index 0000000000000000000000000000000000000000..5f159f0398ba8ea94182d672a232a7edac832a75 Binary files /dev/null and b/docs/Advanced_development/zh/QuecPythonBus/media/media_PIN_1.jpg differ diff --git a/docs/Advanced_development/zh/QuecPythonBus/media/media_PIN_2.jpg b/docs/Advanced_development/zh/QuecPythonBus/media/media_PIN_2.jpg new file mode 100644 index 0000000000000000000000000000000000000000..5f7d9a8fdcc6186a90a06efeaced6fcf0e872fe4 Binary files /dev/null and b/docs/Advanced_development/zh/QuecPythonBus/media/media_PIN_2.jpg differ diff --git a/docs/Advanced_development/zh/QuecPythonBus/media/media_PIN_3.jpg b/docs/Advanced_development/zh/QuecPythonBus/media/media_PIN_3.jpg new file mode 100644 index 0000000000000000000000000000000000000000..cb53a486ee169e810b4f3c6eda9cb39e0ca34e51 Binary files /dev/null and b/docs/Advanced_development/zh/QuecPythonBus/media/media_PIN_3.jpg differ diff --git a/docs/Advanced_development/zh/QuecPythonBus/media/media_PIN_4.jpg b/docs/Advanced_development/zh/QuecPythonBus/media/media_PIN_4.jpg new file mode 100644 index 0000000000000000000000000000000000000000..a553cc0beac6a4a072b8ab18b5de88c16c4ab451 Binary files /dev/null and b/docs/Advanced_development/zh/QuecPythonBus/media/media_PIN_4.jpg differ diff --git a/docs/Quick_start/zh/socket.md b/docs/Quick_start/zh/socket.md index b3866071ff988bbe750dcfe1c0982e1d7de65591..9321c58dec2f3ee0c26ca27ca1d6986e0c1d1ae4 100644 --- a/docs/Quick_start/zh/socket.md +++ b/docs/Quick_start/zh/socket.md @@ -18,24 +18,24 @@ ### Socket介绍 -所谓Socket(套接字),就是对网络中不同主机上的应用进程之间进行双向通信的端点的抽象。一个Socket就是网络上进程通信的一端,提供了应用层进程利用网络协议交换数据的机制。从所处的地位来讲,Socket上联应用进程,下联网络协议栈,是应用程序通过网络协议进行通信的接口,是应用程序与网络协议根进行交互的接口。 +​ 所谓Socket(套接字),就是对网络中不同主机上的应用进程之间进行双向通信的端点的抽象。一个Socket就是网络上进程通信的一端,提供了应用层进程利用网络协议交换数据的机制。从所处的地位来讲,Socket上联应用进程,下联网络协议栈,是应用程序通过网络协议进行通信的接口,是应用程序与网络协议根进行交互的接口。 -Socket可以看成是两个网络应用程序进行通信时,各自通信连接中的端点,这是一个逻辑上的概念。它是网络环境中进程间通信的API(应用程序编程接口),也是可以被命名和寻址的通信端点,使用中的每一个Socket都有其类型和一个与之相连进程。通信时其中一个网络应用程序将要传输的一段信息写入它所在主机的Socket中,该Socket通过与网络接口卡(NIC)相连的传输介质将这段信息送到另外一台主机的Socket中,使对方能够接收到这段信息。Socket是由IP地址和端口结合的,提供向应用层进程传送数据包的机制。 +​ Socket可以看成是两个网络应用程序进行通信时,各自通信连接中的端点,这是一个逻辑上的概念。它是网络环境中进程间通信的API(应用程序编程接口),也是可以被命名和寻址的通信端点,使用中的每一个Socket都有其类型和一个与之相连进程。通信时其中一个网络应用程序将要传输的一段信息写入它所在主机的Socket中,该Socket通过与网络接口卡(NIC)相连的传输介质将这段信息送到另外一台主机的Socket中,使对方能够接收到这段信息。Socket是由IP地址和端口结合的,提供向应用层进程传送数据包的机制。 -Socket是应用层与TCP/IP协议族通信的中间软件抽象层,它是一组接口。在设计模式中,Socket其实就是一个门面模式,它把复杂的TCP/IP协议族隐藏在Socket接口后面,对用户来说,一组简单的接口就是全部,让Socket去组织数据,以符合指定的协议。 +​ Socket是应用层与TCP/IP协议族通信的中间软件抽象层,它是一组接口。在设计模式中,Socket其实就是一个门面模式,它把复杂的TCP/IP协议族隐藏在Socket接口后面,对用户来说,一组简单的接口就是全部,让Socket去组织数据,以符合指定的协议。 ![Quectel_sbs_Socket_relation](media/Quectel_sbs_Socket_relation.png) ### Socket过程 -Socket起源于Unix,而Unix/Linux基本哲学之一就是“一切皆文件”,都可以用“打开(open)→ +​ Socket起源于Unix,而Unix/Linux基本哲学之一就是“一切皆文件”,都可以用“打开(open)→ 读写(write/read)→关闭(close)”模式来操作。在实现过程中服务端可以看作是web服务器,客户端可以看作是要访问web服务器的浏览器,访问过程就可以和打开→读写→关闭一一对应。 ![Quectel_sbs_Socket_course](media/Quectel_sbs_Socket_course.png) ### **Socket的应用** -Socket可以使一个应用从网络中读取和写入数据,不同计算机上的两个应用可以通过连接发送和接受字节流,注意,当发送消息时,需要知道对方的IP和端口。在日常生活中有很多应用场景,当你浏览网页时,浏览器进程怎么与web服务器进程通信;当你用QQ聊天时,QQ进程怎么与服务器或好友所在的QQ进程通信,这些都是通过socket来实现的。 +​ Socket可以使一个应用从网络中读取和写入数据,不同计算机上的两个应用可以通过连接发送和接受字节流,注意,当发送消息时,需要知道对方的IP和端口。在日常生活中有很多应用场景,当你浏览网页时,浏览器进程怎么与web服务器进程通信;当你用QQ聊天时,QQ进程怎么与服务器或好友所在的QQ进程通信,这些都是通过socket来实现的。 diff --git a/docs/sbs/zh/BSP/SPI.md b/docs/sbs/zh/BSP/SPI.md index 94294f8ef0b4b4041f6ebcb318085a7f215a0369..74f170deee3eadad647775e9247f933bef327617 100644 --- a/docs/sbs/zh/BSP/SPI.md +++ b/docs/sbs/zh/BSP/SPI.md @@ -103,5 +103,5 @@ while count: ## 配套代码 - - 下载代码 \ No newline at end of file + + 下载代码 \ No newline at end of file diff --git a/docs/sbs/zh/BSP/code/media_SPI.py b/docs/sbs/zh/BSP/code/code_SPI.py similarity index 100% rename from docs/sbs/zh/BSP/code/media_SPI.py rename to docs/sbs/zh/BSP/code/code_SPI.py