PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Nibobee Ultraschall - wie anschließen ?



xmaniix
03.06.2012, 18:40
Hallo zusammen,

nachdem ich seit kurzem von der Robotik begeistert bin, jedoch noch das Wissen fehlt eine kurz Frage an euch. Ich hab mir den Nibobee gekauft, fertig zusammengebaut und auch schon gecoded.
Mit der Biene hab ich mir einen SRF04 Ultraschallsensor und einen kleinen Servo mitbestellt, sowie die Erweiterungsplatine mit Remote-Modul.

Mein Problem ist jetzt, dass ich Null Plan habe, wie ich diesen Servo mit dem US anschließen muss/kann, das der funktioniert. Kann mir da bitte von euch einer weiterhelfen ?

Bzw wenn ihr das wisst, wodurch weiß man das ? :) Wieviele Erweiterungen kann man der Biene hinzufügen ? Kann ich das Remote-System auch noch dazubauen oder reicht dazu der Platz nicht ?


Ihr seht, das ich noch blutiger Anfänger bin ;)

Danke im Voraus für eure Bemühungen !!!

Grüße Manii

xmaniix
04.06.2012, 17:24
Hallo nochmals,

habe jetzt noch eine kurze Beschreibung der Erweiterungports der Biene & des SRF05 (ich berichtige-dachte ich habe den 04er).

22484

Betriebsmode 1 - SRF04 Kompatibler Mode - Getrennter Auslöse- und Ergebnisport
22486

Mode 2 – Neuer Modi mit nur einem Port für Auslösung und Messergebnis
22485

Nur hilft mir das leider auch noch nicht viel :) Kann mir das einer näher erklären bitte ?

Grüße Manii

radbruch
04.06.2012, 18:38
Hallo

Gleich vorweg: Ich besitze das SRF05 nicht und bin mit der bee arg aus der Übung. Deshalb gehe ich das eher theoretisch und ohne die Library der bee an.

Basis ist der Schaltplan der bee und das Datenblatt des SRF:
http://download.nicai-systems.com/nibo/nibobee_schematic_1_14.pdf
http://www.robotikhardware.de/download/srf05doku.pdf

Ich wähle den SRF04-Modus, weil mir der Einstieg mit zwei Pins einfacher erscheint. An der bee verwende ich X4 mit den Pins PC0 und PC1 (obwohl das die I2C-Pins sind).

Der Ablauf der Messung scheint einfach: Startimpuls ausgeben und dann messen, wie lange das SRF05 seinen Signalausgang auf high setzt. Aber wie gibt man das Ergebniss aus? Serienmäßig besitzt sie nur 4 LEDs. (Das ist wohl der Schwachpunkt der bee: Sie kann nicht komunizieren.) Wenn man die zur binären Ausgabe nutzt kann man Werte zwischen 0 und 15 anzeigen.

Mein Ansatz: Ich messe in 10cm-Schritten. Da die Schallgeschwindigkeit in Luft ca. 344m pro Sekunde beträgt, legt das US-Signal einen Meter in 1/344 Sekunden zurück. Das sind 2,9 Millisekunden. Für 10cm sind es entsprechend 290µs. Ich hoffe, ich habe mich nicht verrechnet....

Angezeigt wird nach der Messung die gezählten 10cm-Schritte, der Abstand ist aber nur halb so groß wie gemessen, weil das US-Signal ja den Weg doppelt zurücklegt. Auch hier hoffe ich, dass ich richtig liege...

Und nun, tata, das Programm:

// SRF05 Ansteuerung mit der bee mic 4.6.12

// Anschluß an X4: Vcc, GND, PC0=Start, PC1=Messwert (SRF04-Modus)
// Datenblatt SRF05: http://www.robotikhardware.de/download/srf05doku.pdf
// https://www.roboternetz.de/community/threads/58058-Nibobee-Ultraschall-wie-anschlie%C3%9Fen

