Panel użytkownika
Nazwa użytkownika:
Hasło:
Nie masz jeszcze konta?

Wyszukiwanie najmiejszej wartości z tabeli. Mikrokontroler.

Ostatnio zmodyfikowano 2013-11-26 16:57
Autor Wiadomość
lukisp2
Temat założony przez niniejszego użytkownika
Wyszukiwanie najmiejszej wartości z tabeli. Mikrokontroler.
» 2013-11-26 16:29:54
Witam Szanownych forumowiczów. Od razu przechodzę do problemu. Wykonuje projekt związany z robotyką na mikrokontrolerze typu arduino. Zadaniem robota jest wykonanie wachlarza pomiarów za pomocą czujnika ultradźwiękowego umieszczonego na serwomotorze, a następnie zwrócenie najmniejszej odległości jaką napotkał w czasie pomiaru i wartości położenia serwa odpowiadającego tej najmniejszej odległości. Jako, że cienko u mnie z programowaniem zatrzymałem się w momencie tego zwrócenia najmniejszej odległości i "namiaru na nią". Stworzyłem tablice, która zapisuje poszczególne zmierzone wartości w 2 kolumnach ale nie jestem pewien czy działa. Pod spodem zamieszczam kod:

Kod:
C/C++
#include <Servo.h>

//-------------------------------------------------
//dotyczy serva z czujnikiem do pomiaru odległości
//-------------------------------------------------
Servo myservo;
//------------------------------------------------
//dotyczy czujnika pomiaru odległości
//------------------------------------------------
const int trigPin = 42;
const int echoPin = 43;
//----------------------------------------------
int tab[ 159 ][ 2 ];


void setup()
{
    Serial.begin( 9600 );
    //Serial.begin(115200);
    myservo.attach( 10 );
    pinMode( trigPin, OUTPUT );
    pinMode( echoPin, INPUT );
}


void loop()
{
   
    int pos;
    //------------------------------------------------
    //dotyczy serva z czujnikiem do pomiaru odległości
    //------------------------------------------------
    //obrót w lewo
    for( pos = 10; pos < 170; pos++ )
    {
        pomiar_odleglosci_serwo_1( pos );
    }
   
    //obrót w prawo
    // for(pos = 180; pos>1; pos--)  
    // {                              
    //  pomiar_odleglosci_serwo_1(pos);  
    // }   
   
    //-----------------------------------------------  
   
}

//funkcja obrotu serwa o kąt pos, pomiaru odległości i wysłania danych na port szeregowy
bool pomiar_odleglosci_serwo_1( int pos )
{
   
    int l_p = 7;
    float odl_s = 0;
    int i_p = 0;
    float T_odl[ l_p ];
    //zmiana kąta    
    myservo.write( pos );
    delay( 100 );
   
    //pomiar odległości
    //z rozdzielczością do 0.1 cm
    for( int i = 0; i < l_p; i++ )
    {
        digitalWrite( trigPin, LOW );
        delayMicroseconds( 2 );
        digitalWrite( trigPin, HIGH );
        delayMicroseconds( 10 );
        digitalWrite( trigPin, LOW );
        int duration = pulseIn( echoPin, HIGH );
        T_odl[ i ] = microsecondsToCentimeters( duration );
        delay( 40 );
    }
   
    //wyznaczanie wartości środkowej    
    for( int j = 0; j <( l_p / 2 ); j++ )
    {
        odl_s =- 1;
        for( int i = 0; i < l_p; i++ )
        {
            if( T_odl[ i ] > odl_s )
            {
                odl_s = T_odl[ i ];
                i_p = i;
            }
        }
        T_odl[ i_p ] =- 1;
    }
    tab[ pos ][ 1 ] = pos;
    tab[ pos ][ 2 ] = odl_s;
   
    //wysłanie wartości kąta serva
    //  Serial.print(pos);
    //  Serial.print(","); 
    //wysyłanie zmierzonej odległości
    //  Serial.print(odl_s,1);
    //Serial.print(",\n");
   
    float min_s = tab[ 10 ][ 2 ];
    for( int k = 10; k < 170; k++ )
    { if( tab[ k ][ 2 ] < min_s )
             min_s = tab[ k ][ 2 ];
       
    }
    Serial.print( "minimum" );
    Serial.print( min_s, 1 );
   
    return true;
}

//funkcja obliczania odległości na podstawie pomiaru czasu
float microsecondsToCentimeters( int microseconds )
{
    return microseconds / 58.0;
}

 Wiem, że prawdopodobnie nakręciłem nieźle w tym kodzie. Ale będę naprawdę wdzięczny za wszelką pomoc.

P-97585
kubawal
» 2013-11-26 16:32:56
Kod daj w [cpp]...[/cpp].
P-97587
kubawal
» 2013-11-26 16:45:01
O który kawałek kodu ci konkretnie chodzi? O ten z
for( int j = 0; j <( l_p / 2 ); j++ )
?

Najlepiej przepisz sobie tą pętle w pseudokodzie, wtedy najłatwiej dostrzec błędy w logice programu.
P-97590
lukisp2
Temat założony przez niniejszego użytkownika
» 2013-11-26 16:57:02
Chodzi mi konkretnie o:
C/C++
tab[ pos ][ 1 ] = pos;
tab[ pos ][ 2 ] = odl_s;

.
.
.
.

float min_s = tab[ 10 ][ 2 ];
for( int k = 10; k < 170; k++ )
{ if( tab[ k ][ 2 ] < min_s )
         min_s = tab[ k ][ 2 ];
   
}
Serial.print( "minimum" );
Serial.print( min_s, 1 );
P-97595
« 1 »
  Strona 1 z 1