Soraken’s Style

つれづれ

LED照明の制御(2)

 色々思うに任せてやっていると書くことが変わってきたりして、なかなか記事にまとまりませんね。

 

 前回のお話は「LED照明の制御に至るまでの事前調査」的な内容でした。

 

 一般に、従来の白熱球と同じソケットに挿して使用するLED電球はAC100Vの交流入力に対応したもので、LEDのユニット自体に交流から直流に変換する機能を内蔵しているので、ここで言う調光には向いていません。調光するには交流電源自体を制御できる装置を用意するか、LED照明に(何らかの別の信号を入れてやることで)調光できる機能が備わったものを使う必要があります。

(例:

LDA3N-G-3T3・LDA4L-G-3T3 商品詳細|LED電球|LED照明|アイリスオーヤマ )

 

 一方、店舗や家屋の天井に嵌め込んで使われるようなダウンライトなどのLED照明では、LED照明そのものは直流入力で、専用の直流電源と組み合わせて使用するタイプがあるようです。(例:

LEDダウンライト プレーン(一般タイプ)| 店舗用照明器具 | Panasonic )

 

 調光タイプのLED照明について更に調べてみると、その制御方法には、大きく2つの方法があって、電圧をアナログ的に制御するか、デジタルで制御するかのようです。一般に市販されているLEDで電圧をアナログ制御するタイプはあまりないようです。

 デジタルで制御するタイプには、更に方式があって、PWM制御信号を(調光に対応した直流電源に)入力して制御する方式や、メーカ毎に異なる専用のコマンド信号で直流電源を制御するタイプ、オープンな規格になっているDALIという方式で制御するタイプがあるようです。DALI(Digital Addressable Lighting Interface)規格についてはあまり情報が得られていなくて、ちゃんとした規格書を読まないとわからないのですが、DALIに対応した専用の制御装置が必要になるようです。簡単な技術の紹介がこちらにありましたので参考になると思います。

 

 長々と世間の様子を書いてみましたが、結局DIY的に簡単にマイコンなどでプログラムを書いて制御しようと思うと、PWM制御する方が何かと楽そうです。そこで、今回は、こちら(ライティング創さんのダウンライト)のLED照明を事例にして、マイコンでLED照明を制御する方法について検討してみました。

 

 今回やりたいことは、壁のスイッチなどでOn/Offしたり、ボリュームで明るさを調整したりといったことではなく、「プログラムで自動的に明るさを変化させていく」です。そのための制御装置も市販されてはいるみたいですが、何かとお値段がかかります。そこで、ここでは、ライティング創さんのダウンライトをプログラム調光することを目指して、安価なマイコンPWM制御信号を作ってやることで制御する方式を考えました。簡単なシステム構成を示します。

f:id:soraken:20210704145410p:plain

今回はライティング創さんのダウンライト(SDL8002E)と調光タイプの電源(MU015S)を使用しました。この電源はPWMまたはDALI信号が入力されると、その信号に応じてLED照明の明るさを制御する仕組みを持っています。上図でPWM+/-( 2ピン端子)と示される端子に、PWM信号かDALIのシリアル信号を入力すると、電源ユニット側で自動的にPWMかDALIかを判断して対応してくれます。ちゃんとしたオフィスビルなどの調光システムなどであればDALI方式を使う方が良いのでしょうが、DALI方式について調べてみると、信号フォーマットの時間制約が結構厳しいようで、μ秒単位の制御を必要とするので、今回やろうとしているマイコンによる簡易制御ではより簡単なPWM信号による制御を行います。

 

調光タイプ電源ユニットMU015Sの仕様書によると、PWM調光信号の仕様は以下のようになっていました。

 周波数:     300Hz 〜 1.5kHz

 High Level電圧: 9.5V 〜 22.5V

 Low Level電圧: -6.5V 〜 6.5V

 消費電流:    2mA

 

このことから、電源ユニットに入力するPWM信号は12V、1kHzくらいにしてみることにしました。今回は、micro:bit(マイクロビット)というマイコンを使います。

micro:bitは、もともとイギリスのBBCという国営放送が子供のIT教育向けに開発したプログラミングキットで、プログラムをweb上の開発環境でScratchのようにブロックを組み合わせることで簡単に作れることが受けて、今では色々なところで教育用やDIYに使われているようです。

f:id:soraken:20210704151439j:plain

Amazonでは3000円前後で売っています。2021年現在、開発環境はmicrosoftがweb上で無料で提供していて、上記のマイコンボードとパソコンを繋ぐUSBケーブルさえあれば、すぐにプログラミングすることができます。

