westerholt.me

Category: Devel (page 1 of 2)

QtCreator ToDo Plugin

Bisher habe ich hauptsächlich mit Eclipse als IDE gearbeitet, da diese Plugins für fast alle Sprachen bietet und ich so immer eine ähnliche Umgebung habe. Vor einiger Zeit habe ich mich jedoch mit dem C++ Framework QT angefreundet und das lässt sich leider nicht so leicht in Eclipse integrieren. Zumindest dann nicht, wenn man den UI Designer von QT nutzen möchte.

Da ich mein System häufiger wechsle oder neu installiere, ist mir eine einfache Einrichtung dann wichtiger gewesen als eine einheitliche IDE, daher verwende ich für QT nun den mitgelieferten QtCreator.

Leider habe ich da anfangs eine tolle Funktion von Eclipse vermisst. Dort konnte man nämlich gleich im Code in den Kommentaren Aufgaben notieren, die dann besonders hervorgehoben wurden. Per Zufall habe ich nun entdeckt, dass es dafür für QtCreator auch ein Plugin gibt, welches nur in den Einstellungen unter Hilfe > Plugins > Todo aktiviert werden muss.
QtCreator ToDo PluginNun können im QtCreator auch folgende Kommentare für die Kennzeichnung verwendet werden:

//TODO: Eine Aufgabe
//WARNING: Eine Warnung
//NOTE: Eine Notiz
//FIXME: Das muss noch gefixed werden
//BUG: Hier tritt ein Fehler auf

Die einzelnen Schlüsselworte können in den Einstellungen auch noch nach den eigenen Bedürfnissen angepasst werden. Ich finde das ungemein praktisch. So kann ich mir gleich im Code Notizen machen, die ich dann über die Hervorhebung und die mögliche Filterung schnell wiederfinde und dann weiter bearbeiten kann.

nRF24L01+ Modul

Für wenige Euros bekommt man das nRF24L01+ Modul von Nordic Semiconductor. Dieses eignet sich hervorragend für einfache Funkübertragungen in Bastelprojekten. Für die Verwendung sind zwei Dinge zu beachten, ansonsten kann das ziemlich nervig und Zeitraubend werden.

1. Richtig Verkabeln :)
Für den Preis war es wohl nicht möglich die Pinbelegung mit auf die Platine zu drucken. Einzig den GND Pin kann man so erkennen. Der Rest wird angeschlossen wie im folgenden Foto gekennzeichnet.

Grafik zur Verdeutlichung der Pinbelegung

2. 10µF Elko verwenden
Wenn der nRF24L01+ mit einem Arduino verwendet wird, reicht der Strom nicht für die Spitzen beim Senden. Die Folge ist eine äußerst geringe Reichweite oder gar keine Reichweite. Zwischen VCC und GND des nRF24L01+ muss ein Kondensator parallel geschaltet werden um die Stromspitzen auszugleichen. 10µF funktionierten bei mir immer sehr gut.

Vielleicht ersparen die Hinweise dem ein oder anderen etwas Zeit und Nerven :)

P.S.: Den nRF24L01+ nur an 3.3V betreiben, nicht 5V!

Lego Mindstorm Linefollower

Während der Java Vorlesung haben wir zu Übungszwecken einen Lego Mindstorm Roboter programmiert. Ziel war es einen Linefollower zu basteln, der einer weißen Linie auf dunklem Grund folgt bis ein Hindernis auftaucht und dann auf schnellstem Weg zu seinem Startpunkt zurückkehrt. Leider ist das ganze wohl aufgrund der Motoren ziemlich ungenau. Aber im wesentlichen tut das Programm was es soll, daher stelle ich es hier einmal rein.

package de.tilda;

import lejos.nxt.Button;
import lejos.nxt.LCD;
import lejos.nxt.LightSensor;
import lejos.nxt.Motor;
import lejos.nxt.SensorPort;
import lejos.nxt.UltrasonicSensor;
import lejos.robotics.localization.OdometryPoseProvider;
import lejos.robotics.navigation.DifferentialPilot;
import lejos.robotics.navigation.Navigator;
import lejos.robotics.navigation.Pose;
import lejos.robotics.navigation.Waypoint;

