Lidium Pioneer Alpha

Introducere

Lidium Pioneer Alpha este o masina care colecteaza informatii despre mediu si foloseste radar pentru identificarea obiectelor care sunt in jurul acesteia. Ea este controlata prin bluetooth, de utilizator prin intermediul unei aplicatii.

Ideea a pornit de la dorinta mea de a construi o masina cu telecomanda, de cand eram mic copil. Pentru a putea fi folosita in diverse conditii, cu diverse utilitati, am decis adaugarea de senzori pentru o analiza mai buna a mediului (cum ar fi temperatura si umiditate).

Proiectul a fost gandit pentru folosirea acestuia in spatii intunecate sau pustii, cum ar fi pesteri. Cu fotorezistorul, acesta isi aprinde farurile ca sa lumineze in jurul lui daca este prea intuneric si astfel detecteaza obiectele din jur, pentru a oferi o imagine de ansamblu a traseului.

Descriere generală

La baza masinii se afla un Arduino Uno, care va controla intreg flow-ul proiectului. Pentru deplasare, se folosesc 4 motoare, unul pentru fiecare roata. De asemenea, la arduino mai sunt conectati diversi senzori, pentru colectarea de date: un senzor ultrasonic, folosit pentru sistemul radar, un senzor pentru temperatura si umiditate, respectiv unul pentru sunet cu microfon. Senzorul ultrasonic este conectat printr-un servomotor, pentru miscarea la un unghi larg.

Totodata, la Arduino este conectat si un modul bluetooth, prin intermediul caruia vor fi transmise datele de la senzori la utilizator, respectiv vor fi transmise comenzile de miscare de la utilizator catre masina.

Hardware Design

Componentele hardware:

  • Sasiu gaurit
  • Suruburi si piulite
  • 4 roti
  • 4 motoare
  • Arduino UNO R3 CH340
  • Placa de expansiune cu driver chip TB6612FNG integrat pentru motoare
  • Senzor ultrasonic HC-SR04
  • 2 Module Bluetooth HC-05
  • Servomotor SG90
  • Modul senzor cu fotorezistor LDR
  • Modul senzor de temperatura si umiditate DHT11
  • Modul senzor sunet cu microfon KY-038
  • Breadboard
  • Carcasa baterii
  • Baterii
  • Rezistente 220ohmi
  • Leduri
  • Fire mama-tata, tata-tata, mama-mama
  • Banda adeziva

Schema electrica:

Dupa constructia corpului masinii, cu sasiuri, roti si motoare, am amplasat toate componentele; principala este Arduino UNO R3, pe care este conectata placa de expansiune. Placa are integrata driverul TB6612FNG, care se foloseste de pinii D2 si D5 pentru motoarele aflate in partea stanga (D2 pentru directie si D5 pentru PWM), respectiv D4 si D6 pentru motoarele aflate in partea dreapta (D4 pentru directie si D6 pentru PWM). Motoarele A1 si A2 (adica cele de pe partea stanga) sunt setate sa mearga in fata atunci cand D2 este High si in spate daca D2 este Low, iar motoarele B1 si B2 (adica cele de pe partea dreapta) sunt setate sa mearga in spate daca D4 este High si in fata daca D4 este pe Low. Tot la placa de expansiune sunt conectați și ceilalți senzori, folosindu-se de atat pini analogici, cât și digitali. Avem următorii senzori:
1. Senzor de temperatura și umiditate: acesta are 3 pini: !, out și -, și e legat de placa la urmatorii pini: + → VCC, out → D7 și- → GND. D7 este pinul de date, prin pinul 7 se va face transmisia de date.
2. Fotorezistorul: acesta este de asemenea conectat la placa prin 3 pini, principalul fiind analogic 1.
3. Senzor ultrasonic: acesta are 4 pini: Vcc, Trig, Echo și Gnd, care este legat de placa astfel: Vcc → 5V, Trig → D12, Echo → D13, Gnd → GND. Pinul Trig da trigger la semnalele sonore; pinul Echo ramane pe high din momentul in care se activeaza semnalele sonore pentru a masura distanta. Distanta se masoara prin formula bazata pe v = d/t.
Alături de cei 3 senzori, mai sunt legate ledurile, respectiv un servomotor.
4. Servomotor: acesta este conectat la D10, GND și 5V
5. Ledurile: fiecare au câte o rezistenta de 220ohmi, pentru a preveni arderea lor. Ele sunt conectate la pinii A2, respectiv A3. Acestia pot functiona ca niste pini digitali prin conversie.

