Thursday, February 5, 2009

Lego Mindstorm NXT controlled via a perl bot ie LEGO::NXT

Ok so I have connected the NXT brick to my mac via bluetooth using these instructions:
http://juju.org/articles/2006/10/22/bluetooth-serial-port-to-nxt-in-osx
Yes Yes I know there for ruby...fuck it.
Ok so after that I have this script running on my computer in perl using lego::nxt and some other modules that you may or may not already have installed. Install all those modules. Now the next thing you need to do is change some of the variables, this bot connects to irc.malvager.com in room #malvager, with a name of nxtbot and a random number appended.


**I'll write a much more thorough and interesting post later about all of this but I am very busy tonight, and just wanted to get some content out.**


If you private message the bot his motor runs.

Here's the script:

use Sys::Hostname;
use Net::IRC;
use strict;
use warnings;
use LEGO::NXT;
use LEGO::NXT::Constants qw(:DEFAULT);
use LEGO::NXT::MacBlueComm;
#This is a wait, so that if the user isn't connected to a network
#it will wait 45 seconds giving them plenty of times to get connected
my $host = hostname();
my $capsule = int(rand(99));
my $hoster = 'nxtbot'.$capsule;
my $irc = new Net::IRC;
my $dev = new LEGO::NXT::MacBlueComm('/dev/tty.NXT-DevB-1');
my $bt = new LEGO::NXT( $dev );
my $speed = 100;
my $tachoticks = 1000;

my $conn = $irc->newconn(
Server => shift || 'irc.malvager.com',
Port => shift || '6667',
Nick => $hoster,
Ircname => 'I like to greet!',
Username => 'fucker'
);

# We're going to add this to the conn hash so we know what channel we
# want to operate in.
$conn->{channel} = shift || '#malvager';

sub on_connect {

# shift in our connection object that is passed automatically
my $conn = shift;

# when we connect, join our channel and greet it
$conn->join($conn->{channel});
$conn->privmsg($conn->{channel}, 'Hello everyone!');
$conn->{connected} = 1;

}

sub on_join {

# get our connection object and the event object, which is passed
# with this event automatically
my ($conn, $event) = @_;

# this is the nick that just joined
my $nick = $event->{nick};
# say hello to the nick in public
$conn->privmsg($conn->{channel}, "Fuck You, $nick!");
}

sub on_part {

# pretty much the same as above

my ($conn, $event) = @_;

my $nick = $event->{nick};
$conn->privmsg($conn->{channel}, "Such a dick, $nick!");

}

sub on_msg {
my ($conn, $event) = @_;
my $text = $event->{args}[0];
$bt->set_output_state( $NXT_NORET, $NXT_MOTOR_A, $speed, $NXT_MOTOR_ON|$NXT_REGULATED, $NXT_REGULATION_MODE_MOTOR_SPEED, 0, $NXT_MOTOR_RUN_STATE_RUNNING, $tachoticks );
}
sub on_public {
# on an event, we get connection object and event hash
# regex the text to see if it begins with clip

# $event->{to}[0] is the channel where this was said
}
$conn->add_handler('public', \&on_public);

$conn->add_handler('msg', \&on_msg);
# add event handlers for join and part events
$conn->add_handler('join', \&on_join);
$conn->add_handler('part', \&on_part);

# The end of MOTD (message of the day), numbered 376 signifies we've connect
$conn->add_handler('376', \&on_connect);

#ccgenerator
$irc->start();

1 comment:

Chris said...

Awesome; I might have to try this out sometime. Got some spare coin, sounds fun