谷林メモ
もろもろ、ここに書きためます。
[2020/12/29]
1. Agenda案
-
個人の進捗
-
どこまでやりますか?
-
ハード、メカ、ソフト: それぞれの課題と対策の整理(後述)
-
サーボの調整機能について(たたき台を元に議論)
-
ソースコードの整理、ソフト開発のやり方について(後述)
2. 個人の進捗
2.1 MIDIパーサー
-
音を出すタイミングの計算は、ほぼOK (完璧では無い)
-
MIDIチャンネルを選択・合成する機能を実装
-
オルゴールの音階(15音階、半音無し)にあわせて、 音程を変換し、なるべく多くの音を自動的に拾う機能を実装
-
参考資料について(後述)
2.2 サーボの調整機能
これがちゃんとできないと.. 1. 1曲演奏するのもままならい 1. すぐに壊れる
- たたき台を実装: WIFI経由で、タブレットやPCなどで調整可
- 「たたき台」なので、まだまだ不十分。
- 皆さんのご意見募集
3. どこまでやりますか?
どこまでやるかによって、今後の対策方針も変わる。
- 早く終わらせたい。今すぐやめる?
- 作り方はだいたいわかった!あとは、各自で進めましょう!
- なんとか一曲演奏できるレベルになれば完成!(調整しやすさ、安定性は求めない) 多分、あと1ヵ月程度?
- 展示会や出張デモができるレベルにはしたい。(調整が簡単にできて、何曲も演奏できる。) 多分、2ヵ月以上?
- gitlabを見れば、 他のFabLab会員が作れるぐらいにドキュメント・データ・ソースを整備する。 多分、3ヵ月以上?
- ワークショップやキット販売で、 外部の人が作れるぐらいにしたい(ニキシー管時計、VFD管時計レベル)? 多分、半年以上?
個人的には(4)。
4. 課題と対策
4.1 基板・ハード
- 必要なパーツを厳選
- 工作を考慮した配置(ネジ穴? モジュール化?)
- サーボの調整しやすさを考慮した設計(何かあれば)
- リフローには、こだわりますか?
4.2 メカ・構造
- サーボに無理な負荷をかけないスムーズな動作
- サーボの調整をするための配慮 (もしあれば...メモリをつける?)
- 安定性、壊れにくさの確保
- ノイズ対策、音質向上
- 工作のしやすさについて .. どこまで配慮するか?
4.3 ソフト・ソースコード
- サーボの調整機能を充実
- ソース(git)の整理
- 個人ごとにディレクトリを作り、まずはそこで(部分的にも)完成を目指す。
- ソースの統合は、個人ごとのができてから再検討
- 必要に応じて、互いにコピーして、改造するのはあり。
- 他人のディレクトリへのシンボリック・リンクは、とりあえず使わない
- 設定ファイル、ログ、動的なデータ等、実行時に作成・更新されるファイルは、git管理下には置かない。(ホームディレクトリ直下、/tmp等にする)
- (誰でも動かせるように)インストールの自動化。ドキュメントの充実。
- 自動起動
- IPアドレスの通知はどうするか? 毎回PCでスキャンする?
5. 参考情報
MIDIを Music Box用に変換するときに役に立つかもしれません。
-
MIDIシーケンサ世界樹
手回しオルガン演奏者紀あささんに、教えて頂きました。
- Audacity
6. おまけ
6.1 ソースを統合し、インストール後のディレクトリ構造イメージ (たたき台)
$HOME/
+- bin/: 実行ファイル用ディレクトリ(boot-music-box.shなど)
+- log/: ログ用ディレクトリ
|
+- env1/ : Virtualenv
|
+- music-box-servo.conf: サーボ設定ファイル(インストール時にコピーされる)
|
+- music_box/ : git cloneしたディレクトリ (ローカル・リポジトリ)
|
+- src/ : 今までの webapp や motor_driversなどをフラットにまとめる。
|
+- README.md
+- install.sh: インストールスクリプト
+- boot-music-box.sh: 起動時に実行するスクリプト
+- crontab-sample: crontabのサンプル
+- music-box-servo.conf: サーボモーター設定ファイルのサンプル
|
+- requirements.txt: 全モジュール共通にする
|
+- run.sh
+- app.py
+- piano_hat.py
+- MusicBoxRotationMotor.py
+- MusicBoxServo.py
:
など
[2020/12/06]
1. モータードライバー(ステッピング・モーター、サーボ・モーター)
-
Music Box に特化したモーター・ドライバーのソースを以下に置きました。 ステッピングモーターとサーボモーター両方のドライバが入っています。
-
汎用性より、Music Boxに必要な機能に絞り、 シンプルにコーディングできるようにしたつもりです。 「
Simple Usage
」に上位プログラムからの利用方法を書きました。
詳しくは、以下のリンクをご覧下さい。
2. プロジェクト共通のファイルなど
src の直下に、プロジェクト共通のファイルを置きました。
まだ、中途半端な状態です。 適宜、追加・修正をお願いします。
[2020/11/15]
サンプルコード
モータをとりあえず動かすテスト用のコード。
ステッピングモーター
- src/tests/stepper2.py
$ ./ServoPCA9685-2.py -min 1200 -max 1600 9 -i 1.5
サーボモーター
Raspberry Pi + DRV8835 + 28BYJ-48-5V + Python3 + pigpio * github: ytani01/servo-PCA9685
[2020/10/16]
1. オルガニート®関連リンク(追加・修正)
オルガニート®は、1970年(昭和45年)に長野県諏訪にある株式会社三協精機製作所 (現 日本電産サンキョー株式会社) で開発、製造、販売が開始されました。
2. pigpioのpigs
コマンドの便利な使い方
プログラムを作らなくても、pigs
コマンドで簡単にテストすることができます。
# 準備
$ sudo pigpiod
# モード設定
$ pigs m 17 r # GPIO 17をreadモードにする
$ pigs m 18 w # GPIO 18をwriteモードにする
# 値の読み込み
$ pigs r 17 # GPIO 17の値を表示(0 or 1)
# 値の書き込み
$ pigs w 18 1 # GPIO 18を「1(HIGH)」にする
# サーボの制御
$ pigs s 18 1500 # GPIO 18のサーボを1500(中央に) 値:500~2500, 0=off
# 複数サーボの同時制御
$ pigs s 18 1500 s 19 1000 s 20 2000
3. 購入したオルゴール本体
Amazon: Music Box Movement 15 Note Make You Own Song with Tool Kit(1 song and 7 blank refill papers): 1,800円
4. 連続回転サーボでの駆動に再度チャレンジ
2020/10/10のメモで提案した方法を実際に試してみました。
- トルク、速度、ノイズ、全ての点で、「一応」合格点
- モーターの改造と固定が課題
- オルゴール本体の金属部分も一部曲げる(倒す)必要がある。
- ステッピングモーターによる駆動も引き続き検討すべき
【検証動画】
実際に曲を演奏してみて、速度やノイズを検証。
- 演奏中は、紙送りも行っているため、負荷がかなり高く、「キュイン、キュイン」というノイズが目立つ。
- 演奏が終わり、紙が無くなると、ノイズは気にならないレベル。
[2020/10/10]
1. 連続回転サーボの再検討!?
原作者の動画より…
手持ちの連続回転サーボを分解してみると…
2. ネット情報:「オルガニート」(=「手回しオルゴール」) 関連
「1970年(昭和45年)に長野県諏訪にある株式会社三協精機製作所※で開発、製造、販売が開始されました。」
と記載されてます。
- 動画:オルガニートの内部構造 … 実に詳しく内部構造を説明してます。
[2020/09/25]
ステッピングモーター
Raspberry Pi + DRV8835 + 28BYJ-48-5V + Python3 + pigpio * github: ytani01/StepperMotor
タッチセンサー CAP1188関連情報
できれば、CircuitPython
ではなく、pigpio
ベースに移植したいですが...大変そう...
PianoHAT
------------------------------------------------------------------------------
[2020/09/22]
ソフトウェア構成案
- 各モジュールは、かなり簡単になる(はず)
- スレッド間通信には、キュー(Python3のqueueクラス)を使うのが、最もシンプルで確実です。
【要検討】
- Webサーバー部分とオルゴール本体(タッチセンサーを含む)は、 プロセスを分けた方がいい? プロセスを分けるなら、プロセス間通信は、ソケット通信
- サーバ側: socketserver
- クライアント側: telnetlib
------------------------------------------------------------------------------
[2020/09/11]
課題
-
データをどのように作成・入力するのか?
-
最低限の機能は?
- オルゴールとして、自動演奏は必須
- タッチセンサーによる演奏は、オプション
-
MIDI入力は必須?
-
操作インタフェースは?
- スタート/ストップ/繰り返し などの操作は?
- データ入力は、microSDにコピー?
-
タッチセンサーですべてなんとかする?
-
Node-REDの扱いは?
- もし、Node-REDを動かさないなら、 Raspberry Pi Zeroでも性能的には問題ありません。
【データフォーマット案】
これは、内部データフォーマットのイメージが強いです。
MIDI形式、タッチピアノ入力、Node-RED... その他いろんな入力形式が考えられる場合、 最終的に、このような単純かつ統一的な形式に変換するようにすれば、 拡張性と生産性が高くなります。
いずれは、Scratchで操作したい、ゲームコントローラーで.. なんてこともことも考えられますが、 コアな部分は変更せずに、 拡張モジュールを容易に作成することができます。
3Dプリンターに例えると、以下のような感じです。 オルゴールの場合は、内部でリアルタイムに変換してもいいと思います。 * STL --> MIDI * Gコード --> 以下のテキスト形式
オルゴールを動かすには、最終的には、以下の情報が必要です。 * DCモーターの速度 * いつ、どのサーボを動かすか
上記情報を直接的に表す形式として、 紙テープのイメージをそのままテキスト形式で表現するデータフォーマットを 提案します。
以下、例 (まともな音楽にはなってません)
# 穴を開ける代わりに「o」で表現
speed 30
-o-------o---------------
o----------o-------------
--o---------o------------
-----o-------o-----------
------o------o-----------
----o-------o------------
-------o----o------------
------o----o-------------
-------o----o------------
:
(つづく)
:
end(終了) または loop(繰り返し)
Gコードのようなコマンド形式も考えられる。
【データ入力方法(案)】
Step 1(最低限). テキストファイルをmicroSDに保存
- microSDの /bootパーティションに専用のディレクトリを作り、 そこに音楽データファイル(上記参照)を保存
- 起動すると、データファイルを読み込み、自動演奏開始
- 1回で終了するか、繰り返すかもデータファイルで指示
発展1 ネット経由でデータ入力
-
Webインタフェースを用意
-
パンチで穴を開けるようなインタフェース?
- ファイルをアップロード?
発展2 MIDIデータ入力
- MIDIファイルを内部でパージング/データ変換して演奏
- MIDIの仕様は、オルゴールにとっては過剰なので、 演奏できないデータや不要なトラックを無視/排除する処理が必要
- トラックが複数の場合(合奏データ)、どのトラックを演奏するか選択?
- 実装は、Midoライブラリ? Mido
発展3 タッチセンサー入力
- タッチセンサーでの演奏をリアルタイムに演奏?
- 演奏内容を保存できるようにする?
- 演奏内容をMIDIに変換?
【pigpioを使ったモーターライブラリ】
基本的に、以下の3つのメソッドで、 オルゴールを簡単に制御できるようにしたいと考えてます。 (実際には、MusicBoxクラスにまとめるかも...)
servo.set_onoff([..])
// サーボの一斉ON/OFFdc_motor.set_speed(s)
// DCモーターの速度設定time.sleep(ms)
// 標準のスリープ
1. サーボモーターライブラリ
最終的に、
servo.set_onoff([0, 1, 0, 1, ... ]) // 0:off, 1:on
のように、
リスト形式で、各サーボのON/OFF情報を指定して、
全サーボを一斉にに動かせるようにする予定。
課題
- サーボモーター毎にON/OFFのPWM値が異なり、一度調整しても、またズレる。
- 調整値をファイルに保存しておく
- 調整するための操作インタフェースは?
2. DC-Motor用ライブラリ
dc_motor.set_speed(50)
のように、
簡単にDCモーターの速度を変更できる
メソッドを提供する予定。
-
手持ちの DRV8835 では、動作しますが、TB67H450 では動作せず (>_<)
【その他】
1. Raspberry Piが起動したときに、SlackでIPアドレスを通知する方法
下記のプログラムを使うと、 ラズパイを起動する度にSlackにIPアドレス情報を自動通知するようにできます。
READE.md が説明不足ですが、 Slackを設定して、 「slack-ipaddr.sh」を起動時に自動実行するようします。