ラベル NeoPixel の投稿を表示しています。 すべての投稿を表示
ラベル NeoPixel の投稿を表示しています。 すべての投稿を表示

2018年11月16日金曜日

Arduinoでカラスを追い払う…1



ハト対策が一段落したので、ハト対策に使った装置(PIRで体温を検知すると2つのNeoPixelsが激しく点滅する、だけ)をゴミ集積場に設置してみたところ、いつもは朝7:30ぐらいには盛大なパーティーを開いているカラス2羽がゴミを荒らすことはありませんでした。

すぐに「危険性がない」と舐められるような気がしますが、とりあえずは1勝ですw



2018年11月16日
06:00ごろPIR検知のNeoPixelsを設置。被害ゼロ。

〜2018年11月27日
火曜と金曜に設置、被害ゼロ。近所にたくさん似たような集積所があるのでわざわざヤバいところに行かなくてもいいんじゃね?的な判断なのだろうか。なおご近所の散らかりっぷりは変わらず。

2018年11年30日
設置停止したが被害ゼロw とりあえず被害が再発するまで停止するわ。

2018年12月11日
被害再発しました。ただ、9Fから私が顔を出しただけでカラスが逃げる。装置ではなく私が危険認定されている可能性。




2018年2月5日月曜日

Arduino nanoで肩こり対策デバイス・その2


■原理■

同僚さんから、「肩こりがひどいので電子工作で何かできないか」というご相談をいただいて作ってみたシリーズ第二弾です。第一弾は首肩の傾斜で振動するパターンでした。

今度は「ふと気がつくとモニタに近づきすぎている。近づいたら警告を」というデバイスです。モニタの上端に貼り付けて使います。

距離計測は超音波とToFを試してみたのですが、超音波は人間の顔だとあまりうまいこと検出できず、手持ちのToFは計測レンジが微妙に遠くてNG。シャープの赤外線距離測定デバイスを使うことにしました。

■製作■

Arduino nanoのパチを使いました。

距離センサー

表示にはNeoPixels / WS2812b的なLED

回路は、それぞれのGND同士をつなぎ、ArduinoのVinとセンサーとNeoPixelsの電源同士をつなぎます。距離センサーは最大約2.8vのアナログ出力なのでアナログ入力A0、ArduinoのA1とNeoPixelsのDinをつなぎます。

今回、0.19mmのエナメル線で配線しました。ワイヤリングペンも作ったので、GND-GND-GNDとつながるような場所が大変楽です…と言いたいところですが、所要時間的には架橋ポリエチレン被覆線とあんまり変わらなかったです。



ワイヤリングペン、シャープペンに通すのに例によって30cmほどに切ったワイヤを先端から差し込んで後ろの本体と接合して引っ張り出す作戦を取りました。が、前回は0.3mmだったので突き合わせでハンダ付けできたのですが、今度は0.19mm、さすがに細くて無理だったので、瞬間接着剤使いました。この時期は空気が乾燥しすぎていてなかなか固まらないので困ったもんです。今度、接着促進剤ってのを使ってみたい。

見た目は悪いけど使い勝手は良いですw


■プログラム■

起動したら、5秒間距離を計測して平均値を取ります。これが基準値で、これより近づいたら=値が大きくなったらLEDを点灯させます。

loop()ではanalogReadからの値を簡易的な移動平均処理で測定誤差をツブして無駄なチラツキを減らしています。距離センサーからの値は最大で500ぐらいなので、上記の平均値と500との中間点までは黄色、それを越えて近づいたら赤で点灯するようにしました。


2016年5月15日日曜日

Arduino+ADXL345で地震酔い対策


■地震酔いとは■

東日本大震災では東京はいくつかの施設を除いては被害を免れました。でも、頻繁に震度3-4の揺れを経験していると、そのうちふと揺れを感じているかのような錯覚を覚えることがあります。本当に揺れているのか錯覚なのかわからないんですよね。

これが地震酔いです。熊本では高頻度で強い揺れが続いているので、地震酔いの症状でお困りの方もおられるのではないかと思います。

