![]() |
パチDigiSpark。小さいよかわいいよ。 |
同僚さんからストレートネックから来る肩こりに困っているので何とかなりませんか?と依頼。さくっと作ってみました。
追記
■原理■
本当は加速度センサーを2個以上使って頚椎の屈曲ぐあいを計る必要があるんですが、簡易的に頭が前傾しすぎたら警告を発するようにしました。起動から5秒間の平均値を求め、それ以上前傾したらダメ!です。今回のユーザはメガネさんなのでメガネにセンサーを取り付けることにして、ポケットに本体と振動モータと電池を入れられるようにしました。
■構成■
マイコンとしてATTiny85のDigiSpark、センサにはADXL345(オーバースペック)、通知には秋月の振動モータ、ドライブは2SC1815です。振動モータは振動モータにしておくのがもったいないブラシレスです。ドライブ回路内蔵なので、電流制限抵抗省略、多分クランプダイオードも入ってるだろ、ということで外付けは省略。気になる人はちっこいダイオード付けておきましょう。電源はモバイルバッテリを使いましたが、アイドリング中の消費電流が小さいのでバッテリ側で勝手に電源をオフにしてしまいます。幸い、SANYO KBC-L3S(絶版)は微小な電流でも切れないので、今回はこれを使います。cheeroのIoT機器用バッテリもこういう用途に使えるはずなのですが、ずっと欠品のままで3ヶ月です。このまま発売停止なら何か作るんだけど…出るのかでないのかはっきりしてくれい>cheero
回路図途中まで書いたけどKeynoteとEagle混合だとうまくいかず挫折orz
![]() |
(あかん) |
ということで配線図。
![]() |
CSをプルアップ(1608使用) |
![]() |
SDOをプルダウン(でかい) |
![]() |
プラスに配線、マイナスにコレクタ、ベースに1kΩと緑、プラスに赤、エミッタに黒 |
■追記:続編■
モニタからの距離を測定するバージョンも作ってみました。■制御プログラム■
探すと見つかるインターネット。まず、これでADXLとDigisparkがちゃんとつながっていることを確認します。y方向に傾けるとオンボードのLEDが着いたり消えたりすればOK。
以下、
- 起動したら0.1秒 x 5秒間、X軸方向の加速度(傾斜)を検出し平均値を求める
- 平均値取得が終わったら0.1秒振動モータを回す
- それ以降、平均値より前傾したら振動モータを回す
だけです。つまり、メガネのツルなどにこの装置のセンサー部分(ADXL345)を取り付けて、「これ以上首を傾けたらダメ」な状態でバイブレータが鳴るまで5秒間静止します。
その後は、普通にお仕事をして、鳴ったら姿勢を改める、という仕掛けです。
その後は、普通にお仕事をして、鳴ったら姿勢を改める、という仕掛けです。
なお、傾斜スイッチと振動モータと電池だけでいいじゃん、というツッコミを禁止します。
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
// ストレートネック矯正デバイス | |
// このコードは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 件のコメント:
コメントを投稿
注: コメントを投稿できるのは、このブログのメンバーだけです。