From de15bcf9931e1c0fcad9b1390c39c4d5eb3b8667 Mon Sep 17 00:00:00 2001 From: Bjoern Date: Thu, 14 Jul 2022 00:24:37 +0200 Subject: [PATCH] added servo and dc motor blocks --- .../Blockly/blocks/sensebox-motor.js | 89 +++++++++++++++++-- .../Blockly/generator/sensebox-motor.js | 65 ++++++++++++-- .../Blockly/msg/en/sensebox-motors.js | 39 +++++++- src/components/Blockly/toolbox/Toolbox.js | 7 +- 4 files changed, 181 insertions(+), 19 deletions(-) diff --git a/src/components/Blockly/blocks/sensebox-motor.js b/src/components/Blockly/blocks/sensebox-motor.js index 15f115a..b52e538 100644 --- a/src/components/Blockly/blocks/sensebox-motor.js +++ b/src/components/Blockly/blocks/sensebox-motor.js @@ -1,6 +1,5 @@ import * as Blockly from "blockly/core"; import { getColour } from "../helpers/colour"; -import * as Types from "../helpers/types"; import { selectedBoard } from "../helpers/board"; import { FieldSlider } from "@blockly/field-slider"; @@ -39,10 +38,9 @@ Blockly.Blocks["sensebox_motors_moveStepperMotor"] = { init: function () { this.appendDummyInput() .appendField(Blockly.Msg.sensebox_motors_moveStepperMotor); - this.appendDummyInput() - .appendField(Blockly.Msg.sensebox_motors_moveStepperMotor_step) + this.appendValueInput("steps", "Number") .setAlign(Blockly.ALIGN_RIGHT) - .appendField(new Blockly.FieldNumber(2048), "steps"); + .appendField(Blockly.Msg.sensebox_motors_moveStepperMotor_step); this.setPreviousStatement(true, null); this.setNextStatement(true, null); this.setColour(getColour().sensebox); @@ -55,10 +53,91 @@ Blockly.Blocks["sensebox_motors_moveStepperMotor"] = { * Servo Motor * */ +Blockly.Blocks["sensebox_motors_beginServoMotor"] = { + init: function () { + this.appendDummyInput() + .appendField(Blockly.Msg.sensebox_motors_beginServoMotor); + this.appendDummyInput() + .appendField(Blockly.Msg.sensebox_motors_beginServoMotor_pin) + .appendField(new Blockly.FieldDropdown(selectedBoard().digitalPins), "pin") + .setAlign(Blockly.ALIGN_RIGHT); + this.setPreviousStatement(true, null); + this.setNextStatement(true, null); + this.setColour(getColour().sensebox); + this.setTooltip(Blockly.Msg.sensebox_motors_beginServoMotor_tooltip); + this.setHelpUrl(Blockly.Msg.sensebox_motors_beginServoMotor_helpurl); + }, +}; + +Blockly.Blocks["sensebox_motors_moveServoMotor"] = { + init: function () { + this.appendDummyInput() + .appendField(Blockly.Msg.sensebox_motors_moveServoMotor); + this.appendDummyInput() + .appendField(Blockly.Msg.sensebox_motors_moveServoMotor_pin) + .appendField(new Blockly.FieldDropdown(selectedBoard().digitalPins), "pin") + .setAlign(Blockly.ALIGN_RIGHT); + this.appendValueInput("degrees", "Number") + .appendField(Blockly.Msg.sensebox_motors_moveServoMotor_degrees) + .setAlign(Blockly.ALIGN_RIGHT); + this.setPreviousStatement(true, null); + this.setNextStatement(true, null); + this.setColour(getColour().sensebox); + this.setTooltip(Blockly.Msg.sensebox_motors_moveStepperMotor_tooltip); + this.setHelpUrl(Blockly.Msg.sensebox_motors_moveStepperMotor_helpurl); + }, +}; /** - * DC Motor + * I2C Motor Board * */ +Blockly.Blocks["sensebox_motors_I2CMotorBoard_begin"] = { + init: function () { + this.appendDummyInput() + .appendField(Blockly.Msg.sensebox_motors_I2CMotorBoard_begin); + this.setPreviousStatement(true, null); + this.setNextStatement(true, null); + this.setColour(getColour().sensebox); + this.setTooltip(Blockly.Msg.sensebox_motors_I2CMotorBoard_begin_tooltip); + this.setHelpUrl(Blockly.Msg.sensebox_motors_I2CMotorBoard_begin_helpurl); + }, +}; +Blockly.Blocks["sensebox_motors_I2CMotorBoard_moveDCMotor"] = { + init: function () { + var dropdownOptions = [[Blockly.Msg.sensebox_motors_I2CMotorBoard_moveDCMotor_left, '1'], + [Blockly.Msg.sensebox_motors_I2CMotorBoard_moveDCMotor_right, '2']]; + + this.appendDummyInput() + .appendField(Blockly.Msg.sensebox_motors_I2CMotorBoard_moveDCMotor) + .appendField(new Blockly.FieldDropdown(dropdownOptions), "motor") + .appendField(Blockly.Msg.sensebox_motors_I2CMotorBoard_moveDCMotor_motor); + this.appendValueInput("speed", "Number") + .appendField(Blockly.Msg.sensebox_motors_I2CMotorBoard_moveDCMotor_speed) + .setAlign(Blockly.ALIGN_RIGHT); + this.setPreviousStatement(true, null); + this.setNextStatement(true, null); + this.setColour(getColour().sensebox); + this.setTooltip(Blockly.Msg.sensebox_motors_I2CMotorBoard_moveDCMotor_tooltip); + this.setHelpUrl(Blockly.Msg.sensebox_motors_I2CMotorBoard_moveDCMotor_helpurl); + }, +}; + +Blockly.Blocks["sensebox_motors_I2CMotorBoard_stopDCMotor"] = { + init: function () { + var dropdownOptions = [[Blockly.Msg.sensebox_motors_I2CMotorBoard_stopDCMotor_left, '1'], + [Blockly.Msg.sensebox_motors_I2CMotorBoard_stopDCMotor_right, '2']]; + + this.appendDummyInput() + .appendField(Blockly.Msg.sensebox_motors_I2CMotorBoard_stopDCMotor) + .appendField(new Blockly.FieldDropdown(dropdownOptions), "motor") + .appendField(Blockly.Msg.sensebox_motors_I2CMotorBoard_stopDCMotor_motor) + this.setPreviousStatement(true, null); + this.setNextStatement(true, null); + this.setColour(getColour().sensebox); + this.setTooltip(Blockly.Msg.sensebox_motors_I2CMotorBoard_stopDCMotor_tooltip); + this.setHelpUrl(Blockly.Msg.sensebox_motors_I2CMotorBoard_stopDCMotor_helpurl); + }, +}; \ No newline at end of file diff --git a/src/components/Blockly/generator/sensebox-motor.js b/src/components/Blockly/generator/sensebox-motor.js index 9bc91d5..616c236 100644 --- a/src/components/Blockly/generator/sensebox-motor.js +++ b/src/components/Blockly/generator/sensebox-motor.js @@ -1,24 +1,73 @@ import * as Blockly from "blockly/core"; -/*Stepper Motor Blocks*/ +/** + * Stepper Motor + */ Blockly.Arduino.sensebox_motors_beginStepperMotor = function () { var in1 = this.getFieldValue("in1"); var in2 = this.getFieldValue("in2"); var in3 = this.getFieldValue("in3"); var in4 = this.getFieldValue("in4"); var rpm = this.getFieldValue("rpm"); - Blockly.Arduino.libraries_["stepper_motor"] = "#include "; + Blockly.Arduino.libraries_["include_stepper_motor"] = "#include "; Blockly.Arduino.definitions_["define_stepper_motor"] = ` -#define SPU 2048 // steps per minute -Stepper stepper_motor(SPU, ${in1}, ${in2}, ${in3}, ${in4}); // stepper Motor`; - Blockly.Arduino.setupCode_["sensebox_stepper_motor_begin"] = - `Motor.setSpeed(${rpm}); // speed in rotations per minute`; +Stepper stepper_motor(2048, ${in1}, ${in2}, ${in3}, ${in4}); // stepper Motor with 2048 steps per rotation`; + Blockly.Arduino.setupCode_["setup_stepper_motor"] = + `stepper_motor.setSpeed(${rpm}); // speed in rotations per minute`; var code = ""; return code; }; Blockly.Arduino.sensebox_motors_moveStepperMotor = function () { - var steps = this.getFieldValue("steps"); - var code = "stepper_motor.step(2048); // 2048 steps correspond to one rotation"; + var steps = Blockly.Arduino.valueToCode(this, 'steps', Blockly.Arduino.ORDER_ATOMIC) || '2048'; + var code = `stepper_motor.step(${steps}); // 2048 steps correspond to one rotation\n`; + return code; +}; + + +/** + * Servo Motor + * + */ +Blockly.Arduino.sensebox_motors_beginServoMotor = function () { + var pin = this.getFieldValue("pin"); + Blockly.Arduino.libraries_["include_servo_motor"] = "#include "; + Blockly.Arduino.definitions_["define_servo_motor"] = `Servo servo_motor_${pin}; // servo Motor`; + Blockly.Arduino.setupCode_["setup_servo_moto"] = `servo_motor_${pin}.attach(${pin}); // attach servo motor to pin ${pin}`; + var code = ""; + return code; +}; + +Blockly.Arduino.sensebox_motors_moveServoMotor = function () { + var pin = this.getFieldValue("pin"); + var degrees = Blockly.Arduino.valueToCode(this, 'degrees', Blockly.Arduino.ORDER_ATOMIC) || "90"; + var code = `servo_motor_${pin}.write(${degrees}); // move servo motor to ${degrees} degrees\n`; + return code; +}; + +/** + * I2C Motor Board + * + */ +Blockly.Arduino.sensebox_motors_I2CMotorBoard_begin = function () { + Blockly.Arduino.libraries_["include_i2c_motor_board"] = "#include "; + Blockly.Arduino.definitions_["define_i2c_motor_board"] = ` +#define I2C_MOTOR_BOARD_ADDRESS 0x0f // default I2C address of I2C Motor Board`; + Blockly.Arduino.setupCode_["setup_i2c_motor_board"] = ` + Motor.begin(I2C_MOTOR_BOARD_ADDRESS); // Initialize I2C Motor Board`; + var code = ""; + return code; +}; + +Blockly.Arduino.sensebox_motors_I2CMotorBoard_moveDCMotor = function () { + var motor = this.getFieldValue("motor"); + var speed = Blockly.Arduino.valueToCode(this, 'speed', Blockly.Arduino.ORDER_ATOMIC) || "50"; + var code = `Motor.speed(MOTOR${motor}, ${speed}); // set speed of motor\n`; + return code; +}; + +Blockly.Arduino.sensebox_motors_I2CMotorBoard_stopDCMotor = function () { + var motor = this.getFieldValue("motor"); + var code = `Motor.stop(MOTOR${motor}); // stop motor\n`; return code; }; \ No newline at end of file diff --git a/src/components/Blockly/msg/en/sensebox-motors.js b/src/components/Blockly/msg/en/sensebox-motors.js index 7498cc8..88a3633 100644 --- a/src/components/Blockly/msg/en/sensebox-motors.js +++ b/src/components/Blockly/msg/en/sensebox-motors.js @@ -5,14 +5,45 @@ export const MOTORS = { */ sensebox_motors_beginStepperMotor: "Initialize Stepper Motor (28BYJ-48)", - sensebox_motors_beginStepperMotor_rpm: "Rotations per Minute", - sensebox_motors_beginStepperMotor_pins: "Input Pins", + sensebox_motors_beginStepperMotor_rpm: "Rotations per Minute:", + sensebox_motors_beginStepperMotor_pins: "Input Pins (IN1-IN4):", sensebox_motors_beginStepperMotor_tooltip: "TODO", sensebox_motors_beginStepperMotor_helpurl: "TODO", sensebox_motors_beginStepperMotor_step: "TODO", sensebox_motors_moveStepperMotor: "Move Stepper Motor (28BYJ-48)", - sensebox_motors_moveStepperMotor_step: "Steps:", + sensebox_motors_moveStepperMotor_step: "Steps (2048 steps equal a full rotation):", sensebox_motors_moveStepperMotor_tooltip: "TODO", sensebox_motors_moveStepperMotor_helpurl: "TODO", -} \ No newline at end of file + + sensebox_motors_beginServoMotor: "Initialize Servo Motor", + sensebox_motors_beginServoMotor_pin: "Pin:", + sensebox_motors_beginServoMotor_tooltip: "TODO", + sensebox_motors_beginServoMotor_helpurl: "TODO", + + sensebox_motors_moveServoMotor: "Move Servo Motor", + sensebox_motors_moveServoMotor_pin: "Pin:", + sensebox_motors_moveServoMotor_degrees: "Degrees:", + sensebox_motors_moveStepperMotor_tooltip: "TODO", + sensebox_motors_moveStepperMotor_helpurl: "TODO", + + sensebox_motors_I2CMotorBoard_begin: "Initialize I2C Motor Board", + sensebox_motors_I2CMotorBoard_begin_tooltip: "TODO", + sensebox_motors_I2CMotorBoard_begin_helpurl: "TODO", + + sensebox_motors_I2CMotorBoard_moveDCMotor: "Move", + sensebox_motors_I2CMotorBoard_moveDCMotor_left: "left", + sensebox_motors_I2CMotorBoard_moveDCMotor_right: "right", + sensebox_motors_I2CMotorBoard_moveDCMotor_motor: "DC Motor at I2C Motor Board", + sensebox_motors_I2CMotorBoard_moveDCMotor_speed: "Speed (between -100 and 100):", + sensebox_motors_I2CMotorBoard_moveDCMotor_tooltip: "TODO", + sensebox_motors_I2CMotorBoard_moveDCMotor_helpurl: "TODO", + + sensebox_motors_I2CMotorBoard_stopDCMotor: "Stop ", + sensebox_motors_I2CMotorBoard_stopDCMotor_left: "left", + sensebox_motors_I2CMotorBoard_stopDCMotor_right: "right", + sensebox_motors_I2CMotorBoard_stopDCMotor_motor: "DC Motor at I2C Motor Board", + sensebox_motors_I2CMotorBoard_stopDCMotor_tooltip: "TODO", + sensebox_motors_I2CMotorBoard_stopDCMotor_helpurl: "TODO", +}; + diff --git a/src/components/Blockly/toolbox/Toolbox.js b/src/components/Blockly/toolbox/Toolbox.js index d0efb24..575b9af 100644 --- a/src/components/Blockly/toolbox/Toolbox.js +++ b/src/components/Blockly/toolbox/Toolbox.js @@ -301,8 +301,11 @@ class Toolbox extends React.Component { - - + + + + + {/*