ラベル microbit の投稿を表示しています。 すべての投稿を表示
ラベル microbit の投稿を表示しています。 すべての投稿を表示

2023/02/05

MacBook Air M2 で Windows11 ARM 環境は使い物になるのか?

一週間ほど Parallels に Windows11 を入れて触った感触としては、周辺機器とは関係ない、単にソフトウェアを動かしたいだけなのなら結構違和感なく使えるのではないんでしょうか。macOS と Win11 の切り替えは全画面にしている Win11 とは指3本でスワイプでスカスカ切り替えられて、とてもスムーズ。とても別な OS が同居してる感はないです。CPU 半分 (4個)貸してるけど、macOS 側も特にストレスなしです。何年前か忘れたけど出始めのころの Palallels を触った感覚ではもっさり感はあったなぁ。隔世の感があります。

また動かなくて困ってる組み込み系のソフトはあるのですが、想定内でやはりなぁと。困ったらいままでの Intel Mac でどうにかしつつ、M2 で出来ることが増やせればな感じです。

比較対象にしてるマシンは、それまで使っていた MacBook Pro 2015 15" Retina。Core-i7 2.5GHzで、Memory 16GB 搭載してて macOS でも Bootcamp の Windows10 でもまだ十分使えるなというマシンです(個人的な感想)。

購入マシン構成とその経緯

MacBook Air M2 2022 8CPU, 8GPU (Mac14,2)
Memory: 24GB
SSD: 1TB

購入を決めたのは M2 Pro/Max が発表になってから一週間後ぐらい。M2 Pro が高すぎるのであきらめて、Parallels を使う前提で構成を決めました。候補としては M1 Air もあったのですが、仮想環境がまともに走ってほしいので、最大メモリ搭載量が大きく、MagSafe があってポートに余裕のある M2 Air にすることにしました。OS も二つ以上入れることと、天体撮影で必要な一時的なデータセーブサイズを考えて SSD も多めに。ちょっと高いんだけど。あと MagSafe 好きなんです。本体のコネクタに負担かからないので。今回の MagSafe のケーブルは前と見た目と違うんだけど、耐久性に改良がされているんでしょうか?期待しちゃいますね。GPU については GPU をガンガンに使ってくれるソフトはあんまり縁がなさそうだなと思ったので 8GPU にしておきました。 
キーボードはポクポクしたクリックを感じるタッチです。嫌いではないです。HHKB の方が好きですが。

アミアミ?ケーブル


速度と体感

速度

Geekbench 5 で CPU 性能を比較してみます。

macOS
MachineCPUOSSingle-coreMulti-core
MacBook Pro 2015Core-i7Monterey7443294
MacBook Air M2M2Ventura19098923

Windows
MachineVMOSSingle-coreMulti-core
MacBook Pro 2015(Bootcamp)Windows107313173
MacBook Air M2Parallels18Windows1116625560

macOS だと Intel Mac (Monteley) のスコアが 744/3294 のところ、M2 Air (Ventrura) が 1909/8923 程度。Windows だと Bootcamp (Win10) が 731/3173 で、Parallels 仮想環境 (Win11) が 1662/5560 という結果になりました (それぞれ single core/multi core の値)。macOS 同士の比較で 2.6/2.7 倍で Windows 同士だと 2.27/1.75倍と仮想環境はやや遅めとはいえど、2倍程度の速度の違いがあり、十分体感できる差になります。あれ、こんなもんかとは思いましたが。ただしバッテリーの持ちは抜群で、丸一日使ってもまだ余裕ある感じです。倍の性能で何倍電池持つんだよって感じで。macOS の方も、積極的に輝度下げたりとか低消費電力対策をしてるようには感じましたが。

体感

いままで古い Intel Mac で普段使いのソフトでは特に不満がなかったので、多少キビキビしててもその差ははっきり言って分かりにくいのですが、コンパイルなどでは流石にその差を体感できました。うぉー速いとまでは思わないけど、あ、速くなったって感じです。M5Stack のコンパイルは Arduino IDE でとても遅くてイライラしてたのが耐えられるぐらいの速度になりました。macOS ネイティブ環境しか比べていませんが。また、天文系の画処理ソフトはそこまで速くなった感は無いのですが。と思って、Windows で Autostakkert によるスタッキングの速度を比較したら、えーという結果が。。 Parallels の Edition 選択のところにその顛末を。

Parallels vs UTM

どうしようか迷ったが、とりあえず安定しているだろう Parallels にしとこう。

Parallels Standard Edition vs Pro Edition

てんこ盛りにしても CPU 数 8、メモリ最大 24GB とあまりリソースの多くない M2 Air に Standard だと CPU 4, メモリ 8GB までしか割り当てられなくて十分に感じられる。したがって多くの CPU やメモリを割り当てられる Pro にするメリットはない。ほんと?ということで、CPU の数を 4 と 6 動画撮影して PiPP で前処理した木星 2400フレームを Autostakkert! 3でスタックしてみた。
スタック時間が 84秒と 70秒。メモリ使用量も 1.4GB 程度なので 8GB もあればとりあえず十分。かな?使用した画像はだいぶトリムしてるので、ちょっと大き目な画像を処理したら 8GB では足りないかもしれない。そんなの滅多にないと思うので、Standard でいいかもしれないし、24GB ではなく、16GB で十分だったかもという気になってる。Standard Edition と Pro Edition の価格差は 1,000円ほど。macOS の更新が毎年あったとして、それに合わせて Parallels もアップデートした方が良いかもと考えると微妙だなぁ。この差。どうしよ。年に +1,000円して少しおまけな機能と OS のアップデートに合わせた更新をしていくのかとか。
結局。。一年間はプロにして様子見。ということにした。


4 core

6 core

ここで衝撃の事実。
実は今まで使ってた Intel Mac 爆速でした。


Stacking という項目をみるとわかるのですが、倍速です。えぇ、涙目です。なんで古い Intel Mac が勝つんだ〜と。

ちなみになんでこういう差になるかというと、真ん中の上の方に Thread という項目があるのですが、Intel Mac 8 なんですよね。それと比べて 4 コアだと 4, 6 コアだと 6 スレッドというようにコアの数しかスレッド流せないみたいです。M2。それとも OS がサポートしていないだけなのか。。Intel Mac は Core i7-4770HQ というプロセッサーで、4 コアなのですが、8スレッドあるので、スレッド数で優ってるんですね。M2 ネイティブなソフトならコア数で同じ数のスレッド走らせるとするとどうなるんだろう?というのは気になりますね。

