Raspberry pi zero 2Wに3.2インチのLCDを接続

Raspberry pi zero 2Wを入手したので備忘録として書きます。

 

1. 3.2インチLCDの接続

3.2インチのLCD(SPI接続)を購入したので、Raspberry pi zeroに接続して表示させてみました。

今回購入したのは、3.2インチのLCDとブレッドボード用のジャンパワイヤです。

購入したのはこちらになります。

開封してみました。

LCDはSPIインタフェースで、タッチパネルのドライバも載っています。

LCDのドライバはILI9341で、タッチパネルはMSP3218になります。

SDカードのスロットもついているようです。

 

では、Raspberry pi zeroとLCDを接続してみましょう。

 

LCDと配線の接続

下記にLCDの端子とRaspberry pi zeroの端子の接続表を示します。

SIP信号は、制御時にチップイネーブル信号(CE1とCE0)で選択しますので、LCDとタッチパネルは、同じSPI信号を使用することにします。

よって今回は、LCD側の端子でT_DOとSDI(MOSI)、T_CLKとSCKを接続しました。

LCDパネル側からの送信はありませんので、SDO(MISO)は接続しませんでした。

実際に接続した写真は下記です。

 

2.準備

SPI有効の設定

LCDとSPI通信を行うためにはSPI信号を有効にしなければなりません。

以下のコマンドを入力し、「3 Interface Options」→「14 SPI」でSPIを有効にします。

sudo raspi-config

 

Pythonライブラリーのインストール

以下のコマンドを入力してLCDのドライバをインストールします。

sudo apt-get install python3-rpi.gpio python3-spidev python3-pip python3-pil python3-numpy

 

pip3 install adafruit-circuitpython-rgb-display

 

(依存ライブラリをaptでインストールして、最後にpip3でこのライブラリをインストールします。) 

 

LCDのLEDの点灯

では、実際に動かしてみます。

最初にLCDのLEDを点灯させます。

下記のように「プログラミング」→「Thonny」を選択して、Thonnyを起動します。

起動したらプラスマーク(new)を選択して新しいファイルを作成します。

次に下記のプログラムをコピーして貼り付けてください。

#------------------------------------------------------------------------------------------

#GPIO set
import RPi.GPIO as GPIO
import time

def LCD_led(gpio,on):
    # GPIOのピン番号指定を「BCM」に設定します
    GPIO.setmode(GPIO.BCM)

    # 設定を確認します
    mode = GPIO.getmode()

    # BCMの場合は「11」が返ります
    #print(mode)

    # GPIO番号に名前をつけます
    LED    = gpio

    # LED用のピンを「Out」に設定します
    GPIO.setup(LED,GPIO.OUT)

    if on == False:
        # LEDを消します
        GPIO.output( LED,False )
    else:
        # LEDを点けます
        GPIO.output( LED,True )
        
def main():
    LCD_led(23,1)
    
if __name__ == '__main__':
    main() 

 

#---------------------------------------------------------------------------------

「Run」で実行すると下記のようにLCDのLEDが点灯しました。

このプログラムは、後で使用するので、libというディレクトリを作成してその下にLCD_led.pyという名前で保存しておきましょう。

私は下記のような場所にpythonプログラムを格納するようにしました。

/home/tomtomst/Documents/python/lib

 

3.表示確認

LCD表示テスト

次に同じように下記のプログラムを実行してください。

from adafruit_rgb_display.rgb import color565
from adafruit_rgb_display.ili9341 import ILI9341

from busio import SPI
from digitalio import DigitalInOut
import board

# Pin Configuration
cs_pin = DigitalInOut(board.D8)
dc_pin = DigitalInOut(board.D25)
rst_pin = DigitalInOut(board.D24)

# Set up SPI bus
spi = SPI(clock=board.SCK, MOSI=board.MOSI, MISO=board.MISO)

# Create the ILI9341 display:
display = ILI9341(
    spi,
    cs=cs_pin, dc=dc_pin, rst=rst_pin,
    width=240, height=320,
    rotation=90,
    baudrate=24000000
)

# Define color
COLOR_ORANGE = color565*1

