This is an old revision of the document!


Masina cu telecomanda 🚗

Movileanu Raluca - 331CB

Introducere

Proiectul consta intr-o masina care primeste comenzi de la o telecomanda, comenzile fiind mesaje cu instructiuni pentru deplasarea masinii: fata, spate, stanga, dreapta, diagonale si rotiri (rotire stanga, rotire dreapta). De asemenea, masina va avea montat si un girofar cu sirena. Scopul proiectului este realizarea unei masini care poate fi comandata de la distanta folosind module radio. Utilitatea sa vine din faptul ca proiectul meu este de fapt o jucarie cu care ma pot distra atat singura cat si cu prietenii.

Descriere generală

La apasarea unui buton din cele 10 (pentru fata, spate, stanga, dreapta, diagonale, rotire stanga, rotire dreapta) de pe telecomanda, placuta Arduino NANO va transmite un mesaj catre placuta Arduino MEGA de pe masina, prin intermediul transmitterului si al receiverului care comunica radio printr-o adresa data. In functie de mesajul primit de receiver, placuta MEGA va da comenzi controllerelor de motoare, care la randul lor vor actiona motoarele DC in modul dorit de catre utilizator.Voi avea si un buzzer si 2 leduri rosii ce se vor stinge si aprinde la un interval de timp.

  • Masina se va deplasa pe urmatoarele directii conform pozei:

Hardware Design

Lista piese

  • 1 X Arduino NANO
  • 1 X Arduino MEGA
  • 10 X buton
  • 4 X roata
  • 4 X motor DC 3V (MOTOR CU REDUCTOR 3-6V)
  • 2 X controller motor (Modul cu Driver de Motoare Dual L298N)
  • 2 X trans-receiver radio (NRF24L01 - 2.4G Wireless Transceiver Module)
  • 2 X LED
  • 1 X buzzer
  • 3 X suport baterii
  • 2 X suport baterii 9V
  • 1 X breadboard mare
  • 1 X breadboard mic
  • 1 X breadboard mini
  • 13 X rezistente
  • fire

Placuta Arduino NANO se afla pe telecomanda, ea primeste comenzi de la butoane si le transmite mai departe la placuta Arduino Mega de pe masina prin intermediul transmitterului(de pe telecomanda) si al receiverului(de pe masina). Placuta Arduino NANO este alimentata de 4 baterii AA. Placuta Arduino MEGA primeste comanda, trimite semnale la cele doua drivere pentru motoare(Modul cu Driver de Motoare Dual L298N) care actioneaza motoarele(MOTOR CU REDUCTOR 3-6V) la o viteza stabilita in cod, aceasta fiind setata folosind pini PWM. Placuta Arduino MEGA este alimentata de o baterie de 9V iar driverele sunt alimentate de cate 4 baterii AA. Pe placuta Arduino MEGA se mai afla doua leduri si un buzzer care alterneaza intre starile aprins si stins, acestea servind rolurile de girofar, respectiv sirena.

Telecomanda

Arduino NANO:

  • A0: conectare buton 1 (fata)
  • A1: conectare buton 2 (spate)
  • A2: conectare buton 3 (stanga)
  • A3: conectare buton 4 (dreapta)
  • A4: conectare buton 5 (fata stanga)
  • A5: conectare buton 6 (fata drepta)
  • A6: conectare buton 7 (spate stanga)
  • A7: conectare buton 8 (spate dreapta)

butoanele analogice au fost folosite pentru butoane deoarece nu sunt disponibile destui pini digitali pentru a conecta toate butoanele la digital deoarece modulul nRF24L01 ocupa 5 pini digitali din 12

  • D3: conectare buton 9 (rotire stanga)
  • D2: conectare buton 10 (rotire dreapta)

