AdSense

Sonntag, 14. Dezember 2014

Arduino - Barometrischen Höhensensor GY-65 auslesen

(English version) Eine weit verbreitete Möglichkeit, relative Höhen zu messen ist das Benutzen eines barometrischen Höhensensors. Dieser misst einfach den Druck und aus der barometrischen Höhenformel (Wikipedia) lässt sich daraus eine Höhe bestimmen. Da der Luftdruck sehr stark vom Tag abhängt wird normalerweise an einer bekannten Höhe der Sensor kalibriert und dann die restlichen Höhen relativ zu dieser Höhe und dem dort gemessenen Druck berechnet. Das liefert Höhen mit einer Genauigkeit von bis zu 1 Meter.

Wenn man bei ebay nach GY-65 sucht, findet man den entsprechenden Sensor für ca. 5 Euro. Der Sensor hat ein normales I2C-Interface, sodass nur 2 Kabel nötig sind. Für den Arduino braucht man dann die I2Cdev Library, die gibt es hier zum runterladen. Der Quellcode an sich ist maximal simpel, zuerst wird der Sensor initialisiert, dann wird eingestellt, dass der Druck gemessen werden soll und anschließen der Druck ausgelesen und daraus die Höhe berechnet. Ein komplettes, simples Beispielprogramm sieht so aus:


#include <I2Cdev.h>
#include "BMP085.h"
#include <Wire.h>

BMP085 barometer;

double pressure;
double altitude;


void setup() {
  Wire.begin();
  
  Serial.begin(9600);
  Serial.println("starting...");
    
  //initialize the barometer
  barometer.initialize();
}

void loop()
{
  // request pressure (3x oversampling mode, high detail, 23.5ms delay).
  // Let's just wait a bit more to be sure...
  barometer.setControl(BMP085_MODE_PRESSURE_3);
  delay(30);
  // read calibrated pressure value in Pascals (Pa)
  pressure = barometer.getPressure();
  // calculate absolute altitude in meters based on known pressure
  // (may pass a second "sea level pressure" parameter here,
  // otherwise uses the standard value of 101325 Pa)
  altitude = barometer.getAltitude(pressure); 
  
  // print back the calculated altitude
  Serial.println(altitude);
  // do this every second
  delay(1000);
}

I2C OLED Display

(english version) Wer bei Ebay nach "Arduino OLED Display" sucht, stößt auf ein OLED-Display mit einer Bildschirmdiagonale von ca. 1 Zoll und einer Auflösung von 128x84 Pixel. Das Display ist für weniger als 4 Euro zu haben. Angesteuert wird es über I2C. 1 Zoll ist natürlich nicht viel, aus Interesse habe ich mir das Display aber dennoch bestellt. Damit man sich vorstellen kann, wie klein es wirklich ist, habe ich eine Münze zum Vergleich daneben gelegt:

Dank Ansteuerung über I2C ist die Verkabelung denkbar übersichtlich: neben der Spannungsversorgung sind nur zwei Kabel für den I2C-Bus nötig, das wars. Nun stellt sich natürlich die Frage: wie steuere ich das Ding an? Nach kurzer Recherche habe ich heraus gefunden, dass es sich bei dem Display um einen Nachbau des OLED-Displays mit der Bezeichnung SSD1306 von Adafruit handelt. Dafür bietet Adafruit eine fertige Arduino-Library an, welche HIER erhältlich ist. Außerdem muss die Adafruit-GFX-Library herunter geladen und installiert werden. In der Arduino IDE findet sich dann unter "Adafruit_SSD1306" das Beispiel "ssd1306_128x64_i2c". Wer dieses Beispiel nun einfach so 1:1 auf den Arduino überträgt sieht erstmal: gar nichts. Das China-Display hat eine andere I2C-Adresse wie das Original von Adafruit, daher muss in der setup()-Funktion eine kleine Änderung durchgeführt werden: die Adresse muss von 0x3D in 0x3C geändert werden. Aus
  display.begin(SSD1306_SWITCHCAPVCC, 0x3D);  // initialize with the I2C addr 0x3D (for the 128x64)
