2014年8月7日木曜日

Arduino Ethernet Shieldを使ってみた

ArduinoのEhternetシールドを買ったので使ってみました。以下で安いものがあったので購入しましたが、ピンががつんと曲がった状態で届きました。動いたので良かったですが。。。
(Arduinoのための)用のイーサネットW5100シールド(マイクロSDカードをサポート)
Arduino本体と重ねるとこんな感じ。

やってみたこと

Ethernetシールド用のライブラリが用意されています。
Ethernet library
このライブラリを使って、Webサーバーから情報を取得してLEDをON/OFFすることにします。

本当は、Travis CIの結果をLEDで表示する、をしたかったのですが、調べてみるとArduinoの要領だとHTTPSでの通信は難しいとのことで断念。。。

実装

Webサーバー側には以下のようなCGIを置きました。ledの値を0にするとLEDが消えて、1にすると点くようにします。
#!/usr/bin/ruby

print "Content-Type: text/html\n"
print "\n"
print "led:1\n"

スケッチはこちら
ライブラリにサンプルとして着いているWebClientを参考にしています。

LEDのピンは7番を使っています。Ethernetシールドが4、10〜13のピンを使っているためです。
こんな感じになりました、、、といっても普通にLEDつけてるのと変わりません。


シールドを載せてあとはライブラリを使うだけなので、簡単にできますね。

2014年7月31日木曜日

リリース:Redmine XLSX format issue exporter 0.1.0

Redmineのチケット一覧をXLSX形式で出力するプラグイン、
Redmine XLSX format issue exporter
を作りました。Plugins Directoryにも登録しました。

機能

Redmineにはチケット一覧の右下からCSVやPDFで出力する機能が標準であります。そのXLSX版です。プラグインをインストールすると、右下の赤丸部分のようにリンクが追加されます。

リンクを押すとCSVエクスポートと同じように、オプションで選択している項目を出力するか、全ての項目を出力するかを選択するダイアログがでます。また、チケットの説明をつけるかも選択できます。

あとはエクスポートボタンを押すダウンロードがはじまります。XLSXの中身は、CSVダウンロードと同等のものにある程度の書式設定(ヘッダの色、ヘッダの固定、折り返し、列の幅)がされています。

Redmine XLS Exportとの違い

Excel形式でエクスポートするプラグインとしてRedmine XLS Exportもあります。こちらには、XLS形式でのチケット一覧の出力以外に、履歴や添付ファイルを出力する機能などもあります。Redmine XLSX format issue exporterでは、シンプルにRedmine標準のCSVエクスポートのXLSX版という位置づけにしたいと考えています。

Plugins Directoryに登録したついでにRedmine XLS ExportPlugins Directoryを見たら、すでにオフィシャルには3年以上更新されていません。リポジトリもなくZIPで公開されているのみという状態だったので、自分でZIPからGithubに遷してメンテしているんですよね。もう更新しないのかなあ。。。

2014年7月23日水曜日

RedmineプラグインのCI環境を作る

1年ぐらい前にNDSでRedmineプラグインのテスト書いてとLTしましたが、幾ばくかのテストを自分で書きました。
テストを書いたので次はCI環境を作りたいと思います。


Travis Integration for Redmine Plugins

調べてみたところ、以下を見つけました。
Travis Integration for Redmine Plugins
Redmineプラグインのテストをするには、当たり前ですがRedmineが必要になります。なので、CIの環境にRedmineをインストールするところから始めないとなのですが、その辺をTravis CI向けにスクリプト化したものです。
これは便利そうということで、これを使っての環境構築を試してみました。

追記:上記のリポジトリでRedmineをダウンロードしてくるソースがedavis10のところになっていました。ここもミラーしているようですが、Redmineのフォーラムでgithubのリポジトリが示されていたので、フォークしてソースに書き換えました
追記の追記:プルリクエストを出して取り込まれました。

手順

手順は以下のとおりです。Travis CIで対象のリポジトリをCI対象にしている状態とします。
  1. Travis Integration for Redmine Pluginsをクローンしてくる。
  2. .travis*をプラグインのルートフォルダにコピーする。
  3. .travis.ymlで定義されているbranchesを書き換える。クローンしたままだとtestingブランチのみが対象となるため、フックが効かないことがあるかもです。
  4. .travis.ymlで定義されているenvを書き換える。REDMINE_VERSIONで指定されたバージョンのRedmineでテストをします。複数指定する場合は、行をコピーしてバージョンを書き換えてください。
  5. .travis.ymlで定義されているPLUGINをプラグイン名に書き換える。
  6. .travis*をコミットする。コミットがフックされてビルドが開始されます。

結果

できた環境はこちら。テストも成功しました。
.travis.ymlrvmREDMINE_VERSIONのマトリックスでビルドが実行されます。
非常に簡単にRedmineプラグインのCI環境を作ることができました。RedmineプラグインのCI環境を作るハードルを下げてくれますね。

Arduinoで温度センサーを使ってみた

Arduinoエントリーキットに付いてきた最後の部品、温度センサーを使ってみました。
温度センサーはLM35DZです。データシートはこちら

配線

回路図は以下のとおり単純なのですが、はまりました。

LM35のGNDと+Vsを逆にしていたため、測定した値がおかしくなりArduino自体が動かなくなってしまいました。。。
データシートのピン配置図をみていたのですが、BOTTOM VIEWと書いてあるのを読み取れていませんでした。。。足の出ている方を上にしてみるんですね、BOTTOM VIEWですもんね。この投稿をみてわかりました。
分かってみてからLM35DZ 逆で検索すると、同じようなことがでてきました。

スケッチ

いろいろなサイトで同じスケッチがでているので割愛。ポイントは以下のとおり。
実際の室温と同じぐらいになっていました。
  • アナログ入力は5Vを1024段階にする。
  • LM35DZのVoutからは、10mV/℃で出力される。

精度を上げる

検索していたらこんなのを見つけました。
LM35HigherResolution

analogReference()は、アナログ入力の基準電圧を変える関数。デフォルトは5V。INTERNALを指定すると1.1Vになります。
基準電圧が5Vの場合は、
5V / 1024 = 0.00488
から、1単位あたり約4.9mVとなります。
これが基準電圧を1.1Vにすると、
1.1V / 1024 = 0.00107
なので、1単位あたり約1.1mVとなります。
上でも書いたようにLM35DZは10mV/℃で出力するので、5Vの場合は1単位あたり0.49℃、1.1Vの場合は1単位あたり0.11℃となり、より細かい温度を測定できます。
ただし、LM35DZは+2℃〜+150℃まで測れるとデータシートにありますが、1.1Vの場合のMaxは112.53℃に制限されます。

実際に試してみると、5Vの場合は27.83℃と28.32℃(差は0.49)をいったりきたりしたのに対して、1.1Vの場合には29.54℃と29.43℃(差は0.11)をいったりきたりしていました。それぞれはよさそうですが、比べると1℃近くも値が違います。なんでだろう?



これでArduinoエントリーキットに付いてきたひと通りの部品を試しました。
ここまでArduinoを触った感じでは、簡単な回路ものであれば容易にできそうです。本をひと通りやっていくだけでも楽しめました。
ただ、回路を組むのでわからなかったり、スケッチの問題ではなさそうというときは、はまってしまうorお手上げになってしまいそうだという感触。このあたりはいろいろやってみての経験なんだろうと思います。



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をやってみようという...