ArduinoPi Web-based Controller for Arduino

The ArduinoPi is a web-based controller for the Arduino using the Raspberry Pi. The advantage of using a Raspberry Pi (€28) is that its cheaper than an Ethernet shield (€35) and actually more useful.

I talked about connecting the Raspberry Pi and Arduino over a serial connection and how to install and configure PHP serial class so PHP can talk with the Arduino.

The principal behind ArduinoPi

First a little clarification, the ArduinoPi isn’t really a library or a command set or an out of the box controller, its more a proof of concept using already know programming languages. If you want to use it be ready for some PHP, CSS, HTML, C++ and jQuery!

The principal is as follows: The Arduino is connected as a slave device, meaning it waits for a command, execute it and maybe return a value or something. Everything must be initiated from the web browser. A true slave device.

It’s also possible for the Arduino to execute its own program and the ArduinoPi can then be used as a controller to switch variables. For example I have an automatic light switching system but using the ArduinoPi controller and my web browser I’m able to manually override it. ## The command set of the ArduinoPi

The Arduino will check for a valid command. Every command starts with @ and ends with :, variables can be separated with a comma. Of course other commands can be added yourself, I’ve found that these are the basics and cover enough to make some interesting interfaces.

Basic Switch-port-high command

@6,255:

This command is sent to the Arduino, for example this will switch port 6 high (255 = HIGH). The first value in this command must be between 0-99, which corresponds to the port number. Note that there is no checking so always see the port is set in OUTPUT mode and you are addressing the right port.

RGB Command

I’ve also added a RGB command for LEDs, this is a special command and is constructed as follows:

@101,245,23,0:

The 101 indicates the special command mode and the following 3 values are just the RGB values. In my example setup I’ve added 3 RGB LEDs and they all get turned on to the right value using the RGB command.

Read Sensor Command

The last command is the sensor command. It will read an analog sensor value and return it to the PHP script.

@102,6:

The 102 indicate a special command and the following value indicates the port that should be read using analogRead().

My test setup for the ArduinoPi

I’ve used the following components for testing various functions: 3 RGB LEDs + resistors and a light sensor. The example will work with the following configuration. The image does not contain the connection setup with level converter circuit from last time (to cut some space).

The connection schematic for the ArduinoPi test setup
The connection schematic for the ArduinoPi test setup

The Arduino code for ArduinoPi

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
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101

int ledstate = LOW;
String cmd;
bool cmdRec = false;
void setup()
{
    //Start the connection with the Raspberry Pi
    Serial1.begin(115200);
    // Start the connection with the Laptop
    Serial.begin(115200);
    for(int i=2; i <= 10; i++) {
        pinMode(i, OUTPUT);
    }
}

void loop()
{
    handleCmd();
}

void serialEvent1() {
    while(Serial1.available() > 0 && Serial1.writeable()) {
        char inByte = (char)Serial1.read();
        if(inByte == ':') {
            cmdRec = true;
            return;
        } else if(inByte == '@') {
            cmd = "";
            cmdRec = false;
            return;
        } else {
            cmd += inByte;
            return;
        }
    }
}

void handleCmd() {
    if(!cmdRec) return;

    int data[4];
    int numArgs = 0;

    int beginIdx = 0;
    int idx = cmd.indexOf(",");

    String arg;
    char charBuffer[16];

    while (idx != -1) {
        arg = cmd.substring(beginIdx, idx);
        arg.toCharArray(charBuffer, 16);

        // add error handling for atoi:
        data[numArgs++] = atoi(charBuffer);
        beginIdx = idx + 1;
        idx = cmd.indexOf(",", beginIdx);
    }
    // And also fetch the last command
    arg = cmd.substring(beginIdx);
    arg.toCharArray(charBuffer, 16);
    data[numArgs++] = atoi(charBuffer);

    // We just want to switch a port so lets change the values
    if(data[0] < 100) {
        execCmd(data);
    } else {
        execCmds(data);
    }
    cmdRec = false;
}

// Select just one port and enable it
void execCmd(int* data) {
    analogWrite(data[0], data[1]);
}

