fc2ブログ

ラズベリーパイで遊ぶ その3 WAV音源ピアノ USBキーボード編 

ラズパイ4に接続したUSBキーボードを使いwav音源ピアノを弾く!

前回紹介のI2CKeyPadに替えてUSBキーボードを使った方法です。 こちらの方が外付け部品が要らずにキーボードの
テンキーを使って疑似ピアノが楽しめます。下はラズパイ4にアンプ付きスピーカーとUSBキーボードを繋いだテストの様子
USB_piano_1.jpg

ここで使えるUSBキーボードはフルサイズのテンキー付きの他、ショートサイズでNumlockキーを押すと一部のキーが
テンキーとして使えるタイプ、専用テンキーボードなどです。
USBキーボードのテンキーをラズパイの外部スイッチとして使う方法は、ラズパイの実験に応用すれば重宝すると思います。
このアイデアは、AnitesさんのRaspberry PiのUSBキーボードを応用にさせて頂きました。

USBキーボードを使う準備
Pythonプロジェクトには「evdev」が既に入ってるので、コマンドラインから「pip3 install evdev」を実行します。

使用するキーボードのDEVICE名を調べる方法。
ラズパイにキーボードをセットしてコマンドラインから「ls /dev/input/by-id/」を実行するとDEVICE名が表示されます。
ソースコードのDEVICE = "/dev/input/by-id/に続けて調べたDEVICE名を記入します。
keyboard_name.gif

音源のwavファイルのダウンロードについては前回I2CKeyPadの記事を参考にして下さい。
wavファイルはフォルダーwav_datに格納して以下のkeymap.py、usb_kb.piano.pyと同じディレクトリーに置きます。

キーコードマップ 注意:キーボードによってコードが少し異なる場合が有ります。
keymap.py

keys = {
69: "NL", # Num Lock
79: "1",
80: "2",
81: "3",
75: "4",
76: "5",
77: "6",
71: "7",
72: "8",
73: "9",
82: "0",
83: ".",
28: "ENTER",
78: "+",
74: "-",
14: "BS", # Back Space
55: "*",
98: "/",

# non num lock keys:
111: "_.", # Del
110: "_0", # Ins
107: "_1", # End
108: "_2", # Down
109: "_3", # PgDn
105: "_4", # Left
# notice the missing N5 - better to use num lock mode
106: "_6", # Right
102: "_7", # Home
103: "_8", # Up
104: "_9", # PgUp
}


ソースコード
usb_kb_piano.py

#coding: utf-8
import pygame
from evdev import InputDevice
from select import select
from keymap import keys

pygame.init()

DEVICE = "/dev/input/by-id/usb-_USB_Keyboard-event-kbd"
#使用するキーボードのDEVICE名を記入

dev = InputDevice(DEVICE)

while True:
# wait for keypad command
r, w, x = select([dev], [], [])

for event in dev.read():
if event.type==1 and event.value==1:
if event.code in keys:
#print("KEY CODE: ", event.code) # print前の#を外すと押したキーのコードが見れます。
if(event.code == 79):#1
key1 = pygame.mixer.Sound("wav_dat/piano1_1do.wav")
key1.play()
if(event.code == 80):#2
key2 = pygame.mixer.Sound("wav_dat/piano1_2re.wav")
key2.play()
if(event.code == 81):#3
key3 = pygame.mixer.Sound("wav_dat/piano1_3mi.wav")
key3.play()
if(event.code == 75):#4
key4 = pygame.mixer.Sound("wav_dat/piano1_4fa.wav")
key4.play()
if(event.code == 76):#5
key5 = pygame.mixer.Sound("wav_dat/piano1_5so.wav")
key5.play()
if(event.code == 77):#6
key6 = pygame.mixer.Sound("wav_dat/piano1_6ra.wav")
key6.play()
if(event.code == 71):#7
key7 = pygame.mixer.Sound("wav_dat/piano1_7si.wav")
key7.play()
if(event.code == 72):#8
key8 = pygame.mixer.Sound("wav_dat/piano1_8do.wav")
key8.play()



動画をご覧下さい。
曲が弾けないのでドレミだけですがご覧下さい。



皆様の参考になれば幸いです。

スポンサーサイト



テーマ : 電子工作
ジャンル : 趣味・実用

ラズベリーパイで遊ぶ その2 WAV音源ピアノ I2CKeyPad編 

ラズパイ4にI2C接続したキーパッドを使いwav音源ピアノを弾く!

