我们总是需要让舵机去转动一定的角度,执行对应的动作。

文章目录

  • 前提:
    • 1.动作文件
    • 2.支持文件
  • 一、舵机运行代码
  • 二、测试

这一部分在Serial_Servo_Running文件里

前提:

因为这一部分需要运行动作组,所以需要动作文件和支持文件

1.动作文件

2.支持文件

需要将下面的文件拷贝到当前目录

一、舵机运行代码

# 串口舵机运行 动作组调用#!/usr/bin/env python3
# encoding: utf-8
import time # 时间模块
import os  # 系统OS
import sqlite3 as sql  # 数据库
import SerialServoCmd as ssc # 串口舵机命令
import config_serial_servo # 配置串口舵机
import threading  # 线程
from hwax import HWAX # 未知 驱动动作组的 不可缺少,文件夹有一个HWAX.so文件runningAction = False   # 运行动作组不成立
stopRunning = False  # 停止运行不成立
online_action_num = None   # 动作组编号为空
online_action_times = -1 # 执行时间为空载
update_ok = False # 更新动作组不成立
action_group_finish = True # 动作组完成成立# 设置串口舵机的位置和时间
# 时间参数意义:舵机在参数时间内从当前角度匀速转动到参数角度
# s_id:要设置的舵机  pos:0-1000 对应角度 0-240度 s_time:时间0-30000ms  0-30s
def serial_setServo(s_id, pos, s_time):if pos > 1000:  # 最大位置是1000 对应角度0-240pos = 1000elif pos < 0:pos = 0else:passif s_time > 30000:  # 最大时间是30000ms = 30ss_time = 30000elif s_time < 10:  # 最小时间是10mss_time = 10ssc.serial_serro_wirte_cmd(s_id, ssc.LOBOT_SERVO_MOVE_TIME_WRITE, pos, s_time)# 设置舵机偏差值
# servoId:要设置的舵机  d:偏差值
def setDeviation(servoId, d):global runningAction  # 全局变量if servoId < 1 or servoId > 16:  # 舵机号的范围 1-16个舵机returnif d < -200 or d > 200: # 偏差值的范围returnif runningAction is False: # 如果当前不在运行状态就设置偏差值config_serial_servo.serial_servo_set_deviation(servoId, d)# 停止全部舵机
def stop_servo():for i in range(16): config_serial_servo.serial_servo_stop(i+1)  # 依次让每一个舵机都停止# 停止动作组
def stop_action_group():global stopRunning, online_action_num, online_action_times, update_okupdate_ok = False  # 更新ok不成立stopRunning = True  # 停止运行成立online_action_num = None # 动作组的编号为空online_action_times = -1 # 动作组的次数为空载状态time.sleep(0.1) # 延时100ms# 获取动作完成标志
def action_finish():global action_group_finish return action_group_finish #获取动作组完成标志# 运行动作组,无法发送停止信号
# actNum:动作组的名字,字符串类型
def runAction(actNum):global runningAction  # 运行动作组global stopRunning  # 停止运行global online_action_times # 运行动作组次数if actNum is None: # 动作名字为空return# 判断动作组的类型hwaxNum = "/home/pi/Desktop/Serial_SteerEngine/ActionGroups/" + actNum + ".hwax" # 获取动作组的路径actNum = "/home/pi/Desktop/Serial_SteerEngine/ActionGroups/" + actNum + ".d6a"if os.path.exists(hwaxNum) is True:  # hwax路径存在if runningAction is False: # 如果当前舵机不在运行状态 runningAction = True  # 设置舵机正在运行ssc.portWrite()  # 端口复位hwax = HWAX(hwaxNum, ssc.serialHandle)hwax.reset()while True:if stopRunning is True: # 如果是停止运行stopRunning = Falseprint('stop')    # 输入提示信息               breakret = hwax.next()if ret is None:hwax.reset()breakhwax.close() # 关闭这个文件runningAction = Falseelif os.path.exists(actNum) is True: # d6a路径存在if runningAction is False:runningAction = Trueag = sql.connect(actNum) # 连接数据库# 游标就像您打开文件所得到的文件句柄一样,只要文件打开成功, #该文件句柄就可代表该文件cu = ag.cursor() # 获取数据库可操作对象'''使用Cursor对象执行insert,update,delete语句时,执行结果由rowcount返回影响的行数,就可以拿到执行结果使用Cursor对象执行select语句时,通过featchall()返回select的全部数据结果集。结果集是一个list,每个元素都是一个tuple,对应一行记录,按建表的字段顺序排列。fetchone()返回一条结果,是一个tuple,每个元素是一个字段值。'''cu.execute("select * from ActionGroup") # 从ActionGroup查找全部数据while True:act = cu.fetchone() # 获取一条查询的结果if stopRunning is True: # 如果是停止运行stopRunning = False print('stop')      # 输入提示信息               breakif act is not None: # 查询到数据# 设置每一个舵机的act[2 + i]位置act[1]运行时间for i in range(0, len(act)-2, 1): # len(act)-2 : 第一个是 第二个是运行时间serial_setServo(i+1, act[2 + i], act[1]) # ID 位置 时间time.sleep(float(act[1])/1000.0) # 转换为秒else:   #  没有查找到数据breakrunningAction = False  # 运行状态停止cu.close() # 关闭游标ag.close() # 关闭数据库连接else: # 路径不存在runningAction = Falseprint("未能找到动作组文件")# 线程运行动作
def online_thread_run_acting():global online_action_times, online_action_num, update_ok, action_group_finishwhile True:  # 在线程里  死循环if update_ok: # 更新ok 就是说动作组有变化if online_action_times == 0: # 如果在线动作次数等于0,执行无限次# 无限次运行if action_group_finish: # 动作还在执行中,不允许动作发生改变action_group_finish = FalserunAction(online_action_num)   # 运行  online_action_num 动作            elif online_action_times > 0: # 如果在线动作次数大于0,执行online_action_times次# 有次数运行if action_group_finish: # 动作还在执行中,不允许动作发生改变action_group_finish = FalserunAction(online_action_num) # 运行  online_action_num 动作  online_action_times -= 1     # 运行次数减一次             if online_action_times == 0:online_action_times = -1  # 运行完成后,进入空载 else:# 空载if not action_group_finish: # 如果动作组没有完成action_group_finish = True # 动作组完成time.sleep(0.001) # 延时1mselse: # 更新不ok 没有动作发生变化# 查看上一次动作是否完成if not action_group_finish:  # 如果动作组没有完成action_group_finish = True # 动作组完成time.sleep(0.001) # 延时1ms# 开始动作线程
def start_action_thread():th1 = threading.Thread(target=online_thread_run_acting) # 运行动作组th1.setDaemon(True)  # 设置为后台线程,这里默认是Trueth1.start()# 改变动作组的值
# actNum:动作名 actTimes:运行次数
def change_action_value(actNum, actTimes):global online_action_times, online_action_num, update_ok, stopRunning, action_group_finish# 动作组都完成了之后才能允许动作发生改变if action_group_finish: # 如果动作组完成了online_action_times = actTimes # 动作执行的次数 online_action_num = actNum # 执行动作组的编号stopRunning = False  # 停止运行不成立update_ok = True # 更新ok成立# 单独执行的时候运行
if __name__ == '__main__':# 开启动作组线程,update_ok =True 就运行动作start_action_thread() # 开启一个动作组的线程# 动作一改变 update_ok =True 就会运行动作change_action_value('1', 0) # 改变动作   运行动作1,执行无限次time.sleep(2) # 延时2sstop_action_group() # 停止动作组

