記事一覧

電子回路入門講座

2013.03.06


「電子回路入門講座」という本を買いました。
ド文系人間の私ですが、やはり回路の基礎知識ぐらいは理解しておきたいと思い、簡単すぎず、難しすぎずという自己基準にて選択しました。
ただ、読み始めてみるとやはり、自分的にはややハードルが高かったかも・・・と後悔
まず、コイルとコンデンサの理論のところで「微分・積分」が出てきます。私がむか~し理系の道を断念したのは、この微積分を理解できなかったからだったのですが・・・電気の世界では避けて通れない道のようです。。。
この本は当然のように微積分が理解できている前提で書かれています。そこで、微分入門というキーワードでググってみると
微分積分入門
というサイトを発見。かなり丁寧に解説されています。
じーっくり読んでみると、何となくですが分かったような気になり、さらに
測量技術者のための微分入門
を読んで、なるほど誤差の理論にも応用されているのか、と納得。
改めてコイル、コンデンサの章を読み返してみて、数式の意味くらいは分かるようになりました。
この本、弟子回路についてかなり広範囲に書かれている割にそれぞれが深そうなので、まだ先は長そうですが読み進めるのが楽しみになってきました。

タグ:参考書 勉強

直列スイッチを考えてみる

2013.03.05

秋月で大気圧センサーを買いました。600円のと350円のがあって、ピンが半田付けされているかどうかの違いと考えやすい方を買ったのですが、帰ってネットで調べるとSPIとI2Cというインターフェイスの違いもあったようで・・・
安い方→MPL115A1使用大気圧センサーモジュール(SPI)
高い方→MPL115A2使用大気圧センサーモジュール(I2C)(丸ピン実装済み完成品)
I2CならArduinoとは2本の線でデータのやり取りをできますが、SPIだと都合4本のピンが消費されることになります。ので、お金の余裕がある人はケチらずI2C用のMPL115A2を購入されることをお勧めします。(私の場合100%道楽なので、ちょっとした苦労も楽しみの一部と割り切ることに・・・)
MPL115A1に関しては、「Arduinoの動かせ方入門」の以下のページが参考になります。
気圧センサー(MPL115A1)で大気圧と標高を測定して見ます
こちらで提供されているスケッチで何の苦労もなく、適度な気圧が求められました。

と、前置きはこれくらいにして、
ArduinoにLCD、気圧計をぶっ刺していって、使えるデジタルピンが残り一本となってしまいました。
今後、操作系の機能を付け加えるのにはスイッチ類を追加することになるので、入力ピンが1本では心細いです。
で、アナログ側を見ると、今のところ湿度センサと、温度センサが刺さっているくらいで余裕があります。
で、ちょっと考えてみたのが、直列につないだ抵抗それぞれにスイッチをぶら下げて、それぞれのスイッチが押された時にあるポイントの電圧が変化する(かも?)ので、そこをアナログ計測してやれば、どのスイッチが押されたか分かるのでは?
ということで、回路にするとこんなイメージです。
ファイル 27-2.png

スケッチはサラサラッとこんな感じ

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

void loop() {
int data = analogRead(5);
Serial.println(data);
delay(1000);
}

で、ブレッドボードに抵抗とスイッチを並べて組んでみました(スイッチ後半はリード線で代用)
ファイル 27-1.jpg

エクセルにて計測したアナログ値を比較
ファイル 27-3.png

アナログピンで読み取った値をxとすると、
1024 ÷ ( 1024 - x )
の答えが押されたスイッチの番号だと判別できます。
また、複数のボタンが押された場合は番号の小さい方のボタンが識別されます。
この方法だと1つのポートで複数のボタンを共有できそうです。

タグ:Arduino

Arduinoで湿度計の実験

2013.03.04

随分前にという湿度センサを買っていたんですが、直流厳禁ということで使いあぐねて寝かしていたんですが、今回素晴らしいサイトに出会い複雑な回路を組まずに手軽に利用できることを知りました。
■HS15P 湿度センサーの簡易動作実験■
こちらのHPによると、HS-15Pとコンデンサ1つで簡単に計測できるとのこと。早速ブレッドボードに組んでみます。
ファイル 26-1.png
ただ、私は数学も物理も苦手で書いてある事の半分も理解できず・・・とりあえず、HPに公開されているCのソース(ATtiny13A用)を解釈してArduinoに移植。何とかそれらしい値が出るようになりました。
TmpHumLCD_Sample.zip
ファイル 26-2.jpg
ホームセンターで買った温湿度計と比べても、まあまあの値です。
ただ精度の方は定かではありませんが、目安程度にはなるのではないでしょうか。
手元には、CDSセンサーや気圧センサなんかもあるので、そのうち環境モニタ&ロガー的なものを作ってみたいと思います。

タグ:Arduino センサー

Arduinoでシフトレジスタの実験

2013.03.02

アマゾンでArduinoを買いました。
久々の電子工作に挑戦!ということで、さっそくシフトレジスタ(74HC164)につないでナイトライダー風に光らせて遊んでみました。


ようつべカスタマイザ

こんな感じで配置(LEDの配線は一部省略)
ファイル 25-1.png

簡単ですが、ソースファイルも置いておきます。AR_NightSample.zip

