2014年7月22日火曜日

半固定抵抗を使ってみる(回路図も書いてみた)

Arduinoエントリーキットについてきた部品で、まだ使っていないものが以下の2つ。
  • 半固定抵抗 10kΩ
  • 温度センサー

ついてきたものは使ってみよう!ということで、まずは半固定抵抗から。
半固定抵抗の調節に合わせて音の調子が変わるというものを作ってみます。作ったものはこんな感じ。


半固定抵抗

これです。

三本ある足の真ん中にかかる抵抗が上のつまみに連動しています。

回路図

配線はこんな感じ。
写真だけだとわからない、、、と今更ですが回路図を書いてみようと思い立ちました。

調べてみると、Fritzingというツールが使いやすそうなのでこれを使いました。
以下のようにブレッドボードのイメージが出てきて、そこにパーツを置いて描けます。Arduino自体ももパーツとしてあるのが便利。
これを元に整形して回路図を描けます。
上と同じですがエクスポートした回路図がこれ。簡単に描けて便利ですね。

スケッチ

スケッチはここでコミットしています。
TDDでかいてみました。#ifdefで実機に出力/入力する関数をラップしてテストするようにしました。toneW()やanalogReadW()などです。うまくラッパーをまとめていけば、TDDもしやすくなると感じました。というか、まとめないとコードが汚くなりそう。。。


次は温度センサーです。


2014年7月18日金曜日

ArduinoUnitでTDDを試してみる

Arduino開発でのTDDについて少し調べてみましたが、C/C++でやるというのが多いようです。Arduino IDEは、スケッチをC++に変換してビルド、実機へ転送する仕組みになっているので、そこを使うようです。TDDのサイクルを早くするためには、実機への転送時間とかを考えるとC++でやるのがいいのかもしれません。
とはいえ、スケッチでできるユニットテストのフレームワーク「ArduinoUnit」もありました。手軽にやるにはこちらのほうがよさそうなので、これを試してみることにします。

ArduinoUnit

ArduinoUnitは、Arduino向けのユニットテストのフレームワークです。
以下の環境で試してみます。
  • Arduino UNO Rev.3
  • Mac OS X 10.9.4
  • Arduino IDE 1.0.5

準備

  1. Githubからクローンしてきてます。ZIPファイルでダウンロードしてもかまいません。
  2. srcフォルダをArduinoUnitとリネーム、もしくは別フォルダにコピーします。ここでつけた名前が、Arduino IDEで表示されるライブラリ名になります。
  3. Arduino IDEで、スケッチ -> ライブラリを使用 -> Add Library...をクリックして、ダイアログで先のフォルダを選択します。
    すると、ライブラリとしてArduinoUnitが追加されます。
    また、Arduino Libraries Directoryに選択したフォルダがコピーされます。GithubのREADMEでは、まずArduino Libraries Directoryにフォルダを作るとありますが、選択すればコピーされるので不要でした。
    ちなみに、私の環境では、~/Documents/Arduino/librariesにコピーされました。

サンプルを動かす

READMEのGetting Startedにあるサンプルを動かしてみます。
新規のスケッチにコピペしてArduinoに転送、シリアルモニタを開くと以下のように出力されました。
結果が2回出力されてます。頭の方はなんか変ですし。。。転送とシリアルモニタを開くタイミングとかかなと思い、loop()のテスト実行前にdelayを入れたらきれいに出ました。
あとで気づいたんですが、シリアルモニタを開くたびにテストが実行されるようです。delayがない状態でもシリアルモニタを再度開くと、正しく結果が出力されました。

やってみる

