Carey Payette
Published © CC BY

Windows IoT: Basic Control of a Two Wheel Robot

Learn the basics of building and controlling a two wheel robot with two DC motors and the L293D chip using Windows IoT Core.

BeginnerFull instructions provided2 hours2,787
Windows IoT: Basic Control of a Two Wheel Robot

Things used in this project

Hardware components

Raspberry Pi 2 Model B
Raspberry Pi 2 Model B
×1
Adafruit L293D
×1
Adafruit Round Robot Chassis Kit
×1
Adafruit Pi Cobber
×1
Breadboard (generic)
Breadboard (generic)
×1
Male/Male Jumper Wires
×1

Software apps and online services

Windows 10 IoT Core
Microsoft Windows 10 IoT Core

Story

Read more

Schematics

Wiring Setup

Code

XAML UI Definition

Plain text
<Page
    x:Class="PiDCMotorControl.MainPage"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:local="using:PiDCMotorControl"
    xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
    xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
    mc:Ignorable="d">
 
    <Grid Background="{ThemeResource ApplicationPageBackgroundThemeBrush}">
        <Grid.RowDefinitions>
            <RowDefinition Height="50" />
            <RowDefinition Height="50" />
            <RowDefinition Height="50" />
            <RowDefinition Height="50" />
            <RowDefinition Height="50" />
            <RowDefinition Height="50" />
        </Grid.RowDefinitions>
        <Grid.ColumnDefinitions>
            <ColumnDefinition Width="200" />
            <ColumnDefinition Width="200" />
            <ColumnDefinition />
        </Grid.ColumnDefinitions>
        <TextBlock FontSize="30" Grid.Row="1" Grid.ColumnSpan="3">Motor Control</TextBlock>
        <Button Name="btnIgnitionOn" Margin="5" Background="Green" Foreground="White"  Grid.Row="2" 
                Click="btnIgnitionOn_Click">Ignition ON</Button>
        <Button Name="btnIgnitionOff" Margin="5" Background="Red" Foreground="White" IsEnabled="False" 
                Grid.Row="2" Grid.Column="1" Click="btnIgnitionOff_Click">Ignition Off</Button>
        <Button Name="btnForward" Margin="5" Background="LightBlue" Foreground="DarkBlue" IsEnabled="False" 
                Grid.Row="3" Click="btnForward_Click">Forward</Button>
        <Button Name="btnReverse" Margin="5" Background="Orange" Foreground="OrangeRed" IsEnabled="False" 
                Grid.Row="3" Grid.Column="1" Click="btnReverse_Click">Reverse</Button>
        <Button Name="btnRight" Margin="5" Background="Orchid" Foreground="White" IsEnabled="False"
                Grid.Row="4" Grid.Column="0" Click="btnRight_Click">Turn Right</Button>
        <Button Name="btnLeft"  Margin="5" Background="Goldenrod"  Foreground="Green " IsEnabled="False" 
                Grid.Row="4" Grid.Column="1" Click="btnLeft_Click">Turn Left</Button>
        <Button Name="btnStop" Click="btnStop_Click" Background="Salmon" Foreground="Sienna" IsEnabled="True"
                Grid.Row="5" Margin="5">Stop</Button>
     </Grid>
</Page>

UI Implementation File

Plain text
using Windows.Devices.Gpio;
using Windows.UI.Xaml;
using Windows.UI.Xaml.Controls;
 
namespace PiDCMotorControl
{
    /// <summary>
    /// Basic Bi-Directional Control of a Two Wheel Robot with DC Motors
    /// </summary>
    public sealed partial class MainPage : Page
    {
        private int _pinEn1_2 = 21; 
        private int _pin1A = 20; 
        private int _pin2A = 16;
        private int _pinEn3_4 = 24;
        private int _pin3A = 25;
        private int _pin4A = 12;
 
        private GpioController _controller;
        private GpioPin _motorEnableMotorLeft;
        private GpioPin _motorControl1AMotorLeft;
        private GpioPin _motorControl2AMotorLeft;
        private GpioPin _motorEnableMotorRight;
        private GpioPin _motorControl3AMotorRight;
        private GpioPin _motorControl4AMotorRight;
     
        public MainPage()
        {
            this.InitializeComponent();
 
            _controller = GpioController.GetDefault();
            _motorEnableMotorLeft = _controller.OpenPin(_pinEn1_2);
            _motorControl1AMotorLeft = _controller.OpenPin(_pin1A);
            _motorControl2AMotorLeft = _controller.OpenPin(_pin2A);
            _motorEnableMotorRight = _controller.OpenPin(_pinEn3_4);
            _motorControl3AMotorRight = _controller.OpenPin(_pin3A);
            _motorControl4AMotorRight = _controller.OpenPin(_pin4A);
            _motorEnableMotorLeft.SetDriveMode(GpioPinDriveMode.Output);
            _motorControl1AMotorLeft.SetDriveMode(GpioPinDriveMode.Output);
            _motorControl2AMotorLeft.SetDriveMode(GpioPinDriveMode.Output);
            _motorEnableMotorRight.SetDriveMode(GpioPinDriveMode.Output);
            _motorControl3AMotorRight.SetDriveMode(GpioPinDriveMode.Output);
            _motorControl4AMotorRight.SetDriveMode(GpioPinDriveMode.Output);
        }
 
