揮舞的手臂(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 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群:

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM