挥舞的手臂(mixly+二次开发)

2023-11-23 06:59

本文主要是介绍挥舞的手臂(mixly+二次开发),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

从vb6到vb.net,一路c#, java, python, nn, c,对技术的切换早已经没有害怕的感觉了,一直有的是技术的热情和我所认为的技术信仰。

扯完,开始正文。

看看效果图:

使用的是Arduino UNO+16 Servo Drive Board+2个SG90舵机(左右手分别1个舵机摇摆)

Arduino UNO:

16 Servo Drive Board

然后将这2块叠在一起插上引脚硬件就好了 

连的是5和6引脚

 

接下来就程序了,直接编码算是很简单的,就2步:

  1. 拷贝厂商的.h/.cpp文件夹到arduino的libraries目录
  2. 写代码如下:
  3. #include <Adafruit_PWMServoDriver.h>#define SERVOMIN 200
    #define SERVOMAX 540
    #define SERVOMIN_Angle 0
    #define SERVOMAX_Angle 112Adafruit_PWMServoDriver pwm = Adafruit_PWMServoDriver();void servo_goto_angle(int pinId, int angle)
    {int anglePwmValue=map(angle, SERVOMIN_Angle, SERVOMAX_Angle, SERVOMIN, SERVOMAX);pwm.setPWM(pinId,0, anglePwmValue);
    }void servo_init()
    {Serial.begin(9600);pwm.begin();pwm.setPWMFreq(60);delay(200);
    }void setup(){servo_init();
    }void loop(){for (int i = 1; i <= 112; i = i + (1)) {servo_goto_angle(5, i);delay(10);}for (int i = 112; i >= 1; i = i + (-1)) {servo_goto_angle(5, i);delay(10);}for (int i = 1; i <= 112; i = i + (1)) {servo_goto_angle(6, i);delay(10);}for (int i = 112; i >= 1; i = i + (-1)) {servo_goto_angle(6, i);delay(10);}}

     

然后交叉编译,上传就好了。

 

 

 

 

 

 

 

 

 

 

 

可是(哈哈,这里还有,故意空出了一大段),考虑到我还要教女儿学会这个,就不能这么直接代码给她看了,毕竟才小学1年级,还好,有mixly,好,希望来了,图形化编程来了。

 

鼓捣了一般,最后发现通用的组件都能用,只是这个舵机由于是厂商买来的,还没法很好的支持,得自定义!这下麻烦了,找了点mixly二次开发的资料看了看,最终决定自己写mixly插件。

看了看mixly插件其实就是用js编写外观以及生成代码部分拼c代码出来,然后就好办了,下面是完整插件的目录结构(xml是描述文件、block中的js是生成积木外观的、generator中的js是生成c代码的):

 

McKay.xml

<!--
type="company"
block="block/McKay.js"
generator="generator/McKay.js"
media="media/McKay"
language="language/McKay"
-->
<script type="text/javascript" src="../../blocks/company/McKay.js"></script>
<script type="text/javascript" src="../../generators/arduino/company/McKay.js"></script>
<category id="McKay_ServoDriveBoard" name="McKay-舵机" colour="20"><block type="ServoDriveBoard_Init"><value name="MinAngle"></value><value name="MaxAngle"></value></block><block type="ServoDriveBoard_Do"><value name="ServoNumber"></value><value name="Angle"></value></block>
</category>

 

block\McKay.js

'use strict';goog.provide('Blockly.Blocks.McKay');goog.require('Blockly.Blocks');Blockly.Blocks.ServoDriveBoard_Init={
init:function(){this.appendDummyInput("").appendField("初始化舵机");this.appendValueInput("MinAngle").setCheck(Number).appendField("最小角度");this.appendValueInput("MaxAngle").setCheck(Number).appendField("最大角度");this.setColour(20);this.setPreviousStatement(true);this.setNextStatement(true);this.setInputsInline(false);this.setTooltip("初始化舵机");}
};Blockly.Blocks.ServoDriveBoard_Do={
init:function(){this.appendDummyInput("").appendField("舵机运行");this.appendValueInput("ServoNumber").setCheck(Number).appendField("舵机编号");this.appendValueInput("Angle").setCheck(Number).appendField("角度");this.setColour(20);this.setPreviousStatement(true);this.setNextStatement(true);this.setInputsInline(true);this.setTooltip("舵机运行");}
};

 

