Board Definition

The simulator “board” contains the current state of the simulated system. It is important to store all the state within the board instance as PXT will reuse the same simulator IFrame for multiple runs.vc0

    interface BoardDefinition {
        visual: BoardImageDefinition | string,
        gpioPinBlocks?: string[][],
        gpioPinMap: { [pin: string]: string },
        groundPins: string[],
        threeVoltPins: string[],
        fiveVoltPins: string[],
        attachPowerOnRight?: boolean,
        onboardComponents?: string[]
        marginWhenBreadboarding?: [number, number, number, number],
        spiPins?: {
            MOSI: string,
            MISO: string,
            SCK: string,
        i2cPins?: {
            SDA: string,
            SCL: string,

    interface BoardImageDefinition {
        image: string,
        outlineImage?: string,
        width: number,
        height: number,
        pinDist: number,
        pinBlocks: PinBlockDefinition[],
        leds?: LEDDefinition[]

Multiple core packages

It is possible to include multiple board definitions within one target. This is done by using multiple core packages (aka board packages), each corresponding to a specific board model. You just set "core": true in pxt.json of all the board packages and include them in bundleddirs in pxtarget.json. Make sure you give them unique (within target) name properties in pxt.json, especially when you’re copying an existing one.

You still have to pick one default in corepkg in pxtarget.json.

Users can change the board model of a project by adding a corresponding core package. Any existing core package will be removed.

The second step is setting simulator.dynamicBoardDefinition in pxtarget.json to true, and including board.json and possibly board.svg in the board packages.

The board.json file in board package contains the BoardDefinition structure defined above. The visual.image field would typically contain pkg://board.svg, which will be expanded to data-URI of the board.svg. You can also use a URL in /docs/static.

Typically, different board will have different pinouts. Look here at the bottom about how to handle that.