忘備録など

忘備録として

ラズパイでopen jtalkを使ってみる('ω')ノ

今回は、前作ったうさぎさんのロボットをしゃべらせたいと思います('ω')ノ

f:id:riderid:20210726231256j:plain

お口を描いたらさらにかわいくなりました♡♡♡


riderid.hatenablog.com

 

前回から少し変更しまして、UNOからNANOに変えてうさぎさんの頭部にarduinoが入るようにしました('ω')ノ

あと、首のサーボモーターはarduino制御だったものをラズパイ制御に変更したいと思います('ω')ノ

arduinoと目のLED基盤は既にはんだ付けしております('ω')ノ

f:id:riderid:20210726231130j:plain

 

サーボモーターは黒霧島カップが高さがちょうどよかったので、くりぬいてはめました('ω')ノ

f:id:riderid:20210726124607j:plain

 

使うものはラズパイ4、スピーカーです('ω')ノ

ドンキで1500円くらいのかわいいスピーカーを買ってきました('ω')ノ

f:id:riderid:20210726231334j:plain

 

ラズパイとスピーカーをつなぎます('ω')ノ

f:id:riderid:20210726231933j:plain

 

open jtalkのモジュールをインストールします('ω')ノ

下記をコマンド入力します

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

f:id:riderid:20210726232139j:plain

 

echo "こんにちは"|open_jtalk\

-x /var/lib/mecab/dic/open-jtalk/naist-jdic\ (辞書)

-m /usr/share/hts-voice/nitech-jp-atr503-m001/nitech_jp_atr503_m001.htsvoice\ (音声データ)

-ow /tmp/voice.wav (保存するファイルの指定)

とコマンド入力します。その後

aplay /tmp/voice.wav で再生します

f:id:riderid:20210726232509j:plain

ここでは改行していませんが、\で改行できます

オプションは、

-x  辞書の指定

-m   音声データの指定

-ow  wavファイルの指定

となっています('ω')ノ

しゃべりました('ω')ノ


www.youtube.com

 

ただ、かなりおっさん声でかわいいウサギさんには似合わないので、次はめいちゃんの音声を使ってかわいくしていきたいと思います('ω')ノ

 

riderid.hatenablog.com

 

ADS1115を使ってみた('ω')ノ

今日はAD変換をしてみました('ω')ノ使ったのはHiLetgoのADS1115です('ω')ノ

4チャンネル16ビットでI2cアドレス設定可能です('ω')ノ

f:id:riderid:20210726125100j:plain

ピンヘッダー付き!お得!

はんだ付けします('ω')ノ

f:id:riderid:20210726125242j:plain

 

 VDDに3.3v、GNDにGND、SCL、SDAをそれぞれ繋いで確認してみます('ω')ノ

i2cdetect -y 1 とコマンド入力します

f:id:riderid:20210726130138j:plain

0x48で認識されました('ω')ノ

 

ライブラリをインストールします('ω')ノ

sudo pip3 install adafruit-circuitpython-ads1x15 とコマンド入力します('ω')ノ

f:id:riderid:20210726130405j:plain

 

githubにサンプルコードがあったのでお借りしました('ω')ノコードはこんな感じです

f:id:riderid:20210726130511j:plain

 

で、でたーーーー

f:id:riderid:20210726130535j:plain

 

終わり('ω')ノ

csvデータをFFTする('ω')ノ

前回はcsvファイルをグラフ化するところまでやりました('ω')ノ

riderid.hatenablog.com

今回はデータを高速フーリエ変換FFT)していきたいと思います('ω')ノ

 

FFTのコードはこちらです。scipyのfft関数を使います('ω')ノ

f:id:riderid:20210719013701j:plain

df = pd.read_csv('ファイル名', names=['time', 'voltage']) でcsvファイルを読み込みます

フーリエ変換したい方のvoltageの列をdfとします

F = sfft.fft(df[:999]) で信号dfに対する999点の離散フーリエ変換FFTで計算します

 

実行するとこんなグラフが出ます

f:id:riderid:20210719014524j:plain

0Hzの所にピークが来ています

DC成分でしょうか??なんかしら影響が出てしまっているのかと思います。。

 