wird
  display.begin(SSD1306_SWITCHCAPVCC, 0x3C);  // initialize with the I2C addr 0x3C (for the 128x64).
Dann dann kann das Beispiel auf den Arduino übertragen werden. Ihr solltet jetzt eine kleine Demonstration der verschiedenen Funktionen der GFX-Library auf dem Display sehen. Da die Funktionen und somit auch das Beispiel sehr umfangreich sind, werde ich sie nicht im Detail erläutern. Im Prinzip sind die Funktionen im Beispiel alle selbsterklärend. Bei Unklarheiten schaut in die Header-Datei der GFX-Library, dort ist auch erläutert, welche Parameter die einzelnen Funktionen erwarten. Es gibt die Möglichkeit Text auszugeben, außerdem lassen sich Linien und diverse Formen (Rechteck, Dreieck, ...) mit und ohne Füllung zeichnen. Auch das Invertieren des Bildschirms sowie das Scrollen sind möglich.

Außerdem kann ein vordefiniertes Bitmap ausgegeben werden. Dies möchte ich kurz näher erklären:

#include <SPI.h>
#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>

#define OLED_RESET 4
Adafruit_SSD1306 display(OLED_RESET);

#define XPOS 50
#define YPOS 25
#define BITMAP_HEIGHT 16 
#define BITMAP_WIDTH  16 
static const unsigned char PROGMEM bitmap[] =
{ B00000001, B10000000,
  B00000010, B01000000,
  B00000100, B00100000,
  B00001000, B00010000,
  B00010000, B00001000,
  B00111111, B11111100,
  B00101000, B00010100,
  B00100100, B00100100,
  B00100010, B01000100,
  B00100001, B10000100,
  B00100010, B01000100,
  B00100100, B00100100,
  B00101000, B00010100,
  B00110000, B00001100,
  B00111111, B11111100,
  B00000000, B00000000 };

void setup()   {                

  display.begin(SSD1306_SWITCHCAPVCC, 0x3C);  // initialize with the I2C addr 0x3C (for the 128x64)
  
  //clear display buffer
  display.clearDisplay();
  //draw a bitmap stored in variable bitmap with given size at XPOS, YPOS in color white
  display.drawBitmap(XPOS, YPOS, bitmap, BITMAP_WIDTH, BITMAP_HEIGHT, WHITE);
  display.display();
 
}


void loop() { 
}

In diesem Beispiel zeichnen wir ein Bitmap mit einer Größe von 16x16 Pixeln. Die Größe des Bitmaps kann natürlich angepasst werden. Das Bitmap muss in einem Character-Array hinterlegt sein. Besonders wichtig ist hier bei der Deklaration das Schlüsselwort "PROGMEM". Es sorgt dafür, dass die Variable im Flash-Speicher des Arduinos abgelegt wird. Dies wird von der Library so erwartet. Im Beispiel speichern immer jeweils zwei Character in insgesamt 16 Bit den Inhalt einer Zeile. Ist ein Bit gesetzt, wird beim später Zeichnen ein Pixel gesetzt. Der Übersicht halber habe ich im Code Zeilenumbrüche eingefügt. Eine Zeile im Code entspricht nachher eine Zeile des Bitmaps. Zur Darstellung des Bitmaps wird dann der Befehl drawBitmap() aufgerufen. Als Parameter werden übergeben: die X- und Y-Position des Bitmaps, die Variable, in der das Bitmap gespeichert ist, die Breite und die Höhe des Bitmaps sowie die Farbe (WHITE oder BLACK), in der ein gesetzter Pixel dargestellt werden soll.
Das Ergebnis:

Freitag, 5. Dezember 2014

Einen Pinsel wieder anspitzen

