トップ
追記 RSS

ワタタツの日記


2021 年 9 月 12 日 (日)

PyCharityでの広島コミュニティの発表をきっかけにして電子工作に入門できた #PyCharity

昨日 2021年9月11日(土) Python Charity Talks in Japan 2021.09 というイベントにすごい広島 with Pythonチームのメンバとして出ました。

出て得られたことのまとめ

  • 電子工作初心者だったわしが、電子工作に入門できた。
    • 広島のすごい広島 with Pythonコミュニティによって、電子工作・Pythonに精通した人たちから一歩一歩学ぶことができた。
    • 「ソフトウェアは趣味でずっとやってきたので少しは書けるが、ハードウェアは全くできない」という複素数、あ違った、コンプレックスが解消できた。
  • 「0が1に」なった実感。急に自分が手を下せる世界が広がった。
    • 普段生活しているときに、「あれ、これってこうやったら作れそうじゃないか」という視点で生活できるようになったと感じる。
    • 0の状態をレベル1にすることは本当に革命的だ。

当日の録画と提示資料

当日のYouTubeの録画はこちらです。

(広島チームの出演部分から再生が始まるようにしているつもり(30分))

わしの電子工作入門の発表部分 (およそ5分) へのジャンプもどうぞ。

スライドはこちらです。途中本番では動画が流れています。

今回の Python Charity Talks の構造

Python Charity Talks 自体は、日本のPythonコミュニティが PSF (Python Software Foundation) に寄付をするために開催されているイベントです。(わしも Python は、主に PythonJulia を使っているときに使っているので、日頃の感謝を込めて喜んで参加費を支払いました。) これまで何度も開催されています。

今回は日本のPythonコミュニティから4地域が発表するという構造でした。飛騨高山、駿河・静岡、山梨、広島です。コミュニティ活動技術という2面から話が聞けるというものになっていました。

その地域のコミュニティの一つとして、広島からはすごい広島 with Pythonが出演しました。すごい広島 with Python チーム全体で「これから始める電子工作とMicroPython」というテーマにしました。

すごい広島 with Pythonチームでは4人が出演、わしはそのうちの一人として出ました。

すごい広島チームでのわしの立ち位置とわしの出演経緯

すごい広島 with Pythonのわし以外の3人は、電子工作が中級・上級者です。まとめ役のにしもつ(@24motz)さんなんかは子供の頃から電子工作をされていたそうで、コンピュータ・電子工作の歴史も40年見てこられていて、技術的にもベテランです。

初めににしもつさんがこのPython Charity Talksの話を受けられていたときに、コミュニティ内 (PyCon広島のSlack) で「誰か一緒にしゃべりませんかー」と呼びかけられました。

わしは、電子工作は、いつかやりたいことの一つでしたので、「よしよし電子工作初心者としての視点を持って、聞き手として参加し、あわよくばこの機会に入門してみよう」という魂胆を抱きました。魂胆です。

早速にしもつさんに、初心者のマインドを持った聞き手として参加したいと名乗り出ました。その後むじん(@mu2in)さんとさんのみや(@sn3y2)さんが、実践者として名乗りを上げました。

電子工作の聞き手として

電子工作の「初心者視点での」聞き手として、本当に何もわからない状態から、初心者としてやってみた状態になることを目指しました。そうすることで本当に初心者が何がわからないかや、何に困っているのかがわかると思ったからです。

そのために「電子工作何もわからん」状態から一歩踏み出そうとしました。「電子工作何もわからん」の内訳はこちらです。

  1. 何を、どのパーツを買ったらいいのかわからない
  2. 買ったとしてもどう繋げばいいのかわからない
  3. プログラムをどう書けばいいのか

(↓当該スライドをページ指定して表示)

幸いわしは日曜プログラマなのでソフトウェア部分はある程度ならわかります。そこで、最初の二つについて、にしもつさんに課題を出してもらうことにしました。

  • わし「僕が素人の視点で感想を言うので、そろそろ初心者入門向けとしてこの辺を買ってやっといてくれという課題をぶっ込んでください。」
  • にしもつさん「じゃあ Raspberry Pi Pico で Lチカ を最初の目標にしましょうか。安いし流行ってるし技適の心配がないし」

なるほど!

ということで Raspberry Pi Pico と、LEDチカチカするための他のパーツを何を買えばいいのか、引き続きPyCon広島のSlackで聞きながら調べました。

このスライドではコピペしにくかったりしますので買ったもののリストを紹介しましょう。

