Tag Archives: Lego Mindstorms

Hardware and Software Prototyping 101 – Design and Create Next Generation Media

Am 24. April ist es soweit und ich halte zum ersten Mal meinen neuen eintägigen Workshop „Hardware and Software Prototyping 101“, in dem ich die wesentlichen Aspekte vermitteln möchte, wie man die Medien der nächsten Generation (Next Generation Media) nicht nur prototypisch plant sondern auch in die Realität umsetzt (Details und Anmeldung). Hier nun die vorläufige Agenda, bei der ich mich über Anregung und Kritik sehr freuen würde:

Teil 1: Ideenfindung, Konzeption und Vorgehensmodelle

Wesentlichen Aspekte für die Konzeption von medienübergreifenden Anwendungen.

  • Next Generation Media – Definition und Ideenfindung
  • Prototyping – Phasen und Storyboard
  • Prototyping – Wireframe und Site-Map
  • Prototyping – Software Engineering

Teil 2: Software Prototyping Practice

Prototypische Herangehensweise an die Anwendungsentwicklung.

  • Einführung Expression Blend/Sketch Flow
  • Tooling
  • Navigation und Behaviors
  • Controls, Styles und Templates
  • Layout
  • Animationen und VisualStates
  • Datenbindung und Datenlager

Teil 3: Screen and Device Independent Development

Plattformunabhängige und -neutrale Anwendungsentwicklung.

  • Web App, Hybrid, Cross-Compiler, Cross-Platform oder Native App
  • Workflow und Software-Architektur
  • LifeCycle
  • Modelle und Muster (MVVM und Presentation Model)
  • Abstraktion und Kapselung
  • ActionScript, JavaScript und C# im Vergleich

Teil 4: Prototyping Hardware and Interactivity

Externe Hardware und/oder Embedded Devices.

  • Gulf of Execution / Gulf of Evaluation
  • Embedded system versus general-purpose computer
  • Ubiquitous/Physical Computing
  • Interactions: CLI, GUI und NUI
  • Wii, Xbox Controller, Guitar Hero und Kinect
  • Lego Mindstorms
  • .NET Gadgeteer

I do not care – Technologieneutrale Anwendungsentwicklung für mobile Geräte

Kaum ein Thema ist mühsamer, als sich bei einem Projekt für die vermeintlich richtige Technologie zu entscheiden. Ganz besonders dann, wenn diese Entscheidung auch noch von strategischer Bedeutung und im besten Fall geräteunabhängig sein soll. Und wie man es macht, macht man es verkehrt, denn auch die Glaskugel verrät uns nicht, was schon in wenigen Monaten angesagt ist. Doch wenn man die richtigen Konzepte versteht und mit etablierten Mustern arbeitet, dann ist es fast egal, für welche Plattform eine Anwendung erstellt wird und ob diese nativ oder weborientiert arbeitet. Sprachen wie JavaScript, Java, Objective-C, C# oder was auch immer verkommen zu einer austauschbaren Nebensächlichkeit.

In meinem aktuellen Vortrag zeige ich, wie ich dieser Herausforderung begegne und was ich in fast 15 Jahren als Rich-Application-Experte für Desktop, Browser und Mobile von Flash über Silverlight bis hin zu HTML5 gelernt habe, um den ständig wechselnden Anforderungen Herr zu werden. Aus der Praxis bewährte Prozesse und Entwurfsmuster werden ebenso behandelt wie eine grundlegende Softwarearchitektur und beispielhaft in eine konkrete Anwendung überführt!

Die Folien zu diesem Vortrag gibt es hier als PDF (ca. 4 MB). Konstruktive Kritik und Anregungen sind willkommen…

Next Generation User Interfaces How-To: Interoperabilität

