Eagleで部品を作るメモ

Eagleにおけるパーツの概念

ひとつの部品は、いくつかの要素で構成されている。

  • Device...部品型番にあたる部分。
  • Footprint...Board側で参照するパターンの図
  • 3D Package...3Dモデル。Fusionとかでプレビューできるやつ?
  • symbol...回路エディタ上で表示されるシンボル。

続きを読む Eagleで部品を作るメモ

Arduinoでシリアル通信の送受信

Arduinoでシリアル通信

設定

設定はsetupでbeginを呼ぶだけ。最低限必要なパラメータは通信速度。

void setup()
{
    Serial.begin(9600);
}

9600bspはちょっと遅いけど定番。
マイコンが16MHzなら38400くらいが早くて安定しています。

送信

Serial.println(内容)が基本形。print/writeなどもある。以下が詳細

int value = analogRead(0);
Serial.println("message") //「message」+改行コードが付く。最もベーシックな形
Serial.print("message") // 改行したくない場合はこう

Serial.println(value); //intのような数値も変換して送ってくれる
Serial.write(value); //バイナリで1バイトとして送る時はこれ

受信

1文字ずつ読んで何かを実行するのなら、以下の通りで簡単に処理が可能。これでも一応、アルファベットの大文字小文字で50通り以上のパターンが作れる。

void loop()
{
    while (Serial.available())
    {
        byte data = Serial.read();
        if (data == 'H') digitalWrite(13, HIGH);
        if (data == 'L') digitalWrite(13, LOW);
    }
}

もう少しパラメータを与えたいなどの場合は、文字をある程度スタックして処理する必要がある。

String recv;
void loop()
{
    while (Serial.available())
    {
        char data = Serial.read();
        if (data == '\n')//改行コード
        {
            if (recv.substring(0, 1) == "A")
            {
                analogWrite(9, recv.substring(1).toInt());
            }
            if (recv.substring(0, 1) == "B")
            {
                analogWrite(10, recv.substring(1).toInt());
            }
        }
        else
        {
            recv += data;
        }
    }
}

こうすると”A128”や"A0"で9番ピンを、”B50"や"B256"と送る事で9番ピンと10番ピンから好きな値でPWM出力を指示することができ、デバッグや微調整がやりやすくなる。(改行コードを最後に入れるべし)

第十二回 回路・デバイスの仕上げ方

第十二回 回路・デバイスの仕上げ方

電子工作創作表現(2019/7/12)

スライドPDF

外装を作る

  • 基板やモーター等の機械を固定する
     
  • 綺麗に仕上げるのは安定性・安全性の上でも重要
電子部品を作品に組み込むフェーズでは、基板などがすぐ壊れたりしないようにケースにまとめたり、モーターやセンサー等位置決めが重要な部品を固定しておく必要が出てきます。
軽い物は両面テープ等で止めたりもできますが、美観的にもよくないですしすぐ剥がれてしまったりします。綺麗に仕上げるのは作品の安定性に加えて、怪我や事故を防ぐ安全性という意味でも重要なので、覚えておいて損はないでしょう。
綺麗に仕上げる方法の中でも、比較的電子工作と相性の良いデジタルによる造形について、どんな選択肢があるか紹介していきます。

デジタルで部品を作る

  • レーザー加工と板金加工
     
  • 3Dプリンタと切削加工
デジタルで1点物の造作物を作る手段のメインストリームとしてあるのが、レーザー加工と3Dプリントです。これらは個人で扱えるものでは基本的に木材や樹脂素材を扱うことになりますが、設計を意識すれば近いノウハウで板金加工や切削加工などの金属も扱える(発注できる)ようになります。

レーザー加工

  • MDFやアクリル板をレーザーで加工。積み重ねれば立体も
     
  • 平面加工なので、環境によってはIllustratorでも使える

レーザー加工は、強いレーザーを照射して板材を焼いたり溶かして切断する方法です。Illustratorなどでパスデータを作って自由な形にカットすることができます。写真は機械装置の試作で、レーザー加工したアクリル板を両サイドに配置して、スペーサーというネジのついた棒状の部品を使って固定しています。

レーザーの特徴

  • メリット:比較的一般的な材料で、加工も速い
     
  • デメリット:都内で個人導入するのは難しいので、使う度コストがかかる
メリットはホームセンターでも買えるような一般的な材料が使えて、加工も速い点でしょう。MDFという木材やアクリルを使うのが一般的です。塩化ビニル板というアクリルによく似た素材がありますが、これは有毒ガスが発生するので使えません。細かくは装置によっても変わってくるので、加工機を持っている施設の人等に聞いてみることをおススメします。

煙や匂いがすごいので基本的に換気をする必要があり、家同士が近い東京で自宅などに設置するのは難しいでしょう。そのため都内では都立大学駅のメイカーズベースやFabCafeのような時間貸しをしている場所を借りるのが一般的です。使う度に料金が発生するのでやや割高なのがデメリットでしょうか。

使うには?

  • AMCや企業の運営するシェア工房を使うか、外部発注する
     
  • 丸に穴開けのような簡単な加工なら「はざい屋」
