Sunteți pe pagina 1din 5

Lucrarea 7

Aplicaii utilizand senzorul de sunet

Trasarea caracteristicii senzorului de sunet pentru

btut din palme i comand verbal.


Fisier NXC necesar pentru trasarea caracteristicii senzorului:
#define
NUME_FISIER
#define
DIM_VECTOR
// Variabile:
byte File_handle;
unsigned short bytesWritten;
task main()
{
short ValSnz[DIM_VECTOR];
short val_senzor;
short k;
short temp;
string temp_string;
SetSensorSound(IN_2);
for (k=0;k<DIM_VECTOR;k++)
{
ValSnz[k] = Sensor(IN_2);
Wait(5);
// pt citire la 5 ms
}
TextOut(0,LCD_LINE4,"GATA");
Wait(500);

"RaspSnzSunet.txt"
2000

// numele fisierul in care sunt salvate datele


// nr de puncte ale caracteristicii senzorului

// vector in care sunt stocate datele

// setare senzor de sunet conectat la portul de intrare identificat prin constanta IN_2

//------------------------------------------------------// Salveaza datele in fisierul NUME_FISIER


//------------------------------------------------------DeleteFile(NUME_FISIER);
CreateFile(NUME_FISIER, 8192, File_handle); // creeaza fisierul cu date de iesire, alocandu-i 4kB
for (k = 0; k < DIM_VECTOR; k++)
{
temp = ValSnz[k];
temp_string = NumToStr(temp);
WriteLnString(File_handle,temp_string, bytesWritten);
}
CloseFile(File_handle);
}

Descarca de pe robot pe PC, prin USB, fisierul text cu numele


"RaspSnzSunet.txt. Fisierul contine datele citite de la senzorul de sunet
salvate pe robot la rularea programului anterior.

Fisiere existente
pe PC

Programe si fisiere
existente pe robot

Aplicatie demonstrativa
/* Robotul mobil este pus in miscare sau oprit la citirea unei batai din palme de la senzorul de sunet. Doua batai din palme vor semnifica viraj catre o stanga sau dreapta */
// intervalul maxim intre doua batai consecutive pt care se considera o bataie dubla
#define
INTERVAL_ASTEPTARE_A_DOUA_BATAIE
800
// [ms]
// interval introdus dupa detectarea unei batai, pt a lasa timp sa scada nivelul de sunet la nivelul de zgomot de fond
// Intervalul trebuie sa fie mai mare decat durata unei batai din palme
#define
INTERVAL_ASTEPTARE_CITIRE_URMATOARE
400
// [ms]
int val_senzor;
int val_prag_superior = 60;
int pwr = 50;
bool pornit;
// indicator al starii de miscare a robotului (pornit / oprit)
byte comanda;
// variabila pentru interpretarea batailor din palme
byte numar_batai;
// contor pt numarul de batai consecutive
unsigned long interval;
// interval timp intre doua batai consecutive
unsigned long tick_anterior;
// valoarea ceasului de sistem la citirea anterioara
task main()
{
SetSensorSound(S3);
pornit = false;
numar_batai = 0;
comanda = 0;
tick_anterior = CurrentTick();
while(true)
{
val_senzor = Sensor(S3); // Citire senzor de sunet
interval = CurrentTick() - tick_anterior;
// Testeaza daca s-a auzit bataie
if (val_senzor > val_prag_superior)
{
numar_batai++;
if (numar_batai == 2)
{
comanda = 2;
numar_batai = 0;
}
tick_anterior = CurrentTick();
Wait(INTERVAL_ASTEPTARE_CITIRE_URMATOARE);
}
else
// testeaza daca a expirat timpul intre momentul bataii anterioare si momentul curent
if ((numar_batai == 1) && (interval > INTERVAL_ASTEPTARE_A_DOUA_BATAIE))
{
comanda = 1;
numar_batai = 0;
}
else
comanda = 0;

//continuare
// Executie comenzi pe baza interpretarii
if (comanda == 1)
{
if(pornit == true)
{
// se va completa prin oprirea celor doua motare prin franare electrica
//
Wait(50);
// Asteapta un timp pt franare
Float(OUT_BC);
// Opreste alimentarea pt a nu tine motoarele blocate in repaus
pornit = false;
}
else
{
OnFwd(OUT_BC,pwr);
pornit = true;
}
}
else if (comanda == 2)
{
// se va completa prin viraj spre stanga sau dreapta
// opreste un motor prin franare electrica
//
Wait(50);
// Asteapta un timp pt franare
Float(OUT_C);
// Opreste alimentarea pt a nu tine motorul blocat in repaus
OnFwd(OUT_B,pwr);
Wait(5);
pornit = true;
}
}
}

S-ar putea să vă placă și