Intro

The Ultimate Guide to using Motors in Robotics (including ROS, Raspberry Pi)

A layered solution

Basic power, motor drivers

  • First layer- DC motor with appropriate supply voltage
    • ex) 12V DC motor connected to 12V battery with a switch

Motor Driver

  • Motor Driver: Need a way to change the speed and direction, and control it remotely

Pulse Width Modulation (PWM)

  • 30% Duty Cycle = 60% of max voltage
  • Motor driver takes PWM input and amplifies it (PWM output)

Motor Controllers (open and closed loop)

  • Motor controllers- A way to generate the PWM input signal
    • takes in target speed/direction as input

Open-loop control

  • A map between input and output signal

Close-loop control

  • Need a way to measure live motor speed and feed it back to the motor controller and make sure the speed is right

PID Control

  • Look at how far we are away from where we want to be and adjust our signal accordingly (bigger changes for bigger errors)

  • Encoders

Pi as motor controller

  • Why separate motor controller?
    • Modularity (easier to swap)
    • Allocation of compute resources

Comms layer

  • If motor controller is on same board as robot controller (e.g. raspberry pi), it makes it easier; otherwise, need a way to communicate

  • Onboard computer (rpi) transmit target speed (speed request)

  • Motor controller feed info back (speed, positions, currents, temps, etc)

  • Comms will often be a type of serial line

    • Also CAN, I2C, PWM
    • In this case we have a pi communicating to an Arduino using serial over USB

Robot controller and software driver

  • The overall control software for the robot needs to do 2 things:

    • Calculate the speeds it wants the motor to go
    • Needs to transmit those speeds, using appropriate protocol, to the motor controller
  • Robot Controller and “Driver” software

    • In normal ROS, this can be 2 different nodes communicating over topics
    • If using ros2_control
      • robot controller is ros2 controller
      • Driver- hardware interface- a separate library it loads to communicate with motors

picture 17

Demo circuit overview

  • Raspberry pi running a driver node in ROS- communicates over serial over USB to the motor controller giving it the speeds
  • Instead of having the robot controller on board a real robot, this demo just has another ROS node running on the Dev machine with a GUI
    • It will send the data over ROS topics over Wi-Fi

picture 18

Wiring the motor driver

  • L298N Motor Driver

    • Max 2A current per motor with 3A spikes
    • Very cheap, but has a large voltage drop- ex) with a 12V battery it will only get 9-10V out (running 75% speed)
  • Wiring

    • Bottom terminals: 12V in to power motors, 5V in to power the chip, and a common ground
      • In this case, 5V terminal is left empty
    • Pair of terminals on each side to supply power to the motors
    • Onboard jumper enables a 5V regulator (he removed b/c doesn’t want conflicts with his own 5V power supply)
    • 6 pins bottom right: control the motors
      • Outer pairs: control speed
      • Inner pairs: control direction

Making the motor controller, open-loop test

picture 20

  • Arduino nano
    • Would like to redo the controller with a raspberry pi pico
    • Instead of powering the nano over 5V, will power over USB
      • Using a USB hub- minimize the amount of current drawn from the pi
    • The 5V from arduino is piggybacked into the motor driver

picture 19

Arduino firmware

Test serial comms

  • Install miniterm
sudo apt install python3-serial
  • start miniterm
miniterm -e /dev/ttyUSB0 57600
  • Check current encoder values (0 if not plugged in)
e
0 0

Note: 255 = 1111 111 in binary

The largest 1 byte number

  • Run both motors at full speed in open-loop raw PWM mode
o 255 255
  • Run motor 2 in reverse
o 0 -150

Closed-loop with encoders

Set up ROS driver

  • Want to interact with it from a higher level
    • Raspberry pi connected to Arduino

Demo

  • See Serial Motor Demo
  • 2 ROS nodes
    • 1 node running on the pi listening for motor speeds on a topic and sending them to the controller
    • A GUI node on dev machine to send commands in a more user-friendly interface