PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : NIBO2 bei Reichelt gekauft, zusammengebaut und nu?



Hans55
20.09.2009, 09:54
Hallo zusammen!
Ja und nu?
Ich dachte mir, zum C++ lernen ists nicht schlecht, wenn du dir einen kleinen Robo kaufst. In Elektor hat man ihn beschrieben und bei Reichelt angeboten.
Also hab ich den NIBO2 bestellt, zusammengebaut, AVR GCC installiert. bei E-Bay für ein paar Euros einen USB-ISP Adapter besorgt (nicht den teuren vom Nibo) angeschlossen und mit viel Mühe hab ich die LEDs zum leuchten gebracht und das Display zur Anzeige gebracht.
Darstellung der Sensorwerte geht auch soweit, allerdings mit sehr viel Mühe.
Mal hatte ich nur 3 Fehler, dann warens plötzlich wieder 70.
Es ist gar nicht so einfach zwei Seiten Programm aus dem Tutorial abzutippen!
Man ist sich ja gar nicht sicher, ob die Beispiele denn auch passen oder ob da auch noch Fehler drin sind.
Denn es sieht so aus, als ob die NIBO Entwickler zwar ein schönes Anspruchsvolles Gerät gebaut haben, aber irgendwie kümmert sich keiner mehr drum.
Die Nachfrage ist auch ausgeblieben. Oder?
Die meisten kaufen sich lieber einen ASURO so wie es aussieht.

Es wäre nicht schlecht gewesen, wenn funktionierende Beispiele auf CD dabei gewesen wären. Das abtippen ist mühsam und mit Fehlern behaftet.
Oder gibts welche anderswo?

Ich hab schon allesmögliche durchsucht. Irgendwas fehlt bei den Programmen immer. Man weiß nicht welche Lib man einbinden muss usw.

Gibts denn keine NIBO2 User mehr?
Gibts jemand, der in schon mit BASCOM am laufen hat?
Gibts noch ein anderes NIBO2- Forum von dem ich nix weiß?
Hier scheint man am Ende zu sein.

Vielleicht meldet sich mal ein NIBO2- User?

Gruß
Hans

radbruch
20.09.2009, 10:23
Hallo

Glückwunsch zum Nibo :)

Leider scheint er noch nicht sehr verbreitet, hier im RN-Forum liest man recht wenig über ihn. Es gibt aber ein Wiki des Herstellers und ich vermute, es gibt auch individuellen Support durch den Entwickler. Einfach mal amailen..

http://www.nibo-roboter.de/wiki/Nibo2
http://www.nicai-systems.de/nibo.html


Es wäre nicht schlecht gewesen, wenn funktionierende Beispiele auf CD dabei gewesen wären. Das Abtippen ist mühsam und mit Fehlern behaftet. Back to the roots! In den 80ern wurden seitenweise Listings in Computerzeitungen abgedruckt. Glück hatte derjenige, dessen Freundin maschinenschreiben konnte ;)

Auf der Wiki-Seite ist unter anderem ein Tutorial-PDF verlinkt. Davon kann man die Beispielprogramme rauskopieren:
http://download.nicai-systems.com/nibo/Nibo2Tutorial_20090824.pdf

#include <nibo/niboconfig.h>
#include <nibo/leds.h>
#include <nibo/delay.h>
int main()
{
leds_init();
while(1==1)
{
delay(500);
leds_set_status(LEDS_RED, 0);
delay(500);
leds_set_status(LEDS_GREEN, 0);
}
return 0;
}

Viel Erfolg und Spaß

Gruß

mic

oberallgeier
20.09.2009, 12:26
... wäre nicht schlecht ... funktionierende Beispiele auf CD ... abtippen ist mühsam und mit Fehlern behaftet ...Stimmt, auch mit meinen unter 100/min Zehn-Finger-blind mache ich auch jeden nur möglichen Bogen um Schreibarbeit. ABER ich habe einen Scanner - der hat ein OCR - ist nicht fehlerfrei, das kommt auch auf die Schriftart an, aber hilft meist ne ganze Menge. Nacharbeit ist fast immer nötig - die kann man ja z.T. an den Compiler delegieren - obwohl AVRStudio ja ein hübsches high lighting hat - damit könnte man auch schon erste Fehler erkennen.

Hans55
20.09.2009, 18:36
Danke erstmal!
Gruß Hans

Hans55
23.09.2009, 08:57
Hallo!
Nun hab ich einige Beispiele (LED Ansteuern, blinken etc) mit dem NIBO2 getestet. Das hat alles funktioniert, wenn ich die NIBOLIB verwende.

Damit ich C lerne wollte ich ohne diese undurchsichte NIBOLIB mal eine LED am NIBO ansteuern, aber irgendwie gehts nicht.


/*
LED
*/

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

// wartet einige ms
void delay_ms(uint16_t ms)
{
for(uint16_t t=0; t<=ms; t++)
_delay_ms(1);

}

int main()
{
DDRC = 0xFF; // IO-Ports der LEDs als Ausgänge
while (1)

PORTC = 0b00000001; Led an PC0 ein
delay_ms (250);
PORTC = 0b00000010; Led an PC1 ein
delay_ms (250);
}
return 0;

}


Da kommen erstmal tausend Fehler????
rm -rf Test01.o Test01.elf dep/* Test01.hex Test01.eep Test01.lss Test01.map
Build succeeded with 0 Warnings...
o -MF dep/Test01.o.d -c ../Test01.c

../Test01.c: In function 'main':
../Test01.c:21: error: 'Led' undeclared (first use in this function)
../Test01.c:21: error: (Each undeclared identifier is reported only once
../Test01.c:21: error: for each function it appears in.)
../Test01.c:21: error: expected ';' before 'an'
../Test01.c:23: error: expected ';' before 'an'
../Test01.c: At top level:
../Test01.c:26: error: expected identifier or '(' before 'return'
../Test01.c:28: error: expected identifier or '(' before '}' token
make: *** [Test01.o] Error 1
Build failed with 7 errors and 0 warnings...


Scheinbar findet er die LIBs nicht, Oder.
Mein WinAVR liegt im Pfad:
C:\WINAVR...

Was mach ich da denn falsch?

Hubert.G
23.09.2009, 09:29
Da stimmt der Syntax nicht ganz

/*
LED
*/

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