# Fill display with one color
display.fill(COLOR_ORANGE)

このプログラム実行すると、画面一面オレンジ色になります。

文字の表示確認

次に文字を表示してみましょう。

文字を表示するにはフォントをダウンロードしておく必要があります。

下記のコマンドでダウンロードしてください。

sudo apt install fonts-noto-cjk fonts-roboto

 

プログラムは下記です。

from adafruit_rgb_display.rgb import color565
from adafruit_rgb_display.ili9341 import ILI9341

from busio import SPI
from digitalio import DigitalInOut
import board

from PIL import Image, ImageDraw, ImageFont

# Pin Configuration
cs_pin = DigitalInOut(board.D8)
dc_pin = DigitalInOut(board.D25)
rst_pin = DigitalInOut(board.D24)

# Set up SPI bus
spi = SPI(clock=board.SCK, MOSI=board.MOSI, MISO=board.MISO)

# Create the ILI9341 display:
disp = ILI9341(
    spi,
    cs=cs_pin, dc=dc_pin, rst=rst_pin,
    width=240, height=320,
    rotation=90,
    baudrate=24000000
)

# Define image size (320x240, rotated)
IMAGE_SIZE = (disp.height, disp.width)

# Define fonts
FONT_ROBOTO = ImageFont.truetype("Roboto-Medium.ttf", 12)
FONT_NOTO = ImageFont.truetype("NotoSansCJK-Regular.ttc", 18)
FONT_NOTO_SMALL = ImageFont.truetype("NotoSansCJK-Regular.ttc", 12)

# Define colors
COLOR_WHITE = (236, 239, 241)
COLOR_PURPLE = (239, 154, 154)

# Create an image with black background
image = Image.new("RGB", IMAGE_SIZE, (0, 0, 0))

# Draw some text
draw = ImageDraw.Draw(image)
text = """\
あいうえおかきくけこ
サシスセソタチツテト
ABCDEFGHIJK
abcdefghijklmnopqrstuvwxyz
東京都神奈川県千葉県埼玉県
ちゃんと表示していますか?
今日の天気は晴れ後曇りです
"""
for i, line in enumerate(text.split("\n")):
    draw.text((0, 24*i), line, font=FONT_NOTO, fill=COLOR_WHITE)

draw.text((200, 185), "2024/03/16に作成", font=FONT_NOTO_SMALL, fill=COLOR_WHITE)
draw.text((40, 200), "tomtomst【電子工作DIY】ブログ", font=FONT_NOTO, fill=COLOR_PURPLE)
draw.text((100, 222), "tomtomst.hatenablog.com", font=FONT_ROBOTO, fill=COLOR_PURPLE)

# Show it on display
disp.image(image)

 

下記のように表示しました。

今日はここまでです。

次はタッチパネルを動かしたいと思います。

 

*1:245, 124, 0

Raspberry Pi Zero 2 W しゃべらせる(音声合成)

音声合成ソフトOpen JTalk

下記のURLを参考にインストールしてRaspberry pi zero 2Wで動かしてみました。

ラズパイでも動く音声合成ソフト3選(Open JTalk、VOICEVOX、VOICEPEAK) | ラズパイダ (raspida.com)

 

まず、aptコマンドで下記のように入力してインストールします。

sudo apt install open-jtalk open-jtalk-mecab-naist-jdic hts-voice-nitech-jp-atr503-m001

インストールが完了したら、しゃべらしてみましょう。

まず、コマンドを実行するシェルスクリプトでを作成しておきましょう。

テキストエディッタのnanoでjvoice-m.shというファイルを作成します。

nano jvoice-m.sh

起動したら下記を張り付けて、ctrl-oで上書きしてctrl-xで終了してください。

#!/bin/sh
TMP=/tmp/jsay.wav
echo "$1" | open_jtalk \
-m /usr/share/hts-voice/nitech-jp-atr503-m001/nitech_jp_atr503_m001.htsvoice \
-x /var/lib/mecab/dic/open-jtalk/naist-jdic \
-ow $TMP && \
aplay -q $TMP
rm -f $TMP