makecode.microbit.org

 割と小さめの基板ですが、意外と多くの入出力端子を持っています。端子は0V〜3.3Vのデジタル出力ですが、PWM出力できる端子もあります。 ただし、端子によっては基板上のLED制御と兼用されているものもあり、そういった端子は0V〜3Vくらいまでしか出ないものもあるようです。

 

今回はここまでで、次回から、micro:bit周りのPWM信号をLEDに渡す回路などを試してみたいと思います。

 

LED照明の制御

むっちゃ久しぶりです。

以前の投稿から、職場が変わるなど大きな変化もあって趣味のメカトロいじりが全然できてなかったので、ここらで改めて趣味を大事にしていけるよう気持ちを新たにしていこうと思っています。

 

なにせ久しぶりなので、また基本に戻って素人ネタで再開したいと思っています。

そこで選んだのは、今更ながらのLED照明の制御。以前もLEDの”Lチカ"をマイコンでやってみましたが、今回やるのは少しだけ実用的なチャレンジです。

 

例えば、ライティング創さんのLED照明やように、大光電機さんのLED照明のように、最近は光量や色調を調整できるLED照明が製品になってきているようです。今回は、このようなLED照明の明るさをコントロールするにはどうすれば良いか、というお題です。

 

ここで、以前試してきたことを振り返りたいと思います。(リハビリです)

以前の懐かしい記事でやっていた事で、LEDを光らせる回路は以下のようになっていたと思います。

f:id:soraken:20210618221033p:plain

LEDを光らせる回路

LEDを光らせる場合、電源とGND(グランド)の間にLEDを挟みますが、この時、LEDで使用される電圧を(製品によって異なりますが)2V程度としましょう。そうすると、電源が3.3Vだった場合、残りの1.3Vを使って、LED(というか回路)に流れる電流を決めてやる必要があります。やり方は割と簡単で、残りの1.3Vを電流を決めるための抵抗で消費すれば良いわけですから、例えば、LEDに20mA流したければ、

    V = IR

オームの法則を使って、

    1.3 = 0.02 x R

よって、

    R = 1.3 / 0.02 = 65 Ω

となりますね。

 実際にはピッタリ65Ωの抵抗なんてないので、例えば少し電流値が小さくなってもいいとして、100Ωで代用するとしたら、

   1.3 = I x 100

   I = 13mA

となります。これで試しにLEDを光らせてみた例がこちらです。

f:id:soraken:20210618224554p:plain

LED点灯の例

実際のLEDの両端にかかっている電圧は1.7Vでした。つまり、

   3.3 - 1.7 = I x 100

   I = 16mA

ということになります。

では、100Ωではなく、47Ωではどうなるでしょうか。

f:id:soraken:20210618230437p:plain

LEDを光らせる例(47Ω)

先程の時より少し明るくなっているように思います。

注目すべきは、47Ωの時のLEDの両端の電圧もほとんど変わらず1.7Vくらいでした。つまり、

   3.3 - 1.7 = I x 47

   I = 34mA

で、先ほどに比べて2倍程度の電流が流れていることになりますが、それでもLEDの両端の電圧はほとんど変わらないということです。もっというと、LEDの明るさは(LEDにかける電圧ではなく)流す電流の量によって変えられるということになります。

 

実際には、上記の例のようにLEDの明るさを変えるのに抵抗値を自由に変化させるのは(可変抵抗などを使ったとしても)面倒です。そのため、LEDに消費される単位時間あたりの電力に着目して、ある時間の中でどの程度電流を流し、残りは電流を流さないかで制御する方法が、PWM(パルス幅変調)方式の制御です。単位時間あたりの平均電流を制御してやるイメージですね。

f:id:soraken:20210618232529j:plain

PWM方式の制御

この図の例では、単位時間 = 1msec (1kHz)の中で、電流を流している時間(On時間)と流さない時間(Off時間)の割合によってLEDで消費される単位時間あたりの電力量を自由に変えることで、LEDの明るさを制御していることになります。見ての通り、Onしている時間の幅が変わっても電圧は一定で、1msec中のOnしている時間の割合で平均電流が決まるため、LEDの明るさを制御してやることができる様になっています。

 

ではここまでの復習(振り返り)を踏まえて、ここから最初のお題に戻りましょう。世の中で部屋の天井などに取り付けて使われるような一般的な照明向けのLEDはどのようなものでしょうか。一例ですが、ライティング創さんの天井埋込型のLED照明の仕様書を見てみると、概ね以下のような内容になっていました。

 

f:id:soraken:20210618234828p:plain

