Masinuta cu telecomanda

Autor

Zăt Bogdan-Andrei, 333CC

Introducere

  • Proiectul consta intr-o masinuta cu telecomanda. Pentru constructia masinutei se folosesc 4 motoare DC, 2 punti H pentru controlarea acestora, iar virarea acesteia se realizeaza prin schimbarea puterii diferit in fiecare roata.
  • Conexiunea cu telecomanda se va face prin 2 module bluetooth, iar masinuta va fi controlata de un joystick.

Componente necesare

  • Arduino Uno R3
  • Fire jumper
  • 4 motoare DC
  • joystick HW-504
  • breadboard
  • punte H
  • 2 baterii 9V
  • 4 roti
  • 2 module bluetooth HC-05

Schema bloc

Scheme electrice

Schema electrica pentru masinuta

Schema electrica pentru telecomanda

Software Design

  • Mediu de dezvoltare folosit: Arduino IDE
  • Librarii folosite: SoftwareSerial.h

Configurare module bluetooth

Pentru realizarea conexiunii intre telecomanda si masinuta am configurat cele 2 module bluetooth astfel: unul master, iar celalalt slave. Pentru a realiza aceasta configuratie a fost nevoie sa intru in modul de comanda AT pentru cele doua module HC-05 folosind urmatorul cod:

#include <SoftwareSerial.h>

SoftwareSerial MyBlue(10, 11);  

void setup() {
  Serial.begin(9600); 
  MyBlue.begin(38400);  //Baud Rate for AT-command Mode.  
  Serial.println("***AT commands mode***"); 

}

void loop() {
  if (MyBlue.available())
    Serial.write(MyBlue.read());
  if (Serial.available())
    MyBlue.write(Serial.read());
}

Cu ajutorul librariei SoftwareSerial am reusit sa accesez modul de comanda pentru modulele bluetooth fara a fi nevoie sa folosesc pinii Rx si Tx de pe placuta arduino(era nevoie de un divizor de tensiune, si nu am avut rezistentele necesare).

Dupa accesarea modului AT am setat modulul bluetooth de pe masinuta ca slave(AT+ROLE=0) si am obtinut adresa lui(AT+ADDR?)

Modulul HC-05 prezent pe telecomanda a fost setat ca master (AT+ROLE=1), dupa care acesta a fost setat sa se conecteze la adresa modulului slave(AT+BIND=0020,12,084EB5)

Sursele pentru masinuta si telecomanda

  • Cod sursa masinuta:
#include <SoftwareSerial.h>

SoftwareSerial MyBlue(10, 11);
int xPosition;
int yPosition;
int x;
int y;
int motorSpeedA1;
int motorSpeedA2;
int motorSpeedB1;
int motorSpeedB2;

#define enA 5  //dreapta jos
#define in1 6
#define in2 7
#define in3 4
#define in4 2
#define enB 3  //stanga jos
#define enA_2 A1  //stanga sus
#define in1_2 12
#define in2_2 13
#define enB_2 A0  //dreapta sus
#define in3_2 9
#define in4_2 8

void setup() {
  // put your setup code here, to run once:
  pinMode(enA, OUTPUT);
  pinMode(enB, OUTPUT);
  pinMode(in1, OUTPUT);
  pinMode(in2, OUTPUT);
  pinMode(in3, OUTPUT);
  pinMode(in4, OUTPUT);
  pinMode(enA_2, OUTPUT);
  pinMode(enB_2, OUTPUT);
  pinMode(in1_2, OUTPUT);
  pinMode(in2_2, OUTPUT);
  pinMode(in3_2, OUTPUT);
  pinMode(in4_2, OUTPUT);

  MyBlue.begin(9600);
  state = 1;
}

void move_forward() {
  digitalWrite(in1,LOW);
  digitalWrite(in2, HIGH);
  digitalWrite(in4,HIGH);
  digitalWrite(in3, LOW);
  digitalWrite(in1_2,HIGH);
  digitalWrite(in2_2, LOW);
  digitalWrite(in4_2,HIGH);
  digitalWrite(in3_2, LOW);
}

void move_backward() {
  digitalWrite(in1,HIGH);
  digitalWrite(in2, LOW);
  digitalWrite(in4,LOW);
  digitalWrite(in3, HIGH);
  digitalWrite(in1_2,LOW);
  digitalWrite(in2_2, HIGH);
  digitalWrite(in4_2,LOW);
  digitalWrite(in3_2, HIGH);
}

void stop_car() {
  digitalWrite(in1,LOW);
  digitalWrite(in2, LOW);
  digitalWrite(in3,LOW);
  digitalWrite(in4, LOW);
  digitalWrite(in1_2,LOW);
  digitalWrite(in2_2, LOW);
  digitalWrite(in3_2,LOW);
  digitalWrite(in4_2, LOW);
}

