Microbit ラズパイ Midi音源〜フリーハンドで音源を鳴らす仕組み4〜
今回はラズパイに作成したリポジトリへ、PC上から作成したコードを送るところまでやります。
ちなみに、前回はラズパイに、gitコマンドとjavaコマンドをインストールしてgithubに作成したリポジトリからプルできることを確認しました。
なので、Javaコードを作成するところから行きます。
追伸使用する環境はEclipseを使用します。以下のリンクを参照ください。
アプローチ方法を何個か作成しました。
そしてEclipse
JavaServerを開発するのにEclipseを使用します。そして、Gitと接続してソースを下の様に渡して行きたいと思います。
前回は、Github -> RPiを確認したので、今度はEclipse -> Githubを確認します。
準備
Eclipseに新しいSocketServerプロジェクトを作成します。
作成方法は、こちらを参照してください。
そして、ハローワールドを作成して、Gitへコミットします。
Eclipseからローカルのgitへコミットし、それをリモート(Guthub)へとプッシュします。
こんな感じで、コミットされました。
でわでわ。。。
Microbit ラズパイ Midi音源〜フリーハンドで音源を鳴らす仕組み3〜
今回は、ラズパイに開発したものをダウンロードする仕組みを作ります。
使用するのはgitコマンドを使用してやります。
開発環境など
開発環境としては自分の端末(Mac book pro)とラズパイ2(古いですが。。。)を使用します。なので下の様に接続します。
初めに、ラズパイのSSH接続設定が必要です、これに関しては、こちらの記事に記載していますので、接続した後から記載していきます。ちなみに失敗しているものも記載しているのでうまくいかないときはこちらの記事もどうぞ。
結局のところは、SSH接続するときはラズパイも起動してIPを確かめながらやったほうがてっとり早いということでした。ちなみに接続時に調べたことは下の様なところです。
SSH接続してから?
必要なコマンドがあるかどうか調べます。必要なコマンドは以下の2つです。
- javaコマンド(インストール方法↓)
sudo apt-get install openjdk-9-jdk -y
- gitコマンド(インストール方法↓)
$ sudo apt-get install git-all
それぞれ、apt-getでインストール可能です。
接続して、上記のコマンドが使えるかどうか確認します。
インストール済みだったので次の作業に入ります。まずは以下の確認を行います。
以前やったことの残骸が残っていますが、まぁ放っておきましょう。
今回のやりたいことはGitからJavaソースをダウンロードしてコンパイルしてJARファイルを作成する(ビルド)することです。なので以下の手順を踏みます。
とりあえずはここまでの作業を行います。
Gitリポジトリの作成
ラズパイの「piユーザー」ルートのディレクトリ「/home/pi」にdevelopフォルダ(ディレクトリ)を作成してその下にリポジトリを作詞します。
初めから入力したコマンドを見てみると以下の様になります。
実行コマンド内容
mkdir -> フォルダの作成を行います、「develop」フォルダの作成を行いました。
cd -> カレントディレクトリを移動します。カレントディレクトリから./developに移動しました。
git init -> gitリポジトリを作成(初期化)しました。
Githubに開発用リポジトリをつくる
まずは、Githubにアクセスします。Gitのアカウントを持っていなければアカウントを作成してください。無料です。
そしてすでにGitアカウントを持っている人であれば、下の様にある「New」ボタンから作成できます。
そして、下の様な画面が見れるので必要な情報を入力します。
そして作成したら下の様に画面が観れると思います。
下の方にある「SecketServer」の文字はREADMEというファイルを編集することで変更できます。毎度おなじみのマークダウンで記載できます。
それができたら、下の様に並んでいるボタンのなからから「Clone or download」ボタンを押下します。
すると下の様にURLが表示されています。これをコピーします。
そして、SSH接続しているターミナルを開きgit clone コピーしたURLを入力します。
作成したローカルリポジトリ(フォルダ)に作成したリモートリポジトリ(Github)のリポジトリをコピー(クローン)できました。その証拠に「README.md」ファイルが存在します。
試しに中を見て観ます。
作成したGithubリポジトリの内容が記載されています。
これを再度プルして上の内容が更新されることを確認します。
ディレクトリを移動して作成したSocketServerのディレクトリに移動して以下のコマンドを入力します。
>git pull
そうすると。
こんな感じで更新されています。
今回はここまでにします。
でわでわ。。。。
Microbit ラズパイ Midi音源〜フリーハンドで音源を鳴らす仕組み2〜
前回、やることを決めたので、どこから着手するか?を考えます。
以下のものはやることの一覧です。
<Topレベル: 大まかな概要>
<Middleレベル: >
- ラズパイでBluetoothドングルでMicrobitと連携する(特定のもので良い)
- ラズパイでJavaサーバー(アプリ)を起動する
- Javaサーバー(アプリ)でMicrobitのメッセージを受ける
- 同様に、受けたメッセージからMidi音源を鳴らすMidiメッセージを作成
- MidiメッセージをMidi音源(RT-123)へ送信する
<Lowレベル: >
- ラズパイにBluetoothのネットワークインターフェース設定を行い自分のマイクロビットと接続できる様にする
- Javaサーバーアプリケーション(Socketサーバー)を作成する
- JavaサーバーAPでMidiメッセージの作成と送信を行う
- JavaサーバーAPでマイクロビットからのメッセージを受ける
- マイクロビットからのメッセージにより以下のMidiメッセージを作成
A. 12小節分のドラム・ベースの伴奏を行うMidiメッセージを生成する
B. 上と違うパターンのものを生成する
A, BのMidiメッセージをMidi音源に送信する
着手すること
まずは、核になるラズパイから着手していこうと思います。
ラズパイでは以下の様に動かすために必要なことは以下のの様になります。
- Bluetooth接続するためのネットワーク設定
※リンク先にはBluetooth接続に使用したコマンドなどをメモしました。 - 開発を行うためのLANケーブル接続の設定
- 作成したJavaアプリをラズパイにダウンロードして実行する設定
※起動時にJavaアプリを起動する設定を行う - Javaアプリの作成(Midiメッセージの生成)処理
- Midiメッセージの送信処理の作成
なので、まずは開発を行うためのLANケーブルの接続設定を行います。というか接続設定を行いました。こちらの記事に記載しています。
そして、開発を行うのに、以下の様な手順でやりたいと思っています。
とこの様にやりたいと思っています。
というわけで、ラズパイの起動設定を以下の様に行います。
- ラズパイに電源が入る
- Javaソースを自分のGitからダウンロード(プル)する
- プルしたソースをコンパイルしJARファイルに出力
- 出力したJARファイルを起動する
- BluetoothでMicrobit(自分のもの)を接続をここみる
- 接続ができたら、JavaサーバーでMicrobitからのメッセージ送信を待機する
この様な形で実行する様にやりますが、現状できることから考えるとラズパイに電源が入ったらGitからソースをプルしてコンパイル(ビルド)することが必要なのですが、コンパイルするものを作成する方から着手しようと考えています。
Javaサーバーを作る
上で考えた様に、ラズパイで起動する、Javaサーバーを作成することを考えます。
その進め方については次回にいたします。
でわでわ。。。
Microbit ラズパイ Midi音源〜フリーハンドで音源を鳴らす仕組み1〜
思いつきですが、Microbitからラズパイ経由でMidi音源を鳴らす仕組みを作ろうと思います。イチからやっていきますので、まずはどの様なものを作成するか?から考えます。
どんなものを作る?
タイトルにある様に「Microbit〜ラズパイ〜Midi音源」とデータを送信し、音源を鳴らす仕組みを作ろうと思います。下の様なイメージです。
これで一体何をするのか?
シンプルに、手に装備したマイクロビットから片手だけでMidi音源の再生と停止を行える様なものを作成しようと考えています。ちなみにマイクロビットは下の様な形で装備します。
名付けてアーマード・マイクロビット!
実際は、サポーターにマジックテープでマイクロビットをつけただけですが(笑)
このマイクロビットから直接音源を鳴らそうと試みたけどうまくいかず。。。
知り合いに話をしたら「ラズパイ経由でやれば?」とアドバイスをいただきました。
確かに、ラズパイならJavaアプリケーション(画像なしのCUI)で簡単なメッセージ(Aボタン押下など)を受けて、JavaからMidiメッセージを送信することを考えています。
そんなわけで、上の様なイメージになりました。
最終的にならすMidi音源は下のものになります。
必要なこと
まずは、どうしたらできるか?を考えます。自分は以下の様に考えました。
<Topレベル: 大まかな概要>
<Middleレベル: >
- ラズパイでBluetoothドングルでMicrobitと連携する(特定のもので良い)
- ラズパイでJavaサーバー(アプリ)を起動する
- Javaサーバー(アプリ)でMicrobitのメッセージを受ける
- 同様に、受けたメッセージからMidi音源を鳴らすMidiメッセージを作成
- MidiメッセージをMidi音源(RT-123)へ送信する
<Lowレベル: >
- ラズパイにBluetoothのネットワークインターフェース設定を行い自分のマイクロビットと接続できる様にする
- Javaサーバーアプリケーション(Socketサーバー)を作成する
- JavaサーバーAPでMidiメッセージの作成と送信を行う
- JavaサーバーAPでマイクロビットからのメッセージを受ける
- マイクロビットからのメッセージにより以下のMidiメッセージを作成
A. 12小節分のドラム・ベースの伴奏を行うMidiメッセージを生成する
B. 上と違うパターンのものを生成する
A, BのMidiメッセージをMidi音源に送信する
ちなみに、Midi音源はUSB経由でラズパイからMidiメッセージを送信されるのでそのためのインターフェース(ここではUSBケーブル)を購入しました。
|
これで、大まかなところは決まった形になります。
結構な、作業量になってしまいました。。。
しかし、千里の道のりも一歩目からです。
今回はここら辺りにします。
でわでわ。。。
ラズパイ 環境構築 〜LANの設定を行う〜
今回は、ラズパイのネットワーク設定(LANケーブル使用)をやります。以前wifiの設定を行った時に使用したコマンドはこちらの記事に記載しました。
ネットワークコマンド
まずは、自分のラズパイ設定(ネットワーク)の確認を行います。久しぶりに触るので。。。
ifconfig
単純に「ifconfig」とターミナル(コマンドプロンプト)で入力するとネットワークインターフェースの一覧と各IPアドレスなどの情報が見れます。
自分のラズパイ上で実行してみるとネットワークインターフェースの一覧部分に「lo」と「wlan0」しかなく。。。こちらのサイトを参考に設定ファイルの修正を行いました。
ip aコマンド
ラズパイ上で「ip a」と入力してエンターキーを押下すると起動しているネットワークインターフェースの名前が一覧できIPアドレスも一覧できます。
lo: ループバック(自分のPCを指すIPアドレスのこと)
eth0: ほとんどのPCではLANケーブルを使用したネットワークインターフェースの名前
wlan0: wifiで使用しているネットワークインターフェースの名前
/etc/dhcpcd.congファイル
参考サイトには下の様に記載があり、その様に修正して見ました。書き方ルールは以下の通り
interface eth0
static ip_address=[設定したい固定IPアドレス]/24
static routers=[デフォルトゲートウェイのIPアドレス]
static domain_name_servers=[DNSサーバーのIPアドレス]
「固定IPアドレス」の部分に関しては、192.168.XXX.XXXの様に記入します。
自宅などのネットワークでは192.168.XXX.XXXの様になっているのでこの様に記載します。
細かいネットワーク関連の記事に関しては、こちらを参考にしました。
自分の設定ではLANのネットワークが起動時に動いていなかったので、動く様に設定を変更することにします。
ラズパイのネットワーク設定
「/etc/network/interfaces」が設定ファイルになります。なのでこのファイルの内容を確認してどの様になっているか見てみます。
ラズパイから以下のコマンドを入力して内容を見て見ます。
> cat /etc/network/interfaces
catコマンドで表示した後に「動かない」となったら「ctl + C」とかESCを押下してから「q」を押下するなどすれば元のコマンド入力に戻れます。
そして、自分のinterfaceファイルの内容は
iface eth0 inet dhcp
#address 192.168.0.88
の様にコメントアウトされていたので(自分でやった様にも思う。。。)これを戻します。つまり「#」を削除してコメントアウトしない様にします。
そしてラズパイを再起動、ラズパイ起動時にネットワークが起動しないと意味がないので「reboot」コマンドで再起動します。
ちなみに、テキスト編集に使用するのは「vi」(リンクは操作方法一覧)を使用しました。これはapt-getでインストールできます。「nano」を使用するのもありです。
SSH接続できなかった理由
早い話が、LANケーブルのネットワークが動いていなかったからでした。
なので、ラズパイのLANネットワークインターフェースの名前「eth0」をラズパイ起動時に動く様に設定します。
まとめ
<繋がらない理由>
・LANケーブルのネットワークインターフェース「eth0」が起動していなかった
・SSHサーバーの起動設定をしていなかった
<対応>
・SSHサーバーの設定をする
- ラズパイを起動して、「raspi-config」のコマンドを叩く
- SSH設定の部分を開きSSHサーバーを動く様に設定(ここを参考にしました)
- RPi再起動
・ネットワークインターフェースの設定
-
/etc/network/interfaces
を開き以下の様に設定する
もともと記載している設定に「auto eth0
」の記載があるか確認
全体的に下の様な感じです。
auto lo # ループバックIPを自動起動 iface lo inet loopback auto eth0 # eth0を自動起動 iface eth0 inet static address 10.11.12.13 netmask 255.255.255.0 allow-hotplug ra0 iface ra0 inet dhcp wpa-conf /etc/wpa.conf
- 再起動して「ip a」コマンドを実行しeth0が起動していることを確認する
確認するポイントは「eth0」と書いてあるところに「192.168.XXX.XXX」の様にIPアドレスが表示されていることを確認する
やってみるとしたの様にMac(PC)からアクセスすることができました。
ちなみに、一番てっとり早いのはラズパイの画面を見ながらIPアドレスを確認して接続するのが一番です。ラズパイのIPアドレスを確認してしまえばあとはそのIPで接続します。
「ssh ラズパイのユーザー名@IPアドレス」の様に入力してアクセスします。
具体的には「ssh pi@192.168.XXX.XXX」の様に入力します。接続するIPが192.168.0.1であればその様に入力します。
でわでわ。。。
WP to Twitterの設定方法〜プラグインをインストールした後にやること〜
今回は、ワードプレスで作成した記事をTwitterで投稿させるプラグイン「WP to Twitter」の設定方法に関して記載します。左のリンクは英語版です、つまり大元のホームページです。こちらが最終的に使用方法とか「うまく動かないとき」に参照すると解決するであろうページになります。
ちなみに、プラグインなどの説明はだいたい英語であることが多いので。。。
英語はできる範囲で学習中ですが、疲れている時などはGoogle翻訳を使用しています。
ここに説明部分であろう英文をコピペして確認します。
翻訳したものはいかに記載します。
- 翻訳内容
-
- TwitterでTwitterを使用して開発者アカウントを申請する
-
- このサイトをTwitterのアプリケーション登録ページでアプリケーションとして登録します 現在Twitterにログインしていない場合は、このサイトに関連付けるアカウントにログインします
- <アプリ名に「Twitter」という単語を含めることはできません。
- アプリケーションの説明は何でもかまいません。
- WebサイトおよびコールバックURLは次のとおりです。自サイトのURL このアプリでは、他のURLフィールドは必要ありません。
- アプリの使用方法を説明してください。
- 例えば。 「このアプリは、新しいWordPressの投稿または他の種類のWordPressコンテンツに関する通知を、公開時または公開後にTwitterに送信するために使用されます。
- Twitter開発者契約を読んで続行します。
- Twitterアプリの[権限]タブに切り替えます アクセス許可に「読み取りと書き込み」を選択します アプリケーションの設定を保存します
- [キーとアクセストークン]タブに切り替えて、コンシューマキーとシークレットを再生成し、アクセストークンを作成します。
こんな感じで翻訳できました。 ちょっとみづらいかもしれませんが。。。
設定を始める
見た目で左のタブから入力していきます。つまりは上の1番からやっていきます。
1. Twitterの開発者アカウントを申請
ここから申請用のサイトに飛ぶことができます。このサイトに行きアカウントを作成します。自分はすでにアカウントを持っているのでアカウント作成に関しては記載しません。。。
そして、こちらのページでTwitter's application registration pageアプリケーションの登録(サイトを登録する様です)を行います。ヘッダ部分の右下らへんにあるボタン「Create an app」をクリックすると。。。
アプリケーションの登録画面が表示されますので上の注意書きに注意して記載します、「Twitter」という文言は使えない様です。
そして、入力するところの「App name(アプリ名)」「description(説明」はなんとかなるとして、「Web site url」に関してはプラグインの説明部分に表示されるのでそれを入力します。
最後に、「何にしようするか?」一番下にある「Tell us how this app will be used (required)」に入力します。
<ちょっとつまずいた>
・Web SiteのURLとCallBackのURLを入力する部分があり、2つとも同じURLになりました。ちょっとややこしいな。。。
それから「Create」ボタンを押下します。
2. Permissionタブを開く
アプリを登録すると、そのあとで上の様な画面が見れます。ここに「Permission」という文字があるのでそれをクリックします。
下の部分をみて「Read and Write」担っていることを確認します。
3. Keys and tokensタブを開く
先程と同様に、「Keyss and tokens」タブを開きます。そして、「Consumer API keys」をコピリます。
上の様な入力部分にAPI KeyとSecretをコピって入力します。ちなみにこの2つの値は機密情報に入りますので公開しない様にしましょう。不幸になります。。。
ちなみに、さらに入力部分がWPの方にあります、これも入力する必要があります。まとめると「Consumer API keys」と「Access token & access token secret」の両方を入力する必要があります。
最後に「Connect to twitter」を押下します。
Twitterアクセスに成功すると下の様な感じで名前が出てきます。
こんな感じでWPで記事を書く→Twitterへ投稿処理を自動化することができます。
でわでわ。。。
Microbit & Swift Play Grounds 〜iPadへのペアリング手順〜
今回は、iPadへのペアリングを再度記載します。というのも、接続して、別プログラムをインストールしてからまた接続するときにちょっと躓いたからです。
プログラムとしてはしたものを動かそうとしました。
そして、右上の方に「Connect microbit」というボタンが見えると思います。
ペアリング
これをクリックしてもうまくいかず。。。その隣にある「Pair microbit」を押下して下の様な画面へ移動します。
ここからは、以前と同じ様に入力します。そして、パスワードの様なものを入力します。
最後に「Pair」ボタンを押下して、ちょっとしないと正常に動きませんでしたが、正常に接続できました。
初めの「Pair microbit」ボタンがキーポイントだった様です。
今後もMicrobit + Swift PlayGroundsを続けます。プログラミングがちょっと複雑になってきました。
下の様なものが作れます。
そして、iPadとペアリングさせると下の様に動きます。
Microbit & Swift Play Grounds 〜ボタン押下:じゃんけんゲーム〜
今回は、前回に引き続きMicrobit + SwiftPlayGroundsの続きをやります。
表題の通りに「じゃんけんゲーム」を作成します。と言ってもシンプルなコードで作成できるので着手もしやすいと思います。
コード
-----------------------------------------------------------
clearScreen()
onButtonPressed( .A, handler: {
animateFist()
let randomNumber = random(in: 1 ... 3)
if (randomNumber == 1) {
rock.showImage()
}
if (randomNumber == 2) {
scissors.showImage()
}
if (randomNumber == 3) {
paper.showImage()
}
})
-----------------------------------------------------------
コード自体はこんな感じで書きました。SwiftPlayGroundsでは入力部分が決まっていてそこに穴埋めをする様な形でした。
今回は、動画を撮る時間がなかったのでアップしていませんがのちに動画アップしようと思います。
コードの中身
clearScreen() => 表示しているLEDを全て消します。
onButtonPressed() => ボタンを押下した時のアクション処理のイベントを取得します。
このイベントハンドラメソッドの「handler」の部分でどの様な処理をするのか定義しています。
あとは、コードを見て、動かして。。。理解するのが良いと思います。
<実行結果>
余談
IPadで一度マイクロビットを接続してしまえば再接続などが簡単にできると思いますが、一度、ブラウザからダウンロードしたファイルなどをインストールすると、再度PlayGrounds用のファイルをインストールし直す必要がありますので注意です。
ちなみにセットアップはこちらの記事に記載しています。
Microbit カウンターを作る〜リズムを取りたいが、カウンターになってしまった〜
よく、バンドなどで「ワン・ツー。。。ワン・ツー・スリー・For!」とカウントを取ると思います。このときに、このカウントのスピードでハートをドキドキさせようとやってみました、
ちょっとうまく行かない
Microbitで、カウントをとったときにそのスピードでリズムを刻む様に作成したいと思い、作成に着手してみたものの。。。ちょっと難しい。。。
何が難しいのか?というのは理論的に(「〜を〜してやれば良い」という考え)は間違っていないと思うけど、想定通りに動かないというところ。
結局、動かないということは間違っているのであろう。作成しているプロジェクトはこちらです。
このコードで、マイクロビットにデプロイして動かしてみたところ、テンポを取るのにハートをドキドキさせているのですが、ドキドキのスピードがあまり変わらない現象が起きています。
表示スピードの問題なのでしょうか?
これは、正直のところ値が想定通りか確かめる必要があります。
なのでコードを修正して、デバックしようと思います。
現状のコードは長いですが。。。
デバック方法としては、このコードのWhileに入る前にrithmの値を表示して確認することです。
それではやってみます、デバック用のコードを追加してやります。
やってみたところ、数字の表示が流れるため読み取れず。。。
仕方ないので、点滅させる方向で実装してみました。
正確なところはわからない、確実にテンポ「♩=XXX」の様にはわからないがそれっぽい感じではあります。やはり。。。
表示方法を変える
この方法でやることにします、現在、ハートをドキドキさせてテンポを刻んでいますがこれを下の様な形に変更します。
<表示方法を変える>
今回は、マイクロビットの「MakeCode」から実行してみようと思います。
そのために、「6G」(衝撃を与える)から「shake」(振る)に変更して動かします。
変更したところ
ハートをドキドキさせているところを時計の針の様に動かすことにしました。
単純に点灯させるLEDの数が少ないので処理のスピードに影響が出ないであろうと考えました。
実行結果
Microbit & Swift Play Grounds 〜ボタン押下イベント処理〜
https://blog.hatena.ne.jp/Takunoji/takunoji.hatenablog.com/edit?sidebar=category
今回は、マイクロビットのボタンを押下した時の処理を行います、処理内容としては以下の2パターンを作成します。
1. Aボタンを押下
LEDの部分に「Hello World」を表示します。
2. Bボタンを押下
ハートマークを表示します。
<実行結果>
ここのコードを見てみます。
clearScreen()
onButtonPressed(.A, handler: {
let textToDisplay = "Hello World"
showString(textToDisplay)
})
onButtonPressed(.B, handler: {
let imageToDisplay = iconImage(.heart)
imageToDisplay.showImage()
})
こんな感じになります、「onButtonPressed()」の引数に「.A」と「handler」にメソッド(関数)を渡しています。
JavaとかJSなどでよく使用する「ラムダ式」の様なものでSwiftでは「クロージャ」と呼ぶ様です。WikiPedia参照
つまり「『.A』のイベントを受けたらhandlerの処理を行います」という処理になります。
下に続く処理も同様です。
「let」に関して
以前、letは定数を示すもので値を下の様に変更するとエラーになります。と記載しました。
let value = "定数"
value = "他の値"
しかし、上のコードlet imageToDisplay = iconImage(.heart)の様に変数「imageToDisplay」にオブジェクトを代入している場合は固定値「オブジェクト」が変わらないので中身の値を変更しても大丈夫という虚をついた様なルールがあるので注意です。
余談
Javaでの定数の宣言方法は「final」という予約語を使用します。
コードに書くと下の様になります。
<エラーになるケース>
final String value = "定数";
https://blog.hatena.ne.jp/Takunoji/takunoji.hatenablog.com/edit?sidebar=category
value = "他の値";
<エラーにならないケース>
final MyClass cls = new MyClass();
cls.setValue("定数");
cls.setValue("他の値");
上の様にオブジェクト(クラスのインスタンス)を設定している場合はエラーになりません。「cls」の中にはオブジェクト(クラスのインスタンス)が入っていて、そのオブジェクト自体を変更したわけではないのでOKということです。
自分はここに気がつくのに結構な時間を要しました。。。
でわでわ。。。