LEDの回路

特徴は、

 ・AC100Vに繋ぐために、直流電源装置を使って、AC100VからDC?Vに変換して使う

 ・LED照明そのものは定電流で駆動されるようになっていて、直流電源装置に何らかの明るさ調整情報を入力することによって、LEDに繋がっている直流回路をPWM制御している。

 ・LEDそのものは定電流駆動なので、直流電源装置が定電流制御できるようになっていて、LED照明を直列しても定電流制御できる仕組みを持っているものが多い。

といった感じでしょうか。

 

さて、ここで疑問が湧いてきます。直流電源装置がLEDをPWM制御することは分かったのですが、どのくらいの明るさにすれば良いかという情報 = 「何らかの明るさ情報」は具体的にはどんな情報を入れれば良いのでしょうか。

 

 調べてみると、ここは割と各社さまざまあるようですが、最近の傾向として、DALI規格というものに準拠した情報を入れてやることで、明るさを制御できる仕様の製品が多い様です。DALI規格って何? 

 

 今回はここまでで、次回、どうやってPWM制御の大元の情報を作るか、という話を進めたいと思います。

磁石とコイルの実験(3)

 あれからだいぶ時間が経っちゃったな、という状態ですが、決して忘れたりやめたわけではなく、あれこれ構想を練りながら準備に時間がかかっていました。今回は、磁石とコイルの実験を久しぶりに更新します。

 

 実は、1ヶ月程前、我が家にもようやく3Dプリンタがやってきました。

f:id:soraken:20160504111129j:plain

f:id:soraken:20160504111214j:plain

 この3Dプリンタ、非常に面白くて、いろいろ出来そうなのですが、そちらの話はまた別の記事で書くとして、今回は、この3Dプリンタで作った部品を使った磁石とコイルの実験のその後を、例によってまったり書いていこうと思います。

 

 さて、前回は結局のところ電池からコイルに電流を流して、生まれた磁界と磁石の間の力で自分自身を動かすことで電車のように移動していくというものでした。ですので、磁石とコイルがあって、コイルに電流が流れていれば、何らかの力が発生するはずですよね。

 ということで、まずはごくシンプルにコイルと磁石を相対させてどんな風に力が働くか見てみたくなりました。そこで、こんな感じのものを作ってみました。

f:id:soraken:20160504112727j:plain

 両端(この図で言うと上下の丸いディスクの真ん中)に磁石を置いて、その間にボビンが4本の棒に沿ってスライドする仕組みです。絵には描いてありませんが、ボビンには銅線を巻いてコイルにします。上下の磁石用ディスクとボビンを3Dプリンタで作って、プラモデル用の棒4本と一緒に組み立てました。

f:id:soraken:20160504113623j:plain

 大したものでもないので、追試をする方もいないとはいますが、一応、それぞれの部品情報と3Dプリンタで製作した部品のデータをアップしておきます。

 

[使用した部品]

⑴ 磁石ディスク(base_ver0.3.stl) ✖️ 2

⑵ ボビン(bobin_ver0.2.stl) ✖️ 2

⑶ 磁石(ネオジム磁石丸型) ✖️ 2

⑷ φ3mm x 100mm プラ棒 ✖️ 4

⑸ 0.2mm エナメル線

 

⑴と⑵は3Dプリンタで製作しましたので、カッコ内は製作に使用したSTLデータです。⑶は株式会社マグファインさんから購入したもの、φ10mm、高さ3mmの丸型ネオジム磁石です。⑷は模型店で売っている丸プラ棒φ3mmを10cmに切ったものです。⑸は0.2mmエナメル線をAmazonで購入しました。

 

とりあえず、例によって適当に組み立てて、コイルも適当に巻いて、単3電池3個をつないでみた結果がこちらです。

まぁ、当たり前っちゃあ、当たり前ですね。メカ的にはかなり適当で、プラ棒とかも本当に真っ直ぐなのかちょっと怪しいところがあります。実際、ボビンをスライドさせると所々コジッたりしてますので。とりあえず、3Dプリンタで作成した部品がなんとか組み立てられた事が確認できたというレベルです。

 

次から、この実験装置をもう少しちゃんと動かしてみたいと思います。

 

 

PLEN2 組み立て編(2)

前回(PLEN2 組立編(1))からしばらく経ってしまいましたが、続きの組み立てを行いました。今回は脚の組み立てです。今回も小学1年生の娘と一緒に片足ずつ組み立てました。

 

脚の部品はモモとスネなど、似たような部品(もしかして同じ部品?)があるので、向きに注意してどの部品がどの場所に着くのか考えながら組み立てた方がいいようです。

