2017年1月31日火曜日

【Tips】ArduinoとPWM

LEDの明るさを変えたりサーボモーターに角度の信号を送る時、PWMというものを使います。 Arduinoを使ってDIYをするときに避けては通れない道なので、簡単にまとめます。


PWMとは


PWMとはPulse Width Modulationの頭文字を省略した略語で、パルス幅変調という意味です。 平均電圧を変化させることで0Vと5Vしか出力できないコンピュータで1Vや2.5といった電圧を出すために使います。


仕組み


ArduinoでdigitalWrite()関数を使うとき、ピン番号を指定してHIGHやLOWと書きますが、これは電気的には5Vと0Vです。 よくコンピュータの世界は1と0でできていると言われますが、電気的に言えばコンピュータは1を5V、0を0Vとして動作しています。 逆に言うと、1Vや2.5Vのような中途半端な電圧を使うことはできません。

しかし、LEDの明るさを変えるためには電圧を変化させる必要があります。 昔、理科の実験で豆電球を光らせたことがあると思いますが、豆電球は電圧を高くするほど明るく、電圧を低くするほど暗く光ったはずです。 LEDにも同じことが言えます。

そこで必要になるのが平均電圧という考え方です。 時間あたりに5V(HIGH)になっている時間を1秒間5Vを出力すれば平均電圧は5Vとなり、0.5秒間5Vを出力して0.5秒間0Vを出力すれば平均電圧は2.5Vになります。 下の画像では1秒間うち0.5秒間5Vを出力したものと、1秒間のうち0.2秒間5Vを出力した場合のグラフを示しています。


LEDを点滅するスケッチを描いてみると、平均電圧が2.5Vになる方が平均電圧が1Vの時よりもLEDがよく光ることがわかります(時間を1秒にすると点滅してしまうので、5ミリ秒くらいに調整してください)。

つまり5Vと0Vを切り替えることで電圧が変わっているのと同等の効果を得ることができます
そして、5Vになっている時間のことをパルス幅といい、この幅を変えることを変調と言っています。 これがPWMという名前の由来です。


デューティー比

先の画像の電圧のグラフでは、5Vにしている時間と0Vにしている時間が変わると平均電圧が変わることが分かったはずです。 この時間の比をデューティー比と言います。 平均電圧2.5Vであればデューティー比は50%、平均電圧1Vであればデューティー比は20%です。


ArduinoでPWMを使う


一定時間ごとに5Vと0Vを切り替えることで、電圧を変えるのと同等の効果が得られることが分かりましたが、loop()関数の中でいちいちdigital(10, HIGH)とかやるのは面倒です。 また、Arduinoに2つLEDを繋いで、別々の明るさにしたい時にはさらに面倒なことになります。 そこでArduinoにはPWMの機能を簡単に使えるようにした関数が用意されています。

analogWrite(10, 127)

これは10番ピンにデューティー比50%のPWM信号を出力するという意味です。 オシロスコープを使って波形を見るとArduinoが5Vと0Vを勝手に切り替えてくれているのが分かります。 この関数では、デューティー比0%から100%を0〜255の数字に割り当てています。つまり、数字が大きいほど平均電圧が高くなり、LEDを繋いでいればLEDがより明るく光ることになります。

PWM機能が使えないピンがある

便利なPWMですが、実は使えるピンの番号と数が決まっています。Arduino Nanoでは下の画像のPWMと書かれているD3、D5、D6、D9、D10、D11の6つのピンでしかPWMを使うことはできません。



2017年1月30日月曜日

【Tips】Arduino Nanoで測距センサーを使う方法

Arduino Nanoで超音波測距センサーHC-SR04を使ってみようと思います。

超音波測距センサーとは

超音波測距センサーはソナー(Sonor)とも呼ばれる部品です。スピーカーから超音波を飛ばし、物に当たって跳ね返ってきた超音波をマイクで拾うことで距離を測ります。

音は340[m/s]で進むので音を出してから音を拾うまでの時間を計れば音の進んだ距離がわかるという仕組みです。




回路図


回路を次のように接続します。5Vの位置が分かりにくいですが間違えないようにしてください。



ちなみにArduino Nanoのピン名は以下のとおり。




プログラム



説明


31行目

pulseIn()関数はピンの入力がHIGHかLOWになっている時間を返す関数です。上のプログラムではpulseIn(echo, HIGH)としているので、echo(D11)ピンがHIGHになるとHIGHになっている時間を計測してマイクロ秒で返してくれます。

37行目

この行では距離を計算しています。単位変換を行っているので謎の数字が入っていますが、本質は単純です。




