PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : suche Beispielprogramme für den RP6



enni
30.12.2008, 15:09
Hallo....

zu Weihnachten habe ich einen neuen RP6 geschenkt bekommen.
(ich hatte ihn mir so sehr gewünscht)

Da ich von der C-Programierung keine Ahnung habe (bin erst 10),
suche ich fertige Beispielprogramme (außer dem Standard von der
Arexx-Seite).

Kann mir hier jemand helfen ? Vieleicht mit eigenen Programmen oder
mit Links zu Seiten wo man Programme kostenlos herunterladen kann.

Vielen Dank schon einmal vorab!!!

Gruß Enni

Dirk
30.12.2008, 15:52
Hallo enni,

Glückwunsch zum neuen RP6!

Ich weiß keine Seite, wo es nur so von fertigen Programmen für den RP6 wimmelt.
Wenn du dir dieses RP6-Unterforum 'mal komplett ansiehst (ok, dauert ein bißchen, aber die Sylvesternacht ist lang ...), findest du da drin jede Menge Programme bzw. Codeschnipsel, die man gut verwenden kann.

Auch wenn C erstmal nicht so selbsterklärend ist, würde ich aber doch durchstarten: Sieh dir die Demoprogramme an und ändere sie, um zu sehen, was man alles machen kann. Geh die Anleitung ganz durch und blätter auch 'mal durch die RP6 Library (RP6RobotBase.h, RP6RobotBaseLib.h, RP6RobotBaseLib.c), wenn du einen Funktionsaufruf in den Demos nicht verstehst.
Auch wenn's mühsam ist: Es bringt besseren Erfolg, als fertige Programme zu sammeln.

Wenn du dann Fragen hast, gibt es ja das Forum hier!

Gruß Dirk

enni
30.12.2008, 18:34
Hallo Dirk,

schönen Dank für dass Du mir Mut machst.

Aber ich habe dabei 2 Probleme:
1) meine Zeit, die ich im Internet surfen darf ist begrenzt !

und

2) von Programmierung habe ich keinen blassen Schimmer !
z.B. wofür benötige ich die RP6LIB ?
was ist eine *.pnproj Datei
*.pnps Datei
*.c Datei
*.hex Datei > wobei das die Datei ist, die
in den RP6 gelanden wird?!

Einfach im Programmcode was ändern ohne zu wissen was man tut find
ich nicht so gut. Vielleicht git es hier ja auch gute Lernhilfen im Netz.

Nartürlich werde ich mich später mit der Programierung beschäftigen,
aber im Moment wollte ich einfach nur Programmbeispiele austesten.

Vielleicht kannst Du mir ja, oder jemand drittes ein Beispielprogramm
zusenden.

Gruß Enni

radbruch
30.12.2008, 20:24
Hallo

Auch von mir herzlichen Glückwunsch zum RP6 :)

Mit allgemeinen RP6-Programmen kann ich leider nicht wirklich dienen weil ich meist irgendwas spezielles angebaut und gesteuert habe. Trotzdem hier mal ein paar meiner Versuche:

Die Statusleds blinken lassen:

#include "RP6RobotBaseLib.h"

#define blinkLED6 statusLEDs.LED6=(getStopwatch1() & (1<<6)) && 1

uint8_t blink3;

int main(void)
{
initRobotBase();
setLEDs(0);

//Zeitgeber für das Blinken starten
startStopwatch1();

while(true)
{
//LED1 blinkt langsam
statusLEDs.LED1 ^=(getStopwatch1() & (1<<9));

//LED2 blinkt schnell
statusLEDs.LED2=(getStopwatch1() & (1<<7)) && 1;

//LED3 blinkt variabel (0 bedeutet aus)
blink3=8;
statusLEDs.LED3=(getStopwatch1() & (1<<blink3)) && 1;

//LED4 flasht
statusLEDs.LED4=!(getStopwatch1() & (0b101<<6)) && 1;

//LED5 flackert
statusLEDs.LED5=(getStopwatch1() & (0b1001<<5)) && 1;

//LED6 blinkt mit #define
blinkLED6;

//LED-Status aktuallisieren
updateStatusLEDs();

//das funktioniert natürlich auch mit der pwrLED
if (!(getStopwatch1() & (9<<8)) && 1) powerON(); else powerOFF();
}
return 0;
}

Sanft beschleunigen und abbremsen:
https://www.roboternetz.de/phpBB2/viewtopic.php?p=299733#299733

Linienverfolgung mit eingebauten Lichtsensoren:
https://www.roboternetz.de/phpBB2/viewtopic.php?p=354402#354402