買ったものとリンク

秋月電子通商で次を購入しました。

作例サイトを教えてもらう

作例サイトをいろいろ教えてもらいました。「単一のパーツを付けた動かすだけ」のようなものを教えてもらったところがポイントです。これで一歩一歩試すことができました。

これだけでも十分入門できました。

初めてのはんだ付け

はんだ付けも初めてです。Raspberry Pi Pico やセンサにピンヘッダという部品をつなげるために、はんだ付けをしました。これでブレッドボードというボードに「線を好きに刺して実験」することができます。そうでないと、直接パーツを線でつないだりしないといけないんだと思います。それは大変です。ブレッドボードがこういう実験には必須だと思います。

はんだ付けをミスったりやり直したいときには、はんだ吸い取り器を使います。動画ハンダ吸取器の使い方LED工作 (YouTube) が参考になりました。

プログラムをどう入れるか

Raspberry Pi Pico にまず MicroPython を入れます。

(失敗した場合は Raspberry Pi Pico の BOOTSEL ボタンを押しながらUSBに差し込むとまたマスストレージモードでマウントされます。)

MacにはThonnyという開発環境を入れました。

  • Homebrew なら brew install thonny でOK。
  • Thonny.app で右下メニューから "MicroPython (Raspberry Pi Pico)" を選択する

ちなみに、完全におかしくなったら flash_nuke.uf2 をダウンロードしてきて書き込む。そうするとまっさらなRaspberry Pi Pico になります。初めて次の中国語のブログが役に立ちました! 分享科技與遊戲 by HKGoldenMr.A: 解除死鎖狀態的 Raspberry Pi Pico (Google翻訳で読んだ)

自分でいじってみる

作例をいじったり、自分で組み合わせたりしてみます。

サーボモータで楽器

安いサーボモータである SG90 (400円) 側の

  • 黄を1(GP0)へ
  • 赤を40(VBUS)へ
  • 茶を38(GND)へ

接続して次のプログラム

from machine import PWM, Pin
import utime
import random

servo = PWM(Pin(0))
servo.freq(50)

max_duty = 65025
deg_m90 = 0.025  # -90 deg
deg_0   = 0.0725 #   0 deg
deg_p90 = 0.12   # +90 deg

def rot(deg):
    servo.duty_u16(int(max_duty*((deg/90.0)*(deg_p90-deg_0)+deg_0)))

basetime = 0.2 # [sec]

def p0():
    utime.sleep(basetime*4)

def p1():
    utime.sleep(basetime*2)

def p2():
    utime.sleep(basetime)

while True:
    rot(0.0)
    p1()
    rot(-45.0)
    p2()
    rot(-90.0)
    p2()
    rot(-45.0)
    p1()
    rot(0.0)
    p0()
    rot(45.0)
    p1()
    rot(90.0)
    p0()

を動かすと、楽器ができました!

さらにマラカスを付けてみました。

面白い!

今まで何十年も趣味でソフトウェアは書けましたが、を思いのままに動かせたのはこれが初めてです!!!!! 感動!!!!! この動き自分で作ったんよと言える!!!!!

マラカスはこのようにプログラムを書いてみました。

from machine import PWM, Pin
import utime
import random
import math

led = machine.Pin(15, machine.Pin.OUT)

servo = PWM(Pin(0))
servo.freq(50)

max_duty = 65025
deg_m90 = 0.025  # -90 deg
deg_0   = 0.0725 #   0 deg
deg_p90 = 0.12   # +90 deg

def rot(deg):
    servo.duty_u16(int(max_duty*((deg/90.0)*(deg_p90-deg_0)+deg_0)))

# hit
preparation_duration = 0.17

def h(duration):
    led.value(0)
    for i in range(10):
        rot(90 - i/10*45)
        utime.sleep(preparation_duration/10)
    rot(90)
    led.value(1)
    utime.sleep(duration - preparation_duration)

b = 60/144
led.value(0)
while True:
    h(2*b)
    h(2*b)
    h(b)
    h(b)
    h(2*b)
3軸加速度センサとOLEDディスプレイ

OLED (有機発光ダイオード) ディスプレイも、モノクロとカラーの2種類買うてみました。加速度センサが使えるとこのように、手を回してディスプレイに立方体を回転させることができます。3次元の数学を使えばどのように線分を描けばいいか計算できます。この辺はiPhoneで加速度センサを使ってプログラミングしているのと同じことですね。

しかし、今は、ディスプレイも、加速度センサも自分で買ってきたパーツを取り付けて配線しているのです! これが大きな違いです。