このファイルを実行するには下記のように実行できるようにchmodコマンドで設定しておく必要があります。
chmod +x jvoice-m.sh


使う時は、shファイルがあるフォルダから
./jvoice-m.sh おはよう

と入力します。

「おはよう」としゃべりました。

 

女性の声も追加しておきます。

wget http://downloads.sourceforge.net/project/mmdagent/MMDAgent_Example/MMDAgent_Example-1.8/MMDAgent_Example-1.8.zip

unzipコマンドで解凍します。

unzip MMDAgent_Example-1.8.zip

次に解凍した内容を/usr/share/hts-voice/へコピーします。

sudo cp -R ./MMDAgent_Example-1.8/Voice/mei /usr/share/hts-voice/

先程の男性音声とコードは同じでも、-mの引数であるパスは変更します。(4行目)

先ほど作成したシェルスクリプトjvoice-m.shの時と同じように女性用のファイルを作成します。

nano jvoice-w.sh

中身は下記です。 

4行目の-mの引数で、先ほどダウンロードして解凍コピーした女性用のデータを示します。

#!/bin/sh
TMP=/tmp/jsay.wav
echo "$1" | open_jtalk \
-m /usr/share/hts-voice/mei/mei_normal.htsvoice \
-x /var/lib/mecab/dic/open-jtalk/naist-jdic \
-ow $TMP && \
aplay -q $TMP
rm -f $TM

このファイルを実行するには下記のように実行できるようにchmodコマンドで設定しておく必要があります。
chmod +x jvoice-w.sh

 

./jvoice-w.sh こんにちは

 

女性の声で「こんにちは」としゃべりました。

お天気時計を作ろうとしているので時報やお天気を知らせるのにこの音声合成は使えそうです。

注意)文字の認識がおかしかったので、文字セットを変更しました。

   「設定」→「Raspberry piの設定」の「ローカライゼーション」のタブを開いて

   「ロケール」の「文字セット」を「UTF-8」にしましょう。

 

pythonのコードでファイルを読み込んでしゃべらすこともできます。

ーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーー

import subprocess

# textfile
TEXT_FILE = "jvoice-text.txt"

# openjtalk
X_DIC = '/var/lib/mecab/dic/open-jtalk/naist-jdic'
#M_VOICE = '/usr/share/hts-voice/nitech-jp-atr503-m001/nitech_jp_atr503_m001.htsvoice'
M_VOICE = '/usr/share/hts-voice/mei/mei_normal.htsvoice'
# M_VOICE = '/usr/share/hts-voice/mei/mei_normal.htsvoice'
R_SPEED = '1.0'
OW_WAVFILE = '/tmp/tmp.wav'

# aplay
# CARD_NO = 1
# DEVICE_NO = 0

def talk_text(t):
    open_jtalk = ['open_jtalk']
    xdic = ['-x', X_DIC]
    mvoice = ['-m', M_VOICE]
    rspeed = ['-r', R_SPEED]
    owoutwav = ['-ow',OW_WAVFILE]
    cmd = open_jtalk + xdic + mvoice + rspeed + owoutwav
    c = subprocess.Popen(cmd, stdin=subprocess.PIPE)
    c.stdin.write(t.encode('utf-8'))
    c.stdin.close()
    c.wait()
#   aplay = ['aplay', '-q', OW_WAVFILE, ('-Dplughw:'+str(CARD_NO)+','+str(DEVICE_NO))]
    aplay = ['aplay', '-q', OW_WAVFILE]
    wr = subprocess.Popen(aplay)
    wr.wait()

def main():
    with open(TEXT_FILE) as f:
        for line in f:
            talk_text(line)

if __name__ == '__main__':
    main()


ーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーー

 

 

Raspberry Pi Zero 2 Wから音声を出力する

Raspberry pi zero 2Wを入手したので備忘録として書きます。

PWM音声信号のノイズを除去する

先日の「Raspberry Pi Zero 2 WのGPIOを確認する 」の続きになります。

こんな波形が出力されていました。

そこで、RCのローパスフィルタを通してみました。

0.01uFのコンデンサしかなかったので、0.01uF×3と270Ωで確認してみました。

