more motor work

This commit is contained in:
Peli de Halleux 2017-12-14 17:01:23 -08:00
parent 9dedbeae1b
commit fcdc350e40
5 changed files with 197 additions and 115 deletions

View File

@ -53,28 +53,31 @@
"motors.Motor.clearCount": "Clears the motor count",
"motors.Motor.count": "Gets motor step count.",
"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|unit": "the meaning of the value",
"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|param|brake": "a value indicating if the motor should break when off",
"motors.Motor.setReversed": "Reverses the motor polarity",
"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.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.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",
"output.createBuffer": "Create a new zero-initialized buffer.",
"output.createBuffer|param|size": "number of bytes in the buffer",

View File

@ -15,10 +15,13 @@
"MoveUnit.Degrees|block": "degrees",
"MoveUnit.Rotations|block": "rotations",
"MoveUnit.Seconds|block": "seconds",
"Output.AB|block": "A+B",
"Output.AD|block": "A+D",
"Output.ALL|block": "All",
"Output.A|block": "A",
"Output.BC|block": "B+C",
"Output.B|block": "B",
"Output.CD|block": "C+D",
"Output.C|block": "C",
"Output.D|block": "D",
"brick.Button.isPressed|block": "`icons.brickButtons` %button|is pressed",
@ -40,24 +43,29 @@
"control.raiseEvent|block": "raise event|from %src|with value %value",
"control|block": "control",
"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.reset|block": "reset `icons.motorLarge` %motor",
"motors.Motor.setBrake|block": "set `icons.motorLarge` %motor|brake %brake",
"motors.Motor.setReversed|block": "set `icons.motorLarge` %motor|reversed %reversed",
"motors.Motor.setSpeed|block": "set speed of `icons.motorLarge` %motor|to %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.largeMotorA|block": "large A",
"motors.largeMotorB|block": "large B",
"motors.largeMotorC|block": "large C",
"motors.largeMotorD|block": "large D",
"motors.mediumMotorA|block": "medium A",
"motors.mediumMotorB|block": "medium B",
"motors.mediumMotorC|block": "medium C",
"motors.mediumMotorD|block": "medium D",
"motors.SynchedMotorPair.moveSteering|block": "move steering %chassis|at %speed|%|steer %turnRadio|%|by %value|%unit",
"motors.SynchedMotorPair.moveTank|block": "move tank %chassis|left %speedLeft|%|right %speedRight|%|by %value|%unit",
"motors.SynchedMotorPair.setBrake|block": "set `icons.motorLarge` %chassis|brake %brake",
"motors.SynchedMotorPair.setSpeed|block": "set speed of `icons.motorLarge` %motor|to %speed|%",
"motors.largeAB|block": "large A+B",
"motors.largeAD|block": "large A+D",
"motors.largeA|block": "large A",
"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|block": "motors",
"output|block": "output",
@ -73,6 +81,9 @@
"{id:category}Screen": "Screen",
"{id:category}Serial": "Serial",
"{id:group}Buttons": "Buttons",
"{id:group}Chassis": "Chassis",
"{id:group}Light": "Light",
"{id:group}Screen": "Screen"
"{id:group}Motion": "Motion",
"{id:group}Screen": "Screen",
"{id:group}Sensors": "Sensors"
}

View File

@ -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 {
}

View File