// wartet einige ms
void delay_ms(uint16_t ms)
{
for(uint16_t t=0; t<=ms; t++)
_delay_ms(1);

}

int main()
{
DDRC = 0xFF; // IO-Ports der LEDs als Ausgänge
while (1)

PORTC = 0b00000001; //Led an PC0 ein
delay_ms (250);
PORTC = 0b00000010; //Led an PC1 ein
delay_ms (250);

return 0;

}
Den Code hat mein AVR-Studio ohne Fehler kompiliert.
Vor dem return 0 die Klammer weg, und Backslash vor dem Kommentar nicht vergessen.

Hans55
23.09.2009, 21:55
Hallo!

Was soll man mit so einer Fehlermeldung anfangen?
================================================
rm -rf Test01.o TestLED_EIGEN01.elf dep/* TestLED_EIGEN01.hex TestLED_EIGEN01.eep TestLED_EIGEN01.lss TestLED_EIGEN01.map
Build succeeded with 0 Warnings...
make: *** No rule to make target `../Test01.c', needed by `Test01.o'. Stop.
Build failed with 1 errors and 0 warnings...
================================================

Was mach ich da schon wieder falsch?

Hans55
23.09.2009, 22:00
Alles nochmal neu installiert AVR-GCC und Studio4 . Nun kann ich Fehlerfrei übersetzen und sogar laden!
Super, Danke.

Am NIBO2 leuchtet aber keine LED auf.

Hans55
24.09.2009, 09:34
Hallo zusammen!
Der AVR-GCC Compiler ist mir zu umständlich, auch die zig Libs, sowohl vom AVR-GCC als auch vom NIBO.
Ich machs zu Fuß mit BASCOM und siehe da, nun leuchten zum ersten mal die LEDs auf Anhieb.
Zum C lernen ist der NIBO2 nix, für wenigstens.


FRAGE:
1- Hat den NIBO schon jemand mit BASCOM programmiert?
2- Wie habt ihr das mit dem Coprozessor gemacht?
=> direkt einen 6 poligen ISP Stecker auch für den Mega88?

Gruß

Wsk8
24.09.2009, 17:02
Mit avr-gcc gehts genau so, es ist nur viel komplizierter.

Und jemand der ihn weder in C noch in Bascom richtig programmieren kann(kannst du überhaupt programmieren???), sollte nicht anfangen selbst libs zu schreiben sondern erstmal die bereits vorhandenen benutzten um einen überblick zu bekommen.
Und außerdem kann man sich selbst ne sourcedatei schreiben, wo man die bereits vorhanden funktionen in eigene einbaut, aber dazu muss man eben programmieren können, weil wenn du wegen jedem kleine problem hier nachfragst kannst du gleich jemand anderen fragen ob er es macht, sonst wird das nie was.

mfg

Hans55
24.09.2009, 19:07
Sag ich ja, in C ists schwieriger, auserdem gibts kaum einen der den NIBO hat.
Mit BASCOM funktioniert's wenigstens.
Eigentlich hab ich mir den NIBO nur deshalb gekauft, weil ich C lernen wollte. Das war falsch hab ich festgestellt.

Thema beendet!

Wsk8
24.09.2009, 21:04
Ich hab auch gedacht das ich mit dem Asuro programmieren lerne, hat leider nicht ganz so geklappt, die erklärungen sehr knapp und für einen anfänger nicht verständlich, beim nibo wirds wohl nicht viel besser sein.

Mein Tipp:
Kauf dir ein buch zu C oder such im inet nacht Tuts und lern dort.
Zum besseren verständis gleich noch einen compiler wie Borland (heißt das so??), da kannst du die programme gleich ausprobiern und selbst veränderungen vornehme. (probieren geht über studieren^^).
Und dann kannste 100x mehr aus deinem Nibo rausholen.

mfg

Hans55
25.09.2009, 11:08
Hallo Wsk8!
Also, inzwischen läuft er ja auch. Ich hab den Mega88 eine zusätzliche ISP- Schnittstelle eingebaut und kann nun beide Prozessoren ganz normal ohne Umwege direkt programmieren.
Außerdem hab ich das Grafikdisplay erstmal wieder abgebaut und ein für Bascom nutzbares 4x20 Zeichen Display angeschlossen.
Vom Nibohersteller habe ich leider keine Antwort wegen des Displays bekommen. Die haben zwar ein Datenblatt auf der Homepage, das lässt sich aber nicht runter laden. Am Display hab ich keine Hinweise über den Typ gefunden.
Außerdem muss man aufpassen, denn es gibt neben den NIBO2 auch noch einen NIBO. Der schaut zwar auf den ersten Blick auch so aus, hat aber statt Mega128+Mega88 einen Mega128+ 2xTinys drauf.
Da kanns schon sein, dass man sich die falsche SW lädt.
Wenn man dann noch das undurchsichtige C nimmt, muss man straucheln.
Mal vergisst man eine Klammer, dann wieder einen Strichpunkt und schon bekommt man einmal nur eine Fehlermeldung, dann wieder 30, je nachdem ob der Strichpunkt vorhanden ist oder nicht.

Ich hab zwei Jahrzehnte Assembler8080,8085,8086 und 8051 mit einem Professionellen System programmiert, da ist die Umstellung auf einen C- Compiler wie ich es nun einige Tage probiert habe nicht einfach. Bei ASM weiß man immer was man macht.
C ist für mich einfach (noch) nicht lesbar, man weiß auch nicht was mit der Anweisung passiert.
Wie gesagt, einen Strichpunkt vergessen => 30 Fehler
Strichpunkt wieder dran => ein Fehler
Und kein vernünftiger Hinweis wo man suchen soll.
Ich war fast am verzweifeln.

Mit BASCOM gehts so einigermaßen.
C werd ich mir erst mal anlesen wie du gesagt hast und es dann evtl. mal nutzen, oder auch nicht.
Inzwischen fährt der NIBO2 mit BASCOM Hin und her, läßt alle LEDs in allen Farben blinken, piept rum und zeigt am Display etwas an.
Als nächstes muss ich einen PID- Regler in den Mega88 einbauen
und die ganzen Sensoren aktivieren.
Das alles geht mit ein paar Unterprogrammen, Makros und in einem
einzigen Listing ohne diese tausend undurchsichtigen Libs, falls man sie überhaupt irgendwo findet.
Die dokumentierten NIBO-Libs liegen sicher irgendwo beim Entwickler rum, da sollen sie wegen mir auch bleiben.
Fazit:
Der NIBO ist nicht schlecht, weil er viele Sensoren eingebaut hat.
Um C zu lernen taugt er aber nicht.
Man sollte sich vorher schon mal mit C beschäftigt haben, sonst nutzt es nicht viel.
Doku, Programme etc. ist auch (noch) sehr dürftig und Fehlerhaft.
Hilfe gibts auch keine, weil das Gerät bisher noch nicht soo genutzt wird.
Manche geben ihn sogar nach dem Kauf beim Wertstoffhof ab wie jemand in diesem Forum geschrieben hat.
Dafür isser aber zu schön und zu schade. Man muß ihn nur etwas umbauen, dann gehts.
Dran rumbasteln ist allerdings wegen SMD Bauteilen nicht einfach und sollte vorsichtig passieren.

Gruß

Wsk8
25.09.2009, 12:25
Wenn du ASM kannst, wieso programmierst du ihn dann nicht damit?? Willst du unbedingt eine neue sprache lernen? AVRStudio kann auch asm, dann läuft dein nibo nicht nur einigermaßen, sondern (fast) perfekt^^

mfg

Achim S.
25.09.2009, 16:50
Hallo Freunde
hallo hans55, du hattest nach einem Userclub zu nobo2 gefragt. hast du was gefunden? leider ist das mit der unterstützung noch recht dürftig. bei einer vernünftigen pflege der programme und beispielen kann man eine ganze menge damit machen. ich selber finde das teil richtig gut, so vom aufbau bis zum programm. bleib dran. auf deine ergebnisse bin ich richtig neugierig
Achim

Uli_s
12.05.2010, 09:45
Hallo,

Tip für die Abtipper: Copy & Paste
d.h. Projekt vorbereiten, Text aus Buch oder sonstwoher kopieren und im Projekt einfügen. Darauf achten, dass evtl. Seitenzahlen und Fremdtext gelöscht werden.

Ich kann auch kein C, bzw. bin dabei es zu lernen. Hierzu habe ich mir ein Anfängerbuch gekauft, das Tutorial durchgearbeitet und einen Kollegen (der kann C) gefragt.

Unser Nibo2 fährt, blinkt, zeigt an. Es gibt natürlich noch viele Ungereimtheiten - z.B. scheint bei der Vorgabe einer Strecke (z.B. 1000 Ticks) die tatsächlich in Metern zurückgelegete Strecke abhängig von der Geschwindigkeit zu sein - das verstehe ich noch nicht.

Wenn sich etwas mehr Nibi-User zusammentäten fände ic h das gut.

Gruß
Uli

Rabenauge
12.05.2010, 10:28
Hat der Nibo2 nicht die gleiche Odometrie wie der NiboBee, mit Lichtschranken und den durchbohrten Zahnrädern?
Dann dürfte die Odometrie nicht geschwindigkeitsabhängig sein, allerdings läuft auch der NiboBee grundsätzlich etwas zu weit- ich denke, das liegt daran, dass die Motoren eine gewisse Massenträgheit haben und einfach nicht sofort stehen bleiben.
Kannst du im Stand aber testen (Räder per Hand drehen und dabei die Odometrie auslesen), dann weisst du, was Sache ist.

Uli_s
12.05.2010, 11:45
Es geht nicht um die Trägheit der Motoren, es sind gleich mehrere Meter, die fehlen! Auf den ersten Blick: doppelte Geschwindigkeit= doppelter Weg (geschätzt).

Gruß
Uli

Rabenauge
12.05.2010, 16:19
Hast du eine Möglichkeit, dir die Odometriedaten ausgeben zu lassen?
Dann könntest du mal herausfinden, wie das Teil eigentlich misst.

Hm, laut Programmier "anleitung" gibt es verschiedene Funktionen in der Bibliothek, mit
copro_setTargetRel(left, right, speed) sollte es aber funktionieren.

Achim S.
12.05.2010, 17:45
Hallo Uli
Suche mal im Netz , besonders auf diesen seten mach dem Nibo 2 Magazin. IOch hábe bis jetzt 3 Teile ins Netz gestellt und weitere Teile sind in Arbeit. Es haben sich auch ein paar Freunde des Nibo gefunden und tauschen Gedanken und Programme aus. Das Magazin ist einfach geschrieben und für jeden etwas dabei. Es würde mich freuen dich auch dabei begrüssen zu können. Gern helfen wir dir weiter, soweit wir es auch verstehen. Wenn du nichts findest kurze mail an mich und du bekommst alles auf den Tisch. Dies gilt auch für andere. Suche immer Mitstreiter und Leser.
h.j.seeger@web.de
Achim

Uli_s
15.05.2010, 22:32
Guten Abend,

1. Odometrie kann ich noch nicht auslesen - ich bin C-Anfänger - wenn mir einer dabei Hilfestellung geben könnte ....
copro_setTargetAbs-oder Rel-(x,y,speed) funzt zwar, aber gerade damit habe ich das Problem entdeckt.

2. Teil 1. und 2. des Nibo Magazins sind mir mal zufällig auf den Bildschirm geraten. Eine Suche danach bringt aber keinen Erfolg. Wo findet man das Magazin denn?

3. Mein größtes Problem im Augenblick:
Nachdem das linke Rad etwas "hakte" hab' ich ein Tröpfchen Öl an die Achs-Lager links und rechts gegeben. Seitdem kennt der linke Motor nur noch zwei Zustände: Stillstand oder Vollgas, egal welche speed man einstellt (copro_setSpeed(speed, speed). Keine Reaktion erfolgt auf
copro_setTargetAbs-oderRel-(x,y,speed) - Stillstand.

Was kann die Ursache sein??

Gruß
Uli

Uli_s
15.05.2010, 23:02
Ist Teil 3 der, den man in Deinem letzten Beitrag runterladen kann??

Gruß
Uli

Achim S.
16.05.2010, 07:40
Hallo Uli
bis jetzt gibt es 3 Teile. Alle stehen im Roboternetz zum runterladen. An weiteren Teilen arbeite ich bereits. Würde sagen, es sind recht interessante Ansichten und Berichte darunter. Hoffe für jeden etwas zu finden. Es könnte auch für andere Nutzer passen. Das Magazin lebt auch mit seinen Lesern. Gern sehe ich eine Diskussion über das eine oder andere. Jeder sieht es anders. Gern greife ich auch Vorschläge und Fragen auf, die bei dem Hobby mit Nibo 2 entstehen. Stelle nochmal den 3 Teil ins Netz. Du kannst auch alle 3 Teile direkt von mir bekommen. Kurze mail an die Adresse reicht.
h.j.seeger@web.de
Achim

elektrolutz
16.05.2010, 10:24
Hallo Uli_s,

du solltest auf der Motorseite, an der nur "schnell" oder "aus" funktioniert prüfen, ob du den IR-Sensor verbogen hast, oder aber den Sensor bzw. die Empfänger mit Öl benetzt hast, oder gar Öl über die Leiterbahnen der Platinen gezogen ist.
Die interne Steuerung des Nibo2 bewirkt, dass bei zu langsamen Odometrie-Signalen, der Motor mehr Leistung verordnet bekommt, um die zu geringe Geschwindigkeit aufzuholen. Extremster Fall von zu langsamen Signalen ist das komplette aussetzen der Signale durch Radblockage oder ausgefallener Sensorik, hier gibt der Antrieb dann Dauer-Vollgas.

Siehe auch: https://www.roboternetz.de/phpBB2/viewtopic.php?t=54055

Achim S.
16.05.2010, 13:12
Hallo Uli
damit du nicht lange suchst gleich noch mal die anderen Teil
Achim

Achim S.
16.05.2010, 13:16
irgemdwie will die Technik heute nicht so wie ich will. also noch mal

Uli_s
16.05.2010, 13:23
Hallo,

hab' vergangene Nacht noch den Antrieb auseinandergebaut und gereinigt. Danach schien mir eine Verbesserung eingetreten zu sein - Motor drehte nicht mehr Vollgas, ließ sich aber noch nicht regeln.

Nach Deinem obigen Hinweis nochmals zerlegt und mit Terpentin Lichtschranke und Leiterplatte abgetupft und getrocknet. Das wars, läuft wieder links und rechts gleich schnell.

Vielen Dank!!

Noch 'ne (oder 2) Frage(n).

Wie lese ich Odometriewerte aus und zeige sie am Display an?
Wie hoch ist die max. speedl? Mein Nibo steigt ab 82 aus, bzw läuft gar nicht erst an.

Gruß
Uli

leilahasi
26.11.2010, 12:08
hallo gemeinde,

ich habe seit kurzen einen nibo2 und wollte das beispiel program aus probieren aber beim kompalieren kommt immer diese fehler meldung.



#include <stdlib.h>
#include <avr/interrupt.h>

#include "nibo/niboconfig.h"
#include "nibo/iodefs.h"

#include "nibo/delay.h"
#include "nibo/adc.h"
#include "nibo/pwm.h"
#include "nibo/i2cmaster.h"
#include "nibo/display.h"

#include "nibo/bot.h"
#include "nibo/leds.h"
#include "nibo/gfx.h"
#include "nibo/irco.h"
#include "nibo/motco.h"
#include "nibo/floor.h"

#define LINKS 0
#define VORNE_LINKS 1
#define VORNE 2
#define VORNE_RECHTS 3
#define RECHTS 4

#define SPEEDFACTOR 30

// Zustände
#define BLOCKIERT 1
#define AUSWEICHEN 2
#define FREI 0
#define HINDERNISLINKS 3
#define HINDERNISRECHTS 4
#define GERADEAUS 5


// Deklarationen von Hilfsfunktionen
void Init();
void float2string(float value, int decimal, char* valuestring);
void leds_set_status_all(uint8_t col0, uint8_t col1, uint8_t col2, uint8_t col3, uint8_t col4, uint8_t col5);
float SupplyVoltage(void);
void textout(int x, int y, char* str, int ft);


int main()
{
Init();

// Kollisionsvermeidung vorbereiten
uint16_t Vektor[5][2]; // Einheitsvektoren (*10) [0] ist x- und [1] ist y-Wert
Vektor[0][0] = -10; // LINKS x
Vektor[0][1] = 0; // LINKS y
Vektor[1][0] = -7; // VORNE_LINKS x
Vektor[1][1] = 7; // VORNE_LINKS y
Vektor[2][0] = 0; // VORNE x
Vektor[2][1] = 10; // VORNE y
Vektor[3][0] = 7; // VORNE_RECHTS x
Vektor[3][1] = 7; // VORNE_RECHTS y
Vektor[4][0] = 10; // RECHTS x
Vektor[4][1] = 0; // RECHTS y

uint8_t weightfactor[5]; // Gewichtungsfaktor
weightfactor[LINKS] = 1;
weightfactor[VORNE_LINKS] = 2;
weightfactor[VORNE] = 3;
weightfactor[VORNE_RECHTS] = 2;
weightfactor[RECHTS] = 1;

uint16_t VektorMalSensor[5][2]; // Sensorwert * Einheitsvektor (*10)
uint16_t VektorMalSensorSumme[2]; // Sensorschwerpunkt (x,y) für Auswertung

// Vorbereitungen
leds_set_displaylight(1000);
leds_set_headlights(256);
floor_enable_ir();
motco_setPWM(512,512);
motco_setSpeed(3,3);

// fixe Display-Anzeigen
textout(35,0,"Volt", 0);
textout(0, 8,"distance:", 0);
textout(0,24,"floor:", 0);
textout(0,40,"line:", 0);

// Hauptschleife
while(1)
{
// Akkuspannung anzeigen
float Ubatt = SupplyVoltage();
char text[6];
float2string(Ubatt,2,text);
textout(0,0," ",0); // 5 Zeichen löschen
textout(0,0,text, 0);

// Abstandsmessung Raumgefühl
irco_startMeasure();
irco_update();

// Floor
uint16_t floor_distance[2];
uint16_t line_distance[2];

// Abstandsmessung Floor
floor_update();
floor_distance[0] = floor_l;
floor_distance[1] = floor_r;
line_distance[0] = line_l;
line_distance[1] = line_r;

//Strings für Display
char irco_string[5][5];
char floor_string[2][5];
char line_string[2][5];

// Laufvariablen
int i,j;

/*
IR-Abstandssensoren
*/

