Table of Contents

DariusCell

Autori:

Introducere

Am ales să realizăm acest proiect ca să trecem la PM cu notă bună :) (acuma sperăm și să ne iasă).

Descriere generală

Motivație

Structură proiect

Hardware Design

Componente

Asamblarea robotului

Schema bloc

Schema electrică

Pentru schema electrică am folosit Eagle și am atașat schema la secțiunea de Resurse

Software Design

Dezvoltarea codului s-a realizat folosind Arduino IDE și am biblitoteca externă SoftwareSerial pentru a realiza conexiunea cu modulul Bluetooth.

Pași funcționare:

Cod Arduino

Cod Arduino

#include <SoftwareSerial.h>
 
 
#define DELTA_SPEED 10 // increase / decrease in speed;
#define MIN_SPEED_ALLOWED 120
#define BALANCE_DIFFERENCE 17
 
#define SPEED 127
#define SPEED_TURNING 100
 
#define UP_DIRECTION 'w'
#define DOWN_DIRECTION 's'
#define STOP_DIRECTION 'q'
#define LEFT_DIRECTION 'a'
#define RIGHT_DIRECTION 'd'
 
int In3 = 8; // left wheel - int3
int In4 = 9; // left wheel - int4
int In2 = 12; // right wheel - int2
int In1 = 13; // right wheel - int1
int ENA = 5; // left wheel
int ENB = 6; // right wheel
int robot_speed = 0;
 
 
bool goesForward = false;
bool moving = false;
int rx_pin = 4; // pin 4 as RX
int tx_pin = 2; // pin 2 as TX
 
 
SoftwareSerial BTSerial(tx_pin, rx_pin);
 
char bt_data;
String arduino_data;
 
 
void setup()
{
 
 
  pinMode(In1, OUTPUT);
  pinMode(In2, OUTPUT);
  pinMode(ENA, OUTPUT);
 
  pinMode(In3, OUTPUT);
  pinMode(In4, OUTPUT);
  pinMode(ENB, OUTPUT);
 
  digitalWrite(In1, LOW);
  digitalWrite(In2, HIGH);
 
  digitalWrite(In3, LOW);
  digitalWrite(In4, HIGH);
 
  analogWrite(ENA, robot_speed);
  analogWrite(ENB, robot_speed);
 
  BTSerial.begin(9600);
  Serial.begin(9600);
  delay(1000);
}
 
 
void moveForward() {
 
 if(!goesForward || !moving) {
    moveStop();
    goesForward = true;
    moving = true;
    digitalWrite(In1, LOW);
    digitalWrite(In2, HIGH);
 
    digitalWrite(In3, LOW);
    digitalWrite(In4, HIGH);
 
    for (; robot_speed < SPEED; robot_speed +=2) {
      analogWrite(ENA, robot_speed + BALANCE_DIFFERENCE);
      analogWrite(ENB, robot_speed);
      delay(5);
   }
  }
}
 
void moveStop() {
    for (; robot_speed > 0; robot_speed -=2) {
      analogWrite(ENA, robot_speed + BALANCE_DIFFERENCE);
      analogWrite(ENB, robot_speed);
      delay(5);
   }
    robot_speed = 0;
    analogWrite(ENA, robot_speed);
    analogWrite(ENB, robot_speed);
    moving = false;
}
 
void moveBackward() {
 if(goesForward || !moving) {
    moveStop();
    moving = true;
    goesForward=false;
    digitalWrite(In1, HIGH);
    digitalWrite(In2, LOW);
    digitalWrite(In3, HIGH);
    digitalWrite(In4, LOW);
    for (; robot_speed <SPEED; robot_speed +=2) {
      analogWrite(ENA, robot_speed + BALANCE_DIFFERENCE);
      analogWrite(ENB, robot_speed);
      delay(5);
   }
  }
}
 
void turnLeft() {
  if (moving) {
    analogWrite(ENA, 0);
    analogWrite(ENB, SPEED);
    delay(300);
    robot_speed = SPEED;
    for (; robot_speed > 0; robot_speed -=2) {
      analogWrite(ENB, robot_speed);
      delay(5);
   }
    analogWrite(ENA, 0);
    analogWrite(ENB, 0);
    moving = false;
  }
}
 
void turnRight() {
  if (moving) {
    analogWrite(ENA, SPEED);
    analogWrite(ENB, 0);
    delay(300);
    robot_speed = SPEED;
    for (; robot_speed > 0; robot_speed -=2) {
      analogWrite(ENA, robot_speed);
      delay(5);
   }
    analogWrite(ENA, 0);
    analogWrite(ENB, 0);
    moving = false;
  }
}
 
void loop() {
  if (BTSerial.available()) {
    bt_data = BTSerial.read();
    if (bt_data == UP_DIRECTION) {
      moveForward();
    } else if (bt_data == DOWN_DIRECTION) {
      moveBackward();
    } else if (bt_data == STOP_DIRECTION){
      moveStop(); 
    } else if (bt_data == LEFT_DIRECTION) {
      turnLeft();
    } else if (bt_data == RIGHT_DIRECTION) {
      turnRight();
    }
  }
}

Rezultate Obținute

Concluzie

Acest proiect a fost primul realizat fizic și a combinat multe noțiuni de la materiile de hardware și software. A fost interesant că am putut alege piesele și am avut control deplin asupra proiectului. Partea de asamblare a robotului în sine a fost cea mai challenging, necesitând câteva zile de lipit, aranjat și legat piese. La final, putem zice că a fost o experiență inedită, în care am aplicat majoritatea noțiunilor învătate în cursurile și laboratoarele de PM.

Jurnal

02.06.2021 - terminăm de scris documentația pentru proiect. DariusCell is now complete. (+ temele la SO).

01.06.2021 - ziua Copilului.

26.05.2021 - “Baterii alimentate pe bază de consum puternic de alcool. A nu se lăsa la îndemâna copiiilor!”

26.05.2021 - Am conectat senzorul ultrasonic și am făcut testele și videoclipul de prezentare a lui DariusCell.

25.05.2021 - Legare VCC la ground și invers, circuitul ideal.

24.05.2021 - Am reușit să punem Bluetooth și am comandat un nou senzor ultrasonic, cel actual fiind defect.

23.05.2021 - Terminare Tema4SO + am reușit să învartim roțile din robotului din cod.

22.05.2021 - Radu: Cristi, iese fum … Cristi: Termină cu glumele proaste. (3 seconds later Cristi ia șurubelnița și zvârle bateriile din suport pe jos). Radu: Ia o bere!

21.05.2021 - mergem să lipim robotul fără să luăm piesele. Bonus, făceam alimentarea la 6V în loc de 12V, cât era necesar pt L298N. GG!

30.04.2021 - adăugare schemă electrică

25.04.2021 - DariusCell was born.

Resurse

Documentație