-         

Ergebnis 1 bis 10 von 10

Thema: Parallax-Ultraschall-Sensor am Handyboard

  1. #1
    Benutzer Stammmitglied
    Registriert seit
    11.05.2005
    Ort
    Trimmis
    Alter
    30
    Beiträge
    47

    Parallax-Ultraschall-Sensor am Handyboard

    Anzeige

    Hallo zusammen,
    ich habe zwei Parallax-US-Sensoren Ping))) zu Hause. Diese sollten am Handyboard die Distanz messen.
    Allerdings funktionnieren die Sensoren nicht so wie die SRF04. Ich habe den Ping))) am Erweiterungsboard des Handyboards auf DigitalPort0 angeschlossen, wo normalerweise der SRF04 hinkäme.

    Mit dem Befehl sonar(); bekomme ich aber den Rückgabewert 32767, was bedeutet, dass der Sensor entweder kein Rücksignal gibt oder gar nicht angeschlossen ist.

    Der Ping))) blinkt aber, wenn ich au Handyboard den Befehl sonar(); ausführe (das bedeutet, dass er richtig verbunden ist).

    Der Ping)))-Ultraschall-Sensor macht folgendes:
    Sobald er ein Signal vom Controller bekommen hat, stellt er die SIGNAL-Leitung auf High und sendet gleichzeitig ein Ultraschall-Signal aus.
    Wenn das Signal zurück kommt, dann wird der SIG-Port wieder auf Low geschaltet.

    Man braucht am Controller eigentlich ja nur zu messen, wie lange der SIG-Port auf High war.

    Allerdings komme ich bei der Programmierung nicht weiter.

    Kann mir jemand auf die Sprünge helfen, wie ich das ganze genau veranlasse?

    Herzlichen Dank
    Beni

  2. #2
    Erfahrener Benutzer Roboter Experte
    Registriert seit
    29.04.2005
    Ort
    Weilburg
    Beiträge
    676
    Hast du das Interactive C 5.0.9 ?
    Ich habe mal im Verzeichnis "lib\handyboard" nachgeschaut.
    Da sind bei mir die Dateien:
    sonar.ic ... die ist für einen Polaroid 6500 Sensor
    srf04_sonar.ic
    srf04_sonar.asm
    srf04_sonar.icb ... das ist die übersetzte asm
    Wenn du einen anderen Sensor nehmen willst, wirst du die ändern müssen.
    Mit googeln habe ich das gefunden:
    http://handyboard.com/software/contr..._range_sonar.c
    http://handyboard.com/software/sonar.html
    Prostetnic Vogon Jeltz

    2B | ~2B, That is the Question?
    The Answer is FF!

  3. #3
    Benutzer Stammmitglied
    Registriert seit
    11.05.2005
    Ort
    Trimmis
    Alter
    30
    Beiträge
    47
    Hi
    @Vogon: mit diesen Files funktionniert die Sache leider auch nicht. Ich erhalte (mit den Files, die du auf Google gefunden hast) immer einene Wert um 550 herum, obwohl die Distanz nur ca. 1.2 Meter wäre.

    Wenn ich ein Buch davor halte, ändert sich nichts am Wert.

    Etwa einmal auf 20 Messungen kommt ein viel kleinerer Wert heraus, der eher als Distanz passen würde, aber auch nicht genau stimmt.

    Das ist der Code:
    Code:
    /* Code for Parrallax "PING". 3-legged UltraSonic sensor to Handyboard.
    Modified by Stefan Ericsson, HIS, Sweden
    Connect signal to digital(7)+ 1K-Ohm resistor from digital(7) to "SPI" SS/PD5. 
    Enjoy!! */
    void sonar_init() {
        // CHR: adresserna 0x0000 till 0x10FF ar till 68HC11 CPU.
        bit_set(0x1009, 0x30);  // ddrd - CHR: activates dig-out.
        bit_set(0x1021, 2);   /* at tctl2, */
        bit_clear(0x1021, 1);  /* set tic3 for rising edge */
        //
        printf("sonar initiated!\n"); // CHR - Take away! Only for testing.
        //
    }
    
    
    float sonar_sample() {
        
        /*
      note on variable names
      The first part indicates its use, the second the units.
      st is start time, end is end time, dur is duration, dst is distance.
      ms is millisec, us is micro sec, cm is centimeters.
     */
        
        int st_us,end_us;
        long st_ms,end_ms,dur_ms,abort_ms;
        int dst_cm;
        
        
        
        
        /* trigger the pulse */
        bit_set(0x1008, 0x20); // activates dig-out
        /* clear trigger and BINH */
        bit_clear(0x1008, 0x20);
        
        
        // capture the start time CHR: st_ms is start time in milliseconds.
        st_ms = mseconds();
        
        /* calc the abort time = 70ms is about 12 meters */
        abort_ms = st_ms + 70L;
        
        st_us = peekword(0x100e); // CHR: st_us is start time in microseconds. peekword reads memory as Long from location 0x100e & 0x100f. 
        
        poke(0x1023, 1); // clear tic3 flag
        
        
        /* while the echo has not come in */
        while ((peek(0x1000) & 0x1)) { // CHR: & means bitwise comparison. Echo comes in at adress 0x1000. 
            /* if we've been waiting too long (70ms = 12 meters) */
            if (mseconds() > abort_ms) {
                return(-1.0);
            }
            defer();
        }
        
        
        /* save the end times */
        end_us = peekword(0x1014);
        dur_ms = mseconds() - st_ms;
        
        /*  divide timers by number of cycles required to travel 1cm */
        st_us = st_us / 117;
        end_us = end_us / 117;
        
        /* find distance difference */
        dst_cm = end_us - st_us;
        
        /* if distance is less than zero, add distance of 65536 cycles */
        if (dst_cm < 0) dst_cm = dst_cm + 558;
        
        /* if the millisecond counter indicates that the integer counter has cycled */
        if (dur_ms > 32L) dst_cm = dst_cm + 558;
        if (dur_ms > 64L) dst_cm = dst_cm + 558;
        
        /* my unit reads about 5cm too high - yours may differ */
        return ((float)dst_cm); //(dst_cm - 5);
    }
    
    
    void main(){ //  sonar_display()
        
        int distance;
        sonar_init();
        
        while (1) {
            float result;
            result= sonar_sample();
            if (result != -1.0) printf("%f\n", result); // f.d. result
            else printf("*******\n");
            msleep(300L);
        }
    }
    mfg bekoeppel
    Und sie dreht sich doch...
    http://www.muasch.com
    http://robotik.muasch.com

    Definitiv kein Bascom-User

  4. #4
    Erfahrener Benutzer Roboter Experte
    Registriert seit
    29.04.2005
    Ort
    Weilburg
    Beiträge
    676
    Schade das ich dir da nicht helfen kann.
    Da wirst du vermutlich nur weiter kommen, wenn du mit einem Oszi dir mal die Signale anschaust. Mit ein bisschen Glück und gebastel reicht da ja ein Software-Oszi mit der Soundkarte.

    Ich habe leider kein Handyboard, sondern den "Vorläufer" RUG-Warrior http://handyboard.com/faq/display.php?key=rugw
    Leider finde ich keine neue InteractiveC-LIB für den RW. Die letzte Version ist schon einige Jahre alt - ich glaub es ist noch was mit 2.x, also uralt.
    Das Interactive C 5.0.9 habe ich auf meinem Rechner, weil ich gehofft hat, es irgendwie doch mit dem RW ans laufen zu bekommen. Da es aber die LIB anscheinend nicht als Source gibt, habe ich ein Problem. [-o<
    Ich habe auch schon mal mit einem Disasembler versucht die Änderungen herauszufinden. Das ist aber soooo Zeitaufwendig, das es im Sand verlaufen ist.
    Naja, vielleicht sollte ich ihm ja seinen Roboter-Ruhestand gönnen.
    Prostetnic Vogon Jeltz

    2B | ~2B, That is the Question?
    The Answer is FF!

  5. #5
    Benutzer Stammmitglied
    Registriert seit
    11.05.2005
    Ort
    Trimmis
    Alter
    30
    Beiträge
    47
    Hmm naja, ich habe mir überlegt, dass es doch möglich sein sollte, einen impuls über einen digitalen ausgang vom handyboard-erweiterungsboard auszugeben, der den US veranlasst, zu messen.
    Der digitale Out ist mit einem digitalen In verbunden, und beide mit dem Signal-Port vom Sensor.

    Das Erweiterungsboard gibt dann einen Impuls aus, der dann den US veranlasst, die Distanz zu messen, und fast gleichzeitig registriert der digitale Input einen Strom (nämlich den vom digitalen Out).
    Die Zeit wird ermittelt und gewartet, bis der zweite Impuls kommt (also dieser vom Sensor).
    Wieder Zeit nehmen, und dann kann man rechnen

    Nur wie kann ich das Programmieren?
    Und sie dreht sich doch...
    http://www.muasch.com
    http://robotik.muasch.com

    Definitiv kein Bascom-User

  6. #6
    Erfahrener Benutzer Roboter Experte
    Registriert seit
    29.04.2005
    Ort
    Weilburg
    Beiträge
    676
    Zitat Zitat von Fred G. Martin
    No... the Parallax sonar uses one bidirection control/signal pin
    rather than the 2 separate pins of the SRF04 design.

    Someone will need to rewrite the asm lang driver.
    ( http://groups.yahoo.com/group/handyboard/message/4152 )

    Zitat Zitat von bekoeppel
    Hmm naja, ich habe mir überlegt, dass es doch möglich sein sollte, einen impuls über einen digitalen ausgang vom handyboard-erweiterungsboard auszugeben, der den US veranlasst, zu messen. .... Nur wie kann ich das Programmieren?
    Hast du schon mal eine .icb Datei erstellt ?
    Das habe ich (vor langer Zeit) mal mit der "AS11_IC.BAT" gemacht. Da gab es aber noch eine ander Möglichkeit per UP+DOWN-Load auf einem Server bei ????? ... oder hast du keine ASM-Erfahrung ?


    Code:
    @echo off
    echo *
    echo * Building %1.ICB 
    echo *
    
    REM Two different as11 runs...
    REM zero page increases by 3
    REM main high byte increases by 7
    REM main low byte increases by 11
    
    rem copy to 'C' filename for GCC
    copy %1.asm %1.c
    
    @echo on
    GCC -E -traditional -DZERO_PAGE_START=$10 -DMAIN_START=$8020 -o ascpp1.asm %1.c 
    GCC -E -traditional -DZERO_PAGE_START=$13 -DMAIN_START=$872B -o ascpp2.asm %1.c
    as11 ascpp1.asm
    as11 ascpp2.asm - cre > ascpp.cre
    @echo off
    
    rem concantenate these files together
    copy ascpp1.s19+ascpp2.s19+ascpp.cre %1.icb
    
    rem get rid of temp files
    del ascpp1.asm
    del ascpp1.s19 
    del ascpp2.asm 
    del ascpp2.s19 
    del ascpp.cre 
    del %1.c
    
    rem strip carriage returns from the new icb file
    @echo on
    strip_cr %1.icb
    @echo off
    echo * %1.ICB build complete.
    Da hat das mal jemand in Java gemacht.
    http://ridgesoft.com/robojde/1.4/doc...allaxPing.html
    Prostetnic Vogon Jeltz

    2B | ~2B, That is the Question?
    The Answer is FF!

  7. #7
    Benutzer Stammmitglied
    Registriert seit
    11.05.2005
    Ort
    Trimmis
    Alter
    30
    Beiträge
    47
    Danke Vogon,
    leider habe ich keine Ahnung von Assembler und noch nie eine .icb erstellt. Aber ich bin offen für neues
    Und sie dreht sich doch...
    http://www.muasch.com
    http://robotik.muasch.com

    Definitiv kein Bascom-User

  8. #8
    Erfahrener Benutzer Roboter Experte
    Registriert seit
    29.04.2005
    Ort
    Weilburg
    Beiträge
    676
    Ohhhha, ich werde es mir mal heute Abend ansehen. Sollte eigentlich nicht so schlimm sein. [-o<
    Muss mir mal das Datenblatt durchlesen und den AS11 bzw GCC für den 6811 ans laufen bekommen.

    Hast du einen Schaltplan wie du die Sensoren anschliessen willst ?
    Prostetnic Vogon Jeltz

    2B | ~2B, That is the Question?
    The Answer is FF!

  9. #9
    Benutzer Stammmitglied
    Registriert seit
    11.05.2005
    Ort
    Trimmis
    Alter
    30
    Beiträge
    47
    hi,
    ich denke, so wie im Bild im Anhang. Evtl. müsste noch ein Widerstand zwischen DigitalOut-Signal und DigitalIn-Signal.

    Dig_Out (Digitaler Ausgang) gibt ein Signal aus, das bei Dig_In (Digitaler Eingang) wieder reingeht aber auch den Ping)))-Sensor auslöst.

    Sobald der Sensor wieder ein Signal zurück erhält, gibt er wiederum ein Signal aus, das vom Dig_In registriert wird.

    Aus der Zeitdifferenz zwischen dem ersten und dem zweiten Impuls in Dig_In kann man dann ja auf die Distanz schliessen.

    mfg bekoeppel
    Miniaturansichten angehängter Grafiken Miniaturansichten angehängter Grafiken ping_schaltplan.jpg  
    Und sie dreht sich doch...
    http://www.muasch.com
    http://robotik.muasch.com

    Definitiv kein Bascom-User

  10. #10
    Erfahrener Benutzer Roboter Experte
    Registriert seit
    29.04.2005
    Ort
    Weilburg
    Beiträge
    676
    Ich habe mir das mal angeschaut. Der Ausgang schaltet nach dem Startimpuls zurück auf LOW-Signal (0 Volt). Wenn den das Signal vom Ping komm, kann der sich nicht gegen den Signalausgang durchsetzen.
    Zitat Zitat von Fred G. Martin
    Hmm, clever! Probably... one would have to look at the details of
    the signalling.
    Fred

    > Fred, would a couple signal diodes solve the interface problem?

    > If you are using IC, and have the expansion board installed, try the
    > sonar() library routine. Note that the sonar must be connected to
    > dital
    > out 0 for the start pulse and digital in 7 for the input.
    Probiere es doch mal mit einer Diode, wie ich sie in deinen Plan eingezeichnet habe (besser als mit einem Widerstand).
    Miniaturansichten angehängter Grafiken Miniaturansichten angehängter Grafiken ping_schaltplan_mod.jpg  
    Prostetnic Vogon Jeltz

    2B | ~2B, That is the Question?
    The Answer is FF!

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •