My brother has lent me a Lego Mindstorms version 1.5. It is quite old, by the specifications I think that the product may be dated of 1998. My objective is to make it work under linux in a modern computer without a serial cable, to let my son work with it.
I suppose that if you come to this page you are somewhat familiar with Lego Mindstorms, however, I will describe some of the main elements of the kit:
I will try the following options in the same order depicted here:
Of course, there are other options, but I won't discuss here.
Modern computers doesn't have an RS232 interface anymore. The replacement for this are the USB ports, that any computer have lots of them. You can simulate an RS232 with an adapter. For my purposes I've bought an adapter from Star Tech called ICUSB232. Check it out:
One step is to check that it works properly under linux. Here are the basic steps:
Don't plug the USB-RS232 adapter yet!!! Before this, run a tail -f /var/log/messages
or tail -f /var/log/syslog
(depending of your version of Linux). To be sure, just run both at a time:
$ sudo tail -f /var/log/messages /var/log/syslog
Now, plug your cable. You should view something like this:
Dec 30 12:29:18 petrus kernel: [17198.868053] usb 4-1: new full speed USB device number 3 using uhci_hcd Dec 30 12:29:18 petrus mtp-probe: checking bus 4, device 3: "/sys/devices/pci0000:00/0000:00:1a.1/usb4/4-1" Dec 30 12:29:18 petrus kernel: [17199.032177] pl2303 4-1:1.0: pl2303 converter detected Dec 30 12:29:18 petrus kernel: [17199.044237] usb 4-1: pl2303 converter now attached to ttyUSB0 Dec 30 12:29:19 petrus mtp-probe: bus: 4, device: 3 was not an MTP device
This pl2303 converter now attached to ttyUSB0
means that your USB device is /dev/ttyUSB0
. This is very important in the further steps.
This is my first attempt and my first try to make the USB-RS232 adaptor to work. I know that Java doesn't have a good USB or serial support, so the second try will be a major problem. My hopes are that NQC, as probably is made natively in C or similar, will have a native support for USB/RS-232 more robust.
NQC is a programming language by itself, don't take it slightly. You can find documentation about NQC here: http://bricxcc.sourceforge.net/nqc/.
You can install NQC in Ubuntu by typing:
$ sudo apt-get install nqc
My first step will be to reach the RS232 adapter correctly and reach the black box. So, connect your RS232 adapter to the black box and make sure this is on, and with the batteries connected. The “on” in this unit means to move the switch to the biggest triangle:
Optionally, you can turn on the RCX and point it to the black unit, so both can see each other. Remember that the connection is via infrared.
Now run the following code:
nqc -S/dev/ttyUSB0 -msg 123456
When running it, I've observed no error messages and no Could not open serial port or USB device
message. This is important. When running this command, you should see a green light in the black box during a moment:
Other commands to test proper running
You can try other commands that doesn't require to have a program like this:
$ nqc -S/dev/ttyUSB0 -pgm 1 No firmware installed on RCX
The next step is installing the firmware in the RCX. There are various firmwares out there, but for NQC we need the official firmware from LEGO.
Check out the box of mindstorm: it should be a CD which contains the firmware. To get the firmware from the CD, you should face the following scenarios:
firm0309.lgo
or something like this. sudo apt-get install unshield
and then unshield x PATH-TO-YOUR-CAB-FILE
.Placing the firmware file in the yellow box (the RCX) is called “download the firmware”. I particularly think that “download” is not the best word for this, but it's the word used everyplace.
Run the following command:
$ nqc -S/dev/ttyUSB0 -firmware firm0309.lgo Downloading firmware:.....................
You should see a message in the RCX about the progress of the download:
and a green diode lighting in the black box (it's not easy to see it):
After the process is finished, the LCD screen of the RCX should show a 0000 message, and a sound is reproduced:
The installation of the firmware will be there until the batteries are removed.
For example, the following command:
nqc -S/dev/ttyUSB0 -pgm 2
Will have the effect that in the RCX the program number 2 is selected:
I've attached a motor to the “C” square of the RCX:
And this is my first program:
task main() { OnFwd( OUT_C ); Wait( 400 ); OnRev( OUT_C ); Wait( 400 ); Off( OUT_C ); }
To run and download the program into the RCX, you should do the following:
$ nqc -S/dev/ttyUSB0 -d -run Hello.nqc Downloading Program:..complete Battery Level = 8.7 V
Now, click on the “run” button on the RCX: the program will start, moving the motor in one direction and then in the opposite direction.
You should have ant
installed. To do so,
$ sudo apt-get install ant
And should have libusb-dev
installed also.
sudo apt-get install libusb-dev
After doing that, make sure that the usb.h file is available in your destination system.
Lejos is a Java Virtual Machine for the RCX (the yellow box). It's a replacement for the Lego firmware, so, if your CD of mindstorms is broken, it's the perfect solution.
The web page has a fantastic tutorial that shows the steps to be taken to have this stuff running.
When I've checked out the web page, the download link didn't work. But you can go directly to the sourceforge webpage in order to download the files.
When you download and uncompress the file leJOS_NXJ_0.9.1beta-3.tar.gz
, you should check out the README.html file.
Then start by setting the environment variable NXJ_HOME:
$ cd LEJOS_NXJ_DIRECTORY # the files ACKNOWLEDGMENTS.txt, LICENSE.txt, RELEASENOTES.txt should be there $ NXJ_HOME=$(pwd) $ export NXJ_HOME
Then go to the build
directory and run ant
. This is for construct the USB support for java.
In my case, this command failed. The problem was in the build.xml
file located in NXJ_HOME/build/libnxt. I've reconstructed the compiler command:
gcc -Wall -std=gnu99 -fPIC main_jlibnxt.c
And it fails with this error:
main_jlibnxt.c:28:17: fatal error: usb.h: No such file or directory
Solution:
find / -iname usb.h 2>/dev/null
: in my system this appears in /usr/include/usb.h
I've fixed the solution executing the make
command and then:
$ cd NXJ_HOME/build $ ant