This is an old revision of the document!
Proiectul este reprezentat de un robot controlat wireless cu o radiocomanda FlySky FS-I6. Funcționalitățile robotului sunt: deplasarea plană(directie de tip tanc), aruncătorul de flăcări(acționat de un switch de pe telecomandă) și controlul vitezei spinnerului cilindric.
Inspirat de seria BattleBots, am dorit să proiectez un battlebot de la 0. Astfel, am ajuns la design-ul curent: Un șasiu simetric(pentru a funcționa și dacă este răsturnat), cu două roți motorizate pentru deplasare și un cilindru asimetric ca armă principală.
Robotul a fost printat 3D folosind o imprimantă Creality CR-10S Pro V2, iar design-ul a fost creat în Autodesk Fusion 360.
Schema de mai jos descrie modul prin care componentele interacționează între ele.
Descriere componente:
Listă componente:
#include <Servo.h>
#define RCPinFWD 2
#define RCPinSide 3
#define RCPinSwitch 4
#define Motor1Pin1 9
#define Motor1Pin2 8
#define Motor2Pin1 11
#define Motor2Pin2 10
#define RelayPin 13
#define ServoPin 12
volatile long StartTimeFWD = 0;
volatile long CurrentTimeFWD = 0;
volatile long PulsesFWD = 0;
int PulseWidthFWD = 0;
volatile long StartTimeSide = 0;
volatile long CurrentTimeSide = 0;
volatile long PulsesSide = 0;
int PulseWidthSide = 0;
int SwitchValue;
Servo servo;
void setup() {
Serial.begin(9600);
pinMode(RCPinFWD, INPUT_PULLUP);
pinMode(RCPinSide, INPUT_PULLUP);
pinMode(RCPinSwitch, INPUT);
attachInterrupt(digitalPinToInterrupt(RCPinFWD),PulseTimerFWD,CHANGE);
attachInterrupt(digitalPinToInterrupt(RCPinSide),PulseTimerSide,CHANGE);
pinMode(Motor1Pin1, OUTPUT);
pinMode(Motor1Pin2, OUTPUT);
pinMode(Motor2Pin1, OUTPUT);
pinMode(Motor2Pin2, OUTPUT);
servo.attach(ServoPin);
pinMode(RelayPin, OUTPUT);
}
void loop() {
if (PulsesFWD < 2000){
PulseWidthFWD = PulsesFWD;
}
if (PulsesSide < 2000){
PulseWidthSide = PulsesSide;
}
Serial.print(PulseWidthFWD);
Serial.print(" ");
Serial.println(PulseWidthSide);
if (PulseWidthFWD > 1000 && PulseWidthSide > 1000) {
if (PulseWidthFWD > 1550) {
digitalWrite(Motor1Pin1, HIGH);
digitalWrite(Motor1Pin2, LOW);
}
else if (PulseWidthFWD < 1450) {
digitalWrite(Motor1Pin1, LOW);
digitalWrite(Motor1Pin2, HIGH);
}
else {
digitalWrite(Motor1Pin1, LOW);
digitalWrite(Motor1Pin2, LOW);
}
if (PulseWidthSide > 1550) {
digitalWrite(Motor2Pin1, HIGH);
digitalWrite(Motor2Pin2, LOW);
}
else if (PulseWidthSide < 1450) {
digitalWrite(Motor2Pin1, LOW);
digitalWrite(Motor2Pin2, HIGH);
}
else {
digitalWrite(Motor2Pin1, LOW);
digitalWrite(Motor2Pin2, LOW);
}
}
else {
digitalWrite(Motor2Pin1, LOW);
digitalWrite(Motor2Pin1, LOW);
digitalWrite(Motor1Pin1, LOW);
digitalWrite(Motor1Pin1, LOW);
}
SwitchValue = pulseIn(RCPinSwitch, HIGH);
Serial.print("___");
Serial.print(SwitchValue);
Serial.print("___");
servo.write(SwitchValue);
if (SwitchValue > 1000)
digitalWrite(RelayPin, HIGH);
else
digitalWrite(RelayPin, LOW);
}
void PulseTimerFWD(){
CurrentTimeFWD = micros();
if (CurrentTimeFWD > StartTimeFWD){
PulsesFWD = CurrentTimeFWD - StartTimeFWD;
StartTimeFWD = CurrentTimeFWD;
}
}
void PulseTimerSide(){
CurrentTimeSide = micros();
if (CurrentTimeSide > StartTimeSide){
PulsesSide = CurrentTimeSide - StartTimeSide;
StartTimeSide = CurrentTimeSide;
}
}
Fişierele se încarcă pe wiki folosind facilitatea Add Images or other files. Namespace-ul în care se încarcă fişierele este de tipul :pm:prj20??:c? sau :pm:prj20??:c?:nume_student (dacă este cazul). Exemplu: Dumitru Alin, 331CC → :pm:prj2009:cc:dumitru_alin.