カットオフ周波数は計算すると19.6kHzになります。

 [カットオフ周波数=1/(2×π×R×C)]

 

0.01uFを3つつけた時の写真

波形を確認してみました。上段がフィルタの入力波形で下段が出力になります。

R=270Ω、C=0.01uF時

R=270Ω、C=0.01uF×2時

R=270Ω、C=0.01uF×3時

まだ若干ノイズが残っていますが、だいぶきれいになりました。

一般的に100Hz以下もカットしたほうが聞きやすいそうです。

100Hz以下をカットしたい場合は下記のようなハイパスフィルタを用います。

後で追加しようと思います。

抵抗は150Ω、コンデンサは10uFを考えています。

カットオフ周波数の計算式はローパスフィルタの時と同じです。

計算すると106Hzになります。

 

PWM音声を聞いてみる

秋月電子さんから小さなスピーカとD級アンプを購入しました。

こちらはD級アンプです。説明書が付いていました。

開封したところです。


下記はRAMP8012の説明資料に乗っていた内容です。

今回はシングルエンド入力での使用例を参考に接続しました。

(①⑨⑫はRaspberry pi Zeroのヘッド端子の番号です)

 ・電源(+):+3.3V①

 ・電源(-):GND⑨

 ・入力(+):GPIO18⑫

 ・入力(-):GND⑨

 ・スピーカ(+):スピーカの赤線

 ・スピーカ(ー):スピーカの黒線

 

 

 

組み立ててみました。


聞いてみました。

ノイズが気になりますがちゃんと聞こえました。

後で動画をアップします。(アップの仕方?)

→3/10 インスタグラムへ初めて投稿してみました。

 こんな感じに聞こえます。

Raspberry Pi Zero 2 W用のケースを購入

Raspberry pi zero 2Wを入手したので備忘録として書きます。

 Raspberry pi zero用のケース

 Raspberry pi zero用のケースを購入しました。

今日届いたので組み立ててみました。

購入したのはこちらです。

下のような電源やUSBハブも入っているセットもあります。

 
今回の購入品を開封したところです。

組み立ててみました。

ナットが1つ余りました。(予備かな)

ピンヘッダはオスのほうをはんだ付けしたので、メスのほうは余りました。

Raspberry pi Zero用ですが、2Wでも問題なく使えそうです。

 

3AのUSB電源

ついでにUSB電源も購入しました。

こちらです。

 

 

 

ちゃんと奥まで入りませんが、ゆるくないので大丈夫かな。

接続して動かしてみました。

古~いUSBマウスを接続してみました。

ちゃんと認識しています。

 

PCモニタへも接続してみました。

モニタへ表示できました。(なぜか最初表示しなかったので、VNCからディスプレイ設定を行ってリブートしたら表示するようになりました。)

ちゃんと認識しているようです。

 

 

Raspberry Pi Zero 2 WのGPIOを確認する

Raspberry pi zero 2Wを入手したので備忘録として書きます。

 

GPIOの端子配列を確認する。

以下のコマンドで端子配列を確認できます。

pinout

下記のように表示されます。

次にGPIOの設定状態を確認してみます。

sudo gpio readall

このコマンドは対応していないようです。

違うコマンドで確認します。

raspi-gpio get

 

表示したいGPIOを指定することもできます。

raspi-gpio get 18

raspi-gpio get 13

どちらも入力ポートに設定されているようです。

Raspberry Pi Zeroはオーディオジャックが付いていませんが、音声出力をGPIOに設定することができます。

ハードウェアPWMの設定

  • Raspberry Pi ZeroにはPWM0(ピン番号:40)とPWM1(ピン番号:45)がありませんが、代替として利用できるGPIOピンがあります。

  • PWM0: GPIO #18 (ALT5)

  • PWM1: GPIO #13 (ALT0)

次に/boot/config.txtに下記を追加してリブートする。

dtoverlay=pwm-2chan,pin=18,func=2,pin2=13,func2=4

PWMの設定に変更できました。

音声出力をオーディオジャックへ切り替える設定を下記のように行います。(切り替わったかどうかよくわからない)

