PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Daten auf RP6 Speichern...



.:Robin:.
21.06.2009, 21:28
Ich habe mir ein Programm für den RP6 geschrieben...so dass er frei fährt... Jetzt wollte ich dass er während des fahrens alles Protokolliert und irgendwie abspeichert so dass ich es dann auf den Pc laden kann...
Müsste man dann einen USB Stick anschließen, und wenn ja wie würde dies funktionieren ??

SlyD
22.06.2009, 12:20
Hallo,

Du könntest das RP6 M32 erweiterungsmodul verwenden - dort sind 32KB (=32768 Bytes) EEPROM drauf - das reicht für einfache Datenaufzeichnungen mit geringer Abtastrate und evtl. etwas komprimiert.
Alternativ kannst Du auch selbst I2C EEPROMs oder Flash an den I2C Erweiterungsbus des RP6 Mainboards anschließen.

> USB Stick

USB ist sehr komplex.
Der RP6 hat keinen USB Host - da brauchst Du i.d.R. spezialhardware wie z.B. http://www.vinculum.com/prd_vdip1.html damit das funktioniert.


MfG,
SlyD

.:Robin:.
19.07.2009, 09:26
ok danke...kommt en bissle spät...aber wie speicher ich dass den dann auf dem rp6 an ? und wie lad ich des dann wieder runter auf den pc ?

.:Robin:.
17.11.2009, 12:13
geht das forum jetzt unter oder warum anwortet mir niemand ...

SlyD
17.11.2009, 13:42
Hallo,

s. RP6 M32 Anleitung bzw. den Quellcode der M32 Library - da sind Routinen um Daten im EEPROM abzulegen und auszulesen.
Senden und empfangen geht genauso wie Text senden und empfangen.


Da Text empfangen nicht gaaanz so offensichtlich ist, hier mal eine kleine hilfsfunktion aus dem RP6Selftest Programm die komplette eingabezeilen einlesen kann (hatte ich hier in diversen anderen Threads auch schon gepostet)




char receiveBuffer[UART_RECEIVE_BUFFER_SIZE+1];

uint8_t getInputLine(void)
{
static uint8_t buffer_pos = 0;
if(getBufferLength())
{ receiveBuffer[buffer_pos] = readChar();
if(receiveBuffer[buffer_pos]=='\n')
{
receiveBuffer[buffer_pos]='\0';
buffer_pos = 0;
return 1;
}
else if(buffer_pos >= 32)
{ receiveBuffer[32]='\0'; buffer_pos = 0;
return 2;
}
buffer_pos++;
}
return 0;
}




Daten Senden kannst Du dann in etwa (nur der Ansatz!!!) so machen:



....

