basic servo simulation (#297)
This commit is contained in:
parent
237c5c019b
commit
4963bf776a
@ -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));
|
||||||
}
|
}
|
||||||
|
@ -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": {
|
||||||
|
3
libs/core/shims.d.ts
vendored
3
libs/core/shims.d.ts
vendored
@ -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;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -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()
|
||||||
@ -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,
|
||||||
|
@ -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) {
|
||||||
|
Loading…
Reference in New Issue
Block a user