basic servo simulation (#297)

This commit is contained in:
Peli de Halleux 2016-11-01 08:16:03 -07:00 committed by GitHub
parent 237c5c019b
commit 4963bf776a
5 changed files with 49 additions and 7 deletions

View File

@ -201,6 +201,7 @@ namespace pins {
*/ */
//% help=pins/servo-write-pin weight=20 //% help=pins/servo-write-pin weight=20
//% blockId=device_set_servo_pin block="servo write|pin %name|to %value" blockGap=8 //% blockId=device_set_servo_pin block="servo write|pin %name|to %value" blockGap=8
//% parts=microservo trackArgs=0
void servoWritePin(AnalogPin name, int value) { void servoWritePin(AnalogPin name, int value) {
PINOP(setServoValue(value)); PINOP(setServoValue(value));
} }

View File

@ -29,6 +29,37 @@
{"pinIndices": [2, 3]} {"pinIndices": [2, 3]}
] ]
}, },
"microservo": {
"simulationBehavior": "microservo",
"visual": {
"builtIn": "microservo",
"width": 74.85,
"height": 200,
"pinDistance": 10,
"pinLocations": [
{"x": 30, "y": 5},
{"x": 37, "y": 5},
{"x": 45, "y": 5}
]
},
"numberOfPins": 3,
"pinDefinitions": [
{"target": {"pinInstantiationIdx": 0}, "style": "croc", "orientation": "+Z"},
{"target": "threeVolt", "style": "croc", "orientation": "+Z"},
{"target": "ground", "style": "croc", "orientation": "+Z"}
],
"instantiation": {
"kind": "function",
"fullyQualifiedName": "pins.servoWritePin",
"argumentRoles": [
{"pinInstantiationIdx": 0, "partParameter": "name"}
]
},
"assembly": [
{"part": true, "pinIndices": [2]},
{"pinIndices": [0, 1]}
]
},
"neopixel": { "neopixel": {
"simulationBehavior": "neopixel", "simulationBehavior": "neopixel",
"visual": { "visual": {

View File

@ -585,7 +585,8 @@ declare namespace pins {
* @param value angle or rotation speed, eg:180,90,0 * @param value angle or rotation speed, eg:180,90,0
*/ */
//% help=pins/servo-write-pin weight=20 //% help=pins/servo-write-pin weight=20
//% blockId=device_set_servo_pin block="servo write|pin %name|to %value" blockGap=8 shim=pins::servoWritePin //% blockId=device_set_servo_pin block="servo write|pin %name|to %value" blockGap=8
//% parts=microservo trackArgs=0 shim=pins::servoWritePin
function servoWritePin(name: AnalogPin, value: number): void; function servoWritePin(name: AnalogPin, value: number): void;
/** /**

View File

@ -12,7 +12,9 @@ namespace pxsim {
lightSensorState: LightSensorState; lightSensorState: LightSensorState;
buttonPairState: ButtonPairState; buttonPairState: ButtonPairState;
radioState: RadioState; radioState: RadioState;
// TODO: not singletons
neopixelState: NeoPixelState; neopixelState: NeoPixelState;
microServoState: MicroServoState;
constructor() { constructor() {
super() super()
@ -48,7 +50,7 @@ namespace pxsim {
0, 0,
0, 0,
DAL.MICROBIT_ID_IO_P19, DAL.MICROBIT_ID_IO_P19,
DAL.MICROBIT_ID_IO_P20 DAL.MICROBIT_ID_IO_P20
] ]
}); });
this.builtinParts["radio"] = this.radioState = new RadioState(runtime); this.builtinParts["radio"] = this.radioState = new RadioState(runtime);
@ -58,14 +60,17 @@ namespace pxsim {
this.builtinParts["lightsensor"] = this.lightSensorState = new LightSensorState(); this.builtinParts["lightsensor"] = this.lightSensorState = new LightSensorState();
this.builtinParts["compass"] = this.compassState = new CompassState(); this.builtinParts["compass"] = this.compassState = new CompassState();
this.builtinParts["neopixel"] = this.neopixelState = new NeoPixelState(); this.builtinParts["neopixel"] = this.neopixelState = new NeoPixelState();
this.builtinParts["microservo"] = this.microServoState = new MicroServoState();
this.builtinVisuals["buttonpair"] = () => new visuals.ButtonPairView(); this.builtinVisuals["buttonpair"] = () => new visuals.ButtonPairView();
this.builtinVisuals["ledmatrix"] = () => new visuals.LedMatrixView(); this.builtinVisuals["ledmatrix"] = () => new visuals.LedMatrixView();
this.builtinVisuals["neopixel"] = () => new visuals.NeoPixelView(); this.builtinVisuals["neopixel"] = () => new visuals.NeoPixelView();
this.builtinVisuals["microservo"] = () => new visuals.MicroServoView();
this.builtinPartVisuals["buttonpair"] = (xy: visuals.Coord) => visuals.mkBtnSvg(xy); this.builtinPartVisuals["buttonpair"] = (xy: visuals.Coord) => visuals.mkBtnSvg(xy);
this.builtinPartVisuals["ledmatrix"] = (xy: visuals.Coord) => visuals.mkLedMatrixSvg(xy, 8, 8); this.builtinPartVisuals["ledmatrix"] = (xy: visuals.Coord) => visuals.mkLedMatrixSvg(xy, 8, 8);
this.builtinPartVisuals["neopixel"] = (xy: visuals.Coord) => visuals.mkNeoPixelPart(xy); this.builtinPartVisuals["neopixel"] = (xy: visuals.Coord) => visuals.mkNeoPixelPart(xy);
this.builtinPartVisuals["microservo"] = (xy: visuals.Coord) => visuals.mkMicroServoPart(xy);
} }
receiveMessage(msg: SimulatorMessage) { receiveMessage(msg: SimulatorMessage) {
@ -97,7 +102,7 @@ namespace pxsim {
const cmpDefs = msg.partDefinitions || {}; const cmpDefs = msg.partDefinitions || {};
const fnArgs = msg.fnArgs; const fnArgs = msg.fnArgs;
const opts : visuals.BoardHostOpts = { const opts: visuals.BoardHostOpts = {
state: this, state: this,
boardDef: boardDef, boardDef: boardDef,
partsList: cmpsList, partsList: cmpsList,

View File

@ -11,7 +11,7 @@ namespace pxsim.input {
if (!pin) return; if (!pin) return;
pin.isTouched(); pin.isTouched();
pxtcore.registerWithDal(pin.id, DAL.MICROBIT_BUTTON_EVT_UP, handler); pxtcore.registerWithDal(pin.id, DAL.MICROBIT_BUTTON_EVT_UP, handler);
} }
export function pinIsPressed(pinId: number): boolean { export function pinIsPressed(pinId: number): boolean {
let pin = getPin(pinId); let pin = getPin(pinId);
@ -73,7 +73,11 @@ namespace pxsim.pins {
export function servoWritePin(pinId: number, value: number) { export function servoWritePin(pinId: number, value: number) {
analogSetPeriod(pinId, 20000); analogSetPeriod(pinId, 20000);
// TODO // TODO: per pin state
if (board().microServoState.angle != value) {
board().microServoState.angle = value;
runtime.queueDisplayUpdate();
}
} }
export function servoSetPulse(pinId: number, micros: number) { export function servoSetPulse(pinId: number, micros: number) {