今日は、まずヒザから先に作ってみました。ヒザはモータを1つ組み込むだけです。

f:id:soraken:20160312121514j:plain

f:id:soraken:20160312121614j:plain

次はスネです。スネは、ボディとなる部品にモータを2つ組み込むだけです。 

f:id:soraken:20160312115706j:plain

モータを形に合わせてパチンというまで押し込めば良いのですが、ちょっと細い部分があるので、割れないように気をつけて押し込みます。

f:id:soraken:20160312115959j:plain

続けて、もう1つのモータも同じように反対側から押し込みます。

f:id:soraken:20160312120436j:plain

f:id:soraken:20160312120510j:plain

 前回の組み立てでもそうでしたが、見ての通り、モータの組付けにネジ止めは必要ないようようにできていて簡単に組めます。

モータがつく部分の最後はモモです。ほぼスネと同じ構造ですので、同じように組み立てます。

f:id:soraken:20160312120820j:plain

f:id:soraken:20160312120853j:plain

f:id:soraken:20160312120938j:plain

f:id:soraken:20160312121032j:plain

 ここまであっという間に作れます。今回も右脚は僕が、左脚は娘が組み立てました。ここから先は組み立てる場所を間違えないように、一度脚の部品を全部並べてみます。

f:id:soraken:20160312121329j:plain

 さて、それではひざにももを組みつけていきましょう。右脚から。

f:id:soraken:20160409120146j:plain

モータにサーボホーンを取り付けて、パーツの向きと配線の出し方に注意して嵌め込みます。この時、サーボモータの可動範囲を足を伸ばしたところから曲げたところまで動けるように角度を合わせてから組み立てると良いと思います。

f:id:soraken:20160409120311j:plain

左脚も同様に組み立てます。

f:id:soraken:20160409120422j:plain

次はすねのパーツです。

f:id:soraken:20160409120555j:plain

先程と同じように、サーボモータにサーボホーンを取り付けて、可動範囲に注意しながら組み立てます。

f:id:soraken:20160409120653j:plain

左脚も同じように組み立てました。

f:id:soraken:20160409120737j:plain

更に、足首を取り付けます。足首パーツは先程の脚の付け根のパーツと似てますので、左右を間違えないように確認しながら取り付けましょう。

f:id:soraken:20160409120906j:plain

足首は前後に動くように、サーボモータの可動範囲の真ん中で足がまっすぐになるように取り付けました。

f:id:soraken:20160409120958j:plain

f:id:soraken:20160409121111j:plain

最後に足底のパーツをとりつければ脚が完成です。

f:id:soraken:20160409121202j:plain

f:id:soraken:20160409121234j:plain

おぉ!だいぶロボットらしい感じになってきました。

ここまできたら、一気に上半身と脚を組み合わせて、ロボットの形まで組み上げちゃいます。

f:id:soraken:20160409121447j:plain

必要なパーツは上半身と脚、それに足の付け根のフランジだけですね。足の付け根のフランジだけは上半身から突き出ているサーボモータの軸にネジで固定します。

f:id:soraken:20160409121627j:plain

最後に、フランジに脚を取り付ければ、、、、

f:id:soraken:20160409121716j:plain

組み立て終了!!

 

本日は、ここまでです。次回、配線を制御基板に接続して、動作確認することにします。

 

PLEN2 組み立て編(1)

縁あって、プレンプロジェクトの方とお知り合いになり、PLEN2を組み立てる機会をいただきました。

PLEN.jp

 

PLEN2は3Dプリンターで部品を作ることができる卓上サイズのロボットです。身長は20cmにも満たないのですが、18軸自由度(間接)を持ち、様々な動きができます。

 

そこで今回は、小学校1年生の娘と一緒に組み立てを行った様子をご紹介したいと思います。PLEN2に関するより詳しい情報はプレンプロジェクトのホームページか、その他、関連するWebサイトでご覧ください。

 

f:id:soraken:20160111214309j:plain

まず、PLEN2の部品を確認です。

f:id:soraken:20160109131947j:plain

見ての通り、白いパーツが3Dプリンターで作られた部品です。下に並んでいるのがサーボモータで、全部で18個あります。中央上の基板がコントローラーで、Arduino互換です。お腹にバッテリを積むことができるようになっています。

 

さて、早速組み立てていきます。本当は、PLEN2のサイトに紹介されているマニュアルに沿って組み立てて行く方がいいのかもしれませんが、ここでは、気の向くままに組み立てて行こうと思います。

 

