PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Parallax-Ultraschall-Sensor am Handyboard



bekoeppel
13.12.2005, 09:59
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

Vogon
13.12.2005, 23:53
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/contrib/doug.rinckes/long_range_sonar.c
http://handyboard.com/software/sonar.html

bekoeppel
11.01.2006, 21:40
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 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

Vogon
12.01.2006, 13:28
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. :-s
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.

bekoeppel
12.01.2006, 15:28
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?

Vogon
13.01.2006, 00:11
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 )


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 ?




@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. :^o
http://ridgesoft.com/robojde/1.4/docs/apidoc/com/ridgesoft/robotics/sensors/ParallaxPing.html

bekoeppel
13.01.2006, 11:11
Danke Vogon,
leider habe ich keine Ahnung von Assembler und noch nie eine .icb erstellt. Aber ich bin offen für neues ;-)

Vogon
13.01.2006, 14:38
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. :MistPC

Hast du einen Schaltplan wie du die Sensoren anschliessen willst ?

bekoeppel
13.01.2006, 15:14
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

Vogon
15.01.2006, 22:19
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.

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).