工学部生の生プレス

*就職して元工学部生になりました

大学 専門内容

【製作日誌】現代版からくり人形を作る~制御編~

投稿日:2020年4月12日 更新日:

こんにちは~

前回の記事の中で“からくり人形”のハードは完成させたので,今回はその制御面を作っていきます!
*前回の記事はこちら↓
【製作日誌】現代版からくり人形を作る~メカ編~

それでは~

シュワッチ!


 

①作るもの:

江戸時代に作られた“からくり人形”にモーターを追加することで,現代の日常社会でも使えるものにする!

②用意するもの(制御面):

Arduino Uno

L6470使用 ステッピングモータードライブキット

バイポーラ ステッピングモーター SM-42BYG011

5mmモーターシャフト用ハブ (2個入)

ブレッドボード

パナソニック 単3形アルカリ乾電池 12本パック LR6XJ/12SW

A-CRAFT リード付き 単三電池 4本ボックス 2個セット

ブレッドボード・ジャンパーワイヤ(メス-オス)(20㎝) 40本

超音波距離センサーHC-SR04

絶縁ラジアルリード型積層セラミックコンデンサー0.1μF 50V 2.54mm(10個入)

抵抗300[Ω]

マイクロサーボ9g SG-90

③完成画像:

前回の記事にも載せたので,1枚だけ↓

④完成動画:

⑤プログラム:

プログラムはArduinoIDEのみを使って作りました。

下のプログラムを使って超音波センサからの値を用いて、ステッピングモーターとサーボモータを制御しています。

このプログラムは北の国から電子工作(仮)様が公開して下さっている手軽にステッピングモーターを制御できるプログラムが基になっています。下のプログラムを読んでわからない所があったら下のURLの情報を参考にしてみて下さい!
・北の国から電子工作(仮)様のプログラム:L6470をArduinoで簡単に動かすスケッチ