sudo raspi-config


明日、GPIO端子からPWM信号が出力されるか確認してみます。

→3/4追記:PWM信号は出力しませんでした。

 →4/5追記:ノイズのような波形を出力しました。

 先日 /boot/config.txtへ追加した
  dtoverlay=pwm-2chan,pin=18,func=2,pin2=13,func2=4
 をコメントアウトして
  dtoverlay=audremap,pins_12_13
 を追加した。

 スピーカのアイコンを右クリックしてみると「 AV Jack」 と表示するようになった。

 また、GPIO12とGPIO13がPWM設定に変わった。

 次に
  dtoverlay=audremap,pins_18_19

 へ変更してリブートしてみると、GPIO18とGPIO19がPWM設定になった。

 GPIO18からはノイズのような波形が出力している。

 コマンドラインから

  aplay /usr/share/sounds/alsa/Front_Center.wav

 と入力し、wavファイル(Front_Center.wav)を再生させると若干波形が変化した。

 これで音声出力ができるようになったと思う。

 時間があったら、スピーカへ接続してみます。

 (ノイズがひどいので、ローパスフィルタとアンプが必要そうです。)

------------------------------------------------------------------------------------

3/16追記

Wiring Pi ライブラリのインストール

以前gpioコマンドでGPIOの状態を確認しようとしたけど、実行できなかったので、Wiring Piライブラリをインストールすることにしました。

以下のコマンドでインストールします。

sudo apt-get update
sudo apt-get install wiringpi

しかしインストールできませんでした。

gpioコマンドを実行できるようにパスの設定を下記のようにして、リブートしても実行できませんでした。

sudo ln -s /usr/local/bin/gpio /usr/bin/gpio

そこで、ソースコードをダウンロードしてビルドして実行できるようになりました。

 

以下がその手順になります。

1.Wiring Piライブラリのダウンロード

git clone https://github.com/WiringPi/WiringPi.git

2.ダウンロードしたディレクトリに移動

cd WiringPi

3.ソースコードのビルド

./build

4.バージョンの確認

gpio -v

 

バージョン表示しました。

GPIOの状態も下記のように表示できるようになりました。

ただし、端子機能の設定状態はmode欄で、GPIO18とGPIO19がALT5になっているのがわかるのですが、PWM出力かどうかはよくわかりません。

下記の表でどの端子機能が選択されるか確認することができます。


ALT5の欄のGPIO18はPWM0、GPIO19はPWM1になっています。

Raspberry Pi Zero 2 Wを使ってみる

Raspberry Pi Zero 2 W

Raspberry pi zero 2Wを入手したので備忘録として書きます。

1.Raspberry Pi Zero 2Wとは

 512 MBのRAMと、1 GHz駆動の64 bit Arm Cortex-A53 クアッドコア BCM2710A1ダイを中心としたRaspberry Pi RP3A0 SiPを搭載した、Raspberry Pi Zeroファミリーの最新製品です。 製品カタログはここです。

2. 動作させるには

 Raspberry piを動作させるには、Micro SDカードへOSを書き込み、SDカードを装着する必要があります。

 

①OS書き込みに必要なもの
  • Micro SDカード:8GB以上

  必要に応じてカードリーダ等を準備してください。

  windows用、macOS用、Ubuntu用があります。

  ダウンロードしてインストールしておきます。

  • 書き込みを行うパソコン

  :Raspberry Pi OS ImagerをインストールしてMicro SDカードへOSを書き込むのに使います。

②OSの書き込み

  パソコンに「Raspberry Pi OS Imager」をインストールしたら、Micro SDカードをパソコンへ装着しておきます。

  「Raspberry Pi OS Imager」を起動します。

Raspberry Pi OS Imagerの起動画面

「デバイス選択」を押します。Raspberry piバイスの一覧が表示されるので、「Raspberry pi zero 2 W」を選択します。

次に「OSを選択」を押します。書き込み可能なOSの一覧が表示されるので「PASPBERRY PI OS(LEGACY,32BIT)」を選択します。FullバージョンやLiteバージョンを書き込みたい場合は、「Pasberry PI OS(other)」を選択すると表示されます。