VM

Windows 11

は DSP版でお安くした分、無駄に Pro にしておいた。
Windows11 は今までの MacBook Pro の Bootcamp で走る Windows 10 は残すので、別途 DSP版を購入したのだけど、アクティベーションに苦労した。DSP版だからというわけではなさそうなのだけど。多分。終わりよければ全てよし。アクティベーションを何度も試すときはVM捨てるので、インストールしたソフトはすべて空に。。

Ubuntu

Windows に WSL ではなく、Parallels に Ubuntu を導入。こちらのほうが素直ですよね。とりあえず iverilog + gtkwave が走る環境を準備。iverilog は apt で最新版を入れられたのだけど、fst フォーマットが扱えなかったので、ビルドからやりなおし。RISC-V チップの Verilog simulation の実行は結構速く、、いや今までの環境に比べると体感爆速。

M2 Air で出来たこと出来ていないこと

(2023/2/5 時点)
天文関係のソフトと組み込み系のソフトを試しています。Win11 は Parallels18 上で走らせています。Parallels には Ubuntu も入れています。

動かせたもの一覧。

天文関係

macOS

  • Firecapture 2.7.10 + ASI462MC
  • ASIStudio v1.7 + ASI462MC
  • SynScan Pro v2.1.12 + AZ-GTi
Firecapture と ASIStudio はどちらもカメラを認識してカメラをオン、画像を表示できました。SynsScan Pro の Mac 版なんてあったんですね。撮影は Mac で、画処理は Windows でいけそうです。いままで Sharpcap だったんで、Firecapture 覚えないと。

Win11

  • PiPP  x64 v2.5.9
  • Autostakkert 3.1.4
  • RegiStax6 Version6.1.0.8
  • WinJUPOS 12.2.4
ファイルの Open, Save に関しては Mac と共有のフォルダではダメなケースがありましたが、処理自体は特に問題ない感じです。どのツールも速くなった感じはあるものの、もともとそれなりに時間がかかる処理なので、めっちゃ速くなったという感じはしませんでした。

組み込み系

macOS

  • Arduino IDE + M5Stack Basic, Gray, Stick, Stick+, Atom-Matrix,Atom-Lite,M5 Core2,M5Paper,CoreInk
Basic, Gray, Stick は認識させるのに苦労しました。M5Stack のサイトにあるドライバを入れたりなんなりごちゃごちゃしてたらいつの間にか認識するように。他は特になにもしなくてもあっさり認識しました。Arduino IDE のコンパイル時間は速くなりました。ちょっとは待たされるのですが個人的に許容範囲です。PlatformIO や VSCode の Arduino 環境ではまだ動作確認できていません。
  • MakeCode + micro:bit 
初代 micro:bit です。最初すぐに認識してくれなかったのですが、接続できて MakeCode からダウンロードボタンで書き込みができました。

Win11

  • Gowin V1.9.8.09 Education + TangNano4K, TangNano9K
この手のツールは全然ダメだろうと諦めていたのですが、ビットストリーム吐き出して、書き込みも OK でした。ただ表示が崩れていてシリアルの設定か何かは全く内容を確認することも設定することもできない感じです。また無印 TangNano に関しては認識してくれなかったので、書き込みテストできていません。

上手くできなかったもの ToDo

上記はうまく動いてそうな組み合わせ。動かなかった・または一部動いていないものは以下です。
  • SynScan Pro (望遠鏡の架台 AZ-GTi の制御)
    Windows からだとツールは立ち上がります。シリアル接続がうまくいかないです。なぜかこの環境だとシリアルデータに偶数パリティが追加されるようで、それが原因のようです。Mac 版があることがわかってそれが動作するのでいいのですが、他のソフトとの連帯はどうなんだろ。
  • SyarpCap
    起動はします。カメラ認識してくれないんですよ。ZWO で ARM 向けのドライバを用意してくれていないからだと思います。ただ、ZWO としてはなんかしてくれそうな雰囲気
  • Vivado 2015 (旧Xilinx の FPGA 向けツール)
    入れたけど起動せず。困ったことにアンインストールもできずに無駄なディスクを食ってます。OS 入れなおそうか。。新しいバージョンは動いているらしい事例ありです。
  • Tang Dynasty (TangPrimer 搭載 Anlogic の FPGA 向けツール)
    Win は Bitstream まで出せるが、ダウンロードできない, Ubuntu では起動しないが、シリアルは認識してるので、どっちもどっちな感じ。惜しい。Win 11 ARM 向けドライバ作ってー。もしくは Linux 版リビルドしてー。
  • Quatus (旧Altera の FPGA 向けツール)
    Win, Ubuntu ともにインストールすらままならず。Win 版 Quatus は WSL が必要らしいので、入れてみようと思ったけど WSL そのものが入らず。そもそも仮想マシンの仮想マシンってどうよという。しかも WSL で Ubuntu が走ったとしても ARM 系 Ubuntu だと結局だめじゃんとなりそう。

というわけで、なにか代替え手段があるかもしれませんが、上記はまだまだなツールです。ハードに依存しない Windows のソフトは結構動いている感じです。組み込み系も FTDI の USB シリアル系搭載デバイスであれば案外いける雰囲気があります。他にも ARM 版ドライバさえあれば、、という惜しいツールもあったりします。また Visual C++ 再配布可能なパッケージが必要なソフトウェアもあるので入れなければならないかもしれません。が、これはこの環境とはまた別でよくある話かも。他には XX.DLL がありませんのようなメッセージが出て起動できないツールがあるのですが、DLL のみを入手できるサイトから入手して適切なフォルダに置くと OK とかいう場合もあるそうです(自分では上手く行ったものは無いのですが)。
Ubuntu や Windows 上の WSL (インストールできてない)は、軒並み既存バイナリは動かなそうな雰囲気です。ARM アーキテクチャ向けに再ビルドが必要なのかなという感じ。

USB のドライバ