Erschreckend wenig was ich mit dem orginalen RP6 auf die Beine gestellt habe.
Mit kleinen oder größeren Erweiterungen war ich fleißiger:
https://www.roboternetz.de/phpBB2/viewtopic.php?t=35643
https://www.roboternetz.de/phpBB2/viewtopic.php?t=41805
https://www.roboternetz.de/phpBB2/zeigebeitrag.php?p=362473#362473
Nur mal ein paar Beispiele was man alles anstellen kann :)

Gruß

mic

Dirk
30.12.2008, 22:34
z.B. wofür benötige ich die RP6LIB ?
was ist eine *.pnproj Datei
*.pnps Datei
*.c Datei
*.hex Datei
Die RP6 Library sind vorgefertigte Funktionen und Programmteile, mit denen man die Funktionen des RP6 gut nutzen kann (müßte man sonst alles selbst programmieren ...).
Der PN2 benutzt .pnproj Dateien zum Festlegen von "Projekten". Ein Projekt besteht aus den Dateien, die links im Fenster des PN2 erscheinen, wenn man z.B. ein Demoprogramm öffnet.
Du kannst auch deine neuen Programme als Projekte öffnen und z.B. die eigentliche Programmdatei und weitere Library-Dateien als Projekt immer zusammen öffnen.
Die PN2-Dateien kannst du auch mit einem Texteditor öffnen und verändern. Eigentlich erledigt das aber PN2 automatisch.
Die .c Dateien sind die eigentlichen C-Programme oder Libraries.
Die .hex Dateien entstehen, wenn man .c Dateien kompiliert, d.h. im PN2 auf make all klickt. Die .hex werden dann mit dem RP6Loader in den RP6 befördert.

Einfach im Programmcode was ändern ohne zu wissen was man tut find ich nicht so gut.
Doch, learning by doing ist gut und gibt sofort Erfolgserlebnisse. Ich lasse die Demos auch bei mir unverändert und kopiere ganze Beispiele und ändere die im neuen Verzeichnis. Wenn du das Mini-Tutorial in der RP6 Anleitung durcharbeitest und dann die Funktionsbeschreibung der Library, kannst du bald ein paar kleinere Änderungen oder eigene Ideen umsetzen.
Ein C-Buch kannst du dann immer noch kaufen.

Gruß Dirk

enni
01.01.2009, 19:22
Hallo Mic,

vielen Dank für Deine Antwort.

Ich habe versucht den Code für die "Statusleds blinken lassen" umzusetzten;

Wie bin ich vorgegangen:
- habe im Beispielverzeichnis einen neuen Ordner angelegt "Ex_LED_status";
- habe die BAT-Dateien "make_all.bat + make_clean.bat" in den Ordner kopiert
- habe eine neue makefile-Datei erstellte mit den Einträge
"TARGET = Ex_LED_status
RP6_LIB_PATH=../../RP6Lib
RP6_LIB_PATH_OTHERS= $(RP6_LIB_PATH)/RP6base $(RP6_LIB_PATH)/RP6common
SRC += $(RP6_LIB_PATH)/RP6base/RP6RobotBaseLib.c
SRC += $(RP6_LIB_PATH)/RP6common/RP6uart.c
SRC += $(RP6_LIB_PATH)/RP6common/RP6I2CslaveTWI.c"
- und zuletzt habe ich eine neue c-Datei "Ex_LED_status.c" mit dem Beispiel-Code.

Diese Datei habe ich im Notepad geladen und habe mit den Tools "MAKE ALL" aus geführt; hierbei erhielt ich folgende Fehlermeldung:
"> "C:\WinAVR-20070525\CD\RP6Examples\RP6BASE_EXAMPLES\Ex_LED_st atus\\make_all.bat"

C:\WinAVR-20070525\CD\RP6Examples\RP6BASE_EXAMPLES\Ex_LED_st atus>set LANG=C