// For advanced function like switch all the leds in RGB
void execCmds(int* data) {
    switch(data[0]) {
    case 101:
        // first the red part of the RGB
        // for me 4,7,10
        analogWrite(4, data[1]);
        analogWrite(7, data[1]);
        analogWrite(10, data[1]);
        // green: 3, 6, 9
        analogWrite(3, data[2]);
        analogWrite(6, data[2]);
        analogWrite(9, data[2]);
        // blue: 2, 5, 8
        analogWrite(2, data[3]);
        analogWrite(5, data[3]);
        analogWrite(8, data[3]);
        break;

    case 102:
        // request analog readout!
        int sensor = analogRead(data[1]);
        Serial1.println(sensor);
    }
}

SerialEvent1 gets called every time data is available on the Serial1 interface, the function will check for a valid command, if it found a valid command (meaning it starts with @ and ends with 🙂 it will switch the Boolean valuecmdRec to true, in the loop function we always call handleCmd(); now the cmdRec is set so we process the command. The while loop will split out the values and save them in the data array. Because we also need the last command we repeat the same stuff out of the while loop once more, I should fix that btw.

If the first value has a number lower than 100 we turn the port on with the second value as second parameter, else we process it like a special command. I’ve used a switch so you can add your own special commands as needed.

The web browser interface for the ArduinoPi

As interface I decided to use 4 pages each showcasing the commands. I made use of the following scripts/plugins/blogs/code and I would like to thank the original authors:

  • Bootstrap
  • jQuery
  • Farbtastic Color Picker
  • jQuery color picker using Farbtastic and jQuery UI
  • flot

The complete source is on Github, I’ll give a short overview of the different pages.

Hover Example

Hover Example
Hover Example

The Hover example works as follows, we add a jQuery hover handler over all the buttons. If the user moves over the button we request the value of the button, this value corresponds with the port we want to switch. We then send an ajax call to a PHP script that will handle the communication with Arduino and sending the right command. For a value we use 255. When the mouse leaves the button we do the same but use the value 0 to turn it off.

$(".hover-light > button").hover(function () {
        var port = $(this).val();
        $.post("php-ajax/cmd.php?mode=hover", {port:port, value:255});
    }, function () {
        var port = $(this).val();
        $.post("php-ajax/cmd.php?mode=hover", {port:port, value:0});
    });

Color Picker

Color Picker
Color Picker

The color picker works as follows. The user selects the desired color the RGB LEDs should produce and then click on the big square. An AJAX request is then made to a PHP page that will send the special command 101 with the right values for red, green and blue.

$("#swatch").click(function () {
    var red = $("#red").slider("value");
    var green = $("#green").slider("value");
    var blue = $("#blue").slider("value");
    $.post("php-ajax/cmd.php?mode=picker", {red:red, green:green, blue:blue});

Basic Sensor Display

Basic Sensor Display
Basic Sensor Display

This has nothing to do with the Arduino, but remember my light measurements? I always had trouble displaying them and I’ve included an example how you can display graphs really easy using this tool. It’s really useful for offline measurements that are saved on a SD card and then need to be represented in a browser.

Live Sensor Data

Live Sensor Data
Live Sensor Data

This will execute live measurements. A PHP cron job needs to be setup to run every minute as follows:

[email protected]:/home/pi# crontab -e
* * * * * php /opt/www/php-ajax/cron.php

The PHP script will execute a measurement and save the value in a JSON file. On the client side we refresh the graph every minute with an Ajax call. I’ve also include two buttons to clear the log or request your own value.

Conclusion

I gave a bare bone, alpha release of my ArduinoPi controller. This example can be expanded all the way and check the Github source, I’ve added a lot of comments to get people started.

There is one big limitation, the server (Raspberry Pi) always has to request data from the Arduino. It’s not possible to send data from the Arduino to the Raspberry Pi and then magically update the browser. When using for example Processing, it is possible to have a more live connection and build an interface in JAVA. But this web interface is accessible for any smartphone or laptop (assuming you don’t run IE6).

Using PHP serial class with Arduino and Raspberry Pi

Last time I talked about connecting the Raspberry Pi with the Arduino, I could send simple echo strings from the Raspberry Pi to my Arduino. Great now lets step it up! During research I came across the PHP serial class, a great implementation of serial control for PHP. Although the class lacks decent support for Windows, it fully supports Linux (and Raspberry Pi).

Configuring your Raspberry Pi for PHP serial class

Before you can use the class some stuff must happen (I assume you have PHP enabled Raspberry Pi running, there are a gazillion tutorial blogs out there, Google one). First we need to find out what user runs PHP.

<?php
echo exec('whoami');
?>

For Lighttpd it is www-data, apache may be different. Every serial connection (virtual of physical) is owned by the dialout group, so if we add www-data to the dialout group our PHP script should be able to open/read/write the serial device. The following command will add the group to www-data.

usermod -a -G dialout www-data

Running the command groups www-data give the following result

[email protected]:/opt/www# groups www-data
www-data : www-data dialout

Great, www-data belongs to dialout and www-data. Now RESTART your Raspberry Pi. I literally wasted hours debugging to finally realized I just needed a restart (I know it sounds stupid).

Testing the connection

So on my Arduino I still have the same old pass through script in place. For the PHP I’ll write a simple script that just sends a string to the Arduino.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18

<?php
error_reporting(E_ALL);
ini_set('display_errors', '1');
include "php_serial.class.php";

$serial = new phpSerial;
$serial->deviceSet("/dev/ttyAMA0");
$serial->confBaudRate(115200);
$serial->confParity("none");
$serial->confCharacterLength(8);
$serial->confStopBits(1);
$serial->deviceOpen();
$serial->sendMessage("Hello from my PHP script, say hi back!");

$serial->deviceClose();

echo "I've sended a message! \n\r";
?>

First I enable all the errors, the PHPserial class issues warnings on failure and by default they aren’t displayed (in a normal PHP configuration). Then I include the PHP serial class file. Next I initiate a new phpSerial object called$serial and configure some parameters. We don’t have parity, characters are 8 bits and we use 1 as a stop bit. After that I can open the device send my message and close it. Finally I echo some feedback to the browser saying I did my job.

I don’t know how or why but for every connection I open, I get question marks (unknown chars). They have a decimal value of 254 and I really don’t have a clue what they are. When I use a normal echo command in the terminal I don’t get those characters.

Debugging the PHP serial

A lot can go wrong, so lets cover the basics. If your browser keeps loading and nothing happens then your Serial connection is locked up, restart your Pi to release it and see that you close the device in your PHP script.

If it still keeps loading then there might be a problem with the first part of this blog, make user that the user www-data belongs to the dialout group. Use the following command to check if the dialout group has access to the/dev/ttyAMA0 device:

[email protected]:/opt/www# ls -l /dev/ttyAMA0
crw-rw---T 1 root dialout 204, 64 Aug 30 20:21 /dev/ttyAMA0

If browser says the message is send but you don’t see anything on your Arduino serial monitor then check for common flaws. Unplugged cables, wrong level converter circuit, baud rate and so on are all possible suspects.

Next time I’ll talk about my ArduinoPi Controller based on the PHP serial class. It’s a web based Arduino implementation using the Raspberry Pi as web host.

[Top]

Bluetooth Presence Detection

Today something else, presence detection in a room. There are a lot of possible solutions to solve this problem. A traditional way is to connect 2 PIR (Passive Infrared Sensors) sensors in the door opening and count the amount of people who enter or leave the room. Another way is to use a RFID chip or even ultrasound. I decided to use Bluetooth to look for active devices.

BlueSmirf Bluetooth Module
BlueSmirf Bluetooth Module

Presence detection with Bluetooth, the connection

First I need a Bluetooth module. My old one broke down (5V is NOT 3.3V). I decided to buy a Bluetooth Mate Silver (WRL-10393) from Sparkfun. An advantage of the Bluetooth Mate is that it can be easily configured.

Connecting the Bluetooth module is fairly easily, just connect 5V, ground and cross TX and RX and it will work. The CTS-I and RTS-0 are not used, some people say you should connect them to each other but in the sparkfun tutorial they clearly say to leave them alone. So I did.

## Configuring the Bluetooth Mate Before I can start programming I need to change some configuration settings. A complete list of all the AT commands can be found here. When the Bluetooth mate is switched in command mode there is a possibility to check for active Bluetooth devices. Using this command I’m able to see if my device is in the room (or 30m radius).

First I use a pass through script so the data I send to my Arduino is passed along the Bluetooth Mate and vice versa.

A pass-through script
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18

void setup()
{
 // Open serial communications to PC and wait for port to open:
  Serial.begin(115200);

  Serial.println("Connected to PC");

  // set the data rate for the Bluetooth port
  Serial1.begin(115200);
}

void loop() // run over and over
{
  if (Serial1.available())
    Serial.write(Serial1.read());
  if (Serial.available())
    Serial1.write(Serial.read());
}

The default baud rate is 115200, now I can configure my Bluetooth module by entering the commands in a serial terminal on my computer.

First $$$ should be send in the first minute the Arduino starts, this enables command mode. This command should be send without a new line, all other commands need a new line at the end. I then changed the name of the Bluetooth Mate with the command SN,<name>. Typing d (or in some cases D) gives detailed information about the Bluetooth Mate. By using the command IN,2 it’s possible to start an inquiry scan. It’s a search for other active Bluetooth devices. I wrote down the serial number of my cellphone and laptop. The last command I used is ST,255so I can always start command mode.

Programming the Bluetooth Mate for Presence detection

So lets start with the code.

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
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76

#include
// The ID's I found during the set up,
// change these value's to match your Bluetooth Devices
char cell[] = "E4EC1064DAE4,5A0204";
char laptop[] = "2C8158B16919,6E010C";
unsigned long lastTime;
unsigned long interval = 10000;
void setup()
{
    Serial.begin(115200);  // Begin the serial monitor at 9600bps
    Serial1.begin(115200);
    Serial1.println("---"); // make sure the device is not in command mode
    Serial.println("Started....");
}

void loop()
{
    // Get current millis();
    unsigned long currentTime = millis();
    // Check if its already time for our process
    if((currentTime - lastTime) > interval) {
        lastTime = currentTime;
        // Enter command mode
        Serial1.print("$$$");
                //Wait a bit for the module to respond
        delay(200);
                // Start the inquiry scan
        Serial1.println("IN,2");
        delay(5000);
        int h = Serial1.available();
        if(h >= 42) { // we know there is a bluetooth device
            char *id = readSerial(h);
            char *str;
            while((str = strtok_r(id, "\n", &id)) != NULL) {
                if(strncmp(str, cell,19) == 0) {
                    Serial.print("Found Fritz cellphone with id: ");
                    Serial.println(str);
                } else if(strncmp(str,laptop,19) == 0) {
                    Serial.print("Found Fritz laptop with id: ");
                    Serial.println(str);
                }
            }
        } else if(h <= 21) { // we know there is no bluetooth device
            Serial.println("No device found");
        }
        Serial1.println("---");

    }
    clearAll();
}

void clearAll() {
    for(int i = 0; i < Serial1.available(); i++) {
        Serial1.read();
    }
}

// a bit hacked...
char* readSerial(int h) {
    char input;
    char buffer[100];
    if (Serial1.available() > 0) {
        int j = 0;
        for (int i = 0; i < h; i++) { // the id's start at char 21, se we copy from there
            input = (char)Serial1.read();
            if(i >= 21) {
                buffer[j] = input;
                buffer[j+1] = '\0';
                j++;
            }
        }
        return buffer;
    } else {
        return "No Data";
    }
}

In setup I start my serial connections. A small note, I have an Arduino Mega 2560 and I can use 115200 baud. When using the SoftSerial library always use a lower baud rate, the software emulation of the serial connection can’t handle high baud rates.

I use a timer so I only search for Bluetooth devices every 10 seconds. On line 24 I start command mode (note the .print and not .println!), I delay a bit for the response and setup time, and then I send the command to start the inquiry scan. This command takes a parameter (after the comma) and this means the scan should take 2 seconds. I delay for 5 seconds because I found out that the scan does take 2 seconds but gathering the results takes longer.

I check the length in the buffer, if its longer then 42 characters I know that the Bluetooth module found a device, else I know that no device could be found. It’s a bit of a hack but works wonderfully. Next in the while loop I split the readSerial string in new lines and for every newline I check if the first 19 characters match one of my ID’s. If it does then we print a small line saying we found the cellphone or the laptop.

There are a bit of problems like the delays but I don’t see how I can do it without making the code extreme complex. I created an easy way to do presence detection using a Bluetooth mate.

[Top]

Moving to New York and Staying in a Common Living Sublet

New York is a challenge. You must determine what form of a area you desire It’s the city which never sleeps. It’s a city that can either force you to fall in love with it, or perhaps you despise it for the remainder of your lifestyle.

After you find just how to move to New York, start considering the best way to genuinely live there. If you’re moving to New York with a work, or intend to receive a work when you’re in the city, then you must make certain your salary covers up all your expenses and how much you would set aside for emergencies. In a large city like New York, at times it may believe you are surrounded by men and women, but you are totally alone. Get real about your own personal financing and earn a funding, especially whenever you’re new to New York! My favored thing about New York, of all the wonderful things the city offers, are my pals and colleagues.

A cover letter is incredibly important when applying for employment. It must complement your resume. No seriously, you will attempt to resist purchasing a copy by way of your morning coffee, but it is going to be hopeless. It’s a suitable file for creditors, because they are able to observe how you manage credits so as to choose whether to accept your request or not. You are able to find out more on the separate site InsideSchools, but the finest method to have the information you will need would be to ask different families you know who dwell in NYC.

nyc sublet

The Common I’m staying in at Crown Heights

What Moving to New York Is – and What it Is Not

Rent in NYC is no low-cost event, so should you have a couple friends when renting an apartment. You should think about living on their sofa till you’re secure enough to acquire your own place. It can be hard to seek out homes in the city particularly if you are searching for a location while you’re out of state. You will not locate the ideal apartment without some effort. You may even arrange to remain in a real NYC flat through Airbnb. It is most likely not going to be like your closing residence, but this’s okay. There’s no greater approach to tell if you are going to enjoy living in NYC than to dedicate a couple of days taking a look around.

You’re unlikely to let yourself fail.  It really is possible to find something yourself if you just start looking for it. You simply might need to be the one to indicate that, and consequently don’t be timid. Two startups I’ve heard of that help out a lot with the process are Common Living and Skylight. Common sets you up with a really cool dormitory style sublet, and Skylight is a more streamlined version of Airbnb.

When moving to NYC, you’re probably going to live in a far smaller house than you’re used  to. You should be receptive to the thought of having multiple jobs which may not pay too much. These examples will enable you to understand the details that are crucial to place in your own letter.

If you locate yourself reading this article, it’s possible that you simply’re thinking about moving to New York. Should you need to submit a damage claim, get in touch with your mover.

 

[Top]

Connecting an Arduino and Raspberry Pi

The use case of the GPIO pins on the Raspberry Pi are rather limited and since I have an Arduino Mega 2560 lying around I can easily connect the two. In the next couple of weeks I’ll explain my process of connecting the Arduino with the Raspberry Pi and creating some sort of Library so the Arduino can be controlled from a web browser using a Raspberry Pi.

Connection options for and Arduino to Raspberry Pi connection

There are a couple of options for connecting an Arduino with a Raspberry Pi. The first and obvious one is of course plugging the USB port in the Raspberry Pi. As easy as it sound there are some disadvantages. First you sacrifice a precious USB port and second you now need to do your Arduino development on your Raspberry Pi. Not that easy or handy after all.

There are also bridge boards like Ponte (most popular one) that allow to connect Arduino shields with a Raspberry Pi. There are also extension board for the Raspberry Pi that actually include an Arduino chip (forgot the name). ## Say hello to my little friend UART The Raspberry Pi has a UART port and the Arduino has a Serial port, match made in heaven! My Arduino works with 5V logic and the Raspberry Pi with 3.3V, whatever you do, never and never connect the two without a logic level conversion circuit!

I decided to build a circuit (its more fun!), Sparkfun Logic Level Converter is another option. I used a Bi-Directional MOSFET Level Converter, based on the 2N7000. The schematics are really easy. Edit: thanks Scott for pointing out that R3 should be 10k instead of 10.

Level Converter Circuit

When the low side (3.3V) transmits a logic one the MOSFET is tied high (off) and the high side sees 5V through the pull-up resistor. When the low side transmits a logic zero the MOSFET source pin is grounded and the MOSFET is switched on and the high side is pulled down to 0V.

When the high side (5V) transmits a logic one the MOSFET substrate diode conducts pulling the low side down 0.7V, which in turns the MOSFET on. And so on. This circuit can also be used with I2C. We need two level converting circuits, one for RX and the other for TX.

Configuring the Raspberry Pi

When I started my Pi and loaded the pass through script in my Arduino, nothing happened. Normally the Raspberry Pi sends all the terminal output over the UART at a baud of 115200, but I didn’t receive anything on my serial monitor of my Arduino. I found out that my connection diagram was lacking one important connection. The Raspberry Pi ground pin also needs to be connected to the Arduino ground.

After connecting the Arduino Ground with the Raspberry Pi ground I got the following output on my Serial console.

Successful Communication
Successful Communication

Great, the Raspberry Pi uses the UART to send out all the console information, let’s change that.

First in /etc/inittab comment out (near the end) the following line (adding # before it)

T0:23:respawn:/sbin/getty -L ttyAMA0 115200 vt100

Now the terminal stops listening on the UART pins but the debug information is still send, to change this we change /boot/cmdline.txt and remove the following line:

console=ttyAMA0,115200 kgdboc=ttyAMA0,115200

Now save and reboot and no debugging information should be send. I now can send some text from my Raspberry Pi to my Arduino by using the following command:

echo -e "This is the text I want to display on my Arduino \r\n" > /dev/ttyAMA0

The /dev/ttyAMA0 is the UART device of the Raspberry Pi. My setup is quite complicated since I use SSH to use my Raspberry Pi and the Arduino sends the information from the Raspberry Pi to my serial port.

Next time I talk about different ways to send data from the Raspberry Pi to the Arduino. Possible solutions, PHP, node.js, Python,…

[Top]

Configuring a Raspberry Pi

So I created a new image on the SD (my old one was messed up) and used the script, everything goes fine, I reboot (as instructed) and nothing. Only the OK led flickers 6 times every 5 seconds… great!

After googling I found out that start.elf could not be loaded. The entire process is as follows (combined from a couple of forum posts at Raspberry Pi forums):

  1. When the Pi is turned on the ARM core is off and the GPU core is on. The SDRAM is disabled
  2. The GPU loads the first boot loader which is stored in ROM on the SoC. The first boot loader reads the SD card and loads the second boot loader (bootcode.bin) into the L2 cahce and then runs it.
  3. bootcode.bin enables the SDRAM and then reads the third boot loader (loader.bin) from the SD card into the RAM and runs it.
  4. loader.bin reads the GPU firmware (this is start.elf).
  5. start.elf is loaded and read config.txt (the file used to overclock the RaspPi), cmdline.txt and kernel.img
  6. After kernel.img (a binary image of ARM memory starting at physical address 0 from the ARM’s perspective) and sends a reset on the ARM
  7. The kernel is loaded and the rest of the boot process is handled by init or systemd.

The script works perfectly but it also goes another mile by updating the firmware, using rpi-update. This program allows updating the rpi firmware easily using a simple command. Problem found, the rpi-update fails to write the start.elf file on the SD card (or writes it in a wrong way for some reason). I fixed the problem by just removing the rpi-update command, and everything works!

MOTD Eyecandy

I also changed the welcome message of the Raspberry Pi. SSH users now are greeted by a fancy logo and cool ANSI art eyecandy.

"MOTD"
“MOTD”

Just edit the following file:

[email protected]:/home/pi# nano /etc/motd.tail

And type the greeting text, when using nano it’s also possible to add color (like I did). First press ALT+V and then press ESC. This inserts and escaping character (it looks like ^[ but typing this yourself wont work). After that add the color code, example:

^[[0;32m This is green!

A full list of color codes is available here, and an ansii generator can also be used. Mine has the following:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23

Linux raspberrypi 3.1.9+ #168 PREEMPT Sat Jul 14 18:56:31 BST 2012 armv6l
^[[0;32m
                         .~~.   .~~.
                        '. \ ' ' / .'^[[0;31m
                         .~..~~~..~.
                        : .~.'~'.~. :
                       ~ (   ) (   ) ~
                      ( : '~'.~.'~' : )
                       ~ .~ (   ) ~. ~
                        (  : '~' :  )
                         '~ .~~~. ~'
                             '~'
^[[1;37m
 _____                 _                            _____ _
|  __ \               | |                          |  __ (_)
| |__) |__ _ ___ _ __ | |__   ___ _ __ _ __ _   _  | |__) |
|  _  // _` / __| '_ \| '_ \ / _ \ '__| '__| | | | |  ___/ |
| | \ \ (_| \__ \ |_) | |_) |  __/ |  | |  | |_| | | |   | |
|_|  \_\__,_|___/ .__/|_.__/ \___|_|  |_|   \__, | |_|   |_|
                | |                          __/ |
                |_|                         |___/
^[[0;37m
############################################################

Now I’m ready to install some services (HTTP, FTP, PHP, MYSQL,…) I’m still looking for a lightweight server. Maybe nginx, monkey or lighthttp, apache is a bit to heavy.

[Top]