for(i=0; i<5; ++i)
textout(i*21,16," ",0); //löschen

for(i=0; i<5; ++i) // z.Z. noch rechts 0 und links 4 !!!!!!!!!!!!!
{
itoa(irco_distance[i],irco_string[i],10);
textout(i*21,16,irco_string[i],0);
}

/*
IR-Floorsensoren (Abgrunderkennung)
*/

for(i=0; i<2; ++i)
textout(i*28,32," ",0); //löschen

for(i=0; i<2; ++i)
{
itoa(floor_distance[i],floor_string[i],10);
textout(i*28,32,floor_string[i],0);
}

/*
IR-Liniensensoren
*/

for(i=0; i<2; ++i)
textout(i*28,48," ",0); //löschen

for(i=0; i<2; ++i)
{
itoa(line_distance[i],line_string[i],10);
textout(i*28,48,line_string[i],0);
}

/*
MOTCO

Mathematische Methode "x/y-Schwerpunkt der Sensorvektoren bilden":
(Einheitsvektoren * 10) * Sensorwert (0-255) * weightfactor, davon Summe bilden

VektorMalSensorSumme[...] 0 ist x-Wert und 1 ist y-Wert
Blockade: y kann maximal 14790 groß werden (vl, v, vr 255)
Richtung: x kann maximal -6120 (Hindernis links) bzw. +6120 (H. rechts) werden (l, vl 255 bzw. r, vr 255)
*/