まず、コントローラ部を胴体部分に組み込んで行きます。何をするにもここに接続しながらの方が良さそうですので。胴体にあたる四角いパーツの背中側にコントローラ基板を取り付けます。四隅に爪がついているのでひっかけていきます。

f:id:soraken:20160111214518j:plain

今度は、同じ胴体の部分にお腹側(基板と反対側)から肩と足の付け根用のモータを組み込んで行きます。

f:id:soraken:20160111214856j:plain

上の写真で言うと、モータのケーブルが出ている方が頭側で、その両端に肩を回すためのモータの軸がちょっと突き出している状態です。また、頭と反対側には足の付け根を回すモータの軸がやはりちょっと突き出します。この写真では、モータ4つをT字型のパーツを嵌め込む事で固定しています。ここまで、ネジは一切使用しなくても組み立てられるようになっています。

 

次に、上腕部を組み立てます。当然ながら腕は2本あるので、ここからは、娘と自分で左右それぞれを組み立てて行くことにしました。まず、肩から肘の間に当たるパーツにモータを2つ嵌め込んで行きます。この時、モータのケーブルがパーツの内側に出てくるように取り付けるのがコツのようです。

f:id:soraken:20160111215453j:plain

f:id:soraken:20160111220106j:plain

f:id:soraken:20160111220438j:plain

先程も書きましたが、ここまでネジは1本も使いませんでした。モータを嵌め込むパーツが、3Dプリンタで作成したとは思えないほど、絶妙なサイズにできていて、モータを気持ち良く嵌め込むことができます。

 

次に、肘から先のパーツを組み立てます。ここにはモータはありません。

f:id:soraken:20160111221216j:plain

上の写真のように、手のようなパーツと軸受けのようなパーツを組み合わせていきます。ここでも軸受けパーツが手パーツにパチンと嵌め込まれるような設計です。

f:id:soraken:20160111221440j:plain

こんな感じ。最後に、上腕部と肘先部を組み合わせれば、片腕が完成になります。上腕部のモータの1つに、花型のパーツを取り付け、これを肘先部のパーツとはめあわせて行く感じです。腕は左右が対象になるように組み立てなければならないので、向きに注意して、組み立てます。

f:id:soraken:20160111221527j:plain

 あと、サーボモータは±70度くらいの可動範囲を持っているので、花型のパーツをゆっくりと回してそれを確かめて、ちょうど可動範囲の真ん中になるくらいで下の写真のように腕をまっすぐ伸ばした状態になるように取り付けると良いと思います。

f:id:soraken:20160111221954j:plain

腕が左右とも組み上がったら、最初に作った胴体部分に肩パーツを取り付け、その肩に腕を取り付けると上半身(顔なし)が出来上がります。肩のパーツを取り付ける時も、先程と同じように可動範囲を調べて取り付ける方がよいでしょう。ただし、肩の可動範囲はどこを中心にするかは好みかもしれません。僕は前倣えのように前に腕を上げた状態を中心にしてみました。(これだと、ほぼ上まで腕が上がりますが、逆に後ろ側には動きません)

f:id:soraken:20160111222305j:plain

f:id:soraken:20160111222655j:plain

肩のパーツを取り付ける際に、初めてネジを使いました。

最後に肩パーツに腕を取り付けます。

f:id:soraken:20160111222858j:plain

これで上半身はだいたい出来上がったかな。(モータの配線はまだですが。)

 

とりあえず、本日はここまで。(続きはちょっと時間がかかるかもしれません)

 

Trinketで模型用モータを動かす(4)

前々回(Trinketで模型用モータを回す(2))と前回の記事(Trinketで模型用モータを回す(3))で、Trinketにサーボモータをつないで動かすことができるようになりました。ここまではあまり深くソースコードの意味を理解せずにきましたので、今回から新しい事を試しながら、少しずつソースコードの意味を考えていきます。

 

今回は、「2つのサーボモータをTrinketで動かす」ということに挑戦してみたいと思います。

 

使うサーボモータは今まで通り、フタバのS3003です。これを2つ使います。今までは、少し乱暴にTrinketのUSB+(DC5V)をモータ駆動用にそのまま使っていましたが、さすがにサーボモータ2つだと電力的にちょっと不安になってくるので、今回は、サーボモータへは外部の直流安定化電源でDC5Vを供給するようにしましょう。

1つ目のサーボモータのPWM信号入力線は、前回と同様にTrinketの#0ピンに接続します。2つ目のサーボモータのPWM信号入力線は、Trinketの#1ピンに接続しましょう。

この2つを1つのポテンショメータ(可変抵抗)に応じて動くようにします。

