obscurade
Published © GPL3+

Robot Car - Shift Register, Sensors, and App interfacing

A bluetooth controlled multi-functionality robot car.

IntermediateFull instructions provided391
Robot Car - Shift Register, Sensors, and App interfacing

Things used in this project

Hardware components

Arduino Nano R3
Arduino Nano R3
×1
DC Motor, 12 V
DC Motor, 12 V
×4
Dual H-Bridge motor drivers L298
SparkFun Dual H-Bridge motor drivers L298
×1
Yellow Wheel
×4
HM-10
×1
Toggle Switch, Toggle
Toggle Switch, Toggle
×1
4xAA battery holder
4xAA battery holder
×1
Jumper wires (generic)
Jumper wires (generic)
×1
Female/Female Jumper Wires
Female/Female Jumper Wires
×1
Grove - Gas Sensor(MQ2)
Seeed Studio Grove - Gas Sensor(MQ2)
×1
DHT11 Temperature & Humidity Sensor (4 pins)
DHT11 Temperature & Humidity Sensor (4 pins)
×1
Pack of Resistors
×1
High Brightness LED, White
High Brightness LED, White
×2
5 mm LED: Red
5 mm LED: Red
×2
BMP180
×1
Capacitor 10 µF
Capacitor 10 µF
×1
PLA Filament
×1
Solderless Breadboard Full Size
Solderless Breadboard Full Size
×1

Software apps and online services

Dabble
STEMpedia Dabble

Hand tools and fabrication machines

Scissor, Electrician
Scissor, Electrician
Tape, Electrical
Tape, Electrical
3D Printer (generic)
3D Printer (generic)

Story

Read more

Schematics

Circuit Diagram

Code

Code

C/C++
#define CUSTOM_SETTINGS
#define INCLUDE_GAMEPAD_MODULE
#define INCLUDE_TERMINAL_MODULE

#include <Dabble.h>
#include <ShiftRegister74HC595.h>
#include <Wire.h>
#include <SFE_BMP180.h>
#include <MQ2.h>
#include <dht.h>

int numberOfShiftRegisters = 1; 
int serialDataPin = 12; 
int clockPin = 10; 
int latchPin = 11; 

ShiftRegister74HC595<1> sr(serialDataPin, clockPin, latchPin);

SFE_BMP180 bmp180;
dht DHT;

const int dht = 5;

String str = "Pressure Sensor ";
String str1 = "Gas Sensor ";
String str2 = "Humidity Sensor ";
String str3 = "Light Sensor ";

const int GAS_SENSOR = A6;
int lpg, co, smoke;

MQ2 mq2(GAS_SENSOR);

const int ENA = 0;
const int N1 = 1;
const int N2 = 2;
const int N3 = 3;
const int N4 = 4;
const int ENB = 5;

const int HEADLIGHT = 6;
int HEADLIGHT_STATUS = HIGH;
unsigned long previousMillis = 0;
const long interval = 500;

const int BACKLIGHT = 7;

const int RIGHT = A3;
const int MIDDLE = A2;
const int LEFT = A1;

int rightRead, middleRead, leftRead;

int wheelsState = 1;

const int FRONT1 = 9;
const int FRONT2 = 8;

const int BACK1 = 7;
const int BACK2 = 6;

int front1Read, front2Read, back1Read, back2Read;

const int LDR = A7;

void setup()
{
  pinMode(GAS_SENSOR, INPUT);

  Dabble.begin(9600);
  Serial.begin(9600);

  sr.set(HEADLIGHT, HIGH);

  pinMode(FRONT1, INPUT);
  pinMode(FRONT2, INPUT);
  pinMode(BACK1, INPUT);
  pinMode(BACK2, INPUT);

  mq2.begin();
  bool success = bmp180.begin();

  if (success) {
    Serial.println("BMP180 init success");
  }
}