#include <SPI.h>
#include <Servo.h>
// ピン定義。
#define PIN_SPI_MOSI 11
#define PIN_SPI_MISO 12
#define PIN_SPI_SCK 13
#define PIN_SPI_SS 10
#define PIN_BUSY 9
//サーボモータ関連
const int servoPin = 8; //サーボ接続ピン
Servo myservo; //サーボオブジェクトを生成
int degree[] = {0,-90};
//超音波センサ関連
int echo = 3;
int trig = 2;
double duration = 0; //パルスが行って帰ってくるまでの時間
double distance = 0; //距離
//その他の変数
int n,m,l = 0;
double b_time, e_time, r_time = 0;
//プロトタイプ宣言(絶対ではありませんが・・・)
void ultrasonic(void);
void setup()
{
//サーボのセットアップ
myservo.attach(servoPin); //サーボ変数をピンに割り当て
//超音波センサのピン
pinMode(echo, INPUT );
pinMode(trig, OUTPUT );
delay(1000);
pinMode(PIN_SPI_MOSI, OUTPUT);
pinMode(PIN_SPI_MISO, INPUT);
pinMode(PIN_SPI_SCK, OUTPUT);
pinMode(PIN_SPI_SS, OUTPUT);
pinMode(PIN_BUSY, INPUT);
SPI.begin();
SPI.setDataMode(SPI_MODE3);
SPI.setBitOrder(MSBFIRST);
Serial.begin(9600);
digitalWrite(PIN_SPI_SS, HIGH);
L6470_resetdevice(); //L6470リセット
L6470_setup(); //L6470を設定
}
void loop() {
for (int i=1; i<=10; i++) {
ultrasonic();
distance++;
}
distance = distance / 10;
Serial.println(distance);
if (distance > 4) {
n++;
if (n==1) {
L6470_move(1,200);
}
L6470_softstop();
}
if (distance < 3) {
m++;
if (m == 1) {
b_time = millis();
L6470_move(0,200);
L6470_softstop();
}
L6470_softstop();
e_time = millis();
r_time = e_time - b_time;
if (r_time > 2000) {
l++;
if (l==1) {
L6470_move(1,200);
L6470_softstop();
myservo.write(degree[1]);
}
}
}
e_time = millis();
r_time = e_time - b_time;
if (r_time > 7000) {
myservo.write(degree[0]);
}
}
void L6470_setup(){
L6470_setparam_acc(0x40); //[R, WS] 加速度default 0x08A (12bit) (14.55*val+14.55[step/s^2])
L6470_setparam_dec(0x40); //[R, WS] 減速度default 0x08A (12bit) (14.55*val+14.55[step/s^2])
L6470_setparam_maxspeed(0x40); //[R, WR]最大速度default 0x041 (10bit) (15.25*val+15.25[step/s])
L6470_setparam_minspeed(0x01); //[R, WS]最小速度default 0x000 (1+12bit) (0.238*val[step/s])
L6470_setparam_fsspd(0x3ff); //[R, WR]μステップからフルステップへの切替点速度default 0x027 (10bit) (15.25*val+7.63[step/s])
L6470_setparam_kvalhold(0x50); //[R, WR]停止時励磁電圧default 0x29 (8bit) (Vs[V]*val/256)
L6470_setparam_kvalrun(0x50); //[R, WR]定速回転時励磁電圧default 0x29 (8bit) (Vs[V]*val/256)
L6470_setparam_kvalacc(0x50); //[R, WR]加速時励磁電圧default 0x29 (8bit) (Vs[V]*val/256)
L6470_setparam_kvaldec(0x50); //[R, WR]減速時励磁電圧default 0x29 (8bit) (Vs[V]*val/256)
L6470_setparam_stepmood(0x03); //ステップモードdefault 0x07 (1+3+1+3bit)
}
void ultrasonic(void) {
//超音波センサで距離を測る
digitalWrite(trig, LOW);
delayMicroseconds(2);
digitalWrite( trig, HIGH ); //超音波出力、START
delayMicroseconds(10);
digitalWrite( trig, LOW ); //超音波出力、STOP
duration = pulseIn( echo, HIGH );
if (duration > 0) {
duration = duration/2;
distance = duration*340*100/1000000;
}
}


 

いかがでしたでしょうか?

全2回で“【製作日誌】現代版からくり人形を作る”編をお送りしました。

出来れば、しっかり長い距離を動くものにしたかったのですが、技術・勉強不足でした😢

▲▲▲アリガ島▲▲▲

次回予告
「未定」







-大学, 専門内容

執筆者:


comment

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

This site uses Akismet to reduce spam. Learn how your comment data is processed.

関連記事

3DCADが上手く動かない時の対処法5選

こんにちは~ 今回は“3DCADが上手く動かない時の対処法5選”です。 過去の記事でWindowsノート ProBook 650 G4 2VX22AV-AAAEというパソコンを買ったことを記事にしたの …

加速度センサから角度を取得する

こんばんは。 久しぶりの投稿となってしまいましたm(__)m 大学生はあと1週間で春休みという夢から覚めてしまいます・・・😢 は~~ さて、本題の前に少し近況を! 実は最近、遅かれなが …

流体の自由研究~トリチェリの定理~

こんばんは。 やっと、期末テストが終わりました! ターム制のおかげで期末テストが2つの期間に分かれたおかげで、少し勉強が楽になりましたが、少ないとは言ってもやはり1つ1つの内容が難しくて、大変でした。 …

高校生時代と大学の定期テストの違い(工学部機械科)

こんばんは~ 夜遅くの投稿となってしまいました。 私達の学科では来週、中間テストが「制御工学」と「固体の力学」の2教科あります。   僕は高校生の頃は「大学になったら、テストなんてないんじゃ …

Visual Studio 2017 Communityを使ったC#入門~第2回:LEDをArduinoと協力して光らせる~

こんにちは~ 申し遅れましたが、最近、Twitterを始めました!ちょっとしたことを呟いていきます(笑)よろしければフォローをお願いします→FineManのTwitter さて、今回はArduinoの …

S