Min Raspberry Pi B+ med lcd

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.

Raspberry Pi B+ med lcd
Raspberry Pi B+ med lcd

Den er blevet overklokket til 1GHz og der er sat lcd display (HD44780) på. Yderligere har jeg fået wifi til at virke.

Raspberry pi indefra
Raspberry pi indefra

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

1 kommentar

  1. Device::BCM2835::LCD er nu rettet på CPAN, så det burde ikke være nødvendigt at ændre noget i filen.

    /Tomas

Der er lukket for kommentarer.