more motor work
This commit is contained in:
parent
9dedbeae1b
commit
fcdc350e40
@ -53,28 +53,31 @@
|
|||||||
"motors.Motor.clearCount": "Clears the motor count",
|
"motors.Motor.clearCount": "Clears the motor count",
|
||||||
"motors.Motor.count": "Gets motor step count.",
|
"motors.Motor.count": "Gets motor step count.",
|
||||||
"motors.Motor.move": "Moves the motor by a number of rotations, degress or seconds",
|
"motors.Motor.move": "Moves the motor by a number of rotations, degress or seconds",
|
||||||
"motors.Motor.moveSteering": "Turns the motor and the follower motor by a number of rotations",
|
|
||||||
"motors.Motor.moveSteering|param|speed": "the speed from ``100`` full forward to ``-100`` full backward, eg: 50",
|
|
||||||
"motors.Motor.moveSteering|param|steering": "the ratio of power sent to the follower motor, from ``-100`` to ``100``",
|
|
||||||
"motors.Motor.moveSteering|param|unit": "the meaning of the value",
|
|
||||||
"motors.Motor.moveSteering|param|value": "the move quantity, eg: 2",
|
|
||||||
"motors.Motor.moveTank": "The Move Tank block can make a robot drive forward, backward, turn, or stop. \nUse the Move Tank block for robot vehicles that have two Large Motors, \nwith one motor driving the left side of the vehicle and the other the right side. \nYou can make the two motors go at different speeds or in different directions \nto make your robot turn.",
|
|
||||||
"motors.Motor.moveTank|param|speedRight": "the speed on the right motor, eg: 50",
|
|
||||||
"motors.Motor.moveTank|param|unit": "@param speedLeft the speed on the left motor, eg: 50",
|
|
||||||
"motors.Motor.moveTank|param|value": "the amount of movement, eg: 2",
|
|
||||||
"motors.Motor.move|param|speed": "the speed from ``100`` full forward to ``-100`` full backward, eg: 50",
|
"motors.Motor.move|param|speed": "the speed from ``100`` full forward to ``-100`` full backward, eg: 50",
|
||||||
"motors.Motor.move|param|unit": "the meaning of the value",
|
"motors.Motor.move|param|unit": "the meaning of the value",
|
||||||
"motors.Motor.move|param|value": "the move quantity, eg: 2",
|
"motors.Motor.move|param|value": "the move quantity, eg: 2",
|
||||||
"motors.Motor.reset": "Resets the motor and clears any synchronization",
|
"motors.Motor.port": "Gets the port where this motor is connected",
|
||||||
|
"motors.Motor.reset": "Resets the motor.",
|
||||||
"motors.Motor.setBrake": "Sets the automatic brake on or off when the motor is off",
|
"motors.Motor.setBrake": "Sets the automatic brake on or off when the motor is off",
|
||||||
"motors.Motor.setBrake|param|brake": "a value indicating if the motor should break when off",
|
"motors.Motor.setBrake|param|brake": "a value indicating if the motor should break when off",
|
||||||
"motors.Motor.setReversed": "Reverses the motor polarity",
|
"motors.Motor.setReversed": "Reverses the motor polarity",
|
||||||
"motors.Motor.setSpeed": "Sets the speed of the motor.",
|
"motors.Motor.setSpeed": "Sets the speed of the motor.",
|
||||||
"motors.Motor.setSpeed|param|speed": "the speed from ``100`` full forward to ``-100`` full backward, eg: 50",
|
"motors.Motor.setSpeed|param|speed": "the speed from ``100`` full forward to ``-100`` full backward, eg: 50",
|
||||||
"motors.Motor.speed": "Gets motor actual speed.",
|
"motors.Motor.speed": "Gets motor actual speed.",
|
||||||
"motors.Motor.sync": "Synchronizes a follower motor to this motor",
|
|
||||||
"motors.Motor.sync|param|follower": "the motor that follows this motor commands, eg: motors.largeC",
|
|
||||||
"motors.Motor.tachoCount": "Gets motor tacho count.",
|
"motors.Motor.tachoCount": "Gets motor tacho count.",
|
||||||
|
"motors.SynchedMotorPair.moveSteering": "Turns the motor and the follower motor by a number of rotations",
|
||||||
|
"motors.SynchedMotorPair.moveSteering|param|speed": "the speed from ``100`` full forward to ``-100`` full backward, eg: 50",
|
||||||
|
"motors.SynchedMotorPair.moveSteering|param|steering": "the ratio of power sent to the follower motor, from ``-100`` to ``100``",
|
||||||
|
"motors.SynchedMotorPair.moveSteering|param|unit": "the meaning of the value",
|
||||||
|
"motors.SynchedMotorPair.moveSteering|param|value": "the move quantity, eg: 2",
|
||||||
|
"motors.SynchedMotorPair.moveTank": "The Move Tank block can make a robot drive forward, backward, turn, or stop. \nUse the Move Tank block for robot vehicles that have two Large Motors, \nwith one motor driving the left side of the vehicle and the other the right side. \nYou can make the two motors go at different speeds or in different directions \nto make your robot turn.",
|
||||||
|
"motors.SynchedMotorPair.moveTank|param|speedRight": "the speed on the right motor, eg: 50",
|
||||||
|
"motors.SynchedMotorPair.moveTank|param|unit": "@param speedLeft the speed on the left motor, eg: 50",
|
||||||
|
"motors.SynchedMotorPair.moveTank|param|value": "the amount of movement, eg: 2",
|
||||||
|
"motors.SynchedMotorPair.setBrake": "Sets the automatic brake on or off when the motor is off",
|
||||||
|
"motors.SynchedMotorPair.setBrake|param|brake": "a value indicating if the motor should break when off",
|
||||||
|
"motors.SynchedMotorPair.setSpeed": "Sets the speed of the motor.",
|
||||||
|
"motors.SynchedMotorPair.setSpeed|param|speed": "the speed from ``100`` full forward to ``-100`` full backward, eg: 50",
|
||||||
"motors.stopAllMotors": "Stops all motors",
|
"motors.stopAllMotors": "Stops all motors",
|
||||||
"output.createBuffer": "Create a new zero-initialized buffer.",
|
"output.createBuffer": "Create a new zero-initialized buffer.",
|
||||||
"output.createBuffer|param|size": "number of bytes in the buffer",
|
"output.createBuffer|param|size": "number of bytes in the buffer",
|
||||||
|
@ -15,10 +15,13 @@
|
|||||||
"MoveUnit.Degrees|block": "degrees",
|
"MoveUnit.Degrees|block": "degrees",
|
||||||
"MoveUnit.Rotations|block": "rotations",
|
"MoveUnit.Rotations|block": "rotations",
|
||||||
"MoveUnit.Seconds|block": "seconds",
|
"MoveUnit.Seconds|block": "seconds",
|
||||||
|
"Output.AB|block": "A+B",
|
||||||
|
"Output.AD|block": "A+D",
|
||||||
"Output.ALL|block": "All",
|
"Output.ALL|block": "All",
|
||||||
"Output.A|block": "A",
|
"Output.A|block": "A",
|
||||||
"Output.BC|block": "B+C",
|
"Output.BC|block": "B+C",
|
||||||
"Output.B|block": "B",
|
"Output.B|block": "B",
|
||||||
|
"Output.CD|block": "C+D",
|
||||||
"Output.C|block": "C",
|
"Output.C|block": "C",
|
||||||
"Output.D|block": "D",
|
"Output.D|block": "D",
|
||||||
"brick.Button.isPressed|block": "`icons.brickButtons` %button|is pressed",
|
"brick.Button.isPressed|block": "`icons.brickButtons` %button|is pressed",
|
||||||
@ -40,24 +43,29 @@
|
|||||||
"control.raiseEvent|block": "raise event|from %src|with value %value",
|
"control.raiseEvent|block": "raise event|from %src|with value %value",
|
||||||
"control|block": "control",
|
"control|block": "control",
|
||||||
"motors.Motor.count|block": "`icons.motorLarge` %motor|count",
|
"motors.Motor.count|block": "`icons.motorLarge` %motor|count",
|
||||||
"motors.Motor.moveSteering|block": "move steering `icons.motorLarge` %motor|at %speed|%|steer %turnRadio|%|by %value|%unit",
|
|
||||||
"motors.Motor.moveTank|block": "move tank `icons.motorLarge` %motor|left %speedLeft|%|right %speedRight|%|by %value|%unit",
|
|
||||||
"motors.Motor.move|block": "move `icons.motorLarge` %motor|for %value|%unit|at %speed|%",
|
"motors.Motor.move|block": "move `icons.motorLarge` %motor|for %value|%unit|at %speed|%",
|
||||||
"motors.Motor.reset|block": "reset `icons.motorLarge` %motor",
|
"motors.Motor.reset|block": "reset `icons.motorLarge` %motor",
|
||||||
"motors.Motor.setBrake|block": "set `icons.motorLarge` %motor|brake %brake",
|
"motors.Motor.setBrake|block": "set `icons.motorLarge` %motor|brake %brake",
|
||||||
"motors.Motor.setReversed|block": "set `icons.motorLarge` %motor|reversed %reversed",
|
"motors.Motor.setReversed|block": "set `icons.motorLarge` %motor|reversed %reversed",
|
||||||
"motors.Motor.setSpeed|block": "set speed of `icons.motorLarge` %motor|to %speed|%",
|
"motors.Motor.setSpeed|block": "set speed of `icons.motorLarge` %motor|to %speed|%",
|
||||||
"motors.Motor.speed|block": "`icons.motorLarge` %motor|speed",
|
"motors.Motor.speed|block": "`icons.motorLarge` %motor|speed",
|
||||||
"motors.Motor.sync|block": "sync `icons.motorLarge` %motor|with `icons.motorLarge` %follower",
|
|
||||||
"motors.Motor.tachoCount|block": "`icons.motorLarge` %motor|tacho count",
|
"motors.Motor.tachoCount|block": "`icons.motorLarge` %motor|tacho count",
|
||||||
"motors.largeMotorA|block": "large A",
|
"motors.SynchedMotorPair.moveSteering|block": "move steering %chassis|at %speed|%|steer %turnRadio|%|by %value|%unit",
|
||||||
"motors.largeMotorB|block": "large B",
|
"motors.SynchedMotorPair.moveTank|block": "move tank %chassis|left %speedLeft|%|right %speedRight|%|by %value|%unit",
|
||||||
"motors.largeMotorC|block": "large C",
|
"motors.SynchedMotorPair.setBrake|block": "set `icons.motorLarge` %chassis|brake %brake",
|
||||||
"motors.largeMotorD|block": "large D",
|
"motors.SynchedMotorPair.setSpeed|block": "set speed of `icons.motorLarge` %motor|to %speed|%",
|
||||||
"motors.mediumMotorA|block": "medium A",
|
"motors.largeAB|block": "large A+B",
|
||||||
"motors.mediumMotorB|block": "medium B",
|
"motors.largeAD|block": "large A+D",
|
||||||
"motors.mediumMotorC|block": "medium C",
|
"motors.largeA|block": "large A",
|
||||||
"motors.mediumMotorD|block": "medium D",
|
"motors.largeBC|block": "large B+C",
|
||||||
|
"motors.largeB|block": "large B",
|
||||||
|
"motors.largeCD|block": "large C+D",
|
||||||
|
"motors.largeC|block": "large C",
|
||||||
|
"motors.largeD|block": "large D",
|
||||||
|
"motors.mediumA|block": "medium A",
|
||||||
|
"motors.mediumB|block": "medium B",
|
||||||
|
"motors.mediumC|block": "medium C",
|
||||||
|
"motors.mediumD|block": "medium D",
|
||||||
"motors.stopAllMotors|block": "stop all motors",
|
"motors.stopAllMotors|block": "stop all motors",
|
||||||
"motors|block": "motors",
|
"motors|block": "motors",
|
||||||
"output|block": "output",
|
"output|block": "output",
|
||||||
@ -73,6 +81,9 @@
|
|||||||
"{id:category}Screen": "Screen",
|
"{id:category}Screen": "Screen",
|
||||||
"{id:category}Serial": "Serial",
|
"{id:category}Serial": "Serial",
|
||||||
"{id:group}Buttons": "Buttons",
|
"{id:group}Buttons": "Buttons",
|
||||||
|
"{id:group}Chassis": "Chassis",
|
||||||
"{id:group}Light": "Light",
|
"{id:group}Light": "Light",
|
||||||
"{id:group}Screen": "Screen"
|
"{id:group}Motion": "Motion",
|
||||||
|
"{id:group}Screen": "Screen",
|
||||||
|
"{id:group}Sensors": "Sensors"
|
||||||
}
|
}
|
@ -1,9 +1 @@
|
|||||||
//% weight=100
|
|
||||||
namespace brick {
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
//% color="#B4009E" weight=98 icon="\uf192"
|
|
||||||
//% groups='["Ultrasonic Sensor", "Touch Sensor", "Color Sensor", "Infrared Sensor", "Remote Infrared Beacon", "Gyro Sensor"]'
|
|
||||||
namespace sensors {
|
|
||||||
}
|
|
||||||
|
@ -8,7 +8,13 @@ enum Output {
|
|||||||
//% block="D"
|
//% block="D"
|
||||||
D = 0x08,
|
D = 0x08,
|
||||||
//% block="B+C"
|
//% block="B+C"
|
||||||
BC = 0x06,
|
BC = Output.B | Output.C,
|
||||||
|
//% block="A+B"
|
||||||
|
AB = Output.A | Output.B,
|
||||||
|
//% block="C+D"
|
||||||
|
CD = Output.C | Output.D,
|
||||||
|
//% block="A+D"
|
||||||
|
AD = Output.B | Output.C,
|
||||||
//% block="All"
|
//% block="All"
|
||||||
ALL = 0x0f
|
ALL = 0x0f
|
||||||
}
|
}
|
||||||
@ -79,7 +85,8 @@ namespace motors {
|
|||||||
* Stops all motors
|
* Stops all motors
|
||||||
*/
|
*/
|
||||||
//% blockId=motorStopAll block="stop all motors"
|
//% blockId=motorStopAll block="stop all motors"
|
||||||
//% weight=19
|
//% weight=97
|
||||||
|
//% group="Motion"
|
||||||
export function stopAllMotors() {
|
export function stopAllMotors() {
|
||||||
const b = mkCmd(Output.ALL, DAL.opOutputStop, 0)
|
const b = mkCmd(Output.ALL, DAL.opOutputStop, 0)
|
||||||
writePWM(b)
|
writePWM(b)
|
||||||
@ -92,7 +99,6 @@ namespace motors {
|
|||||||
|
|
||||||
private _initialized: boolean;
|
private _initialized: boolean;
|
||||||
private _brake: boolean;
|
private _brake: boolean;
|
||||||
private _follower: Motor; //
|
|
||||||
|
|
||||||
constructor(port: Output, large: boolean) {
|
constructor(port: Output, large: boolean) {
|
||||||
super();
|
super();
|
||||||
@ -110,40 +116,36 @@ namespace motors {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Gets the port where this motor is connected
|
||||||
|
*/
|
||||||
|
//%
|
||||||
|
//% group="Motion"
|
||||||
|
port(): Output {
|
||||||
|
return this._port;
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Sets the speed of the motor.
|
* Sets the speed of the motor.
|
||||||
* @param speed the speed from ``100`` full forward to ``-100`` full backward, eg: 50
|
* @param speed the speed from ``100`` full forward to ``-100`` full backward, eg: 50
|
||||||
*/
|
*/
|
||||||
//% blockId=motorPower block="set speed of `icons.motorLarge` %motor|to %speed|%"
|
//% blockId=motorSetSpeed block="set speed of `icons.motorLarge` %motor|to %speed|%"
|
||||||
//% on.fieldEditor=toggleonoff
|
//% on.fieldEditor=toggleonoff
|
||||||
//% weight=99 blockGap=8
|
//% weight=99 blockGap=8
|
||||||
//% speed.min=-100 speed.max=100
|
//% speed.min=-100 speed.max=100
|
||||||
|
//% group="Motion"
|
||||||
setSpeed(speed: number) {
|
setSpeed(speed: number) {
|
||||||
this.__init();
|
this.__init();
|
||||||
speed = Math.clamp(-100, 100, speed >> 0);
|
speed = Math.clamp(-100, 100, speed >> 0);
|
||||||
if (!speed) { // always stop
|
if (!speed) { // always stop
|
||||||
this.stop();
|
this.stop();
|
||||||
} else {
|
} else {
|
||||||
if (this._follower) this.setSpeedSync(speed);
|
const b = mkCmd(this._port, DAL.opOutputSpeed, 1)
|
||||||
else this.setSpeedSingle(speed);
|
b.setNumber(NumberFormat.Int8LE, 2, speed)
|
||||||
|
writePWM(b)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private setSpeedSingle(speed: number) {
|
|
||||||
const b = mkCmd(this._port, DAL.opOutputSpeed, 1)
|
|
||||||
b.setNumber(NumberFormat.Int8LE, 2, speed)
|
|
||||||
writePWM(b)
|
|
||||||
}
|
|
||||||
|
|
||||||
private setSpeedSync(speed: number) {
|
|
||||||
const out = this._port | this._follower._port;
|
|
||||||
syncMotors(out, {
|
|
||||||
speed: speed,
|
|
||||||
turnRatio: 0,
|
|
||||||
useBrake: !!this._brake
|
|
||||||
})
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Moves the motor by a number of rotations, degress or seconds
|
* Moves the motor by a number of rotations, degress or seconds
|
||||||
* @param value the move quantity, eg: 2
|
* @param value the move quantity, eg: 2
|
||||||
@ -151,12 +153,13 @@ namespace motors {
|
|||||||
* @param speed the speed from ``100`` full forward to ``-100`` full backward, eg: 50
|
* @param speed the speed from ``100`` full forward to ``-100`` full backward, eg: 50
|
||||||
*/
|
*/
|
||||||
//% blockId=motorMove block="move `icons.motorLarge` %motor|for %value|%unit|at %speed|%"
|
//% blockId=motorMove block="move `icons.motorLarge` %motor|for %value|%unit|at %speed|%"
|
||||||
//% weight=98
|
//% weight=98 blockGap=8
|
||||||
//% speed.min=-100 speed.max=100
|
//% speed.min=-100 speed.max=100
|
||||||
|
//% group="Motion"
|
||||||
move(value: number, unit: MoveUnit, speed: number) {
|
move(value: number, unit: MoveUnit, speed: number) {
|
||||||
this.output(value, unit, speed, 0);
|
this.output(value, unit, speed, 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
private output(value: number, unit: MoveUnit, speed: number, turnRatio: number) {
|
private output(value: number, unit: MoveUnit, speed: number, turnRatio: number) {
|
||||||
this.__init();
|
this.__init();
|
||||||
speed = Math.clamp(-100, 100, speed >> 0);
|
speed = Math.clamp(-100, 100, speed >> 0);
|
||||||
@ -182,24 +185,14 @@ namespace motors {
|
|||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (this._follower) {
|
step(this._port, {
|
||||||
syncMotors(this._port | this._follower._port, {
|
useSteps: useSteps,
|
||||||
useSteps: useSteps,
|
step1: 0,
|
||||||
stepsOrTime: stepsOrTime,
|
step2: stepsOrTime,
|
||||||
speed: speed,
|
step3: 0,
|
||||||
turnRatio: turnRatio,
|
speed: speed,
|
||||||
useBrake: this._brake
|
useBrake: this._brake
|
||||||
})
|
})
|
||||||
} else {
|
|
||||||
step(this._port, {
|
|
||||||
useSteps: useSteps,
|
|
||||||
step1: 0,
|
|
||||||
step2: stepsOrTime,
|
|
||||||
step3: 0,
|
|
||||||
speed: speed,
|
|
||||||
useBrake: this._brake
|
|
||||||
})
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -207,8 +200,7 @@ namespace motors {
|
|||||||
*/
|
*/
|
||||||
private stop() {
|
private stop() {
|
||||||
this.__init();
|
this.__init();
|
||||||
if (this._follower) stop(this._port | this._follower._port);
|
stop(this._port);
|
||||||
else stop(this._port);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -218,6 +210,7 @@ namespace motors {
|
|||||||
//% blockId=outputMotorSetBrakeMode block="set `icons.motorLarge` %motor|brake %brake"
|
//% blockId=outputMotorSetBrakeMode block="set `icons.motorLarge` %motor|brake %brake"
|
||||||
//% brake.fieldEditor=toggleonoff
|
//% brake.fieldEditor=toggleonoff
|
||||||
//% weight=60 blockGap=8
|
//% weight=60 blockGap=8
|
||||||
|
//% group="Motion"
|
||||||
setBrake(brake: boolean) {
|
setBrake(brake: boolean) {
|
||||||
this.__init();
|
this.__init();
|
||||||
this._brake = brake;
|
this._brake = brake;
|
||||||
@ -229,6 +222,7 @@ namespace motors {
|
|||||||
//% blockId=motorSetReversed block="set `icons.motorLarge` %motor|reversed %reversed"
|
//% blockId=motorSetReversed block="set `icons.motorLarge` %motor|reversed %reversed"
|
||||||
//% reversed.fieldEditor=toggleonoff
|
//% reversed.fieldEditor=toggleonoff
|
||||||
//% weight=59
|
//% weight=59
|
||||||
|
//% group="Motion"
|
||||||
setReversed(reversed: boolean) {
|
setReversed(reversed: boolean) {
|
||||||
this.__init();
|
this.__init();
|
||||||
const b = mkCmd(this._port, DAL.opOutputPolarity, 1)
|
const b = mkCmd(this._port, DAL.opOutputPolarity, 1)
|
||||||
@ -242,6 +236,7 @@ namespace motors {
|
|||||||
*/
|
*/
|
||||||
//% blockId=motorSpeed block="`icons.motorLarge` %motor|speed"
|
//% blockId=motorSpeed block="`icons.motorLarge` %motor|speed"
|
||||||
//% weight=72 blockGap=8
|
//% weight=72 blockGap=8
|
||||||
|
//% group="Sensors"
|
||||||
speed(): number {
|
speed(): number {
|
||||||
this.__init();
|
this.__init();
|
||||||
return getMotorData(this._port).actualSpeed;
|
return getMotorData(this._port).actualSpeed;
|
||||||
@ -253,6 +248,7 @@ namespace motors {
|
|||||||
*/
|
*/
|
||||||
//% blockId=motorCount block="`icons.motorLarge` %motor|count"
|
//% blockId=motorCount block="`icons.motorLarge` %motor|count"
|
||||||
//% weight=71 blockGap=8
|
//% weight=71 blockGap=8
|
||||||
|
//% group="Sensors"
|
||||||
count(): number {
|
count(): number {
|
||||||
this.__init();
|
this.__init();
|
||||||
return getMotorData(this._port).count;
|
return getMotorData(this._port).count;
|
||||||
@ -264,6 +260,7 @@ namespace motors {
|
|||||||
*/
|
*/
|
||||||
//% blockId=motorTachoCount block="`icons.motorLarge` %motor|tacho count"
|
//% blockId=motorTachoCount block="`icons.motorLarge` %motor|tacho count"
|
||||||
//% weight=70
|
//% weight=70
|
||||||
|
//% group="Sensors"
|
||||||
tachoCount(): number {
|
tachoCount(): number {
|
||||||
this.__init();
|
this.__init();
|
||||||
return getMotorData(this._port).tachoCount;
|
return getMotorData(this._port).tachoCount;
|
||||||
@ -272,7 +269,7 @@ namespace motors {
|
|||||||
/**
|
/**
|
||||||
* Clears the motor count
|
* Clears the motor count
|
||||||
*/
|
*/
|
||||||
//%
|
//% group="Motion"
|
||||||
clearCount() {
|
clearCount() {
|
||||||
this.__init();
|
this.__init();
|
||||||
const b = mkCmd(this._port, DAL.opOutputClearCount, 0)
|
const b = mkCmd(this._port, DAL.opOutputClearCount, 0)
|
||||||
@ -285,27 +282,84 @@ namespace motors {
|
|||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Resets the motor and clears any synchronization
|
* Resets the motor.
|
||||||
*/
|
*/
|
||||||
//% blockId=motorReset block="reset `icons.motorLarge` %motor"
|
//% blockId=motorReset block="reset `icons.motorLarge` %motor"
|
||||||
//% weight=20
|
//% weight=20
|
||||||
|
//% group="Motion"
|
||||||
reset() {
|
reset() {
|
||||||
this.__init();
|
this.__init();
|
||||||
reset(this._port);
|
reset(this._port);
|
||||||
delete this._follower;
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
//% whenUsed fixedInstance block="large A"
|
||||||
|
export const largeA = new Motor(Output.A, true);
|
||||||
|
|
||||||
|
//% whenUsed fixedInstance block="large B"
|
||||||
|
export const largeB = new Motor(Output.B, true);
|
||||||
|
|
||||||
|
//% whenUsed fixedInstance block="large C"
|
||||||
|
export const largeC = new Motor(Output.C, true);
|
||||||
|
|
||||||
|
//% whenUsed fixedInstance block="large D"
|
||||||
|
export const largeD = new Motor(Output.D, true);
|
||||||
|
|
||||||
|
//% whenUsed fixedInstance block="medium A"
|
||||||
|
export const mediumA = new Motor(Output.A, false);
|
||||||
|
|
||||||
|
//% whenUsed fixedInstance block="medium B"
|
||||||
|
export const mediumB = new Motor(Output.B, false);
|
||||||
|
|
||||||
|
//% whenUsed fixedInstance block="medium C"
|
||||||
|
export const mediumC = new Motor(Output.C, false);
|
||||||
|
|
||||||
|
//% whenUsed fixedInstance block="medium D"
|
||||||
|
export const mediumD = new Motor(Output.D, false);
|
||||||
|
|
||||||
|
//% fixedInstances
|
||||||
|
export class SynchedMotorPair extends control.Component {
|
||||||
|
private _ports: Output;
|
||||||
|
private _brake: boolean;
|
||||||
|
|
||||||
|
constructor(ports: Output) {
|
||||||
|
super();
|
||||||
|
this._ports = ports;
|
||||||
|
this._brake = false;
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Synchronizes a follower motor to this motor
|
* Sets the speed of the motor.
|
||||||
* @param motor the leader motor, eg: motors.largeB
|
* @param speed the speed from ``100`` full forward to ``-100`` full backward, eg: 50
|
||||||
* @param follower the motor that follows this motor commands, eg: motors.largeC
|
|
||||||
*/
|
*/
|
||||||
//% blockId=motorSync block="sync `icons.motorLarge` %motor|with `icons.motorLarge` %follower"
|
//% blockId=motorPairSetSpeed block="set speed of `icons.motorLarge` %motor|to %speed|%"
|
||||||
//% weight=10 blockGap=8
|
//% on.fieldEditor=toggleonoff
|
||||||
sync(follower: Motor) {
|
//% weight=99 blockGap=8
|
||||||
this.__init();
|
//% speed.min=-100 speed.max=100
|
||||||
if (this == follower) return; // can't sync with self
|
//% group="Chassis"
|
||||||
this._follower = follower;
|
setSpeed(speed: number) {
|
||||||
|
speed = Math.clamp(speed >> 0, -100, 100);
|
||||||
|
if (!speed) {
|
||||||
|
stop(this._ports);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
syncMotors(this._ports, {
|
||||||
|
speed: speed,
|
||||||
|
turnRatio: 0,
|
||||||
|
useBrake: !!this._brake
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Sets the automatic brake on or off when the motor is off
|
||||||
|
* @param brake a value indicating if the motor should break when off
|
||||||
|
*/
|
||||||
|
//% blockId=motorPairSetBrakeMode block="set `icons.motorLarge` %chassis|brake %brake"
|
||||||
|
//% brake.fieldEditor=toggleonoff
|
||||||
|
//% weight=60 blockGap=8
|
||||||
|
//% group="Chassis"
|
||||||
|
setBrake(brake: boolean) {
|
||||||
|
this._brake = brake;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -315,14 +369,45 @@ namespace motors {
|
|||||||
* @param speed the speed from ``100`` full forward to ``-100`` full backward, eg: 50
|
* @param speed the speed from ``100`` full forward to ``-100`` full backward, eg: 50
|
||||||
* @param steering the ratio of power sent to the follower motor, from ``-100`` to ``100``
|
* @param steering the ratio of power sent to the follower motor, from ``-100`` to ``100``
|
||||||
*/
|
*/
|
||||||
//% blockId=motorTurn block="move steering `icons.motorLarge` %motor|at %speed|%|steer %turnRadio|%|by %value|%unit"
|
//% blockId=motorPairTurn block="move steering %chassis|at %speed|%|steer %turnRadio|%|by %value|%unit"
|
||||||
//% weight=9 blockGap=8
|
//% weight=9 blockGap=8
|
||||||
//% steering.min=-100 steering=100
|
//% steering.min=-100 steering=100
|
||||||
//% inlineInputMode=inline
|
//% inlineInputMode=inline
|
||||||
|
//% group="Chassis"
|
||||||
moveSteering(steering: number, speed: number, value: number, unit: MoveUnit) {
|
moveSteering(steering: number, speed: number, value: number, unit: MoveUnit) {
|
||||||
this.output(value, unit, speed, steering + 100);
|
speed = Math.clamp(-100, 100, speed >> 0);
|
||||||
}
|
if (!speed) {
|
||||||
|
stop(this._ports);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
const turnRatio = Math.clamp(-200, 200, steering + 100 >> 0);
|
||||||
|
let useSteps: boolean;
|
||||||
|
let stepsOrTime: number;
|
||||||
|
switch (unit) {
|
||||||
|
case MoveUnit.Rotations:
|
||||||
|
stepsOrTime = (value * 360) >> 0;
|
||||||
|
useSteps = true;
|
||||||
|
break;
|
||||||
|
case MoveUnit.Degrees:
|
||||||
|
stepsOrTime = value >> 0;
|
||||||
|
useSteps = true;
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
stepsOrTime = value;
|
||||||
|
useSteps = false;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
syncMotors(this._ports, {
|
||||||
|
useSteps: useSteps,
|
||||||
|
speed: speed,
|
||||||
|
turnRatio: turnRatio,
|
||||||
|
stepsOrTime: stepsOrTime,
|
||||||
|
useBrake: this._brake
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* The Move Tank block can make a robot drive forward, backward, turn, or stop.
|
* The Move Tank block can make a robot drive forward, backward, turn, or stop.
|
||||||
* Use the Move Tank block for robot vehicles that have two Large Motors,
|
* Use the Move Tank block for robot vehicles that have two Large Motors,
|
||||||
@ -334,42 +419,31 @@ namespace motors {
|
|||||||
* @param speedLeft the speed on the left motor, eg: 50
|
* @param speedLeft the speed on the left motor, eg: 50
|
||||||
* @param speedRight the speed on the right motor, eg: 50
|
* @param speedRight the speed on the right motor, eg: 50
|
||||||
*/
|
*/
|
||||||
//% blockId=motorTank block="move tank `icons.motorLarge` %motor|left %speedLeft|%|right %speedRight|%|by %value|%unit"
|
//% blockId=motorPairTank block="move tank %chassis|left %speedLeft|%|right %speedRight|%|by %value|%unit"
|
||||||
//% weight=9 blockGap=8
|
//% weight=9 blockGap=8
|
||||||
//% speedLeft.min=-100 speedLeft=100
|
//% speedLeft.min=-100 speedLeft=100
|
||||||
//% speedRight.min=-100 speedRight=100
|
//% speedRight.min=-100 speedRight=100
|
||||||
//% inlineInputMode=inline
|
//% inlineInputMode=inline
|
||||||
|
//% group="Chassis"
|
||||||
moveTank(speedLeft: number, speedRight: number, value: number, unit: MoveUnit) {
|
moveTank(speedLeft: number, speedRight: number, value: number, unit: MoveUnit) {
|
||||||
speedLeft = Math.clamp(speedLeft >> 0, -100, 100);
|
speedLeft = Math.clamp(speedLeft >> 0, -100, 100);
|
||||||
speedRight = Math.clamp(speedRight >> 0, -100, 100);
|
speedRight = Math.clamp(speedRight >> 0, -100, 100);
|
||||||
const steering =(speedRight * 100 / speedLeft) >> 0;
|
const steering = (speedRight * 100 / speedLeft) >> 0;
|
||||||
this.moveSteering(speedLeft, steering, value, unit);
|
this.moveSteering(speedLeft, steering, value, unit);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
//% whenUsed fixedInstance block="large A"
|
//% whenUsed fixedInstance block="large B+C"
|
||||||
export const largeMotorA = new Motor(Output.A, true);
|
export const largeBC = new SynchedMotorPair(Output.BC);
|
||||||
|
|
||||||
//% whenUsed fixedInstance block="large B"
|
//% whenUsed fixedInstance block="large A+D"
|
||||||
export const largeMotorB = new Motor(Output.B, true);
|
export const largeAD = new SynchedMotorPair(Output.AD);
|
||||||
|
|
||||||
//% whenUsed fixedInstance block="large C"
|
//% whenUsed fixedInstance block="large A+B"
|
||||||
export const largeMotorC = new Motor(Output.C, true);
|
export const largeAB = new SynchedMotorPair(Output.AB);
|
||||||
|
|
||||||
//% whenUsed fixedInstance block="large D"
|
//% whenUsed fixedInstance block="large C+D"
|
||||||
export const largeMotorD = new Motor(Output.D, true);
|
export const largeCD = new SynchedMotorPair(Output.CD);
|
||||||
|
|
||||||
//% whenUsed fixedInstance block="medium A"
|
|
||||||
export const mediumMotorA = new Motor(Output.A, false);
|
|
||||||
|
|
||||||
//% whenUsed fixedInstance block="medium B"
|
|
||||||
export const mediumMotorB = new Motor(Output.B, false);
|
|
||||||
|
|
||||||
//% whenUsed fixedInstance block="medium C"
|
|
||||||
export const mediumMotorC = new Motor(Output.C, false);
|
|
||||||
|
|
||||||
//% whenUsed fixedInstance block="medium D"
|
|
||||||
export const mediumMotorD = new Motor(Output.D, false);
|
|
||||||
|
|
||||||
function reset(out: Output) {
|
function reset(out: Output) {
|
||||||
let b = mkCmd(out, DAL.opOutputReset, 0)
|
let b = mkCmd(out, DAL.opOutputReset, 0)
|
||||||
|
@ -5,11 +5,13 @@ namespace brick {
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
//% color="#C8509B" weight=95
|
//% color="#C8509B" weight=95 icon="\uf192"
|
||||||
|
//% groups='["Ultrasonic Sensor", "Touch Sensor", "Color Sensor", "Infrared Sensor", "Remote Infrared Beacon", "Gyro Sensor"]'
|
||||||
namespace sensors {
|
namespace sensors {
|
||||||
}
|
}
|
||||||
|
|
||||||
//% color="#A5CA18" weight=90 icon="\uf185"
|
//% color="#A5CA18" weight=90 icon="\uf185"
|
||||||
|
//% groups='["Motion", "Sensors", "Chassis"]'
|
||||||
namespace motors {
|
namespace motors {
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user