Maker活動

2018年1月24日水曜日

ストレートネック矯正デバイスw

パチDigiSpark。小さいよかわいいよ。

同僚さんからストレートネックから来る肩こりに困っているので何とかなりませんか?と依頼。さくっと作ってみました。
追記

■原理■

本当は加速度センサーを2個以上使って頚椎の屈曲ぐあいを計る必要があるんですが、簡易的に頭が前傾しすぎたら警告を発するようにしました。起動から5秒間の平均値を求め、それ以上前傾したらダメ!です。

今回のユーザはメガネさんなのでメガネにセンサーを取り付けることにして、ポケットに本体と振動モータと電池を入れられるようにしました。

■構成■

マイコンとしてATTiny85のDigiSpark、センサにはADXL345(オーバースペック)、通知には秋月の振動モータ、ドライブは2SC1815です。振動モータは振動モータにしておくのがもったいないブラシレスです。ドライブ回路内蔵なので、電流制限抵抗省略、多分クランプダイオードも入ってるだろ、ということで外付けは省略。気になる人はちっこいダイオード付けておきましょう。

電源はモバイルバッテリを使いましたが、アイドリング中の消費電流が小さいのでバッテリ側で勝手に電源をオフにしてしまいます。幸い、SANYO KBC-L3S(絶版)は微小な電流でも切れないので、今回はこれを使います。cheeroのIoT機器用バッテリもこういう用途に使えるはずなのですが、ずっと欠品のままで3ヶ月です。このまま発売停止なら何か作るんだけど…出るのかでないのかはっきりしてくれい>cheero

回路図途中まで書いたけどKeynoteとEagle混合だとうまくいかず挫折orz
(あかん)


ということで配線図。

DigiSparkADXL3452SC1815モータ
5VVcc+
GNDGNDE
PB0SDA
PB2SCL
SC→5.1k→5V
SDO→5.1k→GND
PB1B(1kΩでPB1接続)
C-

CSをプルアップ(1608使用)
SDOをプルダウン(でかい)

プラスに配線、マイナスにコレクタ、ベースに1kΩと緑、プラスに赤、エミッタに黒

■追記:続編■

モニタからの距離を測定するバージョンも作ってみました。

■制御プログラム■

探すと見つかるインターネット。まず、これでADXLとDigisparkがちゃんとつながっていることを確認します。y方向に傾けるとオンボードのLEDが着いたり消えたりすればOK。

以下、
  1. 起動したら0.1秒 x 5秒間、X軸方向の加速度(傾斜)を検出し平均値を求める
  2. 平均値取得が終わったら0.1秒振動モータを回す
  3. それ以降、平均値より前傾したら振動モータを回す

だけです。つまり、メガネのツルなどにこの装置のセンサー部分(ADXL345)を取り付けて、「これ以上首を傾けたらダメ」な状態でバイブレータが鳴るまで5秒間静止します。

その後は、普通にお仕事をして、鳴ったら姿勢を改める、という仕掛けです。

なお、傾斜スイッチと振動モータと電池だけでいいじゃん、というツッコミを禁止します。


// ストレートネック矯正デバイス
// このコードはivc氏のデモコードを元にしています。ありがとうございます。
// This program is based on a demo code below. Thanks, ivc!
// http://beta.ivc.no/wiki/index.php/ATtiny85_8MHz_and_ADXL345_via_I2C_with_Arduino_code
/* ATtiny85 and ADXL345 demo code
by ivc <ivc at x-pec.com> 2015
This sensor test will enable the red LED on the Trinket board when the y-axis is positive, e.g. tilted to one side, and turn
off when tilted the other way.
The TWI/I2C speed is determined by the F_CPU speed selected during compiling (Tools -> Board -> Adafruit Trinket 1/8/16MHz).
Due to inherent instability of the internal RC oscillator in the ATtiny, 8MHz does not always work - try 1MHz. Also, a pull-up
higher than 4.7K Ohm will introduce slew on the rising edge, causing the signal fail to be recognized. Try 2K Ohm pull-ups
on 3.3V setups, and 4.7K on 5V (3.3V/1.5mA = 2K Ohm).
Beware: ADXL345 sensor can easily be damaged if handled improperly. Always keep a couple extras to swap out and for testing.
*/
#include <TinyWireM.h>
#include <avr/power.h>
float x, y, z;
void setup(void)
{
// Dynamically change processing speed - use Tools -> Board -> Adafruit Trinket 1/8/16MHz to adjust
if (F_CPU == 16000000) { clock_prescale_set(clock_div_1);
} else if (F_CPU == 8000000) { clock_prescale_set(clock_div_1);
} else if (F_CPU == 4000000) { clock_prescale_set(clock_div_2);
} else if (F_CPU == 2000000) { clock_prescale_set(clock_div_4);
} else if (F_CPU == 1000000) { clock_prescale_set(clock_div_8); }
// On-board Red LED
pinMode(PB1, OUTPUT);
digitalWrite(PB1, LOW);
// Setup ADXL345
adxl345_init();
}
// 以下、倉橋のコード
int countup = 0;
float initX = 0;
float aveX = 0;
void loop(void)
{
readAccel(&x, &y, &z);
if (countup < 50) {
aveX = aveX + x;
countup++;
if (countup == 50) {
aveX = aveX / 50.0;
digitalWrite(PB1, HIGH);
delay(100);
digitalWrite(PB1, LOW);
}
} else {
float diff = aveX - x;
if (diff > 0.15) {
digitalWrite(PB1, HIGH);
} else {
digitalWrite(PB1, LOW);
}
}
delay(100);
}

0 件のコメント:

コメントを投稿

注: コメントを投稿できるのは、このブログのメンバーだけです。