// Schallgeschwindigkeit: 344m/s bei 21° (1s/344m oder 2,9ms pro Meter oder 290µs für 0,1m)
// Quelle: http://134.176.128.63/schall.html

#include <avr/io.h>
#include <util/delay.h>

uint16_t messwert, timeout=0;

int main(void)
{
DDRB = 0b0001111; // Die Pins der Leds sind Ausgang
PORTB &= 0b11110000; // 0V ausgeben. Die Leds sind aus
DDRC = 0b00000001; // Im Datenrichtungsregister PC0 als Ausgang definieren (Bit 2^0)
PORTC &= ~(1<<PC0);// 0V ausgeben an PC0

PORTB |= 0x0f; // alle Leds an
_delay_ms(1000); // eine Sekunde warten
PORTC &= 0xf0; // alle Leds wieder aus

while(1)
{
PORTC |= 1; // Startimpuls ausgeben
_delay_us(20); // der Impuls muss mindestens 10µs dauern
PORTC &= 0xfe; // Startimpuls fertig

messwert=0;
while(!(PINC & 0b00000010) && --timeout) _delay_us(1); // Echo nach 40*290µs?
if(timeout>0)
{
while(PINC & 2)
{
messwert++; // Messwert wird in 10cm-Schritten erhöht
_delay_us(290); // 10cm warten
}
if(messwert<16) // bis 75cm können wir so mit 4 Bit messen
{
PORTC &= 0xf0; // alle Leds aus
PORTC |= messwert; // Messwert dual anzeigen
}
}
}
return 0;
}(selbstverständlich ungetestet)

Keine Ahnung, ob das halbwegs funktioniert.

Gruß

mic


[Edit]
Die Umrechnung der Entfernung wird so nicht stimmen. 1cm bis 400cm sind 100µs bis 25ms. Timeout wird zu knapp sein und wird nicht neu auf null gesetzt.

xmaniix
04.06.2012, 19:19
hallo mic,

danke für deine ausführliche antwort !!

also so versteh ich das eigentlich was zu tun ist, nur der Sinn/Idee dahinter is mir noch schleierhaft..

warum schließt du das an x4 an & nicht an einem der anderen ? ist es nur da möglich ? wenn ja an was merkt man das ?

wo soll ich den servo für die Drehung des US anschließen ?

woher weiß ich ob meine erweiterung, seien es irgendwelche weiteren abstandssensoren an einen digitalen oder analogen port müssen ?

ich weiß, sind einige fragen :) hab aber schon einige zeit mit google verbracht, jedoch zum 'wo schließt man was am besten an' nicht viel gefunden!

Danke & Grüße Manii

radbruch
04.06.2012, 19:57
Hallo

Aller Anfang ist schwer.

X4 habe ich gewählt, weil ich mir die C-Pins gut merken kann und weil sie Bit0 und Bit1 am Port belegen. Prinzipiel kannst du mit allen Pins digitale (high/low) Signale auswerten. Da aber nur ein paar Pins auch analoge Signale einlesen können sind diese Pins "wertvoller" und man versucht, diese für spätere Erweiterungen frei zu halten.

Die Signale deines SRF05 sind eindeutig digital:
https://www.roboternetz.de/community/attachment.php?attachmentid=22487&stc=1&d=1338835860

Hier noch das überarbeitete Programm:

// SRF05 Ansteuerung mit der bee (zweiter Anlauf) mic 4.6.12

// Anschluß an X4: Vcc, GND, PC0=Start, PC1=Messwert (SRF04-Modus)
// Datenblatt SRF05: http://www.robotikhardware.de/download/srf05doku.pdf
// https://www.roboternetz.de/community/threads/58058-Nibobee-Ultraschall-wie-anschlie%C3%9Fen

#include <avr/io.h>
#include <util/delay.h>

uint8_t messwert, timeout;

