Table of Contents

DIY RC Car

Introducere

Descriere generală

Diagramă bloc

Descriere mod de funcționare

Telefonul comunică cu modulul Bluetooth, care, la rândul său, trimite comenzile către placa de control. În funcție de comanda primită, placa va efectua următoarele acțiuni:

La apăsarea butonului switch, va avea loc schimbarea modului de viteză și a culorii LED-ului RGB.

Hardware Design

Componentele folosite

Schema electrică

Software Design

void switchNitro() {
  if (PIND & (1 << NITRO_PIN)) {
    nitro = false;
  } else {
    nitro = true;
  }
}
void setup() {
  Serial.begin(9600);
  // Input pullup
  DDRD &= ~(1 << NITRO_PIN);
  PORTD |= (1 << NITRO_PIN);
  DDRD |= (1 << HONK_PIN);
  DDRD |= (1 << LED_GREEN_PIN);
  DDRD |= (1 << LED_RED_PIN);
  DDRB |= (1 << UP_LEFT_PIN);
  DDRB |= (1 << DOWN_LEFT_PIN);
  DDRB |= (1 << DOWN_RIGHT_PIN);
  DDRB |= (1 << UP_RIGHT_PIN);
  attachInterrupt(digitalPinToInterrupt(NITRO_PIN), switchNitro, CHANGE);
  // Init nitro
  nitro = false;  
  // Init RGB LED
  PORTD &= ~(1 << LED_RED_PIN);
  PORTD |= (1 << LED_GREEN_PIN);
  // Init wheels pins
  PORTB &= ~(1 << UP_LEFT_PIN);
  PORTB &= ~(1 << DOWN_LEFT_PIN);
  PORTB &= ~(1 << DOWN_RIGHT_PIN);
  PORTB &= ~(1 << UP_RIGHT_PIN);
} 
void loop() {
  if (Serial.available() > 0) {
    cmd = Serial.read();
  } else {
    cmd = None;
  }
  if (cmd == Start_Honk) {
    tone(HONK_PIN, 300);
  } else if (cmd == Stop_Honk){
    noTone(HONK_PIN);
  }
  if (cmd == Nitro_On) {
    nitro = true;
  } else if (cmd == Nitro_Off) {
    nitro = false;
  }
  if (cmd == Up) {
    if (nitro) {
      PORTB |= (1 << UP_LEFT_PIN);
      PORTB |= (1 << UP_RIGHT_PIN);
    } else {
      analogWrite(UP_LEFT_PIN_ARDUINO, 180); 
      analogWrite(UP_RIGHT_PIN_ARDUINO, 180); 
    }
    PORTB &= ~(1 << DOWN_LEFT_PIN);
    PORTB &= ~(1 << DOWN_RIGHT_PIN);
  } else if (cmd == Down) {
    digitalWrite(UP_LEFT_PIN_ARDUINO, LOW);
    digitalWrite(UP_RIGHT_PIN_ARDUINO, LOW);
    PORTB |= (1 << DOWN_LEFT_PIN);
    PORTB |= (1 << DOWN_RIGHT_PIN);
  } else if (cmd == Left) {
    digitalWrite(UP_LEFT_PIN_ARDUINO, LOW);
    if (nitro) {
      PORTB |= (1 << UP_RIGHT_PIN);
    } else {
      analogWrite(UP_RIGHT_PIN_ARDUINO, 180); 
    }
    PORTB &= ~(1 << DOWN_LEFT_PIN);
    PORTB &= ~(1 << DOWN_RIGHT_PIN);
  } else if (cmd == Right) {
    if (nitro) {
      PORTB |= (1 << UP_LEFT_PIN);
    } else {
      analogWrite(UP_LEFT_PIN_ARDUINO, 180); 
    }
    digitalWrite(UP_RIGHT_PIN_ARDUINO, LOW);
    PORTB &= ~(1 << DOWN_LEFT_PIN);
    PORTB &= ~(1 << DOWN_RIGHT_PIN);
  } else if(cmd == Center) {
    digitalWrite(UP_LEFT_PIN_ARDUINO, LOW);
    digitalWrite(UP_RIGHT_PIN_ARDUINO, LOW);
    PORTB &= ~(1 << DOWN_LEFT_PIN);
    PORTB &= ~(1 << DOWN_RIGHT_PIN);
  }
  if (nitro) {
    PORTD |= (1 << LED_RED_PIN);
    PORTD &= ~(1 << LED_GREEN_PIN);
  } else {
    PORTD &= ~(1 << LED_RED_PIN);
    PORTD |= (1 << LED_GREEN_PIN);
  }
}

Download

sorin_petrut.barbu.zip

Export to PDF