如何驱动模拟舵机-Controller 1.0b软件的使用

news2024/11/18 18:19:23

1.支持平台

   win10、win7

       win10打开Controller 1.0.exe即可运行;win7需要先安装Controller1.0b资料包\NetFarmwork文件夹中的.net框架组件。

2.电子硬件

   我们用以下硬件为例来讲解Controller 1.0b软件的使用:

主控板

Basra主控板(兼容Arduino Uno)

扩展板

Bigfish2.1扩展板

SH-SR舵机扩展板

3.操作步骤

上位机:Controller 1.0

下位机编程环境:Arduino 1.8.19

① 使用 SH-SR舵机扩展板 调试舵机时,将Controller1.0b资料包\Arduino\servo\servo.ino下载到主控板;

/*------------------------------------------------------------------------------------

  版权说明:Copyright 2023 Robottime(Beijing) Technology Co., Ltd. All Rights Reserved.

           Distributed under MIT license.See file LICENSE for detail or copy at

           https://opensource.org/licenses/MIT

           by 机器谱 2023-03-17 https://www.robotway.com/

  ------------------------------*/

#include <Tlc5940.h>

#include <tlc_servos.h>


#define ANGLE_VALUE_MIN 0

#define ANGLE_VALUE_MAX 180

#define PWM_VALUE_MIN 500

#define PWM_VALUE_MAX 2500


int data_array[2] = {0,0};   //servo_pin: data_array[0], servo_value: data_array[1];

String data = "";


boolean dataComplete = false;


void setup() {

  Serial.begin(9600);

  Tlc.init(0);

  tlc_initServos();

  delay(1000);

}


void loop() {

 

  while(Serial.available())

  {

    int B_flag, P_flag, T_flag;

    data = Serial.readStringUntil('\n');

    data.trim();

    for(int i=0;i<data.length();i++)

    {

      //Serial.println(data[i]);

      switch(data[i])

      {

        case '#':

          B_flag = i;  

        break;

        case 'P':

        {

          String pin = "";

          P_flag = i;

          for(int i=B_flag+1;i<P_flag;i++)

          {

            pin+=data[i];

          }

          data_array[0] = pin.toInt();

        }

        break;

        case 'T':

        {

          String angle = "";

          T_flag = i;

          for(int i=P_flag+1;i<T_flag;i++)

          {

            angle += data[i];

          }

          data_array[1] = angle.toInt();

        }

        break;

        default: break;

      }     

    }

   

    /*

    Serial.println(B_flag);

    Serial.println(P_flag);

    Serial.println(T_flag);

   

    for(int i=0;i<2;i++)

    {

      Serial.println(data_array[i]);

    }

    */

   

    dataComplete = true;

  }

 

  if(dataComplete)

  {

    if(data_array[1] >= ANGLE_VALUE_MIN && data_array[1] <= ANGLE_VALUE_MAX)

    {

      tlc_setServo(data_array[0], data_array[1]);

    }

    else if(data_array[1] >= PWM_VALUE_MIN && data_array[1] <= PWM_VALUE_MAX)

    {

      data_array[1] = map(data_array[1], 500, 2500, 0, 180);

      tlc_setServo(data_array[0], data_array[1]);

    }

    Tlc.update();

    dataComplete = false;

  }

 


}

使用 Bigfish扩展板 调试舵机时,将Controller1.0b资料包\Arduino\servo_bigfish\servo_bigfish.ino下载到主控板。

/*------------------------------------------------------------------------------------

  版权说明:Copyright 2023 Robottime(Beijing) Technology Co., Ltd. All Rights Reserved.

           Distributed under MIT license.See file LICENSE for detail or copy at

           https://opensource.org/licenses/MIT

           by 机器谱 2023-03-17 https://www.robotway.com/

  ------------------------------*/

/*

* Bigfish扩展板舵机口; 4, 7, 11, 3, 8, 12, 14, 15, 16, 17, 18, 19

* 使用软件调节舵机时请拖拽对应序号的控制块

*/

#include <Servo.h>


#define ANGLE_VALUE_MIN 0

#define ANGLE_VALUE_MAX 180

#define PWM_VALUE_MIN 500

