Raspberry Pi PicoでI2C通信


Raspberry Pi PicoでI2C通信を使ってLCD (液晶ディスプレイ) を動作する。

I2C通信について

この図のように1つのマスタとたくさんのスレーブの間を2つの線 (SDA,SCL) で結び,データのやり取りをする。
データのやり取りの権限はマスターが持っており,マスタが送信するクロック信号 (SCLから出る信号) を基準にしてデータ信号がSDAを通って送られる。

※I2C通信の参考文献は以下↓
http://www.picfun.com/c15.html

Raspberry Pi Picoについて

ハードウェアは以下のように設定される。

※画像引用元↓
https://www.raspberrypi.com/documentation/microcontrollers/raspberry-pi-pico.html

Raspberry Pi PicoをPC上で操作する

USB接続でPCとRaspberry Pi Picoを接続するとデバイスとしてRaspberry Pi Picoが認識される。以下のサイトをクリックするとサイトの真ん中あたりにMiCroPython (Getting started with MicroPython) があるのでそれをクリックする。
https://www.raspberrypi.com/documentation/microcontrollers/?version=E0C912952D54

クリックした先のサイトの下の方に行くと、以下のように Download the MicroPython UF2 file. があるので赤くなっている所をクリックしUF2ファイルをダウンロードする。

ダウンロードしたファイルをUSBメモリにデータを移行する感覚でデバイスとして認識されたフォルダに移動 (ドラッグ&ドロップ) する。
するとRaspberry Pi Picoのフォルダが閉じられて、USBデバイスが外されたという表示になるが、これは正常な動作である。

次に、一度PCとRaspberry Pi PicoのUSB接続を外し再び接続する。すると,先ほどとは違いデバイスとしてRaspberry Pi Picoが認識されなくなるが,問題はない。接続した状態のままにしておく。

Raspberry Pi Picoでプログラミングをする時は,Pythonを使用する。プログラミング及び, コンパイルには,Thonnyというアプリケーションを使用する。
ダウンロードについては以下のサイトを開き、右上の Download version~~~for~~~ からダウンロードする。
https://thonny.org

ダウンロードしたファイルを開きインストールした後,PCとRaspberry Pi PicoのUSB接続がされているのかを確認 してからアプリケーションを開く。
開いたのちウィンドウの右下の方にある文字列をクリックして MicroPython (Raspberry Pi Pico) にチェックを入れる。

これでPCとの接続完了である。

Lチカ (LED点灯プログラム作成) で正常な接続の確認

Thonny 上で以下のようなサンプルプログラムを作成する。

from machine import Pin
LED = Pin(25, Pin.OUT)
LED.value(1)

RunボタンをクリックするとRaspberry Pi Pico上のボード上にはんだ付けされた緑のLEDが点灯する。

LCDとRaspberry Pi Picoとの接続方法について

LCDとRaspberry Pi PicoとのI2C接続及び,VCCとGNDを以下のようにする。
LCDのSDA-----Raspberry Pi PicoのGP0 (Pin番号:1)
LCDのSCL-----Raspberry Pi PicoのGP1 (Pin番号:2)
LCDのVCC-----Raspberry Pi PicoのVBUS (5Vを出力させるため)
LCDのGND-----Raspberry Pi PicoのGND (GNDと書かれたPinであればどこでもいい)

I2C通信を活用してLCDに文字を表示

プログラムを作成する。なおこのプログラムは以下から引用している。
https://jhalfmoon.com/dbc/2021/05/17/micropython的午睡22-ラズパイpico、aqm1602-lcdパネル接続/

import time
from machine import Pin, I2C


i2c = I2C(0, scl=Pin(1), sda=Pin(0), freq=100)
adrAQM1602 = 0x3E
datAQM1602 = 0x40
comAQM1602 = 0x00

def writeDatAQM1602(dat):
    i2c.writeto_mem(adrAQM1602, datAQM1602, bytes([dat & 0xFF]), addrsize=8)
    time.sleep_ms(1)    

def writeComAQM1602(com):
    i2c.writeto_mem(adrAQM1602, comAQM1602, bytes([com & 0xFF]), addrsize=8)
    time.sleep_ms(1)    

def initAQM1602():
    time.sleep_ms(100)
    writeComAQM1602(0x38)
    time.sleep_ms(20)
    writeComAQM1602(0x39)
    time.sleep_ms(20)
    writeComAQM1602(0x14)
    time.sleep_ms(20)
    writeComAQM1602(0x73)
    time.sleep_ms(20)
    writeComAQM1602(0x56)
    time.sleep_ms(20)
    writeComAQM1602(0x6C)
    time.sleep_ms(20)
    writeComAQM1602(0x38)
    time.sleep_ms(20)
    writeComAQM1602(0x01)
    time.sleep_ms(20)
    writeComAQM1602(0x0C)
    time.sleep_ms(20)

def writeLineAQM1602(nL, lin):
    buf = bytearray(lin)
    if len(buf) <= 0:
        return False
    if len(buf) > 16:
        buf = buf[0, 16]
    if nL == 0:
        writeComAQM1602(0x80)
    else:
        writeComAQM1602(0xC0)
    for idx in range(0, len(buf)):
        writeDatAQM1602(buf[idx])
    
initAQM1602()
writeLineAQM1602(0, "aaaaaaaaaaa")
writeLineAQM1602(1, "bbbbbbbbbbb")