16keypad1.jpg

私は音痴で子供のころから楽器で遊んだことが無く音楽とは無縁でした。
ラズパイを始めてから電源+2本の線を繋ぐだけでGPIOが節約出来るI2C通信に興味を持ち、安価なI2C
エキスパンダーPCF8574を入手しました。
このエキスパンダーに4X4マトリックスキーボードを付けたので何かに応用したいと思い、ヒントを探してたら
ラズベリーパイORGの「今日は何を作りたいですか?」コーナーにGPIO music boxが目に
留まりました。ここでは、4個のボタンスイッチをGPIOに接続し、ボタンを押すとドラムの音を再生する簡単な
仕組みでしたが、I2Cを使えばGPIOの数に制限されずに簡単にボタンを増やすことが出来ます。
そこで、今回は16個まで使えるキーパッドを使って模擬ピアノを試しました。但し、ピアノ音源のwavソースが
ドレミファソラシドの8音階しか入手出来なかったのでほんのお遊び程度です。
キーパッドの使い方やソースコードはKI04.comのチュートリアルを参考にさせて頂きました。

必要な部品
ラズベリーパイ:Pi4を使ってテストしました。
I2CエキスパンダーPCF8574:通販で1個150円程度です。
このエキスパンダーはアドレスの設定をジャンパーピンを差し替えることで0x20から0x27を選べます。
余談ですが、エキスパンダーのアドレスを変えて直列接続(daisy chain)すればもっと多くのキーボードが使えます。
I2Cのアドレスを調べる方法は前回のLCDメッセージボードを参考にして下さい。
4X4マトリックスキーボード:通販で1個125円でした。

I2CエキスパンダーPCF8574と4X4マトリックスキーボードの接続図
PCF8574.jpg
wav音源の準備
先ずは、先に紹介しましたGPIO music boxのtutorialを一通りご覧下さい。音源の再生にpygameを使います。
私はフリー音楽素材魔王魂トップページのピアノ(wav)1-1ド~1-8ドをダウンロードして使わせて頂きました。
ダウンロードしたwavファイルはフォルダーwav_datに格納して次の16key_Piano.pyと同じディレクトリーに置きます。

ソースコード
16key_Piano.py
#!/usr/bin/env python
import smbus
import sys
import time
import pygame

pygame.init()
class MyKeyboard:

KeyPadTable= [['D','C','B','A'],
['#','9','6','3'],
['0','8','5','2'],
['*','7','4','1']]

RowID=[0,0,0,0,0,0,0,4,0,0,0,3,0,2,1,0]

CurrentKey=None

def __init__(self,I2CBus=1, I2CAddress=0x20): #使用するI2Cモジュールのアゾレスを記入。
self.I2CAddress = I2CAddress
self.I2CBus = I2CBus
#open smbus pcf8574
self.bus = smbus.SMBus(self.I2CBus)
#set pcf to input
self.bus.write_byte(self.I2CAddress,0xff)

def ReadRawKey(self):
#set P4 Low First
OutPin= 0x10
for Column in range(4):
#scan first row to see if we have something
self.bus.write_byte(self.I2CAddress,~OutPin)
#read the key now
key = self.RowID[self.bus.read_byte(self.I2CAddress) & 0x0f]
if key >0 :
return self.KeyPadTable[key-1][Column]
OutPin = OutPin * 2
return None

#ReadKey return current key once and debounce it
def ReadKey(self):
LastKey= self.CurrentKey;
while True:
NewKey= self.ReadRawKey()
if NewKey != LastKey:
time.sleep(0.01)
LastKey= NewKey
else:
break
#if LastValue is the same than CurrentValue
#just return None
if LastKey==self.CurrentKey:
return None
#ok put Lastvalue to be CurrentValue
self.CurrentKey=LastKey
return self.CurrentKey