#define PWM_VALUE_MAX 2500


#define SERVO_NUM 12


Servo myServo[SERVO_NUM];


int data_array[2] = {0,0};   //servo_pin: data_array[0], servo_value: data_array[1];

int servo_port[SERVO_NUM] = {4, 7, 11, 3, 8, 12, 14, 15, 16, 17, 18, 19};

int servo_value[SERVO_NUM] = {};


String data = "";


boolean dataComplete = false;


void setup() {

  Serial.begin(9600);

 

}


void loop() {

 

  while(Serial.available())

  {

    int B_flag, P_flag, T_flag;

    data = Serial.readStringUntil('\n');

    data.trim();

    for(int i=0;i<data.length();i++)

    {

      //Serial.println(data[i]);

      switch(data[i])

      {

        case '#':

          B_flag = i;  

        break;

        case 'P':

        {

          String pin = "";

          P_flag = i;

          for(int i=B_flag+1;i<P_flag;i++)

          {

            pin+=data[i];

          }

          data_array[0] = pin.toInt();

        }

        break;

        case 'T':

        {

          String angle = "";

          T_flag = i;

          for(int i=P_flag+1;i<T_flag;i++)

          {

            angle += data[i];

          }

          data_array[1] = angle.toInt();

          servo_value[pin2index(data_array[0])] = data_array[1];

        }

        break;

        default: break;

      }     

    }

   

    /*

    Serial.println(B_flag);

    Serial.println(P_flag);

    Serial.println(T_flag);

   

    for(int i=0;i<2;i++)

    {

      Serial.println(data_array[i]);

    }

    */

   

    dataComplete = true;

  }

 

  if(dataComplete)

  {

    for(int i=0;i<SERVO_NUM;i++)

    {

      ServoGo(i, servo_value[i]);

      /*********************************串口查看输出***********************************/

//      Serial.print(servo_value[i]);

//      Serial.print(" ");

    }

//    Serial.println();

      /*********************************++++++++++++***********************************/


    dataComplete = false;

  }

 


}


void ServoStart(int which){

  if(!myServo[which].attached() && (servo_value[which] != 0))myServo[which].attach(servo_port[which]);

      else return;

  pinMode(servo_port[which], OUTPUT);

}


void ServoStop(int which){

  myServo[which].detach();

  digitalWrite(servo_port[which],LOW);

}


void ServoGo(int which , int where){

  ServoStart(which);

  if(where >= ANGLE_VALUE_MIN && where <= ANGLE_VALUE_MAX)

  {

    myServo[which].write(where);

  }

  else if(where >= PWM_VALUE_MIN && where <= PWM_VALUE_MAX)

  {

    myServo[which].writeMicroseconds(where);

  }

}


int pin2index(int _pin){

  int index;

  switch(_pin)

  {

    case 4: index = 0; break;

    case 7: index = 1; break;

    case 11: index = 2; break;

    case 3: index = 3; break;

    case 8: index = 4; break;

    case 12: index = 5; break;

    case 14: index = 6; break;

    case 15: index = 7; break;

    case 16: index = 8; break;

    case 17: index = 9; break;

    case 18: index = 10; break;

    case 19: index = 11; break;

  }

  return index;

}

下载完成后,保持主控板和电脑的USB连接,并打开主控板电源,以便利用上位机进行调试。

② 双击打开Controller 1.0.exe:

 ③ 界面左上角选择:

设置-面板设置,弹出需要显示的调试块,可通过勾选隐藏不需要调试的舵机块:联机-选择主控板对应端口号以及波特率。

 ④ 拖动进度条,可以观察相应的舵机角度转动。写好对应的舵机调试角度,勾选左下角添加-转化,获得舵机调试的数组:

 ⑤ 该数组可直接复制到相应的arduino软件的程序中进行使用。

使用Controller 1.0b软件调试舵机角度的实验案例可参考 12自由度六足-原地舞蹈

4.资料下载

如何驱动模拟舵机-Controller1.0b资料包

资料内容详见:如何驱动模拟舵机

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/419277.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

selenium自动化测试面试题【含答案】