        private void _turnOnIgnition()
        {
            _motorEnableMotorLeft.Write(GpioPinValue.High);
            _motorEnableMotorRight.Write(GpioPinValue.High);
        }
 
        private void _forwardMotor()
        {
            _motorControl1AMotorLeft.Write(GpioPinValue.High);
            _motorControl2AMotorLeft.Write(GpioPinValue.Low);
            _motorControl3AMotorRight.Write(GpioPinValue.High);
            _motorControl4AMotorRight.Write(GpioPinValue.Low);
        }
 
        private void _reverseMotor()
        {
            _motorControl1AMotorLeft.Write(GpioPinValue.Low);
            _motorControl2AMotorLeft.Write(GpioPinValue.High);
            _motorControl3AMotorRight.Write(GpioPinValue.Low);
            _motorControl4AMotorRight.Write(GpioPinValue.High);
        }
 
        private void _turnRight()
        {
            //right reverse, left forward
            _motorControl1AMotorLeft.Write(GpioPinValue.High);
            _motorControl2AMotorLeft.Write(GpioPinValue.Low);
            _motorControl3AMotorRight.Write(GpioPinValue.Low);
            _motorControl4AMotorRight.Write(GpioPinValue.High);
           
        }
        
        private void _turnLeft()
        {
            //left reverse, right forward
            _motorControl1AMotorLeft.Write(GpioPinValue.Low);
            _motorControl2AMotorLeft.Write(GpioPinValue.High);
            _motorControl3AMotorRight.Write(GpioPinValue.High);
            _motorControl4AMotorRight.Write(GpioPinValue.Low);
        }
 
        private void _stopMotor()
        {
            _motorControl1AMotorLeft.Write(GpioPinValue.Low);
            _motorControl2AMotorLeft.Write(GpioPinValue.Low);
            _motorControl3AMotorRight.Write(GpioPinValue.Low);
            _motorControl4AMotorRight.Write(GpioPinValue.Low);
        }
 
        private void _turnOffIgnition()
        {
            _motorEnableMotorLeft.Write(GpioPinValue.Low);
            _motorControl1AMotorLeft.Write(GpioPinValue.Low);
            _motorControl2AMotorLeft.Write(GpioPinValue.Low);
            _motorEnableMotorRight.Write(GpioPinValue.Low);
            _motorControl3AMotorRight.Write(GpioPinValue.Low);
            _motorControl4AMotorRight.Write(GpioPinValue.Low);
        }
 
        private void btnIgnitionOn_Click(object sender, RoutedEventArgs e)
        {
            btnIgnitionOn.IsEnabled = false;
            btnIgnitionOff.IsEnabled = true;
            btnForward.IsEnabled = true;
            btnReverse.IsEnabled = true;
            btnRight.IsEnabled = true;
            btnLeft.IsEnabled = true;
            _turnOnIgnition();
        }
 
        private void btnIgnitionOff_Click(object sender, RoutedEventArgs e)
        {
            btnIgnitionOn.IsEnabled = true;
            btnIgnitionOff.IsEnabled = false;
            btnForward.IsEnabled = false;
            btnReverse.IsEnabled = false;
            btnRight.IsEnabled = false;
            btnLeft.IsEnabled = false;
            _turnOffIgnition();
        }
 
        private void btnForward_Click(object sender, RoutedEventArgs e)
        {
            btnForward.IsEnabled = false;
            btnReverse.IsEnabled = true;
            btnRight.IsEnabled = true;
            btnLeft.IsEnabled = true;
            _forwardMotor();
        }
 
        private void btnReverse_Click(object sender, RoutedEventArgs e)
        {
            btnReverse.IsEnabled = false;
            btnForward.IsEnabled = true;
            btnRight.IsEnabled = true;
            btnLeft.IsEnabled = true;
            _reverseMotor();
        }
 
        private void btnStop_Click(object sender, RoutedEventArgs e)
        {
            btnForward.IsEnabled = true;
            btnReverse.IsEnabled = true;
            btnRight.IsEnabled = true;
            btnLeft.IsEnabled = true;
            _stopMotor();
        }
 
        private void btnRight_Click(object sender, RoutedEventArgs e)
        {
            btnForward.IsEnabled = true;
            btnReverse.IsEnabled = true;
            btnRight.IsEnabled = false;
            btnLeft.IsEnabled = true;
            _turnRight();
        }
 
        private void btnLeft_Click(object sender, RoutedEventArgs e)
        {
            btnForward.IsEnabled = true;
            btnReverse.IsEnabled = true;
            btnRight.IsEnabled = true;
            btnLeft.IsEnabled = false;
            _turnLeft();
        }
    }
}

Credits

Carey Payette

Carey Payette

13 projects • 134 followers
Sr. Software Engineer at Independent

Comments