image Die Ein- und Ausgabemöglichkeiten Web-basierter Technologien sind beinahe unerschöpflich, dennoch gibt es Grenzen – spätestens wenn man den Rechner verlassen und die Außenwelt kontaktieren möchte. Glücklicherweise ist hier Abhilfe in Form von Arduino (http://www.arduino.cc/) und Co. verfügbar. Das Arduino-Board erlaubt die analoge und digatale Ein- und Ausgabe per serieller Schnittstelle, um beispielsweise Sensoren auszulesen oder Motoren zu steuern. Browser-basierten Anwendungen ist es aber normalerweise nicht erlaubt, aus ihrer Sandbox heraus auf diese Schnittstelle zugreifen. Hier kommt dann ein spezieller Server zum Einsatz, der die Daten mit der seriellen Schnittstelle austauscht und dann wie ein Webserver per http oder noch etwas direkter per Socket-Verbindung zur Verfügung stellt. Für Arduion und Flash gibt es beispielsweise as3glue (http://code.google.com/p/as3glue/).

image Es gibt viele Elektronik- oder Robotorbaukästen mit denen ähnliches erreicht werden kann, etwa Lego Mindstorms (http://mindstorms.lego.com/). Die einfache Steuerung eines Lego Roboters gelingt dank der Nxt#-Bibliothek des Niederländers Bram Fokke, die er unter http://nxtsharp.fokke.net inklusive Quellcode zum Download anbietet. Diese Bibliothek kommuniziert direkt per Bluetooth mit dem Roboter. Per WCF (Windows Communication Foundation) kann dann mit Hilfe dieser Bibliothek ein Dienst zum Senden von Nachrichten an den Roboter angeboten werden.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
using System;
using System.ServiceModel;
using System.ServiceModel.Activation;
using Bram.NxtSharp;
 
namespace SilverNXT.Web
{
    [ServiceContract(Namespace = "")]
    [AspNetCompatibilityRequirements(RequirementsMode = AspNetCompatibilityRequirementsMode.Allowed)]
    public class MindstormsService
    {
 
        // Statisch, da es nur einen Robotor für alle gibt
        static private NxtBrick brick;
        static private NxtTankDrive tankDrive;
 
        public MindstormsService()
        {
 
            if (brick == null)
            {
                // Erzeuge Stellvertreter des NXT-Steins, der im Roboter verbaut ist
                brick = new NxtBrick();
 
                // Wichtig: Setze den Namen der Kommunikationsschnittstelle
                brick.COMPortName = "Com11";
 
                // Konfiguriere NXT-Stein mit Motoren und ggf. Sensoren
                NxtMotor motorB = new NxtMotor();
                NxtMotor motorC = new NxtMotor();
                motorB.Brick = brick;
                brick.AttachMotor(NxtMotorPort.PortB, motorB);
                motorC.Brick = brick;
                brick.AttachMotor(NxtMotorPort.PortC, motorC);
 
                // Erzeuge Hilfsobjekt zur Steuerung des Robotors ähnlich einem Panzer
                tankDrive = new NxtTankDrive();
                tankDrive.Brick = brick;
                tankDrive.Motor1 = motorB;
                tankDrive.Motor2 = motorC;
 
                // Stelle Verbindung mit dem NXT-Stein des Robotors her
                brick.Connect();
 
            }
 
        }
 
        [OperationContract]
        public void Run(SByte power, ushort distance, SByte turnRation)
        {
            tankDrive.Move(power, distance);
        }
 
        [OperationContract]
        public void Coast()
        {
            tankDrive.Coast();
        }
    }
}

Für die Nutzung in Silverlight sollte dieser Dienst im Silverlight Projekt als Service Reference hinzugefügt werden. Visual Studio erzeugt den notwendigen Code automatisch, so dass der Dienst mit den folgenden Zeilen konsumiert werden kann.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
using System;
using System.Windows;
using System.Windows.Controls;
using SilverNXT.MindstormsServiceReference;
 
namespace SilverNXT
{
    public partial class MainPage : UserControl
    {
        MindstormsServiceClient client = new MindstormsServiceClient();
 
        public MainPage()
        {
            InitializeComponent();
        }
 
        private void runButton_Click(object sender, RoutedEventArgs e)
        {
            client.RunCompleted += new EventHandler<system.componentmodel.asynccompletedeventargs>(client_AsyncCompleted);
            client.RunAsync(50, 0, 100);
        }
 
        private void coastButton_Click(object sender, RoutedEventArgs e)
        {
            client.CoastCompleted += new EventHandler<system.componentmodel.asynccompletedeventargs>(client_AsyncCompleted);
            client.CoastAsync();
        }
 
        void client_AsyncCompleted(object sender, System.ComponentModel.AsyncCompletedEventArgs e)
        {
            // nothing
        }
    }
}

image Bierzapfen am Computer“Wii Draught Masters” für Stella Artois.

 

 

 

 

Verschiedene Quellen datieren den Joystick auf ca. 1940. Dort wird dieser erstmalig im Zusammenhang mit der Raketensteuerung erwähnt. Der Joystick sowie dessen Nachfolger wie Gamepad und die Wii Remote lassen sich ebenfalls für Benutzerinteraktionen verwenden. Dabei erfreuen sich gerade die Eingabegeräte der seit 2006 vertriebenen Wii großer Beliebtheit: Darunter seit ca. 2008 das Balance Board und seit ca. 2009 das Guitar Hero Schlagzeug. Und da diese per Bluetooth arbeiten, ist die Kombination mit anderen Technologien durchaus möglich. Die größte Herausforderung ist, dass nicht jede Bluetooth-Umgebung harmoniert; Gute Erfahrungen haben wir übrigens mit den Bluetooth-Treiber von BlueSoleil (http://www.bluesoleil.com/) gemacht.

Ähnlich wie schon bei dem Lego Mindstorms Robotor gibt es auch hier eine Bibliothek zur Nutzung in eigenen Projekten namens WiiMoteLib (http://wiimotelib.codeplex.com/) in .NET basierten Projekten, etwa mit WPF.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
using System;
using System.Windows;
using WiimoteLib;
 
namespace WiiWPF
{
    /// <summary>
    /// Interaction logic for MainWindow.xaml
    /// </summary>
    public partial class MainWindow : Window
    {
        public MainWindow()
        {
            InitializeComponent();
 
            Loaded += new RoutedEventHandler(MainWindow_Loaded);
        }
 
        void MainWindow_Loaded(object sender, RoutedEventArgs e)
        {
            WiimoteCollection mWC = new WiimoteCollection();
 
            try
            {
                // Finde alle angeschlossenen Wii Remotes
                mWC.FindAllWiimotes();
                // Verbinde mit der ersten gefundenen Wii Remote
                Wiimote wm = mWC[0];
                wm.Connect();
                // Schalte die Vibration an der Wii Remote ein
                wm.SetRumble(false);
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message, &quot;Wiimote error&quot;, MessageBoxButton.OK);
            }
        }
    }
}

Kombiniert mit einem Socket-Server können so die Eingabegeräte der Wii Technologien wie Flash und Silverlight angeboten werden – genau das übernimmt im Falle von Flash das Projekt WiiFlash von Joa Ebert und Thibault Imbert (http://code.google.com/p/wiiflash/).