役に立たない箱プロジェクト

役に立たない箱プロジェクト:

このDigi-DIYでは、役に立たない箱の製作について説明します。 以前の箱は機能しなくなったため、追加のプログラム機能と使いやすさのために、ATMEGA328P-PUチップからArduino Nanoへのアップデートが必要だと判断しました。

image

私は役に立たない箱を調査し、他のDIYまたはHow-to Tutorialsを見つけようとすることから始めました。 Vagelis Chantzisから多くのインスピレーションを得ました。 これは私のプロジェクトの基本を理解するのに役立ちました。

このDIYガイドでは、あなたもこの楽しいプロジェクトを製作できるように、役に立たない箱の構築を取り上げます。 このプロジェクトは私にとって良い学習プロジェクトであり、おわかりになるように、途中でいくつかの調整がありました。 また多くのプロジェクトと同様に、私に忍び寄るいくつかの問題がありました。

つぎのような問題…

サーボモータの取り付け:サーボモータをそのまま取り付ける良い方法はありませんでした。 アームは常に物体を押し付けているので、熱接着剤では固定できないと判断しました。 時間が経つと、トルクにより平面から離れます。 私は先に進み、OnShapeを使用して両方のサーボモータ用の独自のブラケットをスケッチしました。 以下のプランをご覧ください。

電源の問題:6vの電源に問題がありました。 Arduino Nanoは、5vピン用に内部で5vに整流するために少なくとも7~12ボルトを必要とします。そこに 6ボルトを供給していたため、5ボルトを適切に取り出すことができませんでした。 これは私のサーボモータに電力を十分に供給していなかったため、何も機能しませんでした。 回避策として、Micro-USBポートに給電するためのカスタム電源ケーブルを製作しました。このポートは、その電源を整流しないためです。 または、単3電池6個のバッテリパックを使用して、最大9ボルトにすることもできます。

一般的な構築プロセスでは、ボードをはんだ付けして動作させることから始めました。 サンプルコードを使用してボードを動作させてから、箱を製作しました。 サーボモータと箱を動作させた後、アームの移動距離に合わせて、その長さをスケッチしました。 次に、OnShapeでアームをスケッチし、それらを3Dプリントしました。 3Dプリンタがない場合は、木材で同様の形状を製作することもできます。 最終的な組み立ての後、体をもみほぐさねばなりませんでした。