ちなみに Windows 向けの FTDI のドライバは ARM 版をインストールできます。.zip をダウンロードして C: ドライブに展開。デバイスマネージャーから黄色三角の出ている FTDI 系デバイスに対してドライバを展開したフォルダを指定してインストールすれば OK です。注意点はドライバーを Windows の C: ドライブのどこかに置くことです。Mac 側と共有されているダウンロードフォルダーに置かれていたりすると認識してくれません。
M5Stack は USBのドライバを 配布してます。

AE-F234X も使えてますよ〜。
TX と RX をワニでショートな荒技ループバック



Parallels での Windows で注意すること

あれおかしいと思ったらデータを保存、起動する場所を調べてみるといいかも。上記で書いた通り、Mac との共有フォルダに置いたファイルの読み書きは Windows のソフト次第でできたりできなかったりなので、基本 C: ドライブにおいた方が問題なさそうです。


とりあえず進捗あったら更新します。気が向いたら。



2019/09/11

MIDI 機器(リズムマシン R-8MK II)をコントロールしてみた

ギターの練習のお供にリズムマシンを使う時に、例えば8ビート1小節のパターンを延々と流しながら、というのは良くあるんではないかと思います。ただ、曲によってはAメロとBメロではパターンが違ったりするのに同じパターンで続けてしまったりするのですけど。

もちろんリズムマシンでパターンをいろいろ用意して、それを繋げて1つの曲に仕立ててカラオケがわりにそのパターンを流せば気持ちよく練習ができるとは思うんですが、まず曲を準備するのが面倒臭い。

とりあえず Aメロの基本パターン1小節、Bメロの基本パターン1小節がスイッチ1つで切り替えられるなら、まぁいいんじゃない?ということで、あまりお金をかけずにこれを実現する MIDI OUT 機器を作ってみます。

1. 簡単仕様


  • リズムマシンのターゲット Roland R-8MK II (手持ちがこれなので)
  • MIDI OUT コントローラのマイコンは micro:bit (手持ちのパーツを流用)
  • リズムマシンには A, B の2つのパターンを準備
  • リズムマシンはパターンプレイモードでパターンをあらかじめ実行
  • ボタンを押すと A, B のパターンを切り替える
もう少し機能をつけたいのですが、とりあえず最低限のやりたいことを実現します。
最初は Arduino で作ってたのですが、モーター回すのに micro:bit 使っていて、ボタンも備えられていることから micro:bit で実装してみました。

2. 実装イメージ

3.3V 電源の構成。本当に簡単簡単。4番ピンを 33ohm を通して 3.3V にプルアップ。5番ピンは 10ohm を通して UART の TX に。ここでは micro:bit の P2 を割り当てています。丁寧にやるなら 2番ピンとシールドの外側は GND に。ただし、それをやっていいのは MIDI OUT のみ。

ちなみに5V 系のマイコン例えば Arduino だったら 220ohm の抵抗を両方に使えばいいですね。


3. プログラム

シリアルの端子の送信を P2 に割り当てます。P1 はおまけ。

ボタンを押したらプログラムチェンジを送ります。プログラムチェンジは 2byte 構成。

最初の1バイトでプログラムチェンジのコード 0xC0 に CH 番号 - 1 を加えたもの。続いて、プログラム番号は 1バイトを送ります。

ブロックエディタだとバイナリーのデータを送るブロックがないので、この部分のみブロックエディタから JavaScript エディターに切り替えて入力します。ついでに関数にしてしまいます。

pins.createBuffer(2) で 2バイトの配列を準備。setNumber(変数, インデックス, 値) で配列の要素に値を設定。serial.writeBuffer() で準備した配列を送信します。


4. 実行
4.1 R-8MK II の設定

必要な設定は

MIDI -> TX CH -> 10CH

MIDI -> FUNCTION -> PGM CHANGE = ON
のみ。
パターンを二つ用意して、パターンプレイモードで START しておきます。


4.2 Play

A/B ボタンを押せばそれぞれにアサインされたパターンに切り替わります。

本当はフットスイッチを付けたいところ。デモなんで、お手軽に micro:bit のスイッチを使ってます。

CASIOPEA の Street Performer より


5. 次のステップ


  • フィルイン機能1
    A または B メロパターンを実行中にフィルインボタンを押すと、AまたはB用のフィルインパターンを1小節実行して、また元のパターンに戻る
  • フィルイン機能2
    A/B 切り替えボタンを押した時に、A->B 切り替え時フィルインまたは B->A フィルインパターンを自動的に1小節挟む
  • スタート、ストップトグルボタンの追加
  • テンポの自動取得
    フィルイン機能を入れるのにはテンポがわからないと適切なタイミングで次のパターンが入れられないと予想されます
  • 筐体とボタンの強度を上げる
    今のでは足で踏むとすぐ壊れます

というのをボチボチ実装していければいーなと思います。が、やるんだろうか。

6. 解説
ハマったところをメモがわりに解説しておきます。

6.1 MIDI 端子のピン配置

まずMIDI 規格書はこちら。CA-033 が電気的規格を理解するのに丁度いいです。
これがすごくハマりました。使う端子はたったの2つ。4番と5番。これがどちらかわからない!制作記事をみても多くが MIDI IN の回路だったりして。テスターのダイオードチェック機能を使えば MIDI IN 回路のフォトカプラの入力の極性から4番、5番端子が特定できそうなものだけれど、サージなどからの保護用のダイオードがパラレルに逆極性で入っているので、どちらもダイオードのアノード、カソードに見えてしまう。あと、MIDI IN - MIDI OUT はストレートケーブルで繋がるので、MIDI IN の 4 は MIDI OUT の 4 というように同じ番号同士がケーブルで接続されます。

結局こちらのブログの記事が助かりました。

CA-033 の規格書はどっちから見たんだ?オスコネクタ目線?? ちなみに IN 側も OUT 側も端子配置は同じ。正しくは OUT 側は 4番、5番の間に挟まれた 2番とシールドの外側は GND に落としますが、ここではサボっています。写真だと手前の空いている二つのピンがシールドで、奥の半田付けされたジャンパーピンの間のピンが2番です。ノイジーなステージでの使用を考えるならちゃんと GND に落とすべきですね。ただし IN 側はこれらのピンを GND に直接は落としません。浮かせるか、0.1uF のコンデンサを介して GND に落とします。折角フォトカプラで分離してるのに GND を直接ショートしたら意味ないということかなと思います。



6.2 MIDI OUT の回路と抵抗値