C:\WinAVR-20070525\CD\RP6Examples\RP6BASE_EXAMPLES\Ex_LED_st atus>make all
make: *** No rule to make target `all'. Stop.

> Process Exit Code: 2
> Time Taken: 00:00"

Was habe ich falsch gemacht ? (WinAVR-20070525 Version)

Gruß Enni :arrow: :arrow: :arrow: :arrow: :arrow:

jfjoseph
01.01.2009, 22:12
Moin enni,
hast du ein Projekt erstellt? Und dann den Programmcode reinkopiert? Ich benenne das Projekt und die Source-file (xyz.c) immer gleich.
Dann solltest du dir eine make-file aus den Beispielen in dein erstelltes Verzeichnis kopieren. In der makefile editierst du NUR TARGET = xyz mit dem namen aus deinem Projekt, also TARGET = Ex_LED_status.
Ich verwende übrigens die Beispiele bzw make-files von der Arrex-Seite, Version 20080915.
Viel Spaß beim testen! Gruß

enni
02.01.2009, 16:15
Hallo Joseph,

viel Dank für Deine Hilfe.
Habe Deinen Rat befolgt und es hat sofort geklappt !!! O:)

Gruß Enni

enni
02.01.2009, 16:24
Hallo Dirk,

auch Dir vielen Dank für Deine Meinung und Deine Tipps.
Habe mich einwenig an das Thema herangetraut.


Weiß Du wie man zwei Beispielprogramme in einem gemeinsamen
Programm zusammen fassen kann ?

Gruß Enni

Panzerfan
02.01.2009, 17:10
Hi enni

Ich hab den RP6 auch zu Weihnachten bekommen \:D/ . Also mal zu deiner Frage :*Weiß Du wie man zwei Beispielprogramme in einem gemeinsamen
Programm zusammen fassen kann ?*
kopier einfach den Programmcode von dem anderen Programm den du haben willst und erstelle in dem neuen Programm eine Funktion(void DeineFunktion(void), muss man manchmal auch nicht machen wenn man die Funktion schon aus dem anderem Programm rauskopiert)in der du den Programmcode Teil einfügst. Die Funktion rufst du dann je nachdem ob sie die ganze Zeit ausgeführt werden soll oder nur einmal, entweder in die main-Endllosschleife ein oder einfach irgendwo in main nach der initRobotBase() Funktion.
Hier mal ein Programm wo der RP6 im Kreis fährt und ein Lauflicht veranstaltet:


#include "RP6RobotBaseLib.h"

void bumpersStateChanged(void) //Falls der Roboter wo dagegenfährt
{
if(bumper_left || bumper_right)
{
moveAtSpeed(0,0); // stop moving!
setLEDs(0b010000);
startStopwatch1();
}
}

void blink(void)
{
if(getStopwatch1() > 500) // 500ms
{
statusLEDs.LED2 = !statusLEDs.LED2;
statusLEDs.LED5 = !statusLEDs.LED5;
updateStatusLEDs();
setStopwatch1(0);
}
}

/************************************************** ***************************/
// Main:

int main(void)
{
initRobotBase();
setLEDs(0b111111);
mSleep(1500);
setLEDs(0b100001);


BUMPERS_setStateChangedHandler(bumpersStateChanged );//Der Bumper Eventhandler


powerON();

changeDirection(FWD);
uint8_t runningLight; // Die Variable Lauflicht



moveAtSpeed(80,10);

while(true)
{
setLEDs(runningLight); // hier startet die Lauflicht Funktion aus RP6Base_LEDs.c

runningLight <<= 1;
if(runningLight > 32)
runningLight = 1;


mSleep(100); // und hier endet sie.

blink();// Das ist die Funktion das der Roboter stoppt wenn er wo dagegenfährt



task_RP6System();//
}
return 0;
}


mfg Panzerfan

P.S:
Das Programm ist nicht getestet(weil meine Akkus leer sind und sie grad aufladen) und auch nicht wirklich durchdacht also verzeiht mir wenn was nicht stimmt.

Dirk
02.01.2009, 18:28
Hallo enni,

Weiß Du wie man zwei Beispielprogramme in einem gemeinsamen
Programm zusammen fassen kann ?
Panzerfan hat eigentlich schon alles gesagt.
Wenn du eigene Programme immer so schreibst, dass sie in einer einzigen Funktion (task_MyNoX() siehe unten!) in der Hauptschleife laufen, dann kannst du ohne Mühe mehrere Programme zusammenfassen, indem deine Tasks in die Hauptschleife eingefügt werden und alle nötigen Funktionen oben weiter in der .c-Datei landen. Natürlich geht das so einfach nur, wenn die einzelnen Tasks jeweils nur 1 Aufgabe haben und sich nicht gegenseitig beeinflussen.
Allerdings gibt es für Tasks sozusagen "Regeln". Sie müssen möglichst schnell ablaufen (also keine Sleep-Pausen oder Dauertextausgaben ...) und ihre Arbeit (wenn sie länger dauert) in kleinere Häppchen aufteilen, die erledigt werden, sobald die Task in der Hauptschleife wieder dran ist.

int main(void)
{
initRobotBase(); // Always call this first! The Processor will not work
// correctly otherwise.

// Hier die Hauptschleife:
while(true)
{
task_MyNo1();
task_MyNo2();
task_MyNo3();
task_RP6System();
}
return 0;
}


Gruß Dirk