挥舞的手臂(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步:
- 拷贝厂商的.h/.cpp文件夹到arduino的libraries目录
- 写代码如下:
#include <Adafruit_PWMServoDriver.h> #define SERVOMIN 200
#define SERVOMAX 540
#define SERVOMIN_Angle 0
#define SERVOMAX_Angle 112 Adafruit_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,, anglePwmValue);
} void servo_init()
{
Serial.begin();
pwm.begin();
pwm.setPWMFreq();
delay();
} void setup(){
servo_init();
} void loop(){
for (int i = ; i <= ; i = i + ()) {
servo_goto_angle(, i);
delay();
}
for (int i = ; i >= ; i = i + (-)) {
servo_goto_angle(, i);
delay();
}
for (int i = ; i <= ; i = i + ()) {
servo_goto_angle(, i);
delay();
}
for (int i = ; i >= ; i = i + (-)) {
servo_goto_angle(, i);
delay();
} }
然后交叉编译,上传就好了。
可是(哈哈,这里还有,故意空出了一大段),考虑到我还要教女儿学会这个,就不能这么直接代码给她看了,毕竟才小学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群:

挥舞的手臂(mixly+二次开发)的更多相关文章
- Navisworks API 简单二次开发 (自定义工具条)
在Navisworks软件运行的时候界面右侧有个工具条.比较方便.但是在二次开发的时候我不知道在Api那里调用.如果有网友知道请告诉我.谢谢. 我用就自己设置一个工具.界面比较丑!没有美工. 代码: ...
- [连载]《C#通讯(串口和网络)框架的设计与实现》- 12.二次开发及应用
目 录 第十二章 二次开发及应用... 2 12.1 项目配制... 3 12.2 引用相关组件... 4 12.3 构建主程序... 5 ...
- OBS-Studio二次开发记录
OBS-Studio 是一款跨平台的,开源的视频直播客户端软件. 公司需要对他进行二次开发,开发的目的是使用它的录屏功能. 开发的要求是:定制全新的界面,所见即所得,window系统兼容要好. 开发步 ...
- 小猪cms微信二次开发之怎样分页
$db=D('Classify'); $zid=$db->where(array('id'=>$this->_GET('fid'),'token'=>$this->tok ...
- 承接 AutoCAD 二次开发 项目
本人有多年的CAD开发经验,独立完成多个CAD二次开发项目.熟悉.net及Asp.net开发技术,和Lisp开发技术. 现在成立了工作室,独立承接CAD二次开发项目.结项后提供源码及开发文档,有需要的 ...
- 【工业串口和网络软件通讯平台(SuperIO)教程】七.二次开发服务驱动
SuperIO相关资料下载:http://pan.baidu.com/s/1pJ7lZWf 1.1 服务接口的作用 围绕着设备驱动模块采集的数据,根据需求提供多种应用服务,例如:数据上传服务.数 ...
- 【工业串口和网络软件通讯平台(SuperIO)教程】三.二次开发流程
1.1 二次开发流程图 1.2 引用相关组件 找到“开发包”,引用里边的相关组件.如下图: 1.3 开发设备驱动模块 1.3.1 开发发送协议驱动 继承SuperIO.Devi ...
- Civil 3D API二次开发学习指南
Civil 3D构建于AutoCAD 和 Map 3D之上,在学习Civil 3D API二次开发之前,您至少需要了解AutoCAD API的二次开发,你可以参考AutoCAD .NET API二次开 ...
- visio二次开发——图纸解析之线段
多写博客,其实还是蛮好的习惯的,当初大学的时候导师就叫我写,但是就是懒,大学的时候,谁不是魔兽或者LOL呢,是吧,哈哈哈. 好了,接着上一篇visio二次开发——图纸解析,我继续写. 摘要: (转发请 ...
随机推荐
- 5G网络与4G相比,有什么区别?
5G 是 2018 年移动通信领域的热词.从中兴的芯片卡脖事件,联想 5G 投票风波再到华为频遭威胁.这些事件都引起了大家对于 5G 的关注,那么 5G 到底是什么,它和 4G 有什么区别呢? 今天就 ...
- Self Host 使用 Exceptionless 实时监控程序运行日志服务
Exceptionless 是一个可以对 ASP.NET Core, ASP.NET MVC,WebAPI, WebForms, WPF, Console 应用提供系统的日志,错误监控.报表等服务实时 ...
- h2engine游戏服务器设计之聊天室示例
游戏服务器设计之聊天室示例 简介 h2engine引擎建群以后,有热心网友向我反馈,想尝试h2engine但是没有服务器开发经验觉得无从入手,希望我能提供一个简单明了的示例.由于前一段时间工作实在忙碌 ...
- 101 - kube-scheduler源码分析 - k8s源码组织结构概览
ps:本来应该先发这一篇,再开始讲cobra的,昨天不小心先把 cobra发出去了,今天补上源码概览~ 如上,我们下载好后切换到1.10版本的分支,项目目录结构是这样的(目录部分).有很多,我们先不纠 ...
- docker 安装 MySQL 8,并减少内存占用 记录
目前vps 1cpu 512m内存 MySQL内存占用77% ,约350m ,经过修改配置文件优化后如下 $ ps aux 进入docker bash $ docker exec -it pwc-my ...
- sql servse 查询当前库内表索引值
PERCENT --a.id, THEN c.name ELSE '' END AS 表名, THEN a.name ELSE '' END AS 索引名称, d.name AS 列名, b.keyn ...
- C# 曲线上的点(一) 获取指定横坐标对应的纵坐标值
获取直线上的点,很容易,那曲线呢?二阶贝塞尔.三阶贝塞尔.多段混合曲线,如何获取指定横坐标对应的纵坐标? 如下图形: 实现方案 曲线上的点集 Geometry提供了一个函数GetFlattenedPa ...
- java--基本数据类型的转换(强制转换)
强制类型的转换 规则: 1.执行算术运算时,低类型(短字节)可以转换为高类型(长字节):例如: int型转换成double型,char型转换成int型等等. 就是用强制类型来实现. 3.强制类型转换语 ...
- 使用curl制作简易百度搜索
这几天研究了一下php中的curl类库,做了一个简单的百度搜索,先上代码 <div style="width:200px;height:100px;"> <div ...
- jQuery中的动画方法
对角线动画 hide():显示 可以写两个参数——第一个参数 数字类型:毫秒 字符串类型: slow:慢 600ms normal:比slow快 比fast慢 400ms fast:快 ...