Introduction: How to Move Lego Motors Autonomously Using Arduino

You have lego power function motors and receiver, but how do you get the motors to move autonomously? Enter the Arduino! This Instructable will show you how to move your lego power function sets without using the lego infrared transmitter.

Supplies

Lego Servo Motor

Lego Medium, Large, or Extra Large Motor

Lego Battery

Lego Infrared Receiver

Axle - length of 6 or higher (quantity 2)

2 inch piece of masking tape (quantity 2)

9 Volt Battery

Arduino and breadboard with cable to connect to your computer

Infrared Transmitter

330 ohm resistor

Wires

Arduino Software

Power Functions Library

Step 1: Arduino Software Set Up

1) Download the Arduino software from https://www.arduino.cc/en/Main/Software (see photo 1)

Note: It is free - donation is optional.

2) Follow the directions to install the software for your system.

3) Open the Arduino software (see photo 2).

4) Connect Computer to Arduino (see photo 3).

5) Select Board that you are using (see photo 4).

6) Select Processor - information typically comes with the Board (see photo 5).

7) Select Port that you are using for connection (see photo 6).

Step 2: Power Function Library Set Up

The Arduino program (by itself) does not have support for the Lego Power Functions. However, someone has written a piece of code to add this function to the Arduino. Pieces of code like this are called libraries and they have an extension of .h. In order to use a library you have to add it to your version of Arduino:

1) Download LEGOPowerFunctions.zip from http://basbase.com/robocam/LEGOPowerFunctions.zip (see photo 1).

2) Select Sketch - Include Library - Add .zip Library (see photo 2).

3) Select LEGOPowerFunctions.zip (see photo 3) from your hard drive where you downloaded the library.

4) Check that legopowerfunctions has been included in your software (see photo 4).

Step 3: Infrared Transmitter Set Up

Connect infrared transmitter and resistor (photos 1 and 2) to Arduino.

Insert short wire of the infrared transmitter into ground row of the Arduino (see photo 1).

Insert long wire of the infrared transmitter into empty row of the Arduino (see photo 2).

Insert one end of resistor into empty row (same as the long wire from the infrared transmitter) of the Arduino (see photo 2).

Insert other end of resistor into D12 row of the Arduino (see photo 1).

Step 4: Write Arduino Code

1) Open Arduino (if it is not already open). When you open Arduino a new file should appear. If it does not, then select File-New (see photo 1).

2) Save (see photo 2) the file using the name "Test_PFMotors".

Every Arduino sketch (file) has two main parts (see photo 3):

void setup() - sets things up that have to be done once and then don’t happen again.

Under void setup() - the { } are important - they define what is included in setup.

void loop() - contains the instructions that get repeated over and over until the Arduino board is turned off.

Under void loop() - the { } are important - they define what is included in the loop.

Note: Anything following // are simply notes - the computer, when running the file/program, ignores these.

Note: A semicolon should complete each line of code.

Step 5: Writing Power Functions Motor Code

Select a medium, large, or extra large lego motor (the code is the same for each).

The basic code for controlling lego motors is

lego.SingleOutput(0, direction/speed, connection color on Lego Receiver, channel on Lego Receiver)

Options for direction/speed

PWD_FWD - moves the motor clockwise

FWD1, FWD2, FWD3, FWD4, FWD5, FWD6, FWD7 are speed options from 1 (slow) to 7 (fast)

PWD_REV - moves the motor counterclockwise

REV1, REV2, REV3, REV4, REV5, REV6, REV7 are speed options from 1 (slow) to 7 (fast)

PWM_BRK - stops the motor

PWM_FLT - floats the motor (essentials stops the motor but not immediately)

Options for Color

red or blue - the two color connections on the Lego Infrared Receiver (see photo 1). We will use blue for motor.

Options for Channel

1 or 2 or 3 or 4 - the four channel options on the Lego Infrared Receiver (from high to low using the orange switch (see photo 2 for channel 1 setting).

Sample Code

#include <legopowerfunctions.h> //this step is required for use of legopowerfunctions library

LEGOPowerFunctions lego(12); //pin where infrared transmitter is connected

void setup() {

//nothing required

}

void loop() {

lego.SingleOutput(0, PWM_FWD4, BLUE, CH1); // clockwise medium speed

delay (1000); //1 second delay between commands

lego.SingleOutput(0, PWM_BRK, BLUE, CH1); // stops the motor

delay (1000); //1 second delay

lego.SingleOutput(0, PWM_REV4, BLUE, CH1); // counterclockwise medium speed

delay (1000); //1 second delay

lego.SingleOutput(0, PWM_FLT, BLUE, CH1);

delay (1000); //1 second delay

}

Copy and paste the code into an Arduino file you set up in the previous step.

Step 6: Upload and Run Motor Code - Make It Move

1) Ensure that the lego motor is connected to the blue port on the lego receiver and that the lego receiver is connected to the battery. Also, ensure that the Arduino is connected to your computer (see photo 1).

2) Put an axle into the motor along with a strip of masking tape around the end. The masking tape makes it easier to watch the turning of the motor (see photo 1).

3) Verify the code (see photo 2).

4) Upload this file to the Arduino (see photo 3).