ということで、Arduinoで「揺れたら点灯」なデバイスを作ってみました。机の上に置いて、「あれ?地震?」と感じた時に点灯していなければそれは気のせい、という感じに動いてくれればいいのですが(作ってから東京で大きな地震がないので未検証です)。

周波数成分ごとに色を変えたのですが、手に持っているとどんなに心を鎮めても赤(ゆっくりした揺れ)が消えてくれません。

アル中検出器を造ってしまったのかもしれません。

なお、「酔い」と言っても色々あります。上記のように「揺れているように感じる」程度なら、物理的に揺れていないことを確認することが一種の認知療法的な効果につながると思いますが、「常時揺れているように感じて気持ちが悪い」という状態であれば、内耳に作用するタイプの乗り物酔い止めが有効です。こういう症状では「どこの医者にかかって良いかわからない」と思うんですが、メマイや酔いなどについては耳鼻咽喉科に相談してみるのがよろしいです。3.11の時、かなり深刻な症状を訴える同僚もいましたが、でも今はみんなすっきり治っています。不快な症状を我慢しないで、医師に相談しましょう。

■ハード■

Arduino nano+加速度センサーADXL345+マイコン内蔵LED WS2811です。以前、「キーボードを強く叩き過ぎたら、警告する」ってのを作りましたが、その流用です。

Arduino接続先
3.3v出力ブレッドボードの+ライン
GNDブレッドボードの-ライン
5v出力マイコン内蔵LEDのVdd
D2マイコン内蔵LEDのDin
A4ADXL345のSCL
A5ADXL345のSDA


ADXL345接続先
SCLArduino A4
SDAArduino A5
SDOGND
CS3.3v
Vs3.3v
GNDGND
Vdd3.3v

■ソフト■

加速度センサーから読み取った値を3軸分合成してからFFTにかけて、ノイズ分を除外した値が一定値を超えたら帯域ごとのパワーにわけてRGB LEDを点灯します。

当初割り込みを使って連続的に計測するプログラムを書いたのですが、インタラプト処理ルーチンでI2Cを読んだ瞬間にフリーズする、という現象を解決できなかったので、諦めて単純な逐次処理にしました。ただ整数処理のFFTを使っているので、計測漏れはそれほど大きくないです。

ADXL345に限らず3軸加速度センサーには重力加速度が常時計測されます。ので、その影響を取り除く必要があります。また、体感する揺れは三軸の合成ベクトルなので、三軸分のスカラー値を求めて、そこから重力加速度分を引き、感度を高めるためにちょっと掛け算してます。read345というルーチンでは、その後、ムダなdual buffer処理をしていますが、これは最初に書いたように当初割り込みで処理しようとしていた名残です。書き換えるの面倒なのでそのままにしています。

ノイズ処理は単に「静かにしていてもFFTからの出力が0-2程度出ているので、2以下はノイズとしてカット。それを超えた分だけ集計して、集計値が一定値を超えたら、有効と判定」というごく単純な処理です。

FFTには整数型FFTを使いました(Topic: Modified 8bit FFT in c)。ありがとうございます。ただ、開発されてから時間が経っているので、いくつか修正が必要です。まず、include文で「WProgram.h」となっている箇所は「Arduino.h」に置換します。また、データタイプの定義が変わっているので、fix_fft.cppの頭の方に
#ifndef prog_int8_t
#define prog_int8_t int8_t
#endif
を貼っておいてください。

ADXL345のライブラリはAdafruitの新しいunifiedライブラリ版を使いましたが、unifiedなインタフェース(センサーが違っても、重力加速度としての値域に変換して返すなど、センサーごとの差異をわりといい感じに吸収してくれるライブラリ群)は使わずgetX, Y, Zで取ってます。FFTが整数ですし。

WS2811は特に問題ないと思います。


■感謝■

FIX_FFTの作者の方、およびADXL345/WS2811ライブラリを公開してくださったAdafruitに感謝申し上げます。ありがとうございました。