Trying out the Adafruit WebIDE on my Raspberry Pi
The Adafruit WebIDE is a web-based editor (Integrated Development Environment) designed to run on the Raspberry Pi similar to the Cloud9 IDE. Because it’s entirely web-based there’s no need to install any software on your computer, just launch a browser and connect to your Pi.
First I wanted to try it on Arch Linux ARM but because of lots of segmentation faults in npm, the package manager of Node.js, I was not able to completely install the IDE.
Now I will try it on Raspbian “wheezy”.
Install Raspbian on your RPi
- Download the latest Raspbian image from http://www.raspberrypi.org/downloads.
- Copy the image to your Raspberry Pi SD card:
[chris@thinkpad Downloads]$ unzip 2012-12-16-wheezy-raspbian.zip Archive: 2012-12-16-wheezy-raspbian.zip inflating: 2012-12-16-wheezy-raspbian.img [chris@thinkpad Downloads]$ sudo dd if=2012-12-16-wheezy-raspbian.img of=/dev/mmcblk0 3788800+0 records in 3788800+0 records out 1939865600 bytes (1.9 GB) copied, 529.273 s, 3.7 MB/s [chris@thinkpad Downloads]$
- Use gparted to resize the the partitions on your SD card as you like or use sudo raspi-config and select Expand root partition to fill SD card later under Raspbian to do this.
- Mount the SD card and check that the serial console is enabled:
[chris@thinkpad ~]$ sudo mkdir /mnt/rpi [chris@thinkpad ~]$ sudo mount /dev/mmcblk0p2 /mnt/rpi [chris@thinkpad ~]$ sudo vim /mnt/rpi/etc/inittab [chris@thinkpad ~]$ tail -n 2 /mnt/rpi/etc/inittab #Spawn a getty on Raspberry Pi serial line T0:23:respawn:/sbin/getty -L ttyAMA0 115200 vt100 [chris@thinkpad ~]$ # copy other stuff to the SD card [chris@thinkpad ~]$ sudo umount /mnt/rpi [chris@thinkpad ~]$
Boot Raspbian and open a console, I’m using no display on my Raspberry Pi but a 3V3 FTDI USB serial cable, see http://elinux.org/RPi_Serial_Connection and http://www.element14.com/community/groups/raspberry-pi/blog/2012/07/18/look-ma-no-display-using-the-raspberry-pi-serial-console for more details.
You will need to connect the pins Ground, GPIO 14 (TXD) and GPIO 15 (RXD).
Open a serial console, configuration: /dev/ttyUSB0 : 115200,8,N,1, you may need to hit a few times enter until the login prompt is visible, then login as user pi with password raspberry.
Gtkterm is a simple GTK+ terminal used to communicate with a serial port.
You can also use screen sudo screen /dev/ttyUSB0 115200 or minicom to open the serial port.
Get a network connection on your Pi via Ethernet, WiFi or 3G.
Install the Adafruit WebIDE
Update and install the dependencies:
pi@raspberrypi:~$ sudo apt-get update
pi@raspberrypi:~$ sudo apt-get upgrade
pi@raspberrypi:~$ sudo apt-get install nodejs npm redis-server git vim
Install the Adafruit-WebIDE:
pi@raspberrypi:~$ git clone git://github.com/adafruit/Adafruit-WebIDE.git
Cloning into 'Adafruit-WebIDE'...
remote: Counting objects: 3769, done.
remote: Compressing objects: 100% (1628/1628), done.
remote: Total 3769 (delta 2164), reused 3618 (delta 2013)
Receiving objects: 100% (3769/3769), 19.34 MiB | 734 KiB/s, done.
Resolving deltas: 100% (2164/2164), done.
pi@raspberrypi:~$ cd Adafruit-WebIDE
pi@raspberrypi:~/Adafruit-WebIDE$ mkdir tmp
pi@raspberrypi:~/Adafruit-WebIDE$ npm config set tmp tmp
pi@raspberrypi:~/Adafruit-WebIDE$ npm install
Just try it again if you get the error npm ERR! Error: failed to fetch from registry or something similar, npm is really stupid, a slow 3G connection is not fast enough for npm to install everything, probably because npm tries to download multiple packages simultaneously, this is the problem when everybody invents his own package manager, apt-get has no problem with slow network connections, it may take a bit longer but it works. It will download roughly 100 MB, I don’t know for what all these dependencies are necessary, as long as it works I don’t care.
The next problem:
> gnu-tools@0.0.8 postinstall /home/pi/Adafruit-WebIDE/node_modules/jsDAV/node_modules/gnu-tools
> node ./install.js
sh: 1: node: not found
npm ERR! error installing gnu-tools@0.0.8
npm WARN This failure might be due to the use of legacy binary "node"
npm WARN For further explanations, please read
npm WARN /usr/share/doc/nodejs/README.Debian
npm WARN
npm ERR! error installing jsDAV@0.1.4
npm ERR! gnu-tools@0.0.8 postinstall: `node ./install.js`
npm ERR! `sh "-c" "node ./install.js"` failed with 127
npm ERR!
npm ERR! Failed at the gnu-tools@0.0.8 postinstall script.
npm ERR! This is most likely a problem with the gnu-tools package,
npm ERR! not with npm itself.
npm ERR! Tell the author that this fails on your system:
npm ERR! node ./install.js
npm ERR! You can get their info via:
npm ERR! npm owner ls gnu-tools
npm ERR! There is likely additional logging output above.
npm ERR!
npm ERR! System Linux 3.2.27+
npm ERR! command "/usr/bin/nodejs" "/usr/bin/npm" "install"
npm ERR! cwd /home/pi/Adafruit-WebIDE
npm ERR! node -v v0.6.19
npm ERR! npm -v 1.1.4
npm ERR! code ELIFECYCLE
npm ERR! message gnu-tools@0.0.8 postinstall: `node ./install.js`
npm ERR! message `sh "-c" "node ./install.js"` failed with 127
npm ERR! errno {}
npm ERR!
npm ERR! Additional logging details can be found in:
npm ERR! /home/pi/Adafruit-WebIDE/npm-debug.log
npm not ok
pi@raspberrypi:~/Adafruit-WebIDE$
To fix this error we can create a symlink from /usr/bin/nodejs to /usr/bin/node and rerun npm install:
pi@raspberrypi:~/Adafruit-WebIDE$ which node
pi@raspberrypi:~/Adafruit-WebIDE$ which nodejs
/usr/bin/nodejs
pi@raspberrypi:~/Adafruit-WebIDE$ sudo ln -s /usr/bin/nodejs /usr/bin/node
pi@raspberrypi:~/Adafruit-WebIDE$ npm install
pi@raspberrypi:~/Adafruit-WebIDE$
Edit config/config.js and change the port from "port": 80, to "port": 8080,:
pi@raspberrypi ~/Adafruit-WebIDE $ vim config/config.js
pi@raspberrypi ~/Adafruit-WebIDE $ head -4 config/config.js
//NOTE: Changes in this file will not persist between updates at this point.
//Change port number in /config.
exports.editor = {
"port": 8080,
pi@raspberrypi ~/Adafruit-WebIDE $
Now it should be possible to run the Adafruit WebIDE:
pi@raspberrypi:~/Adafruit-WebIDE$ node server.js
git push queue init
REPOSITORY_PATH /home/pi/Adafruit-WebIDE/repositories
info: Logger initialized!
info - socket.io started
webdav filesystem mounted
Find out the IP of your Pi, open a browser and point it to http://10.42.0.60:8080.
pi@raspberrypi ~/Adafruit-WebIDE $ ifconfig eth0
eth0 Link encap:Ethernet HWaddr b5:33:ff:33:ee:aq
inet addr:10.42.0.60 Bcast:10.42.0.255 Mask:255.255.255.0
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
RX packets:21867 errors:0 dropped:0 overruns:0 frame:0
TX packets:8684 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:1000
RX bytes:27338495 (26.0 MiB) TX bytes:1268356 (1.2 MiB)
pi@raspberrypi ~/Adafruit-WebIDE $
One of the many useful features of the WebIDE is that all of your code will be stored in the cloud over at bitbucket.org. So, before we can go any further, you will want to create your free Bitbucket account. If you already have one, you can use your existing account, or create one specifically for the Raspberry Pi WebIDE.
I don’t know if I should love or hate this feature but since I have already a free Bitbucket account I will do it.
The good thing is, that it will create a private Git repository (my-pi-projects), so my code is by default not visible to everybody and I have always a backup.
Test it
First test if the hardware is working correctly, I’ve connected a single LED to GPIO.17 and V3.3, lets switch it on and off from the terminal:
pi@raspberrypi ~ $ sudo sh -c "echo 17 > /sys/class/gpio/export"
pi@raspberrypi ~ $ sudo sh -c "echo out > /sys/class/gpio/gpio17/direction"
pi@raspberrypi ~ $ sudo sh -c "echo 1 > /sys/class/gpio/gpio17/value"
pi@raspberrypi ~ $ sudo sh -c "echo 0 > /sys/class/gpio/gpio17/value"
pi@raspberrypi ~ $
The Adafruit WebIDE has also a built-in terminal, so we can do it there too.
Now we will write a small python script to toggle the LED:
The WebIDE feels really good even Crtl+C is working if you want to stop a program.
test.py:
#!/usr/bin/env python
# -*- coding: utf-8 -*-
from time import sleep
from leds import *
print("Hello World")
export_pins(17)
setpindirection(17, "out")
counter = 0
while(1):
writepins(17, 1)
ledon() # switch on the green OK led
sleep(1)
writepins(17, 0)
ledoff() # switch off the green OK led
sleep(1)
print("counter: %i" % counter)
counter+=1
leds.py:
#!/usr/bin/env python
# coding=utf8
def ledon():
value = open("/sys/class/leds/led0/brightness","w")
value.write(str(1))
value.close()
def ledoff():
value = open("/sys/class/leds/led0/brightness","w")
value.write(str(0))
value.close()
def ledheartbeat():
value = open("/sys/class/leds/led0/trigger","w")
value.write("heartbeat")
value.close()
def export_pins(pins):
try:
f = open("/sys/class/gpio/export","w")
f.write(str(pins))
f.close()
except IOError:
print "GPIO %s already Exists, so skipping export gpio" % (str(pins), )
def unexport_pins(pins):
try:
f = open("/sys/class/gpio/unexport","w")
f.write(str(pins))
f.close()
except IOError:
print "GPIO %s is not found, so skipping unexport gpio" % (str(pins), )
def setpindirection(pin_no, pin_direction):
gpiopin = "gpio%s" % (str(pin_no), )
pin = open("/sys/class/gpio/"+gpiopin+"/direction","w")
pin.write(pin_direction)
pin.close()
def writepins(pin_no, pin_value):
gpiopin = "gpio%s" % (str(pin_no), )
pin = open("/sys/class/gpio/"+gpiopin+"/value","w")
if pin_value == 1:
pin.write("1")
else:
pin.write("0")
pin.close()
def readpins(pin_no):
gpiopin = "gpio%s" % (str(pin_no), )
pin = open("/sys/class/gpio/"+gpiopin+"/value","r")
value = pin.read()
print "The value on the PIN %s is : %s" % (str(pin_no), str(value))
pin.close()
return int(value)