まとめindex
最新のトピック 
KEYWORDS
Raspberry PI と GPIOで7セグ
2012/07/25
Raspberry PI には、GPIO端子が付いています。面白そうなので折角だから使ってみましょう。
Raspberry PI のGPIOのピン配置とプログラムサンプルは以下に情報があります。
http://elinux.org/RPi_Low-level_peripherals
Perl使いなので、Perlで動かすべくセットアップを始めましたが、ちょっとハマったことがありました。セットアップしたRaspbian "wheezy"のgccのバージョンは4.6。しかし、インストールされているperlは4.7でクロスコンパイルされているようです。従いまして、そのままドライバインストール&Perlのモジュールインストールと進むと失敗します。まずは apt-get install gcc-4.7 で、gccをバージョンアップすることから。
次にドライバをインストールし、Perlモジュールのインストール。ドライバはここ。
http://www.open.com.au/mikem/bcm2835/
Perlのモジュールは以下にあります。
http://search.cpan.org/~mikem/Device-BCM2835-1.0/lib/Device/BCM2835.pm
さて、サンプルプログラムを参考にして適当なLEDを点灯させてみると、何も問題なく光る光る。
回路を組んで7セグを光らせてみました。

Raspberry PI x 7segment LED
数字全パターン光らせた動画はこちら。ダイナミック点灯させたので、動画にするとチラチラしますが・・・。
回路図は以下。フォトカプラを使ってスイッチしています。アノードコモンでダイナミック点灯しているので抵抗1個しか付けてないですが、全点灯なら抵抗は全LEDつけましょう。

7セグ回路図
プログラムは以下。
#!/usr/bin/perl use Device::BCM2835; use strict; Device::BCM2835::init(); set_output(3); set_output(5); set_output(7); set_output(11); set_output(13); set_output(15); set_output(19); set_output(21); segment(0, 1000); segment(1, 1000); segment(2, 1000); segment(3, 1000); segment(4, 1000); segment(5, 1000); segment(6, 1000); segment(7, 1000); segment(8, 1000); segment(9, 1000); exit; sub set_output { my $pin = shift; my $device_name = sprintf("RPI_GPIO_P1_%02d", $pin); Device::BCM2835::gpio_fsel(eval("&Device::BCM2835::$device_name"), &Device::BCM2835::BCM2835_GPIO_FSEL_OUTP); return 1; } sub gpio_write { my $pin = shift; my $onoff = shift; my $delay = shift; my $device_name = sprintf("RPI_GPIO_P1_%02d", $pin); Device::BCM2835::gpio_write(eval("&Device::BCM2835::$device_name"), $onoff); if($delay) { Device::BCM2835::delay($delay); } return 1; } sub segment { my $seg = shift; my $delay = shift; if($seg == 0) { dynamic_led($delay, 3, "13,15,19,11,7,3"); } if($seg == 1) { dynamic_led($delay, 10, "15,19"); } if($seg == 2) { dynamic_led($delay, 4, "13,15,5,7,11"); } if($seg == 3) { dynamic_led($delay, 4, "13,15,5,19,11"); } if($seg == 4) { dynamic_led($delay, 5, "3,5,15,19"); } if($seg == 5) { dynamic_led($delay, 4, "13,3,5,19,11"); } if($seg == 6) { dynamic_led($delay, 3, "13,3,5,7,11,19"); } if($seg == 7) { dynamic_led($delay, 5, "3,13,15,19"); } if($seg == 8) { dynamic_led($delay, 3, "13,3,5,7,11,19,15"); } if($seg == 9) { dynamic_led($delay, 3, "13,3,5,11,19,15"); } } sub dynamic_led { my $delay = shift; my $dynamic = shift; my $data = shift; my @led = split(/,/, $data); my $max_times = $delay / ($dynamic * @led); for(my $i=0; $i<$max_times; $i++) { foreach my $target(@led) { gpio_write($target, 1, $dynamic); gpio_write($target, 0, 0); } } }
ツイート