キャラクタLCDをアクセス

はじめに

Raspberry Pi 3でCentOS7からのキャラクタLCDへのアクセス方法をまとめました。
過去の資産(秋月のLCD)が何個jかありますので、これらのアクセスについて記します。

HD44780互換IC系

概要

パラレルバスインタフェースといえばこの系統が主流ですね。往年の68系バスに接続するインタフェース仕様です。
8ビット以外に4ビットでのアクセスが可能ですが、どうしてもData(4)+E+R/W*RSで最低、7本のインタフェースが必要になります。

#ref(): File not found: "SC1602BSLB.jpg" at page "キャラクタLCDをアクセス"

#ref(): File not found: "sc1602bslb_pin_assign.jpg" at page "キャラクタLCDをアクセス"

基本方針

ピン数の節約のため、4bitモードででアクセスし必要なソフトはCで作成することにします。

ハードウェア

まず、ピンの割り当てですが、他の機能と併用されていないピンを使用することにします。
電源はRaspberryPi?の3.3Vを使用します。PINのラッチアップ等を避けるため、同一電源とします。

Raspberry PiLCD
SignalPin#SignalPin#
3V301,173V301
GND34,39GND02
VO(contrast)03
GPIO 2038E06
GPIO 2140R/_W05
GPIO 2215RS04
GPIO 2316D411
GPIO 2418D512
GPIO 2522D613
GPIO 2637D714

信号の衝突を避けるため、R/_W、EはPulldownを行います。
また、コントラスト調整(VO)は20kΩのVRにより電位を調整するようにします。

ソフトウェア

Read/Write用の関数を作成してアクセスすることになります。
たとえば

void lcd_init( void );
void lcd_write( int mode, int data );
int lcd_read( int mode, init data );

基本として、各種のコマンドを作成することとします。上記の関数を利用して

void lcd_set_position( int x, int y );
void lcd_clear( void );
void lcd_print(char *str );

位を用意すれば良いでしょう。

GPIOへのアクセステスト

では実際にアクセスできるかテストします。

# echo 21 > /sys/class/gpio/export
# ls /sys/class/gpio/
export  gpio21  gpiochip0  gpiochip100  unexport
# ls /sys/class/gpio/gpio21/
active_low  device  direction  edge  power  subsystem  uevent  value
# echo out > /sys/class/gpio/gpio21/direction
# echo 1 > /sys/class/gpio/gpio21/value
# echo 0 > /sys/class/gpio/gpio21/value
# echo 21 > /sys/class/gpio/unexport
# ls /sys/class/gpio/
export  gpiochip0  gpiochip100  unexport
#

まずは、GPIOには簡単にアクセスできる方法は用意されていました。

その他のアクセス方法

では、C等でGPIO/IIC/SPIなどのインタフェースはどうすればいいのかを調べました。
Rasbianでは、ドライバーが用意されているようですが、CentOS7は上記の状況です。
検索してみたところ、「BCM 2835」という、CのRaspberry Pi 用のIOライブラリがありました。
早速ダウンロードしてコードを見ると、IOアドレス空間を直接アクセスしています。
ぎょっとしましたが、Linux Kernel 2.6.23-rc1からUIOがマージされて、このようなことが可能になったようです。
コードでは、/dev/memをmmapし、メモリ空間をアクセスしています。また、DeviceTree?にも対応しています。
早速、CentOSでも調べてみます。

# ll /dev/mem
crw-r----- 1 root kmem 1, 1  1月  1  1970 /dev/mem
#

ありました。これでイケルようです。

BCM 2835

概要

Raspberry Pi用のCライブラリで、

 This is a C library for Raspberry Pi (RPi).
 It provides access to GPIO and other IO functions on the Broadcom BCM 2835 chip,
allowing access to the GPIO pins on the 26 pin IDE plug on the RPi board
so you can control and interface with various external devices.
 It provides functions for reading digital inputs and setting digital outputs,
using SPI and I2C, and for accessing the system timers.
 Pin event detection is supported by polling (interrupts are not supported).
It is C++ compatible, and installs as a header file and non-shared library
on any Linux-based distro (but clearly is no use except on Raspberry Pi
or another board with BCM 2835).

とありますので、UART、割り込み以外は、おおよそ何でもできそうです。

ライブラリのビルド

早速ビルドしてみます。

# cd /opt/
# mkdir bcm2835
# cd bcm2835/
# curl http://www.airspayce.com/mikem/bcm2835/bcm2835-1.50.tar.gz -O
# tar zxvf bcm2835-1.50.tar.gz
# ls
bcm2835-1.50  bcm2835-1.50.tar.gz
# cd bcm2835-1.50
# ./configure
# make
# make install

以下のファイルがインストールされます。

種別ファイル
Lib/usr/local/lib/libbcm2835.a
Header/usr/local/include/bcm2835.h
Document?

Kernelをアップデートするたびにmakeしなくてよさそうなのがありがたい。

テスト

サンプルのLEDチカチカがありますので、テストします。
LEDはGPIO-17(コネクタP1の11)に接続し、1秒間隔で点滅(ON:500ms、OFF:500ms)します。

# cd examples/
# cd blink/
# gcc blink.c -o blink_led -l rt -l bcm2835
# ./blink_led

※-l rt はreal-time extensionsです。(RTカーネルではないので、意味ないかもしれませんが)

お疲れ様でした。


トップ   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS