Arduino — Datenvisualisierung mit NodeJS

Zusammenfassung

In diesem Beitrag soll erklärt werden, wie mit einem Arduino Uno Daten erfasst werden und mittels JSON an einen WebServer übermittelt werden können. Mit Hilfe von NodeJS wird ein WebSever aufgebaut, der die vom Arduino übermittelten Daten verarbeitet und in einem Diagramm dargestellt. Ich verwende dazu das GitHub Projekt arduino-livechart, bei dem (da in der neuen Version von express.js keine Middleware mehr enthalten ist) einige Anpassungen nötig sind, damit die aktuelle Version von NodeJS verwendet werden kann.


Weiterlesen

DIY — Drucker per Ethernet Ein- bzw. Ausschalten

Es ist schon praktisch, wenn man einen Drucker, der im Keller steht per WebSeite ein- bzw. ausschalten kann. In diesem Beitrag möchte ich mit Hilfe des Arduino Uno, dem EtherNet-Shield und einem 5Volt-Schaltrelais einen möglichen Weg beschreiben. Leider werden Drucker extern mit 230V betrieben, deshalb ist es nicht erlaubt selbständig ein Schaltrelais in den Stromkreis einzubauen. Hier soll erklärt werden, wie man ein Relais mit Hilfe einer WebSeite zum klicken bringt, mehr nicht. Es werden/sind keine Veränderung an der 230V-Elektroinstallationen vorgenommen!.

Da ein Arduino Uno nur begrenzt Speicherplatz hat bietet es sich an das CSS-File von einem externen WebServer einzubinden. Das hat den Vorteil, dass das Aussehen der Seite verändert werden kann, ohne dass im Arduino-Sketch editieret werden muss. (Zumal die Eingabe von HTML-Code für den Arduino sehr umständlich ist und dadurch der Sketch schon sehr länglich wird). Auf die selbe Weise kann natürlich auch JavaScript-Code mit eingebunden werden, um die Verarbeitung von Events, die ein Mensch auslöst zu verarbeiten und an den Arduino zu übergeben. So könnte z.B. optisch der Status von verschiedenen Geräten dargestellt werden. Aber das würde den Rahmen dieses BlogArtikels sprengen.

  1. Die Aufgaben des Arduino sind folgende:
    • Steuerung der Stromversorgung für den Drucker
    • Bereitstellen der Internetseite
  2. Die Aufgaben des externen WebServers sind folgende:
    • Bereitstellen des CSS-Files
    • (Optional) Bereitstellen von JavaScript


Weiterlesen

NodeJS — Installation und IDE’s

Installation von Node.js (aktuelle Version)

  • Mac OSX: Es gibt zwei Wege, entweder von der Nodejs.org den Mac OS X Installer (.pkg) herunterladen und installieren, oder mit Hilfe von Homebrew. Homebrew lädt die aktuellen Quelldateien herunter und kompiliert sie. Um Homebrew zu installieren gibt es hier eine gute Anleitung: Installing Homebrew on OS X Mountain Lion 10.8. Wenn man Homebrew schon installiert hat, sind folgende Befehle in der Terminal-App nötig:

    brew update
    brew doctor
    brew install node

  • Ubuntu 12.04: Die deb-Pakete für die aktuelle Version sind im Chris Lea’s Repo hinterlegt. Um sie zu installieren sind folgende Befehle nötig:

    apt-get install python-software-properties
    apt-add-repository ppa:chris-lea/node.js
    apt-get update && apt-get install nodejs npm
  • Windows: Hier gibt es ebenfalls von der Node-Homepage verschiedene Pakte zum installieren (32bit/64bit msi/exe). Welches der Pakete das man wählt, hängt natürlich von der verwendeten Version von Windows ab.

Die Installation mit Homebrew (Mac OSX) oder mit apt (Ubuntu) haben den Vorteil, dass sehr einfach die installierten Programme aktuelle gehalten werden können:

  • Mac OSX:

    brew update
    brew outdated
    brew upgrade
  • Ubuntu 12.04:

  • sudo apt-get update
    sudo apt-get upgrade

