千石電商で見つけて遊んでみたくなって買ったものの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 1.3inch OLED HAT 【13890】1.3インチ 128×64 OLEDディスプレイHAT for RaspberryPi
【13890】1.3インチ 128×64 OLEDディスプレイHAT for RaspberryPi 1.3inch OLED HAT えるしーでぃー らずべりーぱい らずぱい 2024/11/14
1.6インチLCDモジュールはうまく動かなかったが、こちらはpythonではすんなり動いた。
公式のドキュメント
1.3inch OLED HAT - Waveshare Wiki
基本的なセットアップは以下とほぼ同様。
サンプルダウンロード
ドキュメントに書いてあるコマンドそのままだと、解凍したときにファイルと同名のディレクトリが作られず、カレントにそのまま解凍されてしまい、コマンド通りに動かなくなる。
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
こちらはキー入力を表示するサンプルだった。
ある程度本を読んだりしてのインプットは大事だが、やっぱり手を動かすのは楽しい。
コメント