Raspberry Pi3 x キャラクタ液晶 ディスプレイモジュールキット

goal

Raspberry Pi3 と一緒に秋月で買ったキャラクタ液晶を使って、pythonで文字を表示するところまで!

構成

|1|Raspberry Pi|Raspberry Pi3 element| |2|OS|Raspbian 8.0| |3|キャラクタ液晶ディスプレイモジュール|AE-AQM0802+PCA9515|

pi@raspberrypi:~ $ lsb_release -a
No LSB modules are available.
Distributor ID: Raspbian
Description:    Raspbian GNU/Linux 8.0 (jessie)
Release:    8.0
Codename:   jessie

前提環境

キャラクタ液晶と通信するにはI2Cと呼ばれる通信方式で実現しないといけないらしい。

  1. まずはraspi-configでI2Cを有効にする
$ sudo raspi-config

Interfacing Options

f:id:akiraShirasu:20170623225737p:plain

P5 I2C

f:id:akiraShirasu:20170623225826p:plain

Yes !!

f:id:akiraShirasu:20170623225837p:plain

Ok !!

f:id:akiraShirasu:20170623225846p:plain

  1. I2C通信するためのライブラリをインストールする

コマンドでI2Cバスにアクセスするために必要な i2c-tools をインストールする。

$ sudo apt-get -y install i2c-tools

次に、python2からpythonからI2Cバスにアクセスするためにpython-smbusをインストールする。

$ sudo apt-get -y install python-smbus

python2で動くことは確認したけど、python3で動くかどうかは怪しい。

  1. ディスプレイ準備

完全に失敗したんだけど、家にはんだこてないのに、完成品じゃないやつ買ってしまった。

f:id:akiraShirasu:20170623230132j:plain

どっち向きにさすのかすら分からなかったけど、くぼみがあったのでギリ分かった。

f:id:akiraShirasu:20170623230216j:plain

そしてまた迷ったのが、Raspberry Pi3のどのGPIOに刺せばいのか・・・

f:id:akiraShirasu:20170623233758j:plain

GPIOピンの説明が乗っているサイトとディスプレイの基盤に書かれている文字列からなんとかピンをさす場所が分かった。

f:id:akiraShirasu:20170623234217j:plain

コマンドで文字列表示

  1. まずはI2Cデバイスのアドレスを以下のコマンドで確認する。
pi@raspberrypi:~ $ sudo i2cdetect -y 1

     0  1  2  3  4  5  6  7  8  9  a  b  c  d  e  f
00:          -- -- -- -- -- -- -- -- -- -- -- -- -- 
10: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 
20: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 
30: -- -- -- -- -- -- -- -- -- -- -- -- -- -- 3e -- 
40: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 
50: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 
60: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 
70: -- -- -- -- -- -- -- --                         

上記の場合は、0x3eがアドレス。

Raspberry Piがデバイスを認識していないと、下のような結果になる。

pi@raspberrypi:~ $ sudo i2cdetect -y 1

     0  1  2  3  4  5  6  7  8  9  a  b  c  d  e  f
00:          -- -- -- -- -- -- -- -- -- -- -- -- -- 
10: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 
20: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 
30: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 
40: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 
50: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 
60: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 
70: -- -- -- -- -- -- -- --                         

この場合は、GPIOのさしている場所とか、接触が悪いとか、デバイスが壊れているとか。

  1. 文字列が表示できるか確認する

まず、秋月のサイトでデータシートを確認する。

「初期化(ディスプレイ設定等」→「モード設定」→「文字入力」のが流れなんだけど、正直「エントリモード設定」はよく分からない。 先人の千恵を借りてコマンドをならう。

データシートのキャラクタパターンを見ながらとりあえず “Hello World!” を出力してみる。

sudo i2cset -y 1 0x3e 0x00 0x38 0x39 0x14 0x70 0x56 0x6c i # Function set, 
sudo i2cset -y 1 0x3e 0x00 0x38 0x0c 0x01 i # Function set, 
sudo i2cset -y 1 0x3e 0x00 0x06 # Entry mode set.
sudo i2cset -y 1 0x3e 0x00 0x80 # 1st line. Left.
sudo i2cset -y 1 0x3e 0x40 0xCA 0xDB 0xB0 0x94 i # Write String.
sudo i2cset -y 1 0x3e 0x00 0xC0 # 2nd line. Left.
sudo i2cset -y 1 0x3e 0x40 0xDC 0xB0 0xD9 0xC4 0xDE i # Write String.

f:id:akiraShirasu:20170624004235j:plain

pythonで文字列表示

ココを参考にした。

lcd.pyとして保存する。

#!/usr/bin/python
# coding: utf-8

import sys
import smbus

class Lcd:
    bus_number = 1
    addr = 0x3e
    register_setting = 0x00
    register_display = 0x40
    bus = smbus.SMBus(bus_number)

    def __init__(self):
        self.__setup_lcd()

    def __setup_lcd(self):
        self.bus.write_i2c_block_data(self.addr, self.register_setting, [0x38, 0x39, 0x14, 0x70, 0x56, 0x6c]) # Function set
        self.bus.write_i2c_block_data(self.addr, self.register_setting, [0x38, 0x0c, 0x01]) # Function set
        self.bus.write_i2c_block_data(self.addr, self.register_setting, [0x06]) # Entry mode set

    def write_str(self, str):
        counter = 0
        for c in list( str ):
            self.bus.write_byte_data(self.addr, self.register_display, ord(c))
            counter += 1
            if counter == 8:
                self.bus.write_byte_data(self.addr, self.register_setting, 0xC0)
            elif counter == 16:
                break

argvs = sys.argv
argc = len(argvs)

if(argc != 2):
    print 'Usage: # display string'
    quit()

lcd = Lcd()
lcd.write_str( argvs[1] )

表示したい文字列を引数に指定すると動くはず。

sudo chmod 755 lcd.py
sudo lcd.py "Hello world!"

Everword appで暗記する

 

英語と真剣に向き合っているんだけど、とにかく覚えが悪くて...

TOEICで600点超えるために、効率よく暗記したい!

Part1-4のスクリプトを全部覚えたい!瞬間英作文もやるぞ!

 

でもいい感じの教材がない。

 

じゃあ暗記アプリ使って、マイ暗記カードを作ろう。

 

ということで、出会ったのがEverword。

 

Everword - Evernote暗記カード

Everword - Evernote暗記カード

  • Ryoichi Izumita
  • 教育
  • 無料

 

アイコンとUIはしょぼいんだけど、機能はしっかりしてます。

 

 

 

ただ、Evernoteのタイトルと本文を使って暗記カードを作る仕組みになっているんだけど、EvernoteアプリとかMacEvernoteだと、編集がとにかく面倒。

 

Evernoteを快適に編集するために、vimれるエディタを模索中。。