Natürlich kann unter Windows die Node-Installation auch aktuell gehalten werden, aber man muss dies von Hand machen, und wenn man viel Software installiert hat geht dafür viel Zeit drauf in der man nicht produktiv arbeiten kann.

IDE’s für node.js

Nide — Beautiful IDE für NodeJS

Nide ist eine web-basierte IDE für NodeJS, die bewusst sehr Einfach gehalten ist und einfach zu benutzen ist. Um Nide zu installieren bracht es nicht viel:

sudo npm install -g nide

Dabei ist npm der NodePackageManager und die Option -g bedeutet, dass Nide systemweit installiert wird. Um Nide in einem neuen ProjektOrdner zu initialisieren ist folgender Befehl notwendig:

nide init

Dadurch wird der Order .nide angelegt und die WebIDE auf Port 8123 geöffnet.

open http://localhost:8123

Öffnet einen Browser-Tap mit der Nide-WebIDE.

Cloud9 — Lokale Installation

Cloud9 IDE ist ein Open-Source-Web-basierte cloud integrierte Entwicklungsumgebung, die mehrere Programmiersprachen unterstützt, wobei der Schwerpunkt auf den Web Sprachen (insbesondere JavaScript und Node.js) liegt.
Als Besonderheit besitzt Cloud9 die Möglichkeit eine Vorschau der erstellten Seite darzustellen.
Um Cloud9 lokal zu installieren sind unter Ubuntu und Mac OSX folgende Befehle nötigt:

git clone https://github.com/ajaxorg/cloud9.git
cd cloud9
npm install

Wichtig ist folgende Abhängigkeiten erfüllt sind:

  • NodeJS >= 0.6.16
  • NPM >= 1.1.16
  • libxml2-dev

Um Cloud9 zu starten muss im dem installations Verzeichniss folgender Befehl
ausgeführt werden:

bin/cloud9.sh -w ~/git/myproject
open http://localhost:3131

dabei ist die Option -w dazu da den jeweiligen Projekt-Ordner zu benutzen. Anschließend kann die WebIDE unter der URL http://localhost:3131 geöffnet werden.

Quellen:

DIY — MCGBot Engine Treibersoftware (Teil 1) Theorie

Schrittmotor Treiber: Grundlagen zur Eigenentwicklung

Zunächst einmal ist es um einiges einfacher mit dem Motor Shield von Ladyada zwei Schrittmotoren zu steuern. Der einzige Nachteil ist, dass das Motor Shield so viel kann und deshalb sehr viele digitale Pin verwendet. Für den ersten Prototyp werde ich das Shield von Ladyada und die beiden zugehörigen Bibliotheken (AFmotor und AccelStepper) verwenden. Die beiden Bibliotheken sind gut durchdacht und sehr gut dokumentiert.

Ich habe mich ein letzter Zeit mit der Steuerung von Schrittmotoren befasst und möchte daher die Grundzüge einer eigenen Bibliothek zur Steuerung von zwei Schrittmotoren vorstellen. Mein Startpunkt war der Blog-Eintrag S-Curve for EasyDriver v3 Stepper Motor Driver von Chris E. Er stellt einen Sketch vor, der eine Schrittmotor eine feste Anzahl von Schritten sich drehen lässt. Dabei aber zuerst eine vorgegebene Zeitspanne beschleunigt, die erreichte Geschwindigkeit hält und dann eine vorgegebene Zeitspanne den Motor abbremst. Eigentlich genau das, was man für ein Fahrzeug haben möchte.

Ich habe das Shield S-Curve for EasyDriver v3 Stepper Motor Driver verwendet. Aber man kann auch auf der Grundlage des A3967 Microstepping Driver und einem Breadboard sein eigenes Motorshield zusammenbauen.

Von den Zeitschritten zur Anzahl der Schritte