Arduino Nano:(1050-1001-ND
Arduino Nanoを選んだのは、そのサイズが小さく、プログラムしやすいためです。 私は小さなボードフットプリントを計画していましたので、フルサイズのArduino Unoは私が望むものには少し大きすぎました。

ボードの選択:(1528-1195-ND
ボードレイアウト(以下のパーツリスト参照)を計画するとき、フルサイズのブレッドボードから始めましたが、その時は余計なスペースが残っていました。 私は小さなフットプリントの考えを維持していましたので、最終的にフルサイズのボードを半分にカットして小さなボードにしました。 私は小さなDremel(ロータリ加工具)と切断砥石でこれを行いました。 これに最適なハーフサイズのブレッドボードがあります(上記の品番参照)。 それはArduino Nanoの小型サイズに適合し、他のすべてのコンポーネントのための十分なスペースをまだ持っています。 もっと小さくしたいならきっとできます。

配線:(BKWK-3-ND
ブレッドボードで使用できるワイヤには多くの種類があります。 「フックアップワイヤ」を使用することを選択したのは、それらがすでにブレッドボード用にサイズ設定され、色が付けられており、事前にストリップされているためです。

サーボモータ:(1528-1084-ND
5vの高トルクサーボモータを使用することにしました。これは、Arduino Nanoの出力電力に適合し、箱に使用した重いオークの堅木を持ち上げるためです。 プラスチックやバルサ材などの軽量素材で製作すれば、通常のサーボモータでも問題ありません。 ただし、連続回転モータではなく、位置決め回転モータを使用していることを確認してください。

サーボモーターのピン配列
電源入力:赤
グランド:ブラウン
制御:黄色

コンデンサ:(399-6602-ND
私が考えていた当初の計画では、サーボモータの電流引き込みを相殺するのを助けるために2つの100uFコンデンサを使いました。

ヘッダーピン:(S9258-ND

USB A(オス)-マイクロB(オス)ケーブルWM14083-ND
このケーブルのUSB A(オス)部分を切り取り、プラスとマイナスのワイヤを9ボルトスナップバッテリコネクタに配線して、カスタム電源ケーブルを作成しました。 このケーブルは、バッテリパックとArduino NanoのマイクロB(メス)部分に接続します。 私がこれを行った理由は、バッテリパックの6Vから5ボルト電源ピン用の5ボルトに正しく変更しなかったNanoの内部整流器をバイパスするためです。 電圧範囲は、内部で5vに正しく整流するためには7〜12vが必要です。
サーボモータには3ピンのメスコネクタが付いているため、ボードにヘッダピンを配置して非常に簡単に接続できます。

6 AAバッテリパックを使用する場合、これを行う必要はありません。 パックをVinとGroundに接続するだけです。

9ボルトスナップバッテリコネクタ36-232-ND
AAパワーパックをすばやく接続または切断できるため、これを使用することにしました。

AA用4スロットバッテリホルダBH24AASF-ND
この部品を選択したのは、Arduino Nanoに最大6ボルトで電力を供給するために必要な4個の単三電池を保持できるからです。 6バッテリAAホルダ(BH26AASF-ND)を使用する場合、これは9ボルトを出力します。この場合は、Vin入力ピンを使用して、5ボルトまで適切に整流する必要があります。

単極双投スイッチ:(EG2350-ND
以前のボックスのスイッチを使用しましたが、新たにスイッチを入手する必要がある場合でも、(EG2350-ND)を選択します。

ON / OFFロッカスイッチ:(EG5619-ND
バッテリを節約するためにOn/Off電源スイッチを入れたい場合は、バッテリパックとVinピンの間に入れます。

10kΩ抵抗:(CF14JT10K0CT-ND
この抵抗は、SPDTスイッチからの信号にバイアスをかけるためのものです。 これにより、スイッチとドアアームを移動するタイミングがボードに通知されます。

はんだごて:(243-1267-ND
はんだ:(473-1128-ND
ワイヤストリッパ:(K598-ND
ペンチ:(K633-ND

箱の寸法
箱の寸法は完全にあなた次第です。 私が持っているものを、私が取り組んでいたもののアイデアをあなたに知らせるためにお渡しします。 覚えておく必要があるのは、スイッチから箱のふたの端までの移動距離だけです。 スイッチが遠すぎる場合は、スイッチに到達するためにますます長いスイッチアームが必要です。 これにより、箱の中に移動の問題が生じる可能性があります。

(2x)7” x 5½”(エンドピース)
(3x)12” x 5½”(壁+底面)
(1x)5½” x 5”(上部1、蓋)
(1x)5½” x 6¾”(上部2、固定)

箱の情報
木材:私は箱にオークを使用しましたが、軽い木はサーボモータの動作が容易になります。
構造:これは、内部の小さなコンポーネントに対して大きな箱です。あなたが箱を計画する場合は、サイズを簡単に小さくすることができます。

その他のパーツ

2 x小さなヒンジ(最初にボックスの端にねじ固定し、次に蓋に固定。)
4 x小さい½”ねじ(長さは、使用している材料の厚さに依存します。)
12 x 2"のネジ(木材が割れるのを防ぐため、ネジの芯と同じサイズのドリルの刃先でプレドリルした木材)

ドリル
ドリルの刃先(ストアからの標準パックが役立ちます。木材とプラスチックは柔らかく、簡単にドリルできます)
サンドペーパー(最初は粗目:40-50、次に中目:100、最後に細目:220-240)
鉛筆
木工用ノミ(オプションです、スイッチを木に配置する場所をノミで削る必要があったため)

ドアアーム
OnShapeを使用して、プロジェクト用の3D印刷可能なドアアームを製作しました。「こちら」でデザインをご覧いただけます。

image

カスタムドアブラケット
OnShapeを使用して、プロジェクト用の3D印刷可能なドアアームブラケットを製作しました。 「こちら」でデザインをご覧いただけます。

スイッチアーム
OnShapeを使用して、プロジェクト用の3D印刷可能なスイッチアームを製作しました。 「こちら」でデザインをご覧いただけます。

image

image

カスタムスイッチアームブラケット
OnShapeを使用して、プロジェクト用の3D印刷可能なスイッチアームブラケットを製作しました。 「こちら」でデザインをご覧いただけます。

image

回路構成
image

プログラム

#include <Servo.h>

Servo doorServo;
Servo fingerServo;

int swPin = 2; // Switch on pin 2
int pos = 0; // Sets initial arm positions.
int selectedMove = 0; // Move selector

void setup() {
pinMode(swPin, INPUT); // Sets pin 2 as input.
doorServo.attach(9); // Sets door servo on Pin 9
fingerServo.attach(10); // Sets finger servo on Pin 10
doorServo.write(0); // Sets door to position
fingerServo.write(80); // Sets finger to position
}

void loop() { // If the switch is on, move door and finger to switch it off
if (digitalRead(swPin) == HIGH) {
if (selectedMove > 9) { // If greater than 9 count, reset to 0.
selectedMove = 0; // ^
}
if (selectedMove == 0) { // If count = 0 then perform this function / Same logic for the following.
simpleClose();
}
else if (selectedMove == 1) {
simpleClose();
}
else if (selectedMove == 2) {
simpleClose2();
}
else if (selectedMove == 3) {
crazydoor();
}
else if (selectedMove == 4) {
slow();
}
else if (selectedMove == 5) {
serious();
}
else if (selectedMove == 6) {
trollClose();
}
else if (selectedMove == 7) {
simpleClose();
}
else if (selectedMove == 8) {
matrix();
}
else if (selectedMove == 9) {
sneak();
}
selectedMove += 1; // Add’s 1 to “selectMove” count.
}
}

void simpleClose() {
for (pos = 0; pos < 140; pos += 3) { // Defines starting postition for door
doorServo.write(pos); // Executes starting position for door
delay(20); // Delay before next action
}
for (pos = 0; pos < 200; pos += 4) { // Defines starting position for finger
fingerServo.write(pos); // Executes position position for finger
delay(10); // Delay before next action
}
for (pos = 200; pos >= 0; pos -= 4) { // Defines next position for finger
fingerServo.write(pos); // Executes next position for finger
delay(20); // Delay before next action
}
for (pos = 140; pos >= 0; pos -= 3) { // Defines next position for door
doorServo.write(pos); // Executes next position for door
delay(10); // Delay before next action
}
}

// The following code follows the same schema. Play around with the code to get the correct travel distance. Watch out for doorServo vs. fingerServo, to know which one you are using.

// The following code has extra delays (200+) to make the arms more expresive. Mess with these also to get different timings for movement.

void simpleClose2() {
for (pos = 0; pos < 140; pos += 3) {
doorServo.write(pos);
delay(15);
}
delay(800);
for (pos = 0; pos < 140; pos += 4) {
fingerServo.write(pos);
delay(15);
}
delay(1000);
for (pos = 140; pos < 180; pos += 4) {
fingerServo.write(pos);
delay(15);
}
for (pos = 180; pos >= 0; pos -= 5) {
fingerServo.write(pos);
delay(15);
}
for (pos = 140; pos >= 0; pos -= 3) {
doorServo.write(pos);
delay(15);
}
}

void crazydoor(){
for (pos = 0; pos < 120; pos += 3){
doorServo.write(pos);
delay(15);
}
for (pos = 120; pos >= 0; pos -= 5){
doorServo.write(pos);
delay(15);
}
for (pos = 0; pos < 120; pos += 3){
doorServo.write(pos);
delay(15);
}
for (pos = 120; pos >= 0; pos -= 15){
doorServo.write(pos);
delay(15);
}
delay(700);
for (pos = 0; pos < 120; pos += 3){
doorServo.write(pos);
delay(15);
}
delay(700);
for (pos = 120; pos >= 0; pos -= 5){
doorServo.write(pos);
delay(15);
}
for (pos = 0; pos < 140; pos += 8){
doorServo.write(pos);
delay(15);
}
for (pos = 0; pos < 180; pos += 3){
fingerServo.write(pos);
delay(15);
}
for (pos = 180; pos >= 0; pos -= 3){
fingerServo.write(pos);
delay(15);
}
for (pos = 140; pos >= 0; pos -= 15){
doorServo.write(pos);
delay(15);
}
}

void slow(){
for (pos = 0; pos < 130; pos += 1){
doorServo.write(pos);
delay(100);
}
for (pos = 80; pos < 160; pos += 1){
fingerServo.write(pos);
delay(100);
}
for (pos = 160; pos >= 80; pos -= 1){
fingerServo.write(pos);
delay(100);
}
for (pos = 130; pos >= 0; pos -= 1){
doorServo.write(pos);
delay(100);
}
}

void serious() {
for (pos = 0; pos < 130; pos += 3){
doorServo.write(pos);
delay(15);
}
for (pos = 80; pos < 120; pos += 1){
fingerServo.write(pos);
delay(15);
}
delay(800);
for (pos = 120; pos >= 100; pos -= 3){
doorServo.write(pos);
delay(15);
}
for (pos = 100; pos < 130; pos += 3){
doorServo.write(pos);
delay(15);
}
for (pos = 130; pos >= 90; pos -= 3){
doorServo.write(pos);
delay(15);
}
for (pos = 90; pos < 150; pos += 3){
doorServo.write(pos);
delay(15);
}
fingerServo.write(80);
delay(1000);
for (pos = 80; pos < 160; pos += 4){
fingerServo.write(pos);
delay(15);
}
for (pos = 160; pos >= 80; pos -= 4){
fingerServo.write(pos);
delay(15);
}
for (pos = 150; pos >= 0; pos -= 1){
doorServo.write(pos);
delay(15);
}
}

void trollClose() {
for (pos = 0; pos < 155; pos += 3){
doorServo.write(pos);
delay(15);
}
for (pos = 0; pos < 160; pos += 4){
fingerServo.write(pos);
delay(15);
}
for (pos = 155; pos >= 100; pos -= 3){
doorServo.write(pos);
delay(15);
}
delay(10000);
for (pos = 160; pos >= 0; pos -= 4){
fingerServo.write(pos);
delay(15);
}
for (pos = 100; pos >= 0; pos -= 3){
doorServo.write(pos);
delay(15);
}
}

void matrix(){
for (pos = 0; pos < 120; pos += 3){
doorServo.write(pos);
delay(15);
}
for (pos = 80; pos < 100; pos += 4){
fingerServo.write(pos);
delay(15);
}
for (pos = 100; pos < 160; pos += 1){
fingerServo.write(pos);
delay(30);
}
delay(300);
for (pos = 160; pos >= 0; pos -= 4){
fingerServo.write(pos);
delay(10);
}
for (pos = 120; pos >= 0; pos -= 3){
doorServo.write(pos);
delay(15);
}
}

void sneak(){
for (pos = 0; pos < 100; pos += 1) {
doorServo.write(pos);
delay(30);
}
delay(2000);
for (pos = 80; pos < 100; pos += 1) {
fingerServo.write(pos);
delay(30);
}
delay(500);
for (pos = 100; pos < 120; pos += 4) {
doorServo.write(pos);
delay(15);
}
delay(100);
for (pos = 100; pos < 130; pos += 4) {
fingerServo.write(pos);
delay(15);
}
delay(500);
for (pos = 130; pos >= 100; pos -= 4) {
fingerServo.write(pos);
delay(15);
}
delay(100);
for (pos = 100; pos < 130; pos += 4) {
fingerServo.write(pos);
delay(15);
}
delay(100);
for (pos = 130; pos >= 100; pos -= 4) {
fingerServo.write(pos);
delay(15);
}
delay(100);
for (pos = 100; pos < 160; pos += 4) {
fingerServo.write(pos);
delay(15);
}
for (pos = 160; pos >= 80; pos -= 4) {
fingerServo.write(pos);
delay(15);
}
for (pos = 120; pos >= 0; pos -= 3) {
doorServo.write(pos);
delay(15);
}
}


    <meta itemprop='headline' content='Useless Box Project'>
      <meta itemprop='keywords' content='arduino, useless-box'>

    <div itemprop="interactionStatistic" itemscope itemtype="http://schema.org/InteractionCounter">
       <meta itemprop="interactionType" content="http://schema.org/LikeAction"/>
       <meta itemprop="userInteractionCount" content="2" />
       <span class='post-likes'>2 Likes</span>
     </div>

     <div itemprop="interactionStatistic" itemscope itemtype="http://schema.org/InteractionCounter">
        <meta itemprop="interactionType" content="http://schema.org/CommentAction"/>
        <meta itemprop="userInteractionCount" content="0" />
      </div>

  </div>









オリジナル・ソース(英語)