3軸加速度センサとサーボモータで機械学習の強化学習のQ学習

発表で紹介したのは、3軸加速度センサとサーボモータを組み合わせて、機械学習の強化学習のQ学習をしてブランコの揺れを強化学習してみようというものです。

今まで機械学習はソフトウェアの上でしかやったことがありませんでした。単なる思いつきですが、「何らかのセンサ」と「動かすもの」があれば、機械学習を実物でできると思いつきました。やってみた様子は当日の録画をご覧ください。

ソフトウェア的にやっていることは大して違いがありませんが、機械学習に便利な numpy や PyTorch が使えないので、float の list だけで書いていくのがこれはこれで楽しかったです。

終わり

というわけで、ソフトウェアしか作れなかったのがちょっと広がりました。きっかけとなった Python Charity Talks と、入門として一歩一歩やらせてもらえた広島のコミュニティの皆さんに感謝です。



2021 年 6 月 15 日 (火)

consultをmigemoizeしたい (未完→だいたいできた)

consultがとてもいい感じなので @rocktakey さんのivy-migemoでcounsel系をやるようにmigemo化したいです。 まずは調査調査。

ちなみに、consult, vertico, orderless, embark などの便利な組み合わせの紹介についてはとんさんのEmacsの次世代ミニバッファ補完UI | 日々、とんは語る。がおすすめです。

ivy

まずivy-migemoがなぜ適用できるかで、counsel系に使われている ivy-read 関数を見てみます。

https://github.com/abo-abo/swiper/blob/040d458bce4a88f37359192061bcea5ebe87007c/ivy.el#L2019

re-builder というのが設定できるようになっていて、入力したクエリをさらに関数でいじることができます。

ivy-migemo では ivy-re-builders-alist(counsel-hogehoge . ivy-migemo--regex-plus) などと ivy-migemo--regex-plus を突っ込むことで各種 counsel-*:re-builder に渡ってきます。

consult

一方 consult系はどうなっているでしょうか。 ivy-read にあたるものはたぶん consult--read とそのマルチ版 consult--multi です。

それで、こ consult--readconsult--multi には re-builder にあたるものが、 なさそう ということまで調査しました。

現状

根元の関数 re-builder(っぽいもの)
ivy-read ある
consult--read ない

という感じです。 ( ˃ ⌑ ˂ഃ )

追記: 2021-06-16

だいたいできました。 emacs-jp の Slackで orderless のソースでも読んでみようかと書いていたら、なんと orderless そのものから忍び込めることを教えていただきました。

orderless は、標準の completion-category-overrides を定義すればカテゴリごとに補完スタイルを設定できるように作られています。標準のものを使うようにうまく出来ていますねえ。

カテゴリというのは metadata として提供されていて Emacs 28 からはたくさんついており、27以前は marginaliaが頑張ってくれるみたいです。

そこでまず command カテゴリに設定する例を教えてもらい、ちゃんと動くことがわかりました。

あとはどのコマンドがどのカテゴリで実行されるのかを調べればだいたい良いということがわかりました。

ソースコードリーディングをしたところ、次のことがわかりました。

コマンド カテゴリ
execute-extended-command (M-x) command
find-file file
consult--multiを呼ぶコマンド (consult-bufferなど) consult-multi
consult-lineなど consult-location

あとは最近使っている org-roam の org-roam-find-file はどのカテゴリになっているのかがわかりませんでした。

なんとなく marginalia を見ていたところ marginalia-prompt-categories という変数にいろいろカテゴリが書いてあることがわかりました。 なんとプロンプトに書いてある文字列にヒットしてカテゴリを設定してしまおうというもののようです(たぶん。たぶんね。)。なので、