ここも最初は理解できませんでした。電流ループとか書かれてもねぇ。
結局、MIDI OUT 側の回路は、H 出力時、MIDI IN のフォトカプラ入力に 5mA 程度の電流を流し、L 出力時には電流を流さないという回路を考えればいいようです。電源電圧は 5V である必要はなく、3.3V でも良いのです。なぜならフォトカプラの入力に繋がる回路は発光ダイオードなので、そのダイオードが光る電流を流せばいいからですね。
ちなみに OUT 側の MIDI 端子 4番が電源電圧側(5V or 3.3V)と覚えれば良いです。フォトカプラのアノード側が繋がるので。

ところで抵抗はフォトカプラを動かす回路の電流制限という意味とショートした時の保護という意味で入れるようです。



VTX=5.5V RA=RC=220ohm
VTX=3.3V RA=33ohm, RC=10ohm


6.3 MIDI データフォーマットと R-8MK II


もう少し研究する必要があります。とりあえずプログラムチェンジだけ使いました。
0xC0 + (CH - 1), Pattern No. の 2byte 構成。

電池切れました。おしまい。

2019/09/08

micro:bit + LV8548MC (ステッピング モーター編)

責任感ゼロ、いじり放題の趣味のプログラミングやブログの書き込みは気楽でイイですよ。

さて、お待たせしました!ステッピング(ステッパ)モーター編です。micro:bit と LV8548MC を使って回してみます。ほとんど新しくなった LV8548MC のパッケージの解説となります。

ハードウェアの準備

モーターを除けば DC モーターと同じです。まずは前の記事を。

モーターはバイポーラ型ステッピングモーター MDP-35A を使いました。ググると仕様書が見つかると思いますが、4端子 A, A(上の線つき), B, B(上の線つき)で、A, B 二つのコイルそれぞれブレッドボードに刺さるようにピンヘッダを半田しました。


これを DC ブラシモーターのときに組んだブレッドボードに刺します。


LV8548MC の OUT1, OUT2, OUT3, OUT4 に先程のピンヘッダを刺します。
ハードの準備はこれでおしまいです。

ソフトウェアの準備

これも DC のソフトウェアで説明した通り。同じパッケージにステッピングモーターのブロックを追加しました。以下の GitHub の URL を拡張機能の追加で指定してください。詳しくは前回の記事で。

https://github.com/ttrsato/pxt-lv8548mc.git

ステッピングモーターブロックの説明

DC からいっぱい追加したので迷うかもしれませんが、最低限必要なものは STEP カテゴリーの最初の三つだけです。


ちなみに DC 用と混在できません。間違わないよう先頭に S: と書かれているのがステッピングモーター用。D: が DC モーター用です。

設定

set stepper で IN1〜IN4 の設定をすれば準備完了です。どのピンでもそれぞれが被らなければ構いません。プルダウンメニューから選んでください。全部のピンが見当たらない場合はマウスのスクロールで残りが見えると思います。
回したいモーターの仕様書をみて、A, B コイルの端子を調べて、それぞれのコイルの両端を A-A', B-B' に割り振れば良いです。

あと、Excitation(励磁)方法を選びますが、よくわからなければ 1/1(Full step, 2相励磁) を選んでおけば良いです。1/2 は(Half step, 1-2相励磁)。LV8548MC はこの2種類の励磁方法のみ選べます。マイクロステップをしたい方は別な IC を選んだ方がいいです。オンセミの Solution Kit なら、LV8702 か LV8714 ですね。
ちなみに 1/1 の場合、48ステップで軸が一回転するステッピングモーターの場合、48ステップで一周。1/2 の場合は倍の 96ステップで軸が一周します。

初めてのステッピングモータープログラム


3つのブロックを使っただけの簡単なプログラム。
ボタン A を押したら Forward 方向に48ステップ回って、Reverse(反対方向)に48ステップ回って、Forward に 24ステップ、Reverse に24ステップ回って終了します。


こんな感じ。


この run stepper ブロックは回転する方向 (Forward/Reverse) と動かすステップ数、速度を指定することができます。ms/step は 1ステップを動かす時間です。ms (1秒の1/1000) で指定します。最短は 1ms/step です。ただこの速度で動くかどうかはモーターと負荷次第です。プログラムの処理速度もどうだか。ちなみに負荷が重いなど期待した速度で回らなくなることを脱調と言います。


最後に指定しているのが stop stepper。ここでは Free(励磁無し) と Hold(励磁保持) を選択できます。run stepper では回し終わった後に Hold(励磁保持)状態になっています。電流が流れたままなので、コイルは磁力を持ち、軸は弱い力では動きません。Free ではコイルの磁力は無くなるので、軸は弱い力で回すことが出来るようになります。Hold 状態は電流を消費しますし、モーターがとても熱くなるので、位置を保持する必要がなければ Free しておいた方が良いかもしれません。

とりあえずこれらを組み合わせれば大体好きなことは出来るのではないかと思います。

残りの基本ブロック


run stepper accel と run stepper trap の二つがあります。

run stepper accel
加速、減速を実現するブロック。start の速度から stop の速度まで、段階的に steps で指定したステップ数回転します。

run accel デモ

run stepper trap
台形駆動します。台形駆動は、だんだん速く回転し、一定速度で回った後、止まる前に徐々に速度を遅くする機能です。グラフを書くと台形なのでそんな名前です。

run trap デモ

変換ブロック

残りは変換ブロックです。回す単位や、速度の単位を変えたい時に使います。物によっては STEPPER units ブロックで初期設定を入れる必要があります。
おまじないというわけではないのですが、


set steps/round を設定しておきましょう。今回使用した MDP-35A はステップ数 48 なので、48を設定します。ステップ角は 7.5° (360/48) なので、


set deg/step で設定しても同じです。これらを指定することによって、回転を角度や回転数で指定したり、速度を rpm で指定すると期待通りに動くようになります。つまり以下のブロックがようやく使えるようになるわけです。もちろん 1ステップ以下の動作は出来ないので丸められます。


これらのうち、STEPPER to steps 使うと最初のプログラムはこういう風に書き直せるわけです。


