Seit heute morgen steht die erste offizielle Bibliothek (C/C++) für den Roboterbausatz Nibo zum Download bereit:
https://sourceforge.net/project/show...kage_id=239101
Zur Beachtung: Mit AVR Studio (kostenlos bei Atmel) Version 4.12 unbedingt das Service Pack verwenden (ansonsten hängt sich der Compiler/Linker aus unerklärlichen Gründen auf), noch besser ist es, die aktuelle Version 4.13 einzusetzen. Diese zeigt zusätzlich den durch das Programm belegten Speicherplatz im ATmega128 an.
Zum Eingewöhnen eine erste Firmware für den Nibo:
Code:
#include <avr/interrupt.h>
#include "nibo/niboconfig.h"
#include "nibo/delay.h"
#include "nibo/pwm.h"
#include "nibo/display.h"
#include "nibo/bot.h"
#include "nibo/gfx.h"
#include "nibo/bot.h"
#include "nibo/gfx.h"
#include "nibo/leds.h"
int main()
{
sei(); // enable interrupts
bot_init();
leds_init();
pwm_init();
display_init();
gfx_init();
leds_set_displaylight(600);
gfx_move(10,10);
gfx_print_text("Nibo sagt:", 0);
gfx_move(10,30);
gfx_print_text("Hallo Welt!", 0);
int i,j;
for(i=0;i<10;++i)
{
for(j=0;j<6;++j)
{
leds_set_status(LEDS_RED,j);
delay(500);
}
leds_set_headlights(256);
for(j=0;j<6;++j)
{
leds_set_status(LEDS_ORANGE,j);
delay(500);
}
leds_set_headlights(512);
for(j=0;j<6;++j)
{
leds_set_status(LEDS_GREEN,j);
delay(500);
}
leds_set_headlights(1024);
}
while(1);
return 0;
}
Die sechs Status-LEDs sind von 0 bis 5 nummeriert, wie man es analog einem C-Array erwartet. Solche Feinheiten finde ich z.B. wichtig, damit die Programmierung intuitiv auf Anhieb gelingt. Das helle vorne sind die beiden "Scheinwerfer" ( vgl. http://www.nicai-systems.de/images/niboAtNight_320.jpg ), die die daneben liegenden Status-LEDs im Dunkeln überstrahlen.
Bild hier
Ich kann den Nibo nur mit Grafikdisplay empfehlen. Gerade die Initializer-Software, die die beiden ATtiny44 mit Firmware und den ATmega128 mit Testsoftware versorgt, visualisiert für erste Prüfungen nach dem Aufbauen wichtige Messdaten zu Odometrie, Abgrund- und Liniensensoren, fünffache IR-Abstandsmessung (nach vorne und zur Seite) und RC5-Codes.
Für wenige Daten ist dies einfach bequemer und autonomer als die IR-Kopplung an einen PC mit Terminal-Software.
Was mir gut gefällt, ist die einfache Textausgabe auf dem internen "Terminal". Das ist anfängergerecht.
Man kann die Funktionen gfx_move(...) und gfx_print_text(...) auch in eine WinAPI-analoge Funktion umbauen:
Code:
void textout(int x, int y, char* str, int ft)
{
gfx_move(x,y);
gfx_print_text(str,ft);
}
Das erleichtert bei mehrzeiligen Ausgaben die Übersicht im Programm.
Eine detaillierte Untersuchung der Programmiermöglichkeiten werde ich hier beschreiben: http://www.henkessoft.de/Roboter/Nibo.htm
Hier noch ein Beispiel zur Ausgabe der Batteriespannung:
Code:
#include <avr/interrupt.h>
#include "nibo/niboconfig.h"
#include "nibo/delay.h"
#include "nibo/pwm.h"
#include "nibo/display.h"
#include "nibo/leds.h"
#include "nibo/bot.h"
#include "nibo/gfx.h"
#include "nibo/bot.h"
/*
float round(float zahl, int stellen)
{
float v[] = { 1, 10, 1e2, 1e3, 1e4 };
return floor(zahl * v[stellen] + 0.5) / v[stellen];
}
*/
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';
}
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 Init(void)
{
sei(); // enable interrupts
bot_init();
leds_init();
pwm_init();
display_init();
gfx_init();
}
int main()
{
Init();
leds_set_displaylight(1000);
float Ubatt = SupplyVoltage();
char text[6];
float2string(Ubatt,2,text);
textout(4,10,"Versorgungsspannung:",0);
textout(4,24,text,0);
textout(60,24,"Volt",0);
while(1);
return 0;
}
Beim Flashen mit dem STK500 sieht man mit diesem Programm die von diesem Board anliegende Spannung, da das Programm nach dem Flashen sofort startet: 4,70 Volt
Die Spannung des Nibo liegt mit geladenen Akkus über 10 Volt. [/code]
Lesezeichen