以前ESP-WROOM-02でWi-Fi接続ができるという話をしました。Wi-Fiは既製品のルーターが使えるなど環境構築自体が安価で簡単になっていますが、出力もそこまで強くなく、一般的に使われている電波なので混線のリスクが高いです。展示会や舞台など大勢の人が携帯電話やポケットWi-Fiを持って入る空間では特に混線のリスクが高まるため、信頼性が求められる状況では避けることが多いです。今回は無線通信の基本から、Wi-FiやBluetooth以外の通信方式の紹介をしていきます。(繋がりやすさ)有線を使わず無線と使う時というのは、ケーブルの取り回しが難しいという状況だと考えられます。どのくらいの距離まで届くのか。一般的にデータシート等に書かれている通信距離というのは何もない空間での理想的な環境条件における距離なので、実際に使いたい環境で届くのか試す必要があります。やりとりする内容によっては通信速度も鍵になってきます。周波数が高いほど通信速度を上げることが可能になりますが、障害物などに弱くなってしまう傾向があり、繋がりやすさ=通信品質に影響してきます。電波を使う無線通信は、周波数で住み分けをしている。船舶航空などは110~150MHzの低周波、BluetoothやWi-Fiは2.4GHzの高周波これらの特性は、電波を発する時の周波数によって左右されることが多いです。単位は音と同じHzです。船舶や航空機のように、公共の場で広く使われる周波数は110~150MHzのような低周波、逆に我々が使う無線は800MHz以上の高周波帯がよく用いられます。BluetoothやWi-Fiは2.4GHzがよく使われています。電波と法律ある機器がその周波数で電波を送信と、他の機器は同じ周波数を使うことが出来ない周波数や出力に法律規制がある。先ほど混線の話をしましたが、電波というのは同じ周波数を複数の通信で使うことはできません。そのため、誰かが勝手に使いだすとその電波が届く範囲の人たちは同じ周波数を使えなくなってしまうので、乱用を防ぐため周波数の使い道や出して良い強さが法律で定められています。船舶や航空無線のような帯域を扱うためには免許も必要です。免許が不要な装置の場合でも、日本国内で電波を発する装置を使用するには、そのデバイスに対して総務省の許可が必要となります。これが「技適」と呼ばれるもので、このマークが無い装置の使用は基本的にNGです。pi4が発売されたのは2019年の6月でしたが、技適が登録され無事使えるようになったのは同11月からとなっています。最近法改正があり、技適の無いマークでも届け出をすれば実験目的で180日間に限り電波を発射することができるようにもなっているそうです。該当する2.4GHz帯と、サブギガ帯と呼ばれる920MHz帯の2種類です。無線モジュールのメリットチャンネル等を細かく設定して干渉をある程度防げる「マルチホップ」など特殊な通信構成プロトコルがシンプル電子工作用の無線モジュールを使うメリットとして上げられるのが、チャンネル等を細かく設定することで機器同士の干渉などをある程度防げる、選択肢が多いこと。他にはマルチホップのように特殊な通信構成を組むことで効率よく安定した通信環境を構築することが出来るという事などが挙げられます。有名なモジュールとして上げられるのが「Zigbee」と呼ばれる無線規格の機能を搭載したモジュールで、XbeeやTwe-Liteなどがあります。2.4GHzと900Mhz/800MHzの三種類がありますが、日本国内で使用が許されているのは2.4GHz帯のみなので、Wi-FiやBluetooth等の影響は避けられません。X-CTUという高機能なソフトウェアがあったり、入手性も良いので導入として始めるには丁度良いデバイスだと思います。ネット上にも情報がたくさん載っています。IM920最大1kmとかなり長距離通信が可能900MHz帯国内仕様なので、通信時間に制限がある2つ目がIM920というモジュールです。こちらは920MHz帯を日本国内で使用できるように設定されたもので、通信時間が1時間のうち6分間(それでも1時間あたり2万回のやりとりが可能)と制限されていますが、開けたところであれば最大で1km程度の長距離通信が可能なデバイスです。920MHzという帯域を使っているので2.4GHz帯より障害物にも強いということ、大勢の人がいる場所でも携帯電話のようなデバイスに影響されにくいというメリットがあります。最後はLoRaWanというLPWAの一種です。こちらも900MHz帯が使われており、間欠動作(必要な時だけ動作する機能)により消費電力を最小限に抑えるという働きがあります。作品やパフォーマンスというよりは畑で土壌の温度を数時間おきに計測して送信するといった実用向きな仕様ではありますが、考え方次第で面白い使い方ができると思います。送信側と同じ色に光る今回はIM920のデモをやってみます。IM920に接続するのに最低限必要なのは電源とGND・そしてシリアルのTX/RXです。NeoPixelを追加して赤→緑→青...と色の変化が同期するようにしました。通常のUSBとのシリアル通信のように送るIM920のプロトコルに従ってデータを送信する前回のDMXと同様に、Arduinoの0/1番ピンからシリアル通信でやりとりを行います。送ってほしいデータをIM920にリクエストをすると、そのデータを解釈して通信範囲のデバイス全体、もしくは特定のデバイスに向けて送信してくれるのでデータシートを読みながら必要なコマンドを実装する必要があります。//01,02,03...という順番で1バイトの数値を送っている。送信元のノード、受信データの電波強度が付加される受信側も同様にシリアル通信でデータを受け取るので、USBシリアルをする時などと殆ど処理は変わりません。01」というデータを送りましたが、受信される時には、「ヘッダー・送信元のノード・受信データ」の要素が追加された状態でArduinoまで届けられるので、その情報をパースしてあげる必要があります。直接シリアル変換を付けても良い文字列のやりとりなので、Touchdesignerに接続することも勿論可能です。今回はArduinoLeonardで受けたシリアル通信をそのままTDに流し込みます。ArduinoUNOの場合はUSBのシリアルとTX/RXは同じラインなのでどちらか片方しか使えませんが、Leonardの場合0/1番ピンはSerial1という別のラインになっているので、シリアル通信を使いながらUSBシリアルでPCともやり取りするという小技が可能になっています。DATのコールバックで処理するIM920から来るデータをTouchdesignerで受け取り、Pythonで解釈します。1,2,3という番号をRGBに割り当てているので、それに応じた条件分岐をしてTOPの色に割り当てています。(2019/01/10)スライドPDF後期課題出します締め切り:1/24の授業まで後期課題ページを参照DMXとは?舞台装置(照明や特効など)で用いられる通信規格ムービングライトやフォグ・AC100Vディマーなど遠距離で構成がシンプル、堅牢性が高いDMXは通信規格の一種で、舞台装置で用いられる事が多い規格です。一つの親から複数の子への一方向通信ですが、USBシリアルなどよりも長距離伝送が可能で、プロトコルも単純なため堅牢性が高いシステム構成ができるというメリットがあります。PCとDMXENTTEC社の「OpenDMX」が定番LAN上にDMX信号を載せられる「Artnet」フェーダーのついた調光器のような業務用機器が製造されていますが、PCからもコントロールすることが出来ます。oFやMax/MSP、TouchDesignerではENTTECが開発しているOpenDMXという規格のUSB->DMX変換を使ったり、LANに接続して使えるArtnetという信号を送ったりすることができます。親->子->子...のように数珠繋ぎしていく長距離・多数のデバイスでも配線がシンプル更に大きな特徴としてあげられるのが「デイジーチェーン」という結線方法です。OUTからの信号を入れてあげるという方法を取っているので、各デバイスを一筆書きで繋げるように結線すれば、使用するケーブルの総量は比較的少量かつシンプルな構成で済みます。親として:低コスト(高リスク)な送信機の開発DMXは通信プロトコルの一種なので、プログラムを実装すればArduinoからもDMXを送受信することができます。通常のArduino(Leonardがおススメ)にLTC485などのICを追加することで比較的簡単に実現可能です。2000円くらいでシールドも出ているようです。\Arduinoから送受信ができれば、子として通常の舞台装置のDMXラインに載る自作の照明や駆動装置を作ることができます。親として低コストで簡易的な送信機を作ることも可能です。信号線XLR5ピンまたは3ピンがよく使われるライン自体はHOT/COLD/GNDの3線DMXはHOT/COLD/GNDの3線があれば通信することができるので、ケーブルにはXLRの5ピンまたは3ピンが使われます。間違って照明機器と音響機器が繋がらないよう規格上は5ピンと定められているのですが、ケーブル資源を流用できる・大量に流通している3品の方が安く手に入るなどの理由から安物のDMX機器では3ピンのコネクタが使われる事も多いようです。LeonardoだとベターDMXのハードウェアレベルの仕様は、RS485(EIA-485)に準拠するこのXLRの3線をArduino側に用意したIC、LTC485Nと接続します。DMXの通信規格はRS485という電気的な規格をベースとしていますが、このICはArduinoのシリアル通信ポートをRS485に対応させるためのICです。TX/RXから行われるシリアル通信を、RS485準拠の差動通信という方式に変換することで電気的にDMX通信を可能にしてあります。TX/RXは0、1番ピンで固定なのでそれぞれ接続します。RS485は双方向では無いので、状況に応じて送信と受信状態を切り替える必要があります。DE/REピンがその設定にあたりますが、後述するライブラリで2番ピンを使うので2番ピンに接続するようにします。物理的なレイヤーはICを追加し、コネクタを用意して電気的に繋げることでクリアーできました。DMXは通信プロトコルなのでそのやりとりをArduinoにプログラムする必要があります。DMXSerialというライブラリがシンプルにDMXを扱えるようになるので、このライブラリを使ったサンプルを用意しました。DMXを受信する0~255の値が、512ch分送られてくる使いたい先頭チャンネルを決めて、そこから使っていくArduinoからDMXを受信します。DMXの信号は512個の数字が繰り返し送られてくるという実にシンプルなプロトコルになっています。1チャンネルの値の範囲は0~255で1バイト分なので、より細かい解像度でやり取りしたい場合は2chを消費して16ビットとするなどの工夫が必要です。サンプルはNeoPixelの色をコントロールするようになっていて、変数startChから3つ分のチャンネルを使うようになっています。DMX機器はこのように決めた先頭チャンネルから順番に使っていくという習わしになっていて、1つのラインでチャンネルが被らないようにしなくてはいけません。高級なムービングだと1台で30chくらい使ったりすることもあるので、全く同じ動きを期待する機器はチャンネルをあえて同じにするなど、配分に気を付ける必要があります。CHOPで送信TouchDesignerから受信させてみます。outCHOPとENTTECのDMXUSBから送ったDMX信号を、Arduinoに送ります。Arduino側のスタートチャンネルは1から3つ分なので、TOPの単色を分解してそのままCHOPにRGBとして流せばTOPと同じ色にNeoPixelが光ります。DMXを送信するinitの設定を変えれば、送信機として振る舞う送信と受信を同時にはできない送信も同じ要領でプログラムに書き込むことができます。ここではサイン波を生成してDMXの値として送っていますが、ボリュームやフェーダーを付ければもちろん自作の照明卓のようなものを作ることができるわけです。RS-485の話の時に言ったように、受信と送信を同時に行うことはできません。高速に切り替えれば出来ないことはなさそうですが、そういうことが必要な場面で使うプロトコルではありません。CHOPで受信あまり利用頻度としては少なそうですが、TouchDesignerで受信することもできます。inを同時に同じ機器に向けて接続することはできないので注意してください。c1-c512のチャンネルが生成され、Arduinoから出力した値がTDに表示されます。この信号をDMXUSBのTHRUから照明等に送れば信号のモニタリングをすることが可能ですが、受けたデータを上書き修正して送る、というようなことはできません。め切り】1/24の授業まで提出フォームこちらのフォームを授業までに記入してください。以下の中から好きな物1つを選んで提出してください。追ってGoogleフォームを作りますので、どちらを提出するかそちらに記入お願いします。課題A:作品プレゼンテーション電子工作を使用して作った作品のプレゼンを行ってください。・実際の作品か記録映像のどちらかがあれば、形式は自由とします。課題B:実装レポート記事の作成プログラムや電子工作は、試したことを自分でまとめると後ですぐにまた使えるのでとても便利です。いった知見を個人のブログ記事や、QiitaというWebサービスを使ってみんなで共有するという慣習があります。作品を作る時間が取れなそうという人は、そのとっかかりとなるセンサーを試してみて、自分用のノートとして記事をアップしてみてください。個人ブログやQiita・noteなどパブリックに見られる物なら何でもOKです。UNOをベースとした電子部品の使い方についてしていました。初心者でも扱いやすいマイコンボードというと、Arduino以前は値段も高く使いづらい物が多かったのですが、2000年代に訪れたArduinoの登場が一つのブレイクスルーになっていると言えます。今回はそのArduino以降生まれた様々なハードウェアについて、特徴等を解説していきたいと思います。高速)要素を削って更に安くした製品Arduinoは簡単に扱うということを基本的な目標としているので、デフォルトではあくまでベーシックで最低限の機能のみが使えるようになっています。その機能の範疇からはみ出て、ある用途に特化したりコストパフォーマンスを上げたりしたものが色々開発されていました。Arduino同様長く使われ続けている物もあるのですが、中にはすぐ開発が終了してしまって手に入らなくなってしまうような物もあります。単純に人気・有名な物や大手メーカーが開発しているものは長く続く傾向があるので、そういった物を学ぶと長く使えるノウハウとして有用です。以前紹介したESPシリーズもこの範疇に入ります。個人やクラウドファンディングで開発されたものは開発や製造がすぐに終了してしまったりするので、単発作品で使う分には便利ですが、長く付き合おうという時には少し慎重になる必要があるでしょう。今日紹介するものは、大きく分けて二種類あります。一つ目がArduinoと近い部類で、専用のICに一つのプログラムを書き込んで実行する「マイコンボード」と呼ばれるもの。小さくシンプルで安いという特徴があります。一つがマイコンよりも高性能なチップ(SoCなど)を使って殆どPCのように扱うことができる「シングルボードコンピュータ」です。こちらはLinuxベースで動く物が多いため、ProcessingやOpenframeworks、Puredataなど、マルチプラットフォームで軽量なソフトウェアは動かすことができますが、TouchdesignerやMAX/MSPあたりを動かそうとすると難しいかもしれません。マイコンボード1:MbedIDEがヴラウザベースなので、ネット環境があれば自分のPCも不要Arduinoよりも全体的に高スペック(48MHz/96MHz)MbedはARM社が作ったマイコンボードで、Arduinoよりも高速で開発環境がクラウドベースという特徴があります。アカウントを作ってその中で開発するので、インターネットがある環境であれば開発環境をインストールせずにどこでも開発できるという特徴があります。マイコンボード2:NucleoMbedベースで更に高機能なモデル(48MHz~216MHz)マイクロマウス等でも使われ信頼性が高いNucleoはMbedの環境で開発ができるSTMicro社のボードです。種類が非常に豊富なので、目的に合った無駄のないボードを選定しやすくなっています。クロックも48MHz~200MHz近くまで幅広い選択肢があります。マイコンボード3:TeensyMbedよりも更にハイスペック(400MHzなど)この高スペックだが相当薄く小さめArduinoよりも全体的に高速なMbed系デバイスですが、Arduino互換でクロックが早い物もあります。Teensyは600MHzとマイコンボードの中ではかなり高速なCPUを積んでいて、しかも殆どが面実装部品で構成されているため小型化がしやすいというメリットがあります。バーサライタ(参考https://homemadegarbage.com/teensy4)のようにLEDを高速に切り替えたりするような用途に向いているでしょう。続いてシングルボードコンピュータです。SBCはマイコンボードのようにデジタル入出力があるのに加え、USBやHDMIなど通常のPCで使うようなポートを備えている事が多いです。ソフトウェアについても、LinuxやWindowsのような通常のOSが動いていて、その中でプログラムを書いて動作させるという方法が主です。piはシングルボードコンピュータの中でもっともポピュラーと言って良いでしょう。piは初学者、特に小中学生でも扱えるようにドキュメントや専用OSを充実させているのでとても入手も操作も簡単になっています。Zeroというモデルがあります。Panda通常のWindowsが動作するArduinoクローンが載っているので、Arduinoスケッチもそのまま動作するシングルボードはLinuxが動く物が多いですが、そんな中でWindowsに対応しているのがこのLattePandaです。変わって構成で、Windowsが動作するICとArduinoが動作するICがあります。そのためWindowsで映像や音響を鳴らしながらArduinoスケッチを並列で実行するという使い方をすることができます。シングルボード3:JetsonNVidiaが開発しており、GPUが強力(機械学習向け)グラフィックが比較的強いJetsonは機械学習に特化したSBCです。GPU大手のNVIDIAが開発していて、他のボードに比べグラフィックが強いので、映像送出デバイスとして使えるでしょう。シングルボード4:BeagleBoneBlackポート数が抑えめな分コンパクト低レイテンシー拡張「BELA」が使えるテキサスインスツルメンツのBeagleBoneBlackは、ポートがUSBやイーサネットのみと必要最低限に抑えられている分、他のボードに比べ幾分かコンパクトになっています。BELAという超低レイテンシーのオーディオ拡張ボードを使えるので、電子楽器デバイスなどを作りたい時にとても向いています。ロータリーエンコーダとノイズ対策・割り込み電子工作創作表現(2019/12/04)スライドPDFロータリーエンコーダ無限回転できるツマミパラメータの選択などに使える今回ロータリーエンコーダを紹介します。パーツとしては地味でちゃんと使おうとすると意外と込み入っているのですが、使えるようになっておくと便利なのでやっておこうと思います。無限に回転させられるボリュームのようなアナログ値ではなく、デジタル信号パッと見ボリュームとほぼ同じ見た目ですが、ロータリーエンコーダは無限に回すことができるので、1回転以上する必要があるような場面で使われます。そのため、ボリュームのようなアナログの値ではなく一定の角度ごとにカウントされるデジタルの信号をやりとりすることになり、analogread()のように一行でサクサクとはいかず、ある程度プログラムを書いてあげる必要があります。選択肢が可変や大量にある時の選択ツールとして機械で動作する物の移動量を知る装置としてミキサーのボリュームのように、パラメータの最小最大レンジが決まっているような場合はボリュームが使えますが、何かたくさんある選択肢の中から選ぶ機能のように、何回転もさせたい場合に使われます。機械に取り付けて回転を計測し、モーターや人がどのくらい物を動かしたかという事を検知する時にも使えます。機械式と光学式インクリメンタルとアブソリュート主なメーカーはALPSとオムロンエンコーダの種類には、まず機械式と光学式というものがあります。スイッチが中に入っていて、回るとスイッチのON/OFFが切り替わる方式が機械式、光センサーが中に入っていて、円盤の動きを読み取って状態を知るのが光学式で、光学式の方が比較的大きく高価ですが、信号が安定していて摩耗などの劣化もしにくいというメリットがあります。回転の数え方にも種類があります。一定の角度動いたら1カウントするという相対的な数え方をするのがインクリメンタル、ボリュームに似ていますが今どの角度を向いているのかが分かるというのがアブソリュート方式です。今回は安価で手に入りやすい、ALPS電気の機械式インクリメンタルのエンコーダを実演します。秋月で手に入るもので、個人で入手でいるもので最もオーソドックスな部品です。シンプルに接続A相・B相から出力されるので、それぞれをプルアップで入力するおおまかな値は取れるが、「チャタリング」ノイズが問題になりやすいロータリーエンコーダで値を正確に取るには、少し回路が複雑なので、順を追って説明します。シンプルにArduinoと直結しようとすると、真ん中のピンがCOM=GNDピンになるので、こうなります。今回2番3番ピンにつないでいますが、UNOの場合2番3番が良いです。これで信号は取れるのですが、機械式は「チャタリング」と言われるノイズが発生してしまうため、正確な回転数が取れません。ロータリーエンコーダの信号エンコーダから来る信号をグラフ化したものです。赤と青の線がそれぞれA相とB相のHIGH-LOWを表しており、回転させたときにこのように交互に上下する状態が理想です。チャタリングノイズところが、機械式のエンコーダでは動いた時にHIGHとLOWの境目で、信号がパタパタと暴れることがあります。これが「チャタリングノイズ」と呼ばれるもので、プログラムで回転数をカウントしようとした時にこのノイズのせいで余計にカウントされてしまいます。参考:https://www.marutsu.co.jp/pc/static/large_order/1405_311_phノイズ対策1:コンデンサそれを回避するための方法として、まずひとつ目は信号線とGNDの間にコンデンサを入れてあげる方法です。コンデンサは電荷を貯めたり放出したりできる素子で、急峻なノイズをある程度吸収してくれるという性質があります。これを入れるだけでも大分信号が整ってきます。コンデンサにはどのくらい電気を貯められるかがF(ファラッド)という単位で示されていますが、このロータリーエンコーダの場合は0.01μF(マイクロファラッド)のコンデンサを入れるのがデータシートで推奨されています。ノイズ対策2:シュミットトリガ更に堅牢な作りにしたいという場合は、シュミットトリガを入れるとより信号が安定します。これはHIGH/LOWのしきい値にある程度バッファを持たせるためのもので、通常のデジタルピンは例えば5Vの半分である2.5V以上ならHIGH、それ以下ならLOWという判断をします。それだと、2.5V付近をちょっと行ったり来たりした場合またチャタリングのような信号のブレが出てしまうので、例えば4V以上ならHIGH、1V以下ならLOWに切り替わり、それ以外の時は以前の状態を維持するという振る舞いをさせることができるのがこのシュミットトリガで、そのような性質を「ヒステリシス」と呼んだりもします。カウント用プログラムプログラム内でカウントするloopの中でカウントできるが、取りこぼしが起こるこのようにして回路を接続したら、以下のようなコードを書いて数をカウントしていきます。ロータリーエンコーダの方で数字を出してくれるわけではないので、Arduino側で処理する必要があります。2つの状態は0~3まで4種類あり、時計回りは1->3->0->2...となり、反時計周りは2->0->3->1...と繰り返されていきますので、現在の状態とその一個前の状態を比較することで、counterの値が増減するようになっています。これでもある程度の速度はカウントできるのですが、実は取りこぼしが起きてしまいます。現在の状態を拾えているのはdigitalRead()を呼んでいる瞬間だけなので、素早く回したり、ロータリーエンコーダのカウント以外の処理が長くなったりすると、カウントを取りこぼすようになってしまいます。Serial.println(counter);}割り込みを入れるloop中にReadするのではなく、ピンの変化で関数を呼び出す重い処理をしていても、中断して実行されるそういった時のために、実はArduinoには「割り込み」という機能がついています。Leonardoの場合は0,1,2,3,7などのピンにその機能がついていて、そのピンのHIGH/LOWが変化した瞬間に用意されたプログラムを実行するというもので、取りこぼしたくない信号の変化を取る時にとても便利な機能です。割り込みを入れた場合のコードattachInterrupt()関数で宣言する割り込み内で使う変数にはvolatileをつける先程のコードのloopにあった部分を、割り込み用関数rotaryとして別に定義します。2番ピン、3番ピンに変化があった時にすぐこの関数を呼び出すようattachInteerruptという命令を呼び出して、ピンと関数を関連付けます。することで、loopの中でdelay関数のようにプログラムの流れを長時間専有する処理を加えたとしても、エンコーダが動くたびにカウント処理が挟まるので正確に動かした量を検知することができます。ArduinoとLAN・Wi-Fi電子工作創作表現(2019/11/29)スライドPDFArduino同士やPCとの通信Arduinoが基本的に扱えるのはシリアル通信のみインターネットやLANに接続する手段もあるArduino単体でPCと通信する方法としては、USBを介したシリアル通信があります。手軽に実行できますがソフトウェアでやらなければいけない要素が多く、かなり取っつきづらいです。一方で追加のパーツが必要になりますが、EthernetケーブルやWi-Fiを通してLANを使って通信する方法というのも実はあって、今回はそれらを紹介していきます。距離の制約にも強いプロトコルもOSCなどが使用可能LANを使って接続をすれば、LANハブを使い複数のArduinoを制御したり、かなり離れた距離のデバイスを制御したりといったことが可能になります。ソフトウェア側もOSCなどを使えるので、MAX/MSPやTouchdesignerで定番の機能をそのまま使うことができます。Ethernetモジュールを付ける(有線)ESP-WROOMシリーズを使う(無線)LANに接続する代表的な方法にこの3つがあります。一つずつ解説していきます。Ethernetという特殊なArduinoを使う方法です。USBの他にEthernetポートが付いているので、有線LANに差してすぐ使うことができます。他にArduinoEthernetシールドという、従来のArduinoにシールドを差して使うモデルも過去あったのですが、現在純正品は販売されていません。その代わりKEYSTUDIOなど他で作られたクローン版があるので、そちらを使うことができます。ArduinoにW5500モジュールを付けるひと手間増えるが、外せば普通のArduinoとしても使えるSPI通信で接続。Ethernetはこれが既に載っているモデルもう一つは、Ethernet用のチップが別になっているW5500というモジュールをArduinoに付ける方法です。Arduinoを持っている人は、こういったモジュールを接続することでも実現できます。Ethernet2というライブラリを使って、SPI通信でArduinoと接続することでLAN用のパケットをやり取りできるようになります。ちなみに、Arduinoでよく使われるLAN用のチップにW5100とW5500があり、5100はEthernet.h、5500の方はEthernet2.hを使う必要があるので注意が必要です。ESP-WROOMシリーズを使うArduino互換で動作するマイコン安くて小さい。IOポートは少ないが、これ一個でWi-Fi接続が可能そして最後が今日紹介するESP-WROOMシリーズで、有線ではなくWi-Fiを使って接続する方式です。Arduinoとは別の製品ですが、ArduinoIDEでプログラムを開発できるように設計されているので、ほぼArduinoと同じように扱うことができます。IOポートはやや少なめですが、単独でWi-Fiが扱えて値段も安いです。ESP-WROOM-02スタンダード品。今回持ってきたのはESP-WROOM-02というスタンダードなモデルです。機能が多く、Bluetooth機能もついた32というモデルもあります。02は秋月で単品だと400円という値段で売っていて、これはマイコン+Wi-Fi機能付きでかなり破格といえます。単品のピンが2mmピッチと小さめで、ブレッドボードやユニバーサル基板に載せづらいです。USBピンもついてないので、最初は秋月やスイッチサイエンスのモジュール化されたモデルを購入するのがおススメです。ESP-WROOM-3202はArduinoと比べるとピン数がかなり少なめBluetoothやSDカード読み取り機能など高機能ちなみに、この02を高機能にしたESP32というチップもあり、そちらは少し高くてサイズが大きいけど高機能なモデルになっています。Arduinoと比較すると02の方は少しピンが少ない印象がありますが、32の方は20以上のIOピンが備わっているので、Arduinoの感覚で行っても全然足りなくなるということは無さそうです。IDEにESPボードの情報を追加するhttp://trac.switch-science.com/wiki/esp_dev_arduino_ideArduino公式のマイコンではないので、ArduinoIDEに追加でICの情報を追加する必要があります。詳しくはスイッチサイエンス等のWebページに書いてあるので、ここを参照しながら追加するのが良いでしょう。書き込んでみるArduinoと比べ少し時間がかかる書き込み方式はckではなくnodemcuがおススメボード情報を書き込んだら、Uploadボタンを押せば通常のArduinoと同じように書き込むことができます。ESPは書き込みモードで立ち上げなくてはいけないckモードと、通常のArduinoと同じPCからリセットをかけるnodemcuモードがあって、ckはUploadを押した後手動でリセットボタンを押す必要があるので、ここの設定はnodemcuモードがおススメです。一つのアドレスに対して実行する内容をラムダ式で記述ESPシリーズは、ボード設定を入れた段階で基本的なArduino用のライブラリも一通り入っています。TCPやUDPなどの通信方式のサンプルは入ってますが、OSCの送受信をしようとするとまた別でライブラリが必要になります。今回は「ArduinoOSC」というライブラリを使ってOSCの受信を試してみます。Format"をSampleに指定touchdesignerからOSCを送信してみます。outCHOPに入れて送信します。頭のスラッシュ記号は自動的に入れられるので、チャンネル名には含めません。Format”という項目があり、そこをSampleにする必要があります。ESPからOSCを送信するosc.sendで1行で送ることができる複数の違うタイプの値も連続して入れられるマイコン側から、OSCを送信することもできます。ArduinoOSCではosc.sendにアドレスとポート、値を入れれば送信が可能です。String等が使えます。loopを以下のように記述して、マイフレーム起動時間とランダムな数値を送ってみます。今度はTDで受信をしてみます。inCHOPでは、ポート番号だけを指示すれば受信できるようになっています。array2...という風にインデックスを付けた状態で受け取ることができます。DATを使う必要があります。array1にはmillisで取得したArduino起動からの時間、array2ではrandomで生成した0~100のランダムな数値が入ってきています。前回はステッピングモーターとは何かという所まで話しましたが、今日は実際に動かすために必要な情報を説明していきます。ステッピングモーターは単体でArduinoと接続しただけでは制御できません。DCモーターと同様に大きな電流を必要としますので、モータードライバを使います。ステッピングモーターの動作原理A相とB相それぞれ2方向、4種類の信号パターン信号の切り替えが「1ステップ」となるバイポーラステッピングモーターの場合、A相とB相の電流方向を交互に切り替えていって回転させます。電流方向が切り替えられれば良いので、DCモーターの時紹介したブリッジ回路が2ユニットあれば、原理的にはそれでステッピングモーターを動かす事が可能です。表現用途に適したモータードライバ加減速やマイクロステップ機能があるステッピングモータードライバもやはり色々あるのですが、今回は作品用途に向いているであろう「L6470」モータードライバを紹介します。安くてシンプルなモータードライバの場合ArduinoのStepperというライブラリを使っても動かす事ができますが、単純な動作しかできないので自分は普段こちらのドライバを使っていますし、おススメです。役に立つ大きな機能として「マイクロステップ」と「加減速」というものがあります。マイクロステップのメリットフルステップの1.8度は意外と大きいステップ信号を連続的に変化させて、より細かな動作ができる静音性にもつながるマイクロステップは、従来デジタル(HIGHかLOW)のステップ信号を連続的に変化させて、ステッピングモーター本来のステップ角(1.8度が一般的)よりも細かな制御をするというものです。フルステップで動作する1.8度という角度は意外と大きくて、動かすものが大きくなるほど目立ってきます。加えて音も激しくなるので、静かな環境を必要とするシーンではかなり気になってきます。マイクロステップはそういった懸念をクリアにしてくれるメリットがあります。加減速のメリット自然な動きを作ることができる急発進では動かせないような物も動かせるもう一つの加減速は、動き始めと動き終わりの速度にカーブを付ける機能です。アニメーションなどでも加減速は重要な要素で、加減速抜きで急加速・急減速をすると動かす対象に無理な力がかかりますし、ステッピングモーターの場合は脱調の要因となります。driver」L6470というとIC単体の事を指しますが、これを使うためにはいくつか周辺部品が必要となり、それらをモジュール化された基板が販売されています。確認できているところだと秋月電子・ストロベリーリナックス・Sparkfunを扱っているスイッチサイエンスなどです。秋月が最も安く、ストロベリーリナックスはそれより少し高いですがとても小さく、42ミリ角のステッピングモーターの後ろに取り付けられるような仕様になっています。今回はストロベリーリナックス製のモジュールをサンプル基板として用意しました。良く使われるステッピングモーターの電圧として9~24Vが多いので、これ一個あれば大概のステッピングモーターは動かすことができます。「SPI通信」という方式でArduinoから制御コマンド情報を送信する制御方法ですが、SPI通信という通信方式を使います。これもArduinoやラズパイのようなマイコンの多くが搭載している通信方式で、決められたコマンドを送信してデバイスを操作するためのものです。UARTなど以前6軸センサーを扱った時に説明したのがI2Cという通信方式ですが、SPI通信もそれに近い方式で、基板やIC間での通信によく用いられます。構造がシンプルゆえに、あまり長距離や大容量のデータ伝送には向いていません。SPIとI2Cが使えれば、大抵のモジュール基板は扱えるようになります。一般的なSPIの結線SPI通信はマスターとスレーブという主従関係に基づいて通信が行われます。プログラムを書くArduinoがマスターとなることが殆どですが、Arduinoがスレーブになって受信することも可能です。結線には電源ラインのVCC・GNDの他に3本または4本の線が必要になります。送信・受信とも同じ名前なのが送信の合図を出すSS/CSピン・信号のタイミングを知らせるSCKピンです。2本、データを送信するSDOとデータを受信するSDIというピンがありますが、これは自分(Arduino)の送信は相手の受信につながなくてはいけないので、SDIとSDO・またSDOとSDI同士をつなげる必要があります。Out)やその逆MOSIと言う表記がされている場合もあります。指示を送るなどMasterからの送信のみできれば良い場合は、MISOを繋ぐ必要はないので3本線になります。ボード上の結線L6470モジュールにもこのSPI端子が出ているので、説明書の掲載部分(https://strawberry-linux.com/pub/l6470-manual.pdf)に従って接続します。SPI通信に必要なものはここの3番~8番までの6本で通信できるようになっています。電圧選択の注意ちなみに、秋月とストロベリーリナックスのモジュールはジャンパーピンというピンでICを動作させる電圧を選択します。(モーターを動かす電圧ではなく、L6470本体を動作させる電圧。ロジック電圧とも)Arduinoから供給する5Vを使うので5Vを今回選択していますが、例えばラズパイのロジック電圧は3.3vになっているので、3.3Vを選ぶ必要があります。ここを間違えて3.3Vモードの時にうっかり5Vを流したりすると結構簡単に死んでしまうので注意してください。結線をして、モーター用の電源を供給すれば、これでArduinoから必要なコマンドを送れば制御できます。どんな信号を送るかというのはデータシートに記載されていますが、便利な分かなり色々なパラメータがあり実装は大変ですL6470用のライブラリhttps://github.com/loveandsheep/l6470duino他にも自分用のライブラリを作っている人が多数なので今回は、簡単に制御できるよう情報をまとめて実装しておいたライブラリを使用します。こちらもArduinoのメニューからインストールできるようになっているので、インストールしてみてください。日本だと「北の国から電子工作」(http://spinelify.blog.fc2.com/blog-entry-41.html)というWebサイトでサンプルを配布されていたりもします。自分が使いやすいと思ったライブラリを見つけて使うというのもテクニックの一つです。以下、動かすためのサンプルです。driverクラスを作り、initで初期化します。初期化した後に、駆動時に使う電圧の設定などを行い、最後にRunというコマンドで回転を指示しています。デフォルトでマイクロステップと加減速が働いているので、とてもスムーズに動作します。加減速を高めに設定するマイクロステップを切るマイクロステップと加減速がこのドライバの売りと言いましたが、ここであえてその機能をオフにしてみます。stepmodeは2のn乗で指定するようになっているので、最大が2の7乗、128分の1ステップになっています。机に置いて動作させると、その違いがかなり顕著です。機械にとって振動というのは、はんだのクラックやネジのゆるみなど、ただうるさいだけでない色々なトラブルの元にもなります。delay(2000);}指定の位置に送る指定の位置へ送るのはGotoマイクロステップ分を加味するRunは指定の速度でずっと動き続けるコマンドですが、Gotoコマンドを使うとPWMサーボのように特定の座標まで移動させることができます。角度ではなくステップ数で指示する必要があり、マイクロステップが有効な場合はその分倍にしてあげる必要があります。1/128マイクロステップの時に1週=200ステップ進みたい場合は、200*128=25600ステップ進める必要があります。前回はモーターの基本原理と、最もベーシックな部品であるDCモーターを紹介しました。今回はもう少し複雑な動きをできるようなモーターを紹介していきます。千石電商ちなみに、作品やパフォーマンスで動きものを作ろうとすると色々と作り物が必要になってきますが、こういったメカ物を取り扱っているのはかなり限られています。秋葉原ではツクモロボット王国辺りに行くと、初心者向けのキットからギヤやシャフトのようなパーツまで揃っているので、まずはキットを改造するというところから初めて見るのも良いかもしれません。そばの千石電商本店にもメカパーツがいくらか揃っている印象でした。厳密には違うが、単純に「サーボモーター」と言うとこのPWMサーボを指すロボット等に使用されることが多い今日まず紹介するのがPWMサーボモーターです。サーボモーターとかサーボと言う事もありますが、ACサーボなどもう少し大きいサーボモーターもあるので、ここではPWMサーボと呼びます。ラジコンに使われる事も多いので、RCサーボと呼んだりもします。DCモーターは正転・逆転の方向と速度を制御できますが「ここまで進んだら止める」とか「ここに戻る」のような処理をしようとするとセンサーなどで位置を取らなくてはいけません。このPWMサーボはセンサーを内蔵しているので、PWMで指示を送ると指定の角度まで進んだ後そこで自動的に停止してくれます。駆動範囲は270度~多くても2回転3本線で、PWMを送って角度を指示するロボットに使われたりスイッチを押す、蓋を開け閉めするなど指や関節に近い動作を得意とします。そのかわりDCモーターのように無限回転はできず、大体270度~多くて2回転くらいのところを往復するような構造になっています。ドライバは不要、というよりは内蔵されていると言った方が正確で、電源とPWM信号を送れば制御することができます。Arduinoから制御するArduinoのサーボ制御ライブラリServo.hArduinoではPWMサーボをコントロールするためのライブラリがあらかじめ用意されているので、それを使えば簡単に制御することができます。回路としてはVCCをVinまたは5V、GNDをGND、コントロール用のピンをArduinoの出力ピンに接続します。最大12個までつなげられ、0~13番・アナログの0~5番ピンでも使うことができます。//0~180度の間でランダムに角度を指定する}パルス幅と角度の指定パルス幅と角度の関係は、メーカーによって異なることがあるattachで有効な角度の範囲をパルス幅に指定することができるデフォルトは544~2400マイクロ秒write関数では角度を指定できると書きましたが、これはメーカーの仕様によって異なる場合があります。PWMサーボは「パルス幅」の時間が角度に対応するようになっており、Servoライブラリのデフォルトである544~2400マイクロ秒と違う場合は指示した角度と実際の角度が違って来ることになります。これはattach関数に追加で指示することができるので、データシートと照らし合わせながら設定すると良いでしょう。//メーカーの仕様に合わせてパルス幅を調整するパルス幅を直接指定writeMicroseconds()で直接指定することも可能writeよりも細かく指示できるまた、attachで指示せず直接パルス幅を記述することもできます。その場合はwriteMicrosecondsという関数を使います。GWSのサーボ角度範囲は0~180度で800~2300usとなっています。この場合write関数で指示できるのは180段階ですが、writeMicroseconds関数を使えば1500段階になります。サーボの性能にも依存しますがソフトウェア上はより高い解像度で角度を指示することが可能になります。//0~180度の間でランダムに角度を指定する}attachとdetachattachを呼んだ瞬間モーターにトルクが発生するdettachを呼ぶと脱力する(静音&省電力)PWMサーボはattachを呼んだ瞬間から動作をはじめます。動く時にはギヤの音が鳴り、目的の位置に着いてからも「ジジジ...」と調整する音がなり続けます。これはトルクが常にかかり続けているためで、手で回そうとしても回らないか、すぐ戻ろうとします。物を持ち上げ続けるなど力が必要な場合はこのままで問題ありませんが、バッテリー駆動で電気を節約したい、止まっている間は音が鳴らないようにしたいなどの場合はdettachを呼ぶことで脱力させることができます。動きも制御もより複雑になる最後により高性能なモーターであるステッピングモーターを紹介します。コントロール方法が複雑になりますが、その分できることも各段に多くなります。PWMと同じように任意の角度で止める事ができる一方で駆動範囲に制限はなく、DCモーターのようにどこまでも回し続けることができます。適切に制御してあげることでとても静かに駆動させることもできます。ステップを送るDC/PWMモーターでは「速度」を指示していたステッピングモーターは1ステップごとにコイルの方向を制御する従来のモーターとは制御構造が根本的に異なるため、このような動作ができるようになっています。DCモーターやPWMサーボは、指示した方向に基本的に動き続けるという動作をしますが、ステッピングモーターはマイコンArduinoから「1ステップ先に」動くという動作を指示します。時計の秒針をイメージすると分かりやすいと思います。そのため基本的には1ステップずつカクカクした動きで進んでいくのですが、この送り動作を高速に繰り返すことで滑らかな動きを実現することができます。主な小型のステッピングモーターは200ステップで1週(1ステップ辺り1.8度)より細かい動作はギヤで減速したり「マイクロステップ(後述)」という制御方法を使うこのステップという単位は、よく手に入る物だと1週200ステップ、1ステップ辺り1.8度の物が多いです。速度やトルクが上がってくると「脱調」が起きる電源リセットや「脱調」で現在位置が分からなくなる一見万能に思えるステッピングモーターですが、欠点もあります。大きな弱点が「脱調」という現象で、トルクが足りなかったりステップ速度が早すぎたりした時、軸が周り切らずステップを指示した数と実際の角度がズレてくる現象の事を言います。プログラムから指示したステップ数を数えておけば現在の角度は分かりますが、脱調が一度起きるとモーターが今どの位置を向いているのか分からなくなってしまいます。電源を入れた時の位置が原点になるので、装置によっては初期位置を割り出すような仕組みを作ってあげる必要があります。有名&高品質な「オリエンタルモーター」ステッピングモーターはDCモーターやPWMサーボがホビー~家庭用電子機器向けなのに比べて、どちらかというと産業機器に使われる事が多いです。通常用途なら秋月やストロベリーリナックスのような電子部品屋でも購入することができますが、更に大型の物はシナノケンシやオリエンタルモーターのようなメーカーから購入することも可能です。「バイポーラ」がおススメ。紹介するドライバもバイポーラ角タイプの方が取り付けやすい。NEMAという規格で定義されているそしてステッピングモーターと一口に言っても色々な種類があります。購入を検討しているのであれば、6本線のユニポーラでは無く4本線のバイポーラをおススメします。ユニポーラは駆動回路が簡単の変わりにトルクが少ないというタイプなので、ドライバを買って使う分にはバイポーラタイプの物を使うのが配線も少なく、トルクも比較的強いので良いでしょう。円筒形のタイプが安いのでついそっちを買ってしまいがちですが、個人的には取付しやすい直方体タイプのものをおススメします。NEMAという規格に準拠したものが多いので、頻繁に使うようになった時には選択肢の幅が広がって便利です。ステッピングモータードライバドライバが多い!(1000円~10万円台まで)おススメは「L6470」モータードライバステッピングモータードライバもいくつかあるので紹介します。ステッピングモーターについては、その制御の複雑さから、よりたくさんの種類のドライバが流通しています。先述のオリエンタルモーターでは自社のモーター用ドライバも生産しており、こちらはPCから直接制御もできて非常に高機能ですが2万~10万台までとかなり値が張ります。Arduino用のシールドとライブラリ(Stepper.h)などもありますが、作品制作に用いるのであれば「L6470」を載せたドライバモジュールを強くお勧めします。L6470ドライバモジュールL6470というICを載せたモジュール(秋月やストロベリーリナックスなど)価格のわりに繊細なコントロールができるL6470はSPI通信という通信方式で制御できるタイプのモータードライバなので、Arduinoから指示を送って動かす事ができます。1ステップ分のパルスを送ればその通りにステップ駆動をしてくれますし、「xxステップ動かして」という指示の仕方もできます。作品やパフォーマンスに向いている機能として、加減速を指示した滑らかな動作や、アナログ出力を使って1ステップより細かく滑らかに動かす「マイクロステップ」の機能もついているため、繊細なコントロールが可能となります。これはArduinoのStepperライブラリなどでは難しい機能です。次週では、このステッピングモータードライバの使い方について実物を交えて解説していきます。電気エネルギーを何かに変換して物を動かそうとするとき、一般的に普及しているものは基本的に磁力を使って動かします。コイル状の電線に電気を流すと磁界が生まれるので、その力を動力として応用しているのがモーターです。モーターとドライバモーターは、得意な事に応じて制御方法が異なる使いたいモーターに応じてドライバを選定するコイルに電気を流して回転動力を得る、というのがモーターの基本原理ですが、細かな構造は種類によっても異なります。構造の違いによって得意な事が変わってくるので、用途別に様々なモーターが開発されており、私達は使いたい要件に応じてそれらを適切に選ぶ必要があります。同時に、モーターを動かすためのドライバにも種類があるので、モーターに合ったドライバも選ぶ必要があります。今回はいくつかのモーターとそのドライバの特性、使い方を解説していきます。大きく分けて3つの種類を紹介します。流す方向で正転・逆転が変わる「ブラシ付きモーター」ともまず最も構造がシンプルで制御も簡単なのがDCモーター。これは電気を流せば回るというものでブラシ(整流子)によって磁性が切り替わり回転動力を生み出します。電流を流す方向で正逆の向きを変えられるようになっています。円筒型が基本形ピンにギヤが付いて減速されるが力が強い「ギヤードモーター」も同じDCモーターは円筒型が多く、上面にネジ穴が付いているのでこれでパネルに取り付けることが多いです。ブラシの付いた軸がそのまま露出しているものに加えて、あらかじめギヤが取り付けられている「ギヤードモーター」というものがあるのですが、それらは回転速度が遅い分強い力でものを動かすことができます。回転数トルクどんなモーターを選ぶかですが、主に上記4つのような要素があります。駆動電圧は6,9,12,24Vなどがあって、同じスペックで電圧の違う物などがありますので同時に使う他の機器と電源を共有できるように選定することができます。回転数は駆動電圧をかけた時の回転する速さを表していて、rpmという単位が使われるのが一般的です。ある程度重い物を動かしたい時にはトルクも見る必要があります。単位はN・mやkgf・mがよく使われます。動作を切り替えるための「Hブリッジ」プラスマイナスを繋ぎ変えれば回転方向を簡単に切り替えられますが、自動的に回路を繋ぎ変えるのは難しいです。そこで「Hブリッジ」と呼ばれる回路を使うと、スイッチをON/OFFすることでモーターに流れる電気の方向を切り替えることができるようになります。図ではスイッチを切り替えていますが、実際の駆動ではここにトランジスタやMOSFETが入ることで、マイコンから切り替えができるようになります。画像:https://micro.rohm.com/jp/techweb_motor/knowledge/basics/basics-03/260モータードライバ2つのINで正逆をコントロールする物によってはPWMによる速度コントロールも使えるデジタルで制御するとなると回路が複雑になりますが、それを簡単にできるようにしてくれているのがモータードライバです。DCモーター用のドライバは、一般的に2つのインプットが付いており、片方をHIGH、片方をLOWにしてドライブし、逆転させたい時はHIGH・LOWの関係を逆にします。ドライバによっては、HIGH側のピンにPWMを載せることで速度コントロールのようなこともできます。有無DCモーターだけでもたくさんのドライバがあって、値段もまちまちです。見ておくべきものとしては上記の要素があります。モーターや用途によって適切なものを選ぶ必要があります。ドライバの例1TB6643:比較的安く、制御もシンプル。1個だけ簡単に動かしたい時にはこれで十分http://akizukidenshi.com/catalog/g/gI-07688/代表的なものをいくつか紹介します。1個目はTB6643という東芝のモータードライバICです。DCモーター1個を動かすことができ、保護回路もいくつかついています。値段も比較的安いので、とりあえず動かしたいというような時に便利なドライバです。ドライバの例2MC33926:Pololuなどが1個用、2個用のモジュール基板を出している。IC自体が小さいので小型化しやすい(発熱に注意)電流センサや逆起電力保護などが付いて高機能だが、やや高い(写真の物は4000円程)https://www.switch-science.com/catalog/581/続いてもう一つが、freescale社のモータードライバMC33926です。これは単品では面実装ICなのですが、pololuなどがモジュール基板を作っています。薄いので小型化しやすく、電流センサが内蔵されていたり基板上に逆起電力保護機能などが付いているのでIC単体よりも高機能ですが、その分やや値段が高くなります。駆動電源はVINに繋いで、必要な電圧をDCジャックに入れるDCモーターを動かすためのサンプル基板&コードです。Arduinoの出力にモーター入力を入れて、電源ラインはArduinoのVINとつなぎます。ArduinoはDCジャックに18Vまで入れることで、VINを経由して5Vを超える電源を共有することができるようになっています。エンベロープ電子工作創作表現(2019/10/24)スライドPDFエンベロープを扱う前回はオシレータと、簡単な波形の合成エンベロープを使ってもう少し楽器に近づける先週に引きつづき、Mozziの解説をやっていきます。今回もう少し楽器として実用可能な落とし込みを見せたいので、エンベロープについてやっていきます。エンベロープの基本形・ADSR音の始まり方と終わり方を定義する音量のコントロールでニュアンスを変化させるシンセサイザーを使っている人は良くご存じとは思いますが、エンベロープとは音が鳴り始めてからの音量の推移のことを表します。ピアノは音が鳴ってから鍵盤を離すとすぐ音が途切れますが、ペダルを踏むと鍵盤を話しても音が持続したままになります。このような時間による音の変化を定量的に表すための「ADSR」というモデルがあります。ADSRは何の略?アタック(Attack)ディケイ(Decay)サステイン(Sustain)リリース(Release)ADSRはそれぞれの略で、上のような意味があります。変化のグラフグラフに表すとこのようになります。(出展:https://www.perfectcircuit.com/signal/learning-synthesis-envelopes-1)アタックで最初に勢いよく音量が上がった後にディケイで少し音量が下がります。その後Sustainで延ばせる時間まで伸びた後リリースの時間かけて徐々に音が小さくなります。情報としては、ADSR四項目それぞれの最大の長さと、Attack後、Decay後のボリュームが定義されています。ADSRクラスオシレータにボリュームの変化を与えるnoteOnを呼べばその通りに鳴らしてくれる概念としてはそんなに難しくないですが、これをプログラムで実装しようとするとやや煩雑です。MozziではADSRクラスが用意されているので、それを使うことで前回やったオシレーターに対して簡単にエンベロープをかけることができるようになっています。こちらのスケッチを参考にしてみましょう。オシレーターを用意するところまでは前回同様です。setup内のsetADLevelsでアタックとディケイの音量を定義して、setTimesでADSRそれぞれの時間を入れます。スイッチを11ピン~13ピンに繋ぎ、押された時にnoteOnを呼び出すことで簡単な鍵盤を実現することができます。Freqの略)64が国際式表記のA4で440Hz88鍵の音域は21~108だが、レンジ自体は0~127まで存在する押されるボタンでオシレータの周波数を変えていますが、ここではmtofというmozziの関数を使っています。MIDIのノート番号を周波数に変換する関数なので、音階を使いたい時にはこの関数を使うのが便利です。mtofで音階を制御ノートで指定できるので、スケールなども作りやすいランダムにペンタトニックを鳴らすスケッチ配列変数としてノート番号を書いておけば、メロディやスケールを自由に定義して鳴らすことも可能です。以下のコードは、あらかじめ変数pentaにペンタトニックのスケールを保存しておき、間を開けてランダムにnoteOnを呼び出すスケッチです。audioHook();}EventDelayMozziのために用意されたディレイ関数delay関数を使うと音が停まってしまうここで新しくEventDelayというクラスが出てきました。これもMozziを使う上でかなり便利なクラスです。ArduinoデフォルトのDelay関数では全ての処理が停まるため、オーディオの出力もストップします。それを回避しながら一定時間経過後に処理を走らせることができます。(timer.ready())で経過したかどうか判定setTimeで時間を設定し、startを呼び出すとタイマーが動き始めます。経過したかどうかはreadyメソッドで確認できるので、readyをif文に入れて、時間経過で呼び出したい処理を書くようにします。readyになったらまたstartを呼び出すようにすれば繰り返し処理が行われますし、都度setTimeを呼ぶことでタイミングを変化させることもできます。Phase」を再現してみるこれによってアルゴリズミックなメロディをArduino内にプログラムすることができるようになります。複数のEventDelayを平行して走らせることもできるので、独立した演奏プログラムを走らせたりすることもできます。Phase」の序盤を再現してみました。譜面のパターンを配列変数に格納して、EventDelayが発火したタイミングで順番に鳴らしていっています。1ミリ秒ごとにずれていく様子を聞くことができます。本家では途中から違う譜面になり終わり15分ほどで終了しますが、プログラムなので電源を供給する限り永遠に演奏が続きます。