2015/10/10(土)廊下や階段

初心者向け教科書的な、人感センサー。

SB412A

Arduinoのdigital8にセンサー、digital6にLEDとかリレーとかデジタルトランジスタをつける。
ズボラなので、センサーのon時間を調整した時に自分で測らなくていいように、常に記録させてる。
int SENSOR = 8;
int OUTPIN = 6;

void setup() {
  // put your setup code here, to run once:
  pinMode(SENSOR, INPUT);
  pinMode(OUTPIN, OUTPUT);
  Serial.begin(9600);
}

void loop() {
  // put your main code here, to run repeatedly:
  delay(1000);
  static int cur = 0, prev = -1, t = 0;
  char stat[4];
  cur = digitalRead(SENSOR);
  if (prev == cur) {
    t++;
  } else {
    digitalWrite(OUTPIN, cur);
    Serial.print("Time: ");
    Serial.println(t);
    Serial.print("Now: ");
    Serial.println(cur ? "on" : "off");
    prev = cur;
    t = 0;
  }
}

2015/10/06(火)Arduinoでもタイマー

ざっくりと。

電池付きのRTCモジュール。
http://www.amazon.co.jp/dp/B00VP8EAFW

RTC操作用ライブラリ
https://github.com/SodaqMoja/Sodaq_DS3231

LCDも付けてあるけど、それは置いておいて。
時刻は律儀に変換しなくても、yyyymmdd の大小を比べれば過去か未来かわかる。
#include <Sodaq_DS3231.h>
#include <Wire.h>
#include <LiquidCrystal.h>

// initialize the library with the numbers of the interface pins
LiquidCrystal lcd(12, 11, 5, 4, 3, 2);

//DateTime dt(2015, 10, 07, 01, 17, 0, 3);
void setup() {
  Serial.begin(9600);
  Wire.begin();
  rtc.begin();
//  rtc.setDateTime(dt);
  // put your setup code here, to run once:
  lcd.begin(16, 2);
  // Print a message to the LCD.
  lcd.print("Artificial Sun for PAXI");
  pinMode(7, OUTPUT);
}

void loop() {
  char buf[16];
  int deg, hm, lighton, lightoff;
  delay(250);

  // set the cursor to column 0, line 1
  // (note: line 1 is the second row, since counting begins with 0):
  lcd.setCursor(0, 1);
  // print the number of seconds since reset:
  DateTime now = rtc.now();
  rtc.convertTemperature();
  deg = rtc.getTemperature();
  snprintf(buf, 16, "%02d:%02d:%02d %0d deg", now.hour(), now.minute(), now.second(), deg);
  lcd.print(buf);
  Serial.println(buf);

  // blink
  //digitalWrite(7, now.second() % 2 ? HIGH : LOW );

  // timer
  snprintf(buf, 5, "%02d%02d%02d", now.hour(), now.minute());
  hm = atoi(buf);
 // if (hm > 700 && hm < 1800) {
 if (hm > 115 && hm < 119) {
    digitalWrite(7, HIGH);
  } else {
    digitalWrite(7, LOW);
  }
}

2015/10/04(日)人工太陽の続き Raspberry Pi編

植物用LEDの照射時間をコントロールする。
Raspberry Pi編

arduino で作り始めてみたけど、Raspberry Pi Model A+で作ってみた。
ネットワーク経由で時刻同期ができるから楽ちん安心かな、と。

回路図って、どう描くんだろう?
BotanicalLEDSwitch.PNG

Raspberry Pi の GPIO4, 17 でもって、LEDのon/offを制御する。

LEDの電源には 12V 1A のDCアダプターを使っている。
(あぁ、図に定電流回路が抜けている)
Raspberry Pi の電源も12Vの電源で賄うことにした。Raspberry Piは2番の5Vピンを電源電力の入力元にできるので、DCDCコンバーターで12Vー>5Vに変換してここに接続している。
DCDCコンバーターは1000円近くするが、1ポートのUSB充電器でも似たような値段なので作る手間だけ損している。おもちゃ遊びとしては得している。

Raspberry Pi の GPIO4, GPIO17 からの信号をデジタルトランジスタのベースに流すことでLEDの回路をon/offする。

回路としてはこんな所。


Raspberry Piの話。
USB WiFi ドングルは elecom の WDC-150SU2MBK。PCIのものが消費電力が少ないらしいんだけど、近所には置いてなかったので、そこそこの評判を得ている elecom を買ってきた。

ntpd は、特に設定しなくても標準で動作しているみたい。
pi@coriander ~ $ ntpdc -p
     remote           local      st poll reach  delay   offset    disp
