谷林メモ

もろもろ、ここに書きためます。


[2020/12/29]

1. Agenda案

  • 個人の進捗

  • どこまでやりますか?

  • ハード、メカ、ソフト: それぞれの課題と対策の整理(後述)

  • サーボの調整機能について(たたき台を元に議論)

  • ソースコードの整理、ソフト開発のやり方について(後述)

2. 個人の進捗

2.1 MIDIパーサー

  • 音を出すタイミングの計算は、ほぼOK (完璧では無い)

  • MIDIチャンネルを選択・合成する機能を実装

  • オルゴールの音階(15音階、半音無し)にあわせて、 音程を変換し、なるべく多くの音を自動的に拾う機能を実装

  • 参考資料について(後述)

2.2 サーボの調整機能

これがちゃんとできないと.. 1. 1曲演奏するのもままならい 1. すぐに壊れる

  • たたき台を実装: WIFI経由で、タブレットやPCなどで調整可
  • 「たたき台」なので、まだまだ不十分。
  • 皆さんのご意見募集

3. どこまでやりますか?

どこまでやるかによって、今後の対策方針も変わる。

  1. 早く終わらせたい。今すぐやめる?
  2. 作り方はだいたいわかった!あとは、各自で進めましょう!
  3. なんとか一曲演奏できるレベルになれば完成!(調整しやすさ、安定性は求めない) 多分、あと1ヵ月程度?
  4. 展示会や出張デモができるレベルにはしたい。(調整が簡単にできて、何曲も演奏できる。) 多分、2ヵ月以上?
  5. gitlabを見れば、 他のFabLab会員が作れるぐらいにドキュメント・データ・ソースを整備する。 多分、3ヵ月以上?
  6. ワークショップやキット販売で、 外部の人が作れるぐらいにしたい(ニキシー管時計、VFD管時計レベル)? 多分、半年以上?

個人的には(4)。

4. 課題と対策

4.1 基板・ハード

  • 必要なパーツを厳選
  • 工作を考慮した配置(ネジ穴? モジュール化?)
  • サーボの調整しやすさを考慮した設計(何かあれば)
  • リフローには、こだわりますか?

4.2 メカ・構造

  • サーボに無理な負荷をかけないスムーズな動作
  • サーボの調整をするための配慮 (もしあれば...メモリをつける?)
  • 安定性、壊れにくさの確保
  • ノイズ対策、音質向上
  • 工作のしやすさについて .. どこまで配慮するか?

4.3 ソフト・ソースコード

  • サーボの調整機能を充実
  • ソース(git)の整理
  • 個人ごとにディレクトリを作り、まずはそこで(部分的にも)完成を目指す。
  • ソースの統合は、個人ごとのができてから再検討
  • 必要に応じて、互いにコピーして、改造するのはあり。
  • 他人のディレクトリへのシンボリック・リンクは、とりあえず使わない
  • 設定ファイル、ログ、動的なデータ等、実行時に作成・更新されるファイルは、git管理下には置かない。(ホームディレクトリ直下、/tmp等にする)
  • (誰でも動かせるように)インストールの自動化。ドキュメントの充実。
  • 自動起動
  • IPアドレスの通知はどうするか? 毎回PCでスキャンする?

5. 参考情報

MIDIを Music Box用に変換するときに役に立つかもしれません。

手回しオルガン演奏者紀あささんに、教えて頂きました。

  • 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]

ソフトウェア構成案

sw-arch1 sw-arch2

  • 各モジュールは、かなり簡単になる(はず)
  • スレッド間通信には、キュー(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に保存

  1. microSDの /bootパーティションに専用のディレクトリを作り、 そこに音楽データファイル(上記参照)を保存
  2. 起動すると、データファイルを読み込み、自動演奏開始
  3. 1回で終了するか、繰り返すかもデータファイルで指示

発展1 ネット経由でデータ入力

  1. Webインタフェースを用意

  2. パンチで穴を開けるようなインタフェース?

  3. ファイルをアップロード?

発展2 MIDIデータ入力

  • MIDIファイルを内部でパージング/データ変換して演奏
  • MIDIの仕様は、オルゴールにとっては過剰なので、 演奏できないデータや不要なトラックを無視/排除する処理が必要
  • トラックが複数の場合(合奏データ)、どのトラックを演奏するか選択?
  • 実装は、Midoライブラリ? Mido

発展3 タッチセンサー入力

  • タッチセンサーでの演奏をリアルタイムに演奏?
  • 演奏内容を保存できるようにする?
  • 演奏内容をMIDIに変換?

【pigpioを使ったモーターライブラリ】

基本的に、以下の3つのメソッドで、 オルゴールを簡単に制御できるようにしたいと考えてます。 (実際には、MusicBoxクラスにまとめるかも...)

  • servo.set_onoff([..]) // サーボの一斉ON/OFF
  • dc_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モーターの速度を変更できる メソッドを提供する予定。

【その他】

1. Raspberry Piが起動したときに、SlackでIPアドレスを通知する方法

下記のプログラムを使うと、 ラズパイを起動する度にSlackにIPアドレス情報を自動通知するようにできます。

READE.md が説明不足ですが、 Slackを設定して、 「slack-ipaddr.sh」を起動時に自動実行するようします。