if __name__ == "__main__":
mkb = MyKeyboard()
while True:
kdat = mkb.ReadKey()
if kdat != None:
#sys.stdout.write(kdat)
#print(kdat) # #を外すと入力したキーがShellで確認できます。
sys.stdout.flush()
if (kdat == '1'):#1
key1 = pygame.mixer.Sound("wav_dat/piano1_1do.wav")
key1.play()
if (kdat == '2'):#2
key2 = pygame.mixer.Sound("wav_dat/piano1_2re.wav")
key2.play()
if (kdat == '3'):#3
key3 = pygame.mixer.Sound("wav_dat/piano1_3mi.wav")
key3.play()
if (kdat == '4'):#A
key4 = pygame.mixer.Sound("wav_dat/piano1_4fa.wav")
key4.play()
if (kdat == '5'):#4
key5 = pygame.mixer.Sound("wav_dat/piano1_5so.wav")
key5.play()
if (kdat == '6'):#5
key6 = pygame.mixer.Sound("wav_dat/piano1_6ra.wav")
key6.play()
if (kdat == '7'):#6
key7 = pygame.mixer.Sound("wav_dat/piano1_7si.wav")
key7.play()
if (kdat == '8'):#B
key8 = pygame.mixer.Sound("wav_dat/piano1_8do.wav")
key8.play()
else:
time.sleep(0.001)

GPIO.cleanup()



動画をご覧下さい。
撮影のセットが悪く3脚とテーブルが接触してノイズが入ってしまった!。


次回はキーパッドに替え、ラズパイ4につないだUSBキーボードを使う方法を紹介します。

皆様の参考になれば幸いです。

テーマ : 電子工作
ジャンル : 趣味・実用

ラズベリーパイで遊ぶ その1 Blynk LCD Message Board 後編 

Blynk LCD Message Board 後編 (前編と併せてご覧下さい)

ソフトウエアの説明
下の画像はアクリル板を加工して作ったLCDメッセージボードで、ラズパイZeroとHAT基板を載せてます。
Blynk_LCD_1.jpg

スマホアプリBlynkの設定について
先ず、iPhone(App Store)又はAndroid(google Play)からスマホにBlynk-IoT for Arduino, ESP32をダウンロードして
インストールを行います。使用するパーツ(Widget)を沢山使うと有料になりますが、ここで扱う程度は無料です。

左上から順番に①・・・
①インストルール初期画面のアカウント作成を選択します。
②メールアドレスとパスワードを登録します。
③この画面の一番下Email allをクリックすると登録したEメールに「AUTH TOKEN」が送られてきます。
注意:この「AUTH TOKEN」が後で作成するソースコードに必要となります。
④プロジェクト名の入力とデバイス選択をRaspberry pi Zero Wが無いのでRaspberry pi 3Bを選びCreateボタンを押す。
Blynk_1.jpg Blynk_2.jpg Blink_2b.jpg Blynk_11.jpg
⑤プロジェクト画面が開いたら右上の丸✙のを選択するとwidget Boxが開きます。
⑥widget Boxの下の方にText inputを選択しするとText input Setting画面が開きます。
⑦Text input Setting画面ではPINを選択します。
⑧次にSelect pinのVitualとV0を選択してOKをクリックするとText input Settin画面に戻ります。
Blynk_4.jpg Blynk_5.jpg Blynk_6.jpg Blynk_7.jpg

⑨この画面下側のCHARACTER LIMIT枠に50から100位を入力し、一番上左端の←をクリックします。
⑩プロジェクトと画面に表示されたText inputボックスを見易い位置に移動と幅の調整をします。
⑪次はWidget Boxを開き、着信をスマホに通知するパーツNotificationを追加します。
⑫NotificationをText input Boxの下辺りに配置します。Notificationは、メッセージが届いた後、本体拡張基板に
追加したタクトスイッチを押すと、スマホの画面に確認のメッセージが表示され、メッセージが届いたことを通知します。
通知はOKをタップすると消えます。
Blynk_8.jpg Blynk_9.jpg Blynk_12.jpg Blynk_13.jpg

Blynkライブラリーのダウンロード
BlynkLib.pyのダウンロード先URL

カタカナを表示のの準備
もんごんたさんのホームページ「LCD1602Aや2004AをI2C接続で使いこなす」
ハード編
ソフト編を参考にカタカナの表示に必要なソースコードHD44780.pyを使わせて頂きました。感謝!
必要なソースファイルは次のGitHubからClone出来ます。 GitHub mongonta0716/hd44780
LCDモジュールの設定やラズパイの設定もハード編、ソフト編で詳しく説明されているので参考にして下さい。

lcdsample.confのI2Cアドレス等の設定
[lcd]
i2c_address = 0x27 #使用するI2Cモジュールのアドレスを記入します。
width = 16      #表示文字数
lines = 2       #行数
backlight = On #バックライトは常にON

#ここで文字シフトを選べますが、1行目も同じようにシフトするので(0=シフトしない)に設定
# shiftmode
# 1: leftshift
# 2: rightshift
# 3: alternately
shiftmode =