二、测试


舵机会执行动作,2s后停止。

串口总线舵机之舵机运行相关推荐

  1. 舵机任意角度程序_真香!!!飞特发布性价比超高的19kg磁编码360°双轴串口总线舵机STS3215...

    2020年4月6日,深圳飞特模型有限公司发布了2020年新款磁编码版本的TTL串口总线舵机.这款舵机是基于SCS215电位器版本开发的更高性能的磁编码版本,不仅具备了飞特SM高端系列的高性价比功能,又 ...

  2. 串口总线舵机之socket网络指令

    我们如何通过外部去控制树莓派串口总线舵机和PWM舵机. 网络无疑是一个很好的选择. 这一部分是在lsc.py文件中 关于socketserver部分参考 socketserver 文章目录 调试工具 ...

  3. 51单片机控制舵机,舵机不动的定时器原因

    舵机: 红色:VCC 棕色:GND 黄色:PWM 这是定时器0初始化: unsigned cha count = 0; unsigned char timer1 ;void Timer1_Init() ...

  4. arduino控制小车转向_舵机和舵机控制板

    在很多项目中需要用到舵机.比如机器人,伺服系统等方面.步进电机是可以设定转过多少角度,而舵机是可以设定转到的位置,可以说是指哪打哪,Arduino智能小车的前轮转弯系统便是用的这种原理,在工业上机器人 ...

  5. 舵机就是舵机,可不是步进!

    转自:http://www.360doc.com/content/16/0902/11/1286300_587730834.shtml 是否有人, 从前以为舵机是步进电机的? PCB哥知道,从前一定有 ...

  6. 全双工串口、半双工串口总线及其转换

    全双工串口.半双工串口总线及其转换 前言 全双工串口 半双工串口总线 两者转换 软硬件配合方案 纯电路方案 前言 这是本人在接触串口总线时的一些总结,希望能对大家有所帮助,若有谬误之处,恳请各位指正. ...

  7. 学习 stm32(TTL)串口通信控制16路舵机控制板(维特智能)

    学习STM32Core平台串口2连接维特智能串口Normal协议,然后通过串口1直接连接舵机控制板(TTL),接收进行通信:需要看产品文档的可以直接官网搜索文档. 16路舵机控制板官方产品网址 在查看 ...

  8. 小车舵机控制linux软件,在Linux(Ubuntu)上使用串口控制ROBOTIS Dynamxiel舵机

    声明:此文档版权归属于北京小芽科技,可以转载,但要声明出处(北京小芽科技博客xiaoyatec.com) 硬件配置: 1.USB2Dynamixel串口模块 2.SMPS2Dynamixel电源模块 ...

  9. STM32+DMA串口+RC信号控制舵机

    文章目录 前言 一.RC遥控器PWM信号 二.关于舵机 三.STM32串口DMA 四.CUBEMX配置设置 五.串口+DMA通讯 六.PWM输出 七.串口控制舵机 八.通讯测试 九.PWM输出测试 十 ...

  10. micropython esp32驱动舵机_PCA9685舵机控制板与MicroPython-ESP32-1Z实验室

    概要 阿凯在本文中讲解了如何使用MicroPython-ESP32通过PCA9685模块控制舵机旋转角度.同时也涉及到了MicroPython-ESP32的I2C资源与API讲解. 出品:1Z实验室 ...