(add-to-list 'marginalia-prompt-categories
             '("\\<File\\>" . file))

と設定しました! すると動きました! org-roam-find-file のプロンプトには "File" と出ているからです!

勝ちました!

勝った様子

勝った様子です。 https://github.com/Nyoho/.emacs.d/blob/ae7af9e48c20b0ab9bcf10601824cfaede1761d7/config/50-search-replace.el#L207-L247

(leaf consult
  :ensure t
  :bind* (("M-m" . consult-buffer))
  :bind (
         ("M-s"   . consult-line)
         ("M-g ." . consult-ripgrep))
  :config
  (autoload 'projectile-project-root "projectile")
  (setq consult-project-root-function #'projectile-project-root))

(leaf orderless
  :ensure t
  :init
  (icomplete-mode)
  (defun orderless-migemo (component)
    (let ((pattern (migemo-get-pattern component)))
      (condition-case nil
          (progn (string-match-p pattern "") pattern)
        (invalid-regexp nil))))

  (orderless-define-completion-style orderless-default-style
    (orderless-matching-styles '(orderless-literal
                                 orderless-regexp)))

  (orderless-define-completion-style orderless-migemo-style
    (orderless-matching-styles '(orderless-literal
                                 orderless-regexp
                                 orderless-migemo)))

  (setq completion-category-overrides
        '((command (styles orderless-default-style))
          (file (styles orderless-migemo-style))
          (buffer (styles orderless-migemo-style))
          (symbol (styles orderless-default-style))
          (consult-location (styles orderless-migemo-style)) ; category `consult-location' は `consult-line' などに使われる
          (consult-multi (styles orderless-migemo-style)) ; category `consult-multi' は `consult-buffer' などに使われる
          (unicode-name (styles orderless-migemo-style))
          (variable (styles orderless-default-style))))

  ;; (setq orderless-matching-styles '(orderless-literal orderless-regexp orderless-migemo))

  :custom
  (completion-styles . '(orderless)))

(leaf marginalia
  :ensure t
  :init
  (marginalia-mode)
  :config
  (add-to-list 'marginalia-prompt-categories
               '("\\<File\\>" . file)))
Tags: Emacs

2021 年 5 月 20 日 (木)

昔買ったiBooksの本が開けなかったがiBooksを再起動したら治った

昔買ったiBooksの本が

このブックは開けません。iTunesに問題がありました(−−42408)。iTunesを再インストールしてからやり直してください。

というメッセージでエラーになりました。iTunesはもう無くなってから久しいです。iBooksで開いています。 一旦ダウンロードを削除して開いても同様です。

しかし iBooks cannot open any book with High Sie… - Apple Community のように、iBooksを再起動したら治りました。

  1. ダウンロードされている本を削除
  2. iBooks を再起動
  3. 再びダウンロードすると正常に開ける
Tags: Apple

2020 年 7 月 3 日 (金)

またしてもカープの選手 広島弁吹き替えシリーズのNyoho氏「CV: Nyoho」眼鏡市場新テレビCMはクリス・ジョンソンの声(広島弁)

photo

広島弁吹き替えシリーズの Nyoho氏は、一昨年のエルドレッド選手、昨年のフランスア選手に続いて「CV: Nyoho」の活動が、本日 (7/3) よりクリス・ジョンソン選手の声 (広島弁) として継続となりました。眼鏡市場の広島県限定テレビCMです。広島県限定テレビCMと言いながらYouTubeでも見られます。今年は特にコロナ禍により、リモートワークも重要なトピックとなっており、

の2バージョンが公開されています。

また、眼鏡市場による特設サイト「広島限定の特設サイトじゃ。見ていきんさい。」もオープンしています。

Nyoho氏の眼鏡市場のテレビCM担当はこれで4年連続です。

Nyoho氏は「今回はクリス・ジョンソン選手の演技がぶちくそええけえ、わしも録音スタジオでのりのりゆきのりになってしもうたわ。「知っちょんでわし」いうところは、アクションにおうとるけえ、ぶちしっくりくるようなわ。」などとコメントしています。

photo


2019 年 12 月 9 日 (月)

何らかの忘年会に参加した

某集合の忘年会に参加しました。なかなか貴重な機会でした。

その中でナルホーの方だったか、じゃがビーとじゃがりこの開発秘話みたいなのがあると伺ったのですが、もう何だったか忘れてしまいました。

じゃがビー じゃがりこ 息子 開発 」と検索した履歴がiPhoneに残っています。 親子関係というのがこの開発の何かのキーワードだったのですが、忘れました。

Tags: 生活

2019 年 8 月 16 日 (金)

Web Audio APIでファイルから音を鳴らすためにSafariだけユーザ交流が必要

Web Audio APIAudioContextcreateBufferSource() にファイルからバッファを読み込んで再生しようとしていたんですけど、click などのイベントを一度挟まないと音が出ませんでした。

調べると Safari だけは user interaction がないと音が出ないようにしてあるとかなんとか。しまったソースを忘れた。確かに Chrome (Vivaldi) や Firefox では何もしなくてもそのまま JavaScript だけ(?)自動的に音を鳴らし始められました。


トップ
Copyright © 2021 KITADAI, Yukinori. All rights reserved.