2周、1周、180°、90°など、直感的に値を設定することが出来るようになります。
応用編として、回転するステージがギアを介してステッピングモーターに繋がっていて、1 ステップで 0.1° 動くシステムなら、set 0.1 deg/step を設定すればステージの回転角度を与えて動かすことが出来ます。ちなみに set mm/step を設定しておくと、mm to steps を使えるようになります。これはスライダーなどのボールネジを使った直線駆動する機構に対する設定で、1ステップで移動する距離を mm でセットすると、mm to steps で移動したい距離を与えるとステップ数を返すようになり、上記の角度指定のように直感的な指定が可能になります。

STEPPER to ms/step は、速度の単位を変換するブロックです。
Hz や、rpm でステップの変化速度を与えたい場合はこれらを使ってください。

速度を周波数 Hz で与える

ちなみに上記のコードを実行すると、あれ?となりませんか。1Hz は 1秒間に回転する回数なので、1Hz だったら 1秒で 1回転するはずじゃんと。残念ながら 1ステップ移動する速度が 1Hz(1秒) です。一周するのに 48ステップなので遅いんです。rpm 指定も同様です。仕様です。いやいや、一周単位での Hz やら rpm で設定したいという方は Hz または rpm で与える数を rounds to steps で囲ってから Hz/rpm to ms/step に与えてください。


rounds to steps は一周のステップ数を掛けた答えを返すので、辻褄が合うんですね。

以上、で LV8548MC を使ったステッピングモーター駆動のためのブロックの説明はおしまいです。残念ながら micro:bit が一生懸命駆動パルスを生成しているので、モーターを回している最中は何も出来ませんので悪しからず。

おまけ

あっているかどうかわからないけど、台形駆動のパラメータの計算に苦労したので晒しておきます。面倒臭いのでバグがあると言われないと見直したくないです。間違いがあったら教えてね。

台形駆動は、トータルカウント(ステップ)数 Ca と、トータル時間 Ta、加減速時間 T1 と初期スピード S1 のみを与えて、残りは計算で求めています。

加速期間は速度 S1(ms/step) から S2(ms/step) まで徐々に1ステップの時間が短く(長く)なります。この時間を全部足したのが T1 になります(8)。また、T2 の時間をその時の1ステップ速度 S2 で割ったのが T2 という二つの方程式を解けばいい(4)。なんだけど意外に面倒臭い。答えは (10)。

台形駆動

余談。ステップ時間で見ると、台形じゃなく、上記のように台形の逆さま。じゃぁと速度に直すと 1/S1 とか逆数になるので、直線じゃないです。ただ周波数に変換すると S1 は実際は時間です。1/t=f なので周波数にすると台形になって、しかも直線になります。そういうこと?

今回から数式を埋め込めるように TeX のコード解釈できるようにした。TeX なんて学生の頃以来ですよ。でも数式書くならいまだに TeX いいよね。最高です!クヌース先生。

\begin{align}
T_{ams}=2 T1_{ms}+T2_{ms}
\end{align}
\begin{align}
C_{asteps}=2 C1_{steps}+C2_{steps}
\end{align}
\begin{align}
\Delta s=\dfrac {S1_{msps}-S2_{msps}}{C1_{steps}}
\end{align}
\begin{align}
C2_{steps}=\dfrac {T2_{ms}}{S2_{msps}}
\end{align}
\begin{align}
T1_{ms}&=(S2_{msps}+\Delta s)+(S2_{msps}+2\Delta s)+\cdots +(S2_{msps}+C_{asteps}\Delta s)\\
&= \sum^{C_{asteps}}_{i=1} (S2_{msps} + i \Delta s)\\
&= C_{asteps}S2_{msps} + (1 + 2 + \cdots + C_{asteps})\Delta s\\
&= C_{asteps}S2_{msps} + \dfrac {C_{asteps}(C_{asteps} + 1)}{2} \Delta s
\end{align}
\begin{align}
(C_{asteps} - 2)S2_{msps}^{2} + (C_{asteps}S1_{msps} - 4T1_{ms} - T2_{ms})S2_{msps} - T2_{ms}S1_{msps}
\end{align}
\begin{align}
S2_{msps} = \dfrac{-(C_{asteps}S1_{msps} - 4T1_{ms} - T2_{ms}) \pm \sqrt{(C_{asteps}S1_{msps} - 4T1_{ms} - T2_{ms})^{2} +4(C_{asteps} - 2)T2_{ms}S1_{msps}}}{2(C_{asteps} - 2)}
\end{align}



2019/09/01

micro:bit + LV8548MC (DC モーター編:プログラミング)

前回、micro:bit + LV8548MC (DC モーター編:とりあえず ハード)ではハードウェアに関してクドクド書きましたが今回は micro:bit に拡張機能で LV8548MC のパッケージを追加して、LV8548MC のブロックを使ってモーターを回してみます。プログラミングと言いつつ、単なるパッケージのブロック説明ですが。

ステッピングモーターブロックの追加に伴って内容アップデートしました。

拡張機能のインストール


GitHub に上げたパッケージを指定してインストールします(オリジナル)。
ブラウザーで MakeCode を開きます。既存のプロジェクトを開いてもいいですし、新規のプロジェクトを開いてもいいです。ちなみに iPhone 上でもプログラム作れますよ!

ちなみにこの拡張機能は LV8548MCSLDGEVK の機能を参考にはしていますが、完全にゼロから作っていますし、インターフェースも異なります。オシロスコープの私物が無いので、思ったような波形が出ているのかやや不安ですが、動作的にはまぁ、そんなに間違いは無いだろうといった感触です。

プロジェクトを開きます

拡張機能をインストールするために、高度なブロック、拡張機能のタブをクリックします。

拡張機能のインストール

LV8548MC の拡張機能を探します。検索ウィンドウに、
https://github.com/ttrsato/pxt-lv8548mc.git
を入力します。

拡張機能の検索ウィンドウ

検索すると lv8548mc が見つかります。クリックすると一瞬でインストールされます。

lv8548mc が見つかった!

MakeCode のエディターに LV8548MC のタブが増えています。
あとは使うだけ。


ブロックについて


LV8548MC の DC モーター用ブロックは3つあります(減りました)。残念ながらローカライズはやり方がいまいちわからなく(以前トライしたときにうまくいかなかった)、そのうち対応します。誰か知ってたら教えてー。

  • 初期化ブロック

