Layout etwas verbreitert

So, nachdem ich jahrelang keine großen Änderungen am Blog vorgenommen habe und mir das farbliche Layout nach wie vor recht gut gefällt besteht eigentlich kein Grund zu einer Änderung.
Doch ich fand es schon immer etwas störisch, dass die Breit nur auf 940px begrenzt war. Da wirkt dann der Text immer so klein. Viele Leute haben heute ja große Auflösungen von 1920 x 1080 bzw. selbst die kleinen Billig Laptops haben mindestens 1366 x 768. Also ist immer genug Breite vorhanden.
Deshalb hab ich nun meine zweite Sidebar weggemacht und die Artikelbreite auf 790px erhöht. Die Gesamtbreite ist 100px größer und nun 1040px. Das ergibt neue Möglichkeiten. So kann ich für die Zukunft die Youtubevideos mal in einer besseren Breite darstellen lassen. Und der Beitrag wirkt nicht mehr so ellen lang. :)

Xbox und Fritzbox an einem IPv6 Anschluss betreiben

Ein Kamerad aus der Feurwehr hat schon relativ lange eine Xbox One an einem KabelBW Anschluss. Dazu hat er dann auch eine Fritzbox bekommen. Wie so ziemlich jeder moderne Internetanschluss verwendet KabelBW heutzutage auch IPv6 und via DSLite noch einen virtuellen IPv4 Zugang. Doch vor kurzem kam ja FIFA 15 heraus und das kann man so schön übers Internet spielen. Aber mit den Standardeinstellungen der Fritzbox geht dies leider nicht. :(
Die Fritzbox sperrt standardmäßig Toredo Verbindungen sobald eine IPv6 Verbindung besteht. Toredo erstellt nämlich über die Internetverbindung über einen Toredoserver eine zweite virtuelle IPv6 Verbindung ins Internet und verwendet dabei den den UDP Port 3544. Technisch gesehen braucht man bei einem IPv6 Internetanschluss eigentlich auch keine Toredo Verbindung mehr. Microsoft verwendet diese Technik aber schon seit Einführung von Windows Vista in ihrem Betriebssystem und daher natürlich auch in ihrem Xbox One System. Deshalb muss also bei der Fritzbox nun der Toredo Filter ausgeschaltet werden.

Genau das wollte ich gestern schon von Anfang versuchen. Da ich die Anleitung aber nicht mehr richtig gelesen habe und die Ansicht auf "Standard" gesetzt war, hab ich die Option die ganze Zeit nicht gefunden. Selbst ein Versuch die Ports manuell freizuschalten hat nicht funktioniert. Ein tolles Youtube Video wollte die Xbox dann sogar als Exposed Host freigeben. Damit ist die Xbox quasi direkt mit allen Ports aus dem Internet erreichbar. Mal abgesehen davon, dass ich das für höchst fragwürdig halte, hat es nicht funktioniert.

Hier also mal eine Anleitung, die funktioniert. Die Xbox wird dabei via WLAN betrieben und bekommt ihre Adresse per DHCP von der Fritzbox. Die Fritzbox war in meinem Fall eine 6340 mit KabelBW Anschluss.

Alle Funktions- und Einstellungshinweise in dieser Anleitung beziehen sich auf das aktuelle FRITZ!OS. Einige der beschriebenen Einstellungen werden nur angezeigt, wenn die "Erweiterte Ansicht" der Benutzeroberfläche (unten/mittig: ) aktiv ist.

1. Klicken Sie in der Benutzeroberfläche der FRITZ!Box auf "Internet".
2. Klicken Sie im Menü "Internet" auf "Filter".
3. Klicken Sie auf die Registerkarte "Listen".
4. Deaktivieren Sie die Option "Teredo-Filter aktiv".
5. Klicken Sie zum Speichern der Einstellungen auf "Übernehmen".

Das Ganze sollte auch einen Neustart der Xbox und eventuell eine Neuzuweisung der Netzwerkverbindung bei der Xbox One überstehen. Es ist nämlich eine grundsätzliche Einstellung der Fritzbox und keine Verbindungsspezifische Portfreigabe.

Einen (einfachen) Würfelgenerator mit Arduino bauen

Für ein Baumhausprojekt soll ich mit einigen anderen Leuten den Pfadfinder Kids etwas von Mikrocontrollern beibringen. Dazu machen wir natürlich erstmal die Standardbeispiele. LED ein und ausschalten, eine kleine Ampel und andere Dinge.
Da ich mich mit einem anderen ITler zusammen gehockt habe um etwas vorzubereiten war uns langweilig und wir wollten mal etwas eigenständiges entwickeln. Die 7 Segment Anzeige kennt ja jeder, der noch eine alten Radiowecker hat. Das tolle dabei: Man kann jeden einzelnen Strich ansteuern. Also haben wir das einfach mal gemacht und wollten einen Würfel bauen, der per Knopfdruck "zufällig" eine Zahl zwischen 1 und 6 anzeigt. Quasi die Nerd Variante für Leute, die gerne Würfelspiele spielen. :)

