(2)お囃子機能追加「Pico オルゴール」

Raspberry PI Pico オルゴール(2)お囃子機能追加

お囃子機能

Raspberry PI Pico (以下、Pico)のオルゴールに、
お囃子機能 を追加しました。
「なんのこった?」と思うと思うのですが、
見てもらった方が早いです。

動画
画像クリックで、YouTube動画が開きます。

「くだらねぇ~」(言われると悔しいので、言われる前に、言っておくやつww)

主な追加部品

  • 透明アクリルケース
    100均で売ってたもの、たたいた時に音が響くものがいいです。
  • サーボモーター
    MiniS RB50 何年か前に買って使ってなかったもの、
    1000円くらいで、今も買えます。
  • 鈴 2個
    100均で、10個入りで売ってたもの
  • 鈴付け用の針金 2本
    • サーボモーターのホーン(モーターの回転部につけてる白い部品)に付ける(抵抗で代替)
    • ケースに鈴をぶら下げるもの(手元にあったビニタイを使用)
  • コンデンサ 0.1μF
    パスコン(手元にあったもの、気休めに近いですがある方がいいです)

打音・鈴音

試行錯誤の結果

  • ケースを鈴でたたく音(以下、打音)
  • 鈴と鈴をぶつける音(以下、鈴音)

がよさげでした。

