SumoBot
Thanks to its HC-SR04 distance sensor and line follower sensor, SumoBot detects other objects on the track it is in. Thanks to its line-following sensor, SumoBot detects whether it is inside the track and in this way carries the objects off the track.
SumoBot Arduino C Code
#define SensorLEFT 34 // IR pin
#define SensorRIGHT 35 // IR pin
int trigPin = 17; // Trigger
int echoPin = 16; // Echo
long duration, cm;
#define MotorA1 15
#define MotorA2 23
#define MotorB1 32
#define MotorB2 33
#define MotorC1 5
#define MotorC2 4
#define MotorD1 27
#define MotorD2 14
#define fast 255
#define mid 150
#define slow 100
#define THRESHOLD 3600
void forward() {
analogWrite(MotorA1, mid);
analogWrite(MotorA2, 0);
analogWrite(MotorB1, mid);
analogWrite(MotorB2, 0);
analogWrite(MotorC1, mid);
analogWrite(MotorC2, 0);
analogWrite(MotorD1, mid);
analogWrite(MotorD2, 0);
}
void slowforward() {
analogWrite(MotorA1, slow);
analogWrite(MotorA2, 0);
analogWrite(MotorB1, slow);
analogWrite(MotorB2, 0);
analogWrite(MotorC1, slow);
analogWrite(MotorC2, 0);
analogWrite(MotorD1, slow);
analogWrite(MotorD2, 0);
}
void right() {
analogWrite(MotorA1, mid);
analogWrite(MotorA2, 0);
analogWrite(MotorB1, mid);
analogWrite(MotorB2, 0);
analogWrite(MotorC1, 0);
analogWrite(MotorC2, mid);
analogWrite(MotorD1, 0);
analogWrite(MotorD2, mid);
}
void left() {
analogWrite(MotorA1, 0);
analogWrite(MotorA2, mid);
analogWrite(MotorB1, 0);
analogWrite(MotorB2, mid);
analogWrite(MotorC1, mid);
analogWrite(MotorC2, 0);
analogWrite(MotorD1, mid);
analogWrite(MotorD2, 0);
}
void stop() {
analogWrite(MotorA1, 0);
analogWrite(MotorA2, 0);
analogWrite(MotorB1, 0);
analogWrite(MotorB2, 0);
analogWrite(MotorC1, 0);
analogWrite(MotorC2, 0);
analogWrite(MotorD1, 0);
analogWrite(MotorD2, 0);
}
void backward() {
analogWrite(MotorA1, LOW);
analogWrite(MotorA2, mid);
analogWrite(MotorB1, LOW);
analogWrite(MotorB2, mid);
analogWrite(MotorC1, LOW);
analogWrite(MotorC2, mid);
analogWrite(MotorD1, LOW);
analogWrite(MotorD2, mid);
}
void setup() {
Serial.begin(115200);
pinMode(trigPin, OUTPUT);
pinMode(echoPin, INPUT);
pinMode(SensorLEFT, INPUT);
pinMode(SensorRIGHT, INPUT);
pinMode(MotorA1, OUTPUT);
pinMode(MotorA2, OUTPUT);
pinMode(MotorB1, OUTPUT);
pinMode(MotorB2, OUTPUT);
pinMode(MotorC1, OUTPUT);
pinMode(MotorC2, OUTPUT);
pinMode(MotorD1, OUTPUT);
pinMode(MotorD2, OUTPUT);
}
void loop() {
digitalWrite(trigPin, LOW);
delayMicroseconds(5);
digitalWrite(trigPin, HIGH);
delayMicroseconds(10);
digitalWrite(trigPin, LOW);
duration = pulseIn(echoPin, HIGH);
cm = (duration / 2) / 29.1;
/* Serial.print(cm);
Serial.print("cm");
Serial.print(" ");*/
delay(100);
int leftSensor = analogRead(SensorLEFT);
int rightSensor = analogRead(SensorRIGHT);
/*
Serial.print("leftSensor: ");
Serial.print(leftSensor);
Serial.print(" rightSensor: ");
Serial.println(rightSensor);
*/
if ((leftSensor < THRESHOLD && rightSensor < THRESHOLD)) {
stop();
delay(500);
backward();
delay(800);
left();
delay(400);
} else if ((cm < 15) && (leftSensor >= THRESHOLD && rightSensor >= THRESHOLD)) {
forward();
} else {
slowforward();
}
}
SumoBot MicroPython Code
import machine
from machine import Pin, ADC, PWM, Timer
from time import sleep
import utime
from rex import HCSR04
#IR pins
leftSensor = ADC(Pin(34))
rightSensor = ADC(Pin(35))
#motorA
motor_A1 = PWM(Pin(15))
motor_A1.duty_u16(0)
motor_A2 = PWM(Pin(23))
motor_A2.duty_u16(0)
#motorB
motor_B1 = PWM(Pin(32))
motor_B1.duty_u16(0)
motor_B2 = PWM(Pin(33))
motor_B2.duty_u16(0)
#motorC
motor_C1 = PWM(Pin(5))
motor_C1.duty_u16(0)
motor_C2 = PWM(Pin(4))
motor_C2.duty_u16(0)
#motorD
motor_D1 = PWM(Pin(27))
motor_D1.duty_u16(0)
motor_D2 = PWM(Pin(14))
motor_D2.duty_u16(0)
#speed values
MotorSpeed = 50000
#HCSR04
sensor = HCSR04(trigger_pin=17, echo_pin=16, echo_timeout_us=10000)
threshold = 65000
def forward(speed):
motor_A1.duty_u16(speed)
motor_A2.duty_u16(0)
motor_B1.duty_u16(speed)
motor_B2.duty_u16(0)
motor_C1.duty_u16(speed)
motor_C2.duty_u16(0)
motor_D1.duty_u16(speed)
motor_D2.duty_u16(0)
def right(speed):
motor_A1.duty_u16(speed)
motor_A2.duty_u16(0)
motor_B1.duty_u16(speed)
motor_B2.duty_u16(0)
motor_C1.duty_u16(0)
motor_C2.duty_u16(speed)
motor_D1.duty_u16(0)
motor_D2.duty_u16(speed)
def left(speed):
motor_A1.duty_u16(0)
motor_A2.duty_u16(speed)
motor_B1.duty_u16(0)
motor_B2.duty_u16(speed)
motor_C1.duty_u16(speed)
motor_C2.duty_u16(0)
motor_D1.duty_u16(speed)
motor_D2.duty_u16(0)
def backward(speed):
motor_A1.duty_u16(0)
motor_A2.duty_u16(speed)
motor_B1.duty_u16(0)
motor_B2.duty_u16(speed)
motor_C1.duty_u16(0)
motor_C2.duty_u16(speed)
motor_D1.duty_u16(0)
motor_D2.duty_u16(speed)
def stop():
motor_A1.duty_u16(0)
motor_A2.duty_u16(0)
motor_B1.duty_u16(0)
motor_B2.duty_u16(0)
motor_C1.duty_u16(0)
motor_C2.duty_u16(0)
motor_D1.duty_u16(0)
motor_D2.duty_u16(0)
while True:
distance = sensor.distance_cm()
#print(distance)
if distance <= 15:
leftSensorValue = leftSensor.read_u16()
rightSensorValue = rightSensor.read_u16()
#print(leftSensorValue)
#print(rightSensorValue)
sleep(0.02)
if leftSensorValue >= threshold or rightSensorValue >= threshold:
backward(MotorSpeed)
sleep(0.5)
elif leftSensorValue < threshold and rightSensorValue < threshold:
forward(MotorSpeed)
else:
stop()
else:
leftSensorValue = leftSensor.read_u16()
rightSensorValue = rightSensor.read_u16()
#print(leftSensorValue)
#print(rightSensorValue)
sleep(0.02)
if leftSensorValue >= threshold or rightSensorValue >= threshold:
backward(MotorSpeed)
sleep(0.5)
elif leftSensorValue < threshold and rightSensorValue < threshold:
left(MotorSpeed)
sleep(0.1)
stop()
else:
stop()