Shop

Montag, 27. August 2012

Arduino Roboter

IMG_0802

Nun habe ich endlich mein neues Spielzeug erhalten und musste auch gleich damit beginnen einen “LineFollower” zu basteln. Hier mal ein Video vom fertigen Roboter:

Roboter

schema

Schematischer Aufbau

Und anschließend noch der Code:


//motor RIGHT connected between A01 and A02
//motor LEFT connected between B01 and B02

int STBY = 10; //standby

//Motor A
int PWMA = 3; //Speed control 
int AIN1 = 9; //Direction
int AIN2 = 8; //Direction

//Motor B
int PWMB = 5; //Speed control
int BIN1 = 11; //Direction
int BIN2 = 12; //Direction

int RIGHT = 2;
int LEFT = 1;
int QRE1113_LEFT = 2;
int QRE1113_RIGHT = 4;
int schwellwert = 400;
void setup(){
  pinMode(STBY, OUTPUT);

  pinMode(PWMA, OUTPUT);
  pinMode(AIN1, OUTPUT);
  pinMode(AIN2, OUTPUT);

  pinMode(PWMB, OUTPUT);
  pinMode(BIN1, OUTPUT);
  pinMode(BIN2, OUTPUT);
  
  Serial.begin(9600);
  stop();
  delay(5000);
}

void loop(){
  // Lesen der Sensorwerte
  Serial.println("--");  
  int QRE_Value_LEFT = readQD(LEFT);
  Serial.println(QRE_Value_LEFT); 
  int QRE_Value_RIGHT = readQD(RIGHT);
  Serial.println(QRE_Value_RIGHT);  
  // Falls beide Sensoren schwarzen Untergrund liefern geradeaus
  // fahren
  if(QRE_Value_LEFT >= schwellwert && QRE_Value_RIGHT >= schwellwert)
  {
    Serial.println("forward");
    move(LEFT, 200, 1);
    move(RIGHT, 200, 1);
  } else if (QRE_Value_LEFT < schwellwert && QRE_Value_RIGHT< schwellwert) {
    stop(); // Überarbeiten
    if(QRE_Value_LEFT<QRE_Value_RIGHT){
      Serial.println("sharp RIGHT");
      while(readQD(RIGHT)<schwellwert) {
        move(LEFT, 150, 1);
        move(RIGHT, 150, 0);
      }
    } else {
      Serial.println("sharp LEFT");
      while(readQD(LEFT)<schwellwert) {
        move(LEFT, 150, 0);
        move(RIGHT, 150, 1);
      }
    }
    stop();
  } else {
    if(QRE_Value_LEFT<QRE_Value_RIGHT){
      Serial.println("RIGHT");
      move(RIGHT, 100, 1);
      move(LEFT, 200, 1);
    } else {
      Serial.println("LEFT");
      move(LEFT, 100, 1);
      move(RIGHT, 200, 1);
    }
  }
  delay(5);
}
int readQD(int motor){
  //Returns value from the QRE1113 
  //Lower numbers mean more refleacive
  //More than 3000 means nothing was reflected.
  int QRE1113_Pin = QRE1113_RIGHT;
  if(motor == LEFT){
    QRE1113_Pin = QRE1113_LEFT;
  }
  pinMode( QRE1113_Pin, OUTPUT );
  digitalWrite( QRE1113_Pin, HIGH );
  delayMicroseconds(10);
  pinMode( QRE1113_Pin, INPUT );

  long time = micros();

  //time how long the input is HIGH, but quit after 3ms as nothing happens after that
  while (digitalRead(QRE1113_Pin) == HIGH && micros() - time < 3000);
  int diff = micros() - time;
  pinMode( QRE1113_Pin, OUTPUT );
  digitalWrite( QRE1113_Pin, LOW );
  return diff;
}

void move(int motor, int speed, int direction){
  //Move specific motor at speed and direction
  //motor: 0 for B 1 for A
  //speed: 0 is off, and 255 is full speed
  //direction: 0 clockwise, 1 counter-clockwise
  digitalWrite(STBY, HIGH); //disable standby

  boolean inPin1 = LOW;
  boolean inPin2 = HIGH;

  if(direction == 1){
    inPin1 = HIGH;
    inPin2 = LOW;
  }

  if(motor == LEFT){
    digitalWrite(AIN1, inPin1);
    digitalWrite(AIN2, inPin2);
    analogWrite(PWMA, speed);
  }else{
    digitalWrite(BIN1, inPin1);
    digitalWrite(BIN2, inPin2);
    analogWrite(PWMB, speed);
  }
}