とりあえずF[0]=0 として0Hzの成分を0にします

その時のグラフがこちら('ω')ノ

f:id:riderid:20210719015141j:plain

左右対称のグラフが出てきました('ω')ノ

F_abs = np.abs(F) は999個のデータからなるベクトルで、499を中心に線対称です

スペクトルは信号の周波数成分の大きさを表します

ここでのサンプリング周波数は1000Hzなので、ナイキスト周波数は500Hzです

F[0]からF[499]までの499個の間隔で500Hzを表します

 

どこの山が大きいのか見てみたいと思います('ω')ノ

nonzero()関数で欲しいインデックスを取得します('ω')ノ

f:id:riderid:20210719021751j:plain

10000よりも大きいものを抽出してみました

1、2、3、5番の周波数の成分があることがわかります('ω')ノ

 

今回は適当なデータを使いましたが、次回は分類してみたいと思います('ω')ノ

MyoWareを使ってみる③csvファイル作成からグラフ化まで('ω')ノ

前回データをラズパイのほうに読み込みました('ω')ノ

riderid.hatenablog.com

 

今回はこのデータをcsvファイルにしたいと思います('ω')ノ

その後、libreoffice、pandasでそれぞれでグラフ化してみます('ω')ノ

 

Arduinoから送られてきたデータをラズパイ側でcsvファイルにします

コードはこんな感じです('ω')ノ

f:id:riderid:20210717011948j:plain

f = open('data.csv', 'w') でdata.csvというファイルを開きます

open()は2つの引数をとり、(filename, mode)で、filenameはファイル名です

modeは 'r'…読み取り専用、'w'…書き込み専用、'a'…追記専用 となっています

また、'b'とするとバイナリモードで開かれます

csv.writer(f, lineterminator = "/n") でファイルに書き込みます

lineterminator = "/n" では改行コードを指定しています

np.array([count, value]) では、count(1-9991までの数字)とvalue(受信データ)でリストを作ります

write.writerow(x) でcsvファイルに1行ずつ書き込みます

先ほどarray()でリストを作ったのはwriterow()の引数が2次元以上の配列だからです

これが 数字だとエラーが出ます

これをtime.sleep(0.01) で0.01sごとに繰り返します

最後は f.close() でファイルを閉じます

0.01sごとに1000のデータをとるので、10s分のデータになります

 

こんな感じでcsvファイルができました('ω')ノ

f:id:riderid:20210717014939j:plain

 

次にグラフを作ります('ω')ノ

まずはlibreofficeExcelもどきで出してみたいと思います('ω')ノ

 

sudo apt install libreofficeとコマンド入力し、libreofficeを入れます

f:id:riderid:20210718101412j:plain

 

挿入(insert)のタブからグラフ(chart)を選択します('ω')ノ

f:id:riderid:20210718101458j:plain

f:id:riderid:20210718101556j:plain

こんな感じでグラフができました('ω')ノ

 

次に、pandasを使ってグラフ化していきたいと思います('ω')ノ

pip install pandas をコマンド入力して、pandasをインストールします

f:id:riderid:20210718101830j:plain


コードはこんな感じです('ω')ノ

f:id:riderid:20210720233853j:plain

pd.read_csv('ファイル名') でcsvファイルを読み込みます

plt.plot(df['time'], df['voltage']) でtime列とvoltage列を指定してプロットします

 

グラフが表示されました('ω')ノ

f:id:riderid:20210718194405j:plain

 

次回はFFTで使えるデータを作りたいと思います('ω')ノ

ではまた('ω')ノ

MyoWareで筋電をとる②ic2でラズパイへ転送('ω')ノ

前回はArduinoでMyoWareを使ってみました('ω')ノ

riderid.hatenablog.com

今回はサーボを動かすのと、ラズパイへデータを送ってみたいと思います('ω')ノ

ラズパイへの接続方法はi2cです

riderid.hatenablog.com

サーボのコードはこちらを参照ください

riderid.hatenablog.com

 

Arduinoでのコードはこんな感じ('ω')ノ

f:id:riderid:20210715233958j:plain

f:id:riderid:20210715234028j:plain