このことを念頭に置いて時間と距離と速さの関係を考えてみます。音速は340 [m/s]で一定なので音の移動時間が判れば、音の移動した距離が分かることになります。



プログラムではduration/2となっていますが、これは距離を半分にするためです。音はスピーカーから出て壁に当たり、マイクに入るという経路を移動しているため、音が移動するのにかかった時間は実際には往復時間となるため半分しているわけです。


動作確認


測った距離を表示するためのディスプレイがArduino Nanoには無いので、今回のプログラムではシリアル通信を使ってコンピュータにデータを送っています。Arduino IDEにはシリアル通信で送られてきたデータを表示するためにシリアルモニタという機能が付いているので使ってみます。Arduino IDEのウィンドウの右上(下の画像の赤丸のところ)をクリックすると、データが表示されると思います。



以上です。訂正等は下のコメント欄へどうぞ。

2017年1月27日金曜日

【Tips】タイトルバーの無いアプリケーションにキー入力をする方法



公開した『Aoica's Nihongo Tool』の製作にあたって、タイトルバーの無いウィンドウを作成したところ、Storyboard上でViewに配置したNSTextFieldにどうやってもフォーカスを合わせることができない(入力できない)という問題に突き当たりました。

ボタンは押せるのでウィンドウはアクティブであろうという仮定の元、調べた結果、canBecomeKeyというBOOLの変数がtrueだとキーウィンドウ(キー入力を受け付けるウィンドウ)になるということが分かりました。


問題点


タイトルバーの無いウィンドウにキー入力をすることができない

押せないNSTextField


解決方法


NSWindowのサブクラスMyWindowを新たに作成し、canBecomeKey: BOOLのgetメソッドをoverrideし、常にtrueを返すようにすることで解決しました。もっと美しい(正しい)やり方があればコメント欄で教えてください...


【Tips】Raspberry PiでArduino IDEを使う




最近はコンピュータ学習にRaspberry Piを使うみたいですね。
部活の1年生がRaspberry Pi 3を持っていてビックリしました(講義で使うらしい)。
Raspberry PiでArduino IDEを使うにはどうしたらいいのか、調べたのでメモします。


やりたいこと

  • Raspberry Pi(Raspbian OS)でArduino IDEを使う。
  • 中華製Arduino互換機を接続する。

インストールのやり方


Arduino IDEは非常にシンプルにインストールできます。

  1. インターネットにつなぐ
  2. コンソールでsudo aptitude update
  3. コンソールでsudo aptitude install arduino
  4. 左下のメニューにArduino IDEが追加されている
以上。

Arduinoを入手する


いくらArduinoが安いとは言っても、Arduino Unoの純正は3000円以上するのでたくさん買うには向いていないです。そこでArduino Nanoの中国製互換基板を使うことになりました。


相変わらずの価格


Aliexpressで1つ$2.19 US(300円しない程度)で購入できました。
Freeshippingと書いてあれば送料無料、Estimated Delivery Timeは配送時間を示してます。
いくら安くても評価が低いお店から買わないようにしましょう。


中華製Arduino Nanoの問題点?


Arduino Nanoに限らない話ですが、新しいデバイスを接続する際にはドライバが必要になります。ところが、このArduino Nano互換機はCH340(公式はFTDI)という公式とは違う中国製ドライバが必要になります。ダウンロードすると当然のごとくソースコードとMakefileが入っているのでLinux初心者にはきついかもしれません(Raspberry Piでは上記インストールの過程で勝手に入ったっぽい)。

ちなみに公式のダウンロードページには古いドライバは置いていないので、古いMac(OSX 10.8など)でドライバをインストールしようとしたら、ネットを探し回るハメになりました。

Aoica's Nihongo Tool 1.0(α版)



最近再びMinecraft熱が再燃して、友人と身内のサーバーで遊ぶようになりました。Macで日本語入力するためのツールが無くて不便なので勉強も兼ねてツールを作成しました。

名付けて『Aoica's Nihongo Tool』です。バージョンは1.0αとしました。是非使ってください。ダウンロードリンクは一番下にあります。バグの報告はコメント欄にお願いします。


スクリーンショット





設定の仕方


この設定をしないとtまたは/キーに反応しない、もしくは起動できません
まず「システム環境設定」アプリケーションを開きます。



「セキュリティとプライバシー」をクリックします。



「一般」タブの「すべてのアプリケーションを許可」(赤丸の所)をクリックします。



「プライバシー」タブをクリックし、アクセシビリティから「Nihongo Tool」(赤丸の所)にチェックを入れます(一度起動しないと表示されないかもしれないです)。

以上で設定完了です。



Aoica's Nihongo Tool 1.0 ダウンロード
対応動作環境OSX 10.9〜