Set DC Motor は LV8548MC のCH1 (IN1, IN2) または、CH2 (IN3, IN4) に繋ぐ micro:bit の端子を指定します。一つのチャネルに一つの初期化ブロックが必要です。DriveMode は PWM 駆動時の非通電時の動作の指定です。Open または Brake の指定ができます。
ちなみに DC モーター用のブロックの頭には D: が書かれています。ステッピングモーター用ブロック(S: で始まるブロック)とは共用出来ませんのでご注意を。

  • 速度指定ブロック

モーターを回すブロックはこれ一つです。ステッピングモーターブロックの追加の時に見直されました。

モーターの回る方向は Forward または Reverse (反転) で指定。速度は 0〜100 の割合 (duty) で与えることができます。ある一定以上の速度になるとモーターが回転を始めます。ほどほどに。定格外の電圧を加えている時は注意です。

  • 停止ブロック

 モーターを停止させます。
止めるときには Open または Brake を選ぶことができます。Open はモーターは慣性に従い緩やかに停止しますが、Brake はモーターを急激に停止させます。

サンプルプログラム


簡単なサンプルプログラムです。
徐々に速度をあげて、徐々に速度を下げるを繰り返すだけのプログラムです。




次はいよいよ ステッパー (ステッピング)モーターです。



micro:bit + LV8548MC (DC モーター編:とりあえず ハード)

オンセミLV8548MC が秋月で取り扱いが開始されました!

LV8548MC は DC ブラシモーターx2 またはステッピングモーターx1、電源は 4V〜16V のモータードライバーです。

また、そのままでは扱いづかいので、aitendo からピッチ変換基板が2種類(その1その2)が9月上旬から販売されるようです。

オンセミの LV8548MCSLDGEVK ならば付属の Arduino micro を使ってハードウェアの準備をほぼする必要なくモーターを回すことができるのですが、ここではmicro:bit で LV8548MC を動かしてみます。しかも安価に。ではそのハードウェアの準備をします。

まずはピッチ変換基板を使って、モータードライバー IC を使いやすくします。
待ちきれないので、aitendo の既存の SOP-10 ピッチ変換基板 を使いました。できれば新しく販売される基板を使ったほうが良いでしょう。フットパターンが LV8548MC に適しているので半田付けの際に位置決めしやすいし、配線が太めなようなので、大電流を流したいときに安心です。

さ、お試しならばとりあえず既存の変換基盤で大丈夫です。こんな風に半田付けしました。IC をよく見ると横棒が書いてあるのですが、横棒が近い辺が 1 pin (VCC) と 10 pin (OUT1) 側になります。




まぁまぁな感じで半田付けできました。


1 pin (VCC) と 6 pin (GND) の間にはデータシートにしたがって、パスコンを入れました。奮発してセラミックコンデンサ 10uF/50V。これがまた IC より高い。。(150円@千石電商)。データシートでの指定は 0.1uF〜10uFなので、安定性と財布次第で適宜変えてください。パスコンなので、無くても動いちゃうかもしれませんが、電源がプアだと動作が不安定になるので、入れるに越したことはありません。とりあえずセオリー通りに IC のなるべく近くに置きました。

micro:bit と DC モーターとの接続

micro:bit と LV8548MC の GND を一緒にすることを忘れないように。また 10uF のパスコンとは別に、100uF/50V の電解コンデンサーを LV8548MC の VCC - GND 間に入れています。パスコンは動作の安定のためですが、こちらは破壊防止です。壊したくなかったら入れておいたほうが無難です。
モーターが駆動しているときにモーターのコイルにエネルギーがたまります。モーターを急停止すると、このエネルギーをもとに回生電流が流れるのですが、ACアダプターなどの電源がこれを吸収しきれない場合、IC に印可される電圧が急上昇することがあり、IC が破壊に至る場合があるからです。100uF はこの上昇を抑える作用があります。
ちなみに LV8548MC の電源は手持ちの 6V/1A を使いました。LV8548MC は 4V〜16V で動作するので、この範囲の電源を接続してください。4V 以下では正常に動作しません。ちなみに、オンセミは LB1948MC という 2.5V〜16V で動作する LV8548MC とピンコンパチ(ファンクションも同じ)のモータードライバー IC もあります。4V 以下で動かしたい方はこちらを選択してもいいかもしれません。DigiKey などで取り扱いがあります。
モーターは子供達に破壊されたタミヤの2チャンネル リモコン・インセクトを分解して取り出したものです。

接続拡大

さてLV8548MC と micro:bit、モーターとの接続ですが簡単です。VCC, GND に電源、そして DC モーターを駆動するときは、

CH1: IN1, IN2 (OUT1, OUT2)
CH2: IN3, IN4 (OUT3, OUT4)
をペアとして接続してください。CH1, CH2 の定義は上記の通りとします。micro:bit でプログラムを書くときに指定するときに必要です。

IN1, IN2 および OUT1, OUT2 の極性にナーバスになる必要はないです。逆に回るだけなので、期待通りでなかったら接続を変えるか、ソフトの初期化の時の端子設定を逆にすればいいだけですから。

micro:bit と IN1〜IN4 を接続する必要がありますが micro:bit 側のピンは任意です(全部チェックしたわけではないですが)。また CH1, CH2 の両方のチャネルを接続しなくてもいいです。CH1 のみとか。IN1〜IN4 端子は内部でプルダウンされているので、何も接続していない場合は、例えば CH2 の IN3, IN4 に何も繋がない場合、OUT3, OUT4 はハイインピーダンスになるので問題ありません。

詳しくは LV8548MC のデータシートを参考にしてください。

ちなみに micro:bit に割り当てるピンに迷ったら、エッジコネクタとピンアウトの仕様を見てください。LED 表示やら、ボタン入力、アナログ入力など特別なファンクションに割り当てられていないのは P8 と P16 であることがわかります。自分の使いたい機能を持たないピンに割り当てれば良いと思います。
ただ、P0, P1, P2 以外の端子を利用しようとすると、Sparkfun などのマイクロビットブレイクアウトボード (リンクはマルツオンライン。色々な種類があって秋月などでも扱いがあります)が必要になります。上記写真では P13,14,15,16 に IN1,2,3,4 を割り当てています(これでは SPI 端子が使えません)。この手のボードを持っていない方は、まずは P0, P1, P2 を利用してみるのが良いかもしれません。

とりあえず DC モーターのハードはここまで。
micro:bit の LV8548MC 拡張機能パッケージやプログラミングについては次回