am folosit pentru ultimele doua butoane pini digitali deoarece nu au mai fost disponibili pini analogici pentru a conecta asemenea celorlalte butoane de pe telecomanda

  • GND: conectare GND de la modulul nRF24L01, firul negru al carcasei de baterii si butoanele
  • 3V3: conectare VCC modul nRF24L01
  • 5V: conectare butoate
  • VIN: conectare fir rosu al carcasei de baterii
  • D7: conectare pin CE al modulului nRF24L01
  • D10: conectare pin CSN al modulului nRF24L01
  • D11: conectare pin MOSI al modului nRF24L01
  • D12: conectare pin MISO al modului nRF24L01
  • D13: conectare pin SCK al modului nRF24L01

Masina

Arduino MEGA

  • 3v3: alimentare modul NRF24L01
  • GND: pin GND modul NRF24L01, fir negru alimentare placuta Arduino MEGA, fir negru Buzzer si LED-uri rosii, GND drivere motoare L298N
  • VIN: alimentare baterie 9V la placuta Arduino MEGA
  • D13(PWM): pin ENB de pe driverul de motoare L298N (1)
  • D12(PWM): pin ENA de pe driverul de motoare L298N (1)
  • D7(PWM): pin ENA de pe driverul de motoare L298N (2)
  • D6(PWM): pin ENB de pe driverul de motoare L298N (2)
  • D22: Buzzer
  • D26: LED 1
  • D27: LED 2
  • D36: pin IN1 de pe driverul de motoare L298N (2)
  • D37: pin IN2 de pe driverul de motoare L298N (2)
  • D38: pin IN3 de pe driverul de motoare L298N (2)
  • D39: pin IN4 de pe driverul de motoare L298N (2)
  • D42: pin IN2 de pe driverul de motoare L298N (1)
  • D43: pin IN1 de pe driverul de motoare L298N (1)
  • D44: pin IN3 de pe driverul de motoare L298N (1)
  • D45: pin IN4 de pe driverul de motoare L298N (1)
  • D2: pin CE al modulului NRF24L01
  • D53: pin CSN al modulului NRF24L01
  • D51: pin MOSI al modulului NRF24L01
  • D52: pin SCK al modulului NRF24L01
  • D50: pin MISO al modulului NRF24L01

Driver motor L298N (1)

  • OUT4: conectare motor 1
  • OUT3: conectare motor 1
  • OUT1: conectare motor 2
  • OUT2: conectare motor 2
  • +12V: conectare fir rosu carcasa baterii AA
  • GND: conectare fir negru carcasa baterii AA, conectare GND-GND cu placuta Arduino MEGA

Driver motor L298N (2)

  • OUT4: conectare motor 3
  • OUT3: conectare motor 3
  • OUT2: conectare motor 4
  • OUT1: conectare motor 4
  • +12V: conectare fir rosu carcasa baterii AA
  • GND: conectare fir negru carcasa baterii AA, conectare GND-GND cu placuta Arduino MEGA

Masina si telecomanda sunt complet functionale(se pot observa si ledurile aprinse in imagine).

Software Design

  • Mediu de dezvoltare: Arduino IDE
  • Librării şi surse 3rd-party: SPI.h, nRF24L01.h, RF24.h

Cod telecomanda:

#include<SPI.h>
#include<nRF24L01.h>
#include<RF24.h>

RF24 radio(7, 10);

const byte adress[6] = "00001";

const int fata = A0; 
const int spate = A1; 
const int stanga = A2;
const int dreapta = A3; 
const int fataStanga = A4;
const int fataDreapta = A5; 
const int spateStanga = A6;
const int spateDreapta = A7; 
const int rotireStanga = 3;
const int rotireDreapta = 2;

int stateFata = 0;
int stateSpate = 0;
int stateStanga = 0;
int stateDreapta = 0;
int stateFataStanga = 0;
int stateFataDreapta = 0;
int stateSpateStanga = 0;
int stateSpateDreapta = 0;

void setup() {
  Serial.begin(9600);
  radio.begin();
  radio.openWritingPipe(adress);
  radio.setPALevel(RF24_PA_LOW);
  radio.stopListening();
}

