The robot code is pretty simple: it continually reads data from the IR receiver and based on what it reads, controls the motor direction and speed.
The robot code is below. Save it to the Circuit Playground Express on the robot as code.py.
# SPDX-FileCopyrightText: 2018 Dave Astels for Adafruit Industries
#
# SPDX-License-Identifier: MIT
import board
import pulseio
import adafruit_irremote
from adafruit_crickit import crickit
# Control debug output: it takes time so don't unless you're debugging
DEBUG_LOG = False
# Control codes
STOP = 0x01
ROTATE_LEFT = 0x02
ROTATE_RIGHT = 0x03
FORWARD = 0x04
FORWARD_LEFT = 0x05
FORWARD_RIGHT = 0x06
REVERSE = 0x07
REVERSE_LEFT = 0x08
REVERSE_RIGHT = 0x09
left_wheel = crickit.dc_motor_1
right_wheel = crickit.dc_motor_2
def log(s):
"""Optionally output some text.
:param string s: test to output
"""
if DEBUG_LOG:
print(s)
# These allow easy correction for motor speed variation.
# Factors are determined by observation and fiddling.
# Start with both having a factor of 1.0 (i.e. none) and
# adjust until the bot goes more or less straight
def set_right(speed):
right_wheel.throttle = speed * 0.9
def set_left(speed):
left_wheel.throttle = speed
# Uncomment this to find the above factors
# set_right(1.0)
# set_left(1.0)
# while True:
# pass
# Create a 'pulseio' input, to listen to infrared signals on the IR receiver
pulsein = pulseio.PulseIn(board.IR_RX, maxlen=120, idle_state=True)
# Create a decoder that will take pulses and turn them into numbers
decoder = adafruit_irremote.GenericDecode()
while True:
# Listen for incoming IR pulses
pulses = decoder.read_pulses(pulsein)
# Try and decode them
try:
# Attempt to convert received pulses into numbers
received_code = decoder.decode_bits(pulses)
except adafruit_irremote.IRNECRepeatException:
# We got an unusual short code, probably a 'repeat' signal
log("NEC repeat!")
continue
except adafruit_irremote.IRDecodeException as e:
# Something got distorted or maybe its not an NEC-type remote?
log("Failed to decode: {}".format(e.args))
continue
if received_code == [STOP] * 4:
log("STOP")
set_left(0.0)
set_right(0.0)
elif received_code == [ROTATE_LEFT] * 4:
log("ROTATE_LEFT")
set_left(-0.25)
set_right(0.25)
elif received_code == [ROTATE_RIGHT] * 4:
log("ROTATE_RIGHT")
set_left(0.25)
set_right(-0.25)
elif received_code == [FORWARD] * 4:
log("FORWARD")
set_left(0.5)
set_right(0.5)
elif received_code == [FORWARD_LEFT] * 4:
log("FORWARD_LEFT")
set_left(0.0)
set_right(0.5)
elif received_code == [FORWARD_RIGHT] * 4:
log("FORWARD_RIGHT")
set_left(0.5)
set_right(0.0)
elif received_code == [REVERSE] * 4:
log("REVERSE")
set_left(-0.5)
set_right(-0.5)
elif received_code == [REVERSE_LEFT] * 4:
log("REVERSE_LEFT")
set_left(-0.25)
set_right(-0.5)
elif received_code == [REVERSE_RIGHT] * 4:
log("REVERSE_RIGHT")
set_left(-0.5)
set_right(-0.25)
else:
log("UNKNOWN")
Page last edited January 22, 2025
Text editor powered by tinymce.