I julen købte jeg en raspberry Pi B+. Jeg har nu rodet lidt med den og fået den til at køre hæderligt.
Den er blevet overklokket til 1GHz og der er sat lcd display (HD44780) på. Yderligere har jeg fået wifi til at virke.
For at få displayet til at virke, har jeg programmeret i perl.
#!/usr/bin/perl use strict; use warnings; use Device::BCM2835; use Device::BCM2835::LCD; use Sys::Hostname; use Net::Interface; use Socket; use File::Touch; # Init display, specifying the GPIO pin connections my $lcd = Device::BCM2835::LCD->new(); my $inetaddr; my $lockfile = "/tmp/lcd.locked"; my @lock = ($lockfile); my $dato; my $tid; my $host; my @raatid; my @linier = qw(1 2 3 4); my $ip; my $int; my $lcdlin; my $update = 0; my %interfaces = (); sub getInterfaces { my $intRef = shift; my @int; my $ip; my $iface; @int = Net::Interface->interfaces(); foreach $iface (@int) { next if ( "$iface" eq "lo" ); open IP, "/sbin/ip addr show $iface|" or die "Kunne ikke udfore \'ip\'\n"; while (<IP>) { next if ( ! /inet / ); s/.*inet (\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3})\/.*/\/; $$intRef{$iface} = $1; last; } close IP; } } unlink $lockfile if ( -e $lockfile); $lcd->init ( Display => 2004, pin_rs => &RPI_GPIO_P1_24, pin_e => &RPI_GPIO_P1_23, pin_d4 => &RPI_GPIO_P1_07, pin_d5 => &RPI_GPIO_P1_11, pin_d6 => &RPI_GPIO_P1_13, pin_d7 => &RPI_GPIO_P1_15, ); $host = hostname; while ( 1 == 1) { if ( ! -e $lockfile ) { # Lås display touch(@lock); # Find tid, dato, hostnavn $host = hostname if ($host eq "raspberry"); @raatid = localtime(time); $tid = sprintf "%02s:%02s:%02s", $raatid[2], $raatid[1], $raatid[0]; $dato = sprintf "%02s/%02s/%02s", $raatid[3], $raatid[4]+1, $raatid[5]-100; $linier[0] = sprintf "%-11s %8s", $host ,$dato; $linier[1] = sprintf " %8s", $tid; $lcd->SetPos(1, 0); $lcd->PutMsg($linier[0]); $lcd->SetPos(2, 0); $lcd->PutMsg($linier[1]); $lcdlin = 4; if ( $update == 0 ) { %interfaces = (); getInterfaces(\%interfaces); $lcd->SetPos(3, 0); $lcd->PutMsg(" "); $lcd->SetPos(4, 0); $lcd->PutMsg(" "); foreach $int ( keys %interfaces ) { $linier[$lcdlin-1] = sprintf "%-5s%15s", "$int", $interfaces{$int}; print "$linier[$lcdlin-1]\n"; $lcd->SetPos($lcdlin, 0); $lcd->PutMsg($linier[$lcdlin-1]); $lcdlin--; } } if ( $update == 15 ) { $update = 0; } else { $update++; } unlink $lockfile if ( -e $lockfile ); } sleep 1; }
Hvis der findes en fil der hedder /tmp/lcd.locked, vil der ikke ske noget på displayet.
Programmet skal udføres som root. Enten med sudo eller logget ind som root.
For at få displayet til at virke, skal der indstalleres flere pakker. Et c-lib og to perl-moduler:
libbcm2835 fra http://www.airspayce.com/mikem/bcm2835/
Device::BCM2835 fra cpan
Device::BCM2835::LCD også fra cpan
I Device::BCM2835::LCD er der et par fejl, som nemt rettes.
I filen /urs/local/share/perl/5.14.2/Device/LCD.pm er der et par linier der skal rettes. RPI_GPIO_P1_23 11 RPI_GPIO_P1_24 8 # init: set up LCD lines. # Defaults are the "common" GPIO pins, and 20x4 screen sub init { my $self = shift; my %defaults = qw( Display 2004 pin_rs RPI_GPIO_P1_24 pin_e RPI_GPIO_P1_23 pin_d4 RPI_GPIO_P1_07 pin_d5 RPI_GPIO_P1_11 pin_d6 RPI_GPIO_P1_13 pin_d7 RPI_GPIO_P1_15 ); my %args = (%defaults, %_); I afsnitet med initialize the device skal følgende rettes: Device::BCM2835::gpio_write($e,0); # start with EN low nibbleToLines(3); # high nibble 0x03 &strobe_E; # strobe EN usleep(5000); nibbleToLines(3); # low nibble 0x03 &strobe_E; # strobe EN
Device::BCM2835::LCD er nu rettet på CPAN, så det burde ikke være nødvendigt at ændre noget i filen.
/Tomas