Als erste Aufgabe soll der Bot ein Stück Weg gerade aus fahren. Dabei soll er zuerst beschleunigen bis zu einer Vorgegebenen maximalen Geschwindigkeit, diese eine bestimmte Zeit beibehalten und dann abbremsen. Da sich die Schrittmotoren bei jedem Puls um einen festen Winkel  $\Delta \theta = \frac{360}{n}$ weiter drehen. Wird die Winkelgeschwindigkeit \phi = \frac{\Delta \theta}{\Delta t} nur durch die Wartezeit  $\Delta t zwischen zwei Pulsen beeinflusst. Wenn  $\Delta t größer wird ist die Winkelgeschwindigkeit kleiner und umgekehrt.

<br /> \begin{tikzpicture}[scale=2]</p> <p>% Include tikz into local preamble<br /> [+preamble]<br />      \usepackage{tikz}<br /> [/preamble]<br />   %\draw[style=help lines] (0,0) grid (7,4);<br />   % dt(t) function<br />   \draw[blue, line width=2] (0,3) -- (2,1);<br />   \draw[blue, line width=2] (2,1) -- (5,1);<br />   \draw[blue, line width=2] (5,1) -- (7,3);  </p> <p>  \draw[grey, dotted, line width=1] (2,3.1) -- (2,-0.1) node[below] {$t_1$};<br />   \draw[grey, dotted, line width=1] (5,3.1) -- (5,-0.1) node[below] {$t_2$};<br />   \draw[grey, dotted, line width=1] (7,3.1) -- (7,-0.1) node[below] {$t_{end}$}; </p> <p>  \draw[grey, dotted, line width=1] (7,3) -- (-0.1,3) node[left] {$\Delta t_{max}$};<br />   \draw[grey, dotted, line width=1] (7,1) -- (-0.1,1) node[left] {$\Delta t_{min}$}; </p> <p>  \draw[->]  (-0.2,0) -- (7.2,0) node[right] {\Large $t$};<br />   \draw[->]  (0,-0.2) -- (0,3.4) node[above] {\Large $\Delta t(t)$};</p> <p>  \node [above] at (1,2.6) {\Lage I};<br />   \node [above] at (3.5,2.6) {\Lage II};<br />   \node [above] at (6,2.6) {\Lage III};</p> <p>\end{tikzpicture}<br />
<br /> \begin{tikzpicture}[scale=2]</p> <p>% Include tikz into local preamble<br /> [+preamble]<br />      \usepackage{tikz}<br /> [/preamble]<br />   %\draw[style=help lines] (0,0) grid (7,4);<br />   % phi(t) function<br />   \draw[red, line width=2] (0,1) -- (2,3);<br />   \draw[red, line width=2] (2,3) -- (5,3);<br />   \draw[red, line width=2] (5,3) -- (7,1);  </p> <p>  \draw[grey, dotted, line width=1] (2,3.1) -- (2,-0.1) node[below] {$t_1$};<br />   \draw[grey, dotted, line width=1] (5,3.1) -- (5,-0.1) node[below] {$t_2$};<br />   \draw[grey, dotted, line width=1] (7,3.1) -- (7,-0.1) node[below] {$t_{end}$}; </p> <p>  \draw[grey, dotted, line width=1] (7,3) -- (-0.1,3) node[left] {$\phi_{max}$};<br />   \draw[grey, dotted, line width=1] (7,1) -- (-0.1,1) node[left] {$\phi_{min}$}; </p> <p>  \draw[->]  (-0.2,0) -- (7.2,0) node[right] {\Large $t$};<br />   \draw[->]  (0,-0.2) -- (0,3.4) node[above] {\Large $\phi(t)$};</p> <p>  \node [above] at (1,2.6) {\Lage I};<br />   \node [above] at (3.5,2.6) {\Lage II};<br />   \node [above] at (6,2.6) {\Lage III};</p> <p>\end{tikzpicture}<br />

Ziel: Berechnung der Schrittanzahl

Die Frage ist nun, welche Anzahl an einzelne Schritte führen die Schrittmotoren im Zeitintervall  $ \left[0,t_{end}\right] $ aus? Dann weiß man um auch welche Gesamtwinkel sich die Schrittmotoren gedreht haben und damit die Länge des zurückgelegten Weges.

Berechnung der Gesamtzeit  $t_N$