目录 1、selenium中如何判断元素是否存在&#xff1f; 2、selenium中hidden或者是display &#xff1d; none的元素是否可以定位到&#xff1f; 3、selenium中如何保证操作元素的成功率&#xff1f;也就是说如何保证我点击的元素一定是可以点击的&#xff1f; 4、如何提高s…

谷歌浏览器安装插件(从 Edge 浏览器里获取插件)

前言&#xff1a; 因为谷歌插件 商店&#xff0c;国内&#xff08;不科学上网&#xff09;是无法访问的&#xff0c;所以 要安装插件就得 通过各种途径 下载后 解压&#xff0c;然后安装。 谷歌浏览器下载、安装插件的方式 方式一&#xff1a;自行 百度下载压缩包&#xff0…

win10安装telnet服务器(开启端口,开启telnet客户端后依旧显示:无法打开到主机的连接,在端口xxxx连接失败)

前言 注&#xff1a;我使用telnet的根本原因是想测试端口是否通&#xff0c;因为要使用花生壳&#xff0c; 而之所以会显示 启telnet客户端后依旧显示&#xff1a;无法打开到主机的连接&#xff0c;在端口xxxx连接失败 错误&#xff0c;本质原因是&#xff1a; 1、你没有teln…

tensorflow深度神经网络实现鸢尾花分类

tensorflow深度神经网络实现鸢尾花分类 本文目录tensorflow深度神经网络实现鸢尾花分类获取数据集相关库的导入数据展示和划分对标签值进行热编码模型搭建使用Sequential模型搭建模型模型训练对训练好的模型进行评估使用model模型搭建模型对训练好的模型进行评估损失函数优化方…

使用golang连接kafka

1 下载&#xff0c;配置&#xff0c;启动 kafka 下载链接 配置修改 在config目录下的server文件和zookeeper文件&#xff0c;其中分别修改kafka的日志保存路径和zookeeper的数据保存路径。 启动kafka 先启动kafka自带的zookeeper&#xff0c;在kafka的根目录下打开终端&a…

百模大战,谁是下一个ChatGPT?

“不敢下手&#xff0c;现在中国还没跑出来一家绝对有优势的大模型&#xff0c;上层应用没法投&#xff0c;担心押错宝。”投资人Jucy&#xff08;化名&#xff09;向光锥智能表示&#xff0c;AI项目看得多、投的少是这段时间的VC常态。 ChatGPT点燃AI大爆炸2个月中&#xff0…

为什么工控行业生意越来越难做了?

前段时间跟几个做工业品销售的朋友聚了一下&#xff0c;大家都说去年一年挺难的&#xff0c;有些甚至想把小店关了。为什么现在工业品领域越来越难做了呢&#xff1f;今天也想给大家说一说我的一些看法。 以前的工控生意相对现在来说较为有限和封闭&#xff0c;技术上也没有现今…

Android 大图检测插件的落地

作者&#xff1a;layz4android 在实际的项目开发中&#xff0c;引入图片的方式基本可以分为两种&#xff1a;本地图片和云端图片&#xff0c;对于云端图片来说&#xff0c;可以动态地配置图片的大小&#xff0c;如果服务端的伙伴下发的图片很大导致程序异常&#xff0c;那么可以…

前端视角-https总结

1.http存在的问题 1.1可能被窃听 HTTP 本身不具备加密的功能,HTTP 报文使用明文方式发送互联网是由联通世界各个地方的网络设施组成,所有发送和接收经过某些设备的数据都可能被截获或窥视。(例如TCP/IP抓包工具:Wireshark),即使经过加密处理,也会被窥视是通信内容,只是可能很…

在 Flutter 多人视频通话中实现虚拟背景、美颜与空间音效

前言 在之前的「基于声网 Flutter SDK 实现多人视频通话」里&#xff0c;我们通过 Flutter 声网 SDK 完美实现了跨平台和多人视频通话的效果&#xff0c;那么本篇我们将在之前例子的基础上进阶介绍一些常用的特效功能&#xff0c;包括虚拟背景、色彩增强、空间音频、基础变声…

HBase高手之路4-Shell操作

