Documente Academic
Documente Profesional
Documente Cultură
"RaspSnzSunet.txt"
2000
// setare senzor de sunet conectat la portul de intrare identificat prin constanta IN_2
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;
}
}
}