今回は標準バージョンの「PASPBERRY PI OS(LEGACY,32BIT)」としました。

次に「ストレージを選択」を押します。ストレージの一覧が表示されるので、OSを書き込みたいドライブを選択します。

「次へ」を押すと下記のような画面が表示されます。「設定を編集する」を押すと接続するwifiSSHの設定を事前に行うことができます。

「一般」のタブで、以下の項目を事前設定できます。

  • 「ホスト名」:SSHで接続するときのホスト名を設定できます。
  • 「ユーザ名とパスワード」:SSHで接続するときのユーザ名とパスワードを設定できます。
  • WiFiの設定」:接続するWiFiSSIDとパスワードを設定します。
  • ロケール設定」:タイムゾーンやキーボードレイアウトを設定します。

「サービス」のタブでは、SSHの有効を設定します。

「オプション」のタブはそのままで良いです。(自分の場合はすべてチェックでした。)

最後に「保存」を押したら下記の画面に戻るので、「次へ」を押します。

今度は、「はい」を押すと、下記のように警告画面が出るので、問題ない場合「はい」を押すとSDカードへ書き込みを開始します。

下記は、SDカードへ書き込んでいる画面です。

しばらく待ちます。

「続ける」を押すとストレージが選択されていない画面に戻るのでこれで書き込みは終了です。

 

 

3.動作させてみた

①準備するもの
  • Raspberry Pi Zero 2 W本体
  • Micro SDカード:「2.動作させるには」でOSを書き込んだもの
  • USB電源:カタログに2.5Aとあるので3A品をお勧めする。 
②動かしてみる

 Micro SDカードを装着して、電源をつないでみた。

 LEDが点灯して、しばらくして点滅し始めた。

SSHで接続してみる

つながらない。ホスト名が通らないようだ。IPアドレスを調べてつないでみる。

つながった。

raspi-configコマンドを実行してみましょう。

3のインターフェースオプションを選択して、VNCを有効にする。

アップデートしておきましょう。

sudo apt update
sudo apt full-upgrade -y

下記はアップデート中の画面です。

アップデートが終わったので、リブートしましょう。
sudo reboot

VNCで接続してみる。

VNC viewerがない人は、ここからダウンロードして、インストールしてください。

インストールが終わったら起動して接続してみましょう。

下記のようにIPアドレスを設定して、

OKを押すと接続先が下記のように登録されます。

接続してみます。

下記のようにユーザ名とパスワードを聞いてくるので、SSHで接続した時と同じユーザー名を入力します。

OKを押すと下記のような画面が表示されるので、リモート制御ができるようになります。

メニューを開いてみましょう。 英語の表記ですね。 日本語にしましょう。

MenuからPreferenceを選択し、Raspberry Pi Configrationを開きます。

Localisationタブを選択します。

Localeを選択、ja(Japanese)を選択しOKを押下します。

LocalisationタブでOKを押すと再起動を求められるため、Yesを選択し、再起動します。

リブートした後の画面は下記のように日本語で表示するようになりました。

このままだと日本語入力ができないので以下のように日本語入力できるようにしましょう。 

以下は、Google日本語入力の「Mozc」のパッケージをインストールする方法です。

・パッケージリストをアップデート
sudo apt-get update

Google日本語入力の「Mozc」のパッケージをインストール
sudo apt-get install fcitx-mozc
#特に入力や設定は不要

(ターミナルの表示はいつの間にか日本語になってます)

・インストールが完了したらOSリブートしてください。

 

日本語切り替えキーの設定

windowsでは「全角/半角 漢字」キーで半角英語と日本語を切替えられますが、ラズパイではその役割を設定してあげる必要があります。

①メニューから「設定」→「Fcitx設定」を選択します。

②「入力メソッドの設定」から「全体の設定」タブを選択します。

③「ホットキー」の「入力メソッドのオンオフ」をクリックすると、キー入力待ちとなるので、日本語切替キーとしたいキーを押します。今回は「全角/半角 漢字」キーを押下しています。

テキストエディッタで、入力できるようになりました。


以上です。

今日はここまでです。