(English version) Ein neu gekaufter Pinsel ist normalerweise sehr spitz und auch etwas hart, sodass man damit sehr gut feine Linien malen kann. Nach einer Weile fangen die Häärchen aber an, in alle Richtungen abzustehen, sodass man den Pinsel eigentlich nicht mehr benutzen kann. Um den Pinsel wieder so spitz wie am Anfang zu bekommen kann man einen ganz einfachen Trick benutzen.
Ein benutzer Pinsel mit welchem keine feinen Malarbeiten mehr möglich sind.
Zuerst wird Zuckerwasser hergestellt. Einfach Wasser und Zucker mischen und gut umrühren. Danach wird der Pinsel in die Lösung getaucht. Die Oberflächenspannung hält die Pinselhaare dann schon grob zusammen.
Pinselspitze mit Zuckerlösung. Die Haare werden von alleine zusammengehalten (Oberflächenspannung).
Um den Pinsel jetzt perfekt spitz zu bekommen streicht man ihn sehr vorsichtig ab, dadurch wird er noch spitzer. Wenn man ihn jetzt noch trocknen lässt bildet sich wieder die Spitze wie bei einem neu gekauften Pinsel. Ich benutze Pinsel der Größe 00, die gibt es meistens ganz billig (1 €) in jedem Spielwarenhandel. Wenn man den Pinsel dann entsprechend pflegt bleibt die Spitze auch so perfekt und man kann ihn nahezu unendlich lange benutzen.
Der wieder spitze Pinsel.

Samstag, 15. November 2014

Eine Einführung zu Tabletops

(English version) Da ich mich selber seit einiger Zeit mit Tabletops beschäftige, möchte ich heute eine Einführung dazu posten, ich finde nämlich dass sie die beste, spannendste und vielseitigste Art von Gesellschaftsspielen sind. Tabletops gibt es in vielen verschiedenen Welten, ich will jetzt speziell auf Fantasy eingehen. Die Situation bei Fantasy ist technologisch eine Welt im Mittelalter, wo gerade Schießpulver erfunden wurde, jedoch gibt es verschiedene Völker wie Zwerge, Elfen, Orks, Goblins, Drachen und vieles mehr. Außerdem ist hier Magie im Spiel, es gibt also z.B. Zauberer die Feuerbälle schießen können.

Ein Tabletop besteht aus Figuren welche man auf einem Tisch bzw. einer Spielplatte platziert. Bekannte Hersteller solcher Figuren sind für Fantasy z.B. Kings of War von Mantic Games, Warhammer von Games Workshop, Dwarf Wars von West Wind Productions oder Hail Caesar von Warlord Games. Ich persönlich nutze die Miniaturen von Mantic Games, da diese sehr billig sind und einige interessante Aspekte aufweisen wie z.B. Erzengel oder Dachsreiter, welche von den anderen Herstellern nicht angeboten werden.

Die Grundidee eines Tabletops ist dass zwei (oder auch mehr) Armeen sich gegenüberstehen und dann anfangen zu Kämpfen, also prinzipiell ähnlich wie z.B. die Computerspiele der Total War-Reihe.

Malen und Bauen
Wenn man nun mit Tabletops anfangen will braucht man zuerst eine Armee. Hier gibt es meist Starter-Sets, welche bei Mantic Games z.B. je nach Set eine oder zwei Armeen, Würfel und das Regelbuch beinhalten. Dieses Set besteht dann aus einzelnen Plastik-Teilen welche zusammengebaut und angemalt werden müssen. Hier gibt es dann den ersten Konfliktpunkt: Sollte man die Figuren zuerst aufbauen oder zuerst anmalen? Ich persönlich finde, dass es geschickter ist, zuerst anzumalen, wenn die Figuren bereits zusammengebaut sind kann man an manche Stellen schwieriger ankommen. Andererseits würde ich, wenn man zuerst anmalt, empfehlen, nach dem Zusammenkleben mit den entsprechenden Farben über die Klebestellen zu malen, sodass hier die Farbe durchgängig ist. Ein anderes wichtiges Argument dafür, zuerst anzumalen, ist dass ansonsten oft auch mit den zusammengebauten Figuren gespielt wird, das Anmalen aber immer weiter nach hinten verschoben wird. Dies führt dann oft dazu, dass ganze Armeen nicht angemalt sind, und das sieht wirklich erbärmlich aus. Wenn man zuerst anmalt, kann man mit den Figuren auch erst spielen, wenn alles fertig angemalt ist, daher gibt dies schon automatisch die Motivation, alles anzumalen.