回路図は以下の通りです。

f:id:soraken:20150830114558p:plain

回路図では漏れていますが、Trinketの電源も外部安定化電源からとりました。

 

さて、次はプログラムですが、前回のプログラムを改造して以下のようにしてみました。改造したのは、2つ目のサーボモータを追加したところだけです。

f:id:soraken:20150830115327p:plain

これをTrinketに書き込んで、動作させたのがこんな感じ。

www.youtube.com

この時、Trinketの#0ピンと#1ピンの出力信号は以下のように出ていました。

www.youtube.com

プログラムを見れば当たり前と言えば当たり前なんですが、ポテンショメータからの入力値をPWMの出力値に変換して、それをサーボ1とサーボ2の両方に出力してます。このため、オシロで診た波形はサーボ1とサーボ2で同じ形をしています。ただ、診てわかる通り、サーボ2の出力はサーボ1の出力が終わってから出力されているようです。この辺、少し改善できるといいかもしれませんね。

 

ところで、オシロの波形からわかる通り、PWM周期は10msecになっています。プログラムの中では、SIGNAL(TIMER0_COMPA_vect)関数で出力を更新しているようで、実際、

if (counter >= 10) {
  counter = 0;
  myServo1.refresh();
  myServo2.refresh();
}

 というところで、カウンタ値を10と比較していますが、これを例えば20にすると、PWMのサイクルが20msecになるようです。

このSIGNAL()関数はLoop()関数の中のどこからも呼ばれていないので、おそらく一定時間間隔で呼ばれるイベントハンドラのような物だと推定しています。カウンタ値のカウントアップが2毎なので、おそらくは2msec周期で呼ばれているのでしょう。なので、カウンタ値がそのままmsec単位の時間を表すことができて、if文で時間になったらサーボをリフレッシュすることで、出力が繰り返されていると思われます。

 

今回、サーボモータを2軸動かすことができるようになりました。ここまでくると、実際に何か形になる物を動かしてみたくなりますね。今後、具体的な何かを動かす事を考えてみたいと思います。

今日はここまで。

 

 

 

 

 

 

Trinketで模型用モータを回す(3)

前回に引き続き、RCサーボモータを動かしてみたいと思います。今回もフタバのS3003モータを動かすので、繋ぎ方やTrinketのためのAdafruit_SoftServoについては前回を参照してください。

 

今回は、RCサーボをボリュームで動かしてみたいと思います。ボリュームは以前の記事で使ったものです。ボリュームを回転させると、分圧された電圧に応じてサーボモータの角度を変えてみたい訳です。

 

回路は以下のような感じ。まぁ、シンプルですね。

f:id:soraken:20150528231512p:plain

回路図には書き忘れていますが、ボリューム抵抗は10kΩを使っています。Trinketの3V出力に片側を繋いで、反対側はGND、分圧出力を#2ピンに接続しますので、実際、1kΩくらいから100kΩくらいまでだったら特に問題ないはずです。(100Ωでもいけますが、ちょっと電流が大きくなるのでUSBのバス供給電流にあまり優しくないですね)

 

次は、プログラムですが、今回はこんな感じです。

f:id:soraken:20150528232915p:plain

analogyRead()でボリュームの分圧値を読み取って、これを0〜180°にmap()を使って変換しています。後は、変換後の値をmyServo1.write()で書き出すだけですね。それ以外は、前回とほとんど同じじゃないかな。

 

こんな感じで用意したプログラムをTrinketに焼いて、動作させた羅こんな感じです。

www.youtube.com

 あんまり精度が良くない感じですが、とりあえず動いたと言った感じでしょうか。

 

今日はここまで。

 

 

 

 

Trinketで模型用モータを回す(2)

以前模型用のマブチモータを簡単なドライバ回路を作成して動かしてみた事がありました。(Trinketで模型用モータを回す)あれはあれで面白いのですが、今回はラジコンなんかでよく使われるサーボモータを動かしてみたいと思います。

 

今回試したのはフタバのS3003というサーボモータです。いつ買ったかわからないんですが、これも我が家のジャンクの中にありました。そんな状態なので、当然、説明書とかもないので、まずは例によってグーグル先生に聞いてみました。

 - フタバ S3003

このデータシートによると、

f:id:soraken:20150512213848p:plain

まず、配線がわかります。次にデータ表から、

f:id:soraken:20150512214023p:plain