5) Watch the motor as the Arduino runs the code.

Step 7: Write and Run (Make It Move) Power Functions Code for Servo Motor

1) Writing code for servo motor.

The basic code for controlling lego servo is:

lego.SingleOutput(0, direction/distance, connection color on Lego Receiver, channel on Lego Receiver)

Options for direction/distance
PWD_FWD - moves the motor clockwise

FWD1, FWD2, FWD3, FWD4, FWD5, FWD6, FWD7 are distance options from 1(short distance) to 7 (longer distance)

PWD_REV - moves the motor counterclockwise

REV1, REV2, REV3, REV4, REV5, REV6, REV7 are distance options from 1 (short distance) to 7 (longer distance)

PWM_BRK - stops the motor

PWM_FLT - turns the servo motor to 90 degree or neutral position

Options for Color

red or blue - the two color connections on the Lego Infrared Receiver. We will use red for the servo.

Options for Channel

1 or 2 or 3 or 4 - the four channel options on the Lego Infrared Receiver. Leave receiver at channel 1.

Sample Code

#include <legopowerfunctions.h> //this step is required for use of legopowerfunctions library

LEGOPowerFunctions lego(12); //pin where infrared transmitter is connected


void setup() {

//nothing required

}

void loop() {

lego.SingleOutput(0, PWM_FLT, RED, CH1); // Center

delay(1000);

lego.SingleOutput(0, PWM_FWD1, RED, CH1); //clockwise delay(1000);

lego.SingleOutput(0, PWM_FLT, RED, CH1); // Center

delay(1000);

lego.SingleOutput(0, PWM_FWD2, RED, CH1); //clockwise

delay(1000);

lego.SingleOutput(0, PWM_FLT, RED, CH1); // Center

delay(1000);

lego.SingleOutput(0, PWM_FWD3, RED, CH1); //clockwise

delay(1000);

lego.SingleOutput(0, PWM_FLT, RED, CH1); // Center

delay(1000);

lego.SingleOutput(0, PWM_FWD4, RED, CH1); //clockwise

delay(1000);

lego.SingleOutput(0, PWM_FLT, RED, CH1); // Center

delay(1000);

lego.SingleOutput(0, PWM_FWD5, RED, CH1); //clockwise

delay(1000);

lego.SingleOutput(0, PWM_FLT, RED, CH1); // Center

delay(1000);

lego.SingleOutput(0, PWM_FWD6, RED, CH1); //clockwise

delay(1000);

lego.SingleOutput(0, PWM_FLT, RED, CH1); // Center

delay(1000);

lego.SingleOutput(0, PWM_FWD7, RED, CH1); //clockwise

delay(1000);

lego.SingleOutput(0, PWM_FLT, RED, CH1); // Center

delay(1000);

lego.SingleOutput(0, PWM_REV1, RED, CH1); //counter clockwise

delay(1000);

lego.SingleOutput(0, PWM_FLT, RED, CH1); // Center

delay(1000);

lego.SingleOutput(0, PWM_REV2, RED, CH1); //counter clockwise

delay(1000);

lego.SingleOutput(0, PWM_FLT, RED, CH1); // Center

delay(1000);

lego.SingleOutput(0, PWM_REV3, RED, CH1); //counter clockwise

delay(1000);

lego.SingleOutput(0, PWM_FLT, RED, CH1); // Center

delay(1000);

lego.SingleOutput(0, PWM_REV4, RED, CH1); //counter clockwise

delay(1000);

lego.SingleOutput(0, PWM_FLT, RED, CH1); // Center

delay(1000);

lego.SingleOutput(0, PWM_REV5, RED, CH1); //counter clockwise

delay(1000);

lego.SingleOutput(0, PWM_FLT, RED, CH1); // Center

delay(1000);

lego.SingleOutput(0, PWM_REV6, RED, CH1); //counter clockwise

delay(1000);

lego.SingleOutput(0, PWM_FLT, RED, CH1); // Center

delay(1000);

lego.SingleOutput(0, PWM_REV7, RED, CH1); //counter clockwise

delay(1000);

lego.SingleOutput(0, PWM_FLT, RED, CH1); // Center

delay(2000);

}

2) Copy and paste the code into a new Arduino file. Save as servoTest.

3) Ensure that the lego servo is connected to the red port on the lego receiver and that the lego receiver is connected to the battery. Put an axle into the servo motor along with a strip of masking tape around the end. The masking tape makes it easier to watch the turning of the motor.

4) Verify the code.

5) Upload this file to the Arduino and test it.

6) Watch the servo motor.

Step 8: Next Steps

1) Connect both the servo motor and medium/large/extra large motor to the infrared receiver (see photo 1). Select one of your power function sets and use parts of the code in the previous steps to create your own code.

2) Add sensors, (e.g., ultrasonic (see photo 2)) as input. Then, using if/then coding have the motors respond according to sensor input.

3) Remove connection from computer and add 9 volt battery so you are not tethered to your computer.

Connect positive (blue in photo) to port Vin (see photo 3).

Connect negative (dark red in photo) to port Ground (see photo 3).

Make it Move Contest 2020

Participated in the
Make it Move Contest 2020