Wire.onRequest(send) でラズパイから要求されたときに送る関数を指定します。ここでは、send()関数としています

send()関数は Wire.write(analog.Read(A0)) でマスターへ1バイトをキューに送ります

値が500以上の時サーボが動くようにしています

 

こんな感じ('ω')ノ

f:id:riderid:20210715234959g:plain

 

ラズパイのコードです

f:id:riderid:20210715235432j:plain

while True で値を読み込ませて無限ループさせています

Ctrl+Cで止められます('ω')ノ

f:id:riderid:20210715235612g:plain


とりあえず今日はこんな感じ('ω')ノ

MyoWareで筋電をとる①Arduinoで動作確認('ω')ノ

今日は、MyoWareで筋電データを使ってみます('ω')ノ

 

ラズパイにはAd変換がないのでAD変換器代わりにArduinoでセンサーから値を読み取ります

それを前回のi2c通信でラズパイのほうへ送ります('ω')ノ

riderid.hatenablog.com

 

ということで早速やっていきます('ω')ノMyoWareと本体と生体パッドです

f:id:riderid:20210715224850j:plain

 

中身はこんな感じ('ω')ノ

一番右の銀色の部分が中間筋電極で、測定したい筋に貼ります

その隣の銀色の部分が端筋電極で、測定したい筋の端っこに貼ります

びよんと延びた黒い部分が参照電極で、測定したい筋とは異なる筋に貼ります

f:id:riderid:20210713062853j:plain

 

とりあえずピンヘッダーをはんだ付けします('ω')ノ

f:id:riderid:20210715230441j:plain

 

Arduinoとつなぎます('ω')ノ

どのピンが何なのかはセンサー本体にかいてあります。+、-、信号の3つです

+は3.3Vへ、-はGND、信号はA0へつなぎます

f:id:riderid:20210715230536j:plain


生体パッドを付けます('ω')ノめっちゃねちゃねちゃしてます。。

f:id:riderid:20210715231217j:plain

f:id:riderid:20210715231229j:plain

ねちゃ。。。

Arduinoのコードです

f:id:riderid:20210715231322j:plain

Serial.begin(9600) でシリアル通信を開始します。9600はデータ送信速度です

analogRead(A0) でA0からアナログデータを読み取ります。UNOではA0-5までok

Serial.println(value) でPCにデータを送信します

delay(10) を使って10msごとに繰り返します

 

実行してシリアルプロッタを見るとこんな感じになります('ω')ノ

f:id:riderid:20210715233036j:plain

f:id:riderid:20210715233354g:plain

連動して動く!!

ではまた('ω')ノ

うさちゃんロボットを作る②('ω')ノ

前回、ちゃんと動作することを確認しました('ω')ノ

次はLEDを目に埋め込むために基盤にはんだ付けしていきます('ω')ノ

riderid.hatenablog.com

 

使うのは片面ユニバーサル基盤です

f:id:riderid:20210712212058j:plain

 

こんな感じで使いたい大きさにカットします('ω')ノ

f:id:riderid:20210712212211j:plain

はんだセットを用意します

はんだごて、はんだごての台、はんだ、はんだ吸いです

f:id:riderid:20210712212256j:plain

 

付けるのはLEDと抵抗、ピンです

 ブレッドボードで組んだ回路通りにくっつけます

f:id:riderid:20210712212330j:plain

 

はんだごてで付けていきます(汚い)

f:id:riderid:20210712212404j:plain

 

なんとか終わりました('ω')ノ
こんな感じです('ω')ノ

f:id:riderid:20210712212451j:plain

 

動作確認します('ω')ノ

f:id:riderid:20210712212520j:plain

ちゃんと点きました~~!!!よかった!!!

ということで、うさぎさんの目にはめてみます

 

うごいた~~~!!!かわいい!!!完成です('ω')ノ

手を近づけると目が光って首を振り出します('ω')ノ

f:id:riderid:20210712212632g:plain

かわいい

f:id:riderid:20210712212816g:plain

こわい

これからこのうさぎさんに話しかけたら反応してくれたり、しゃべってくれるような要素を追加出来たらなと思います('ω')ノ

 

 

riderid.hatenablog.com