芸大ではAMCにレーザー加工機があるそうです。UniversalとTrotecは代表的な加工機なので、レーザーで加工する基本的な素材は大体切れると思います。遊舎工房(https://yushakobo.jp/)のようにオンラインで加工サービスを行っているところもありますが、自分で加工するよりはどうしても割高になってしまいます。

アクリル素材で、丸に穴開け程度の簡単な形の加工であればはざいや(https://www.hazaiya.co.jp/category/process.html)のような場所に注文した方が安くて楽な場合もあります。時間がある時にどんなお店でどんな加工ができるのか、眺めてみるのもおススメです。
(2019/07/11現在)

レーザー→板金

  • レーザー部品は板金に置き換えやすい
     
  • 丈夫で、表面処理をすれば美観も優れる
     
  • 最近はウェブで発注できる業者もある

デジタルファブリケーション系のレーザー加工機は木材やアクリルを切るものですが、工場で使うようなレーザー加工機ではアルミやステンレスなども切断することができます。金属のレーザー加工だと「板金加工」という名前が比較的メジャーで、レーザーで切った板を曲げて箱を作ったりするためによく使われています。

加工法としては殆ど同じなので、厚み等をそろえればMDFで試作した物をそのまま金属に置き換えることが可能です。金属加工は値段が高いので、MDFで試して問題無さそうなら外側を綺麗なステンレス仕上げで発注する、という使い方がおススメです。

ネットに載っている工場でも企業相手でしかやってくれない場合が多いですが、曲げ加工ドットコム(https://www.magekako.com/)のようなところであれば個人でも対応してくれます。ただしこういったサイトではイラレのパスではなく図面を用意する必要があるのでご注意を。ちなみに写真のステンレス天板は好きな位置に穴加工ができて2000円しなかったです。安い

きりいた.com(https://www.kiriita.com/)はIllustratorやPDFでも見積もりを出してくれましたが、その分ちょっと割高な印象…?金属加工のネットサービス化は最近どんどん増えていて状況も絶えず変化しているので、都度色々調べてみるようにしてみてください。

3Dプリント

  • 個人でやれるオーソドックスな物はFDM(Fused Deposition Modeling)
     
  • PLAかABSなどの樹脂を溶かして重ねていく

続いて3Dプリントです。モデリングした3Dモデルと同じ形を造作してくれる装置で、色々な方式がありますが、オーソドックスなものはFDMと言われる、樹脂を溶かして重ねていく仕組みです。もう少し細かく出せますが取り扱いが少々煩雑な紫外線硬化樹脂を使った光造形方式、粉末を固めて作る粉末造形などがあります。

3Dプリントの特徴

  • メリット:やろうと思えば家にも設置可能
     
  • デメリット:時間がかかり、コンディションで失敗しやすい
最近は落ち着きましたが一時かなりブームのような感じになって色々な機種が出ています。サイズ・精度・値段に色々と選択肢があり、電気があれば動くのでやろうと思えば自宅にも設置可能です。少々樹脂が溶ける匂いがして、こもってると身体に良くないんじゃないかという研究が最近出ていますが、レーザーほど激しい匂いはしないので住宅地でも換気できる程度です。

デメリットとしては1つ出すのに結構時間がかかるのと、温度管理が甘かったり樹脂が引っかかったりして失敗することがあるので、あまり安物に手を出すとかえって手間がかかる可能性もあります。

平べったい形状を出力する時には「反り」と呼ばれる現象が発生するなど、形状によっても失敗しやすさが変わってきます。この辺りはまだ3Dプリント自体歴史が浅いので、経験者等を見つけて作りたい形状を見てもらう等すると良いでしょう。板状のものは時間もかかるので、基本的に3Dプリンタは量感のあるもの、平面的なものはレーザー加工などうまく使い分けをするようにしましょう。

使うには?

  • AMCにあるのはDavinci 2.0 Duo
     
  • DMM.makeやInter-cultureなどサービス系もたくさんある
これもAMCに設置されているそうなので、活用してみるのが良いでしょう。ただいかんせん一つ出すのに時間がかかるので、誰かが使い始めるとほぼ丸一日使えなかったりするので、共同で使う難しさのようなものもあります…こちらもやや高めでプリントサービスのようなものがたくさんあるのですが、設定する時間や失敗する手間を考えると、その辺のコストやリスクをお金で解決できるので案外妥当な値段かもしれません。

自分も含めて周りが皆使っているのがZortrax(https://www.zortrax.sin.jp/)という機種で、頻繁に使いたいなら思い切って買ってしまうのも手です。フィラメントと言う印刷用の樹脂やソフトウェアも専用で用意されていて、非常に失敗が少なく印刷精度も高い印象なので気に入っています。

3Dプリント→切削加工

  • 3Dプリントと切削加工も加工条件が近い
     
  • AMCにもあるが難易度が高いので、もしやるなら発注がおススメ

精度の良い3Dプリントであればとても細かく出力することができますが、どうしても積層痕というすじができてしまい「3Dプリントっぽさ」が悪目立ちしてしまいます。やすって仕上げるという方法もありますが、こういう立体物をもう一段階レベルアップした造形にしたいとなったら、樹脂や金属を削って作る「切削加工」がとても綺麗です。
 
AMCにも樹脂を削れる切削機がありますし、これもやっぱり発注できる業者がいくつかあります。
切削はまだまだ工場と直接メールや電話でやり取りするところが多いですが、プロトラブズ(https://www.protolabs.co.jp/)のようなWebが充実したサービスも徐々に増えてきています。

基本的に万単位でコストがかかるので、外装仕上げを必要とするくらい本気の作品で使うのが良いです。3Dプリントでよくよく検証してから発注するようにしましょう。写真は自分の作品用のパーツですが、左が3Dプリンタで検証したもの、右がアルミの切削加工+アルマイトという表面処理を施してもらったものです。

レーザーや3Dプリント用のデータを作る

  • 学生は3年無料のCADソフト「Fusion360」がおススメ(非営利ならその後も無料)
     
  • その他の選択肢としてはrhinocerosやtinkercadなどがある
という感じで、今はデジタルで作ったデータを機械や発注でかなり簡単に出力できる時代になりました。素晴らしいですね。
ではこれらのデータをどうやって作るのかという話になってきますが、これも昔は専門性が高く値段も高かった「CAD」というソフトウェアがかなり手ごろなコストで導入可能になっています。

一番勢いがあると言っても良いのがAutodesk社の「Fusion360」というソフトです。学生無料で、非営利であれば社会人でも無料で使えるので使えるようになるととても便利です。
他の選択肢としてはRhinocerosというCADソフトが学生でも比較的導入しやすかったり、実はtinkercadでもモデリングができますが、あまり込み入ったことはできないのでせっかくなら発展性のあるFusionを覚えるのが良いでしょう。

実際にどんな感じで作っていくのか、少しデモンストレーションをしてみます。

モーターハウジングを作る

例として、3Dプリントで日本電産コパルのギヤードモーターを板に取り付けられるような簡単なハウジングを作ってみます。モーターは大抵が円柱系の形をしているので壁や箱に取り付けづらいので、モーターを挟んでボルトで止められるようなパネルを作ってみます。

全てはスケッチから始まる

Fusionでモデルを作成する場合、スケッチを作ってからそれを立体にしていく、という手順を踏んでいきます。

あまり直感的でなく、3DCGをやってる人などからするとかなり取っつきにくいかもしれませんが、慣れると実際に造形するものを作る時にはとても便利な考え方です。

まずはパネルとなる四角形を長方形ツールで作った後、4隅に円ツールで穴となる円を配置します。この時寸法のガイドが出るので、ここは数値で入力するようにしましょう。このような数値や条件による図形の定義を「拘束」と呼び、後から形状を微調整する時にとても重宝します。

拘束も授業でやろうとするとえらい時間がかかってしまうので、ここでは割愛します…

スケッチから立体を作る

「スケッチを停止」でスケッチの編集を終了させたら、「押し出し」や「回転」でスケッチを立体にすることができます。押し出したい面を選択して、ここでは3mmの板材として作成しました。

穴用の円もちゃんと空いた状態で押し出してくれています。Shift+クリックで押し出し面を解除できるので、好きな面を押し出せます。逆に丸部分だけ押し出すというようなことも可能です。

面に対してスケッチを描く

再度「スケッチを作成」ボタンを押し、板の側面をクリックします。すると今度は側面を基準とした2Dスケッチが書けるようになるので、モーターを抱え込むための輪を描いていきます。3Dプリンタは性質上少し寸法よりも太る傾向があるので、寸法ピッタリでもややキツメに掴んでくれます。

再び押し出し

また同じように押し出します。上に溝を付けることで、寸法が過ぎても少し広がって挟んでくれるような設計になっています。

押し出しは切り取りもできる

押し出しは実は切り取りもできるようになっています。右側のオプションでも選択できますが、大体押し出したい方向に出すと自動で切り替えてくれ、切り取り状態の時は赤色になります。ここでは円柱の部分を少しえぐれる形に切り取りました。

角をまるめるフィレット

最後に、修正ボタンから角を丸める「フィレット」を行います。フィレットは見た目が良くなるということもありますが、切削など機械仕上げでは直角な角(ピン角と言います)が苦手な機械もあるので、そういう加工を前提とする場合にはフィレットを付けて加工しやすくしてあげる必要もあります。

継ぎ目にもフィレット

継ぎ目にも同じようにフィレットを付けてあげます。継ぎ目が角張っているとそこに負荷がかかり過ぎる「応力集中」が起きて折れやすくなってしまうので、力がかかりそうな部分はフィレットでなだらかな形に仕上げてあげるのがベターです。

エクスポート

出来上がったら、3Dプリント用にデータを出力します。3Dモデルデータは実に色々な種類がありますが、3Dプリントの場合OBJかSTLで出力するのがメジャーです。仮にこのデータをtouchDesignerに持っていきたい時は、FBXやOBJなどが使えます。

違うCADソフトに渡す時などは、IGESやSTEPといったCAD用の共有フォーマットが一般的でしょう。

完成!

完成です!実際はもっと大きく・小さくなど微調整が発生すると思いますが、Fusion360はそこでも強みを発揮します。このモデルの状態で実はスケッチを修正すると、ある程度形態を保ったまま長さを修正することができます。
これは「フィーチャーベースモデリング」と呼ばれる方式の強みで、少しずつバリエーションの違う部品なども作り分けが簡単にできるので、使いこなせると非常に効率的です。

図面の出力

また、Fusionには図面を作る機能も付いているので、外部の加工業者に発注したり他の人と協業する時に図面を作成しておくととても便利です。

回路の仕上げ

  • ブレッドボードで試作
     
  • ユニバーサル基板で制作
     
  • プリント基板で量産

と、ガワの話はこのくらいで、また電子工作に戻ろうと思います。
試作から完成に向けたステップがいくつかあります。

ブレッドボードは設計した回路が動くかどうか検証するツールなので、このまま作品として出そうとするとケーブルがすぐ抜けたり、ノイズを受けたりしてあまり適切ではありません。(写真上)
ブレッドボードで正しく動くことが確認できたら、ユニバーサル基板と呼ばれる基板に半田付けをして固定します。(写真中央)制作する基板が1個や2個程度であればこれで十分ですが、数が増えてくると基板を設計・発注して量産するのが便利です。(写真下)回路があらかじめ基板に用意されていて部品を取り付けるだけなので、ミスも少なくなります。

プリント基板の発注

  • 中国のプリント基板メーカーでかなり安く作れる
     
  • FusionPCB / PCB way / elecrow など…
プリント基板は意外と安く仕上げられて、小さいもので送料抜きだと10枚で5ドルなどかなり破格の物も用意されています。(逆に送料が結構高い…)PCB wayなどは24時間以内の出荷で

プリント基板の設計

Autodesk Eagle

このような専用のプリント基板を作るためのソフトウェアもいくつかあります。FritzingやDesignSpark PCBなどAutodesk Eagleがおススメです。Eagleは最近Autodeskに買収されたのですが、それによってAutodesk製品との連携も取れやすくなっています。

上のように図面上で回路を書いていって、回路図から実際に部品配置などを決めていくというスタイルになっており、ここで出力したデータをメーカーに送ることでオリジナルの基板を作ることができます。
(参考:https://tmegane.hatenablog.com/entry/2018/11/20/213520)

Fusionとの連携

基板形状をFusionでも変更可能

今日紹介したFusionとEagleの組み合わせはかなり強力です。Fusionで基板を固定する外装やパーツを調整しながら、Eagle側で部品の配置を調整するというような事もできるようになっているので、作品のパッケージング制作にとても役立ちます。特にUSBや電源ケーブルの配置などは出来上がってから干渉に気づく事も多いですが、このようなビジュアルで見て置けるとあらかじめそういったことも気づけるので無駄な発注を防ぐことができます。

電子部品を買えるお店リスト

電子部品を買えるお店を、通販を中心にざっくりとまとめています。
※学生向けに個人的な見解で紹介しているので、お手柔らかに見ていただますと幸いです…(最終更新日:2019/07/05)

初心者にもやさしいお店

秋月電子通商

定番中の定番。秋葉原にも1つ店舗がありますが、やや狭く土日は混雑するので、あまりゆっくりは見られません。買うものがハッキリと決まっている時に行くのがおススメ。
Webの商品ページはかなりまとまっていて、メーカーのデータシートの他独自の説明書が付いていたりするので、初学者にとってもかなり買いやすいお店です。多くの人が利用しているので、ここで売っているものは大抵誰かが試してブログ記事にしているというパターンも多いので、買う前に検索してみるのもおススメです。

初心者おススメ度:★★★★★

マルツパーツ

秋月と並び有名なお店。秋葉にいくつか店舗を構えています。説明は中級以上向けですが、こっちはわりと色々なパーツを眺めて見られます。

初心者おススメ度:★★★

千石通商

こちらも秋葉に実店舗をいくつか構えているお店。少し経験を積んできて、より細かい仕様の部品を探したい時はこちら。ギター部品や機械系パーツなど需要が少なめなパーツの品ぞろえもなかなか。

初心者おススメ度:★★★

スイッチサイエンス

SparkFunやAdafruit、Pololuなど海外の初心者向けモジュールが豊富です。説明もやさしく丁寧な印象です。

初心者おススメ度:★★★★

ストロベリーリナックス

昇圧モジュールや小型モータードライバなど、マニアックなオリジナル製品が揃っています。自社製品なので比較的丁寧な解説がされていますが、基本的に中級~上級者向けの基板が中心。痒い所に手が届きます。クレジット非対応で、会員登録できないのが少々つらい…

初心者おススメ度:★★

大分慣れてきた人・業務でも使える

Digi-key

海外の通販サイトで、種類がとにかく豊富です。説明などは基本的に書いてないので、型番やメーカー調べて、自分で情報を調べなくてはなりません。
在庫によっては国内発送ではなく海外から届く場合があるので、急ぎの場合は気を付けましょう。

RS-online

こちらも比較的業者向けのECサイトです。数年前に個人でも扱ってくれるようになりました。なので取り扱いは豊富です。

aliexpress

中国の超大手通販サイトで、電子部品以外にも色々あります。謎に安くて怪しい製品がいっぱいあるので、時々面白い掘り出し物が見つかります。
供給が安定しているわけではない上、情報があまり載っていなかったり偽物のICが売られていたりするので、バクチと思って使いましょう。

第十一項 アクチュエータ活用

第十一回 アクチュエータ活用

電子工作創作表現(2019/7/5)

スライドPDF

アクチュエータの具体例

前期課題のヒントとして、前回はセンサーの例を紹介していったので、今回は出力側にあたるアクチュエータを紹介していきます。

アクチュエーションの例

  • 表示・駆動・音響
     
  • 本来の使い方によらない使い方が可能
センサーの説明をした時に「商品説明によらない使い方が色々ある」という話をしましたが、アクチュエータについても同じようなことが言えます。
今日紹介する機器は大きく分けて、何か情報を示す「表示装置」、物を動かす「駆動装置」、音を鳴らす「音響装置」の3つ+アルファを紹介していきますが、あくまでその分類も基本的な使い方の紹介であって、センサー以上に表現の余地は色々あると思います。

モーターから音響

https://vimeo.com/52866292
 
BROTHER 'PRINTER ORCHESTRA'

例としてBROTHERの広告映像「PRINTER ORCHESTRA」では、ジャンクのプリンターやスキャナーに付いたままのモーターを制御して音楽を演奏する様子を記録した映像作品です。

ステッピングモーターを制御する時には、コイルの電流を1ステップごとに切り替えて駆動しますが、その駆動パルスの周波数が動作音となって聞こえます。普段はノイズ音ですが、この周波数を音階に当てはめて制御することでモーターを音響装置として扱っています。

スピーカーから映像

大城真 - モノビート・シネマ(2010)
https://www.ntticc.or.jp/ja/exhibitions/2010/emergencies-016-oshiro-makoto/

2010年にICCで展示された大城真さんの「モノビート・シネマ」は、ヴラウン管の前にスピーカーが設置された作品です。60fpsで画面を更新する画面に対して位相ずれが起きるようなサイン波を出すことでスピーカーのコーンが波うつように見えてくるという作品です。

このように音を出す装置、物を動かす装置でも使い方やそこで起きている現象を紐解いていくことで、色々な表現の可能性が見えてくることが分かります。

アクチュエータの色々

小型液晶モジュール(キャラクタ)

  • 価格:700円前後
  • 利点:I2C通信で、文字が出せる
  • 欠点:出せる情報が限定される

Arduinoは普通のモニター等には基本的に接続が難しいのですが、このような小型の液晶モニタを接続できるようになっています。
文字の表示機能があらかじめ搭載されていて、逆に言うと限定されているのですが、比較的簡単に情報を出すことができるのでちょっとした情報の表示などに便利なモジュールです。

グラフィックディスプレイモジュール

128x64ドットなど小さなグラフィックが出せるモジュール
 

  • 価格:1000円前後
  • 利点:コンパクトに好きな図や文字を表示できる
  • 欠点:制御がやや複雑(ライブラリがあるものも)

もう少し自由に表示がしたいということになると、任意の絵が表示できるグラフィックモジュールもいくつか出回っています。制御がやや複雑になりますが、レイアウトも自由に決められるのでもう少し見た目に自由が利きます。

小型液晶(HDMI)モジュール

フルHDクラスの解像度を表示できるモジュール。
Arduinoでは難しいので、Raspberry piなどが必要
 

  • 価格:10000円前後
  • 利点:小さく高い解像度の映像が出せる。
  • 欠点:値段が高く、繊細

Arduinoから少し脱線しますが、HDMI接続で表示ができる液晶モジュールというのも販売されています。スマホに使われる液晶モニタが流れてきた物などもあって、値は張りますがとても表示が綺麗なものも中にはあります。PCでも出せますし、Raspberry piやLatte pandaというワンボードPCを使っても色々と面白い事ができるでしょう。

マトリクスLED・7セグLED

簡単な図形や数字を表示するためのLED。
ダイナミック点灯という方式を使う。
 

  • 価格:100円前後
  • 利点:液晶などに比べ制御は簡単
  • 欠点:解像度に対して単価が高くなる

LEDやNeoPixelについては以前も紹介したので省略しますが、ほかにLEDを使った表示機器として「マトリクスLED」や「7セグLED」というものがあります。数字やドットを表現することに特化していますが、7セグなんかは使うとわりと雰囲気が出ます。配線を節約するために点灯するLEDを高速で切り替える「ダイナミック点灯」という方式を採用していることが多く、ダイナミック点灯をするための7セグ専用ICなども開発されています。

レーザーモジュール

レーザーポインターの中身にあたるモジュール
 

  • 価格:500円~3000円
  • 利点:スモークと組み合わせて光の線が出せる
  • 欠点:色が限られる。赤は安いが、緑などは少し高い

レーザー光源もモジュールとして売られている事があります。赤色が比較的安い値段で売っていて、緑や青~UV色のレーザーは数千円の値段がします。

レーザーはその強さによって「クラス」が定められていて、日本国内でレーザーポインターのような形で使えるのはクラス2までとなっているので、正規で買えるのはそのくらいのクラスまでです。

ネットで検索すると中国発の怪しいサイトで強い出力のレーザーを売ってる事がありますが…自己責任で、よくよく注意して使うようにしてください。ステージで使うようなクラスになると、天井を焦がすくらいのことはできてしまいます。(実体験)

DCモーター

電圧をかければ回るシンプルな構造。
回転数が遅いが力が強い「ギヤードDCモーター」は少し高い
 

  • 価格:100円~7000円など
  • 利点:ドライバも色々出ているので、制御が簡単。
  • 欠点:緻密なコントロールは苦手

最もシンプルな部品がDCモーターと呼ばれるモーターです。決められた電圧をかけると回りますし、プラスとマイナスを逆につなげば逆回転します。シンプルなのでArduinoに直接つないで動かせそうですが、わりと多めの電流を必要とするのでデジタルアウトからの電気だけでは動かせません。

そのため、フルHブリッジ回路などを内蔵したモータードライバと呼ばれるモジュールを使うのが一般的です。ドライバのチョイスは主にモーターの駆動電圧、駆動電流によって決まります。

ゆっくり動くタイプは「ギヤードモーター」とも呼ばれます。

ソレノイドコイル

電磁石で芯棒を動かす装置。何かを押したり引いたりする時に使用する。
 

  • 価格:1000円程度
  • 利点:DCモーターのように制御が簡単
  • 欠点:出来る事のわりに値段が高め

これもDCモーターと同様コイルに電流を流すだけで動くアクチュエーターで、電気を流すとピンが出たり入ったりします。流した時に出る物をプッシュタイプ、引っ込むものをプルタイプと呼びます。
モーターでもギヤやクランクを使い何かを押し引きする事は可能ですが、構造が複雑になるため、シンプルなものであればソレノイドコイルを使うのが簡単です。
http://www.takaha.co.jp/

PWMサーボモーター

PWMで行きたい角度を指示する。
小型ロボットやラジコンなどに使われている。
 

  • 価格:700円~5000円など
  • 利点:決まった方向を向く装置の中ではとても簡単
  • 欠点:角度に制限がある(270度~360度など)

次に制御が簡単なのがこのPWMサーボです。Arduinoがあればドライバが基本的に不要な分、こちらの方が簡単かもしれません。Arduinoの場合Servo.hというライブラリが用意されています。

電源、PWM入力、GNDの3本線でPWMを送ると決まった角度を向いてくれます。
DCモーターは基本的に軸がずっと回り続けますが、PWMサーボは270~300度くらいまでの範囲を行ったり来たりできるのが一般的です。

ステッピングモーター

 
回転速度や角度の指定など、緻密なコントロールが可能。

  • 価格:1500円~50000円など様々
  • 利点:モーターの中では最も精密
  • 欠点:制御が難しく、ドライバと合わせると値段も高い。

角度の指定、スピードのコントロール、無限回転とわりと何でもござれなモーターがステッピングモーターです。
バイポーラステッピングモーターではA相・B相という二つのコイルユニットがあり、これらをスイッチすることで1ステップずつ(1.8°刻みが多いです)軸の角度を動かしていくことができます。

緻密に制御できる分、難易度も上がります。ステッピングモーターは後期に動かし方を解説しようと思っています。
参考:http://akizukidenshi.com/catalog/g/gP-05372/

ブラシレスモーター

ステッピングモーターと並び精密な制御ができる。ドローンで使われているのはこのモーター。
 

  • 価格:3000円~(アマゾン調べ)
  • 利点:ステッピングと比べなめらかで高速・高応答な制御が可能。
  • 欠点:制御が難しくドライバは必須。

精密に制御できる部類としてもう一つ上げられるのが、ブラシレスモーターです。ステッピングモーターに比べ、より緻密で応答性の高い動作に用いられることが多く、ドローンのプロペラ部分やカメラスタビライザーのジンバル部分等によく使われています。

コーンスピーカー

一般的なスピーカー。アンプキットなどもあるので、自作多チャンネルなども自作すれば幅が広がるかも
 

  • 価格:100円~
  • 利点:好きな形、好きな数のスピーカーが作れる
  • 欠点:製品の音質にはやはり劣る

電子部品屋ではスピーカーも買うことができます。ポータブルアンプキットなどもあるので、組み合わせて作品用にオリジナルのスピーカーを作ることもできるでしょう。ただ音質を上げるにはスピーカー音響の知識が必要になってきます。

スピーカーに関してはFOSTEXのフルレンジスピーカーなどもあるので、やや値段は張りますがそういった選択肢もあります。
https://www.fostex.jp/speaker-unit/
http://akizukidenshi.com/catalog/g/gP-10984/

パラメトリックスピーカー

超音波を使って単一指向性のある音が出せる。

  • 価格:10000円~
  • 利点:特定の場所でだけ聞こえる音が作れる
  • 欠点:音質は良くなく、レンジは写真のもので400~5kHz程度

超音波スピーカーを並べて指向性の高い音を作るパラメトリックスピーカーというものもあります。レーザーのように特定の範囲でだけ、より遠くまで音が聞こえる装置で聞くと不思議な感覚がします。ただ周波数特性はあまり良くないので、出せる音はかなり限られてきます。

http://akizukidenshi.com/catalog/g/gK-02617/

第十項 センサーの活用例

第十回 センサーの活用例

電子工作創作表現(2019/6/29)

スライドPDF

前期課題の参考

  • コンセプト解説
     
  • センサーの活用例
前期課題の参考になるような作例を、ハードウェアの使い方から紐解いていきます。

課題

  • 1つの入力と、1つの出力を使う作品プラン
課題内容は前回もお伝えした通り「1つの入力と1つの出力を使った作品プランの提出」です。
センサーなど1つの入力装置と、1つの出力装置を使って何ができるかということを考えてみてください。

同じセンサーや同じモニタ・スピーカーでも、使い方の工夫で色々な表現ができると思います。凝った情報を取るというよりは、簡単なセンサーでより面白い表現ができないかということを是非考えてみてください。

入力と出力の関係性について

  • 文脈を無視して何でもつなげてしまう
     
  • 「起きること」から少しずれた「起こりそうで起こらないこと」
このような制限を設けたのは、インプットとアウトプットの関係性について考えてみて欲しいという意図があります。
 
センサーという形を通すと、あらゆる入力を好きな出力と紐づけられてしまいます。これは非常に面白い事でもあるのですが、一方で文脈を無視して接続できてしまうので、この関係性にどんな意味合いを感じ取る事ができるのかをよく考えてみてください。

「XXセンサー」の名前に限らない使い方

  • 商品名等にある「XXセンサー」はあくまで一例
     
  • 設置の仕方で多様な情報が取れる
今日は入力側、センサーについてどんなものがあって、どんな使い方ができるのかかいつまんで紹介していこうと思います。部品の紹介などを見ると「XXセンサー」という言い方がされているのですが、あくまで一般的な名称であって、使い方次第で色々な情報を拾ってくることが可能です。

その辺も色々想像を膨らませながら考えてみてください。

センサーの具体例

ボタン・スイッチ

  • モーメンタリ/オルタネイトなど種類がある
     
  • 例:ボタンを押した、物が当たった
ボタンやスイッチもセンサの一種と捉えられます。ボタンには押している間だけONになるモーメンタリタイプと、押すたびにONとOFFが切り替わるオルタネイトタイプがあります。

また「マイクロスイッチ」などは指で押すものではなく物が当たった時に反応することで、モーターの原点出しなどに使われます。そのような使い方をすれば、人だけでなく、物が当たった時を検知することも可能です。

ボリューム・スライド抵抗

  • いわゆる「ツマミ」と呼ばれるもの
  • どうコントロールするかも工夫しやすい
ボリュームやスライド抵抗はシンプルに値を変化させるのに便利なツールです。そのまま使っても楽しい部品ですが、例えば紐をつけて引っ張ってみるなど、インターフェースを変えてみてもそれだけで意味合いが変わってくるので、試す余地は色々とあると思います。

ピエゾ素子

  • 入力としても扱える
     
  • 例:振動が加わった、息を吹きかけた等

http://akizukidenshi.com/catalog/g/gP-04118/
音を鳴らすピエゾ素子は、逆に入力装置としても使うことができます。振動を拾ったり、息を吹きかけたりしても値が変わるので、マイク的に使うことができます。小さくて安いので、大量に設置したり狭いところに仕込むなど、普通のマイクではできないような扱い方をするのに適しています。

フォトセンサ

  • レーザー等を組み合わせると、遮蔽物を検知できる
     
  • 例:明るさの変化、対象物に遮られた、物が置かれた等

http://akizukidenshi.com/catalog/g/gI-02325/
明るさを取得できるフォトセンサですが、部屋の明るさを拾う以外にもLEDやレーザーと組み合わせて色々な応用がききます。レーザーをセンサーに当てて遮蔽センサとして使ったり、黒い線の上を走るライントレースロボットに使われたりなど部品代も安いので色々な使われ方があります。

圧力センサ

  • 物を握ったり、押しつぶす力を取得できる
     
  • 例:押し込まれた、物が置かれた、ぶつかった等

http://akizukidenshi.com/catalog/g/gP-06214/
圧力センサは薄い2枚の導体を押しつぶす事で、接触面積が増えて疑似的に圧力をセンシングできるという仕組みです。ある程度重い物を載せたりしても反応するので、押し込んだ強さの他にも簡易的に重さを測るというような使い方もできるでしょう。

曲げセンサ

  • 曲がり具合で抵抗値が変化する
     
  • 例:テンションの張り具合

https://www.switch-science.com/catalog/508/
曲げセンサは細い長い素子の曲がり具合で抵抗値が変わるので、最近ではVRグローブで指の曲げを検知する時なんかに使われます。もう少し張りのある部材と組み合わせて糸の張り具合を計測するというような事もできます。

距離センサ

  • 対象物までの距離を測る(1次元)
     
  • 例:近づいた、遠のいた、遮られた

http://akizukidenshi.com/catalog/g/gI-02551/
距離センサは1次元で対象までの距離を測ることができます。今ではKinectやRealSenseのように2次元で距離を測れるカメラが出てしまっているのであまり使われなくなってしまいましたが、比較的安価、小型、PCのリソースが不要など距離センサのメリットもまだまだあります。

加速度センサ

  • 加速度(acceleration)が取れ、常に重力加速度がかかっている
     
  • 例:傾き具合、振動、落下判定

http://akizukidenshi.com/catalog/g/gK-07243/
加速度とは物体に速度を与える要素です。物が動き出す時にはこの加速度が必ず生じていて、センサには常に重力加速度が生じています。加速度センサはこの重力加速度のXYZ方向を計測することで傾きを取ることができます。

また振動する時も細かな加速度を計測することができますし、自由落下する時には一瞬加速度が0になるので、物が落ちているかどうかを計測することも可能です。

ジャイロ(角速度)センサ

 

  • 回転している速度を計測できる。加速度より正確に取れる
     
  • 例:物の回転、弱い振動

http://akizukidenshi.com/catalog/g/gK-04912/
静止した物の傾きを取るのは加速度センサが得意ですが、どの方向に回転しているかという情報はこのジャイロセンサの方が正確に計測できます。各速度という形で計測できるので、毎フレームの角速度を回転方向に積算すれば物体の角度を知ることができます。

加速度とジャイロはセットで使われる事が多く、静止した状態で基準となる向きを加速度センサから取得した後、その基準位置からどの方向を向いたかという情報をジャイロセンサによって取得するという使い方が、ゲームコントローラーなどでよく使われます。

加速度とジャイロ・加えて磁気センサがセットになった6軸モジュール:
https://www.switch-science.com/catalog/2845/

その他応用がしにくそうなセンサ

以上が比較的メジャーで扱いやすく、応用が色々期待できるセンサでしたが、もう少しマイナーなセンサについても紹介していきます。

焦電型赤外線センサ

  • 赤外線を検知して、人や動物の動きを判定する
http://akizukidenshi.com/catalog/g/gM-09002/
焦電センサは、人や動物から発せられる赤外線を検知できるセンサです。
可視光の影響を受けないので自動で点灯する照明などはこのセンサが良く使われています。

気温・湿度・気圧センサ

  • 大気の状態を計測する。数値の動きは比較的地味

http://akizukidenshi.com/catalog/g/gK-09421/
大気の状態を計測するセンサを使えば気温・湿度・気圧なども取得することができます。台風等が通過すると気圧が大きく変化したりしますが、一日の間であまり大きく数字が変わるわけではなく、これで何かを変化させようとするとかなり地味な動きになってしまうので、あまり展示やパフォーマンスのような作品向きではないかもしれません。

心拍センサ

  • 血液に光を当て、反射量で心拍を計測する
     
  • 光センサによる計測はあくまで簡易的な物

https://www.switch-science.com/catalog/3208/
指に光を当てて血液が反射する量を計測することで、簡易的に心拍を取れるセンサというのもあります。
医療用の本気のセンサも勿論ありますが、光センサとArduinoで計測するのはあくまで簡易的な物なので、当て方や外乱でうまく計測できないことも多く、あまり細かな情報を取ろうとすると体験としては難しくなりがちのようです。

第九回 PCとの連携・シリアル通信応用

第九項 PCとの連携・シリアル通信の応用

電子工作創作表現(2019/6/21)

スライドPDF

先週の「シリアル通信」前回まで

  • PCから数字を1つ送る
     
  • Arduinoから来る数字を受信する
前回は、ArduinoのSerial.write関数を使って数字を送受信するというプログラムを解説しました。今回はその続きで、もう少し込み入った情報をやりとりする方法について解説していきます。

シンプルに数字を送るだけ

  • 複数のデータはどう区別する?
     
  • 255より大きい値を送るには?
シリアル通信は1バイトずつ数字を送ることができるので、0~255までの数字を送る事ができます。しかしそうなると、複数の値(アナログ入力の0番と1番や、傾きセンサのXYZ)を送ってもいつどのデータが来ているのか分かりませんし、値も255までしか送れないというのはかなり幅が狭いです。

基本的な文字をやり取りする「アスキーコード」

  • 簡単な文字を128種類におさめた「ASCII CODE」
     
  • 英数字記号などの簡単な「文字」が送れる
そこでもう少し複雑なやりとりをしようとすると、数字を文字として置き換えた「アスキーコード」の出番がやってきます。英数字記号とデータ用の特殊な文字で構成されていて、128種類に収められているので全てを1バイトの文字として使うことができます。「アスキーコード 一覧」などで検索すると、一覧が出てきます。

1バイトを1文字として扱う

  • 例:111:110:107:97:110 で「onkan」
     
  • 数字も文字として登録されていて「0」は48から始まる
     
  • 文字としてのデータが「アスキー」数字としてのデータが「バイナリ」
1バイトの数字がそのまま文字として扱われるので、例えば上記数字の並びをアスキーコード表に照らし合わせてみると「onkan」という文字になります。そして数字も文字として登録されていて、文字の「0」が48でそこから1ずつ増える形で対応しています。

こうなってくると少しややこしくて、数字のデータを送る時に文字として送るのか数字として送るのか、ルールを決める時に混乱が生じてしまいがちです。そこで文字としてのデータのことを「アスキー」、数字としてのそのままのデータを「バイナリ」と呼ぶのが慣例になっています。

アスキーデータのやり取り

  • 送るデータの自由度は上がる
     
  • ただしプログラムは煩雑になる
アスキーデータでやり取りをすると、情報の自由度が上がる一方でプログラムは煩雑になります。
しかしパソコンとの連携をする上でとても重要な方式なので、じっくり説明していこうと思います。

シリアルモニタはアスキーベース

  • ArduinoIDEの「シリアルモニタ」はアスキーベース
     
  • 受信したデータを出力して、送信もできる
アスキーベースでのシリアル通信を簡単に試す時には、ArduinoIDEのシリアルモニタが便利です。Arduinoから送られてきたデータをそのままウィンドウに表示(ダンプ)してくれるのと、テキストを入力すればそれをそのままArduinoに送信してくれるので、作りはじめにシリアル通信を試したい時や、何かバグが発生した時の検証などに便利なので活用しましょう。

Arduinoでデータを受信する

  • 文字を入れる変数「String」を使う
     
  • 「<on 2>」「<off 2>」というコマンドでLEDをスイッチする例
Arduinoで受信したシリアル信号を文字として扱うためには「String」という変数の型を使って、受け取った文字データをストックしていきます。
どんな文字で指示するかというのは、実現したい事に応じて考える必要があります。ここではデジタルピンのLEDをオンオフするために「on ピン番号」というコマンドを不等号で囲う形にします。

「>」を一つの命令の終わりと認識することで、複数バイトのデータを場合分けすることができるようになります。Stringには文字を抜き出したり、アスキーの数字をバイナリの数字に変換するなど色々な機能が搭載されているので、都度必要な機能を参照しながら使うのが良いでしょう。
https://www.arduino.cc/reference/en/language/variables/data-types/stringobject/

//====================以下Arduinoスケッチ===========================

// Arduinoのシリアルモニタから、デジタルピンを制御する
//  でHIGH、  でLOWにする

String recv; //文字列を保持する変数String

void setup()
{
  Serial.begin(9600);

  //2~13までをすべて出力にする
  for (int i = 2;i <= 13;i++)
  {
      pinMode(i, OUTPUT);
  }
}

void loop()
{
  while (Serial.available())
  {
    //charは1文字だけを保持する変数
    char data = Serial.read();
    //読めるデータは1バイトずつなので、recvに追加していく
    recv += data;

    //データの最後に「>」を入れるルール
    if (data == '>')
    {
      //先頭3文字が「<on」かチェック
      if (recv.substring(0, 3) == "<on")
      {
          //5文字目以降の文字を抜き出してtrimedに入れる
          String trimed = recv.substring(4);

          //trimedで抜き出した文字としての数字をintに変換
          int pin = trimed.toInt();

          //指示されたピン番号をHIGHにする
          digitalWrite(pin, HIGH);
      }

      //先頭4文字が「/off」かチェック
      if (recv.substring(0, 4) == "<off")
      {
          //6文字目以降の文字を抜き出してtrimedに入れる
          String trimed = recv.substring(5);

          //trimedで抜き出した文字としての数字をintに変換
          int pin = trimed.toInt();

          //指示されたピン番号をLOWにする
          digitalWrite(pin, LOW);
      }

      //recvの中身を読み終えたので、リセットする
      recv = "";
    }
  }
}

Arduinoでデータを送信する

  • Serial.print() もしくは Serial.println()
     
  • 数字は自動的に変換してくれる
今度は逆に、Arduinoから文字データを送信するプログラムを書いてみます。Arduinoから1バイトのデータを送る時はSerial.write()という命令を使っていましたが、文字を送る際にはprint()もしくはprintln()という関数を使います。

3つのアナログ入力した値を出力しますが、この辺りは加速度センサを使った時にも使ったコードに近いですね。シリアル周りを重点的に解説していきます。

//====================以下Arduinoスケッチ===========================

void setup()
{
  Serial.begin(9600);
}

void loop()
{
  Serial.print(analogRead(0));//アナログで読み取った値をシリアルでプリント
  Serial.print("\t");//3つの値をタブ文字で分割する

  Serial.print(analogRead(1));
  Serial.print("\t");

  Serial.print(analogRead(2));
  Serial.print("\n");
  //最後に改行文字'\n'を入れる
  //最後はSerial.println(analogRead(2));としてもOK。
  //printlnとすると最後の\nは勝手に追加してくれます
}

表記できない文字の表記

  • 「\(バックスラッシュ)」の後にアルファベットで、タブや改行などを表現
     
  • 「エスケープ文字」と言って特殊な文字を表記する時に使う
Serial.print("message")という感じで、文字を送る場合にはダブルクォーテーションで囲みます。ここではシリアルプロッタのフォーマットにならって3つの値をタブ文字で区切りました。0~1023までの値がプリントされています。

タブや改行のようにコード上では書けない記号を表記する場合、バックスラッシュを後ろに付けてエスケープ文字という形で表記する場合があります。

max/mspで受け取る

maxではbangを送ると受信したデータが流し込まれるので、prependオブジェクトでスタックした数字のデータを、改行のタイミング('\n'がバイナリの10)でitoaオブジェクトに流し込むことで文字のデータとして拾い上げています。

touchdesignerで受け取る

touchDesignerでは前回同様SerialDATを使い、Row/Callback Formatをone per lineに設定すると改行ごとにデータを区切ってくれます。

これを更に別々の数値として扱うにはsplitメソッドを使い、配列として分割した後にConstant ChOPなど使いやすいオブジェクトに入れるなどをします。

Processingで受け取る

  • Arduinoに近い書き方
Processingで受信する処理は、Arduinoがシリアルを受信する処理とかなり近く、Stringを連結していって改行のタイミングでブロックを処理してあげるという処理を施します。

import processing.serial.*;
int data[] = new int[3];
String recv;
Serial serial;

void setup()
{
  size(1023, 300);
  serial = new Serial(this, "COM3", 9600);
}

void draw()
{
  background(0);
  fill(255);
  rect(0,   0, data[0], 50);
  rect(0, 100, data[1], 50);
  rect(0, 200, data[2], 50);
}

void serialEvent(Serial s)
{
  char dat = char(serial.read());

  if (dat != '\n') recv += dat;
  if (dat == '\n') 
  {
    String[] list = split(recv, '\t');
    data[0] = int(list[0]);
    data[1] = int(list[1]);
    data[2] = int(list[2]);
    recv = "";
  }
}

第八項 PCとの連携・シリアル通信基礎

第八項 PCとの連携・シリアル通信基礎

電子工作創作表現(2019/6/14)

スライドPDF

パソコン<->Arduinoの通信

  • 色々なソフトと連携する
     
  • Processing, oF, Max/MSP, TouchDesigner...
Arduinoとパソコンの間で通信ができると、色々なソフトウェアと連携をとることができます。
今回はいくつかの通信手段を使って、パソコンと連携する方法を解説していきます。

USBシリアル通信

  • 1バイトずつデータを送る、シンプルな方法
     
  • 親戚にRS-232CやRS-485がいる
今までArduinoでデータをやり取りしていたUSBシリアル通信は、1対1の双方向通信をするための、シンプルでポピュラーな方法です。USBでシリアル通信をするのでUSBシリアルと言って、親戚のようなものにRS-232Cや、DMXのベースとなっているRS-485という規格のものがありますが、ここでやりとりするデータも基本的には同じ内容です。
プログラム上においてで複雑なルールは無く、1バイトずつデータをやりとりします。

「バイト」とは

  • 2進数の0と1を8個並べたものが「1バイト」
     
  • 0~255までの要素を表現できる
     
  • 16進数では0x00~0xFFのように2桁で表現できる
バイトとはコンピュータ上で扱う数字の単位で、0と1だけで数を表す「2進数」の数字8桁を1バイトとしています。
この1バイトで表せる数字は10進数の0~255までです。Arduinoでは2進数を0b00001111のように0bを付けて表現することもできます。
ちなみに16進数も0x5Aのように0xを頭に付けて記述できますが、16進数が使われるのは1バイトを表記するのに2桁で収まって見やすいという理由があります。

2/8/10/16進数の相互変換
https://hogehoge.tk/tool/number.html

バイトの列を送る

  • 0-255までの数字を1個ずつ送るのがシリアル通信
     
  • データの意味や区切りなど、自分でルール(仕様)を決めてやり取りする
この1まとまりの数字を1個ずつ送れるというのが、シリアル通信の基本的な機能です。
1バイトずつデータを送るので、この255までの数字にどういう意味を持たせるのかを決めながらやり取りしていく必要があります。

PCとの連携・基本編

  • Arduino側と、PCソフト側のプログラムでルール(仕様)を決めながら書く
     
  • max/msp oF Processing touchdesigner
シリアル通信では決まったデータのルールが特に無いため、やり取りの決め事をArduinoとソフトウェア側で決めながら実装していく必要があります。

基本的なArduinoでのシリアル通信の記述方法と、PCとの連携についていくつか具体的な方法を紹介していきます。

Arduinoシリアル送受信(基礎編)

  • 指定したピン番号のアナログ値を返すサンプル
まずは、とてもシンプルなArduinoのシリアル通信サンプルを用意します。これはPCから0~5までの数字を受け取って、その番号のアナログピンの値を返すというサンプルです。
アナログの値は0~1023まで取ることができますが、返す値は1バイトだけなので、0~255までしか送れません。大きい数字を送る方法は色々あるのですが、ここはひとまずアナログの値を255までに圧縮します。

void setup() {
  Serial.begin(9600);
}

void loop() {

  while (Serial.available())//データが来ているか確認
  {
    //1バイト分のデータを変数に入れる
    byte data = Serial.read();

    //アナログピンの番号の入力値を返す
    if (data < 6)
      Serial.write(analogRead(data) / 4); //1バイトでしか送れないので、4で割る
  }
}

max/mspとの連携

max_serial

max/mspでシリアル通信をするときは、serialパッチを使います。1つ目の引数にポート名、2つ目には通信速度を記載します。ポート名はprintを送信すると右のアウトレットから出力されます。
数字をメッセージで送るとその数字が1バイトだけ送信されます。1バイトなので、255を超える数字を送ろうとするとオーバーフローが起きて、256で割った余りの数字になってしまいます。
ここではアナログ5番のデータが欲しいので5を一定間隔で送りました。

Arduinoからは返事が返ってきますが、返事はserialオブジェクトの中に格納されたままになっていて、bangを送る事でアウトレットから出力されます。

touchdesignerとの連携

  • serialDATを使う
     
  • TDはアスキーコードとして使うのがデフォルト(後述)
続いてTouchdesignerでの連携です。touchdesignerではSerialDATというオペレータを使って送受信をします。ポート名と通信速度を同じように設定して、データを出力するタイミングのRow/Callback FormatをOne par byte、Byte ColumnをONに設定します。byte ColumnをONにしたことで、1バイト分のデータが数字で表示されるようになります。使うデータは最新のものだけなので、Maximum Linesは1にしておきます。

execute DATからデータ送信

execute

毎フレームアナログ番号の5を送りたいので、Execute DATのFrame StartをONにし、onFrameStart内でserial1オペレータのsendByteメソッドを呼び出します。これで毎フレーム5が送られるので、アナログ入力値がserialDATに送られます。

CHOPで受け取る

DATの値をConstant CHOPに入れ込みます。直接DATから数字をもらってきても良いですが、これで使いやすくなりました。

グラフィックのパラメータにしてみる

noise top

これをNoise TOPのZパラメータに入れてみます。
データの範囲が0~255なので、これをexpressionで調整してnullに入れておいた値をNoise TOPのtzに入れます。アナログの値をぐりぐり動かすとNoiseの模様がリニアに変化していきます。

processingとの連携

  • processing.serialライブラリを使用
     
  • serialEventメソッドが呼び出される
続いてprocessingの場合です。processing.serialからライブラリをインポートして、Serialクラスを使います。writeメソッドで1バイト分のデータを送る事ができます。Processingではデータを受信するとserialEventが呼び出されるので、そこでデータを受信することができます。

import processing.serial.*;
int data = 0;

Serial serial;

void setup()
{
  serial = new Serial(this, "COM3", 9600);
}

void draw()
{
  background(0);
  serial.write(5);
  rect(width / 2, height / 2, 10 + data, 10 + data);
}

void serialEvent(Serial s)
{
  data = serial.read();
}

openFrameworksとの連携

  • C++なので、Arduino側と読み書きの構造は近い
     
  • 今日紹介した中で処理速度は最速
openFrameworksでは、ofSerialというクラスが用意されています。
C++ということもあって、書き方はArduinoとかなり近くなります。

//====header====
ofSerial serial;
int analog = 0;
//====header====

ofApp::setup()
{
  serial.listDevices();
  serial.setup("COM3", 9600);
}

ofApp::update()
{
  seiral.writeByte(5);
  while (serial.available())
  {
    analog = serial.readByte();
  }
}

ofApp::draw()
{
    ofDrawRectangle(ofGetWidth() / 2.0, ofGetHeight() / 2.0, 10 + analog, 10 + analog);
}

USBシリアルでの「決めごと」

  • 通信速度(9600/38400/115200bpsなど)
     
  • データ長・パリティビット・ストップビット
     
  • 8ビット長・パリティ無し・1ストップビット(SERIAL_8N1)がArduinoデフォルト
最後に、USBシリアルではいくつかルールがあってこれをArduino側とソフトウェア側でそろえなくてはいけません。通信速度はノイズ等でデータの取りこぼしがあるので早すぎない程度に高い数字を使いましょう。

データ長・パリティ・ストップビットについては通信のタイミングを決めるルールですが、基本的には8ビット・パリティ無し・1ストップビットが今スタンダードなようなので、特に意識する事はないと思います。メーカー製の装置等と通信する時に違った設定があることがあるので、なぜかちゃんと通信できないという時に思い出す程度で大丈夫です。各項目の意味については検索するとたくさん情報が出てきますが、これも自分で組み込みデバイスを設計しない限りあまり使うことはないかなと思います。

補足:通信速度

  • 9600だと60fpsの世界では1フレーム160バイト
     
  • 115200で1フレーム1920バイトなので無難?
自分の感覚としてはUSBシリアルなら9600未満は遅いかなという感じで、115200当たりが無難に思います。

映像的に考えると、9600bpsで1フレームに送れるデータ量は9600÷60=160バイトなのでちょっと遅いかも、115200bpsなら1フレーム1920バイトなので十分かなという感じです。

補足の補足:クロックとの組み合わせ

  • Arduinoのクロック数(UNOでは16MHz)によってエラーレートが変わる
     
  • 高いほどエラーが起きやすいという事でもない
その後、ツイッターで情報をいただいたのですが、実はクロック数と通信速度でデータを取りこぼしやすい組み合わせがあるということでした。
https://cache.amobbs.com/bbs_upload782111/files_22/ourdev_508497.html
ここによると16MHzでエラー率が低く、速度が速いのは76800bpsだそうです。115200だと3.7でやや高く、57600は少し遅いけど位相がずれていくのでエラー率が高くなっています。

https://ja-support.renesas.com/knowledgeBase/17794551
理論上は4.375%までが許容範囲ということなので、115200はギリギリですね…16MHzのArduinoでは76800くらいが丁度良さそうです。

ここまでがシリアル通信基本形

  • 生のバイナリ(数字)データでシンプルにやりとり
     
  • 複数種類のデータや大きい数字など複雑にしづらい
以上が、各ソフトウェアで扱える簡単なシリアル通信の方法です。単純なデータのやりとりはできますが、これではちょっと機能に物足りなさを感じます。
アナログのデータも欲しいけどデジタルの入出力もしたい、さらに複雑な処理をArduinoに指示したいとなるともう少し発展的な実装をする必要があるのですが、それはまた次回!

前期課題

  • デバイスを使った作品プランを提出
     
  • 「1種類のインプットと、それに対応した1種類のアウトプットを持つもの」
     
  • その組み合わせがどういう意味を持つか、どういう意味を持たせられるか考える
6月も半分を超えたので、ここで前期課題を出そうと思います。デバイスを使った作品プランを考えてみてください。後期は実際に作品を作ってもらいたいと考えているので、ここで少し作品についてや実現可能性についてディスカッションをできればと思っています。聴講生の提出も歓迎です。

どうしても作りたいものがある場合は、Arduinoかその他デバイスを使っていれば自由に考えてもらっても構いませんが、一応トライしてみてほしいテーマを「1種類のインプットと、それによって変化する1種類のアウトプットを持つもの」とします。

何かセンサーや入力を1種類と、それによって制御される出力を1種類決めて、その現象がどういう意味を持つか、どんな意味を持たせることができるか考えてみてください。

7/19に発表してもらいたいので、7/19のお昼12時を提出期限とします。また課題用のページを作りますが、Googleのドキュメントかスライド、PDFなどWebで共有できる形式をいくつか指定します。

第七項 通信とケーブル・はんだ付け

第七項 通信とケーブル・はんだづけ

電子工作創作表現(2019/6/7)

スライドPDF

今日使うもの

  • ジャンパワイヤ4本
     
  • MPU6050モジュール
     
  • はんだごて
     
  • はんだマット

今日の予定

  • 6軸センサを使ったセンシング&はんだづけ体験
     
  • 通信とケーブルについて

はんだづけ

  • 基板の銅等を使った接点(ランド)に電子部品を固定する
     
  • はんだを溶かしてくっつける。溶接ではなく「溶着」
今日はMPU6050という、傾きを検知するセンサーを使ってデモしようと思うのですが、せっかくなので部品のはんだ付けを皆さんに体験してもらおうと思います。
はんだづけとは、基板に電子部品を固定する方法の一つで、部品の金属接点と基板の接点の間にはんだという合金を溶かし入れて接着する方法です。溶接の一種とよく言われますが、溶接ではなく溶着ですので、溶接ほどの強度はありません。

はんだごてについて

  • 安くて温度が低いものは難しい
     
  • 自分用を買う時は「温度調節機能付き」がおススメ
はんだ付けは、熱したはんだごてではんだを溶かしながらつけていきます。溶かすはんだは種類によって融点が色々あり、あまり温度が低いとはんだ不良を起こすので自分用にこてが欲しくなった場合は温度調節機能付きのはんだごてがおススメです。白光やgootというメーカーのはんだごてがメジャーなので良いでしょう。

はんだの付け方

handaduke

  • 部品二つを温める(3~4秒)
     
  • はんだを押し当てて溶かし、流し込む
     
  • はんだごては1秒ほど、一息おいてからはなす
はんだの主な手順は上記のようなイメージです。部品の大きさや材質によって当然条件も変わってきますので、上手くなるためには数をこなしてみるのが一番だと思います。

良いはんだ、悪いはんだ

handa

  • つやつやした富士山型が良いはんだ
     
  • はんだを盛りすぎる、ランドに熱が伝わってないと「いもはんだ」になる
はんだ付けがきれいにできると、三角錐の形になります。接点側に伝える熱が不十分だと表面張力で丸っこい形になり、取れやすかったり電気が通じなかったりするので、そうなってしまった所は数秒はんだを当てるなどして直してあげましょう。
ただし、あまり長く基板や部品にこてを当てていると熱が伝わりすぎてランドが剥がれたり部品が熱で壊れたりしてしまうので、いい感じと思ったらすぐ離すようにしてください。念入りに当てすぎるのはNGです。

センサモジュールGY-521(MPU6050)を使う

センサモジュールにピンソケットをはんだ付けする

今回は傾きと、回転速度をとることができるセンサーGY-521(MPU6050)にピンソケットをはんだ付けしてみます。
傾きを取得する加速度センサと、回転角速度を取得するジャイロセンサが載ったセンサで、真ん中の黒くて四角いIC部分がTDK社製のMPU6050で、それをすぐ使えるようにしたモジュール基板の名前がGY-521となっています。

配線

wiring

はんだ付けができたら、以下の通りに配線していきます。アナログの4番5番ピンは、実はI2Cという通信方式のためのピンにもなる特殊なピンになっています。

スケッチの書き込み

  • という最初から入っているライブラリを使用
     
  • I2C(I Squared C)通信という通信方式を使って、センサーの情報を取得してくる
 #include <Wire.h>

 #define MPU6050_ADDR 0x68
 #define MPU6050_AX  0x3B
 #define MPU6050_AY  0x3D
 #define MPU6050_AZ  0x3F
 #define MPU6050_GX  0x43
 #define MPU6050_GY  0x45
 #define MPU6050_GZ  0x47
 #define MPU6050_POWER 0x6B

short int acc[3];
short int gyro[3];
short int temp;

void setup() 
{
  Serial.begin(115200);
  Serial.println("I2C Initialize.");

  //I2Cの初期化
  Wire.begin();
  Wire.beginTransmission(MPU6050_ADDR);

  //MPU6050の動作をスタート
  Wire.write(MPU6050_POWER);
  Wire.write(0);
  Wire.endTransmission();
}

void loop() 
{
  //約60fpsに抑える
  delay(12);

  //AXから連続する14バイトのデータをリクエスト
  Wire.beginTransmission(MPU6050_ADDR);
  Wire.write(MPU6050_AX);
  Wire.endTransmission();
  Wire.requestFrom(MPU6050_ADDR, 14);

  //データの取得開始、加速度センサの値を受信(2バイトで来るため、先頭8ビットを上位にシフトして合計)
  for (int i = 0;i < 3;i++) acc[i] = (Wire.read() << 8) | Wire.read();

  //温度センサを受信(今回は使わないが、順番に流れてくるので受信する)
  temp = (Wire.read() << 8) | Wire.read();

  //ジャイロセンサの値を受信
  for (int i = 0;i < 3;i++) gyro[i] = (Wire.read() << 8) | Wire.read();

  //受信結果をシリアルで表示。TAB('\t')で区切ると、色分けされたグラフとして表示される
  for (int i = 0;i < 3;i++) Serial.print(String(acc[i]) + '\t');
  for (int i = 0;i < 3;i++) Serial.print(String(gyro[i]) + '\t');
  Serial.println("");
}

モニタ/プロッタで確認

  • シリアルモニタでは、タブ区切りの数字として表示される
     
  • シリアルプロッタに展開すると、色分けされたグラフとして見える

graph

プログラムが無事アップロードされたら、シリアルモニタでデータを確認します。
USBからそれぞれの値がタブ区切りで送信されるのが確認できると思います。

タブ区切りで見ることで簡単な時系列の値の変化を読み取りやすいというのもありますが、こうして書いておくとシリアルプロッタの画面で見た時に色別で表示されるのでとても分かりやすくなります。

通信とケーブル

  • データをやり取りする方法
このようにハードウェアを扱っていくと、Arduino<->PC間やArduino<->モジュール基板間のように、2つの機器の間で情報をやり取りするということがよくあります。今回はUSBケーブルとジャンパーピンを使って通信しましたが、これもやりとりする情報の内容や、やりとりする2つの機器の距離など条件によって使うべき通信方式・ケーブルやコネクタの選択肢がいろいろと変わってきます。

このあたりは展示や実験装置を作る上でかなり重要なトピックなのですが、電子工作関連の情報の中では少ない印象があったので、このあたりまとめつつ解説していこうと思います。

通信する時に決めること

  • どんな伝え方をするか (プロトコル/Protocol)
  • どんな端子を使うか (コネクタ/Connector)
      
  • どんな線材を使うか (ケーブル/cable)
まず何らかの機器同士でやりとりする時に何を決める必要があるかという点ですが、大きく3つ「プロトコル」「コネクタ」「ケーブル」に分類することができます。

伝え方「プロトコル」

  • Arduinoとパソコン:RS-232C・USBシリアル・TCP・UDP…
     
  • Arduinoとモジュール基板(基板同士):SPI・I2C・UART
一つ目の伝え方「プロトコル」は、誰と誰が通信するか、どんな内容をどんな速度でやりとりするかによって選択肢が決まってきます。お互いがソフトウェアで対応するプロトコルを使う必要があり、今日Arduinoとモジュール間でやりとりしたのはI2Cという規格です。モジュール基板はI2CかSPIに対応していることが多いです。

つなぎ方「コネクタ」

mixer

  • 必要なピンの数
     
  • 誤挿入の防止
     
  • 抜き差し頻度・環境に求められる耐久性
まず一つ目のコネクタは、デバイスの出入口にあたる部分です。PCだとUSB端子や有線LANポートがあったり、オーディオだとXLR端子やフォン端子、フォンにも3.5Φや6.3Φといった大きさ違いの物もあると思います。

先ほどジャンパーピンでセンサーとArduinoを接続したように、極端な話電気的に繋がってさえいれば通信はできます。しかし、頻繁に抜いたり差したりする必要が出てくると、3本も4本も毎回場所を確認しながら抜き差しするのは面倒です。そこでこういったコネクタを使うと、抜き差しの作業を効率化できる上、間違ったピンにつないでデバイスを壊したりするという事故も防止することができます。

伸ばし方「ケーブル」

  • 伝送距離が延びる程、ノイズの影響を受けやすい
     
  • ツイストペアやシールドはノイズ対策になる
  • 数が増えてくると、美観的なところも気になってくる

cables

ある程度伸ばす距離が伸びてくると、ケーブルにも気を使ったほうがよくなってきます。
これはノイズの影響を受けやすくなってくるからで、センチメートル単位であれば電子工作用の導線で事足りますが、長くなってくると信号の種類に応じて、シールドされているケーブルを選ぶ必要が出てきたりします。

簡単なケーブル作りの例

  • JST XHコネクタ
     
  • 入手性が良く、メス端子は基板に直接取り付けられる
最後に、よく使うケーブル作りの例を紹介します。
以前モーターを制御する仕事でユニットを作った際に作ったケーブルの例です。

コネクタは基板用のコネクタというのが色々ありますが、JSTというメーカーのXHコネクタを使いました。アマゾンや秋月で購入できるので入手性がよく、ユニバーサル基板にも直接はんだで取り付けられるのでよく使っています。お気に入りのコネクタをストックしておくと便利です。

ケーブル

  • ミスミで購入(個人で買うならモノタロウやオヤイデ)
  • AWG22の2芯・3芯を使用
ケーブルは柔らかくて取り回しの良い、PVCで被覆されたロボットケーブルを使っています。銅線の太さでよく使われるのがAWGという規格ですが、XHコネクタであればAWG22がちょうどよい太さなので、AWG22の2芯・3芯ケーブルを使っています。

私の場合事業者が使えるミスミという販売サイトを使っているのですが、学生の皆さんはモノタロウや実店舗のあるオヤイデ電気を使うのが良いでしょう。

圧着して、ケーブルを作る

  • 圧着工具で、端子とケーブルをつなぐ
     
  • ケーブルははんだ付けでは作らない
コネクタとケーブルをバラバラで買ったら、この二つを必要な長さでつないでコネクタ付きのケーブルにします。
端子の金具で、中の銅線と被覆をしっかり掴むように変形させて合体させます。引っ張ったら抜けてしまいそうにも感じますが、この手のコネクタは接続部分に力がかかるので、はんだ付け等でつけてしまうと金属疲労を起こしてすぐ切れてしまうので、しっかり力を入れて圧着した方が丈夫になります。

メス端子(レセプタクル)は、基板にはんだ付け

XHコネクタはピンの間隔が2.54mm(0.1インチ)ピッチになっているので、ユニバーサル基板にもそのままはんだ付けしてしまうことができます。はんだ付けすればあとは差し込めばカチッとしっかりロックされるので、ジャンパーピンなどを使うよりも安心感のある結線が可能になりました。

課題と今後の講義のためのアンケート

基礎的な知識の紹介をしてきたので、徐々に具体的な実例などをやっていこうと思っていますが、シラバスの内容をどのくらいの割合でやるか、課題どうするかなどをちょっとアンケートを元に計画を練っていきたいのでGoogleフォームのアンケートにお答えいただけると助かります。聴講の人も是非!