Logicool(Logitech) Gシリーズ(G13,G15,G510など)の液晶をPythonから使う。 #AdventCalendar

Posted on December 23, 2014 at 13:42:06 UTC


この投稿は「1円にもならない無駄な技術 Advent Calendar 2014」23日目の記事です。

ゲーマーだけでなく絵描きやプログラマーが導入しているプログラマブルキーボード、G13。最近はアマゾンタイムセールでの安売りもありましたし買った人もいるのではないでしょうか。

まあ、このキーボードには液晶ついてるのですがみんな活用できてるかというとそうでもないような気が。そういうわけで活用しやすいようにしてみましょう。

なお、この記事はWindowsを対象にしています。あと、G13以外の液晶ついてるやつ(G15とかG510など)でもいけます。

液晶用SDK

SDKがあるそうなのでヘルプで調べてみると、どうやら一緒にインストールされるとのこと

http://support.logitech.com/article/31247

なので見てみると発見。

で、ドキュメントどこよ?公式サイト調べてもないじゃん。

困ったらGitHubで探す

そこでGithubで検索。以前のPTP-IPの時と同様にGithubにはいろいろと怪しいものが…。

https://github.com/noorus/nil/tree/17509770ba3331249d9e0fe37f7ab36f2245f771/external/LogitechLCDSDK_1.01.002/Doc

「© 2013 Logitech. Confidential」って書いてるのが激しく気になるが見なかったことにしよう。

Pythonで書きたいのでラッパー的なものを作る

ふたつdllあるけど、どっち使うの?

  • LgLcdApi.dll
  • LogitechLcd.dll

LgLcdApi.dllはプリミティブなAPI。なんでもできるけど使いにくい。LogitechLcd.dllはもうちょっと使いやすいもの。Twitterのタイムライン表示する程度であればこっちのほうが使いやすいのでLogitechLcd.dllを使用したほうがいいかと。

ctypesで実装

PythonにはFFI(Foreign Function Interface)としてctypesがあって、要するにcのライブラリとかdllとかをPythonから直にぶっ叩けるわけです。とりあえずLogitechLcd.dllをドキュメントに書かれている通り適当にそのままに実装。
ただ、カラー液晶のキーボードもってないのでそれに関する部分は省いていたり。

# This is released under the MIT License.
# KIM_TPDN 2014
# http://opensource.org/licenses/mit-license.php

__author__ = 'KIM_TPDN'
from ctypes import *
from ctypes.wintypes import *

# for monochrome LCD
# Color LCD Function is not implemented.

LOGI_LCD_TYPE_MONO = 0x00000001
LOGI_LCD_TYPE_COLOR = 0x00000002

LOGI_LCD_MONO_BUTTON_0 = 0x00000001
LOGI_LCD_MONO_BUTTON_1 = 0x00000002
LOGI_LCD_MONO_BUTTON_2 = 0x00000004
LOGI_LCD_MONO_BUTTON_3 = 0x00000008

LOGI_LCD_MONO_WIDTH = 160
LOGI_LCD_MONO_HEIGHT = 43


class LogitechLcd(object):
    def __init__(self, name, lcd_type=LOGI_LCD_TYPE_MONO):
        self.Lcd = cdll.LogitechLcd
        self.lcd_type = lcd_type
        self.Lcd.LogiLcdInit(c_wchar_p(name), c_int(lcd_type))

    # Generic Functions
    def is_connected(self):
        return bool(self.Lcd.LogiLcdIsConnected(c_int(self.lcd_type)))

    def is_button_pressed(self, button):
        return bool(self.Lcd.LogiLcdIsButtonPressed(c_int(button)))

    def update(self):
        self.Lcd.LogiLcdUpdate()

    def shutdown(self):
        self.Lcd.LogiLcdShutdown()

    # Monochrome Lcd Functions
    def set_background(self, mono_bitmap):
        lcd_bitmap = BYTE * (LOGI_LCD_MONO_WIDTH * LOGI_LCD_MONO_HEIGHT)
        bm = lcd_bitmap(*mono_bitmap)
        return bool(self.Lcd.LogiLcdMonoSetBackground(bm))

    def set_text(self, line, text):
        return bool(self.Lcd.LogiLcdMonoSetText(c_int(line), c_wchar_p(text)))

文字を表示する

先ほど作ったものを利用してこんな風に文字を表示してみる。日本語もハングルも普通に対応。

さすがに、( ・ิω・ิ)みたいなのは正常に表示されない。

__author__ = 'KIM_TPDN'
from logitechlcd import LogitechLcd
from time import sleep

if __name__ == '__main__':
    lcd = LogitechLcd('朝鮮民主主義人民共和国')
    lcd.set_text(0, '文字数は全角1文字=半角2文字')
    lcd.set_text(1, '換算で、1行あたり半角29文字')
    lcd.set_text(2, '文字数が一定を超えるとはみ出る')
    lcd.set_text(3, '김정일 【ハングル対応】金正日')
    lcd.update()
    sleep(10)

これを実行するとこんな感じに。

要は液晶画面の設定を変更してアップデートすることによって適用してるだけです。
文字の表示ができるのならあとはお好きなものをimport(例えばTwitterAPIとか)して、その出力をこいつに向ければ…!。

注意点?

LogitechLcdをinitする際にアプリ名を決める訳ですが、変な名前(例えば、上の例では「朝鮮民主主義人民共和国」としている)にするとこんなかんじで残ります。