3 Commits

Author SHA1 Message Date
e00fbebcc4 Upload files to "/" 2025-10-28 18:07:56 +00:00
3e2a37c035 Upload files to "/" 2025-10-28 18:05:04 +00:00
53d13476a9 Add missions/Heavy lifting.py 2025-10-19 03:02:40 +00:00
15 changed files with 50 additions and 351 deletions

View File

@@ -1,15 +0,0 @@
# Lineups
## These are the line-up positions for the robot game for various missions.
- Mission Run #1 (Mission #1) [Right/Blue Home] - The left yellow part of the right arm attachment is positioned with its right edge on the 5th thin line from the left. Note that this is NOT positioned from the back of the robot.
- Mission Run #2 (Send Over) [Right/Blue Home] - The robot should be lined up on the vertical edge of the left home. The robot's right side should be positioned on the 1st thin line from the top. Note that the 0th line is the one that is not part of the curve.
- Mission Run #3 (Sand mission) [Right/Blue Home] - The robot should be lined up on the vertical edge of the left home. The robot's left side should be positioned on the 1/2th thin line from the bottom.
- Mission Run #4 (Boat mission) [Left/Red Home] - The robot should be lined up on the vertical edge of the left home. The robot's right side should be positioned on the 2nd thick line from the bottom.
- Mission Run #5 (Bautism) [Left/Red Home] - The robot's left edge should be positioned at the 1st thick, 2nd thin line from the left.
- Mission Run #6 (Not-so-heavy Lifting) [Right/Blue Home] - The robot's right edge should be positioned at the 1st thick from the right.

148
README.md
View File