少しだけソース解説
LED全消灯関数

void ledClear() {
digitalWrite(aPin,HIGH);
for(int i = 0; i < 9; i++){
digitalWrite(clkPin,LOW);
delayMicroseconds(1);
digitalWrite(clkPin,HIGH);
delayMicroseconds(1);
}
}

シフトレジスタをクリアするために、clk(クロックピン)の上げ下げを行っています。

LEDパターン表示関数

void ledDigit(int d) {
ledClear();
for (int i = 0; i < 9; i++) {
digitalWrite(clkPin, HIGH);
digitalWrite(aPin, ~d & (1 << i));
delayMicroseconds(1);
digitalWrite(clkPin, LOW);
delayMicroseconds(1);
}
delay(INTERVAL);
}

ledDigitには表示したいパターンを数値で渡します。
例えば、

であれば、2進数に直した「10101010」の数値(10進でも2進でも)を関数に渡します。
関数内では、1を1ビットずつ左シフトしてAND(&)を取った値によりLEDの表示判定を行っています。
digitalWrite()に渡す値、HIGH/LOWは数値の1/0で代用できるようなので結果をそのまま渡します。
digitalWrite(aPin, ~d & (1 << i));
(今回はLEDをアノードコモンにし、164のピンがLOWになったときに表示するようにしているので、さらにNOT(~)により結果を反転しています)
ましたが、ArduinoはUSBを刺すだけで、エディタにコンパイラとマイコンへのアップローダが統合されていて相当便利です。ちょっとした回路の実験にはもってこいですね。

タグ:74HC164 Arduino LED ロジックIC

C#でTestLinkのAPIを叩く

2012.02.15

最近オープンソースのプロジェクト管理を色々試していて、ブラウザからだけではなく、API経由で色々操作を行いたいと思うようになりました。
TestLinkの場合、\lib\api\sample_clients以下にJavaやRubyのサンプルがあるのですが、自分の環境には合わないのでC#で自作することにしました。
C#は初めてだったのですが、始めてみると意外と簡単にプログラミングすることができました。
TestLinkAPIはXML-RPCという仕様らしいのですが、基本的にはXMLのメッセージをPOSTして、結果がXMLで返ってきます。
C#ではWeb系のライブラリを利用することで、この動きを簡単に実装することができます。


// リクエストの作成
HttpWebRequest req = (HttpWebRequest)WebRequest.Create(url);
req.Method = "POST";
req.ContentType = "text/xml";
req.ContentLength = data.Length;
req.UserAgent = "tlclient";

// ポスト・データの書き込み
Stream reqStream = req.GetRequestStream();
reqStream.Write(data, 0, data.Length);
reqStream.Close();

// レスポンスの取得と読み込み
WebResponse res = req.GetResponse();
Stream resStream = res.GetResponseStream();
StreamReader sr = new StreamReader(resStream, Encoding.UTF8);

sr.Close();
resStream.Close();

・WebRequest.Createでリクエストを作り
 ↓
・GetRequestStreamで取得したストリームにデータを書き込み
 ↓
・GetResponseでレスポンスが返ってくるのでStreamReader経由で結果を読み込む
という流れになります
APIに渡すXMLは構造が決まっているので、定型化したプログラムになります


XmlDocument xInp = new XmlDocument();
System.Xml.XmlDeclaration decl = xInp.CreateXmlDeclaration("1.0", "UTF-8", null);
xInp.AppendChild(decl);
XmlNode root = xInp.CreateElement("methodCall");
XmlNode meth = xInp.CreateElement("methodName"); meth.InnerText = cmd;
XmlNode pams = xInp.CreateElement("parms");
XmlNode parm = xInp.CreateElement("parm");
XmlNode strc = xInp.CreateElement("struct");
foreach (DictionaryEntry col in ht)
{
XmlNode memb = xInp.CreateElement("member");
XmlNode mnam = xInp.CreateElement("name");
mnam.InnerText = col.Key.ToString();
XmlNode mval = xInp.CreateElement("string");
mval.InnerText = col.Value.ToString();
memb.AppendChild(mnam);
memb.AppendChild(mval);
strc.AppendChild(memb);
}
parm.AppendChild(strc);
pams.AppendChild(parm);
root.AppendChild(meth);
root.AppendChild(pams);
xInp.AppendChild(root);
return xInp;

タグは、"methodCall"から順にぶら下がっていき、"struct"以下に渡したいパラメータを作ります。
この時の注意は、"member"の下にパラメータを"name"と"string"のセットで渡すことです。
パラメータが複数ある場合は、"struct"に"member"のツリーを複数追加していくことになります。
私のプログラムではパラメータの取り回しをしやすいように、各パラメータをHasTableの(パラメータ名:値)の組として、ArrayListの配列で扱うようにしてみました。
(テスト計画一覧の取得関数の例)

public ArrayList getPlans(int pid)
{
Hashtable ht = new Hashtable();
ht.Add("devKey", TLClient.key);
ht.Add("testprojectid", pid);
ArrayList list = postCmd("tl.getProjectTestPlans", ht);
return list;
}

HashTableに
 devkey:TestLinkのAPIキー
 testprojectid:テストプロジェクトのID値
という組で渡し、XMLツリーに展開します。

タグ:C# TestLink

ページ移動