int main(void)
{
DDRB = 0b0001111; // Die Pins der Leds sind Ausgang
PORTB &= 0b11110000; // 0V ausgeben. Die Leds sind aus
DDRC = 0b00000001; // Im Datenrichtungsregister PC0 als Ausgang definieren (Bit 2^0)
PORTC &= ~(1<<PC0);// 0V ausgeben an PC0

PORTB |= 0x0f; // alle Leds an
_delay_ms(1000); // eine Sekunde warten
PORTC &= 0xf0; // alle Leds wieder aus

while(1)
{
messwert=0;
timeout=0;
PORTC |= 1; // Startimpuls ausgeben
_delay_us(20); // der Impuls muss mindestens 10µs dauern
PORTC &= 0xfe; // Startimpuls fertig

while(!(PINC & 0b00000010) && --timeout) _delay_ms(4); // timeout 1 Sekunde
if(timeout>0)
{
while((PINC & 2) && (++messwert<16)) // Überlauf bei 16
{
_delay_us(1666); // 25ms/16-Schritte
}

if(messwert<16) // wir können nur 4 Bit anzeigen
{
PORTC &= 0xf0; // alle Leds aus
PORTC |= messwert; // Messwert dual anzeigen
}
}
}
return 0;
}

Auf das Servo mag ich im Moment noch nicht eingehen, aber du kannst dich schon mal einlesen:
http://www.google.de/search?q=servosignal

Gruß

mic

xmaniix
04.06.2012, 21:08
hey,

ok jetzt kann ich mir das schon bisschen besser vorstellen :)

das mit dem programmcode versteh ich von der logik her auch. Nur weiß ich noch nicht, wie ich jetzt zum erstmaligen testen den US anschliessen soll, so dass ich ihn dann aber wieder abnehmen kann für die eigentliche Erweiterung mit Servo.

gibt es da irgendwelche steckverbindungen ?
welche kabel nehme ich, um die pins mit dem US zu verbinden ? Hab ein Bild (glaube im Datenblatt) mit so nem rot-schwarzen kabel gesehn..
brauch ich da noch irgendwelche elemente(widerstand, kondensator) zwischen den pins und US ?

Hab aus interesse mal nachgeschaut was eig I2C ist und gelesen,. dass man damit ICs miteinander verbinden kann, heißt das, ich kann zB noch nen atmega16 dranhängen und dessen ports für erweiterungen benützen ?(nur mal interessehalber ;) )

was bedeutet 'mir die C-Pins besser merken kann', was sind C pins ?

danke danke !! :)

Grüße !

radbruch
04.06.2012, 22:03
Hallo

Zum Anschliessen würde sich die Kombination aus Stift- und Buchsenleisten und ein Flachbandkabel anbieten:
http://www.conrad.de/ce/de/product/736500/
http://www.conrad.de/ce/de/product/736765/
http://www.conrad.de/ce/de/product/601922/
(gibt's natürlich in allen Variationen bei allen Versendern)

Das SRF kannst du direkt mit dem X4 verbinden: GND auf GND, VCC auf 5V, PC0 auf "Start Signal Eingang" und PC1 auf "Messergebniss Ausgabe"

Damit ich nicht dauernd zwischen Schaltplan und Programmeditor zappen muss wählte ich Pins vom Port C, die C-Pins eben. Der Mega16 der bee hat übrigends vier Ports: A, B, C und D. Viele Pins haben spezielle Funktionen:
http://www.atmel.com/Images/doc8154.pdf

Über I2C können nicht nur Kontroller miteinander kommunizieren. Viele ICs kennen diese Schnittstelle:
http://de.wikipedia.org/wiki/I%C2%B2C

Gruß

mic

xmaniix
05.06.2012, 08:52
hey mic,

super danke ! bei dem kabel brauch ich dann nur (3 sinds glaub ich) adern runternehmen und diese werden beim US direkt angelötet und auf der anderen seite der kabel dann die buchse. bei der bee die stecker und dann kann ich das schön an und abstecken, je nachdem obs gebraucht wird oder nicht... richtiger Weg ? :)

Grüße Manii