FFD8

  • 2024-07-13
  • 发表了主题帖: 【超小型 Linux 开发套件:Quantum Tiny Linux(带 SoM 和扩展板)】 - 3.uart测试...

    本帖最后由 FFD8 于 2024-7-13 01:02 编辑 # 【超小型 Linux 开发套件:Quantum Tiny Linux(带 SoM 和扩展板)】 - 3.uart测试及安装libmodbus库 *本次项目涉及和底盘控制模块的串口通信,先测试下Quantum的串口收发功能,再安装好libmodbus开源库,为后续阶段做准备。* ## 1、uart收发测试 用排针引出扩展板上的串口: 1、下载UART_test.zip,上传到Quantum,并解压缩unzip UART_test.zip; 2、进入目录:cd UART_test 3、编译:make 4、执行:./uart_test 5、根据扩展板上的丝印信息对应连接usb2ttl的GND,Rx,Tx 6、PC打开串口调试助手,波特率9600,每间隔1S可收到Rimipi回传的串口数据:Hello Quantum Tiny Linux!!! 7、串口助手发送数据,Quantum也可以顺利接收 8、测试结束,串口功能可以正常使用 收发测试视频: [localvideo]7bd4e3f9a35272f3b49c7ebac1a90f08[/localvideo] ------------ ## 2、安装libmodbus库 ### 1、下载源码: git clone https://github.com/stephane/libmodbus.git 或者下载附件 然后上传到Quantum ### 2、安装 1、解压缩源码:unzip libmodbus.zip 2、进入源码目录:cd libbodbus-master 3、运行:./autogen.sh 4、新建install文件夹:mkdir install 5、运行:./configure --prefix=/home/pi/Downliads/libmodbus-master/install/ 6、运行:make & make install 7、编译成功后,在install文件夹下会生成头文件及库文件 ### 3、库测试 进入tests目录,开两个窗口分别运行:./unit-test-client  ./unit-test-server。能正常跑起来就说明安装成功了。 视频完整记录了库安装和测试的详细过程: [localvideo]0d1bf5a28f4f00d668c31a29510417e3[/localvideo]

  • 2024-07-07
  • 发表了主题帖: 【超小型 Linux 开发套件:Quantum Tiny Linux(带 SoM 和扩展板)】 - 2.ROS安装

    本帖最后由 FFD8 于 2024-7-7 14:43 编辑 # 【超小型 Linux 开发套件:Quantum Tiny Linux(带 SoM 和扩展板)】 - 2.ROS安装 本次项目计划在ROS-melodic上实现,所以系统更新到18.04即可。 虽然在该系统上安装ROS-melodic时遇到了一些问题,但最终还算顺利解决,安装详情可供参考。 ## 1、笔者通常使用鱼香ROS一键安装: ```c wget http://fishros.com/install -O fishros && . fishros ``` 但是这次在安装ROS-melodic最后阶段,提示安装失败。 ## 2、换第二种方式: ```c sudo apt install ros-melodic-ros-base ``` 安装时提示依赖关系异常: ```c The following packages have unmet dependencies: ros-melodic-desktop-full : Depends: ros-melodic-desktop but it is not going to be installedDepends: ros-melodic-perception but it is not going to be installedDepends: ros-melodic-simulators but it is not going to be installedDepends: ros-melodic-urdf-sim-tutorial but it is not going to be installed E: Unable to correct problems, you have held broken packages. ``` > **最终在这里找到解决方案:https://answers.ros.org/question/299260/unmet-dependencies-when-installing-melodic-on-ubuntu-1804/** ## 3、最终安装方式: ```c sudo aptitude install ros-melodic-ros-base ``` 成功安装ROS-melodic ## 4、远程连接桌面,同时测试一下ROS ```c //在两个窗口分别运行 roscore rostopic list ``` [localvideo]9d0684d54f73556040587dce592bb4c2[/localvideo]

  • 回复了主题帖: 【超小型 Linux 开发套件:Quantum Tiny Linux(带 SoM 和扩展板)】- 1、系统烧录...

    Jacktang 发表于 2024-7-7 09:26 升级过程中遇到的问题解决了没有 运行文档中提到的命令即可解决

  • 2024-07-06
  • 加入了学习《Follow me 第2期任务视频》,观看 Follow me第2期任务汇总视频

  • 加入了学习《【得捷电子Follow me第4期】项目总结报告》,观看 【得捷电子Follow me第4期】项目总结报告

  • 发表了主题帖: 【超小型 Linux 开发套件:Quantum Tiny Linux(带 SoM 和扩展板)】- 1、系统烧录...

    本帖最后由 FFD8 于 2024-7-6 09:16 编辑 # 超小型 Linux 开发套件:Quantum Tiny Linux(带 SoM 和扩展板) ### 相关资料: https://wiki.seeedstudio.com/cn/Quantum-Mini-Linux-Development-Kit/ https://github.com/peng-zhihui/Project-Quantum https://gitee.com/coolflyreg163/quark-n 本开发套件的底板名为 Atom-N,通过M.2接口连接Quark-N。 夸克迷你开发者套件Atom-N可能是市面上最小的Linux卡片电脑, 本套件包含一个搭载四核CPU的高度集成SOM核心板,以及一个多功能IO扩展底板,可以在40mm x 35mm的尺寸上运行Linux系统, 并具备出色的扩展功能。您可以将它用于搭建个人服务器、开发智能语音助手、设计机器人等场景。 开发板的核心是一块名为Quark-N的SOM核心板,它基于Allwinner H3, 架构为四核Cortex-A7 CPU + Mali400 MP2 GPU,PCBA使用6层高密度沉金PCB工艺制造,集成了完整的片上ARM-Linux系统(包含CPU、DDR、eMMC),核心板尺寸只有惊人的2x3cm! Atom-N上扩展搭载了麦克风、MPU6050 IMU(加速度计和陀螺仪)、板载4个按键、1.35寸的IPS显示屏、Wi-Fi/蓝牙模块、喇叭功放、两个USB-A接口、以及2.0mm排针的额外GPIO(包含I2C、SPI、UART等)。 ### 产品特性 - 体积超小 (31mm x 22mm) 和高度集成的四核Cortex-A7 Linux SoM - 带有丰富外围设备和接口的底板(40mmx35mm) : 麦克风,陀螺仪,加速度计,4个按钮和TFT显示屏等 - 集成了完整的ARM-Linux系统以进行高级开发 - 无线连接能力(Wi-Fi + 蓝牙) - 具有m.2接口可以轻松设计您的底板 - 广泛的应用场景,例如个人服务器,智能语音助手和机器人开发等 - USB Type-C功能:带USB-TTL可以直接用于串口登录终端 ### 规格参数 ## 1、镜像烧录 下载制作好的系统镜像:https://files.seeedstudio.com/wiki/Quantum-Mini-Linux-Dev-Kit/quark-n-21-1-11.zip 烧录到内存卡中: ## 2、上电启动: [localvideo]c0eca37260db4d353973111245ee1909[/localvideo] 配置一下wifi ```c nmcli dev wifi connect "SSID" password "PASSWORD" ifname wlan0 ``` ssh登录 ## 3、系统升级 从Ubuntu 16.04 升级到Ubuntu 18.04 LTS: ```c sudo apt-get update sudo apt-get upgrade sudo apt-get autoremove sudo apt dist-upgrade sudo apt-get install update-manager-core sudo do-release-upgrade /* 升级过程中遇到的问题 提示 “Your python3 install is corrupted. Please fix the ‘/usr/bin/python3’ symlink.”,执行如下命令: sudo ln -sf /usr/bin/python2.7 /usr/bin/python sudo ln -sf /usr/bin/python3.5 /usr/bin/python3 */ ```

  • 2024-06-30
  • 加入了学习《【DigiKey创意大赛】多通道微型气相色谱采集单元》,观看 多通道微型气相色谱采集单元

  • 2024-05-24
  • 加入了学习《【得捷电子Follow me第2期】任务总结视频》,观看 【得捷电子Follow me第2期】总结视频

  • 2024-05-20
  • 加入了学习《【DigiKey“智造万物,快乐不停”创意大赛】-简易电流源演示》,观看 【DigiKey“智造万物,快乐不停”创意大赛】-简易电流源演示

  • 2024-03-15
  • 回复了主题帖: 【Luckfox幸狐 RV1103】五、三麦克拉姆轮底盘控制(python)

    极限零 发表于 2024-3-14 15:02 3个三麦克拉姆轮底盘的控制那不是比4轮的还麻烦? 是麻烦一点,个人学习一下

  • 回复了主题帖: 【Luckfox幸狐 RV1103】五、三麦克拉姆轮底盘控制(python)

    freebsder 发表于 2024-3-14 15:17 这么小?没看到主芯片呢 图片上有的嘞,确实比较小一点。

  • 回复了主题帖: 【Luckfox幸狐 RV1103】五、三麦克拉姆轮底盘控制(python)

    lugl4313820 发表于 2024-3-14 09:59 仔细学习了一下,你这是用RV1103做主控吧,这样的实时性如何? 简单测试了下响应很快,基本无感哦,但是cpu占用比较高,只能完成简单的底盘控制了。

  • 2024-03-11
  • 加入了学习《【得捷电子Follow me第2期】任务总结视频》,观看 【得捷电子Follow me第2期】按键切换灯

  • 发表了主题帖: 【Luckfox幸狐 RV1103】五、三麦克拉姆轮底盘控制(python)

    # 【Luckfox幸狐 RV1103】五、三麦克拉姆轮底盘控制(python) 本次对Luckfox幸狐 RV1103的试用报告,自该帖后就告一段落了,后续有时间再做更新。 ## 1、Luckfox幸狐 RV1103介绍 Luckfox Pico Mini 是一款基于瑞芯微 RV1103 芯片具有高性价比的微型 Linux 开发板,旨在为开发者提供一个简单且高效的开发平台;支持多种接口,包括 MIPI CSI、GPIO、UART、SPI、I2C、USB 等,便于快速开发和调试开发板支持 buildroot 和 Ubuntu22.04系统,让开发者根据项目需求选择合适的系统,更灵活满足特定应用要求。 RV1103 是一款专门用于人工智能相关应用的高度集成 IPC 视觉处理器 SoC。它基于单核 ARM Cortex-A7 32 位内核,集成了 NEON 和 FPU,并内置 NPU 支持 INT4 / INT8 / INT16 混合运算,计算能力高达 0.5TOPs。此外,它采用了全新的基于硬件的 ISP,支持多种算法加速器,如 HDR、3A、LSC、3DNR、2DNR、锐化、去雾、伽马校正等。同时,它还具有内置的16位DRAM DDR2,可维持要求苛刻的内存带宽,以及内置的 POR,音频编解码器和 MAC PHY。总之,RV1103 是一款功能强大的处理器,适用于各种人工智能应用场景。 ## 2、项目介绍 由于开发板资源有限,暂实现部分功能:通过Luckfox幸狐 RV1103实现三麦克拉姆轮底盘的控制:速度控制,速度反馈,里程计算。 ### 详细设计 ### 1. 硬件准备 ### 2. 架构设计 ### 3. 程序流程 ### 4. 程序 Luckfox幸狐 RV1103上创建chassis.py 具体代码如下: ```python import serial import struct import time import threading import math R = 3.9/100.0 Wheelbase = 0.096457 odom_X=0 odom_Y=0 odom_TH=0 data0, data1, data2, data3 = 0, 0, 0, 0 read_data_rpm = [] def deg2rad(degrees):     return degrees * math.pi / 180.0     def speed2rpm(speed):     return speed * 60.0 / (math.pi * R)     def rpm2speed(rpm):     return rpm * math.pi * R / 60.0 class ModbusRTU:     def __init__(self, port, baudrate=115200, bytesize=8, parity='N', stopbits=1, timeout=0.1):         self.port = port         self.baudrate = baudrate         self.bytesize = bytesize         self.parity = parity         self.stopbits = stopbits         self.timeout = timeout         self.serial_port = None     def open(self):         self.serial_port = serial.Serial(             port=self.port,             baudrate=self.baudrate,             bytesize=self.bytesize,             parity=self.parity,             stopbits=self.stopbits,             timeout=self.timeout         )     def close(self):         if self.serial_port and self.serial_port.is_open:             self.serial_port.close()     def __enter__(self):         self.open()         return self     def __exit__(self, exc_type, exc_value, traceback):         self.close()     def build_read_registers_command(self, slave_address, register_address, register_count):         command = struct.pack('>BBHH', slave_address, 0x04, register_address, register_count)         crc = self.calculate_crc(command)         command_with_crc = command + struct.pack('' + 'H' * len(values), *values)         command = struct.pack('>BBHHBHHH', slave_address, 0x10, register_address, len(values),len(values) * 2, *values)         crc = self.calculate_crc(command)         command_with_crc = command + struct.pack('BBB', response[:3])             data = response[3:-2]             values = struct.unpack('>' + 'H' * (len(data) // 2), data)             return values         else:             raise Exception("Invalid Modbus response")     def read_registers(self, slave_address, register_address, register_count):         try:             command = self.build_read_registers_command(slave_address, register_address, register_count)             response = self.modbus_request(command)             values = self.parse_modbus_response(response)             return values         except Exception as e:             print(f"Error: {e}")             return None     def modbus_write_registers(self, slave_address, register_address, values):         try:             command = self.build_write_registers_command(slave_address, register_address, values)             response = self.modbus_request(command)             return True         except Exception as e:             print(f"Error: {e}")             return False     def calculate_crc(self, data):         crc = 0xFFFF         for byte in data:             crc ^= byte             for _ in range(8):                 if crc & 0x0001:                     crc >>= 1                     crc ^= 0xA001                 else:                     crc >>= 1         return crc          # 共享变量,用于存储速度数据 speed_data_lock = threading.Lock() key_speed = (0, 0, 0) # 键盘输入线程,用于读取键盘输入并设置速度 def keyboard_input_thread():     global key_speed     while True:         key = input("Enter speed values (w/a/s/d to move, space to reset, or exit to quit): ")         if key.lower() == 'exit':             sys.exit()         try:             with speed_data_lock:                 vx, vy, vw = key_speed                 if key.lower() == 'w':                     vx += 0.1                 elif key.lower() == 'a':                     vy -= 0.1                 elif key.lower() == 's':                     vx -= 0.1                 elif key.lower() == 'd':                     vy += 0.1                 elif key.lower() == 'q':                     vw += 0.1                                elif key.lower() == 'e':                     vw -= 0.1                 elif key.lower() == ' ':                     vx = vy = vw = 0  # 清零所有速度                 key_speed = (vx, vy, vw)         except ValueError:             print("Invalid input. Please enter integers for vx, vy, and vw.")                           class WheelSpeed:     def __init__(self, left=0, right=0, rear=0):         self.left = left         self.right = right         self.rear = rear     def __repr__(self):         return f"WheelSpeed(left={self.left}, right={self.right}, rear={self.rear})"          # 主程序 with ModbusRTU('/dev/ttyS3') as modbus_device:     # 启动键盘输入线程     keyboard_thread = threading.Thread(target=keyboard_input_thread, daemon=True)     keyboard_thread.start()     try:         start_time =0         while True:                          # 1,根据三轮模型做速度分解             moto1_speed = key_speed[0] * math.cos(deg2rad(90)) + key_speed[1] + key_speed[2] * Wheelbase             moto2_speed = -key_speed[0] * math.cos(deg2rad(30)) - key_speed[1] * math.cos(deg2rad(60)) + key_speed[2]  * Wheelbase             moto3_speed = key_speed[0] * math.cos(deg2rad(30)) - key_speed[1] * math.cos(deg2rad(60)) + key_speed[2]  * Wheelbase                          # 2,速度转rpm             moto1_rpm = speed2rpm(moto1_speed)             moto2_rpm = speed2rpm(moto2_speed)             moto3_rpm = speed2rpm(moto3_speed)             # 3,写入保持寄存器             set_rpm = (int(moto1_rpm) & 0xFFFF, int(moto2_rpm) & 0xFFFF, int(moto3_rpm) & 0xFFFF)             print(f"set_rmp:{set_rpm}")             write_register_address = 0x0000             modbus_device.modbus_write_registers(slave_address=1, register_address=write_register_address, values=set_rpm)             # 4,读取保持寄存器的值             read_register_address = 0x0000             register_count = 4             read_values = modbus_device.read_registers(slave_address=1, register_address=read_register_address, register_count=register_count)                          if read_values is not None:                 data0,data1,data2,data3 = read_values                 #print(f"Read values from register {read_register_address}: {read_values}")             else:                 print("Failed to read values from Modbus.")                                      #print(f"read_values0: {data0}, read1: {data1}, read2: {data2}")                          # 5,解析速度             moto1_cur_rpm = data0             moto2_cur_rpm = data1             moto3_cur_rpm = data2             print(f"cur_rpm:{moto1_cur_rpm}, {moto2_cur_rpm}, {moto2_cur_rpm}")                          moto1_cur_speed = rpm2speed(moto1_cur_rpm)             moto2_cur_speed = rpm2speed(moto2_cur_rpm)             moto3_cur_speed = rpm2speed(moto3_cur_rpm)                          # 6,里程计算             end_time = time.time()                      # 记录程序结束时间             duration_ms = (end_time - start_time) * 1000   # 计算程序运行时长ms             #print(f"程序运行时长: {duration_ms:.2f} 毫秒")       # 打印程序运行时长                start_time = time.time()             delta_moto1 = moto1_cur_speed * duration_ms             delta_moto2 = moto2_cur_speed * duration_ms             delta_moto3 = moto3_cur_speed * duration_ms                          delta_x = (delta_moto3-delta_moto2)/(2*math.cos(deg2rad(30)))             delta_y = (2*delta_moto1-delta_moto2-delta_moto3)/3             delta_th = (delta_moto1 + delta_moto2 + delta_moto3) / Wheelbase / 3                          # 质点实际速度vx,vy,vw             cur_speed_vx = delta_x/duration_ms             cur_speed_vy = delta_y/duration_ms             cur_speed_vw = delta_th/duration_ms             print(f"set_speed Vx: {key_speed[0]:.2f}, Vy: {key_speed[1]:.2f}, Vw: {key_speed[2]:.2f}")             print(f"cur_speed VX: {cur_speed_vx:.2f}, Vy: {cur_speed_vy:.2f}, Vw: {cur_speed_vw:.2f}")                          #odom             odom_X += delta_x/1000             odom_Y += delta_y/1000             odom_TH += delta_th/1000             print(f"Odom X: {odom_X:.2f}, Y: {odom_Y:.2f}, TH: {odom_TH:.2f}")             time.sleep(1)     except KeyboardInterrupt:         pass ``` ### 5. 实现功能 该代码主要实现: 1、键盘输入检测计算Vx,Vy,Vw 2、速度解算 3、组包,发包 4、实际速度解算 5、里程计算 ### 6. 键盘控制功能 | 功能  | 按键  |  值变化 | | ------------ | ------------ | ------------ | | 前进  |  w |  vx增加 | | 后退  | s  | vx减小  | | 左转  |  q | vw增加  | |  右转 |  e |  vw减小 | | 左横移  | a  | vy增加  | | 右横移  | d  | vy减小  | | 刹车  | 空格  | 全部归0  | ### 7. 速度解算示意图 向上为Vx正方向,向左为Vy正方向。轮子逆时针编号1,2,3 ### 8. stm32 在stm32使用freertos系统,创建3个任务。 task1:实现固定时长闪烁的心跳灯。 task2:接收Luckfox幸狐 RV1103下发的速度数据并解析。 task3:电机速度pid控制及实时转速反馈。 接线定义如下: ### 9. stm32代码 https://gitee.com/FFD8/STM32F100RBT_robot.git ### 10. 功能演示 Luckfox幸狐 RV1103端,运行python3 chassis.py程序。通过键盘输入设置下发的速度 [localvideo]e992d0aac21dd5f74b372e406413fa42[/localvideo] 实车视频: 演示视频中,通过q、e键控制Vw,实现原地旋转功能,后续逐渐增加Vw的值,可以看到实际转速有明显提升,按下空格键,速度马上清0. [localvideo]9971bb5b1287df257f3f1c7d76ee950c[/localvideo] ## 3、总结 基于Luckfox幸狐 RV1103顺利完成了对于底盘的控制,使用python快速有效的完成既定任务。 再次感谢Luckfox幸狐 RV1103和eeworld的支持。

  • 2024-03-08
  • 发表了主题帖: 【Luckfox幸狐 RV1103】四、基础外设测试-uart(python)

    本帖最后由 FFD8 于 2024-3-8 10:56 编辑 # 【Luckfox幸狐 RV1103】四、基础外设测试-uart(python) 参考教程:https://wiki.luckfox.com/zh/Luckfox-Pico/Luckfox-Pico-UART Luckfox幸狐 RV1103引脚图: ## 1、设备目录: 在 /dev 目录中,每个 UART 设备都有其自己的目录。这些目录的名称是 ttyS 加上串口号,例如 /dev/ttyS3 表示 UART3。可使用如下命令查看:ls /dev/ttyS* ## 2、配置串口: ### 1. 用stty工具查询其通信参数: ```c stty -F /dev/ttyS3 ``` ### 2. 修改波特率,其中ispeed为输入速率,ospeed为输出速率: ```c stty -F /dev/ttyS3 ispeed 115200 ospeed 115200 ``` ### 3. 关闭回显: ```c stty -F /dev/ttyS3 -echo ``` ## 3、python代码 代码的具体含义已经在程序中加好了注释: ```python import serial import time # 使用with语句创建一个串口对象,确保在使用完成后正确关闭串口,以释放资源 with serial.Serial(     "/dev/ttyS3",                  # 指定串口设备路径     baudrate=115200,                # 波特率设置为115200     bytesize=serial.EIGHTBITS,      # 数据位设置为8位     stopbits=serial.STOPBITS_ONE,   # 停止位设置为1位     parity=serial.PARITY_NONE,      # 无奇偶校验     timeout=1,                      # 设置超时时间为1秒 ) as uart3:     try:         # 循环执行发送和接收         while True:             # 向串口写入数据             uart3.write(b"Hello World!\n")             # 从串口读取最多128字节的数据             buf = uart3.read(128)             # 打印原始二进制数据             print("Raw data:\n", buf)             # 将二进制数据解码为UTF-8字符串             data_strings = buf.decode("utf-8")             # 打印读取的字节数和以字符串形式打印的数据             print("Read {:d} bytes, printed as string:\n {:s}".format(len(buf), data_strings))             # 等待1秒             time.sleep(1)     except KeyboardInterrupt:         # 捕捉键盘中断异常,用于在用户按下Ctrl+C时退出循环         pass ``` 这个代码段实现了一个简单的串口读写操作。通过循环不断读写串口数据并打印出读到的信息。 ## 4、运行程序 创建py程序:nano uart.py 将代码拷贝到py中并保存 运行程序:python3 uart.py 使用usb-ttl模块,连接rv1103的uart3,打开PC的串口助手。(或者可以直接将RxTx短接即可,视频演示的为短接情况) 结果展示: [localvideo]bab4bd8d37b12e53f2537c5637ac8ef7[/localvideo] 运行结果看程序符合预期表现。

  • 2024-02-29
  • 发表了主题帖: 【Luckfox幸狐 RV1103】三、基础外设测试-PWM(python)

    本帖最后由 FFD8 于 2024-2-29 10:34 编辑 # 【Luckfox幸狐 RV1103】三、基础外设测试-PWM(python) 参考教程:https://wiki.luckfox.com/zh/Luckfox-Pico/Luckfox-Pico-PWM Luckfox幸狐 RV1103引脚图: 1、设备目录: 在 /sys/class/pwm/ 目录中,每个 PWM 设备都有一个独立的子目录,其名称通常以 pwmchipX 的形式命名,其中 X 是 PWM 设备的编号。可使用如下命令查看:# ls -l /sys/class/pwm 2、设备属性: 在成功导出 PWM 的一个通道后,会在该 PWM 的设备目录下生成单个通道的目录,其中有这个通道对应的属性文件,用户可以通过修改这些文件的内容来配置和控制特定 PWM 通道的各个参数,以实现对 PWM 信号的精确控制。这提供了一个方便的接口,使用户能够与 PWM 硬件进行交互并调整 PWM 信号的特性。 1. 查看PWM10单个通道的属性文件 ```xml ls /sys/class/pwm/pwmchip10/pwm0/ uevent       capture      duty_cycle   output_type polarity     enable       power        period ``` 2. 属性文件 通过使用这些属性文件,您可以轻松地配置和控制 PWM 通道,使其适应不同的应用场景和需求。其中一些关键的属性如下:   - enable:用于启用或禁用PWM通道。   - period:用于设置PWM信号的周期时间。   - duty_cycle:用于设置PWM信号的占空比。   - polarity:用于配置PWM信号的极性。   - power/control:用于启用或禁用PWM通道的电源管理(通常用于省电模式)。 3. 控制PWM:将PWM10_M1(GPIO1_C6_d) 3、python代码 代码的具体含义已经在程序中加好了注释: ```python from periphery import PWM import time # 初始化PWM对象,指定通道号(10)和子通道号(0) pwm = PWM(10, 0) try:     # 设置PWM的频率、初始占空比和极性     pwm.frequency = 1000     pwm.duty_cycle = 0     pwm.polarity = "normal"     # 启用PWM输出     pwm.enable()     # 控制方向的变量     direction = 1     # 无限循环     while True:         # 逐步增加或减小PWM占空比         pwm.duty_cycle += 0.01 * direction         pwm.duty_cycle = round(pwm.duty_cycle, 2)         # 当占空比达到1.0时,反向运动;当占空比达到0.0时,正向运动。         if pwm.duty_cycle == 1.0:             direction = -1         elif pwm.duty_cycle == 0.0:             direction = 1         print(f"pwm.duty_cycle: {pwm.duty_cycle}")         # 等待一段时间         time.sleep(0.05) except KeyboardInterrupt:     # 捕捉键盘中断异常,用于在用户按下Ctrl+C时退出循环     pass finally:     # 最终关闭PWM对象以释放资源     pwm.close() ``` 这个代码段实现了一个简单的 PWM 输出。通过循环不断调整 PWM 的占空比,以实现呼吸灯效果。 4、运行程序 创建py程序:nano pwm.py 将代码拷贝到py中并保存 运行程序:python3 pwm.py 结果展示: 程序运行录屏: [localvideo]f71f4e88892bda9bcbba51bc52ccae60[/localvideo] 呼吸灯效果: [localvideo]4394e2001338d85c2ed1dd437a6c8ec5[/localvideo] 运行结果看程序符合预期表现。

  • 回复了主题帖: 【Luckfox幸狐 RV1103】二、基础外设测试-gpio(python)

    Jacktang 发表于 2024-2-29 07:48 结果看程序符合预期表现

  • 2024-02-28
  • 发表了主题帖: 【Luckfox幸狐 RV1103】二、基础外设测试-gpio(python)

    本帖最后由 FFD8 于 2024-2-29 10:14 编辑 # 【Luckfox幸狐 RV1103】二、基础外设测试-gpio(python) 参考教程:https://wiki.luckfox.com/zh/Luckfox-Pico/Luckfox-Pico-GPIO Luckfox幸狐 RV1103引脚图: ## 1、设备目录: 在 /sys/class/gpio 目录中,每个 GPIO 设备都有其自己的文件夹。这些文件夹的名称是 gpio 加上引脚编号,例如 /sys/class/gpio/gpio55 表示引脚编号为 55 的引脚,即 GPIO1_C7_d。 使用如下命令查看:ls /sys/class/gpio/ ## 2、设备属性: 在这些设备目录中,您还可以找到与 GPIO 引脚相关的控制文件,包括方向、值和中断等。每个GPIO设备目录中都包含一组属性文件,这些属性文件用于配置和管理GPIO引脚。您可以在GPIO设备目录中使用如下命令查看: ### 1. 查看gpio55设备的属性文件 ```xml # echo 55 > /sys/class/gpio/export # cd gpio55 # ls value       power       subsystem   active_low uevent      edge        device      direction ``` ### 2. 属性文件 通过使用这些属性文件,您可以轻松地配置和控制GPIO引脚,使其适应不同的应用场景和需求。其中一些关键的属性包括:   - 方向(direction):     - 配置为输入:in     - 配置为输出:out   - 值(value):     - 输出低电平:0     - 输出高电平:1   - 中断边沿(edge):     - 上升沿触发:rising     - 下降沿触发:falling     - 双边沿触发:both     - 禁用中断:none         ### 3. 控制GPIO引脚电平 设备的属性文件就相当于一个函数的参数接口。对于 /sys/class/gpio/gpio55/value ,每次对文件执行写入操作时,会触发驱动代码,使用这次写入的内容作为参数来修改 gpio55 的引脚电平;而每次读取操作时,则触发驱动代码将当前 gpio55 的引脚电平更新到 /sys/class/gpio/gpio55/value 文件。 ## 3、python代码 程序通过控制55,54两个引脚实现输入,输出控制。根据引脚图找到这两个引脚。 ```python from periphery import GPIO import time Write_Pin = 55   Read_Pin = 54    Write_GPIO = GPIO(Write_Pin, "out") Read_GPIO = GPIO(Read_Pin, "in") try:     while True:         try:             Write_GPIO.write(True)             pin_state = Read_GPIO.read()             print(f"Pin state: {pin_state}")             Write_GPIO.write(False)             pin_state = Read_GPIO.read()             print(f"Pin state: {pin_state}")             time.sleep(1)         except KeyboardInterrupt:             Write_GPIO.write(False)             break except IOError:     print("Error") finally:     Write_GPIO.close()     Read_GPIO.close() ``` 初始化设置55引脚为输出口,54引脚为输入口; 程序循环设置55引脚先拉高,再拉低,同时54引脚不断读电平数据。 ## 4、运行程序 创建py程序:nano gpio.py 将代码拷贝到py中并保存 运行程序:python3 gpio.py 结果展示:可以看到程序打印出了54引脚的电平值,刚开始一直是false,中途将55和54短接,电平值发生了变化,一高一低;后面断开后又恢复到false,再短接后重复一高一低状态。 运行结果看程序符合预期表现。 [localvideo]6473d1d12619c14aee3f2b73e42e034e[/localvideo]

  • 2024-01-24
  • 发表了主题帖: 【Luckfox幸狐 RV1103】一、环境配置

    # 【Luckfox幸狐 RV1103】一、环境配置 *测评型号:Luckfox Pico Mini B 测评时间:1月25日-3月20日 测评要求 收到开发板后,请在EEWorld 国产芯片交流版块 自拟标题发表测评报告。每周至少提交一篇测评报告,测评报告要求100%原创首发,抄袭会被封杀哦。评测报告可包含: 1、开箱评测(从功能特性、系统框图、硬件资源、做工、软件资源、功能演示等方面评测); 2、各个功能模块/Demo测试过程、结果,经验总结;开发过程中的遇到的问题及探索出的解决方案; 3、学习/入门过程连载; 4、完成小制作的流程、经验分享,关键代码分析等; 5、测评总结和对厂商的建议等 Luckfox Pico Mini 是一款基于瑞芯微 RV1103 芯片具有高性价比的微型 Linux 开发板,旨在为开发者提供一个简单且高效的开发平台;支持多种接口,包括 MIPI CSI、GPIO、UART、SPI、I2C、USB 等,便于快速开发和调试开发板支持 buildroot 和 Ubuntu22.04系统,让开发者根据项目需求选择合适的系统,更灵活满足特定应用要求。 RV1103 是一款专门用于人工智能相关应用的高度集成 IPC 视觉处理器 SoC。它基于单核 ARM Cortex-A7 32 位内核,集成了 NEON 和 FPU,并内置 NPU 支持 INT4 / INT8 / INT16 混合运算,计算能力高达 0.5TOPs。此外,它采用了全新的基于硬件的 ISP,支持多种算法加速器,如 HDR、3A、LSC、3DNR、2DNR、锐化、去雾、伽马校正等。同时,它还具有内置的16位DRAM DDR2,可维持要求苛刻的内存带宽,以及内置的 POR,音频编解码器和 MAC PHY。总之,RV1103 是一款功能强大的处理器,适用于各种人工智能应用场景。* ## 1、本地环境 ## 2、TF卡 ## 3、Luckfox Pico Mini B ## 4、产品参数 ## 5、环境配置 参考教程:Luckfox Pico上手教程https://bbs.eeworld.com.cn/elecplay.php?action=show&op=download&id=324&did=1 LuckFox Pico Mini B开发板自带的 SPI NAND FLASH,可以把系统直接烧录到flash中,也可以将系统烧录到外置tf卡来使用。 以下使用外置tf卡来演示: 1、下载烧录工具https://files.luckfox.com/wiki/Luckfox-Pico/Software/SocToolKit.zip 2、根据教程在tf中烧录镜像 3、擦除flash 4、将tf卡安装到LuckFox Pico Mini B,使用type-c连接线给板子供电及提供通行。 5、板子可以连接usb-tty串口转换设备来查看系统启动过程 [localvideo]fe2a29b773aea1581c5b6037f845071a[/localvideo] 6、也可以使用USB 虚拟网卡ssh登录。 板子有静态 IP 地址为172.32.0.70。在使用之前,需要设置RNDIS虚拟网口。参照以下步骤设置静态ip 7、ssh连接登录: # 产品资料 Luckfox Pico上手教程 Luckfox Pico 原理图.7z Rockchip RV1103 Datasheet V1.1-20220427.pdf ## SDK: https://github.com/LuckfoxTECH/luckfox-pico https://gitee.com/LuckfoxTECH/luckfox-pico

  • 2024-01-18
  • 回复了主题帖: 测评入围名单: Luckfox幸狐 RV1103 Linux 开发板

    个人信息无误,确认可以完成评测计划

最近访客

< 1/2 >

统计信息

已有28人来访过

  • 芯积分:134
  • 好友:1
  • 主题:10
  • 回复:7

留言

你需要登录后才可以留言 登录 | 注册


现在还没有留言