// Ermittlung von VektorMalSensorSumme[...] (gewichteter x- und y-Wert)
VektorMalSensorSumme[0] = 0; // x-Wert
VektorMalSensorSumme[1] = 0; // y-Wert

// i entspricht links, vornelinks, vorne, vornerechts, rechts
// j entspricht x und y

for (i=0; i<5; ++i)
{
for (j=0; j<2; ++j)
{
VektorMalSensor[i][j] = Vektor[i][j] * irco_distance[i] * weightfactor[i]; // 4-i wegen IRCo?????
VektorMalSensorSumme[j] += VektorMalSensor[i][j];
}
}

// Reaktion auf VektorMalSensorSumme[...] (x- und y-Wert)

// GrenzenY
uint16_t GrenzeY1 = 12000; // Zustandsgrenze: BLOCKIERT / AUSWEICHEN
uint16_t GrenzeY2 = 6000; // Zustandsgrenze: AUSWEICHEN / FREI

// GrenzenX
uint16_t GrenzeXlinks = -2000; // Zustandsgrenze: LINKS / GERADEAUS
uint16_t GrenzeXrechts = 2000; // Zustandsgrenze: RECHTS / GERADEAUS

// Zustandsvariable
uint8_t zustand = 0;
uint8_t zustand_old = 0;

