從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,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群: