WaveShare 1.3インチOLEDモジュールをラズパイで試してみた

エンジニア

千石電商で見つけて遊んでみたくなって買ったものの1つ。

WaveShare 13890
1.3インチ 128×64 OLEDディスプレイHAT for RaspberryPi
1.3inch OLED display HAT for Raspberry Pi, 128x64 pixels, SPI/I2C interface
WaveShare 13890 1.3インチ 128×64 OLEDディスプレイHAT for RaspberryPi
千石電商 秋葉原 パーツとツールのスーパーマーケット。半導体・電子部品・コネクタ・ケーブル・基板・工具・パソコン関連・電池・充電器・ボードなどを幅広く扱っています。

1.6インチLCDモジュールはうまく動かなかったが、こちらはpythonではすんなり動いた。

公式のドキュメント

https://www.waveshare.com/wiki/1.3inch_OLED_HAT

基本的なセットアップは以下とほぼ同様。

サンプルダウンロード

ドキュメントに書いてあるコマンドそのままだと、解凍したときにファイルと同名のディレクトリが作られず、カレントにそのまま解凍されてしまい、コマンド通りに動かなくなる。

sudo apt-get install p7zip-full
wget https://www.waveshare.com/w/upload/5/53/1.3inch-OLED-HAT-Code.7z
7zr x 1.3inch-OLED-HAT-Code.7z -r -o1.3inch-OLED-HAT-Code  # ここの-oでディレクトリ明示しないとダメだった
sudo chmod 777 -R  1.3inch-OLED-HAT-Code
cd 1.3inch-OLED-HAT-Code/RaspberryPi/

今回は手っ取り早く、pythonを試す。

pythonのサンプルを試す

cd python3
sudo python3 main.py
sudo python3 key_demo.py

これは成功。

main.py。テキストが表示されたあと、画が出る。

key_demo.py。各キーに反応した表示になる。

Cのサンプルを試す

ドキュメントに従い、ビルド。

こちらはmakeでエラー。リンクで何かの定義が衝突して失敗しているらしい。

gcc -D USE_BCM2835_LIB -c  obj/dev_hardware_i2c.c -o bin/dev_hardware_i2c.o -lbcm2835 -lm
gcc -D USE_BCM2835_LIB -c  obj/main.c -o bin/main.o -lbcm2835 -lm
gcc -D USE_BCM2835_LIB -c  obj/sysfs_gpio.c -o bin/sysfs_gpio.o -lbcm2835 -lm
gcc -D USE_BCM2835_LIB ./bin/font12.o ./bin/font16.o ./bin/font20.o ./bin/font24.o ./bin/font8.o ./bin/DEV_Config.o ./bin/KEY_APP.o ./bin/OLED_Driver.o ./bin/OLED_GUI.o ./bin/dev_hardware_SPI.o ./bin/dev_hardware_i2c.o ./bin/main.o ./bin/sysfs_gpio.o -o main -lbcm2835 -lm
/usr/bin/ld: ./bin/OLED_Driver.o:(.bss+0x0): multiple definition of `Buffer'; ./bin/KEY_APP.o:(.bss+0x0): first defined here
/usr/bin/ld: ./bin/OLED_Driver.o:(.bss+0x400): multiple definition of `sOLED_DIS'; ./bin/KEY_APP.o:(.bss+0x400): first defined here
/usr/bin/ld: ./bin/OLED_GUI.o:(.bss+0x0): multiple definition of `Buffer'; ./bin/KEY_APP.o:(.bss+0x0): first defined here
/usr/bin/ld: ./bin/OLED_GUI.o:(.bss+0x400): multiple definition of `sOLED_DIS'; ./bin/KEY_APP.o:(.bss+0x400): first defined here
/usr/bin/ld: ./bin/main.o:(.bss+0x0): multiple definition of `Buffer'; ./bin/KEY_APP.o:(.bss+0x0): first defined here
/usr/bin/ld: ./bin/main.o:(.bss+0x400): multiple definition of `sOLED_DIS'; ./bin/KEY_APP.o:(.bss+0x400): first defined here
collect2: error: ld returned 1 exit status
make: *** [Makefile:30: main] エラー 1

コードを見たところ、複数の箇所からincludeされている、OLED_Driver.hに定義されている2つのグローバル変数が原因。(Buffer, sOLED_DIS) この2つは今見る限りOLED_Driver.c内でしか使われていないため、こちらに定義を移動してみたところ、リンクが通った。

OLED_Driver.h 以下の2箇所をコメントアウト。

// char Buffer[OLED_WIDTH * OLED_HEIGHT / 8];
// OLED_DIS sOLED_DIS;

OLED_Driver.c 14行目あたり

// 以下の行をコメントアウト
// extern OLED_DIS sOLED_DIS;
// 以下の2行を追加
OLED_DIS sOLED_DIS;
char Buffer[OLED_WIDTH * OLED_HE

これで再度ビルド。リンクも成功。

make clean && make
sudo ./main

こちらはキー入力を表示するサンプルだった。

ある程度本を読んだりしてのインプットは大事だが、やっぱり手を動かすのは楽しい。

コメント

タイトルとURLをコピーしました