// Zustand ermitteln
{ // y-Wert
if( VektorMalSensorSumme[1] >=GrenzeY1) zustand = BLOCKIERT;
if((VektorMalSensorSumme[1] < GrenzeY1) &&
(VektorMalSensorSumme[1] >=GrenzeY2))
{
// x-Werte
if( VektorMalSensorSumme[0] < GrenzeXlinks ) zustand = HINDERNISLINKS;
if( VektorMalSensorSumme[0] > GrenzeXrechts ) zustand = HINDERNISRECHTS;
if((VektorMalSensorSumme[0] >=GrenzeXlinks) &&
(VektorMalSensorSumme[0] <=GrenzeXrechts)) zustand = GERADEAUS;
}
if (VektorMalSensorSumme[1] < GrenzeY2) zustand = FREI;
}

// Auf Zustand reagieren
if(zustand == zustand_old)
{
// kein MOTCo-Befehl notwendig
}
else //Veränderung eingetreten
{
// Sondermaßnahmen
// gegen Schwingung links/rechts: einmal GERADEAUS erzwingen
if((zustand_old == HINDERNISLINKS) || (zustand_old == HINDERNISRECHTS))
{
zustand = GERADEAUS;
}
// gegen Schwingung vor/zurück: zweimal zurück
if((zustand_old == BLOCKIERT) && (zustand == GERADEAUS))
{
zustand = BLOCKIERT;
}
// direkt vorne frei?
if(irco_distance[2]<150)
{
zustand = zustand_old;
}

//Allgemeine Maßnahmen
switch(zustand)
{
case FREI:
//entry
leds_set_status_all(LEDS_OFF, LEDS_OFF, LEDS_GREEN, LEDS_GREEN, LEDS_OFF, LEDS_OFF);
//do
motco_setSpeed( 3*SPEEDFACTOR, 3*SPEEDFACTOR ); // rasch vorwärts
delay(10);
//exit
break;
case HINDERNISRECHTS:
//entry
leds_set_status_all(LEDS_OFF, LEDS_OFF, LEDS_OFF, LEDS_OFF, LEDS_ORANGE, LEDS_ORANGE);
//do
motco_setSpeed( -SPEEDFACTOR, SPEEDFACTOR ); // nach links drehen
delay(10);
//exit
break;
case GERADEAUS:
//entry
leds_set_status_all(LEDS_OFF, LEDS_OFF, LEDS_ORANGE, LEDS_ORANGE, LEDS_OFF, LEDS_OFF);
//do
motco_setSpeed( 2*SPEEDFACTOR, 2*SPEEDFACTOR ); // gemäßigt vorwärts
delay(10);
//exit
break;
case HINDERNISLINKS:
//entry
leds_set_status_all(LEDS_ORANGE, LEDS_ORANGE, LEDS_OFF, LEDS_OFF, LEDS_OFF, LEDS_OFF);
//do
motco_setSpeed( SPEEDFACTOR, -SPEEDFACTOR ); // nach rechts drehen
delay(10);
//exit
break;
case BLOCKIERT:
//entry
leds_set_status_all(LEDS_OFF, LEDS_OFF, LEDS_RED, LEDS_RED, LEDS_OFF, LEDS_OFF);
//do
motco_setSpeed(-2*SPEEDFACTOR,-2*SPEEDFACTOR ); // rückwärts fahren
delay(10);
//exit
break;
}
zustand_old = zustand;
motco_update();
}
}//Ende while-Hauptschleife

while(1);
return 0;
}


// Hilfsfunktionen

void Init()
{
sei(); // enable interrupts

i2c_init();
pwm_init();
display_init();

bot_init();
leds_init();
floor_init();
gfx_init();
}

void leds_set_status_all(uint8_t col0, uint8_t col1, uint8_t col2, uint8_t col3, uint8_t col4, uint8_t col5)
{
leds_set_status(col0,0);
leds_set_status(col1,1);
leds_set_status(col2,2);
leds_set_status(col3,3);
leds_set_status(col4,4);
leds_set_status(col5,5);
}

float SupplyVoltage(void)
{
bot_update();
return(0.0166 * bot_supply - 1.19);
}

void textout(int x, int y, char* str, int ft)
{
gfx_move(x,y);
gfx_print_text(str,ft);
}

void float2string(float value, int decimal, char* valuestring)
{
int neg = 0; char tempstr[20];
int i = 0; int j = 0; int c; long int val1, val2;
char* tempstring;
tempstring = valuestring;
if (value < 0){ neg = 1; value = -value; }
for (j=0; j < decimal; j++) {value = value * 10;}
val1 = (value * 2);
val2 = (val1 / 2) + (val1 % 2);
while (val2 !=0){
if ((decimal > 0) && (i == decimal)){
tempstr[i] = (char)(0x2E);
i++;
}
else{
c = (val2 % 10);
tempstr[i] = (char) (c + 0x30);
val2 = val2 / 10;
i++;
}
}
if (neg){
*tempstring = '-';
tempstring++;
}
i--;
for (;i > -1;i--){
*tempstring = tempstr[i];
tempstring++;
}
*tempstring = '\0';
}


Fehlermelungen:

../beginn1.c: In function 'main':
../beginn1.c:76: warning: implicit declaration of function 'motco_setPWM'
../beginn1.c:77: warning: implicit declaration of function 'motco_setSpeed'
../beginn1.c:96: warning: implicit declaration of function 'irco_startMeasure'
../beginn1.c:97: warning: implicit declaration of function 'irco_update'
../beginn1.c:127: error: 'irco_distance' undeclared (first use in this function)
../beginn1.c:127: error: (Each undeclared identifier is reported only once
../beginn1.c:127: error: for each function it appears in.)
../beginn1.c:282: warning: implicit declaration of function 'motco_update'
../beginn1.c: In function 'textout':
../beginn1.c:326: error: too many arguments to function 'gfx_print_text'
make: *** [beginn1.o] Error 1
Build failed with 4 errors and 5 warnings...
kann mir bitte sagen was ich falsch mache...

gruß

elektrolutz
26.11.2010, 13:32
Hallo leilahasi,

die "motco"/"irco"-Anweisungen sind für den Roboter "Nibo/Nibo1", da du den "Nibo2" hast, solltest du die "copro"-Anweisungen benutzen.

In der Lib-Dokumentation werden die Anweisungen für beide Nibo-Versionen aufgelistet, wo Unterschiede sind, ist ein Vermerk in Klammern gesetzt.

Achim S.
26.11.2010, 16:51
Hallo
So wie icg das sehe, hast du ein Prg von Henke genommen. Diese stammt wahrscheinlich aus den Jahren 2007/2008. Es verwendet einige Befehle die so nicht laufen. Man müsste jede Zeile durchsuchen und die neuen Befehle eintragen. Das ist sehr mühsam. Zu Anfang habe ich das auch getestet, aber ohne Erfolg und mit vielen Fehlermeldungen. Dann habe ich die Sachen genau betrachtet und teilweise grosse unterschiede festgestellt. Im Moment lohnt es sich nicht das zu machen. Probiere mal die Prg aus die in dem Heft stehen. Wenn die laufen, kannst du auch noch andere haben.
Achim