Da die Bereiche I und III die identische Anzahl von Schritten haben, genügt es nur Bereich III zu betrachten. Um das Problem einfach zu halten, betrachte ich die Funktion  $\Delta t(t) = a t$ . Damit erhält man die interativen Formel für den neuen Zeitpunkt  $t_{k+1}$ zu:

\begin{eqnarray*} t_{k+1} = t_k + dt  \end{eqnarray*} oder
\begin{eqnarray} t_{k+1} = (1+a) t_k \end{eqnarray} .
Der Ausdruck  $(1+a)$ kann als Propergator der Dynamik verstanden werden.
Der Zusammenhang ist in der Abbildung verdeutlicht.
<br /> \begin{tikzpicture}[scale=1]</p> <p>% Include tikz into local preamble<br /> [+preamble]<br />      \usepackage{tikz}<br /> [/preamble]<br />   %\draw[style=help lines] (0,0) grid (4,4);<br />   % dt(t) function<br />   \draw[blue, line width=2] (0,0) -- (3.7,4);    </p> <p>  \draw[grey, line width=1] (0.7,0.1) -- (0.7,-0.1) node[below] {$t_k$};<br />   \draw[grey, line width=1] (1.3,0.1) -- (1.3,-0.1) node[below] {$t_{k+2}$};<br />   \draw[grey, dotted, line width=1] (3.2,4.2) -- (3.2,-0.1) node[below] {$t_N$}; </p> <p>  \draw[->]  (-0.2,0) -- (4.2,0) node[right] {\Large $t$};<br />   \draw[->]  (0,-0.2) -- (0,4.4) node[above] {\Large $dt(t)$};</p> <p>\end{tikzpicture}<br />

Nun muss man von der interativen Darstellung der Dynamik zu einer expliziten Darstellung übergehen. Dazu schaut man sich die ersten Schritte der Dynamik an:

<br />         \begin{eqnarray*}<br />           t_{0} && \quad \intertext{gegeben} \\<br /> 	  t_{1} &=& (1+a)t_{0} \\<br /> 	  t_{2} &=& (1+a)t_{1} = (1+a)(1+a)t_0 = (1+a)^2 t_0<br /> 	\end{eqnarray*}<br />
Somit erhält man die Vermutung:
<br />         \begin{eqnarray}<br />           t_{k} = (1+a)t_{k-1} = \dots = (1+a)^k t_0<br />         \end{eqnarray}<br />

Beweis dieser Vermutung mit Hilfe der vollständigen Induktion:
Induktions Anfang:  $ k = 0 $ ist ok
Induktions Behauptung:  $ t_k = (1+a)^k t_0 $ sei richtig
Induktionsschritt:  $ k \to k+1 $
<br />         \begin{eqnarray*}<br />           t_{k+1} = (1+a)t_{k} = (1+a) (1+a)^k t_0 = (1+a)^{k+1}t_0<br />         \end{eqnarray*}<br />
Damit ist die Behauptung (2) bewiesen.