文章目录HBase高手之路3—HBase的shell操作一、hbase的shell命令汇总二、需求三、表的操作1&#xff0e;进入shell命令行2&#xff0e;创建表3&#xff0e;查看表的定义4&#xff0e;列出所有的表5&#xff0e;删除表1)禁用表2)启用表3)删除表四、数据的操作1&#xff0e;添加数…

TensorFlow 深度学习实战指南:1~5 全

原文&#xff1a;Hands-on Deep Learning with TensorFlow 协议&#xff1a;CC BY-NC-SA 4.0 译者&#xff1a;飞龙 本文来自【ApacheCN 深度学习 译文集】&#xff0c;采用译后编辑&#xff08;MTPE&#xff09;流程来尽可能提升效率。 不要担心自己的形象&#xff0c;只关心如…

【通义千问】继ChatGPT爆火后,阿里云的大模型“通义千问”它终于来了

通义千问一、通义千问名字的由来二、通义千问和ChatGPT有什么区别呢&#xff1f;三、如何申请体验通义千问呢&#xff1f;四、未来通义千问能称为中国版的ChatGPT吗&#xff1f;五、通义千问什么时候正式发布呢&#xff1f;一、通义千问名字的由来 通义千问顾名思义&#xff0…

作物杂交——蓝桥杯20年省赛(JAVA)

题目链接&#xff1a; 用户登录https://www.lanqiao.cn/problems/506/learning/?page2&first_category_id1&sortstudents_count 题目描述 作物杂交是作物栽培中重要的一步。已知有 N 种作物 (编号 1 至 N )&#xff0c;第 i 种作物从播种到成熟的时间为 Ti​。作物…

少儿编程 电子学会图形化 scratch编程等级考试四级真题答案解析(判断题)2022年12月

2022年12月scratch编程等级考试四级真题 判断题(共10题,每题2分,共20分) 16、点击绿旗,反复按下空格键,可以使变量a的值在0和1之间反复变化 答案:对 考点分析:考查积木综合使用,重点考查变量积木的使用,按一下空格键,a变量值会改变5次,0-1-0-1-0-1,按第二下…

budibase <2.4.3 存在 ssrf 漏洞(CVE-2023-29010)

漏洞描述 budibase 是一个开源的低代码平台&#xff0c;元数据端点(metadata endpoint)是Budibase提供的一个REST API端点&#xff0c;用于访问应用程序的元数据信息。 budibase 2.4.3之前版本中存在 ssrf 漏洞&#xff0c;该漏洞可能影响 Budibase 自主托管的用户&#xff0…

安利安利-向大家推荐一个超级牛的etcd管理工具-EtcdKeeperFyne

etcd介绍 关于etcd的介绍大家可以看下这篇文章 etcd 开源仓库地址&#xff1a;EtcdKeeperFyne EtcdKeeperFyne 今天主要是向大家推荐一款使用起来特别方便的Etcd管理工具 EtcdKeeperFyne&#xff0c;具体运行起来的界面如下&#xff1a; 推荐原因 使用简单安装简单&…

卷积层输出尺寸计算 / 感受野尺寸计算

卷积层输出尺寸计算 输入图像a*a, 卷积核大小b*b, stride c, padding d 输出图像的尺寸&#xff1a;[(a - b 2d) // c] 1 (a - b 2d) 表示在输入图像两侧填充 d 个像素后&#xff0c;窗口在输入图像上最多能移动的距离&#xff0c;再加上 1 表示最后一个窗口的右侧边界…

博客文章效果

学习风宇blog md文档转html&#xff08;markdown-it的使用&#xff09;语法高亮、行号、一键复制toc生成目录sticky粘性定位 <style lang"scss"> import url(//at.alicdn.com/t/c/font_4004562_9v94jccafmc.css); import url(https://fonts.font.im/css?fam…

DFIG控制8: 不平衡电网下的网侧变换器控制

DFIG控制8&#xff1a; 不平衡电网下的网侧变换器控制。主要是添加网侧变换器的负序分量控制器。 本文基于教程的第8部分&#xff1a;DFIM Tutorial 8 - Asymmetrical Voltage Dips Analysis in DFIG based WT: Grid Side Converter Control 控制策略简介 来自&#xff1a;G…