@@ -1,141 +1,25 @@
# 🤖 65266 Lego Dynamics - UNEARTHED Season
# 65266 Lego Dynamics - UNEARTHED Season Repository
<div align="center">
## Project Overview
**⚡ Competitive Robotics Code for FLL SUBMERGED℠ Season ⚡**
This repository contains the Pybricks code for Team 65266 Lego Dynamics' robot for the UNEARTHED season.
![Team](https://img.shields.io/badge/Team-65266%20Lego%20Dynamics-blue?style=for-the-badge)
![Season](https://img.shields.io/badge/Season-UNEARTHED-green?style=for-the-badge)
![License](https://img.shields.io/badge/License-GPL-red?style=for-the-badge)
## Robot Hardware
</div>
* **Robot Name:** Optimus Prime III
* **Robot Firmware:** PyBricks firmware
* **Motors:** Two large motors for attachments, C left, D right, Two small motors for drive, A left, B right
* **Sensors:** visible up-facing color sensor for quick starts
* **Attachments:** Lots of 'em
---
## Code Structure
## 📋 Project Overview
Files are the different runs we do, with each run consisting of one or multiple mission completions. Another script combines these files into a "master" file, which then adds the color-sensor-to-start logic.
Welcome to the official code repository for **Team 65266 Lego Dynamics**! This repository contains all the Pybricks code powering our robot through the UNEARTHED season missions. Our modular approach allows for flexible mission execution and quick color-sensor-based run selection.
## How to Use
---
Load the master file into PyBricks, then send it over to the robot. Then you hold a color LEGO up to the sensor to start it.
## 🦾 Robot Hardware
### 🎯 Meet Optimus Prime III
| Component | Specification |
|-----------|--------------|
| 🤖 **Robot Name** | Optimus Prime III |
| 💾 **Firmware** | Pybricks |
| 🔧 **Attachment Motors** | 2× Large Motors (Ports C & D) |
| 🚗 **Drive Motors** | 2× Small Motors (Ports A & B) |
| 👁️ **Sensors** | Up-facing Color Sensor (Quick Start) |
| 🛠️ **Attachments** | Multiple mission-specific tools |
### ⚙️ Motor Configuration
- **Port A**: Left Drive Motor (Small)
- **Port B**: Right Drive Motor (Small)
- **Port C**: Left Attachment Motor (Large)
- **Port D**: Right Attachment Motor (Large)
---
## 📂 Code Structure
Our codebase is organized for maximum efficiency and modularity:
```
📦 Repository
┣ 📜 run_1.py # Individual mission runs
┣ 📜 run_2.py # Each file = 1+ mission completions
┣ 📜 run_3.py
┣ 📜 ...
┗ 📜 master.py # 🎯 Combined master file with color-start logic
```
### 🔄 Workflow
1. **Individual Run Files** → Contain specific mission sequences
2. **Script Combination** → Merges runs into master file
3. **Color Sensor Logic** → Adds intelligent run selection based on color detection
---
## 🚀 How to Use
### 📥 Installation & Deployment
1. **Load the Code**
```bash
# Open the master.py file in Pybricks IDE
```
2. **🔌 Connect to Robot**
- Pair your robot via Bluetooth in Pybricks
3. **📤 Upload to Robot**
- Click "Download and Run" or send the program to the robot
4. **🎨 Start Your Run**
- Hold a colored LEGO brick up to the color sensor
- Different colors trigger different mission runs!
### 🎮 Color Start System
| 🟥 Red | 🟦 Blue | 🟩 Green | 🟨 Yellow |
|--------|---------|----------|-----------|
| Run 1 | Run 2 | Run 3 | Run 4 |
> **💡 Pro Tip**: Organize your colored bricks before the match for quick run selection!
---
## 🏆 Competition Notes
- ⏱️ **Quick Start**: Color sensor enables rapid run switching without reprogramming
- 🎯 **Modular Design**: Easy to test and modify individual missions
- 🔧 **Flexible Attachments**: Multiple tools optimized for different challenges
---
## 🤝 Contributing
Team members can contribute by:
- 🐛 Reporting bugs via Issues
- 💡 Suggesting mission optimizations
- 🧪 Testing new attachment designs
- 📝 Documenting successful strategies
---
## 📄 License
**GNU General Public License v3.0**
```
🔒 You can take inspiration from our code, but you can't take our exact code.
```
This project is licensed under GPL-3.0 - see the [LICENSE](LICENSE) file for complete details.
### 📖 What This Means:
- ✅ Learn from our approaches and strategies
- ✅ Understand our logic and algorithms
- ❌ Don't copy-paste our exact code
- ✅ Create your own unique implementations
---
## 📞 Contact & Support
**Team 65266 Lego Dynamics**
Questions about our approach? Interested in collaboration? Reach out!
---
<div align="center">
**🔧 Built with Passion | 🤖 Powered by Pybricks | 🏆 Competing for Excellence**
⭐ Star this repo if you found it helpful! ⭐
</div>
## License
GNU General Public License
You can take inspiration from our code, but you can't take our exact code.

BIN
bluetooth.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.3 KiB

View File

@@ -1,116 +0,0 @@
from pybricks.hubs import PrimeHub
from pybricks.pupdevices import Motor, ColorSensor
from pybricks.parameters import Port, Stop, Color, Direction
from pybricks.robotics import DriveBase
from pybricks.tools import wait, StopWatch, multitask, run_task
import asyncio
hub = PrimeHub()
left_motor = Motor(Port.A, Direction.COUNTERCLOCKWISE)
right_motor = Motor(Port.B)
atarm1 = Motor(Port.E, Direction.COUNTERCLOCKWISE)
atarm2 = Motor(Port.F)
drive_base = DriveBase(left_motor, right_motor, wheel_diameter=56, axle_track=112)
color_sensor = ColorSensor(Port.C)
drive_base.settings(300, 500, 300, 200)
Color.ORANGE = Color(10, 100, 100)
Color.MAGENTA = Color(321, 100, 86)
async def Run1():
left_arm.run_angle(1000, 300)
right_arm.run_angle(1000,500)
await drive_base.straight(320)
await right_arm.run_angle(5000,-500, Stop.HOLD)
await right_arm.run_angle(5000,500, Stop.HOLD)
await right_arm.run_angle(5000,-500, Stop.HOLD)
await right_arm.run_angle(5000,500, Stop.HOLD)
await right_arm.run_angle(5000,-500, Stop.HOLD)
await drive_base.turn(-20)
await drive_base.straight(275)
await drive_base.turn(20)
await drive_base.straight(63)
await drive_base.turn(-30)
right_arm.run_angle(50,500)
await drive_base.turn(45)
await drive_base.straight(-135)
await drive_base.turn(-60)
await drive_base.straight(90)
await left_arm.run_angle(1000,-450)
await drive_base.straight(-145)
await left_arm.run_angle(1000,450)
await drive_base.straight(10)
await drive_base.turn(35)
await drive_base.straight(-500)
async def Run2():
await drive_base.straight(200)
await drive_base.turn(-20)
await drive_base.straight(525)
await drive_base.turn(60)
await drive_base.straight(50)
await right_arm.run_angle(2000,1000)
await drive_base.straight(-50)
await drive_base.turn(45)
await drive_base.straight(50)
await right_arm.run_angle(350,-1000)
await drive_base.turn(-100)
await drive_base.straight(-600)
async def Run3():
await drive_base.straight(915)
await drive_base.turn(-90)
await drive_base.straight(60)
await left_arm.run_angle(10000,-15000)
await drive_base.straight(-60)
await drive_base.turn(85)
await drive_base.straight(2000)
async def Run5():
await drive_base.straight(420)
await right_arm.run_angle(300,-100)
await drive_base.straight(-100)
await right_arm.run_angle(300, 100)
await drive_base.straight(-350)
async def Run6():
await drive_base.straight(420)
await right_arm.run_angle(300,-100)
await drive_base.straight(-100)
await right_arm.run_angle(300, 100)
await drive_base.straight(-350)
async def main():
if color_sensor.color() == Color.ORANGE:
await Run1()
if color_sensor.color() == Color.GREEN:
await Run2()
if color_sensor.color() == Color.WHITE:
await Run3()
if color_sensor.color() == Color.YELLOW:
await Run5()
if color_sensor.color() == Color.BLUE:
await Run6()
print(f'Detected color: {color_sensor.color()}')
# Main execution loop
while True:
run_task(main())
wait(100)

BIN
import.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 836 B

View File

View File

View File

@@ -1,7 +0,0 @@
I am Johannes
I am the building manager for the team. I like making art.
Parthiv, Diddy will touch you tonight.

View File

@@ -1 +0,0 @@
Hello my name is Vickram and I like coding and video games.

View File

@@ -1,45 +0,0 @@
from pybricks.hubs import PrimeHub
from pybricks.pupdevices import Motor, ColorSensor, UltrasonicSensor, ForceSensor
from pybricks.parameters import Button, Color, Direction, Port, Side, Stop
from pybricks.robotics import DriveBase
from pybricks.tools import wait, StopWatch, run_task
hub = PrimeHub()
# Initialize both motors. In this example, the motor on the
# left must turn counterclockwise to make the robot go forward.
left_motor = Motor(Port.A, Direction.COUNTERCLOCKWISE)
right_motor = Motor(Port.B)
arm_motor = Motor(Port.D, Direction.CLOCKWISE)
arm_motor_left= Motor(Port.C, Direction.CLOCKWISE)
# Initialize the drive base. In this example, the wheel diameter is 56mm.
# The distance between the two wheel-ground contact points is 112mm.
drive_base = DriveBase(left_motor, right_motor, wheel_diameter=68.8, axle_track=180)
print('The default settings are: ' + str(drive_base.settings()))
drive_base.settings(300,1000,300,750)
# Optionally, uncomment the line below to use the gyro for improved accuracy.
drive_base.use_gyro(True)
async def main():
await drive_base.straight(519)
await arm_motor_left.run_angle(300, -100)
await arm_motor_left.run_angle(300, 500)
await drive_base.straight(180)
await drive_base.turn(-37)
await drive_base.straight(50)
await arm_motor.run_angle(300, -400)
await drive_base.straight(-150)
await drive_base.turn(135)
await drive_base.straight(50)
await arm_motor.run_angle(300, 400)
await drive_base.straight(-75)
await arm_motor.run_angle(300, 300)
await drive_base.turn(-50)
await drive_base.straight(162)
await arm_motor.run_angle(100, -200)
await drive_base.straight(30)
await arm_motor.run_angle(50,-500)
run_task(main())

View File

@@ -10,33 +10,28 @@ hub = PrimeHub()
left_motor = Motor(Port.A, Direction.COUNTERCLOCKWISE)
right_motor = Motor(Port.B)
left_arm = Motor(Port.C, Direction.COUNTERCLOCKWISE)
right_arm = Motor(Port.D)
drive_base = DriveBase(left_motor, right_motor, wheel_diameter=68.8, axle_track=180)
drive_base.settings(300,1000,300,200)
#drive_base.use_gyro(True)
drive_base.settings(600,500,300,200)
drive_base.use_gyro(True)
async def main():
left_arm.run_angle(500,200)
right_arm.run_angle(500,200)
await drive_base.straight(70)
await right_arm.run_angle(2000,1000)
await drive_base.straight(200)
await drive_base.turn(-20)
await drive_base.straight(525)
await drive_base.turn(60)
await drive_base.straight(30)
await right_arm.run_angle(2000,-1000)
await drive_base.straight(30)
await right_arm.run_angle(3000,1000)
await drive_base.straight(-60)
await drive_base.turn(-60)
await drive_base.straight(-525)
await drive_base.turn(20)
await drive_base.straight(-200)
await drive_base.turn(-55)
await drive_base.straight(900)
await drive_base.turn(92.5)
await drive_base.straight(75)
await drive_base.straight(21)
await right_arm.run_angle(500,-250)
await right_arm.run_angle(500,250)
await drive_base.turn(55)
await left_arm.run_angle(300,-400)
await drive_base.turn(46.5)
await drive_base.turn(-40)
await drive_base.straight(900)
run_task(main())

View File

@@ -30,14 +30,14 @@ async def main():
await right_arm.run_angle(5000,-500, Stop.HOLD)
await drive_base.turn(-20)
await drive_base.straight(277)
await drive_base.straight(275)
await drive_base.turn(20)
await drive_base.straight(65)
await drive_base.straight(63)
await drive_base.turn(-30)
right_arm.run_angle(50,500)
await drive_base.turn(45)
await drive_base.straight(-145)
await drive_base.straight(-135)
await drive_base.turn(-60)
await drive_base.straight(90)
await left_arm.run_angle(1000,-450)
@@ -45,5 +45,5 @@ async def main():
await left_arm.run_angle(1000,450)
await drive_base.straight(10)
await drive_base.turn(35)
await drive_base.straight(-600)
await drive_base.straight(-500)
run_task(main())

View File

@@ -1,5 +1,4 @@
# ---JOHANNES---
# THIS CODE IS NOT USED ANYMORE AND SHOULD NOT BE USED!!!!!!
from pybricks.hubs import PrimeHub
from pybricks.pupdevices import Motor, ColorSensor, UltrasonicSensor, ForceSensor
from pybricks.parameters import Button, Color, Direction, Port, Side, Stop

BIN
run.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 878 B

View File

@@ -1,5 +1,5 @@
# Guys please use the same setup code and put into the imports for consistency
script_names = ["Run1.py", "Run2.py", "Run3.py", "Run5.py", "Run6.py"] # This is a list of the files of the mission runs
script_names = ["untitled14.py", "untitled13.py"] # This is a list of the files of the mission runs
content = ""
imports = """
from pybricks.hubs import PrimeHub
@@ -72,7 +72,7 @@ function_calls = []
# Define colors properly - one per script
colors = [
'Color.ORANGE', 'Color.GREEN', 'Color.WHITE',
'Color.ORANGE', 'Color.GREEN', 'Color.BLACK', 'Color.WHITE',
'Color.YELLOW', 'Color.BLUE', 'Color.MAGENTA', 'Color.RED', 'Color.BROWN'
]
@@ -96,7 +96,7 @@ for i, f_name in enumerate(script_names):
m.write(func_def)
# Assign one color per script
color_condition = colors[i]
color_condition = colors[i % len(colors)]
function_calls.append({
'name': func_name,
'is_async': is_async,
@@ -120,10 +120,10 @@ with open("main.py", 'a') as m:
m.write(f" await {func_info['name']}()\n")
else:
m.write(f" {func_info['name']}()\n")
m.write(" \n")
m.write(" return # Exit after running one function\n")
# Add a default case
m.write(" \n")
m.write(" # Default case - no matching color detected\n")
m.write(" print(f'Detected color: {color_sensor.color()}')\n")
# Write the main loop
@@ -131,4 +131,9 @@ with open("main.py", 'a') as m:
m.write("\n# Main execution loop\n")
m.write("while True:\n")
m.write(" run_task(main())\n")
m.write(" wait(100)\n")
m.write(" wait(100)\n")
print("Script merger completed successfully!")
print("Functions created:")
for func_info in function_calls:
print(f" - {func_info['name']}() triggered by {func_info['color']} (from {func_info['filename']})")