2018/02/13

micro:bit で低温調理

このネタは自分の facebook のタイムラインにも投下してるんですが、もう少し説明をクドクドと付け加えてブログに書き起こし直しました。

システム全景

低温調理でローストビーフを調理するのに、Anova とか出来合いをマシンを買うのはつまらないし、安くないから電子工作しよう!

という話です。

ことの始まりは、ローストビーフを炊飯器で作るレシピを試してみたら温度コントロールが思うようにならないので、電気ポット使ってどうにかならないかと思い、ググったら既にやってる人 Raspberry Piでつくる! 柔らかローストビーフ♪を見つけました。
ラズパイは持ってるんですが、温度調整ごときにラズパイ使うのも勿体無いので、別環境に移植しました。SSR も 3.3V 駆動したかったのと、コストを抑えるため、別なものを使っています。

最初に言います。PI 制御部分のコードは上記ブログの niku.py version 2.0 から移植させていただきました。ありがとうございます。パラメータもチューニングしようかと思ったんですが、同じ値を使ってみたら悪くないので、そのまんま。。重ね重ねありがとうございます。

おかげさまで我が家ではこのマシンはローストビーフのシーズンに活躍しております。ローストビーフだけでなく、低温調理チャーシューもお気に入りです。

まず最初に一昨年ぐらいに Nucleo の mbed に実装したのですが、去年末には micro:bit に移植しました。ここでは micro:bit 版について書いておきます。

回路図
手書きですみません

実体配線図1

実体配線図2

LM60 はスーパーX で固めて防水加工
GND 端子がチップに直結しているので
温度が伝わりやすいよう GND は
気持ちスーパーXを薄めにしてます

回路は簡単かと思います。

回路概要ですが、温度センサー LM60BIZ の出力 Vo を ADC 入力 AIN0 に入れ、ポットの電源のコントロール出力を P8 に出しています。100V の電源を ON/OFF している SSR は 100V AC のケーブルの片側を切って挟んでいるだけ。micro:bit とは取り外しの手間とか考えてステレオミニジャックで繋いでますが、直接接続しても問題ありません。使用した 秋月の SSR キット は 3.3V でも ON/OFF 出来るので、micro:bit の出力で直接コントロール出来ます。また SSR には秋月で大きめな?ヒートシンクつけています。なお AIN1 にはリファレンス電圧をシャントレギュレータ NJM431L から供給しています。

基本的には LM60 (秋月へのデータシートへのリンク)は温度に比例した電圧を出力するので、その電圧を micro:bit の ADC で測ればいいのです。ADC の結果はリファレンス電圧 3.3V の電圧を 1024 分割した値として得られます。

ちなみに micro:bit の回路図は https://github.com/bbcmicrobit/hardware/blob/master/SCH_BBC-Microbit_V1.3B.pdf のようです。

micro:bit の ADC のリファレンス電圧 3.3V は上記回路図を見るとわかるように、多分 nRF51288 の AVDD の電位のことを指していて、+V_TGT より供給されています。

+V_TGT は3通りの電圧の供給方法があって、 NXP のマイコン MKL26Z128VFM4 に入力された USB からの 5.0V 電源によって作られた 3.3V VREG33OUT か、CON1 コネクタに繋がれたバッテリー VBAT もしくは micro:bit のエッジコネクタから +V_TGT に直接供給される電源ということになります。

MKL26Z128VFM4 は USB I/F と 3.3V レギュレータを兼ねているようなのですが(レギュレータ出力以外は nRF51822 の SWD に繋がる線がある)、そのレギュレータ出力 VREG33OUT は MIN 3V, TYP 3.3V, MAX 3.6V とリファレンスには程遠く、しかもその出力は BAT60A というショットキーを挟んで +V_TGT に接続されます。いくらそのショットキーが低ドロップ電圧と言っても多少なりとも下がるわけで(MIN 0.1V の模様)。。全く信用なりません。他の経路からは電池からの供給だったりするので(アルカリ電池だったら 1.5V x 2 = 3.0V)、3.3V ですらないわけです。

という訳なので別途リファレンス電圧を用意して、その ADC の結果と、LM60 の ADC の結果から LM60 の出力電圧を計算にて求めて、少しは精度をあげてみようという試みを行なってみました。

リファレンス電圧には NJM431L シャントレギュレータを使いました。秋月で入手できるし、使い方も簡単。少しはマシなはずです。

NJM431 は、抵抗を通して VKA に VREF〜36V の電圧を与えると VKA には VREF の電圧が出力される素子です。回路構成は NJM431 のデータシートの TEST CIRCUITS の 1. で、その INPUT に micro:bit の VDD (3.3V ぐらい) を接続し、抵抗には 200Ωを挟んでみました。ELECTRICAL CHARASTERISTICS にあるように、VKA には TYP = 2495mV 出てるはずです。念のために VKA をテスターで電圧を測ってみたら 2475mV でしたので、コードには AIN1 に 2475mV 入ってくると仮定して、AIN0 に入ってくる LM60 の出力 Vo を計算で求めてます。AIN0/AIN1=Vo/2475 の単なる比例計算から求まります。どれ程精度が上がったのかはちゃんと確認してませんが、電源が変わってもリファレンスは一定のはずです。さー、どこまで効果があるのやらw

あと、LM60 の Vo と GND 間には 0.1uF のコンデンサを入れるといいです。出力の安定感がかなり向上します。VS+ GND 間はそれほどでもなかったので省略してます。お好みでどうぞ。また ADC の結果は複数回取って平均した方がいいです。そうしないと結果がバラつきます。

ちなみに回路図には書いてありませんが、micro:bit 用電源のために、USB 電源プラグ用のコンセントが AC 電源プラグに並列に接続してあります。無くてもいいですが、一つにまとまってると使いやすいのでそうしてます。

部品表
ちょっとうろ覚えなところもあり(2018/2現在)。
ざっくりこんなもんだと思って下さい。
このリスト+電気ポットです。