最新文章

  1. 太难了!开源项目如何商业化?
  2. java odbc dbf,什么是Java的最佳开源dbf驱动程序?
  3. Linux shell逻辑运算
  4. mybatis简单案例源码详细【注释全面】——Utils层(MybatisUtils.java)
  5. 英特尔贡献基于 Kubernetes 分布式深度学习平台:Nauta
  6. Ubuntu 16.04服务器 软件的安装及配置
  7. effective c++ 跨编译单元之初始化次序 笔记
  8. 11个编程接单的网站,你有技术就有收入,有收入就有女朋友《男盆友》
  9. Vue项目实战篇一:实现一个完整的留言板(带前后端源码下载)
  10. python case用法_Python Switch Case三种实现方法代码实例
  11. sublime 前端css 插件
  12. ASP.NET清除Cookies
  13. vue底部跳转_Vue实现回到顶部和底部动画效果
  14. 猿编程python_猿编程下载-猿编程客户端 v2.12.0.1103 官方版 - 安下载
  15. 地理坐标的六边形编码(PHXIS)
  16. JSFL 批量转化fla脚本文件
  17. 可擦写光盘不能擦除和刻写_哪种更适合?三种可擦写刻录盘方案PK
  18. MySQL用户创建及赋权
  19. python编程实现文本分词_Python:徒手创建分词函数
  20. matlab区域法直线度,用最小区域法求直线度误差的探讨

热门文章

  1. 基于R语言的分位数回归(quantile regression)
  2. 红外接收二极管为什么正反都能通_为什么在电路板中测量二极管正反都通
  3. flutter 报错 type ‘int‘ is not a subtype of type ‘String‘ 奇葩经历
  4. jmp指令流程图怎么写_NS流程图是什么?规范实用的流程图工具
  5. 中文邮件分类[朴素贝叶斯、支持向量机、Logistic,TF-IDF,词袋模型]
  6. [从零开始学习FPGA编程-49]:视野篇 - 芯片是如何被设计出来的?
  7. 中职计算机应用基础表格制作说课稿,表格制作的说课稿
  8. python pandas to_csv 最左边 多一列 索引值 问题处理
  9. pcm设备的注册流程
  10. H5中的video标签使用