while(true) {

....

if(getInputLine())
{
if(strcmp(receiveBuffer,"send_me_the_data")==0)
{
writeString("data:");
for( ... alle Elemente die zu senden sind ... ) {
writeInteger(data[i],DEC);
writeChar(',');
}
writeString("END\n");
.........

}

...



Text senden sollte aber eigentlich auch klar sein (s. RP6 Anleitung und Beispielprogramme - writeString, writeInteger usw.)

Dann einfach "send_me_the_data\n" senden ( \n = end of line )
Und dann kommen die Daten so an: data:1,2,3,4,5,...,END

Beantwortet das Deine Frage?

MfG,
SlyD

.:Robin:.
27.11.2009, 12:00
ne ich meint z.B. das man ne Kamera an den RP6 anschließt, der dann bilder macht und die auf seinem speicher speichert... und man die dann am pc anschauen kann wenn man den rp6 anschließt...... und ich glaug nich das man nach dem verfahren die bilder auslesen kann...

GRuß Robin

SlyD
27.11.2009, 14:20
Ja das musst Du auch dabeischreiben.
Protokollieren heisst für mich nicht unbedingt Fotos schießen ;)
Du stellst Dir jetzt sicher große Farbbilder vor nehme ich an?

Das geht zwar rudimentär mit dem Erweiterungsmodul, aber der EEPROM Speicher auf dem Erweiterungsmodul ist nicht für Bilddaten gedacht - die 32KByte reichen vielleicht für 5 JPEG Bilder bei sehr niedriger Auflösung und hoher Kompressionsrate.
Müsstest also schon eine SD Karte über SPI anschließen.

Als Kamera brauchst Du ein spezielles Kameramodul das bereits komprimierte Bilddaten liefern kann z.B.
http://avr.auctionant.de/avr-ip-webcam/index.html

Aber natürlich alles nur Standbilder.
Problem ist das solche Kameras alle ein Baudratenquarz beim AVR brauchen um die Datenrate genau zu treffen.... also musst Du Dir hier selbst was basteln.

Möglich ist das schon, aber für einen Anfänger alles andere als einfach.

MfG,
SlyD

.:Robin:.
28.11.2009, 17:21
nene schau was ich schreib ich hab gesagt dass des mit der kamera en beispiel is... ich will nur wissen wie ich auf dem speicher vom rp6 etwas abspeier und sie dann vom pc auslesen kann wie z.b. jpg, txt, ... oder sonstige dateien....
eigendlich hatte ich vor dass der roboter frei fährt und alles mitprotokolliert, und das dann in eine txt datei schreibt, die ich wieder auf den pc laden kann.....

Kurz:wie speicher und lese ich DATEIEN vom RP6 aus..und zwar so dass es dateien sind

Gruß Robin

radbruch
28.11.2009, 17:51
wie speicher und lese ich DATEIEN vom RP6 aus..und zwar so dass es dateien sindGar nicht. Der Mega32 des RP6 kennt kein Dateisystem und keine Dateien. Er hat ja nicht mal ein Betriebssystem. Man kann zwar einfache Dateiformate wie .txt oder .bmp nachahmen, aber trotzdem scheitert alles an den zwei KB Speicher des Kontrollers. Eine echte (aber aufwändige) Lösung wäre z.b. eine SD-Speicherkarte.

Gruß

mic

SlyD
28.11.2009, 18:40
> aber trotzdem scheitert alles an den zwei KB Speicher des Kontrollers.

Für ein Ereignisprotokoll braucht es so oder so externen Speicher. Da hilft das interne SRAM natürlich nicht viel.

@Robin:
Schau Dir mal die zahlreichen SD Karten Projekte für AVRs an. Dann sollte vielleicht klarer werden was hier gemeint ist.
Aber wie gesagt - recht kompliziert.

Einfacher geht es für das was Du vor hast (mit einem EEPROM als Speicher) so:
Man könnte z.B. das XMODEM Protokoll (-->google xmodem avr) nachbilden und dann die Protokolldaten mit HTerm oder Hyperterminal empfangen - womit man es dann direkt in eine txt Datei schreiben kann.

Oder besser selbst eine kleine PC Software schreiben die die Daten empfängt und eine Datei erzeugt. Dann reichen auch noch einfachere Protokolle wie das was ich weiter oben schon angedeutet habe: Der PC sendet nur ein "schick mir alle daten" an den Mikrocontroller, dieser schickt alle Daten an den PC und fertig :)


D.h. die PC Software muss sich darum kümmern die Daten zu empfangen und in eine Datei (oder mehrere) zu schreiben oder irgendwas anderes damit zu machen.
Das geht genau so wie ich es oben beschrieben habe. Musst nur das senden leicht anpassen so das es zu Deinen Daten passt.
(Text, einzelne Bytes, Zahlenwerte, was auch immer...)

Dem EEPROM ist es übrigens (genau wie der seriellen Schnittstelle) völlig egal wie die Daten darin abgespeichert werden.
Du kannst z.B. im einfachsten Fall in den ersten zwei Bytes abspeichern wie lang das Protokoll ist und danach einfach bei jedem Ereignis eine neue Meldung abspeichern und den Zähler für die Protokolllänge inkrementieren (=auslesen, hochzählen und wieder abspeichern).

Um Speicherplatz zu sparen würde ich nicht die Ereignisse in Form von Text abspeichern, sondern z.B. jeder Eintrag 3 Bytes lang:
<Ereignistyp> <Daten> <Daten>
Wenn also z.B. ein Ereignis "Kollision, Bumper Links gedrückt!" eintritt dann würden man abspeichern:
401
4 = Bumper
0 = rechts ist nicht gedrückt
1 = links gedrückt

Entspechend noch andere Codes für andere Ereignisse definieren.
Nur ein Beispiel - kann man natürlich noch viel eleganter lösen als das.

Die Daten können dann entweder direkt vom AVR dekodiert werden
ala if(daten[0]==4) writeString("Kollision, Bumper ") usw. oder von der PC Software.

Hab jetzt keine Zeit das noch weiter auszuführen ich denke die grundsätzliche Idee sollte klar sein.

MfG,
SlyD

.:Robin:.
29.11.2009, 12:59
jop ok danke, des war genau das was ich wissen wollte... jetzt werd ich wohl wieder anfangen c++ programme zu schreiben....

GRuß Robin

julianf123
03.12.2009, 14:46
Hat jemand schon mal eine Speicherkarte an einen Roboter angeschlossen (zb. RP6) ?