はんだ付け作業はルーペ必須です。
※高齢者の感想です♡
ただ、モニター画面上の回路図を確認しながらはんだ付けをする際には、ルーペを上げたり下げたり上げたり下げたりを無限に繰り返すことになりうざいです。
ってことで、自動化しました。もうオートフォーカス老眼鏡も時代遅れさ(何を根拠に)。
■仕組み■
市販の安い中華ヘッドルーペを改造します。
Nikayoni Stores ヘッドルーペ 拡大鏡 レンズ メガネ タイプ 2灯式 LED ライト 倍率 1.2倍 1.8倍 2.5倍 3.5倍
レンズホルダーとフレームを3Dプリンタで作成し、ホルダーとフレームの間を2個のサーボモーターで駆動します。バイザーの上に加速度センサー(ADXL345)とマイコン(Seeduino XIAO)を搭載し、はんだ付けするのにいい感じに頭を前傾させたらサーボを動かしてレンズを目の前におろします。
このアイディアそのものは最初にヘッドルーペを買った日に思いついたんですが、サーボモーターを固定するいい感じの方法が見つからず、ずっと放置して忘れてました。さらに、3Dプリンタを買って10ヶ月ほど経過したところで、このプロジェクトを思い出し、3Dプリンタの故障や不慣れなFDM機などにも翻弄されながら、ついに日の目をみた次第です。
ご笑覧ください ^ ^
■レンズホルダーとフレーム■
Fusion360で設計し、Snapmaker 2.0のFDMプリンタで出力しました。FDM初めてなので、なかなかキレイにだせず、10回目の試作で何とかきちんと収まりました。
ここからダウンロードできます(github.com/TareObjects/3D-Datas)。
■回路■
XIAOからサーボモーターSG-90を直接駆動しています。よくある中華基板のADXL345も直結です。秋月の45x45mm基板にのせました。サーボとの配線、手持ちのMolex 5051が丁度いい感じで使えたので、使ってます。
あれ罫線が足りない。まぁいいや。
■ソフト■
もうちょっといじりたいけど……とりあえず動くやつ。角度にヒステリシスつけないといけないし、中断モードも必要ですね。
#include <Servo.h> | |
Servo rServo; | |
Servo lServo; | |
// | |
// ADXL345 | |
// | |
#include <Wire.h> | |
#include <Adafruit_Sensor.h> | |
#include <Adafruit_ADXL345_U.h> | |
Adafruit_ADXL345_Unified accel = Adafruit_ADXL345_Unified(12345); | |
// | |
// Setup | |
// | |
void setup() { | |
Serial.begin(115200); | |
rServo.attach(8); | |
lServo.attach(9); | |
if (!accel.begin()) { | |
Serial.println("Ooops, no ADXL345 detected ... Check your wiring!"); | |
while (1); | |
} | |
accel.setRange(ADXL345_RANGE_2_G); | |
} | |
const int speed = 15; | |
const int rOffset = 80; | |
const int lOffset = 100; | |
enum {ModeInit = 1, ModeFaceUp, ModeFaceDown}; | |
int mode = ModeInit; | |
int getCurrentMode() { | |
sensors_event_t event; | |
accel.getEvent(&event); | |
int currentMode; | |
Serial.print(event.acceleration.y); | |
Serial.print("--"); | |
if (event.acceleration.y < -3.0) { | |
currentMode = ModeFaceDown; | |
Serial.println("Face Down"); | |
} else { | |
currentMode = ModeFaceUp; | |
Serial.println("Face Up"); | |
} | |
return currentMode; | |
} | |
void loop() { | |
int currentMode = getCurrentMode(); | |
if (mode != currentMode) { | |
delay(100); | |
currentMode = getCurrentMode(); | |
if (mode != currentMode) { | |
mode = currentMode; | |
if (mode == ModeFaceUp) { | |
faceUp(); | |
} else { | |
faceDown(); | |
} | |
} | |
} | |
delay(100); | |
} | |
void faceUp() { | |
for (int pos = 0; pos <= 90; pos++) { | |
rServo.write(pos + rOffset); | |
lServo.write(lOffset - pos); | |
delay(speed); | |
} | |
} | |
void faceDown() { | |
for (int pos = 90; pos > 0; pos--) { | |
rServo.write(pos + rOffset); | |
lServo.write(lOffset - pos); | |
delay(speed); | |
} | |
} | |
初めまして、こんにちは!
返信削除知人より聞きましてお邪魔しました。
同じことをやってる方がいらっしゃるとは!
私の場合は知人より、四肢が不自由な方向けの依頼で作りました。
レンズ部分は私も中華製を利用しSG90一つで駆動してました。
レンズのアップダウンは”頷き”と”首を横に振る”でやってます。
他にも、赤外線リモコンにも対応したりしてます。
マイコンボードはArduino Pro nano です。
コメントありがとうございます。
削除素晴らしいですね! それにひきかえ私ときたら、こんなことで遊んでばかりで……。
https://twitter.com/TareObjects/status/1304895021787668480
過去データをほじくってたら2019年4月ごろの試作動画がありました。
返信削除作るだけ作って、知人に預けたままですが…。(笑
でも、動きがとてもスムーズですね。
私はとにかく早く動かしたかったのでがっちゃんがっちゃんレンズを動かしてます。
そんなに早くからですか、すごいですね!
削除私は3Dプリントで筐体を作ったので、あんまり衝撃を与えると剥離しちゃうかなと思いゆっくり動かしてます。照明もパッつくと目に悪いですし。
パーリー機能はウケ狙いですが、おかげで自分が意外と首をかしげていることが多い、という知見を得ました ^ ^