void stop(){
  //enable standby  
  digitalWrite(STBY, LOW);
  move(LEFT, 0, 1);
  move(RIGHT, 0, 1);
}

Donnerstag, 29. März 2012

Mockito: Mock a JspWriter

How to Mock a JspWriter to move the appended text to a StringBuilder?



Here we are :-)

Groovy: Analyse Accesslogs

Analyse access logs with groovy. Compare a special behaviour on two different files.
 pattern = ~/.*\\/(.*\.jsp).*/  
 data = new HashMap()  
 calculate("c:/P7_ARCTIS_access_log.2012_01_31%2336[1]", 0);  
 calculate("c:/P7_ARCTIS_access_log.2012_03_23%2336[1]", 1);  
 def calculate(filename, i) {  
   def file = new File(filename);  
   file.eachLine{line ->  
     if(line.contains(".jsp")) {  
       m = line=~pattern  
       def jsp = m[0][1]  
       if(!data.containsKey(jsp)) {  
         data.put(jsp, [0,0]);  
       }  
       int[] werte = data.get(jsp);  
       werte[i] = werte[i]+1;  
       data.put(jsp, werte);  
     }  
   }  
 }  
 println data  
Here we are!

Donnerstag, 16. Februar 2012

Technologischer Sex-Appeal

In der Entwicklung arbeiten wohl immer unterschiedlichste Charaktere, und so sagte mir unlängst ein Kollege, er hätte sich in einer Firma als Java Entwickler beworben, nun ist er jedoch Cobol Entwickler geworden. Er ist froh, dass er dort gelandet sei.
Gerade Unternehmen müssen bei Ihren Produkten den Fokus auf die Nachhaltigkeit ihrer Produkte legen. Nachhaltigkeit ist jedoch in der Softwareentwicklung ein dehnbarer Begriff. Oft mach es hier einen Unterschied in welcher Brache man sich bewegt. Schreibt man Software für mobile Endgeräte, kann es schon vorkommen, dass man die Software nicht nur einmal implementiert. Dabei würde man die Nachhaltigkeit in den Konzepten und in Programmiersprachen unabhängigen Algorythmen suchen. Bei Legacy Anwendungen würde man die Nachhaltigkeit dann wohl eher in der Änderbarkeit oder Wartbarkeit vermuten.
Aber gerade bei Legacysystemen kann es vorkommen, dass ein und das selbe Stück Code während seiner Lebensdauer von verschiedensten Personen angegriffen werden muss. Wie kann man dann Mitarbeiter dazu motivieren sich immer wieder in ältere Codeartefakte einzuarbeiten und diese zu verändern.
Es zeigt sich, dass diese Bereitschaft mit der Zeit einfach sinkt. Es werden immer wieder neue Technologien entwickelt, Sprachen werdern vereinfacht bzw. wieterentwickelt, auch die Entwicklungsprozesse entwickeln sich weiter. Es fängt schon bei so banalen Dingen wie einem Sourcerepository an, wo auch schon der Zahn der Zeit nagt.
Potentielle Bewerber suchen sich Ihren Job nicht mehr nur nach den Sozialen- und Intrinsischen- Merkmalen eines Unternehmens aus, nein es spielt mittlerweilen auch schon viel mehr der Technologischesexappeal des Unternehmens eine Rolle.
Wie siehts mit Ihrem Sex-Appeal aus?

Donnerstag, 27. Oktober 2011

Spielräume

Spielräume Spielräume brauchen wir um kreativ zu sein. Spielräume bedeuten jedoch nicht, dass man nicht geführt wird, genau so wenig wie Führung heisst, dass man keine Spielräume haben kann.

"Um großangelegte Veränderungen umzusetzteen, müsste darüberhinaus ein breiter Konsens zwischen unterschiedlichen Interessensgruppen gefunden werden. Dafür sind sowohl Visionen als auch eine charismatische Führung notwendig."

Tom DeMarco spielräume

Mittwoch, 26. Oktober 2011

Strategic Decisions

Strategische Entscheidungen zeichnen sich nicht dadurch aus, dass sie unbedingt sehr schwierig sind, aber sie haben einen großen Impact für folgenden Aktivitäten.

Einmal getroffen sind sie oft schwer zu ändern.

Dienstag, 25. Oktober 2011

Führung

"Führung ist Dienstleistung am Mitarbeiter." Unbekannt

Oft sieht es so aus als ob unsere Manager immer nur gut Laune haben, um 16:00 aus dem Büro verschwinden. Aber meist ist die Führung am besten die man kaum merkt, und trotzdem spürt. "Ich weiß nicht was da so besonders war, aber es hat Spaß gemacht und funktioniert."