Das Ganze hat uns anfangs erstmal Fragen an den Kopf geworfen. Als blutiger Anfänger im Arduino Bereich könnte man ja denken, dass einfach alles in setup() und loop() untergebracht werden. Also definieren für Setup einen Anfangszustand und im loop dann die Ansteuerung vom Würfel und den Zahlen. Das fiese ist: Alles was in loop() steht wird immer von oben bis unten ausgeführt. Wenn ich dort also den Zustand des Druckknopfes abfrage wird danach trotzdem die Zufallsfunktion abgefragt. Deshalb hat der Button keine Bedeutung mehr.

Also lagern wir die Switch Anweisung mit den ganzen Zahlen in einen eigene Funktion aus und rufen diese dann nur noch auf loop() aus. Wenn man dann noch den Zustand vom Button richtig abfrägt (also beispielsweise anfangs mal den Zustand mit Seriel.println() ausliest) kann die if() Funktion auch greifen.
Unter Arduino gibt es nicht wirklich guten Zufall. Es lohnt sich aber den Zufall mit randomSeed() pseudomäßig zu verbessern. Dann kommt auch mal statt immer nur 1, 2, 3, 5 auch mal 4, 6 zum Vorschein. Mit random() wird dann der Zufall erzeugt.

Das Ganze funktioniert relativ gut. Wenn man noch die Muse hätte und ein kleines Gehäuse und einen kleinen Teensy oder arduino mini verwenden würde, hätte man einen elektronischen Würfel. Das wäre ein netter Gag für zwischendurch.

Die Sprache für Arduino ist ja hauptsächlich C und C++. Das hab ich das letzte Mal in der Berufschule gelernt und programmiert. Aber dieser Code ist mir dann doch relativ leicht gefallen. Natürlich ist es immer sinnvoll auch ein bisschen Literatur über die Bauteile zu haben. Anfangs haben wir es zusammen ausprobiert, später hab ich es alleine noch mit den Knopf hinprobiert und den Code optimiert, damit er besseren Zufall generiert und auch wirklich alle 6 Zahlen anzeigen kann. Das random(1,6) hat nämlich nicht funktioniert. Dann nimmt er nur Zahlen von 1 bis 5. Deshalb muss immer max+1 sein. Also in diesem Fall 7.
Es ist eine gute Kombination aus Anfängerbeispielen (Druckknöpfe, Werte auslesen, 7 Segment Anzeige). Und man muss etwas Verständnis von Programmiersprachen mitbringen. Ich hab in den letzten Jahren hauptsächlich VB.NET Programme geschrieben. Aber auch dort ist es ja ähnlich. Man hat Funktionen die man mit Inhalt füttern kannn und bekommt hinterher wieder etwas zurück. Der einzige Unterschied zwischen Rechnern und dem Arduino ist: Das Fehlen eines grafischen User Interfaces. Doch das macht genau den Reiz aus, man kann wieder neue Dinge überlegen. Eine LED als Status oder ein Button als Eingabe Taste. Und man muss wieder diese ; setzen, sonst meckert der Compiler. äöü in Variablen Namen mag der Compiler auch nicht. Das hab ich erst gestern wieder gemerkt, als wir die Ampelschaltung nachgebaut haben. :) Ich hätte es ja noch wissen können, aber es macht einfach Spaß Fehler zu machen und dann hinterher die Hand an die Stirn zu klatschen!

Anbei noch der Code mit Kommentaren zum Nachbauen.

//Programm um per Knopfdruck eine Zahl zwischen 1 und 6 zu bekommen.
//Die Zahl muss explizit an eine eigene Funktion übergeben werden.
//Andernfalls läuft der Controller andauernd alle Zahlen durch und ignoriert
//den Zustand des Buttons.

//Ersteller: Daniel Pfeil und Tobias Aichele
//Datum: 31.01.2015

//Button muss auf GND und 5V angeschlossen werden.
//Zwischen Button und 5V muss ein 10k Widerstand rein.
//Button auf Pin 1

//7Segment Anzeige
//oben (links nach rechts)
// 10 9 8 7 6
// Pin 8 mit 220 Widerstand auf GND
// 7Segment Pin --> Arduino
// 10 --> 11
// 9 --> 10
// 7 --> 8
// 6 --> 7
//
// unten (links nach rechts)
// 1 2 3 4 5
// Pin 3 bleibt leer
// 7Segment Pin --> Arduino
// 1 --> 2
// 2 --> 3
// 4 --> 5
// 5 --> 6

//Pins der 7 Segment Anzeige
int a=8;
int b=7;
int c=5;
int d=3;
int e=2;
int f=10;
int g=11;
int dp=6;

//Pin vom Druckknopf
int pinButton=1;