Software Design

Codul este in principal compus din 3 parti:

  • Conexiunea dintre smartphone (aplicatie) si placa arduino, care se face prin primul modul bluetooth HC-05
  • Conexiunea dintre placa arduino si calculator, care se face prin al doilea modul bluetooth HC-05
  • Transmiterea datelor primite prin seriala de la laptop la o aplicatie

Voi face o detaliere a celor 3 parti:
Conexiunea telefon-masina:

Aplicatia de unde trimit comenzile a fost creata in MIT APP INVENTOR; meniul are 7 butoane: un buton este de conectare la un dispozitiv bluetooth, 5 butoane sunt pentru controlul masinii(mers inainte, mers inapoi, rotit la stanga si rotit la dreapta) si un buton este pentru deconectarea de la bluetooth. La apasarea fiecarui buton, se trimite cate o comanda catre bluetooth, astfel informatia ajungand la Arduino. Atunci cand se cere conectarea la bluetooth, se cauta printre dispozitivele asociate telefonului si se alege modulul aferent. Pentru miscare, se transmite cate un caracter pentru fiecare mod: 'F' pentru in fata, 'B' pentru in spate, 'L' pentru la stanga, 'R' pentru la dreapta, 'S' pentru oprirea miscarii.

Pentru deconectare, se apasa butonul de disconnect.
Implementarea PWM am facut-o in Arduino IDE:

#include <SoftwareSerial.h>
SoftwareSerial mySerial (9, 11);
void setup() {
mySerial.begin(9600);
pinMode(2, OUTPUT);
pinMode(5, OUTPUT);
pinMode(4, OUTPUT);
pinMode(6, OUTPUT);
}
void loop() {
char elem = mySerial.read();
if (elem == 'F') {
digitalWrite(2, HIGH);
analogWrite(5, 50);
digitalWrite(4, LOW);
analogWrite(6, 50);

} else if (elem == 'B') {
digitalWrite(2, LOW);
analogWrite(5, 50);
digitalWrite(4, HIGH);
analogWrite(6, 50);

} else if (elem == 'L') {
digitalWrite(2, LOW);
analogWrite(5, 50);
digitalWrite(4, LOW);
analogWrite(6, 50);

} else if (elem == 'R') {
digitalWrite(2, HIGH);
analogWrite(5, 50);
digitalWrite(4, HIGH);
analogWrite(6, 50);

} else if (elem == 'S') {
digitalWrite(2, LOW);
analogWrite(5, 0);
digitalWrite(4, LOW);
analogWrite(6, 0);

}
}

Am creat o seriala software pe care am primit datele de la telefon.
Am implementat PWM ul conform fisei de specificatii a shield-ului TB6612:
arduino_motor_shield_tb6612_v2.2.pdf

Conexiunea arduino-pc:
Aceasta se realizeaza folosind un al doilea modul bluetooh; astfel, datele sunt citite de la senzori, si apoi transmise prin seriala hardware (cea cu pinii 0 si 1). Senzorii pe care ii folosesc sunt: de temperatura si umiditate, fotorezistenta, de sunet cu microfon, respectiv servomotor. Valorile masurate de senzori sunt transmise prin citirea pinilor, respectiv prin scrierea pe seriala a unui string format din succesiunea valorilor separate prin virgula:
#include <Servo.h>
#include “DHT.h”

#define DHTPIN 7
#define DHTTYPE DHT11

const int trigPin = 12;
const int echoPin = 13;
const int ledPin1 = A2;
const int ledPin2 = A3;
const int ldrPin = A1;
const int microPin = 8;
const int analogPin = A0;
const byte rxPin = 9;
const byte txPin = 11;

DHT dht(DHTPIN, DHTTYPE);

long duration;
int distance;
int i = 15;
int set = 1;


Servo myServo;

