PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Programmier Tutorials für den RP6



Mario94
22.12.2010, 14:34
Hey Leute,

Endlich hab ich meinen RP6 bekommen, allerdings habe ich keine Kenntnisse über das Programmieren. Und die Anleitung + Beispielprogramme helfen mir auch nicht so ganz weiter.

Gibt es ein Tutorial oder einige Beispielprogramme auf Deutsch ?

SlyD
22.12.2010, 14:58
Hallo,

allgemein zur C Programmierung (das wird ja das eigentliche Problem sein) sind einige Tutorials in der Anleitung angegeben!
Da steht auch dabei das die Einführung in die C Programmierung nur ein Crashkurs und kein komplettes Buch ist :)

Übrigens - es kommt höchst selten vor das jemand (ohne Vorkenntnisse) die C Programmierung innherhalb von einem Tag durchschaut - wenn man kein Genie ist geht das nicht von heute auf morgen da muss Du Dir schon etwas mehr Zeit nehmen.


MfG,
SlyD

Mario94
22.12.2010, 15:02
Ja aber wenn ich mir diese normalen Tutorials ansehe verstehe ich zwar das Programmieren ( mehr oder weniger :D ) , nur verstehe ich nicht wie ich das auf meinen RP6 übertragen soll.
Da geht es ja darum das er z.B. gerade aus fährt.
Gibt es eine Art Befehlsliste ? Wo z.B steht MotorSpeed = Motorgeschwindigkeit ( also keine übersetzung, sondern eine erklärung der Funktion )

SlyD
22.12.2010, 15:28
Ab Seite 97 werden die Motorfunktionen erläutert.
Mit ein paar simplen Beispielen.


Erweiterte Beispiele gibts dann in den Beispielprogrammen.
Die solltest Du in genau der Reihenfolge wie angegeben durchgehen. Da wird nach und nach alles eingeführt - aber gut desch isch allesch auf Englisch kommentiert - so wie es beim Softwareentwickeln üblich ist :)
(wäre blöd zwei Versionen zu pflegen)


Übrigens in der Library "RP6RobotBaseLib.c" stehen einige zustätzliche Kommentare. Eine "Befehlsliste" wäre dann wohl die zugehörige .h Header Datei.

Ich meine irgendwann hier im Forum hätte auch mal jemand was gepostet - musst Du evtl. mal die Suchfunktion verwenden.

MfG,
SlyD

Fabian E.
22.12.2010, 15:29
Naja, du kannst dir dazu die Beispielprogramme ansehen, da ist eigentlich alles super ausfühlrich dokumentiert.
Ansonsten kann ich auch nur noch auf die Anleitung verweisen, nach dem Crashkurs werden doch auch die meisten Befehle erörtert.

Einfach mal das simpelste Beispielprgramm nehmen und dann den Code dazu.
Dann zugucken was der RP6 macht und verstehen warum.

radbruch
22.12.2010, 16:02
Hallo

Um mir einen Überblick zu verschaffen hatte ich mir eine Liste mit allen Funktionen und den Querverweis zur betreffenden Stelle in der Library gemacht:



4.6.1. Mikrocontroller initialisieren
void initRobotBase(void)
void powerON(void)
void powerOFF(void)

4.6.2. UART Funktionen (serielle Schnittstelle)

4.6.2.1. Senden von Daten über die serielle Schnittstelle
void writeChar(char ch)
void writeString(char *string)
void writeString_P(STRING)
void writeStringLength(char *data, uint8_t length, uint8_t offset)
void writeInteger(int16_t number, uint8_t base)

4.6.2.2. Empfangen von Daten über die serielle Schnittstelle
void receiveBytes(uint8_t numberOfBytes)
void waitUntilReceptionComplete(void)
void copyReceivedBytesToBuffer(char *buffer)

4.6.3. Delay Funktionen (Verzögerungen und Zeitsteuerung)
void sleep(uint8_t time)
void mSleep(uint16_t time)

Stopwatch()-Makros
startStopwatchX()
stopStopwatchX()

uint8_t isStopwatchXRunning()
setStopwatchX(uint16_t preset)
getStopwatchX()

4.6.4. Status LEDs und Bumper
void setLEDs(uint8_t leds)

statusLEDs.LEDX
updateStatusLEDs()

uint8_t getBumperLeft(void)
uint8_t getBumperRight(void)

void task_Bumpers(void)
bumper_left
bumper_right
void BUMPERS_setStateChangedHandler(void (*bumperHandler)(void))