void loop() {
  // put your main code here, to run repeatedly:

  x = 510/4;
  y = 510/4;

  while (MyBlue.available() >= 2) {
    y = MyBlue.read();
    x = MyBlue.read();
  }
  
    xPosition = x*4;
    yPosition = y*4;
    
    if (yPosition < 470) {
  
        move_forward();
        motorSpeedA1 = map(yPosition, 470, 0, 0, 255);
        motorSpeedB2 = map(yPosition, 470, 0, 0, 255);
        motorSpeedA2 = map(yPosition, 470, 0, 0, 255);
        motorSpeedB2 = map(yPosition, 470, 0, 0, 255);
  
        delay(10);
    } else if (yPosition > 550) {
  
        move_backward();
        motorSpeedA1 = map(yPosition, 550, 1023, 0, 255);
        motorSpeedB1 = map(yPosition, 550, 1023, 0, 255);
        motorSpeedA2 = map(yPosition, 550, 1023, 0, 255);
        motorSpeedB2 = map(yPosition, 550, 1023, 0, 255);
  
        delay(10);
    } else {
        motorSpeedA1 = 0;
        motorSpeedA2 = 0;
        motorSpeedB1 = 0;
        motorSpeedB2 = 0;
        stop_car();
    }

    //vireaza la dreapta
    if (xPosition < 470) {
      int mapX = map(xPosition, 470, 0, 0, 255);
      motorSpeedA1 = motorSpeedA1 + mapX;
      motorSpeedB1 = motorSpeedB1 - mapX;
      motorSpeedA2 = motorSpeedA2 + mapX;
      motorSpeedB2 = motorSpeedB2 - mapX;

      if (motorSpeedA1 < 0) {
        motorSpeedA1 = 0;
      }
      if (motorSpeedB1 > 255) {
        motorSpeedB1 = 255;
      }
      if (motorSpeedA2 < 0) {
        motorSpeedA2 = 0;
      }
      if (motorSpeedB2 > 255) {
        motorSpeedB2 = 255;
      }
      //vireaza la stanga
    } else if (xPosition > 550) {
      int mapX = map(xPosition, 550, 1023, 0, 255);
      motorSpeedA1 = motorSpeedA1 - mapX;  //stanga
      motorSpeedB1 = motorSpeedB1 + mapX;   //drepta
      motorSpeedA2 = motorSpeedA2 - mapX;  //stanga
      motorSpeedB2 = motorSpeedB2 + mapX;  //dreapta

      if (motorSpeedA1 > 255) {
        motorSpeedA1 = 255;
      }
      if (motorSpeedB1 < 0) {
        motorSpeedB1 = 0;
      }
      if (motorSpeedA2 > 255) {
        motorSpeedA2 = 255;
      }
      if (motorSpeedB2 < 0) {
        motorSpeedB2 = 0;
      }
      
    }

    analogWrite(enA, motorSpeedB1);
    analogWrite(enB, motorSpeedA1);
    analogWrite(enA_2, motorSpeedA2);
    analogWrite(enB_2, motorSpeedB2);
}
  • Cod sursa telecomanda:
#include <SoftwareSerial.h>

SoftwareSerial MyBlue(10, 11);  

int VRx = A1;
int VRy = A0;
int SW = 2;

int xPosition = 0;
int yPosition = 0;
int SW_state = 0;
int mapX = 0;
int mapY = 0;

void setup() {
  
  pinMode(VRx, INPUT);
  pinMode(VRy, INPUT);
  pinMode(SW, INPUT_PULLUP);

  MyBlue.begin(9600);
  
}

void loop() {
  xPosition = analogRead(VRx);
  yPosition = analogRead(VRy);
  SW_state = digitalRead(SW);
  
  MyBlue.write(xPosition/4);
  MyBlue.write(yPosition/4);
}

Concluzii

Ideea de a face un proiect fizic cu arduino mi s-a parut una foare interesanta inca de cand am aflat prima data. Mi-a placut foarte mult sa lucrez la masinuta mea cu telecomanda si cred ca motivul principat este ca pana acum n-am mai avut un proiect fizic de realizat, ceva din care sa avem un produs finit, nu doar virtual. Poate ca asta a fost singura materie din facultate la care voi face asa ceva, ceea ce m-a facut sa fiu foarte entuziasmat in realizarea proiectului. Pot spune ca am invatat foarte multe in tot timpul in care am lucrat la proiect, iar cea mai mare provocare consider ca a fost sa configurez modulele bluetooth si sa reusesc sa transmit datele cum trebuie de la telecomanda la masinuta. A fost nevoie de multe cautari pana am reusit intr-un final.

Galerie foto ^_^

Video

pm/prj2021/abirlica/joystick_car.txt · Last modified: 2021/06/04 18:07 by bogdan_andrei.zat
CC Attribution-Share Alike 3.0 Unported
www.chimeric.de Valid CSS Driven by DokuWiki do yourself a favour and use a real browser - get firefox!! Recent changes RSS feed Valid XHTML 1.0