generator\McKay.js

'use strict';goog.provide('Blockly.Arduino.McKay');goog.require('Blockly.Arduino');Blockly.McKay_ServoDriveBoard_MinAngle=0;
Blockly.McKay_ServoDriveBoard_MaxAngle=0;
Blockly.Arduino.ServoDriveBoard_Init=function(){var MinAngle = Blockly.Arduino.valueToCode(this, 'MinAngle', Blockly.Arduino.ORDER_ATOMIC) || '0';var MaxAngle = Blockly.Arduino.valueToCode(this, 'MaxAngle', Blockly.Arduino.ORDER_ATOMIC) || '112';Blockly.McKay_ServoDriveBoard_MinAngle=parseInt(MinAngle);Blockly.McKay_ServoDriveBoard_MaxAngle=parseInt(MaxAngle);Blockly.Arduino.definitions_["define_McKay_ServoDriveBoard_Include"] = "#include <Adafruit_PWMServoDriver.h>\n";var defines="#define SERVOMIN 200\n";defines+="#define SERVOMAX 540\n";defines+="#define SERVOMIN_Angle "+Blockly.McKay_ServoDriveBoard_MinAngle+"\n";defines+="#define SERVOMAX_Angle "+Blockly.McKay_ServoDriveBoard_MaxAngle+"\n";Blockly.Arduino.definitions_["define_McKay_ServoDriveBoard_Defines"] = defines;Blockly.Arduino.definitions_["define_McKay_ServoDriveBoard_pwmObj"] = "Adafruit_PWMServoDriver pwm = Adafruit_PWMServoDriver();\n";var gotoCode="void servo_goto_angle(int pinId, int angle)\n";gotoCode+="{\n";gotoCode+="     int anglePwmValue=map(angle, SERVOMIN_Angle, SERVOMAX_Angle, SERVOMIN, SERVOMAX);\n";gotoCode+="     pwm.setPWM(pinId,0, anglePwmValue);\n";gotoCode+="}\n";Blockly.Arduino.definitions_["define_McKay_ServoDriveBoard_goto_angle"] = gotoCode;var initCode="void servo_init()\n";initCode+="{\n";initCode+="     Serial.begin(9600);\n";initCode+="     pwm.begin();\n";initCode+="     pwm.setPWMFreq(60);\n";initCode+="     delay(200);\n";initCode+="}\n";Blockly.Arduino.definitions_["define_McKay_ServoDriveBoard_initCode"] = initCode;return "servo_init();\n";
};Blockly.Arduino.ServoDriveBoard_Do=function(){var ServoNumber = Blockly.Arduino.valueToCode(this, 'ServoNumber', Blockly.Arduino.ORDER_ATOMIC) || '0';var Angle = Blockly.Arduino.valueToCode(this, 'Angle', Blockly.Arduino.ORDER_ATOMIC) || '0';var code="servo_goto_angle("+ServoNumber+", "+Angle+");\n";return code;
};

 

多年编程经验的你肯定得出结论其实就是通过js拼string,string里是c代码。。。

然后就可以老少皆宜的写代码了:

 

有兴趣玩玩这些,挺有意思的

欢迎加入钉钉创客Maker群:

 

转载于:https://www.cnblogs.com/aarond/p/maker.html

这篇关于挥舞的手臂(mixly+二次开发)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/416187

相关文章

Superset二次开发之Select 筛选器源码分析

路径:superset-frontend/src/filters/components/Select  源码文件: 功能点: 作用 交互 功能 index.ts作为模块的入口点,导出其他文件中定义的主要组件和函数。它使其他文件中的导出可以被外部模块使用。 SelectFilterPlugin.tsx 定义主要的插件类 SelectFilterPlugin 和组件 Sele

了解elementUI的底层源码, 进行二次开发

Element UI 是一个基于 Vue.js 的桌面端组件库,广泛用于构建美观、交互友好的用户界面。要深入理解 Element UI 的底层源码并进行二次开发,你需要掌握以下几个关键点: Vue.js 原理 Element UI 是基于 Vue.js 构建的,因此首先需要熟悉 Vue.js 的核心概念和机制,包括: ● 组件系统:Vue.js 的组件化思想,如何定义组件、使用组件、传递属性和事