動作電圧は4.8〜6.0Vとあるので、赤い線に5V、黒い線はGNDに、そして白い線は制御信号としてTrinketに繋げば良さそうです。制御方式はPWMのようですが、よくわからないのは「1520usec Neutral」とあることですかね。動作の方向がCW(時計回り)に1520-1900usecって、どういう意味?動作角度は45度(一方向に400usecパルス移動)とあるので、±45度くらいは動くのかな?

よくわからないけど、とにかくPWMでパルスを与えてやると、ある特定の角度になるってことらしいです。

では、まずは回路から作って行きます。いつものように、Trinketをブレッドボードに挿しておいて、周りに回路を作って行きます。といっても、今回は、サーボモータをつなぐくらいしかありません。

本当は、サーボモータを動かす時は500mA以上電流が流れるのが普通だと思うのですが、今回は、サーボモータに負荷を付けないで、ただ回すだけということにして、(Trinketを含めて)全体で500mA以内に入る前提で、USBからもらった5Vで直接サーボモータを動かしてみます。

という訳で、下の図のように配線しました。

f:id:soraken:20150523205347p:plain

RC servoのところが今回接続するサーボモータです。1に白、2に赤、3に黒のケーブルを接続することになります。

 

次に、Trinketのソフトウェアです。TrinketはArduino IDEのスケッチサンプルにあるサーボ(とservoライブラリ)は使用できないようです。(参考:Trinket & Gemma Servo Control)その代わり、AdafruitさんがTrinket(とGemma)専用のサーボ用ライブラリを用意してくれていました。実際、Adafruitさんのページを見ればそのまんまなんですが、ここではS3003を動かすという事で、Adafruitさんのページの通りにやってみます。 

(ここでは、AdafruitさんのサイトからTrinket用のArduino IDE 1.6.4をダウンロードして、既にインストールしてあるところからスタートします)

f:id:soraken:20150522001210p:plain

まず、上記のAdafruitさんのページから、 「Download Adafruit_Servo library」を選択して、ライブラリをダウンロードします。

 次に、Arduino IDEがインストールしてあるところを探します。大抵は「アプリケーション」フォルダに入っていると思いますが、場合によっては違うところにインストールしているかもしれません。

 その「Arduino.app」というファイルを右クリックして、コンテキストメニューから「パッケージの内容を表示」を選択します。すると、今まで隠れていた「Arduino.app」以下のフォルダが表示されるようになりますので、表示されたフォルダ内の「Contents」→「Java」→「libraries」とたどって開いて行きます。この「libraries」フォルダがライブラリを格納しているところのようですので、ここに、先程ダウンロードした「Adafruit_SoftServo-master」をフォルダごと入れます。

 ここで、ちょっとしたトリックが必要です。「libraries」フォルダに入れておくライブラリには、名前に「-」が使えないらしいので、「Adafruit_SoftServo-master」という名前ではArduino IDEを起動した時に警告が表示されてしまいます。そこで、この名前の「-(ハイフン)」を「_(アンダースコア)」に変更しておきます。(フォルダの名前だけ)

 

この状態で、Adruino IDEを起動してみてください。警告等が表示されなければインストールが正常にできていると思います。また、Adruino IDEのメニューバーから「スケッチ」を選択して、プルダウンメニューの中から「Include Library」を選択してみましょう。ライブラリのリストが表示され、その中に「Adafruit SoftServo」とあれば、ライブラリのインストールは成功です。そのまま、「Adafruit SoftServo」を選択すると、作成しているスケッチにインクルードされます。

今回作成したスケッチはこんな感じです。

f:id:soraken:20150523215030p:plain

ソースコードを見てみましょう。

まず最初にあるのが、先程ダウンロードして組み込んだ、Adafruit_SoftServoをインクルードしている行です。

次にサーボ出力ピンを定義しています。

また、Adafruit_SoftServoクラスを持つmyServo1というオブジェクトを定義しています。(どうも、Arduinoでは、これでインスタンス化されているみたいです)

Setup()の中の最初の2行はAdafruit_SoftServoライブラリのオマジナイみたいなものだと思ってください。

その次に、myServoをまずattach(SERVOPIN1)で出力先を指定しています。

更に、myServo1をwrite(0)で原点へ移動させています。

 

loop()の方では、write(0)とwrite(180)で0度と90度に2秒間隔で移動させています。

ソースコードにも書いていますが、S3003は何故か90度動かすために180度を指定しないといけないようです。

 

最後のSIGNAL(TIMER0_COMPA_vect)関数は、Adafruit_SoftServo特有のもので、20msec毎にmyServo1の出力をリセットするためのものです。

 

このソースをコンパイルして、Trinketに書き込み、動作させたものが以下の動画です。