workwind
26.11.2010, 17:07
Den Quellcode für eine NIBO2-Linienfolge findest Du inkl. der Hex-Files auf der RoboterCC Seite:

Kalibrierung: http://www.roboter.cc/index.php?option=com_nicaiwci&view=project&projectid=127
Linienfolge 2: http://www.roboter.cc/index.php?option=com_nicaiwci&view=project&projectid=128

leilahasi
26.11.2010, 21:34
Danke, für die schnellen antworten. Ich hab die Programme ausprobiert und sie laufen auf meinen nibo2. Kann mir jemand mit dem programm für das ausweichen von Gegenständen helfen?

Lisbeth2010
27.11.2010, 08:56
Hallo, noch Interesse an Nibo und C?
Ich werde versuchen, meine Erkenntnisse mitzuteilen.
Ich benutze das Atmel Studio und die aktuelle Library.
Ich versuche, den Code zu kommentieren!
Viele Grüße auch Workwind, der offensichtlich fleißig mitliest!
Lisbeth

Lisbeth2010
27.11.2010, 09:21
Hallo, noch Interesse an Nibo und C?
Ich werde versuchen, meine Erkenntnisse mitzuteilen.
Ich benutze das Atmel Studio und die aktuelle Library.
Ich versuche, den Code zu kommentieren!
Viele Grüße auch Workwind, der offensichtlich fleißig mitliest!
Lisbeth


/* Linie einfachst. Erstmal Bodensensoren */

#include <avr/interrupt.h>

#include <nibo/niboconfig.h>
#include <nibo/iodefs.h>

#include <nibo/bot.h>
#include <nibo/i2cmaster.h>
#include <nibo/leds.h>
#include <nibo/delay.h>
#include <nibo/motco.h>
#include <nibo/irco.h>
#include <nibo/floor.h>
#include <nibo/adc.h>

#include "utiliw.h"

#define WHILE_1_TIME_GRID 20
uint8_t counter_1ms;
uint8_t speed_left = 40; // Ticks/Sekunde
uint8_t speed_right = 40; // Ticks/Sekunde


// ------------------------------------------------------------
// ---------- init timer2 -------------------------------------
// ------------------------------------------------------------

void init_timer2(void) {
TCCR2 = 0x00; // normal port operation
TCNT2 = 0x83; // set count value (131)
}

// ------------------------------------------------------------
// ---------- start timer2 ------------------------------------
// ------------------------------------------------------------

void start_timer2(void) {
cli(); // disable global interrupts
counter_1ms = 0;
TCCR2 |= 0x05; // CS02 = 1; CS01 = 0; CS00 = 1 -> clk/128
TIMSK |= (1<<TOIE2); //0x01; // enable timer overflow interrupt
sei(); // enable global interrupts
}

// ------------------------------------------------------------
// ---------- stop timer2 -------------------------------------
// ------------------------------------------------------------

void stop_timer2(void) {
cli(); // disable global interrupts
TCCR2 &= ~0x05; // stop timer
TIMSK &= ~(1<<TOIE2);//0x01; // disable timer overflow interrupt
sei(); // enable global interrupts
}

// ------------------------------------------------------------
// ---------- timer2 ISR --------------------------------------
// ------------------------------------------------------------

ISR(TIMER2_OVF_vect) { // timer2 overflow

// reload counter value high byte; 0x83 corresponds to 1ms
// clk/128 entspricht 125 kHz entspricht 8 us
TCNT2 = 0x83; // 131 bis 256 also 125 mal 8 us
counter_1ms++;

if (counter_1ms >= WHILE_1_TIME_GRID) {
stop_timer2(); // Zeitdauer unbekannt, deshalb stoppen
// Bodensensoren messen
floor_measure_iw();
//zahlausgabe(floor_mw[2]); // da kein Display!

if (floor_mw[2] < 32) { // schwarz = 0, weiß = 1023
motco_stop();
motco_update();
leds_set_status(LEDS_RED,0);
} else {
leds_set_status(LEDS_GREEN,0);
// delta_motco ms nach vorn fahren
motco_setSpeed(speed_left,speed_right);
motco_update(); // jetzt fährt er erst los!
} // end if floor
counter_1ms = 0;
start_timer2(); // alles abgearbeitet
} // end if counter
} // end ISR


/* die main */
int main() {

sei();
bot_init();
i2c_init();
leds_init();
floor_init();
init_timer2();

delay(2000); // damit er nicht gleich losrast!

motco_setSpeedParameters(5,4,6); // Empfehlung vom "Chef"

start_timer2();

while (1) {
// tu was
delay(10000);
}
return 0;
}

leilahasi
28.11.2010, 18:44
Hallo,
hab das Programm ausprobiert wo der nibo2 der line folgen soll aber irgendwie haut das nicht. Wollte ihn auf weißen Untergrund fahren lassen, also sprich so das er eben ner line folgt aber er fährt an satzweise auf ihr entlang und dann irgendwo anders hin aber nicht mehr auf ihr. Kann mir bitte jemand helfen?

Gruß Leila

Achim S.
28.11.2010, 19:53
Hallo
so wie du es beschreibst macht der Nibo nicht was du willst. Würde erst mal vorschlagen, du gibst ein paar weitere Infos bekannt. Ein Programm zum folgen einer Linie ist schon was besseres. Wie steht es den mit C? Anfänger, Fortgeschritten oder Profi? Als was würdest du dich bezeichnen? Hast du die Programme auch dem Tutorial abgetippt und ausprobiert oder sogar verstanden? Der Sinn dieser Seiten ist die Hilfe. Das bedeutet aber nicht das du alles bis ins kleinste Beschrieben und ausgearbeitet bekommst. Fast jeder von uns hat mal ganz klein angefangen und sich durch die Programmierung gelesen. Wir können dir helfen - kein Problem. Aber machen musst du es allein. Ich habe einige Programme zum Testen der einzelnen Funktionen. Dein Programm, so wie du es haben willst, steht unmittelbar vor dem Bildschirm und wartet auf dich (hat so um die 100 Tasten zur freien Auswahl).
Achim