void loop() {
  int valoareFata = analogRead(fata);
  int valoareSpate = analogRead(spate);
  int valoareStanga = analogRead(stanga);
  int valoareDreapta = analogRead(dreapta);
  int valoareFataStanga = analogRead(fataStanga);
  int valoareFataDreapta = analogRead(fataDreapta);
  int valoareSpateStanga = analogRead(spateStanga);
  int valoareSpateDreapta = analogRead(spateDreapta);
  
  if(valoareFata > 1015) {
    Serial.println("fata");
    comanda("fata");
    delay(500);
  } 
  
  if(valoareSpate > 1015) {
    Serial.println("spate");
    comanda("spate");
    delay(500);
  } 
  
  if(valoareStanga > 1015) {
    Serial.println("stanga");
    comanda("stanga");
    delay(500);
  } 
  
  if(valoareDreapta > 1015) {
    Serial.println("dreapta");
    comanda("dreapta");
    delay(500);
  } 
  
  if(valoareFataStanga > 1015) {
    Serial.println("fata stanga");
    comanda("fata stanga");
    delay(500);
  } 
  
  if(valoareFataDreapta > 1015) {
    Serial.println("fata dreapta");
    comanda("fata dreapta");
    delay(500);
  } 
  
  if(valoareSpateStanga > 1015) {
    Serial.println("spate stanga");
    comanda("spate stanga");
    delay(500); 
  } 
  
  if(valoareSpateDreapta > 1015) {
    Serial.println("spate dreapta");
    comanda("spate dreapta");
    delay(500);
  } 
  
  if (digitalRead(rotireStanga) == HIGH) {
    Serial.println("rotire stanga");
    comanda("rotire stanga");
    delay(500);
  } 
  
  if (digitalRead(rotireDreapta) == HIGH) {
    Serial.println("rotire dreapta");
    comanda("rotire dreapta");
    delay(500);
  } 
}

void comanda(const char *mesaj){
  char message[32];
  snprintf(message, sizeof(message), "%s", mesaj);
  radio.write(&message, sizeof(message));
}

Cod masina:

#include <SPI.h>
#include <nRF24L01.h>
#include <RF24.h>

const int motor1Inainte = 45;
const int motor1Inapoi = 44;
const int motor2Inainte = 43;
const int motor2Inapoi = 42;

const int motor3Inainte = 39;
const int motor3Inapoi = 38;
const int motor4Inainte = 37;
const int motor4Inapoi = 36;

const char fata[] = "fata";
const char spate[] = "spate";
const char stanga[] = "stanga";
const char dreapta[] = "dreapta";
const char fataStanga[] = "fata stanga";
const char fataDreapta[] = "fata dreapta";
const char spateStanga[] = "spate stanga";
const char spateDreapta[] = "spate dreapta";
const char rotireStanga[] = "rotire stanga";
const char rotireDreapta[] = "rotire dreapta"; 

const int buzzer = 22;
const int led1 = 26;
const int led2 = 27;

RF24 radio(2, 53);
const byte address[6] = "00001";

unsigned long previousMillis = 0;
const long interval = 3000; //Interval pentru buzzer si leduri (1.5 sec pornite, 1.5 sec oprite)
bool ledState = LOW;
bool buzzerState = LOW;

void setup() {
  Serial.begin(9600);

  radio.begin();
  radio.openReadingPipe(0, address);
  radio.setPALevel(RF24_PA_MIN);
  radio.startListening();

  pinMode(motor1Inainte, OUTPUT);
  pinMode(motor1Inapoi, OUTPUT);
  pinMode(motor2Inainte, OUTPUT);
  pinMode(motor2Inapoi, OUTPUT);

  pinMode(motor3Inainte, OUTPUT);
  pinMode(motor3Inapoi, OUTPUT);
  pinMode(motor4Inainte, OUTPUT);
  pinMode(motor4Inapoi, OUTPUT);

  pinMode(13, OUTPUT);
  pinMode(12, OUTPUT);
  pinMode(6, OUTPUT);
  pinMode(7, OUTPUT);

  pinMode(buzzer, OUTPUT);
  pinMode(led1, OUTPUT);
  pinMode(led2, OUTPUT);
}