# Turn it off if you don't use Japanese Kana characters.
kanamode = On   #カナモードは常時On

Blynk_LCD_Messageのソースコード
同じディレクトリーにBlynk_LCD_Message.py、BlynkLib.py、HD44780.py、conf/lcdsample.confを入れます。
Blynk_LCD_Message.py
#!/usr/bin/python3
# -*- coding:utf-8 -*-
from datetime import datetime
import HD44780 as LCD
from gpiozero import Buzzer, Button
import BlynkLib
from time import time, sleep, strftime
import smbus

lcd = LCD.HD44780('lcdsample.conf')
lcd.init()

buzzer = Buzzer(26)
sw1 = Button(21)

#Blynkから割り当てられたTOKEN 記号を入力
BLYNK_AUTH = '4E*********************Zm'

# Initialize Blynk
blynk = BlynkLib.Blynk(BLYNK_AUTH)

def sw1Pressed():
buzzer.beep(0.1, 0.1 ,2)
print('SW1 is pressed')
blynk.notify('Confirm receipt! OK.')

sw1.when_pressed=sw1Pressed

# Register Virtual Pins
@blynk.VIRTUAL_WRITE(0)
def my_write_handler(value):
global counter
global BlynkText
buzzer.beep(0.1, 0.1, 3)
BlynkText = format(value[0])
print('Blynk Text: {}'.format(BlynkText))
counter = 1

def millis():
return time() * 1000

def my_user_task():
global counter
global BlynkText
time = datetime.now().strftime('%Y.%m.%d %I:%M')
print('Counter = {}'.format(counter))
if counter == 0:
buzzer.beep(0.1, 0.1, 2)
lcd.message(time,1)
lcd.message('Blynk Ready',2)
counter = 3
elif counter < 4:
if len(BlynkText) > 0:
lcd.message(time, 1)
lcd.message(' ', 2)
lcd.message(BlynkText,2)
else:
counter = 3
else:
if counter == 4:
counter = 0
lcd.message(time, 1)
lcd.message(' ',2 )
lcd.message(BlynkText, 2)
counter = counter +1

counter = 0
BlynkText = ''
currentMillis = 0
previousMillis = 0
interval = 5000

try:
while True:
blynk.run()
currentMillis = millis()
if currentMillis - previousMillis > interval:
my_user_task()
previousMillis = currentMillis

except KeyboardInterrupt:
sys.exit(0)



使い方
①左側画像のようにスマホBlynkアプリのText Input Boxにメッセージを入力して送信します。
 メッセージに使える文字はHD44780.pyに定義したアルファベットの大文字、小文字、英数記号、カタカナ
 のみですが、カタカナ入力は全角で入力しても半角カタカナに変換して表示されるのでとても便利です。
 間違えてひらがなや漢字を入力しても、定義された文字以外はパスして表示せずにエラーが出ません。
 16文字を超える文字はオーバフローして表示しません。
②メッセージが届いたら確認ボタンを押すと、右画像のようにスマホ側へメッセージが届いたことを知らせます。
korekara1.png Confirm1.png

 スマホから届いたメッセージがLCDの2行目にに表示されると同時にブザーが鳴って着信を知らせます。
 1行目の年月日と時刻は常時表示としました。
Blynk_LCD_4.jpg

皆様の参考になれば幸いです。

テーマ : 電子工作
ジャンル : 趣味・実用

Raspberry pi 用便利HATの紹介 その2

ラズパイ用HAT基板 その2
先に作ったラズパイZero用のHAT基板を差し替えて共用してたが、ラズパイ4専用として少し大きいHAT基板に
4チャンネル I2C ロジック レベル変換双方向モジュールを組み込んで組み立てました。

回路図
RaspiHAT_2.gif

完成したHAT基板
圧電ブザーの右横が 5個290円(送料込み)で購入したロジックレベル変換双方向モジュールです。
このモジュールは4チャンネルですが、ここでは2チャンネルのみ使用。コネクターは3.3V系と5V系を夫々に設けました。
これで、5V系のI2C 機器を安心して使えるようになりました。使用したHAT基板は秋月電子にて150円で購入しました。
Raspi4_HAT-2.jpg


皆様の参考になれば幸いです。

テーマ : 電子工作
ジャンル : 趣味・実用

ラズベリーパイで遊ぶ その1 Blynk LCD Message Board 前編 

