Hallo.
Ich hatte mir vorgenommen den Liniensensor (natürlich am Amtelboard) in Betrieb zu nehmen und damit zu experimentieren. Ich habe mich anscheinden überschätzt. Was auch immer ich tue, ich verstehe nicht einmal ansatzweise wie ich den Liniensensor ansteuern oder benutzen kann. Das mag daran liegen, das meine Erfahrung mit solchen Geräten noch nicht sehr stark ausgebildet ist...
Meist kann ich jedoch aus einem Beispielprogramm heraus erschließen WIE etwas funktioniert, WARUM ich etwas machen muss, und WAS ich machen muss, damit der Sensor für mich "arbeitet".
Ich würde mich freuen wenn sie mir ein kleines Beispielprogramm zum Liniensensor zukommen lassen könnten und vielleicht einige nützliche Ratschläge für mich haben...
Ich bedanke mich schon einmal im Voraus!
Paul
Hallo, Paul,
der Liniensensor wird über den I²C-Bus angesprochen. seine Adresse ist die 4. Der Bustakt sollte 100 kHz nicht überschreiten.
Sende ich an den Sensor eine "1" wird er ständig die 9 Refelxionswerte der Reflexsensoren messen. Er befindet sich im Modus 1. Danach kann ich per Lesebefehl die 9 Werte abfragen. Das sind der Reihe nach die Messwerte für Sensor 0, Sensor 1 ... Sensor 8. Bei jeder Abfrage erhalte ich immer die aktuellsten Werte.
Sende ich eine "2" geht der Sensor in den Automatikmodus. Er misst ständig die Werte und gibt auf Anfrage drei Werte zurück. Wert 1 Position des Linienschwerpunktes, Wert 2 die Linienbreite und Wert 3 die Angabe ob sich die Linie verzweigt.
Sende ich eine "3" wird der Kalibriermodus aktiviert. Eine genaue Beschreibung findest Du in der Sensordoku.
Sende ich eine "8" wird die Messung gestoppt.
Manfred
Hallo,
ich habe da mal ein kleines Programm, aber der Sensor macht nicht was er soll!
#include "robolaus.h"
int main(void)
{
i2cInit;
lcdInit;
rprintfInit(lcdDataWrite);
int werte[3];
int linie_adresse = 4; //Adresse ist IMMER 4
int linie_messen = 2;
/*
1 = Modus 1(Messung Reflexwerte)
2 = Modus 2(Messung der Linie)
8 = Kallibrieren = Messung stoppen
*/
werte[0] = linie_messen;
i2cMasterSend(linie_adresse, 1, &werte[0]);
i2cMasterReceive(linie_adresse, 3, &werte[0]);
rprintf("%d", werte);
return 0;
}
Was mache ich da falsch?
Paul
Hallo, Paul,
nach kurzer Durchsicht Deines Programms bin ich zu dem Schluss gekommen dass es so nicht funktionieren kann. Hier ein paar Hinweise dazu:
Der Vereinbarungsteil ist nachvollziehbar und in Ordnung.
Im ersten Sendebefehl weist Du den Sensor an die Linie zu messen. Hier liegt ein Fehler vor. Ehe Du den Sensor zur Linienmessung veranlassen kannst musst Du den Sensor erst kalibrieren. D.h., Du musst den Sensor über dem Boden positionieren und dann eine "3" senden. Danach ist der Sensor über der Linie zu positionieren und erneut eine "3" zu senden. Damit ist der Sensor auf die gegebenen Werte kalibriert und kann jetzt nach dem Empfang einer "2" die Linienerfassung durchführen.
Mit Deinem Lesebefehl forderst Du drei Werte vom Sensor ab. Das ist in Ordnung. Nach erfolgter Kalibrierung und Auslösen der Linienmessung gibt der Sensor die drei gewünschten Werte zurück.
Diese kannst Du Dir anzeigen lassen. Dabei musst Du natürlich dem rprintf-Befehl sagen welchen der drei Werte Du sehen möchtest. z.B. rprintf("%d",werte[0]) .
Wenn Du die Struktur Deines Programms belässt läuft es einmal durch. Es scheint mir sinnvoll den Lese- und Anzeige-Befehl in eine Schleife zu stellen, so kannst Du Änderungen an der Linie am Display verfolgen.
Manfred
Hallo, Manfred,
ich bedanke mich sehr für Deine Hilfe und werde jetzt mit
Hilfe Deiner Hinweise weitere Versuche unternehmen.
Paul
Hallo, Manfred,
ich bedanke mich sehr für Deine Hilfe und werde jetzt mit
Hilfe Deiner Hinweise weitere Versuche unternehmen.
Paul