Berechnung der Gesamtzeit  $t_N$ nach  $N$ Schritten:
Die Gesamtzeit ergibt sich aus der Summe aller  $dt_k$ für  $k =1 ... N$.
<br />         \begin{eqnarray}<br />           t_N = \sum_{k=1}^N dt_k =  \sum_{k=1}^N a t_k = a \sum_{k=1}^N (1+a)^k t_0<br />         \end{eqnarray}<br />
Mit Hilfe der Formel
<br /> \begin{eqnarray}<br />     \sum_{k=1}^N q^k = \frac{q[q^N - 1]}{q-1} \qquad \intertext{f\"ur} \quad q > 0<br /> \end{eqnarray}<br />
erhält man den Ausdruck:
<br /> \begin{eqnarray}<br />    t_N = (a+1) [(a+1)^N -1] t_0<br /> \end{eqnarray}<br />

Berechnung der Anzahl der Schritte  $N$

Dazu muss man die Gleichung (5) nach der Anzahl der Gesamtschritte  $N$ auflösen:
<br /> \begin{eqnarray*}<br />    t_N $=$ (a+1) [(a+1)^N -1] t_0 \end{eqnarray*}<br />
Auslösen nach $(a+1)^N$ ergibt:
<br /> \begin{eqnarray*}<br />    (a+1)^N = \frac{t_N}{(a+1)t_0} +1<br /> \end{eqnarray*}<br />
Jetzt muss die Gleichung logarithmiert werden. Mit Hilfe der Formel  $log(q^N) = N log(q)$ erhält man:
<br /> \begin{eqnarray*}<br />    (a+1)^N &=& \frac{t_N}{(a+1)t_0} +1 \\<br />    N log(a+1) &=& log(\frac{t_N}{(a+1)t_0} +1).<br /> \end{eqnarray*}<br />
Diese Gleichung kann jetzt nach  $N$ aufgelöst werden. Und somit erhält man die
Formel für die Gesamtanzahl der Schritte im Bereich III:
<br /> \begin{eqnarray}<br />    N_{III} = \frac{log(\frac{t_N}{(a+1)t_0} +1)}{log(a+1)}<br /> \end{eqnarray}<br />
wobei  $t_N$ der Zeit entspricht in der die Schrittmotoren anbremsen (oder beschleunigen).
Die Anzahl der Schritte im Bereich II in welchem die Schrittmotoren mit konstanter Geschwindigkeit laufen ergibt sich zu:
<br /> \begin{eqnarray}<br />    N_{II} = \frac{t_{II}}{\Delta t{min}}.<br /> \end{eqnarray}<br />
Und somit die Gesamtanzahl der Schritte in den Bereichen I bis III:
<br /> \begin{eqnarray}<br />     N = \frac{log(\frac{t_I}{(a_{I}+1)t_0} +1)}{log(a_{I}+1)} +  \frac{t_{II}}{dt{min}} + \frac{log(\frac{t_{III}}{(a_{III}+1)t_0} +1)}{log(a_{III}+1)}<br /> \end{eqnarray}<br />
mit  $ a_i = \frac{dt_{max} - dt_{min}}{t_i} $.

Quellen:

  1. [Arduino]Stepper Motor + EasyDriver + Arduin
  2. S-Curve for EasyDriver v3 Stepper Motor Driver
  3. Datasheet of Dual stepper motor shield

DIY — Software für eine CNC-Maschine

Übersicht

Eventuell kann sie Software auf einem Nexus 7 mit Ubuntu 12.04 installiert werden.
Setting up your Nexus 7 with Ubuntu 12.04
Meine ersten Erfahrungen sind leider ernüchternd, ubuntu unity stürzt oft ab. Leider gibt es noch keine Treiber für OpenGL weshalb pycam nicht richtig funktioniert.

Installation von PyCAM auf Mac OS X 10.8

Es folgt eine kurze Anleitung, wie PyCAM auf Mac OS X 10.8 installiert wird.

  1. Download PyCAM und entpacken.
  2. /Applications/Utilities/Terminal.app ausführen
  3. Installation von Homebrew (eine ausführlichere Anleitung: Installing Homebrew on OS X Mountain Lion 10.8, Package Manager for Unix Tools )
  4. ruby <(curl -fsSkL raw.github.com/mxcl/homebrew/go)
    
  5. Compilieren und installieren von PyGTK
  6. /usr/local/bin/brew install pygtk
    
  7. Compilieren und installieren von PyOpenGL (Password ist notwendig)
  8.   sudo easy_install PyOpenGL
    
  9. Compilieren und installieren von PyGTKGLExt
  10.   /usr/local/bin/brew install pygtkglext
    
  11. PyCAM patchen
  12.   curl "http://goo.gl/U8hJ1" | patch -p0
    
  13. Eintrag in .bashrc erstellen
  14. echo "\nexport PYTHONPATH=/usr/local/lib/python2.7/site-packages" >> ~/.bashrc
    

Nun sollte es möglich sein pyCAM innerhalb des herunter geladenen und entpackten Verzeichnisses zu starten.

./pycam

Diese Anleitung geht davon aus, dass Mac OS X Mountain Lion im original Zustand nach der Installation ist. Wenn fink oder macport installiert sein sollte, ändern sich die Schritte entsprechen.

openSCAM