=======================================================================
*sv2.localdomain 192.168.1.126    2 1024  377 0.00793  0.001239 0.12054
=einzbern.turena 192.168.1.126    2 1024  377 0.00792  0.001479 0.12267
=ntp.kiba.net    192.168.1.126    2  512  376 0.01930  0.001555 0.15672
=v157-7-235-92.z 192.168.1.126    2 1024  377 0.00993  0.000767 0.08698
GPIOを操作する雑なスクリプトをやっつけて...、
gpio-ready.sh
操作対象のGPIOピンを設定する
#! /bin/sh

echo $1 > /sys/class/gpio/export
echo out > /sys/class/gpio/gpio$1/direction
gpio-toggle.sh
GPIOのon/offを切り替える
#! /bin/sh

echo $2 > /sys/class/gpio/gpio$1/value
root の crontab に登録。6:00 - 19:00 の間、LEDを照射する。
0 6 * * * sh /home/pi/scripts/toggle-gpio.sh 4 1
0 6 * * * sh /home/pi/scripts/toggle-gpio.sh 17 1

0 19 * * * sh /home/pi/scripts/toggle-gpio.sh 4 0
0 19 * * * sh /home/pi/scripts/toggle-gpio.sh 17 0
Raspberry Pi に WiFi を繋いだので時刻ずれの心配がなくなったんだけど、気軽に電源を落とせなくなってしまった。
arduino で時計合わせのインタフェースを作るか、GPSで自動的に同期を取る方が取り扱いが楽かもしれない。

2015/10/02(金)LED放熱基板

3つまとめて組める基板を買ってみた。
OSPR3X03
ネガティブな話をするので、どこから買ったかは内緒。
LED実装済みでよく見る基板。

電子工作は初心者なので判断が付かないけど、納得がいかない。
この基盤は、LEDが3つ直列に繋がる。放熱部分は絶縁されている。
絶縁されて電源とは離れているけど、LEDを設置する3箇所の放熱部は繋がっている。

対して、PowerLED。
自分が購入したPowerLEDは、底面がアノードになっている。

つまり、アノードが全部繋がってしまう。アノードを通じて電源にだって繋がる。
「絶縁されています。LEDを実装するまではな!まさに外道!」という状態。
一個目は光る。後は、並列接続にすると個体差の抵抗値によって云々とか難しい話は一切関係ない。一個分の抵抗しかない一個目のアノードを通じて全部出て行く、2個、3個の抵抗がかかる経路にはびた一文電流は流れない。
放熱基板とLEDの密着が甘いと、2個めが光ることもある。

熱伝導性のシリコンゴムシートを挟んで解決した。

これ、何が正解なんだろう。
  1. 基板とパワーLEDを密着させてはいけない
    • 放熱できないよね
  2. 絶縁体を挟むのが当たり前
    • そんな片手落ちな商品があるかなぁ
  3. LEDの底面がアノードなのがおかしい
    • 珍しい仕様ではないようだけど...
  4. 基板がウンコ
    • この可能性を感じざるを得ないんだけど、完成品でよく見る基板なんだよなぁ

2015/10/02(金)arduino

arduino を使ってみる。

昔、Lチカだけで満足して放置していた arduino UNO R3 を引っ張りだす。
人工太陽の続きで、タイマーで照射時間を制御する。例えば、6:00 - 18:00 まで照射する、とか。

arduino では、RTCモジュールを併用するのが一般的みたい。
  • arduino は PCの様にCMOSバッテリを積んでいるわけではないので、電源が切れたら時刻情報は失われる
  • arduino のクロックソースは精度が低い
というのが主な理由。

時計の精度を上げる事はなんの解決でもない気がするので、RTCが一般的な理由がわからないけど、サンプルも豊富だし、これを使ってみるよ。

http://www.geocities.jp/zattouka/GarageHouse/micon/Arduino/RTC/RTC.htm
http://arms22.blog91.fc2.com/blog-entry-232.html
こちらの情報を頂いて動かしてみる。

動かして、LCDに時刻を出してみた。
CameraZOOM-20150927040701250.jpg


同期できなくても、現在時刻を確認できてズレを認識できて手動でも修正できれば問題ない、という発想でLCDを付けてみた。
RTCにバックアップ電池を付けて上げる必要もあるね。

ここまでやると、Raspberry Pi でイイんじゃないかという気がしてくる。
RTCよりNTPの方が楽だし有効。欲しいのは規則正しい刻時ではなく、長い期間大幅なズレなく動いてくれる事なので、外部から時刻同期できないのは致命的よなぁ。