public class MaTilda {
	/* sensors, motors and co. */
	final static LightSensor light 			= new LightSensor(SensorPort.S1);
	final static UltrasonicSensor sonic 	= new UltrasonicSensor(SensorPort.S3);
	final static DifferentialPilot pilot 	= new DifferentialPilot(5.6f,10.1f,Motor.A, Motor.C);
	final static Navigator nav 				= new Navigator(pilot);
	
	/* calibration parameters */
	final static long ITERATION_TIME 	= 100;
	final static int SPEED 				= 180;        
    final static int THRESHOLD 			= 45;    
	
    
    
	public static void main(String[] args) {
		LCD.drawString("Startup ...", 0, 0);

		pilot.setRotateSpeed(SPEED);
		OdometryPoseProvider opp = new OdometryPoseProvider(pilot);
	    Pose pose = opp.getPose();
	    
        boolean lastSweepRight = true;
		int sweep;
		int count = 1;
		
		LCD.drawString("Press ANYKEY to START", 0, 0);
		Button.waitForAnyPress();
		try { // wait a second to remove hand from brick
			Thread.sleep(1000);
		} catch (InterruptedException e1) {}
		
		
		LCD.drawString("Begin to move ...", 0, 2);
		while(true) {
			// on-line-move-forward
			if (light.readValue() >= THRESHOLD) {
				pilot.forward();
				count++;
				pilot.setRotateSpeed(SPEED*(1+count/20));
			} else { // not-on-line-do-correction
				boolean whiteAgain = false;
				count = 1;
		        sweep = 4;
		        
		        pilot.setRotateSpeed(SPEED*(1+count/20));

    			if  (!lastSweepRight) sweep*=-1;
			
    			while (!whiteAgain) { // again on white
    				pilot.forward();
    				try {
						Thread.sleep(20);
					} catch (InterruptedException e) {
						e.printStackTrace();
					}
    				pilot.rotate(sweep,true);
    				while (pilot.isMoving()) { 
    					if (light.readValue() >= THRESHOLD) {
                       	    whiteAgain=true;
                       	    pilot.setRotateSpeed(SPEED*(1+count/20));
                       	    
                           	lastSweepRight = (sweep > 0);
    						break;
                        }
    				}
    				sweep *= -2;
    			}
    			pilot.forward();
            }
            
			// stop when books ahead
			LCD.drawString(pilot.getRotateSpeed()+"", 0, 7);
			if (sonic.getDistance() < (10 * pilot.getRotateSpeed()/SPEED) ) {
				LCD.drawString("Detect something, going home ...", 0, 3);
				// this is a q&d hack: when robot turns with fullspeed the precision is worst, so we reduce speed for rotating
				pilot.stop();
				try {
					Thread.sleep(2000);
				} catch (InterruptedException e) {}
				pilot.setRotateSpeed(SPEED);
				nav.goTo(new Waypoint(pose.getX(), pose.getY()));
				try {
					Thread.sleep(1100);
				} catch (InterruptedException e1) {}
				nav.stop();
				pilot.setRotateSpeed(SPEED*2);
				nav.goTo(new Waypoint(pose.getX(), pose.getY()));
				
				
				Button.waitForAnyPress();
				LCD.drawString("FINISH", 0, 4);
				System.exit(0);
			}
		}
	}
}

Source Code Art

Source Code Grafik

Eben entdeckt: Instacod.es

Da kann man seinem Source Code ein paar Effekte verpassen und sich das ganze als hübsche Grafik ausgeben lassen.

Für Blog Bildchen schonmal ganz hübsch :)

Apache Port-Based vHost für Entwicklung

Für die Entwicklung von WebApps richtig nützlich: Port-Based vHosts vom Apache Server. Jedes Projekt erhält einen eigenen vHost mit eigenem Port. Somit hat auch jedes Projekt seinen eigenen DocumentRoot, was zumindest bei PHP Entwicklung irgendwann unabdingbar wird. Der DocumentRoot kann (natürlich nur in der lokalen Entwicklung) direkt auf den workspace verweisen, was zusätzliches deployen erspart.

Und so gehts:

Listen 8010

NameVirtualHost *:8010

<VirtualHost *:8010>
ServerName projekt.de
DocumentRoot /home/xeon/Development/workspace/Projekt
</VirtualHost>

Olderposts

Copyright © 2021 westerholt.me

Up ↑