leilahasi
28.11.2010, 20:39
Ich hab alle Programme abgetippt und auch verstanden. Bezeichnen würd ich mich als fortgeschritten mehr aber auch nicht. Das Programm zum Linienfolgen bereitet mir trotzdem ein paar Probleme und ich weiß nicht woran es liegt.

Hero_123
28.11.2010, 22:04
Hi leilahasi

Hast Du bei deinem NIBO2 auch die Bodensensoren kalibriert? Wie das geht steht u.a. im Nibo2Tutorial_20091126.pdf (von der nicai-homepage downladen), das dafür benötigte *.hex file ist bei der lib im directory hex....

dann müßte (müßte!) es funktionieren; ein funktionierendes c-file findest Du auch in http://www.roboter.cc/index.php?option=com_nicaiwci&view=project&Itemid=61&projectid=128 (sollte gemäß Workwind - da Author - funktionieren...)

Nachtrag - Du mußt das *.zip file runterladen, wenn Du es auf deinem PC kompilieren willst!

viel Glück

mfg

Hero_123

Achim S.
29.11.2010, 17:21
Hallo
deine Aussage ist recht dünn. Was macht er den oder nicht? Bekommst du Fehlermeldungen beim kompilieren? Welche Funktion soll er machen und was macht er wirklich. Wenn du das Prg verstanden hast, kannst du doch an den entsprechenden Stellen was verändern. Ansonsten kann ich nur das wiederholen was an anderer Stelle steht. " Sorry, habe gerade mein Glaskugel nicht zur Hand, " den ohne sie bin recht blind. Also Hilfe bedeutet an dieser Stelle Infos.
Achim

leilahasi
29.11.2010, 22:18
Beim Kompillieren tritt kein Fehler auf und der Roboter bewegt sich auch, d.h. er fährt einfach nur vorwärts gegen irgendwas gegen und probiert immer weiter zu fahren. Ich had dann seine Linien- und Bodensensoren nochmal konfiguriert und gehofft das es dadurch funktioniert aber auch dann hat es nicht hin gehauen.
Ich hab ihn am Sonntag das Programm zum Linienfolgen schon einmal rauf gespielt und dann hat sich der nibo2 so bewegt das er gegen was gegen gefahren ist, hat dann den rückwärtsgang rein gehauen und ist wo anders lang gefahren, bis er wieder irgendein hindernis hatte wo er gegen gefahren ist und dann hat sich das spiel wiederholt.
Ich hab jetzt im nibo2 tutorial nochmal nach geguckt und hab meine Werte des ATmega128 mit dieser Aussage verglichen.

Wählen Sie nun im angezeigtem Dialog ATmega128 aus und testen Sie die
Verbindung indem Sie Read Signature drücken.
Im Tabsheet Fuses dürfen keine Änderungen vorgenommen werden! Die
Fuse-Bits des ATmega128 sind standardmäßig auf folgende Werte
eingestellt: EXTENDED=0xFF, HIGH=0xC1, LOW=0xFF. Diese Werte dürfen
nicht geändert werden, da man sich sonst aus dem Controller aussperrt!!!

Meine Werte sind sind andere als da stehen. Könnte das damit zusammenhängen?

Achim S.
30.11.2010, 17:19
Hallo
wenn du wirklich andere Werte hast verblüfft mich das sehr. Ich kontrolliere die auch immer, das sie ja stimmen. Verlasse dich nicht auf dies Programm. Nach deiner Beschreibung läuft es nicht so richtig. Versuche selber etwas zu schreiben und die einzelnen Funktionen zu testen und dadurch zu üben. Ein fertiges Prg mit diesen Daten ist mir auch noch nicht untergekommen. Jedewr von uns Entwickelt und Probiert für sich selber aus. Mit ein bisschen Glück macht der Nibo auch das was wir wollen. Verlasse dich also auf niemand und machs selbst.
Achim

Hero_123
30.11.2010, 20:13
Hi leilahasi

wenn Deine ausgelesenen Fuse-Bits nicht stimmen, kannst Du sie im AVR-Studio doch setzen (ich nehme an, Du verwendest auch das AVRStudio); dazu mußt Du bei "Fuses" diese Fuse bits setzen, so wie sie beschrieben sind:
EXTENDED=0xFF, HIGH=0xC1, LOW=0xFF; dies kannst Du ja problemlos eingeben in der Maske und dann schreiben lassen...keine Sorge, mußte ich auch bei meinem NIBO2 machen, da waren auch andere Werte eingestellt.

Ich denke aber nicht, daß das dein Problem löst; ich vermute, daß das Programm selbst "nicht so ganz sauber ist" - ich habe auch schon bei verschiedenen Programmen Probleme gehabt, z.B. beim Programm "AvoidRC.c" - das war auch fehlerhaft....ich nehme an, Du hast auch das file von roboter.cc runtergeladen, kompiliert und auf den NIBO2 geflasht - und es fkt nicht so wie erwartet.... letzendlich bleibt einem da nichts anderes übrig, als sich durch den Code zu wühlen und versuchen, die Fehler zu finden und zu beseitigen...

Ich wollte dieses file auch schon mal testen, bin aber aus Zeitmangel nicht dazu gekommen.

wäre schön, wenn Du Bescheid geben könntest, wenn es bei dir fkt und den source code dann zur Vefügung stellen würdest....

mfg

Hero_123