@ -8,7 +8,13 @@ enum Output {
//% block="D"
D = 0x08,
//% 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"
ALL = 0x0f
}
@ -79,7 +85,8 @@ namespace motors {
* Stops all motors
*/
//% blockId=motorStopAll block="stop all motors"
//% weight=19
//% weight=97
//% group="Motion"
export function stopAllMotors() {
const b = mkCmd(Output.ALL, DAL.opOutputStop, 0)
writePWM(b)
@ -92,7 +99,6 @@ namespace motors {
private _initialized: boolean;
private _brake: boolean;
private _follower: Motor; //
constructor(port: Output, large: boolean) {
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.
* @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
//% weight=99 blockGap=8
//% speed.min=-100 speed.max=100
//% group="Motion"
setSpeed(speed: number) {
this.__init();
speed = Math.clamp(-100, 100, speed >> 0);
if (!speed) { // always stop
this.stop();
} else {
if (this._follower) this.setSpeedSync(speed);
else this.setSpeedSingle(speed);
const b = mkCmd(this._port, DAL.opOutputSpeed, 1)
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
* @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
*/
//% blockId=motorMove block="move `icons.motorLarge` %motor|for %value|%unit|at %speed|%"
//% weight=98
//% weight=98 blockGap=8
//% speed.min=-100 speed.max=100
//% group="Motion"
move(value: number, unit: MoveUnit, speed: number) {
this.output(value, unit, speed, 0);
}
private output(value: number, unit: MoveUnit, speed: number, turnRatio: number) {
this.__init();
speed = Math.clamp(-100, 100, speed >> 0);
@ -182,24 +185,14 @@ namespace motors {
break;
}
if (this._follower) {
syncMotors(this._port | this._follower._port, {
useSteps: useSteps,
stepsOrTime: stepsOrTime,
speed: speed,
turnRatio: turnRatio,
useBrake: this._brake
})
} else {
step(this._port, {
useSteps: useSteps,
step1: 0,
step2: stepsOrTime,
step3: 0,
speed: speed,
useBrake: this._brake
})
}
step(this._port, {
useSteps: useSteps,
step1: 0,
step2: stepsOrTime,
step3: 0,
speed: speed,
useBrake: this._brake
})
}
/**
@ -207,8 +200,7 @@ namespace motors {
*/
private stop() {
this.__init();
if (this._follower) stop(this._port | this._follower._port);
else stop(this._port);
stop(this._port);
}
/**
@ -218,6 +210,7 @@ namespace motors {
//% blockId=outputMotorSetBrakeMode block="set `icons.motorLarge` %motor|brake %brake"
//% brake.fieldEditor=toggleonoff
//% weight=60 blockGap=8
//% group="Motion"
setBrake(brake: boolean) {
this.__init();
this._brake = brake;
@ -229,6 +222,7 @@ namespace motors {
//% blockId=motorSetReversed block="set `icons.motorLarge` %motor|reversed %reversed"
//% reversed.fieldEditor=toggleonoff
//% weight=59
//% group="Motion"
setReversed(reversed: boolean) {
this.__init();
const b = mkCmd(this._port, DAL.opOutputPolarity, 1)
@ -242,6 +236,7 @@ namespace motors {
*/
//% blockId=motorSpeed block="`icons.motorLarge` %motor|speed"
//% weight=72 blockGap=8
//% group="Sensors"
speed(): number {
this.__init();
return getMotorData(this._port).actualSpeed;
@ -253,6 +248,7 @@ namespace motors {
*/
//% blockId=motorCount block="`icons.motorLarge` %motor|count"
//% weight=71 blockGap=8
//% group="Sensors"
count(): number {
this.__init();
return getMotorData(this._port).count;
@ -264,6 +260,7 @@ namespace motors {
*/
//% blockId=motorTachoCount block="`icons.motorLarge` %motor|tacho count"
//% weight=70
//% group="Sensors"
tachoCount(): number {
this.__init();
return getMotorData(this._port).tachoCount;
@ -272,7 +269,7 @@ namespace motors {
/**
* Clears the motor count
*/
//%
//% group="Motion"
clearCount() {
this.__init();
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"
//% weight=20
//% group="Motion"
reset() {
this.__init();
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
* @param motor the leader motor, eg: motors.largeB
* @param follower the motor that follows this motor commands, eg: motors.largeC
* Sets the speed of the motor.
* @param speed the speed from ``100`` full forward to ``-100`` full backward, eg: 50
*/
//% blockId=motorSync block="sync `icons.motorLarge` %motor|with `icons.motorLarge` %follower"
//% weight=10 blockGap=8
sync(follower: Motor) {
this.__init();
if (this == follower) return; // can't sync with self
this._follower = follower;
//% blockId=motorPairSetSpeed block="set speed of `icons.motorLarge` %motor|to %speed|%"
//% on.fieldEditor=toggleonoff
//% weight=99 blockGap=8
//% speed.min=-100 speed.max=100
//% group="Chassis"
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 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
//% steering.min=-100 steering=100
//% inlineInputMode=inline
//% group="Chassis"
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.
* 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 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
//% speedLeft.min=-100 speedLeft=100
//% speedRight.min=-100 speedRight=100
//% inlineInputMode=inline
//% group="Chassis"
moveTank(speedLeft: number, speedRight: number, value: number, unit: MoveUnit) {
speedLeft = Math.clamp(speedLeft >> 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);
}
}
//% whenUsed fixedInstance block="large A"
export const largeMotorA = new Motor(Output.A, true);
//% whenUsed fixedInstance block="large B+C"
export const largeBC = new SynchedMotorPair(Output.BC);
//% whenUsed fixedInstance block="large B"
export const largeMotorB = new Motor(Output.B, true);
//% whenUsed fixedInstance block="large A+D"
export const largeAD = new SynchedMotorPair(Output.AD);
//% whenUsed fixedInstance block="large C"
export const largeMotorC = new Motor(Output.C, true);
//% whenUsed fixedInstance block="large A+B"
export const largeAB = new SynchedMotorPair(Output.AB);
//% whenUsed fixedInstance block="large D"
export const largeMotorD = new Motor(Output.D, true);
//% 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);
//% whenUsed fixedInstance block="large C+D"
export const largeCD = new SynchedMotorPair(Output.CD);
function reset(out: Output) {
let b = mkCmd(out, DAL.opOutputReset, 0)

View File

@ -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 {
}
//% color="#A5CA18" weight=90 icon="\uf185"
//% groups='["Motion", "Sensors", "Chassis"]'
namespace motors {
}