こんにちは~
前回の記事の中で“からくり人形”のハードは完成させたので,今回はその制御面を作っていきます!
*前回の記事はこちら↓
【製作日誌】現代版からくり人形を作る~メカ編~
それでは~
シュワッチ!
①作るもの:
②用意するもの(制御面):
・パナソニック 単3形アルカリ乾電池 12本パック LR6XJ/12SW
・A-CRAFT リード付き 単三電池 4本ボックス 2個セット
・ブレッドボード・ジャンパーワイヤ(メス-オス)(20㎝) 40本
・絶縁ラジアルリード型積層セラミックコンデンサー0.1μF 50V 2.54mm(10個入)
③完成画像:
前回の記事にも載せたので,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回で“【製作日誌】現代版からくり人形を作る”編をお送りしました。
出来れば、しっかり長い距離を動くものにしたかったのですが、技術・勉強不足でした
▲▲▲アリガ島▲▲▲
「未定」