C++Guns – RoboBlog blogging the bot

19.08.2010

webcamviewer

Filed under: programmieren — Tags: — Thomas @ 13:08

Wer kennt das nicht, man will nur mal schnell mit der Webcam ein Bild machen.

Also startet man das beste Programm aller Zeiten dafür: xawtv [1] Der Author dieses Programmes benutzte nämlich nicht v4l (Video for Linux), sondern entwickelte seine eigenen Funktionen. Das hatte den Vorteil, dass dieses Programm wirklich immer, auch bei den schrottigsten Webcams ein Bild lieferte. Alle anderen Programme versagten. Was zugegeben an den teilweise schlechten Webcamtreibern liegt.

Aber die goldenen Zeiten nähren sich ihrem Ende. xawtv wird schon lange nicht mehr weiter enwickelt. Und mit der neusten Kernel (2.6.35.2) bekomme ich zwar ein Bild, kann es aber nicht mehr abspeichern.

Aber man kann sich ja selbst helfen. Anstatt irgendein doofes Programm zu suchen, welches überladen ist, zu lange braucht beim starten, zu kompliziert zu bedienen ist oder Probleme mit der Webcam hat, habe ich mir einfach mein eigenens geschrieben.

Mein Programm mit dem simplen Namen "webcamviewer" benutzt OpenCv um an die Bilder der Kamera zu kommen. Man startet das Programm, bekommt sofort ein Livestream der Kamera und mit der Taste "j" wird ein jpg Bild abgespeichert mit passenden Timestamp als Dateiname. Einfacher gehts nun wirklich nicht mehr :)

webcamviewer-0.2.tar.gz

[1] http://linux.bytesex.org/xawtv/

28.07.2010

Komische Transparenz mit Qt

Filed under: programmieren — Tags: — Thomas @ 11:07

Wie man in Qt ein transparentes Fester programmiert, wo auch noch der Rahmen zu sehen ist, dass habe ich nicht hinbekommen. Aber dafür etwas anderes. Siehe Bild. Hier ist nochmal der Code.

QWidget *w = new QWidget();
w->resize(200,200);
QRegion maskedRegion(w->x(),
w->y(),
w->width(),
w->height(),
QRegion::Ellipse);

QRegion maskedRegion1(w->x(),
w->y(),
w->width(),
w->height(),
QRegion::Rectangle);
w->setMask(maskedRegion1.subtract(maskedRegion));
w->show();

Qt_transparenz

02.02.2010

Neuer Akku für Amee

Filed under: Amee — Thomas @ 14:02

Schon seit fast einem Jahr sind all meine Akkus mehr oder weniger kaputt. Nach fast 10 Jahren dürfen sie das auch sein.
Heute fand ich dann ein Angebot: 12V 9.5Ah für 18Eur. Natürlich sofort gekauft :)

Und solange Amee noch still steht, kann man den Akku ja für die Solaranlage nutzen. WENN denn mal wieder die Sonne scheint.

So, nun ist die neue Akku Halterung fertig

Neuer Akku

Neuer Akku

19.06.2009

werobot Part 1.2 Die H-Brücke

Filed under: werobot — Thomas @ 23:06

Build or buy the controller board

Nachdem nun endlich mein Oszilloskope endlich gekommen ist, habe ich mir mal die H-Brücke genauer angesehen und getestet. Eigentlich funktioniert sie perfekt. Die Mosfets schalten ordentlich durch und werden nicht warm. Keine Ahnung warum sie das letzte mal heiß wurden. Eine kalte Lötstelle gab es, aber die sollte nicht so schlimm gewesen sein.

Ich habe noch ein paar Shunt Widerstände eingebaut, damit man auch mal den Strom der Motoren messen kann, aber das ist momentan nicht weiter wichtig.

Hier ist noch der Schaltplan: http://ichlebe.aufdemmond.de/calle/h-bridge/hb_12V_10A.png

Und hier ein Video robotest1.avi

PS. Das Oszi ist toll :D

11.05.2009

Amee extended