TDDでコードを書いてみました。
https://github.com/two-pack/ArduinoExample/tree/master/ArduinoUnitExample
コミットのここからここまでで、細かくコミットしています。

  • LEDを点滅させるコードを書いてます。簡単な例なので直接ピンの状態を見たりしています。センサーが絡んだりしてくるとそうもいかないので、実機に絡む関数をラップしたりしないとダメそうです。C++でやる場合は、モックのライブラリもありそうです。
  • テスト用のソースを分けて、setup()とloop()を持つソースでは#define、#ifdefでテストとプロダクトの場合分けをしました。テスト用のソースを消せば、プロダクトのコードだけをビルドできるはず。
  • 実機への転送時間とシリアルモニタを開くのにかかる待ち時間は、やっぱり気になりました。特にシリアルモニタが転送時に一度閉じてしまうのが邪魔です。転送はサイズが大きくなるともっと気になるかな。
  • やっぱりこういうのがあるのはいいです。C++を持ち出すほどのスケッチを書かないなら、ArduinoUnitである程度割り切りながらテストを書いていくのもいいと思いました。

2014年7月17日木曜日

「Arduinoをはじめよう」ではじめよう(4)

第6章をやってみました。ここまでやってきたことを組み合わせて、3色のLEDを混ぜたランプをつくるものです。
PCでProcessingを使ってWebから情報を取ってきて、それを元にシリアルでArduinoに色を伝えるという仕組みです。
ランプになってませんが、こんな感じになりました。

これでひと通り読み終わりました。
巻末に付いているリファレンスをざっと読んでいて、tone関数attachInterrupt関数が気になりました。エントリーキットに圧電スピーカーも付いていたので、音を出してみることにしました。ソースはこちら

tone関数は、指定した周波数の矩形波を出す関数です。1行書くだけで、音が出ました!
tone(SPEAKER, scale[i]);

attachInterrupt関数は、割り込みの関数です。タクトスイッチで音を止めたり出したりするのを割り込みでやってみました。
attachInterrupt(SWITCH, stop, RISING);
と、SWITCHで指定したピンがLOW -> HIGHの場合にstop関数を呼び出すようにしました。4章ででていたバウンシングなのか、連続して割り込みが出るケースが結構ありました。delayを挟んだりしてみたのですが、うまく改善できず。。。。こういうのはループの中でやるべきなのかな?

実際に動かしてみて音が出たところです。

2014年7月15日火曜日

「Arduinoをはじめよう」ではじめよう(3)

5章の残りです。

プッシュボタンの代わりに光センサを使う

タクトスイッチの代わりに、光センサ(CdSセル)を使ってみました。センサを覆うとLEDが消えました。

アナログ入力を使って光量によってLEDの明るさを変えるのもできました。ANALOG INにつないでいます。

シリアル通信

ここでシリアル通信を行って、ArduinoからPCにアナログ入力の数値を表示するコードがでてきます。
Serialオブジェクトが用意されていて、printlnメソッドで簡単に出力できました。ここまでデバッグの方法は出てきていませんが、IDEで特別な機能もないようなので、これを使ってデバッグする感じでしょうか。
IDEのシリアルモニタから、以下のように出力されている結果を確認できます。

モータや電球などの駆動

私の買ったエントリーキットには、この項で説明されている部品は含まれていませんでした。訳注にある部品とかは検索すると通販で買えるようです。というわけで、実際にやってみていません。
Arduinoのピンからは20mAまでしか出せないので、モーターなど大きな電流が必要なものは動かせないとのこと。本ではVin端子から電源をとってMOSFETというトランジスタでON/OFFを制御するとあります。わからない・・・・全然わからない・・・・ということで検索したら、以下でわかりやすい回答がありました。
Vinについて

また、検索していてトランジスタで電流を増幅して動かすというサイトがありました。う〜ん、難しい。。。。
Arduino でモータを動かす [Arduino]

「Arduinoをはじめよう」ではじめよう(2)

5章の「PWMで明かりをコントロール」です。

自前(?)でPWM

delay関数を使って明るさを変える話でパルス幅変調の説明があります。実際にサンプルでやってみたのですが、50%とか25%とか書いてあるけど、いまいち明るさが変わっているのがわかりづらい。。。5%とかだとわかりました。
2つ並べればわかるかな?と思い、並べてみました。スケッチはこちら