void loop() {
  analogWrite(13, 150);
  analogWrite(12, 150);
  analogWrite(6, 150);
  analogWrite(7, 150);

  unsigned long currentMillis = millis();

  if (currentMillis - previousMillis >= interval) {
    previousMillis = currentMillis;
    
    buzzerState = !buzzerState;
    ledState = !ledState;
    
    if (buzzerState) {
      tone(buzzer, 100);
    } else {
      noTone(buzzer);
    }
    
    digitalWrite(led1, ledState);
    digitalWrite(led2, ledState);
  }

  if (radio.available()) {
    char text[32] = "";
    radio.read(&text, sizeof(text));
    Serial.println(text);

    if(strcmp(text, fata) == 0){
      digitalWrite(motor1Inainte, LOW);
      digitalWrite(motor1Inapoi, HIGH);
      digitalWrite(motor2Inainte, LOW);
      digitalWrite(motor2Inapoi, HIGH);
      digitalWrite(motor3Inainte, HIGH);
      digitalWrite(motor3Inapoi, LOW);
      digitalWrite(motor4Inainte, HIGH);
      digitalWrite(motor4Inapoi, LOW);
      delay(500);
    }

    if(strcmp(text, spate) == 0){
      digitalWrite(motor1Inainte, HIGH);
      digitalWrite(motor1Inapoi, LOW);
      digitalWrite(motor2Inainte, HIGH);
      digitalWrite(motor2Inapoi, LOW);
      digitalWrite(motor3Inainte, LOW);
      digitalWrite(motor3Inapoi, HIGH);
      digitalWrite(motor4Inainte, LOW);
      digitalWrite(motor4Inapoi, HIGH);
      delay(500);
    }

    if(strcmp(text, stanga) == 0){
      digitalWrite(motor1Inainte, LOW);
      digitalWrite(motor1Inapoi, HIGH);
      digitalWrite(motor2Inainte, HIGH);
      digitalWrite(motor2Inapoi, LOW);
      digitalWrite(motor3Inainte, HIGH);
      digitalWrite(motor3Inapoi, LOW);
      digitalWrite(motor4Inainte, LOW);
      digitalWrite(motor4Inapoi, HIGH);
      delay(500);
    }

    if(strcmp(text, dreapta) == 0){
      digitalWrite(motor1Inainte, HIGH);
      digitalWrite(motor1Inapoi, LOW);
      digitalWrite(motor2Inainte, LOW);
      digitalWrite(motor2Inapoi, HIGH);
      digitalWrite(motor3Inainte, LOW);
      digitalWrite(motor3Inapoi, HIGH);
      digitalWrite(motor4Inainte, HIGH);
      digitalWrite(motor4Inapoi, LOW);
      delay(500);
    }

    if(strcmp(text, fataStanga) == 0){
      digitalWrite(motor1Inainte, LOW);
      digitalWrite(motor1Inapoi, HIGH);
      digitalWrite(motor2Inainte, LOW);
      digitalWrite(motor2Inapoi, LOW);
      digitalWrite(motor3Inainte, HIGH);
      digitalWrite(motor3Inapoi, LOW);
      digitalWrite(motor4Inainte, LOW);
      digitalWrite(motor4Inapoi, LOW);
      delay(500);
    }

    if(strcmp(text, fataDreapta) == 0){
      digitalWrite(motor1Inainte, LOW);
      digitalWrite(motor1Inapoi, LOW);
      digitalWrite(motor2Inainte, LOW);
      digitalWrite(motor2Inapoi, HIGH);
      digitalWrite(motor3Inainte, LOW);
      digitalWrite(motor3Inapoi, LOW);
      digitalWrite(motor4Inainte, HIGH);
      digitalWrite(motor4Inapoi, LOW);
      delay(500);
    }

    if(strcmp(text, spateStanga) == 0){
      digitalWrite(motor1Inainte, LOW);
      digitalWrite(motor1Inapoi, LOW);
      digitalWrite(motor2Inainte, HIGH);
      digitalWrite(motor2Inapoi, LOW);
      digitalWrite(motor3Inainte, LOW);
      digitalWrite(motor3Inapoi, LOW);
      digitalWrite(motor4Inainte, LOW);
      digitalWrite(motor4Inapoi, HIGH);
      delay(500);
    }

    if(strcmp(text, spateDreapta) == 0){
      digitalWrite(motor1Inainte, HIGH);
      digitalWrite(motor1Inapoi, LOW);
      digitalWrite(motor2Inainte, LOW);
      digitalWrite(motor2Inapoi, LOW);
      digitalWrite(motor3Inainte, LOW);
      digitalWrite(motor3Inapoi, HIGH);
      digitalWrite(motor4Inainte, LOW);
      digitalWrite(motor4Inapoi, LOW);
      delay(500);
    }

    if(strcmp(text, rotireStanga) == 0){
      digitalWrite(motor1Inainte, LOW);
      digitalWrite(motor1Inapoi, HIGH);
      digitalWrite(motor2Inainte, HIGH);
      digitalWrite(motor2Inapoi, LOW);
      digitalWrite(motor3Inainte, LOW);
      digitalWrite(motor3Inapoi, HIGH);
      digitalWrite(motor4Inainte, HIGH);
      digitalWrite(motor4Inapoi, LOW);
      delay(500);
    }

    if(strcmp(text, rotireDreapta) == 0){
      digitalWrite(motor1Inainte, HIGH);
      digitalWrite(motor1Inapoi, LOW);
      digitalWrite(motor2Inainte, LOW);
      digitalWrite(motor2Inapoi, HIGH);
      digitalWrite(motor3Inainte, HIGH);
      digitalWrite(motor3Inapoi, LOW);
      digitalWrite(motor4Inainte, LOW);
      digitalWrite(motor4Inapoi, HIGH);
      delay(500);
    }
  }

  if (!radio.available()) {
    digitalWrite(motor1Inainte, LOW);
    digitalWrite(motor1Inapoi, LOW);
    digitalWrite(motor2Inainte, LOW);
    digitalWrite(motor2Inapoi, LOW);
    digitalWrite(motor3Inainte, LOW);
    digitalWrite(motor3Inapoi, LOW);
    digitalWrite(motor4Inainte, LOW);
    digitalWrite(motor4Inapoi, LOW);
  }
}

Rezultate Obţinute

Care au fost rezultatele obţinute în urma realizării proiectului vostru.

Concluzii

Download

O arhivă (sau mai multe dacă este cazul) cu fişierele obţinute în urma realizării proiectului: surse, scheme, etc. Un fişier README, un ChangeLog, un script de compilare şi copiere automată pe uC crează întotdeauna o impresie bună ;-).

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.

Jurnal

  • 30 aprilie - procurarea pieselor
  • 3 mai - realizare descriere proiect
  • 13-14 mai - realizarea telecomenzii fizice
  • 15-16 mai - realizarea masinii fizice
  • 16 mai - proiectare scheme electrice (telecomanda+masina)
  • 13-16 mai - am implementat si modificat codul in paralel cu realizarea componentelor fizice

Bibliografie/Resurse

Listă cu documente, datasheet-uri, resurse Internet folosite, eventual grupate pe Resurse Software şi Resurse Hardware.

Export to PDF

pm/prj2024/ccontasel/raluca.movileanu.1715933512.txt.gz · Last modified: 2024/05/17 11:11 by ana_maria.diaconu02
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