Filed under: Amee — Thomas @ 09:05

Ferb, i know what we gonna do today!
Wir erweitern Amee um zwei Ebenen nach oben. Auf der untersten Ebene hat nach wie vor die Spannungsversorgung, H-Brücke und Motorkontroller platz. Auf die mittlere Ebene kommt der Servo- und Sensorkontroller. Ganz oben hat das Netbook seinen Platz.

Ein Netbook auf dem Roboter bringt einige Vorteile. Es hat eine integrierte Kamera für diverse Bildverarbeitungs Aufgaben mit genug Rechenpower. Ausreichend Speicherplatz für alle Sensordaten und abgefahrene Wege um z.b. eine "Landkarte" zu erstellen. WLAN für die Fernsteuerung und Live Kamerabild. Der Akku hält mindestens 4h und es wiegt kaum mehr als 1kg.

Alle beiden Ebenen sind seitlich auf klappbar damit man an die unten liegenden Platinen kommt. Der Aufbau hat das ganze Wochenende gedauert. Insgesamt sind jetzt mehr als 160 Schrauben, Mutter und Unterlegscheiben, und 7m Alu Profil verbaut.

Als nächstes muss ich die Akku Halterung montieren und die H-Brücke überarbeiten. Die wird aus irgendeinem Grund auch bei geringer Last ziemlich heiß.

Bilder gibts dann auch

12.04.2009

whois easteregg patch

Filed under: programmieren — Thomas @ 22:04

Da mir gerade langweilig ist, hab ich mir selbst ein Eastergg in whois eingebaut:

--snip--
$whois 127.0.0.1
I hacked 127.0.0.1!
--snap--

--patch--
diff whois_patch.c whois-4.7.32/whois.c
75,80d74
< if(strstr(argv[1],"127.0.0.1")) < { < printf("I hacked 127.0.0.1!\n"); < return 0; < } < --hctap--

30.12.2008

atoull atoul

Filed under: programmieren — Thomas @ 18:12

Erschreckend musste ich heute feststellen, dass die libc gar keine atoull Funktion mitbringt, sondern nur eine atoll. Das Problem lässt sich aber einfacher lösen als gedacht. Hier die Funktion in zwei Varianten.

void atoull(char *s, unsigned long long *n)
{
*n = 0;
while ('0' <= *s && *s <='9')
*n = (*n)*10 + *s++ - '0';
}

unsigned long long atoull(char *s)
{
unsigned long long n = 0;
while ('0' <= *s && *s <='9')
n = n*10 + *s++ - '0';
return n;
}

void atoul(char *s, unsigned long *n)
{
*n = 0;
while ('0' <= *s && *s <='9')
*n = (*n)*10 + *s++ - '0';
}

unsigned long atoul(char *s)
{
unsigned long n = 0;
while ('0' <= *s && *s <='9')
n = n*10 + *s++ - '0';
return n;
}

Viel Spass damit :)

10.08.2008

World of Padman - release mouse patch

Filed under: programmieren — Thomas @ 09:08

Das Spiel Wolrd of Padman[1] ist ja ganz lustig. Vorallem freut mich, dass es auf Win, Mac und Linux läuft und die Source verfügbar ist. Beim spielen kann man zwsichen Fenster und Vollbild Darstellung wechseln. Im Vollbild Modus kommt man dann nur nicht mehr auf seine anderen Desktops. Und im Fenster Modus kann die Maus das Fenster nicht verlassen. Aber wir haben ja den Quelltext! Das Programm baut auf SDL auf, womit ich mich ein wenig auskennte. Die Funktion die die Maus bindet war schnell gefunden, und eine Stunde später der Patch fertig.

In der Datei code/unix/sdl_glimp.c ungefähr bei Zeile Nummer 230 sollte es dann so aussehen:

case SDLK_F8: *key = K_F8; break;
case SDLK_F9: *key = K_F9; break;
case SDLK_F10: *key = K_F10; break;
// case SDLK_F11: *key = K_F11; break;
// case SDLK_F12: *key = K_F12; break;
/*
* kater 10.08.2008
* Press F12 and the mouse can leave the window
* in non-fullscreen mode
* To restore press F11
*/