void setup() {
Serial.begin(9600);
Set pin modes
pinMode(trigPin, OUTPUT);
pinMode(echoPin, INPUT);
pinMode(ldrPin, INPUT);
pinMode(ledPin1, OUTPUT);
pinMode(ledPin2, OUTPUT);
pinMode(microPin, INPUT);
pinMode(analogPin, INPUT);
pinMode(2, OUTPUT);
pinMode(5, OUTPUT);
pinMode(4, OUTPUT);
pinMode(6, OUTPUT);

Attach servo motor
myServo.attach(10);
dht.begin();

pinMode(rxPin, INPUT);
pinMode(txPin, OUTPUT);

}

void loop() {
Read LDR valu
int ldrStatus = analogRead(ldrPin);

if (ldrStatus ⇐ 40) {
digitalWrite(ledPin1, HIGH);
digitalWrite(ledPin2, HIGH);
} else {
digitalWrite(ledPin1, LOW);
digitalWrite(ledPin2, LOW);
if (ldrStatus < 80) {
digitalWrite(ledPin1, HIGH);
}
}

float h = dht.readHumidity();
float t = dht.readTemperature();

float analogMicro = analogRead(analogPin) * (5.0 / 1023.0);
int digitalMicro = digitalRead(microPin);

int result = 0;
if (digitalMicro == 1 ) {
result = 1;
} else {
result = 0;
}

if (i == 165) {
set = -1;
}
if (i == 15) {
set = 1;
}
Rotate the servo motor from 15 to 165 degrees

myServo.write(i);
delay(30);
distance = calculateDistance();

printData(i, distance, ldrStatus, result, t, h);
delay(200);
i += set

}


int calculateDistance() {
digitalWrite(trigPin, LOW);
delayMicroseconds(2);
digitalWrite(trigPin, HIGH);
delayMicroseconds(10);
digitalWrite(trigPin, LOW);
duration = pulseIn(echoPin, HIGH);
int distance = duration * 0.034 / 2;
return distance;
}


void printData(int servoAngle, int distance, int ldrStatus, int result, float t, float h) {
Serial.println(”?” + String(servoAngle) + ”, ” + String(distance) + ”, ” + String(ldrStatus) + ”, ” + String(result) + ”, ” + String(t) + ”, ” + String(h) + ”!”);
}


Conexiunea pc-aplicatie:

Aplicatia a fost scrisa in java, in processing. Aceasta functioneaza dupa urmatorul flow: ia datele de la seriala, deseneaza radarul, deseneaza linia care se misca in functie de unghiul servomotorului. Datele au fost trimise la seriala cu '?' in fata sirului si '!' dupa, pentru a arata faptul ca ce se afla intre cele 2 semne este un sir valid. Se poate ca atunci cand se porneste aplicatie de radar, sa citeasca de la seriala de pe la mijlocul sirului, adica sa omita niste date. Pentru a preveni acest lucru, s-au pus terminatorii de sir, astfel delimitandu-se sirul valid si obtinand toate datele:
void serialEvent(Serial myPort) {
while (myPort.available() > 0) {
String incomingData = myPort.readString();
if (incomingData != null) {
buffer += incomingData;

int startIndex = buffer.indexOf('?');
int endIndex = buffer.indexOf('!');

if (startIndex != -1 && endIndex != -1 && endIndex > startIndex) {
String data = buffer.substring(startIndex + 1, endIndex);
buffer = buffer.substring(endIndex + 1);
String[] parts = data.split(”, ”);

ang = parts[0];
distance = parts[1];
ldr = parts[2];
String soundStr = parts[3];
String temperature = parts[4];
String humidity = parts[5];

angle = Integer.parseInt(ang);
dist = Integer.parseInt(distance);
ldrValue = Integer.parseInt(ldr);
soundStatus = soundStr;
temp = Float.parseFloat(temperature);
hum = Float.parseFloat(humidity);
}
}
}
}

Rezultate Obţinute

Demo-ul

 

Concluzii

A fost un proiect foarte interesant si mi-a facut foarte multa placere sa il fac. Am invatat foarte multe si, in ciuda faptului ca bluetooth-ul mi-a dat foarte multe batai de cap, am reusit sa finalizez proiectul si versiunea finala sa fie cea planificata de mine. Proiectul poate fi de asemena extins pentru mai multi senzori si poate fi folosit alt modul in loc de cel bluetooth pentru a fi masurate distante mai mari

Download

Bibliografie/Resurse

pm/prj2024/sseverin/lidia_elena.manea.txt · Last modified: 2024/05/27 15:38 by lidia_elena.manea
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