バネをつくりたい!という衝動の先に。ArduinoでDIY
こんにちは。だいごです。
皆さんは、
ばっ、バネつくりてぇぇぇ!!!!!
という衝動にかられたことがあるでしょうか?
もちろん、ありますよね?
なにを隠そう私もその1人。
こちらの動画を見て、すぐにつくりたい欲求がナイアガラの滝のように流れ落ちてきてしまいました。
このサイト内には作り方も必要な部品の3Dデータも、そしてarduinoに書き込むコード(スケッチ)もなんでもそろっている!
これはもうつくるっきゃないでしょう!!
となりまして、早速つくることに。
作り方から全部もう書いてあるなんて、簡単じゃーん
と余裕ぶっこいていた私ですが、実際にやってみて、サイト通りにならないことがたくさん…
その備忘録をこちらに書き留めておこうと思います。
完成品はこちら!
まだまだ微調整が必要ですが、ちゃんとバネできてます!
うーん。できたときはホント感動でした!!
自分でも作れるんだなぁ(ネットに書いてある通りにつくるだけだけど)と。
用意するもの
さて、大まかに必要なものを列挙します。
・Arduino互換品(KKHMF UNO R3開発ボード)
・NEMA17 ステッピングモーター
・A4988(ステッピングモーターを制御するためのドライバー)
・100μF電解コンデンサ
・可変直流安定化電源(12Vに設定)
・押出機
・ベアリング693ZZ
・3Dプリント品
こちらは私が参考にした上記のサイトからダウンロードしてください。もちろん、3Dプリンターがないと作れないよ。
・ボルトやナット(M3・M4のサイズ)
こちらはあなたの町のホームセンターでお買い求めください。
組み立て
上記サイトを参考に組み立てていきます。
まずは3Dプリンタで部品を出力して。
板を切り出し、土台をつくり、
ベアリングをはめて、
こんな感じ!(テキトー)
電子回路
基本的にステッピングモーターを回すだけなので、そのための回路を組んでいきます。
初めてステッピングモーターを使うということで、モーターを制御するのにドライバー(A4988)がいるなんて知らなくて、いろんなサイトを読み漁りやっと理解。失敗もありました…(後述)
そして、やっと回った!
※ すんません。回路は余裕ができたときに。
コード(スケッチ)
Arduinoに書き込むコードです。
上記サイトのものをそのままコピぺでいいと思いきや…
コピペではウンともスンとも言わず…
ステッピングモーターは、回っているんだか、回っていないんだか。
コードを読み直し、ほかのサイトを参考にし、そして完成したのがこちら!
#include <DRV8825.h>
#include <BasicStepperDriver.h>
#include <MultiDriver.h>
#include <DRV8880.h>
#include <SyncDriver.h>
#include <DRV8834.h>
#include <A4988.h>
#include <Arduino.h>
#define Feed_step 200
#define Bend_step 200
#define Feed_RPM 80
#define Bend_RPM 30
//1=full step, 2=half step etc.
#define MICROSTEPS 1
#define FEEDSTEPS 8
int Delay = 200;
//ピン番号?
#define Bend_DIR 10
#define Bend_STEP 11
#define Feed_DIR 3
#define Feed_STEP 4
int val = 0;
int data = 0;
int a = 0;
int b = 0;
int c = 0;
BasicStepperDriver Feed_stepper(Feed_step, Feed_DIR, Feed_STEP); //送りギア
BasicStepperDriver Bend_stepper(Bend_step, Bend_DIR, Bend_STEP); //曲げのギア
void setup() {
Serial.begin(9600); //シリアル通信のスピードを設定
Feed_stepper.begin(Feed_RPM, MICROSTEPS);
Bend_stepper.begin(Bend_RPM, MICROSTEPS);
//シリアルポートへ出力
Serial.println("For Triangle enter (1, Side Length) ");
Serial.println("For Square enter (2,Side Length) ");
Serial.println("For Rectangle enter (3,Height,Length) ");
Serial.println( "For Hexagon enter (4,Side Length) ");
Serial.println( "For Spring enter (5,Spring Length) ");
Serial.println( "**Note Enter value without bracket ");
}
void loop() {
if (Serial.available()>0) { //シリアルポートにデータが到着していたら…
//Serial.parseInt
//▼
//シリアルモニタから送信される文字データを数値データに変換する
a = Serial.parseInt();
b = Serial.parseInt();
c = Serial.parseInt();
}
if (a == 1){
// シリアルモニタに表示
Serial.println(" ");
Serial.print("Making Triangle of side Length ");
Serial.print(b);
Serial.println("mm");
// 3回繰り返す
for (int x = 0; x < 3; x++){
// シリアルモニタに表示
Serial.println("..");
// ステッピングモーターの駆動
Feed_stepper.move(FEEDSTEPS*b*MICROSTEPS);
delay(Delay);
Bend_stepper.rotate(130);
delay(Delay);
Bend_stepper.rotate(-130);
}
Feed_stepper.move(FEEDSTEPS*15*MICROSTEPS);
Serial.println("Finish ");
a = 0;
b = 0;
}
if (a == 2){
Serial.println(" ");
Serial.print("Making Square of side Length ");
Serial.print(b);
Serial.println("mm");
for (int x = 0; x < 4; x++){
Serial.println("..");
Feed_stepper.move(FEEDSTEPS*b*MICROSTEPS);
delay(Delay);
Bend_stepper.rotate(75);
delay(Delay);
Bend_stepper.rotate(-75);
}
Feed_stepper.move(FEEDSTEPS*15*MICROSTEPS);
Serial.println("Finish ");
a = 0;
b = 0;
}
if (a == 3){
Serial.println(" ");
Serial.print("Making Rectangle of Length and Height ");
Serial.print(b);
Serial.print(" & ");
Serial.print(c);
Serial.println(" mm");
for (int x = 0; x < 2; x++){
Serial.println("..");
Feed_stepper.move(FEEDSTEPS*b*MICROSTEPS);
delay(Delay);
Bend_stepper.rotate(75);
delay(Delay);
Bend_stepper.rotate(-75);
delay(Delay);
Feed_stepper.move(FEEDSTEPS*c*MICROSTEPS);
delay(Delay);
Bend_stepper.rotate(75);
delay(Delay);
Bend_stepper.rotate(-75);
}
Feed_stepper.move(FEEDSTEPS*15*MICROSTEPS);
Serial.println("Finish ");
a = 0;
b = 0;
}
if (a == 4){
Serial.println(" ");
Serial.print("Making Hexagon of side Length ");
Serial.print(b);
Serial.println("mm");
for (int x = 0; x < 5; x++){
Serial.println("..");
Feed_stepper.move(FEEDSTEPS*b*MICROSTEPS);
delay(Delay);
Bend_stepper.rotate(70);
delay(Delay);
Bend_stepper.rotate(-70);
}
Feed_stepper.move(FEEDSTEPS*15*MICROSTEPS);
Serial.println("Finish ");
a = 0;
b = 0;
}
if (a == 5){
Serial.println(" ");
Serial.print("Making Spring of Length ");
Serial.print(b);
Serial.println("mm");
for (int x = 0; x < b*5; x++){
Serial.println("..");
Feed_stepper.move(FEEDSTEPS*MICROSTEPS);
delay(Delay);
Bend_stepper.rotate(60);
delay(Delay);
Bend_stepper.rotate(-60);
}
Feed_stepper.move(FEEDSTEPS*15*MICROSTEPS);
Serial.println("Finish ");
a = 0;
b = 0;
}
}
意味は大体わかるけど、細かい所まで突っ込まれたら困ります。笑
動いているんだから、大丈夫!というメンタルで通したいと思います。
あ、ステッピングモーターを回す角度は作成の状況によって、微妙に変わってくるのでそれは御自身で調整してみてくださいね!
ちなみにこちらは角度を変えてバネをつくった結果。
100°に設定してつくったのは、ちょっとバネとは言えないなぁ。
これが限界かな…
参考にしてほしい! 3つのトライ&エラー
失敗談① ドライバー(A4988)を焼いちゃった
ドライバーにはステッピングモーターに送る電流を調節する可変抵抗(写真の中でネジという文字で指し示しているところ)があります。
ちなみに今回使っているA4988というドライバーは2Aまでしか出力できません。テキトーに可変抵抗を回して電源に繋いだ日には、焦げ付いた匂いがいつまでも鼻からとれなくなるぜ。
失敗談② テコの原理を理解してないバカもの
ぜひ、完成品の動画と見比べてみてください。
なぜ同じ1.2 ㎜の銅線を曲げられないのか。
失敗談③ もしやトルクの大きいモーターを買わなくてもよかったのでは?
失敗②が解決する前は、もうそりゃぁすごく悩みました。
なんで動画ではキレイに曲げられているのに、私がつくったものでは曲げられないんだろう。
何か秘密があるんじゃないか。
そう思って、行き着いた先が、
そうだ高トルクのステッピングモーターを買おう。
という安易な考え。
こちらもともと買ってたものより約二倍トルクの大きいステッピングモーターです。
結果として、このステッピングモーターでも失敗②では曲げられなかったんですよね。
結局、偉大なのはテコか…
そう思ったんです。まぁそうなんですが。
でも、よくよく考えてみると、失敗①の教訓を生かしてドライバーの可変抵抗を慎重に回して、モーターに流れる電流を大きくしてあげればよかったんじゃないのかなと。
ステッピングモーターは、中の銅線に流れる電流が発生させる磁力によってまわります。ステッピングモーターの定格電流の大きさ以内で電流を大きくさせれば、それだけ磁力も大きくなるはずだから、トルクも強くなるはず。
結局、高トルクのステッピングモーターはいらなかったのでは!?という結論に。余計な出費!!
まぁ、人生そんなもんですよね。と諦めています。
ぜひ皆さんもバネをつくりましょう!
いかがだったでしょうか?
必要な材料さえ集められれば、簡単にこのような機械をDIYできちゃいます。
はじめは慣れないことばかりで、電気とか怖い。って思っていましたが、ちゃんと理解して使えば、お手軽にバネをつくることができます。
ちょっと不親切な記述もあったと思いますが、私が参考にしたネット記事の補足的な立ち位置で、皆さんに読んでいただけたらと思います。
それでは、また!