結局あんまりわからず、5%の写真になりますw

PWM

本に従って、ArduinoのPWMが使えるピンでもやりました。私の買ったエントリーキットには本に書いてあった270Ωの抵抗がなかったので330Ωのにしました。

この抵抗はなんのためにあるのか分からなかったので、とりあえず外してみたところ、すごく光りましたw
以下のサイトで「LEDは、電流を何らかの方法で制限してやらないと、壊れてしまうというものなのです。」と書いてありましたorz 煙は出ませんでしたが。
LEDの基本 その3 制限抵抗

ただ、ここまでLEDを使う場合には直列で抵抗を挟むことはありませんでした。明るさを調整したのが分かりやすいように、LEDに流れる電圧を下げているのかなとサイトのグラフを見て思いました。あってるかな?

組み合わせ

ボタンとPWMの組み合わせてみるところがあります。
答えを見ずに組み合わせたものを作ってみました。単純にスイッチを押している間、明るさが変化するものです。スケッチはこちら


5章はもう少しあります。

「Arduinoをはじめよう」ではじめよう(1)

「Arduinoをはじめよう」を読みながら、経過を記録していきたいと思います。
本に書いてあるソースを載せるのはちょっと・・・なので、読んだ内容を参考にして自前でもここで書いていきたいと思います。

前回、LEDをつけることができました。次は「プッシュボタンを使ってLEDをコントロール」です。

タクトスイッチ

以下のようにしたところ、スイッチにかかわらずLEDが点きっぱなしになりました。。。

何が悪いんだろうといろいろ試した結果、タクトスイッチの向きが問題でした。上は横向きでしたが正しくは縦に付けないとダメでした。
以下のサイトでタクトスイッチについて詳しく書かれていました。縦方向につながっているんですね。なので横につけると、常につながっている状態になっていたということでした。
スイッチの入/切でLEDを点灯させます

というわけで、こんな感じでつなげてスイッチを押すとLEDが点くようになりました。

プルアップ抵抗

上の回路でわからなかったのが、なんで抵抗をつけるのか?です。いろいろ調べてみたところ、おそらくスイッチがオフの時の電圧を安定させるためのプルアップ抵抗というものだと思います。以下のサイトがわかりやすかったです。
第4回 プルアップ・プルダウン抵抗

こういったことは、「Arduinoをはじめよう」では(今のところ)触れられていないため、図を見ながらそういうもんだと組んでみる感じです。
出来る限り調べてみたいですが、取っ掛かりが難しい。。。

ボタンでLED

上の回路でのソースはこんな感じ。
本とは違って、LED操作の部分を別ファイルにしてみました。同じフォルダにあるファイル(IDE上ではタブ)の定義もIDEで自動的に読まれます。

さらにボタンを押すと、
赤 → 緑 → 両方 → 消灯
という順番で点いたり消えたりするように回路とスケッチを作ってみました。

ここまでで、4章はおしまい。


2014年7月14日月曜日

Arduinoを買いました

Arduino UNOを買いました。右も左も分からない状態なので、合わせて入門書も購入。

 


中身はこんな感じ。

本を読みながらMacにUSBで接続。「新しいネットワークインタフェイスが検出されました」とでるとありましたが、OS X 10.9.3では何も出ず。
そのまま、4章の「LEDを点滅させる」に従って、10L程度のコードを書いて転送すると点滅しました!まずは第一歩!
参考にしながら点滅のタイミングを変えるようなソースを書いたのでこちらに登録しました。

2章の「Arduinoの流儀」では、「We Love Junk!」という項がありました。
ジャンクを買ってきてArduinoと組み合わせて何か作れたら面白いですね。

RedmineプラグインをGitHub Actionsでテストする

Redmine Advent Calendar 2019 の Qiita で書きました。追っかけで もう一つ 。 Travis-CIで行っていたRedmineプラグインのCIを、GitHub Actionsに変更したものです。 GitHub Actionsをやってみようという...