4.6.5. ADC auslesen (Batterie-, Motorstrom- und Lichtsensoren)
uint16_t readADC(uint8_t channel)
ADC_BAT --> Batteriespannungs Sensor
ADC_MCURRENT_R --> Motorstromsensor des rechten Motors
ADC_MCURRENT_L --> Motorstromsensor des linken Motors
ADC_LS_L --> Linker Lichtsensor
ADC_LS_R --> Rechter Lichtsensor
ADC_ADC1 --> Freier ADC Kanal für eigene Sensoren
ADC_ADC0 --> Freier ADC Kanal für eigene Sensoren

void task_ADC(void)
ADC_BAT: adcBat
ADC_MCURRENT_L: adcMotorCurrentLeft
ADC_MCURRENT_R: adcMotorCurrentRight
ADC_LS_L: adcLSL
ADC_LS_R: adcLSR
ADC_ADC1: adc0
ADC_ADC0: adc1

4.6.6. ACS – Anti Collision System
void setACSPwrOff(void) --> ACS IR LEDs aus
void setACSPwrLow(void) --> Geringe Reichweite
void setACSPwrMed(void) --> Mittlere Reichweite
void setACSPwrHigh(void) --> Maximale Reichweite

void task_ACS(void)
obstacle_left
obstacle_right
void ACS_setStateChangedHandler(void (*acsHandler)(void))

4.6.7. IRCOMM und RC5 Funktionen
void IRCOMM_sendRC5(uint8_t adr, uint8_t data)
void IRCOMM_setRC5DataReadyHandler(void (*rc5Handler)(RC5data_t))
rc5data.device
rc5data.toggle_bit
rc5data.key_code

4.6.8. Antriebs Funktionen
void task_motionControl(void)

void moveAtSpeed(uint8_t desired_speed_left, uint8_t desired_speed_right)
getDesSpeedLeft()
getDesSpeedRight()
getLeftSpeed()
getRightSpeed()

void changeDirection(uint8_t dir)
FWD - für Vorwärts (FWD ist eine Abkürzung für „Forwards“)
BWD – für Rückwärts (BWD ist eine Abkürzung für „Backwards“)
LEFT – nach links drehen
RIGHT – nach rechts drehen
getDirection()

void move(uint8_t desired_speed, uint8_t dir, uint16_t distance,
uint8_t blocking)
DIST_MM(DISTANCE)
uint8_t isMovementComplete(void)

void stop(void)

void rotate(uint8_t desired_speed, uint8_t dir, uint16_t angle,
uint8_t blocking)

4.6.9. task_RP6System()
void task_RP6System(void)
task_ADC();
task_ACS();
task_bumpers();
task_motionControl();

4.6.10. I²C Bus Funktionen

4.6.10.1. I²C Slave
void I2CTWI_initSlave(uint8_t address)
I2CTWI_readRegisters
I2CTWI_writeRegisters
I2CTWI_genCallCMD
I2CTWI_readBusy
I2CTWI_writeBusy

4.6.10.2. I²C Master
void I2CTWI_transmitByte(uint8_t adr, uint8_t data)
void I2CTWI_transmit2Bytes(uint8_t adr, uint8_t data1, uint8_t data2)
void I2CTWI_transmit3Bytes(uint8_t adr, uint8_t data1, uint8_t data2, uint8_t data3)

void I2CTWI_transmitBytes(uint8_t targetAdr, uint8_t *msg, uint8_t numberOfBytes)
I2CTWI_BUFFER_SIZE
I2CTWI_isBusy()

uint8_t I2CTWI_readByte(uint8_t targetAdr)
void I2CTWI_readBytes(uint8_t targetAdr, uint8_t * messageBuffer, uint8_t numberOfBytes);

void task_I2CTWI(void)
void I2CTWI_requestDataFromDevice(uint8_t requestAdr, uint8_t requestID, uint8_t numberOfBytes)
void I2CTWI_getReceivedData(uint8_t *msg, uint8_t msgSize)
void I2CTWI_setRequestedDataReadyHandler(void (*requestedDataReadyHandler)(uint8_t))
void I2CTWI_setTransmissionErrorHandler(void(*transmiss ionErrorHandler)(uint8_t))