void randomNumber(int number)
{
  switch (number)
  {
    case 1:
    digitalWrite(a,LOW);
    digitalWrite(b,HIGH);
    digitalWrite(c,HIGH);
    digitalWrite(d,LOW);
    digitalWrite(e,LOW);
    digitalWrite(f,LOW);
    digitalWrite(g,LOW);
    digitalWrite(dp,LOW);
    break;
       
    case 2:
    digitalWrite(a,HIGH);
    digitalWrite(b,HIGH);
    digitalWrite(c,LOW);
    digitalWrite(d,HIGH);
    digitalWrite(e,HIGH);
    digitalWrite(f,LOW);
    digitalWrite(g,HIGH);
    digitalWrite(dp,LOW);
    break;
       
    case 3:
    digitalWrite(a,HIGH);
    digitalWrite(b,HIGH);
    digitalWrite(c,HIGH);
    digitalWrite(d,HIGH);
    digitalWrite(e,LOW);
    digitalWrite(f,LOW);
    digitalWrite(g,HIGH);
    digitalWrite(dp,LOW);
    break;
       
    case 4:
    digitalWrite(a,LOW);
    digitalWrite(b,HIGH);
    digitalWrite(c,HIGH);
    digitalWrite(d,LOW);
    digitalWrite(e,LOW);
    digitalWrite(f,HIGH);
    digitalWrite(g,HIGH);
    digitalWrite(dp,LOW);
    break;
       
    case 5:
    digitalWrite(a,HIGH);
    digitalWrite(b,LOW);
    digitalWrite(c,HIGH);
    digitalWrite(d,HIGH);
    digitalWrite(e,LOW);
    digitalWrite(f,HIGH);
    digitalWrite(g,HIGH);
    digitalWrite(dp,LOW);
    break;
       
    case 6:
    digitalWrite(a,HIGH);
    digitalWrite(b,LOW);
    digitalWrite(c,HIGH);
    digitalWrite(d,HIGH);
    digitalWrite(e,HIGH);
    digitalWrite(f,HIGH);
    digitalWrite(g,HIGH);
    digitalWrite(dp,LOW);
    break;
  } //Ende switch
} //Ende setup()

void setup()
{
  digitalWrite(a,LOW);
  digitalWrite(b,LOW);
  digitalWrite(c,HIGH);
  digitalWrite(d,LOW);
  digitalWrite(e,HIGH);
  digitalWrite(f,LOW);
  digitalWrite(g,LOW);
  digitalWrite(dp,LOW);
  pinMode(pinButton, INPUT);
  randomSeed(analogRead(0)); //Anlog Pin 0 ist nicht angeschlossen
  //Generiert etwas besseren Zufall
}

//Variablen für loop()
int zufall;
int buttonstate = 0;

void loop()
{
  buttonstate = digitalRead(pinButton);
 // Serial.println(buttonstate);

    if (buttonstate == LOW)
    { 
    zufall = random (1,7); //min: 1 ; max: 7-1 =6
    randomNumber(zufall);
    delay(500);
    }
} //Ende loop
//Programm fertig.

//Falls man alle 6 Zahlen hintereinander ausgeben möchte:
//  //Gebe alle Zahlen von 1 bis 6 aus.
//Delay macht Sinn um eine kurze Pause zwischen den einzelnen Zahlen zu haben.
//
//delay(500);
//  
////   case 1:
//digitalWrite(a,LOW);
//digitalWrite(b,HIGH);
//digitalWrite(c,HIGH);
//digitalWrite(d,LOW);
//digitalWrite(e,LOW);
//digitalWrite(f,LOW);
//digitalWrite(g,LOW);
//digitalWrite(dp,LOW);
//
//delay(500);
//
////   case 2:
//digitalWrite(a,HIGH);
//digitalWrite(b,HIGH);
//digitalWrite(c,LOW);
//digitalWrite(d,HIGH);
//digitalWrite(e,HIGH);
//digitalWrite(f,LOW);
//digitalWrite(g,HIGH);
//digitalWrite(dp,LOW);
//
//delay(500);
//
////   case 3:
//digitalWrite(a,HIGH);
//digitalWrite(b,HIGH);
//digitalWrite(c,HIGH);
//digitalWrite(d,HIGH);
//digitalWrite(e,LOW);
//digitalWrite(f,LOW);
//digitalWrite(g,HIGH);
//digitalWrite(dp,LOW);
//
//delay(500);
//
////   case 4:
//digitalWrite(a,LOW);
//digitalWrite(b,HIGH);
//digitalWrite(c,HIGH);
//digitalWrite(d,LOW);
//digitalWrite(e,LOW);
//digitalWrite(f,HIGH);
//digitalWrite(g,HIGH);
//digitalWrite(dp,LOW);
//
//delay(500);
//
////   case 5:
//digitalWrite(a,HIGH);
//digitalWrite(b,LOW);
//digitalWrite(c,HIGH);
//digitalWrite(d,HIGH);
//digitalWrite(e,LOW);
//digitalWrite(f,HIGH);
//digitalWrite(g,HIGH);
//digitalWrite(dp,LOW);
//
//delay(500);
//
////   case 6:
//digitalWrite(a,HIGH);
//digitalWrite(b,LOW);
//digitalWrite(c,HIGH);
//digitalWrite(d,HIGH);
//digitalWrite(e,HIGH);
//digitalWrite(f,HIGH);
//digitalWrite(g,HIGH);
//digitalWrite(dp,LOW);
//  
//delay(2000);