关于武汉高芯coin417G2红外机芯的二次开发

文章目录 前言一、外观和机芯参数二、SDK的使用1、打开相机2、回调函数中获取全局温度和图像3、关闭相机 前言 最近工作中接触了一款基于武汉高芯科技有限公司开发的红外模组,即coin417g2(测温型)+9.1mm镜头.使用此模组,开发了一套红外热成像检测桌面应用程序.下面简单记录下该模组的使用. 一、外观和机芯参数 如下是该机芯的外观和机芯参数: 二、SDK

NX二次开发—进阶(二)

一、创建圆弧 在NX上通过代码画出圆弧,定义起始和终止位置,还有圆心位置和半径 创建圆弧,需要获取CSYS的矩阵ID,通过UF_CURVE_create_arc函数进行创建 //定义参数UF_CURVE_arc_t arc;arc.start_angle = 0.0;arc.end_angle = 225 * DEGRA;//DEGRA=PI/180//中心坐标arc.arc_center

NIFI汉化_替换logo_二次开发_Idea编译NIFI最新源码_详细过程记录_全解析_Maven编译NIFI避坑指南001

由于需要对NFI进行汉化,以及二次开发,首先要下载源码以后编辑通过,NIFI的源码,项目非常多,编译过程中需要编译超过570个jar包,同时编译过程很慢需要30多分钟. 1.首先下载NIFI源码,根据需要下载对应版本: https://github.com/kemixkoo/orchsym-runtime/   首先介绍一下,这个是一个公司根据nifi进行定制开发的,已经汉化,但是不能商

NX二次开发——进阶(一)

一、链表及相关函数的用法 函数说明UF_MODL_create_list创建一个链表,并返回链表的头指针UF_MODL_put_list_item插入元素到链表中,不检验对象是否重复,或者已经存在UF_MODL_ask_list_count获取链表对象数量,从头开始遇到null_tag结束UF_MODL_ask_list_item查询链表对象标识,给个位置返回标识UF_MODL_delete_l

​​NIFI汉化_替换logo_二次开发_Idea编译NIFI最新源码_详细过程记录_全解析_Maven编译NIFI避坑指南002

继续,执行pom.xml引入依赖以后,发现以下几种报错: 可以看到在下载aws-java-sdk-bundle 1.12.710版本的时候报错了 可以看到日志信息,就是在阿里云上下载的,因为阿里云上缺少这个jar包 aws-java-sdk-bundle-1.12.710.jar 这个jar包,我还特意去阿里云上查询了一下 https://developer.aliyun.com/

恋爱相亲交友系统源码原生源码可二次开发APP 小程序 H5,web全适配

直播互动:平台设有专门的直播间,允许房间主人与其他异性用户通过视频连线的方式进行一对一互动。语音视频交流:异性用户可以发起语音或视频通话,以增进了解和交流。群组聊天:用户能够创建群聊,邀请自己关注的异性朋友加入,以便进行多人在线交流。虚拟礼品赠送:平台提供多样化的虚拟礼物,不同礼物有不同的价值,用户可以用来表达好感或支持。私人消息:异性用户之间可以互相发送私人信息,不过平台为了维护用户体验,对

UG二次开发CreateDialog函数在UI.hxx文件和WinUser.h中的冲突

文章出自https://blog.csdn.net/qq_41843732/article/details/91422764 在UG二次开发中,若使用MFC库,一旦加上#include<Afx.h>头文件,下面这句话就报错 theDialog = GetPoints::theUI->CreateDialog(theDlxFileName); 解决CreateDialog函数在UI.hx

pico手柄和人物模型手部旋转同步,实现手柄控制手臂手部位置移动、手部旋转和手指的操作了

这里的主要内容就是下述代码; // 获取左手控制器的旋转(四元数表示)Quaternion aRotationQuaternion = leftHandController.rotation;// 计算旋转差值(四元数表示)Quaternion rotationDifference = Quaternion.Euler(0, -90, -90);// 应用差值到左手控制器的旋转并获取新的四元数