サーボモーターで、この音を出すには、ホーンの位置 2個所を設定してトグルさせるだけで、実装できます。
ただ、鈴音、打音を交互で出すことしかできません(^^;

お囃子用の固有問題(って大げさな)

Beep音と同時に、打音・鈴音のモーターを動かすと
Beep音が鳴り始めてから、打音・鈴音がするので、
「酔っぱらって、手拍子が合わせられないおっさん」
みたいになります。

それを避けるため、(いい加減ですが)Beep音の
約0.1秒前に、モーターを動かすことで、
「ちょっとリズム感が弱いおっさん」くらいになってます。

サーボモーター制御について

MiniS RB50 の仕様 によると、信号周期 15-20mS とあるので、 周波数表現だと、50-66.7Hzくらいになりそうなので、 PWMの周波数を 60Hz(約 16.6mS)にしました。

あとは、実際に動かしてみて、よさげな値に設定します。
この値は、おそらく個体差があるので、実際に使う
モーターで、設定値を変えなければいけないはずです。

Pythonソースの要部は、こんな感じです。
初期設定

from machine import Pin, PWM

bell_pos1 = 2200 # 鈴音位置(これは、モーター固有値)
bell_pos2 = 3600 # 打音位置

bell_pos = bell_pos2

motor1 = PWM(Pin(18, Pin.OUT))   # PWM 1A ch
motor1.freq(60)
motor1.duty_u16(bell_pos)

def bell_exec():
    global bell_pos
    if bell_pos == bell_pos1:
        bell_pos = bell_pos2
    else:
        bell_pos = bell_pos1
    motor1.duty_u16(bell_pos)

で、Beep音を出す 0.1秒ほど前に bell_exec() を実行します。

ごめんなさい、まだ改良の余地がありそうなので、
現時点では、ソースは公開しないでおきます。

WordPress 表の罫線強制表示

WordPress 表の罫線強制表示

表の罫線はテーマ依存か?

WordPress で表を作るとき、テーマに依存するんだと思うんですが、
罫線が表示されたり表示されなかったりします。

少なくとも、Markdown で入力すると、表の罫線の設定はできません(たぶん)

「こうなっちゃうんですよ(設定前)」例:
設定前

この表示の方がしっくりするという人や場合も多いとは思うんですが、
個人的には、どうも落ち着かないです。


テーマ Sparkling で罫線を強制表示するには

コンテンツを表示して、Chromeのデベロッパーツールで、確認したところ tableタグは、

<table class=" table table-hover">

だったので、
table.table.table-hover の th と td に罫線を設定すれば、強制表示できます(たぶん)。

副作用が、出ないともかぎりませんが・・・まぁそんときはそんとき


footer.php の書き換え

テーマのファイルを書き換えるのは最小限にとどめたいですが、
別の対策(このリンクが別ウィンドウで開くようにする対策)で、
既に footer.php を書き換えていたので、同じ場所に入れちゃいました。

wp-content/themes/sparkling/footer.php の最後に近いあたりに、

<script type="text/javascript">
jQuery(function() {
    jQuery("table.table.table-hover th, table.table.table-hover td").css('border','1px solid #cccccc');
});
</script>

を入れると、強制表示できます。


そういうわけで、このサイトの footer.php は、現在

<script type="text/javascript">
jQuery(function() {
    var atags = $("a[href$='#_blank']");
    for(const atag of atags) {
        jQuery(atag).attr('target', '_blank');
        str = jQuery(atag).attr('href').slice(0, -7);
        jQuery(atag).attr('href', str);
    }
    jQuery("table.table-hover th, table.table-hover td").css('border','1px solid #cccccc');
});
</script>

を追加してあります。

で、この対応により
「こうなります(設定後)」例:
設定後
のようになります。

Raspberry PI Pico でオルゴール(1)概要

Raspberry PI Pico でオルゴール(1)概要

はじめに(Raspberry PI Pico とは)

Raspberry PI Pico(以下、Pico)は、Raspberry PI という名前ですが、Linuxが動くとか、
そういうものじゃなくて、電子工作とか組み込み機器に使う、いわゆるマイコンボードです。

というと、敷居が高そうな感じがするかもしれませんが、
パソコンがあれば(Windows、Mac だけじゃなくて、Raspberry PI とかでも)
ほぼ、手間なしで、C/C++ のほか、Python (MicroPython)も使えちゃう。
しかも2コア使ったスレッド処理なんかも簡単に書けちゃうというしろもので、
これがなんと、600円弱くらいで買えちゃうんです。


オルゴールを作ってみた

で、とりあえず、電子オルゴールを作ってみました。

動画リンク
画像クリックで、YouTube動画が開きます。

夏休みとかの自由研究ネタになるかもしれません。

細かい話は、後日書くつもりですが、仕様概要は以下の通りです。

  • 3曲演奏(自動ループ)曲の切替可能、停止可能
     「ピカデリー」「聖者の行進」「一週間」(※)

  • 和音(2音)対応

  • 音色の変更対応
    (といえるか? PWM の Duty 比を変える)

※:楽譜 PDF をダウンロードして、手作業で Python の変数配列に落としこむという、
 「昭和か!」 的なアナログな方法で・・・3曲で疲れました(笑)


実体配線図と部品表:

実体配線図

実体配線図
(Fritzing というアプリで書いたものを PNG で出力したもの)

部品表

No. 部品名 個数 説明
1 Pico 1 Raspberry PI Pico 本体
2 20ピンヘッダ 2 Pico にはんだ付けする
3 ブレッドボード 1 half+
4 タクトスイッチ 3 黒と赤と白
5 抵抗 1 390Ω 1/4W LEDの電流制限用
6 LED 1 赤色
7 ジャンパ線 7 うち4本は、スピーカー接続用
8 スピーカー 2 「マザーボード用」として売ってたもの
9 抵抗の足 6 GND 配線用

(No.5 と No.6 は、後述のように無くてもかまいません)

あと電源が必要ですが、USBマイクロBのものなら大丈夫なので、スマホの充電器とかで大丈夫だと思います。
もし、電源コンセントのないところで使うなら、モバイルバッテリーでも大丈夫です(たぶん)。


プログラムソース:

PicoMusicBox_20210508.zip ダウンロード

大雑把な説明
Python (MicroPython) で書いてます。
展開したら、srcs/ の6個の .py ファイルを Pico に書き込めば動きます。

そうしなくても実装できるけど(笑)2スレッドで和音を出してます。
スイッチが押されると割り込みがかかります。

いくらなんでも、大雑把すぎるww
後日プログラムの説明を書く・・・かもしれません。


説明:

実体配線図の3つのボタン(タクトスイッチ)は
左から「SW_STOP」「SW_SEL」「SW_TONE」で、

  • SW_STOP
    演奏を停止する
  • SW_SEL
    曲を変える
  • SW_TONE
    音質を変える

になります。

ブレッドボード上のLEDは、「スピーカー1」の音が出てるときだけ点灯させてます。
それだけのことなので、無くても動作に問題はありませんが、
なんかの理由で、音が出ないときに LED が チカチカ してると、
「プログラムは動いてるけど、スピーカーがおかしい可能性が高そう」とかの判断に役立ちます。

Markdown のリンクを別ウィンドウ表示にするかを制御

Markdown のリンクを別ウィンドウ表示にするかを制御

Markdown のリンクの問題点

WordPress の Jetpack で、Markdown で入力でき、
編集の時も入力した Markdown がそのまま入ってるんで、とても便利です。

が、ちょっと残念なのは、リンクに、target=’_blank’ がつけられないこと

Jetpack の Markdown は、Markdown Extra に対応していると書いてあるけど、
{.class名}って書けば、class が付けられるってのは対応していないみたいです。

リンクURIが #_blank で終わってたら別ウィンドウ

で、ググってみたら、JavaScript で、外部サイトだったら target=’_blank’ を付けるという、
目からウロコの方法が紹介されていたので、それを少し変えさせていただき、
リンク先が、#_blank で終わっていたら、で実装してみました。

表示する文字列:ロリポップXXリンク、リンク先:https://lolipop.jp/ であれば

[ロリポップ通常リンク](https://lolipop.jp/)  
[ロリポップ別窓リンク](https://lolipop.jp/#_blank) 

です。

ロリポップ通常リンク
ロリポップ別窓リンク

まぁ、URIの最後に、7文字余計なのを入れることになっちゃいますが・・・

footer.php の書き換え

wp-content/themes/使用するテーマ/footer.php
の最後に近い </body> の上あたりに、

<script type="text/javascript">
jQuery(function() {
    var atags = jQuery("a[href$='#_blank']");
    for(const atag of atags) {
        jQuery(atag).attr('target', '_blank');
        str = jQuery(atag).attr('href').slice(0, -7);
        jQuery(atag).attr('href', str);
    }
});
</script>

を入れてみました。

説明

説明するほどの内容じゃないですが、
a タグの href が #_blank で終わってたら、

  • その a タグに target=’_blank’ を入れる
  • href の最後の7文字(余計につけておいた #_blank )を消す

というものです。

参考

Markdownのリンクを別ページで開けるようにする