部品価格購入先
micro:bit2160円秋月電子
micro:bit Breakout (+ headers)842円マルツ
ソリッド・ステート・リレーキット25A(20A)250円秋月電子
ヒートシンク54x50x15mm110円秋月電子
LM60BIZ 温度センサー100円秋月電子
NJM431L シャントレギュレータ30円秋月電子
200Ω カーボン抵抗1/4W6円千石電商
0.1uF 積層セラミックコンデンサ15円秋月電子
ブレッドボード270円秋月電子
ブレッドボード・ジャンパーワイヤ10cmセット180円秋月電子
3.5mmステレオミニジャックDIP化キット150円秋月電子
3.5mmステレオジャックMJ-073H60円秋月電子
ステレオミニジャックケーブル108円百均
micro USB ケーブル108円百均
AC USB 電源プラグ108円百均
2P ACソケット105円千石電商
ケース108円百均
ケーブル類数百円〜秋月電子・千石電商
ゴムブッシュ秋月電子
3φネジ少々秋月電子
電気ポットを除くとざっくり 5000円ぐらいでしょうか。
安い。。とは言えないか。
でも micro:bit は使い回し出来るのでそれは差っ引いてもいいですかね?

コード
さて micro:bit でハマった点は、JavaScript ブロックエディタだと、整数演算しか出来ないところ。最初気づかずに結果が合わずに悩みました。mbed 環境にしてしまえばなんでもござれなんでしょうが、ここは敢えて JavaScript ブロックエディタで挑みます。従って、少数は整数に桁上げをしたり、演算の順序を気にして精度落とさないようにしたりして最後に割って桁戻しています。32bit の整数での演算だろうから、演算範囲から多分オーバーフローはしないなという仮定でコードを簡単に書いています。


ちなみに PI 制御部分のコードは冒頭に書いた通りです。上記ブログに PI 制御の概要が書かれているので興味ある方は読んで見るといいですよ。

プログラムの動作について:

  • デフォルトで表示されている値はPWMの値。0〜A です。スクロールしないよう一桁に抑えたかったので16進数です。
  • A+B キーでモードを切り替えられます。
  • ノーマルモード(デフォルト)では A ボタンで今の温度を表示、B ボタンでターゲット温度を表示。
  • ターゲット変更モードでは A でマイナス、B でプラス。温度表示は、温度 x 10℃です。32.5 ℃だったら、325 と表示されます。
  • USB の方のシリアルに温度情報とかをテキストで出してますので必要に応じてモニタしてもらえればと。Kp, Ki パラメータをチューニングしたい時にも役に立つと思います。

コードの中で特筆すべきテクニックを駆使しているようなところは全然ありませんので参考までに。デフォルトでPWMの値を表示させているのは半分デバッグの意味合いもあります。温度表示でもいいんですが、PWMループをある程度正確に保つためにリクエストがあった時のみ温度表示させています。温度は複数桁(3桁)を表示させるのでスクロールになってしまい、時間がかかり、PWMループが狂ってしまうからです。

キャリブレーション
実はコードそのままでは若干温度がズレてしまいました。変数 toffset で調整することが出来るようになっています。うちの環境では +2℃ほどズレているようなので、-20を入れて調整しました。温度計がない場合は沸騰したお湯とか氷水で温度のチェックをして、この値で調整してみてください。

そのうちキャリブレーションにも対応させて、値を外付けの EEPROM に保存しようかと思って、EEPROM をブレッドボード上に載せてます。micro:bit のフラッシュも不揮発性メモリとして使えるようですが、プログラムを書き換えると飛んでしまうようなので、外付けの EEPROM を使おうと思っています。氷水と沸騰したお湯の温度を測って toffset を計算させて、EEPROM に格納しようかと。micro:bit 起動時に EEPROM にマジックナンバーが書いてあれば、toffset の値をロードさせるというようなコードにするつもりです。

改良予定
まずはキャリブレーションと EEPROM 書き込みを追加したいです。
あとは、タイマーとブザーかな。Nucleo (mbed)版はタイマーとブザーは付けたんですが micro:bit 版は見ての通りまだです。それ程困らないし。ま、いっか。

レシピ
あ、肝心のローストビーフのレシピです。
このマシンのお陰て安定して作れるようになりました。

材料:
牛もも肉500g程度
塩胡椒またはシーズニングを適当に(肉の重さの1%程度がいいみたいです)

手順:

  1. 肉は常温に戻しておく(冷蔵庫から出して30分程度放置)
  2. 塩胡椒またはシーズニングをまぶす(3. の直前に)
  3. フライパンで全てにお好みの時間焼き目をつけます。
    そんなに簡単に奥まで火は通りません。
    火の通っていない断面で確認しながら調整して下さい。
    ちゃんと焼き目を入れるのは表面の殺菌にもなるので必ず焼きましょう。
  4. ジップロックに肉を入れる。口は完全に閉じずに端にストローを挿す。
  5. ジップロックを水を張った電気ポットに沈め、
    ストローから空気を吸って空気を抜いたらジップロックを閉める。
    水に沈めると空気を抜きやすいです。
    空気の層が残っていると温度が伝わりにくいです。ちゃんと抜くこと。
  6. micro:bit で温度調整開始!
    ミディアムレアの 57〜58℃だと 500g なら 60分もあれば出来上がります。
    それより長時間放っておいても火が入りすぎることは無いです。
    時間が長い方が柔らかくなる。。ような気がする。色々お試しください。
  7. 出来たらジップロックごと氷水に入れて急速冷凍。
    細菌の繁殖する温度をスキップさせることと、肉を落ち着かせるのが目的。
  8. 30分程度は放っておいてからカットして食べましょう!
    お好みで再度焼き目を入れてからでもいいですよ。
    お好みのソースやら、ホースラディッシュなどの薬味を添えて。

くれぐれも食中毒には気をつけて下さい!

余談
2011年にアメリカに出張した時に、プライムリブっていうのを食べた衝撃がすごくて、自分のうちでもいい感じに火を通したローストビーフが食べたい!と思ったのがそもそものきっかけ。あ、うちでもプライムリブやってみたいんだけど、なかなかハードル高いので(肉の値段やら入手やらサイズなど)、そこらへんで入手可能なモモ肉や肩ロース肉で我慢してます。それにしてもアメリカでは指定した焼き加減でキッチリ焼いてくれたりと、流石は肉食文化、スゲーと感心したもんです。

プライムリブ1ポンド(確か$30以下)
カリフォルニア、ミルピタスの Black Angus にて
柔らかくて、とろけるようです。うっとり。

アメリカに行ったらもう一度食べたい。うー。