void buttonRead()
{
  if (wheelsState == HIGH) {
    if (GamePad.isUpPressed())
    {
      Serial.println("Up");
      sr.set(BACKLIGHT, LOW);
      sr.set(ENA, HIGH);
      sr.set(N1, LOW);
      sr.set(N2, HIGH);
      sr.set(ENB, HIGH);
      sr.set(N3, HIGH);
      sr.set(N4, LOW);
    }

    else if (GamePad.isDownPressed())
    {
      Serial.println("Down");
      sr.set(BACKLIGHT, HIGH);
      sr.set(ENA, HIGH);
      sr.set(N1, HIGH);
      sr.set(N2, LOW);
      sr.set(ENB, HIGH);
      sr.set(N3, LOW);
      sr.set(N4, HIGH);
    }

    else if (GamePad.isLeftPressed())
    {
      Serial.println("Left");
      sr.set(BACKLIGHT, LOW);
      sr.set(ENA, HIGH);
      sr.set(N1, HIGH);
      sr.set(N2, LOW);
      sr.set(ENB, HIGH);
      sr.set(N3, HIGH);
      sr.set(N4, LOW);
    }

    else if (GamePad.isRightPressed())
    {
      Serial.println("Right");
      sr.set(BACKLIGHT, LOW);
      sr.set(ENA, HIGH);
      sr.set(N1, LOW);
      sr.set(N2, HIGH);
      sr.set(ENB, HIGH);
      sr.set(N3, LOW);
      sr.set(N4, HIGH);
    }
    else
    {
      sr.set(ENA, LOW);
      sr.set(N1, LOW);
      sr.set(N2, LOW);
      sr.set(ENB, LOW);
      sr.set(N3, LOW);
      sr.set(N4, LOW);
    }
  }
  else
  {
    sr.set(ENA, LOW);
    sr.set(N1, LOW);
    sr.set(N2, LOW);
    sr.set(ENB, LOW);
    sr.set(N3, LOW);
    sr.set(N4, LOW);
  }
}
void headLights() {
  if (GamePad.isTrianglePressed()) {
    unsigned long currentMillis = millis();

    if (currentMillis - previousMillis >= interval) {
      previousMillis = currentMillis;

      HEADLIGHT_STATUS = !HEADLIGHT_STATUS;
      sr.set(HEADLIGHT, HEADLIGHT_STATUS);
    }
  }
}

void sensorReadings()
{
  if (Terminal.available() > 0) {
    if (Terminal.compareString(str)) {
      char status;
      double T, P;
      bool success = false;

      status = bmp180.startTemperature();

      if (status != 0) {
        delay(1000);
        status = bmp180.getTemperature(T);

        if (status != 0) {
          status = bmp180.startPressure(3);

          if (status != 0) {
            delay(status);
            status = bmp180.getPressure(P, T);

            if (status != 0) {
              Terminal.println("Pressure: ");
              Terminal.println(P);
              Terminal.println(" hPa");

              Terminal.println("Temperature: ");
              Terminal.println(T);
              Terminal.println("C");
            }
          }
        }
      }
    }
    else if (Terminal.compareString(str1)) {
      float* values = mq2.read(true);
      lpg = mq2.readLPG();
      co = mq2.readCO();
      smoke = mq2.readSmoke();

      Terminal.println("LPG");
      Terminal.println(lpg);
      Terminal.println("CO2");
      Terminal.println(co);
      Terminal.println("Smoke");
      Terminal.println(smoke);
      Terminal.println("PPM");
    }
    else if (Terminal.compareString(str2)) {
      int chk = DHT.read11(dht);
      Terminal.println(DHT.humidity);
      Terminal.println("%");
    }
    else if (Terminal.compareString(str3)) {
      int lightValue = analogRead(LDR);
      Terminal.println("Light Value: ");
      if (lightValue >= 900) {
        Terminal.println("High");
      }
      else if (lightValue <= 899 && lightValue >= 880) {
        Terminal.println("Medium");
      }
      else {
        Terminal.println("Low");
      }
    }
  }
}

void liftDetection()
{
  rightRead = digitalRead(RIGHT);
  middleRead = digitalRead(MIDDLE);
  leftRead = digitalRead(LEFT);

  if (rightRead == 1 || middleRead == 1 || leftRead == 1) { //on ground
    wheelsState = HIGH;
  }
  if (rightRead == 0 && middleRead == 0 && leftRead == 0) { //off ground
    wheelsState = LOW;
4  }
}


void obstactleDetection() {
  front1Read = digitalRead(FRONT1);
  front2Read = digitalRead(FRONT2);
  back1Read = digitalRead(BACK1);
  back2Read = digitalRead(BACK2);

  if (front1Read == HIGH || front2Read == HIGH || back1Read == HIGH || back2Read == HIGH) {
    sr.set(ENA, LOW);
    sr.set(N1, LOW);
    sr.set(N2, LOW);
    sr.set(ENB, LOW);
    sr.set(N3, LOW);
    sr.set(N4, LOW);
  }
}
void loop() {
  Dabble.processInput();

  obstactleDetection();
  liftDetection();
  buttonRead();
  sensorReadings();
  headLights();
}

Credits

obscurade
1 project • 0 followers

Comments