Zum Zusammenkleben benutze ich den bekannten Revell Contacta Modellbaukleber, dieser ist ziemlich preiswert in jedem Spielwarengeschäft erhältlich. Farben benutze ich auch von Revell, ich habe zuerst die Email-Farben benutzt, diese weisen eine sehr gute Deckkraft (außer bei weiß) auf, sind aber eher dickflüssig und schwer zu verarbeiten, da sie nicht mit Wasser verdünnbar sind. Ich bin dann später auf die Revell Aqua Farben umgestiegen, diese lassen sich hervorragend malen und auch verdünnen, sodass man auch Maltechniken wie Tuschen ganz einfach durch das starke Verdünnen einer Farbe mit Wasser erreichen kann. Außerdem sollen die Revell Aqua Farben schneller trocknen (4 Stunden vs. 1 Stunde).

Wenn nun die Armee aufgebaut ist, kann man mit dem Spielen anfangen. Dafür braucht man noch einen Gegner mit einer Armee oder man legt sich selbst 2 Armeen zu und lässt diese dann gegeneinander kämpfen. Als Spielunterlage kann alles dienen, angefangen beim Teppich oder eine Tisch bis hin zu einer grünen Filz-Matte, speziellen Spielmatten oder modularem Gelände, wie ich es hier in diesem Blog bereits beschrieben habe. Für den Anfang reicht jedoch wirklich ein Tisch mit ein paar Platzhaltern als Gelände (ein Blatt Papier als Sumpf, ein Buch als Hügel, etc.

Spielregeln
Ich möchte nun ein wenig auf die Regeln dieser Spiele eingehen, speziell denen von Kings of War (welche hier recht weit unten auch online einsehbar sind). Grundsätzlich wird rundenbasiert gespielt, ein Spieler nach dem anderen. Jeder Spieler hat dann in seinem Zug drei Teile.

Bewegung
Zuerst werden Bewegungen ausgeführt, hier hat jede Einheit einen Bewegungs-Wert in Zoll, welcher angibt, wie weit die Einheit sich bewegen kann. Hier gibt es dann spezielle Regeln für den Angriff auf gegnerische Einheiten, welche in den Regelbüchern explizit erklärt sind.

Fernkampf
Nach dieser Bewegungs-Phase kommt die Fernkampf-Phase, hier schießen dann alle Einheiten, welche sich nicht im Nahkampf befinden. Es gibt sowohl normale Fernkampf-Infanterie als auch Artillerie und Magie, dies wird alles in dieser Runde behandelt. Nehmen wir beispielsweise Zwergen-Armbrustschützen (Ironwatch) von Kings of War. Diese haben einen Fähigkeitswert im Fernkampf (Ra) von 5+ und 10 Angriffe (At). Das bedeutet nun, dass für jeden Angriff ein Würfel geworfen wird (also nimmt man 10 Würfel in die Hand) und jedes Ergebnis welches 5 oder höher (also 5 oder 6) ist, zählt als ein Treffer. Als nächstes wird die Verteidigung des Gegner betrachtet. Diese Einheiten schießen nun z.B. auf eine Einheit aus Ork-Kriegern (Greatax), welche einen Verteidigungs-Wert (De) von 4+ haben. Man nimmt nun alle Würfel, welche getroffen haben und wirft diese erneut. Für jeden Würfel der nun 4+ (also 4 oder höher) zeigt wird der Einheit ein Punkt Schaden zugefügt. Nachdem der Schaden ausgewürfelt wurde muss getestet werden wie stark die Einheit beschädigt ist, ob sie noch kämpfen kann oder völlig zerstört ist. Dieses nennt man einen Nerve Test, welcher weiter unten beschrieben wird.

Nahkampf
Nach der Fernkampf-Phase kommt die Nahkampf-Phase. Nahkämpfe werden in der Bewegungsphase initiiert, indem man seine Einheiten in Kontakt mit feindlichen Einheiten bringt. Die Nahkampf-Phase funktioniert gleich wie die Fernkampf-Phase, nur dass der Nahkampf-Fertigkeitswert statt dem Fernkampf-Fertigkeitswert benutzt wird. Hier werden nun auch wieder Treffer und daraus der verursachte Schaden berechnet und am Ende der Nahkampf-Phase ein Nerve Test durchgeführt.

Nerve Test
Nach dem Fernkampf und nach dem Nahkampf wird ein sogenannter Nerve Test durchgeführt. Der Nerve Test entscheidet ob eine Einheit noch kämpfen kann oder stark beschädigt ist, moralisch am Ende ist oder völlig ausradiert wurde. Dazu werden zwei Würfel geworfen und zu dem Würfelergebnis der gesamte Schaden der dieser Einheit zugefügt wurde addiert. Jede Einheit hat einen Nerve-Wert (Ne), welcher aus zwei Zahlen besteht. Ist die Summe aus Würfelergebnis und Schaden größer oder gleich dem ersten Wert, so ist diese Einheit moralisch am Ende und kann in der nächsten Runde lediglich Bewegungen wie drehen oder rückwärts ausführen. Fernkampfeinheiten können in der nächsten Runde nicht schießen. Eine Runde danach ist dieser Effekt aber wieder abgeschüttelt. Falls die Summe so hoch wie der zweite Wert ist, bedeutet das, dass die Einheit vernichtet wurde. Entweder wurden alle Soldaten getötet oder sie haben die Flucht ergriffen und sich in alle Himmelsrichtungen zerstreut - diese Einheit wird nicht mehr kämpfen und wird vom Schlachtfeld entfernt.

Nach diesen Prinzipien funktioniert also ein Tabletop. Natürlich bin ich nicht auf alle Regeln einzeln eingegangen, wer also wirklich ein Tabletop spielen will sollte sich unbedingt das Regelbuch anschauen. Die verschiedenen Spiele haben teilweise verschiedene Regeln, ich persönlich mag jedoch die Regeln von Kings of War, da sie sehr einfach gehalten sind und trotzdem viel taktische Tiefer erlauben, sodass das Spiel nicht darin ausartet, Sonderregeln gegeneinander abzuwägen und ständig zum Regelbuch zu greifen.

Tabletops gibt es auch in anderen Welten, so gibt es z.B. Science-Fiction Tabletops welche nach ziemlich ähnlichen Regeln funktionieren, aber auch historische Varianten, komplett ohne Magie oder in anderen Maßstäben z.B. als Raumschiff-Schlacht oder Seeschlacht. Mir gefällt jedoch Kings of War von Mantic Games am besten, der Maßstab, also 28mm, ist ein guter Kompromiss aus Größe und der Feinheit der Figuren und ist auch der am weitesten verbreitete Maßstab an Miniaturen. Ich hoffe, ich konnte bei einigen Leuten Interesse an Tabletops wecken, sodass noch mehr Menschen diese unglaublich vielseitige und interessante Art der Gesellschaftsspiele für sich entdecken können.

Sonntag, 2. November 2014

Tabletop Gelände - Wasser

(English version) Die Grundlagen des Geländebauens sind normalerweise relativ einfach. Modell bauen, anmalen, Gras/Deko drauf. Natürlich kann hier in die Detailgestaltung unendlich viel Zeit gesteckt werden, jedoch ist das Grundprinzip klar. An was ich mich bisher nicht gewagt hatte war Wasser. Die einfachste Version von Wasser ist natürlich einfach eine Fläche blau glänzend anzumalen, fertig. Das sieht dann aber meist nicht so realistisch aus und zieht dann das komplette andere, schön gestaltete Gelände herunter.

Für Wasser gibt es einige kommerzielle Lösungen, welche ich alle nicht ausprobiert habe. Ich habe stattdessen Silikon benutzt, welches es billig, bei z.B. Obi gibt (das hier habe ich verwendet: Obi-Link). Das Ergebnis sieht ziemlich gut aus.
Beim Verarbeiten sollte man beachten, dass es sehr schnell trocknet und auch sehr an den Fingern klebt. Eine wellige Oberfläche wie sie hier zu sehen ist, ist also leicht zu erschaffen, eine glatte schon schwieriger. Außerdem sollte man beachten, dass das Silikon nicht perfekt transparent ist. Daher würde ich empfehlen, das Silikon nur für eine sehr dünne Schicht und den Wellen-Effekt zu verwenden. Wenn das Geländestück auch noch Gras haben soll, sollte dieses möglichst vor dem Silikon angebracht werden, die Grasteilchen kleben extrem am Silikon und sind kaum abzukriegen. Wer auch tiefere Gewässer damit machen möchte kann hier ein Testobjekt von mir sehen:

Das Testobjekt ist etwa 1 cm tief. Die Oberfläche ist deutlich glatter aber eine schöne Spiegelglatte Oberfläche, wie für einen See kriegt man damit nicht hin. Außerdem ist bei größeren Volumina zu beachten, dass das Silikon, wenn es mal angefangen hat zu trocken sich nicht mehr mit sich selber verbindet, dies führt an den Übergängen zu weißen Bereichen (auch hier in den Bildern zu sehen), was meines Erachtens nicht schön aussieht.
Für den Preis kann man allerdings absolut nichts gegen das Silikon sagen, kommerzielle Wassereffekte sind da doch deutlich teurer.

Tabletop Belagerungsausrüstung Teil I: Die Sturmleiter

(English version) Da ich schon erklärt habe, wie man eine Mauer und einen Turm bauen kann, muss auch irgendwann die Seite der Belagerer dran sein. Als erstes will ich mit dem am einfachsten zu bauenden Gerät anfangen, nämlich der Sturmleiter.
Um die Sturmleiter zu bauen braucht man ein Holz der Querschnittsfläche 3x3 mm, ich habe hier Balsaholz benutzt. Für eine Leiter braucht man 72 cm. Das Holz wird nun zurechtgeschnitten. 2 lange Teilen der Länge 18 cm und 9 kurze Teile der Länge 4 cm. Nun wird auf den langen Teilen an den Positionen 1,3,5,... cm markiert, danach werden die kurzen Teile drauf geklebt. Damit ist die Leiter eigentlich schon fertig, man kann diese nun noch mit brauntönen anmalen (Wasserfarben sind gut geeignet, da man die Holzstruktur immer noch durchsieht).

Tabletop Gelände - Hügel

(English version) Mit diesem Post will ich ein paar neue Geländeplatten vorstellen: Hügel. Wie alle meine Geländeplatten baue ich die Hügel aus Styropor. Als Grundlage dafür dient die Basisplatte aus Holz mit den Füßen, auf diese wird dann der Rest aufgeklebt.

Ich habe die Höhe der Hügel als 5 cm festgelegt, das passt meiner Meinung nach ziemlich gut zu den 28 mm Modellen. Kommen wir nun zur Kante zwischen zwei Hügeln. Diese muss ja an allen Hügelecken und -Kanten gleich sein, dass man das Gelände beliebig kombinieren kann. Ich baue die Hügel aus 5 Platten mit je 1 cm Dicke auf, welche 8, 9, 10, 11 und 12 cm breit sind. Schematisch sieht das so aus:
Nun kann man daraus die ersten Grundformen bauen: Ecken und Kanten. Für eine Ecke braucht man 5 Teile der Größen 12x12, 11x11, 10x10, 9x9, 8x8. Diese werden an einer Ecke bündig übereinander geklebt.
Das sieht jetzt zwar schon nach einem Hügel aus, allerdings kann man das noch weiter verbessern. Da ich Styropor benutze kann man hier einfach Stücke rausreißen, das hinterlässt dann eine felsige zerklüftete Struktur.
Nun muss der Hügel nur noch angemalt werden: Die Ebenen braun, die Hügelkanten grau. Über alles Graue dann noch mit weiß trockenbürsten, alles Braune begrasen und schon hat man einen wunderschönen Hügel:
Ich persönlich würde empfehlen, mehr Styropor rauszureißen als hier im Bild dargestellt ist (das war mein erster Test, daher ist der Hügel noch nicht so schön). Man kann nun weitere Hügelteile bauen wie z.B. Kanten (wie im Bild oben) oder auch innere Ecken:
Die Hochebene ist einfach ein 6 cm dicker Block Styropor auf eine Holz-Grundplatte geklebt.