brickpi3

0.9.8 • Public • Published

BrickPi3 package for nodejs

With this package you can control your BrickPi3 with nodejs.

This package has the same interface as the python library and was copied 1:1 with sligth language adjustments (bitwise operators are a bit different and the return values are promises). So just look at their examples (https://github.com/DexterInd/BrickPi3/tree/master/Software/Python/Examples) to see, how you can archive different tasks. Just remember, that you get promises back from most of the methods.

If you find any bugs, please open an issue or submit a pull request. I couldn't test everything, because I only have ev3 large motors. So I need your help to know if everything else works :)

Install

npm install --save brickpi3

Usage

const brickpi3 = require('brickpi3');
 
(async () => {
    try {
        let BP = new brickpi3.BrickPi3();
        
        //Make sure to stop and free all motors and sensors when the programm exits
        brickpi3.utils.resetAllWhenFinished(BP);
        
        //Resetting offset position of motor A to 0
        let encoder = await BP.get_motor_encoder(BP.PORT_A);
        await BP.offset_motor_encoder(BP.PORT_A, encoder);
        await BP.set_motor_power(BP.PORT_A, 10);
    } catch (err) {
        console.log(err);        
    }
})();

Utils

When you need to find the extreme offsets of the motor (f.e. an arm can only get from point a to point b but not beyond), there is a helper function available like explained in this video: https://youtu.be/d0bghBZZMUg?t=1m35s

const brickpi3 = require('brickpi3');
 
(async () => {
    try {
        let BP = new brickpi3.BrickPi3();
        brickpi3.utils.resetAllWhenFinished(BP);
        
        await brickpi3.utils.resetMotorEncoder(BP, BP.PORT_A, brickpi3.utils.RESET_MOTOR_LIMIT.MIDPOINT_LIMIT);
        await BP.set_motor_position(BP.PORT_A, 0);
        console.log("Motor should now be in the middle of its two extremes");
    } catch (err) {
        console.log(err);
    }
})();

For easier working with motors and sensors, you can get an instance of each of them and then access their methods:

const brickpi3 = require('brickpi3');
 
(async () => {
    try {
        let BP = new brickpi3.BrickPi3();
        brickpi3.utils.resetAllWhenFinished(BP);
        
        //Get the instance of one motor and sensor
        let motor = brickpi3.utils.getMotor(BP, BP.PORT_A);
        //getSensor has an optional third parameter which allows to overwrite the default configuration time limit
        let sensor = brickpi3.utils.getSensor(BP, BP.PORT_2);
        
        //First set the type of the sensor
        await sensor.setType(BP.SENSOR_TYPE.EV3_TOUCH);
        
        //You can also change the default configuration time limit (3000ms) for the sensor configuration after initialization
        sensor.setConfigurationTimeLimit(4000);
 
        //Reset the motors encoder to 0
        await motor.resetEncoder();
        
        //Rotates the motor one revolution - will resolve only when finished
        await motor.setPosition(360);
        
        //Powers on the motor until the callback function is true (good to use with sensors f.e.)
        await motor.setPower(50, async () => {
            return await sensor.getValue() === 1;
        });
    } catch (err) {
        console.log(err);
    }
})();

If you want to calculate, what gear ratio some connected gears have, there is also a helper:

const brickpi3 = require('brickpi3');
 
//A 8-teeth-gear drives a 24-teeth-gear, which is connected to another 8-teeth-gear, which drives another 24-teeth-gear
console.log(new brickpi3.utils.Gear(8).drive(24).connect(8).drive(24).getFactor());
// => 0.111 (so if you rotate the initial 8-teeth-gear one evolution, the last 24-teeth-gear will rotate 0.111 rounds in the same direction)

BrickPi3 Stacking

If you have multiple brickPi3's, you can stack them and control even more motors/sensors with a single raspberry pi.

First attach each brickPi separatly and execute the following script. You need to write down the id of each brickPi.

const brickpi3 = require('brickpi3');
 
(async () => {
    try {
        let BP = new brickpi3.BrickPi3();
        console.log(await BP.get_id());
    } catch (err) {
        console.log(err);
    }
})();

Then you can set the address for each of your brickPi's in the initializing part and access the four sensors and motors with each brickPi object instance.

const brickpi3 = require('brickpi3');
 
(async () => {
    try {
        await brickpi3.set_address(1, 'A778704A514D355934202020FF110722');
        await brickpi3.set_address(2, 'DF9E6AC3514D355934202020FF112718');
        
        const BP1 = new brickpi3.BrickPi3(1);
        const BP2 = new brickpi3.BrickPi3(2);
            
        brickpi3.utils.resetAllWhenFinished(BP1);
        brickpi3.utils.resetAllWhenFinished(BP2);
        
        const motor1 = brickpi3.utils.getMotor(BP1, BP1.PORT_A);
        const motor2 = brickpi3.utils.getMotor(BP2, BP2.PORT_A);
            
        //Reset Motor A offset of your first brickPi
        await motor1.resetEncoder();
            
        //Reset Motor A offset of your second brickPi
        await motor2.resetEncoder();
            
        //Let the motor A of your first brickPi turn constantly
        await motor1.setPower(10);
            
        //Let the motor A of your second brickPi rotate by 45° every two seconds.
        let target = 0;
        const moveOn = async () => {
            target = target + 45;
            await motor2.setPosition(target);
    
            setTimeout(moveOn, 2000);
        };
        moveOn();
            
    } catch(err) {
        console.log(err);
    }
})();

Special thanks

Thanks to Sumit Kumar (http://twitter.com/tweetsofsumit) for providing an example on how to communicate with the brickPi3 in nodejs on his repository.

Package Sidebar

Install

npm i brickpi3

Weekly Downloads

7

Version

0.9.8

License

MIT

Unpacked Size

1.42 MB

Total Files

8

Last publish

Collaborators

  • bywulf