case SDLK_F11:

SDL_WM_GrabInput(SDL_GRAB_ON);
printf("Grab is On\n");
break;

case SDLK_F12:

SDL_WM_GrabInput(SDL_GRAB_OFF);
printf("Grab is Off\n");
break;

case SDLK_F13: *key = K_F13; break;
case SDLK_F14: *key = K_F14; break;
case SDLK_F15: *key = K_F15; break;

Danach einfach neu compilieren. Unter build/ befinden sich dann zwei *.i386 Dateien, welche man über die original Dateien drüberkopiert. Spiel starten, ausprobieren, freuen :)

[1] http://worldofpadman.com/

21.08.2007

Zufallsgenerator

Filed under: AVR — Thomas @ 17:08

Als ich mir eine Video-Vorlesung der Uni Tuebingen ansah, kam mir die Idee, mit einem AVR einem Zufallsgenerator zu programmieren. Als Quelle sollte der Analog-Digital Wandler (ADC)dienen, dessen Eingang in der Luft hängt. Es wird also nur das Rauschen des Wandlers und ein paar Störsignale digitialisiert. Von dem eingelesen Wert wir nur das erste Bit benutzt, also ob die Zahl grade oder ungerade ist. Nach acht Durchläufen hat man somit eine Zufallszahl mit einem Wertebereich von 0 bis 255.
Beim echten Zufall sollte sich eine Gleichverteilung einstellen. Da es 256 Mögliche Ereigniszahlen gibt, beträgt die Wahrscheinlichkeit fü eine Zahl 1/256 = 0.39%.
zufallsgleichverteilung1
Nach dem ersten Testlauf mit 39 Millionen Zufallszahlen, sah die Verteilung doch garnicht mal so schlecht aus. Aber es gibt einige Zahlen, die stark von der erwarteten WK abweichen. Darunter ist z.B. die 2 mit 0.71%, die 32 mit 0.63%, die 128 mit 0.98% und die 192 mit 0.87%. Unter binärer Betrachtungsweise fällt sofort auf, dass die Null besonderst oft vertreten ist.
2 = 00000010
32 = 00100000
128 = 10000000
192 = 11000000
Nun liegt die Vermutung nahe, dass der ADC mehr geraden Zahlen produziert als ungeraden. Ein einfacher Test bestätigt es, die Null kommt mit 0.2% häufiger vor als die Eins. Die Ursache hierfür kann nur auf Bauteiltolleranzen im ADC zurückzuführen sein. Als eine Referenzspannung vom 5V genommen wurde, anstatt 2.65V, trat die Eins nun mit 0.2% häufiger auf. Da der Mikrocontroller 6 ADC Kanäle hat, liegt die Vermutung nun nahe, durch wechseln des ADC Kanals den Fehler zu minimieren.

Gesagt, getan. Hier ist die neue Verteilung.
zufalls

Ahja, das ganze läuft auf einem ATmega8. Das Programm kann aber auf jeden beliebigen Mikrocontroller portiert werden, solange es mindestens einen ADC gibt.
Die Zufallszahlen werden über USART gesendet. Ansonsten gibt es nichts zu sagen, ausser: Macht was ihr wollt damit :)
zufallsgenerator-01.zip

06.07.2007

Roboterinterface

Filed under: programmieren — Thomas @ 08:07

In den letzten Tagen habe ich mich viel mit GTK beschäftigt und ein kleines Roboterinterface programmiert. Es dient dazu, den PID Regler auf dem AVR bequem vom PC aus einzustellen. Gleichzeitig wird die aktuelle Motorgeschwindigkeit auf einer Balkenanzeige dargestellt. Der Graph ermöglicht eine Langzeitüberwachung des PID Reglers. Noch hinzu lässt sich das Regelverhalten besser erkennen.

Roboterinterface

Older Posts »

Powered by WordPress