www.youtube.com

 見ての通り、いい加減にやってUSBからのバス供給電源でもS3003が動かせている事がわかると思います。(ただし、繰り返しますが、非常に軽い負荷の場合限定と考えた方がよいです)

 

まずは、動作確認用のプログラムという事で、非常に単純な動作になっていますが、これができれば、これからいろいろなことができるようになるはずです。

 

今回はここまで。 

 

 

 

 

 

磁石とコイルの実験(2)

 だいぶ前に試してみた(磁石とコイルの実験(1))は、ネットで見つけた実験をとりあえずやってみたという状態でした。

 せっかくやったので、前回の電車が動く仕組みをちょっと考えてみました。

f:id:soraken:20150425185923p:plain

  イメージ図では、緑色の四角が電池、水色の四角が磁石です。単4電池の+側から流れ出た電流は、+側にくっつけたネオジムを通って、ネオジムに接触している銅線(コイル)に流れます。この電流はコイルを伝ってー側のネオジムに戻ってきて、単4電池のー側に戻るというループを作っていることになります。この時、コイルに流れる電流によって、図の水色の線のような磁界が発生していると考えられます。この磁界はちょうど単4電池の+側がN極で、ー側がS極になります。電池につけたネオジムが図の下のような向きになっていると、+側のネオジムのN極と磁界のN極が反発し、左方向の力が発生します。同様にー側のネオジムのN極と磁界のS局が引きつけ合ってこれも左方向の力が発生します。このようにして、全体として左方向へのちからが働くので、電車を左方向に動かすことができると考えられます。

 

 実際上、コイルは7mくらいの長さの銅線を巻いたもので、両端で0.4Ωくらいでした。一方、ネオジムは3個重ねて0.3Ωくらいです。単純に計算すると、電池から出た電流は0.3Ω+0.4Ω+0.3Ω=1.0Ωの抵抗負荷を経由して電池に戻ってきます。(コイルの部分はもう少し少ないでしょうが)電池の電圧は1.5Vですから、単純には1.5Aくらい流れていることになります。もっとも、電池はそんなにたくさん電流を流し続けられませんので、最初に電流が1.5A近く流れた後は電池の内部抵抗分も加わって0.5Aとかそんなくらいしか流れていないように思います。

 

まぁ、いずれにしても、これで磁石付きの電池がコイルの中を走る説明がなんとなくできました。これって、結局はモータの原理ですよね。いずれこの仕組みを使って何か動かしてみたいなと思います。

 

Mac OSX上のArduino開発環境

しばらく更新が途絶えてしまいました。

いえ、いろいろやってたんですが、アップするような内容にならず、ネタをいろいろ思案してました。

 

ところで、以前(8pino - Arduino お作法の習得)でなかなかうまくいかなかった、Mac OS X上でのArduino IDEですが、最近、Adafruitさんのサイトを眺めていて、ふと、「以前やった時は確かバージョンが1.0.5だったんだけど、もしかして新しいバージョンだったらうまくいく?」と思いまして、Adafruitさんのサイトを読み直してみたところ、

f:id:soraken:20150511220421p:plain

という感じになっていて、バージョン1.6.4を試してみました。

上記のサイトから「Arduino 1.6.4 with Adafruit Boards for Mac OSX (10.7+)」を選択してダウンロード。保存されたzipファイルを解凍して、いつものようにシステム環境設定からセキュリティの設定を一時的に「すべてのアプリケーションを許可」にしてArduino.appを実行しました。

ここまではバージョン1.0.5の時と同様に無事に起動しました。

ここで、以前作成したいわゆる「Lチカ」プロジェクトを読み込んでみます。

f:id:soraken:20150511224222p:plain

ここで、プルダウンメニューの「ツール」から「ボード」をたどると、ちゃんとAdafruit Trinket 8MHzがあるので、これを選択。

f:id:soraken:20150511224723p:plain

同様に、「ツール」から「書込装置」をたどって「USBTinyISP」を選択します。この状態でTrinketをつないで赤LEDが点滅している間に、IDEの書き込みボタンを押してみると、、、。

f:id:soraken:20150511225254p:plain

いえい!「マイコンボードへの書込みが完了しました」と出て、TrinketのLEDがプログラム通りに点滅しました!(あ、でもなんだか変なエラーが出てますが)

以前のバージョンでは書込みができなかったので、前よりも断然前進です。

 

という訳で、今までWindows PCを使って開発してましたが、これからは最初の頃の目標だったMac OSXで開発を進めたいと思います。

 

Mac OSXをご使用の皆さん、Arduino IDEは1.6.4がおすすめみたいですよ。