Blynkのメッセージ表示にI2C 16X2LCDを使う
先に紹介しました。Blynkを使った8X8X8 LEDドットマトリックスメッセージボードを安価なI2C16X2 LCD表示器に
置き換えてみました。

Blynkを使ってスマホからメッセージを送るとラズパイに接続した16文字2行のLCD表示器にメッセージが届きます。 
1行目には年月日と時刻を表示し、2行目に英数記号とカタカナのメッセージを表示します。
スマホから間違って英数記号やカタカナ以外の文字を送ってもエラーとならず、その部分のみ表示しません。
Blynk_LCD_3.jpg

使用部品は、1602 LCD表示器+I2C変換モジュール(セット物と別売が有り、何れも数百円程度にて入手)
私があまり気にしないので5V駆動のLCDを使いましたが、気になる方は3.3V駆動のLCDを使うかI2Cラインに
双方向ロジックレベル変換モジュールを挿入してください。
Blynk_LCD_2.jpg

上の画像では、先に作った便利HATを使ってますが、下のFritzing接続図では必要部分のみ結線しています。
Raspi_lcd_Blynk.gif

I2Cインターフェースを使うための準備
Rasbianのdesktopがインストールされている場合は、設定⇒Raspberry piの設定⇒インターフェースを開き、
I2Cを有効にチェックした後に再起動するとI2Cが使えます。
raspberryPi_1.gif

もし、動かない場合はコマンドラインから”sudo raspi-config”と入力すれば下図のraspi_config画面が開きます。
5番目のInterfacing Options選択します。
I2C_config1.gif

P5 I2Cを選択します。
I2C_config2.gif

yes(はい)を選択します。
I2C_config3a.gif

OK(了解)を選択してfinish(終了)します。
I2C_config4a.gif

LCDのI2C変換モジュールのアドレスを調べる方法
LCDの各Vcc,GND,SDA,SCLを接続後起動、コマンドラインからi2cdetect -y 1と入力すると下図のようにアドレスが
表示されます。この場合は27即ち0x27だと解ります。
I2C_add.gif


次回、後編ではソフトウェアについて説明します。

皆様の参考になれば幸いです。

テーマ : 電子工作
ジャンル : 趣味・実用

Raspberry pi 用便利HATの紹介

先月、初めてラズパイしZeroを購入してPythonの勉強を始め、最近Raspi4を入手しました。
各種センサーやI2Cモジュールを繋いで遊んでますが、有れば便利なHAT(拡張基板)を作りました。
ここに使ったHAT基板は秋月電子にて1枚100円で購入出来ます。基板左側の4pinコネクターはI2C用です。
Raspi4_HAT_1A.jpg

回路図
LED8個、タクトスイッチ3個、圧電ブザー1個、I2C用コネクター1個の簡単な回路です。
自作が苦手な方は、スイッチサイエンスにて販売のMaker pHAT(1252円)を購入して下さい。
LEDをスクロールさせたり出来るサンプルコードが提供されていて、初めて使う方にも有効だと思います。
RaspiHAT_1.gif

HAT側面の様子
ケースに入れると本体基板の40Pinプラグまで届かないので、ラズパイ用スタッキングコネクターで下駄をはかせてます。
このスタッキングコネクターは秋月電子にて1個150円でした。
右上の黒い棒状の突起物はI2Cの電源電圧5Vと3.3V切り替え用のジャンパーピンです。
Raspi4_HAT_1B.jpg

お気に入りのアクリルケースに載せて使います。
HAT基板は差し込んでるだけで固定していません。スペーサーはスイッチを押した時に基板がたわむのを防ぐために
取り付けています。
Raspi4_HAT_2.jpg

アクリルケースの手前側から見た様子
HAT基板にも40pinヘッダーを取り付けてあるので、ブレッドボードにリボンケーブルを繋いで実験する時もコネクターの
取り外しが簡単で利便性が有ります。
Raspi4_HAT_3.jpg

アクリルケースの後ろ側から見た様子
特にI2C用の専用コネクターを取り付けたのでLCDや各種センサーのテストにはとても便利です。
Raspi4_HAT_4.jpg


皆様の参考になれば幸いです。

テーマ : 電子工作
ジャンル : 趣味・実用

プロフィール

CNC_Paradise

Author:CNC_Paradise
木工・彫刻・機械工作・電子工作が
大好きで自作のCNCを使って工作を
楽しんでます。

最新記事
最新コメント
月別アーカイブ
カテゴリ
何でも工作室
検索フォーム
RSSリンクの表示
リンク
QRコード
QR