(Liste aus https://www.roboternetz.de/phpBB2/zeigebeitrag.php?p=300358#300358)

Viel Spaß und Erfolg.

Gruß

mic

[Edit]
Eine noch viel bessere Liste gibt es hier:
https://www.roboternetz.de/phpBB2/zeigebeitrag.php?p=410780#410780

Das PDF aus diesem Thread:
https://www.roboternetz.de/phpBB2/download.php?id=15353

Mario94
22.12.2010, 19:17
So ich hab mich mal etwas in das Thema eingelesen und mir aus der Befehlsliste ein Programm zusammengebastelt das folgendes machen soll :
- Gerade aus fahren
- Wenn ein Wiederstand kommt abbiegen und weiterfahren

Doch der Compiler will es nicht speichern wegen folgendem Fehler:
RP6Base_Move_01.c:1: error: expected '=', ',', ';', 'asm' or '__attribute__' before 'RP6RobotBaseLib'
RP6Base_Move_01.c:20:2: warning: no newline at end of file

Mein Programm sieht so aus :

include RP6RobotBaseLib.h

int main initRobotBase{
void powerON(void)
void task_motionControl(void)

void task_Bumpers(void)

if uint8_t getBumperLeft(void)
uint8_t getBumperRight(void)

void moveAtSpeed(90,40)

else
void moveAtSpeed(100,100)


return 0

}

SlyD
22.12.2010, 19:24
Also DA hilft dann aber wirklich nur das gute alte C Tutorial das hat nix mit der RP6 Funktionbibliothek zu tun.

Da sind sehr viele Fehler drin - (Semikolon, Funktionsaufrufe, Endlosschleife nicht vorhanden, #include, ... ) - bitte arbeite mindestens den Crashkurs in der RP6 Anleitung von vorne bis hinten durch (nicht nur grob überfliegen).

OK gut funktionieren würde es dann auch noch nicht - versuch doch erstmal die vorhandenen Beispielprogramme nur zu modifizieren das ist am Anfang erstmal einfacher weil man ein funktionierendes Grundgerüst hat.

MfG,
SlyD

Mario94
22.12.2010, 19:27
Gut ich werd das morgen mal versuchen, danke.

Mario94
23.12.2010, 15:51
Hab jetzt mein erstes Programm zum laufen gebracht ( einfaches geradeaus fahren )

Jetzt wollte ich das ganze steigern und hab das ganze so umgeschrieben das er bei einem Widerstand zurückstoßen SOLLTE und weiterfahren SOLLTE.

Und was tut er ? Nichts.
Er sollte eigentlich fahren, gegen etwas stoßen, zurückfahren ( 20cm) und dann wieder gerade aus fahren.

Hier das Programm :


#include "RP6RobotBaseLib.h"

int main(void)

{
initRobotBase();
setLEDs(0b111111);
mSleep(1500);
setLEDs(0b100001);
powerON();
while(true);
{
move(90,FWD,DIST_CM(50),true);
}
void bumpersStateChanged(void)
{
if(bumper_left || bumper_right)
{
moveAtSpeed(0,0);
setLEDs(0b010000);
move(90,BWD,DIST_CM(20),true);
}}

return 0;
}

Magelan1979
23.12.2010, 18:22
Weil Du vielleicht in der main-Schleife die systemrelevanten Funktionen vergessen hast?

task_RP6System

Mario94
23.12.2010, 18:36
Selbst wenn ich die Funktion " task_RP6System();" einbaue tut er nichts

Mario94
24.12.2010, 15:03
hat niemand eine Idee ? =(

TrainMen
24.12.2010, 16:00
Hi,
so wird das nichts. Der ganz Aufbau ist ja schon falsch.
Guck dir mal den Code von Move1 an. Da ist fast genau das was Du machen willst und damit kannst du ja dann probieren. Hast auf jedenfall schon mal eine Gerüst.
Trainmen

Mario94
25.12.2010, 11:48
Danke, habs mir angesehen und verändert, jetzt funktioniert es .
Er fährt 10 cm zurück wenn er gegen was stößt und fährt dann nach rechts weiter.

Hier mal der Code dazu ( falls jemand das selbe Problem wie ich hatte)

#include "RP6RobotBaseLib.h"

void bumpersStateChanged(void)
{
if(bumper_left || bumper_right)
{
moveAtSpeed(0,0);
move(100,BWD,DIST_CM(10),true);
changeDirection(RIGHT);
move(100,RIGHT,DIST_CM(15),true);
changeDirection(FWD);
moveAtSpeed(70,70);
}
}

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

powerON();

BUMPERS_setStateChangedHandler(bumpersStateChanged );


changeDirection(FWD);
moveAtSpeed(70,70);


{
while(true)
task_RP6System();
}
return 0;
}

Morpheus1997
23.01.2011, 17:50
Hi,
so wird das nichts. Der ganz Aufbau ist ja schon falsch.

@TrainMen:
ja woher weiß man denn, welcher aufbau bei einem beliebigen programm richtig ist?