//For Hiraoka
//ShockSensor & Solenoid & Motor
//2009.7.21
//PinAssign
int SOLENOID=11;
int SWITCH=12;
int SHOCK=14;
//StepMotorPin
int ST_X1=2;
int ST_X2=4;
int ST_Y1=3;
int ST_Y2=5;
//Tsumami
int Pot=5;
//Value
#define MAX 100
int rythm_cnt=0;
int rythm[MAX];
int dly;
int MotorCnt;
//Setup
void setup(){
pinMode(SOLENOID,OUTPUT);
pinMode(SHOCK,INPUT);
pinMode(SWITCH,INPUT);
pinMode(ST_X1, OUTPUT);
pinMode(ST_X2, OUTPUT);
pinMode(ST_Y1, OUTPUT);
pinMode(ST_Y2, OUTPUT);
pinMode(ledPin, OUTPUT);
for(int i=0; i<MAX; i++){
rythm[i]=0;
}
}
//Loop
void loop(){
rythm_cnt++;
if(rythm_cnt>=MAX) rythm_cnt=0;
if(digitalRead(SHOCK)==1){
rythm[rythm_cnt]=1;
}
dly=50;
for(int i=0; i<dly; i++){
delay(1);
if(digitalRead(SWITCH)==1) {
for(int j=0; j<MAX; j++){
rythm[j]=0;
rythm_cnt=0;
}
}
if(rythm[rythm_cnt]==0){
MotorCnt++;
MoveMotor(MotorCnt);
}
}
if(rythm[rythm_cnt]==1){
digitalWrite(SOLENOID,HIGH);
}
else{
digitalWrite(SOLENOID,LOW);
MotorCnt++;
MoveMotor(MotorCnt);
}
}
//MoveMotor
void MoveMotor(int stp){
int s;
s=stp%8;
switch(s){
case 0:
digitalWrite(ST_X1, HIGH);
digitalWrite(ST_X2, LOW);
digitalWrite(ST_Y1, LOW);
digitalWrite(ST_Y2, LOW);
dly = analogRead(Pot)/4;
delay(dly);
break;
case 1:
digitalWrite(ST_X1, HIGH);
digitalWrite(ST_X2, HIGH);
digitalWrite(ST_Y1, LOW);
digitalWrite(ST_Y2, LOW);
dly = analogRead(Pot)/4;
delay(dly);
break;
case 2:
digitalWrite(ST_X1, LOW);
digitalWrite(ST_X2, HIGH);
digitalWrite(ST_Y1, LOW);
digitalWrite(ST_Y2, LOW);
dly = analogRead(Pot)/4;
delay(dly);
break;
case 3:
digitalWrite(ST_X1, LOW);
digitalWrite(ST_X2, HIGH);
digitalWrite(ST_Y1, HIGH);
digitalWrite(ST_Y2, LOW);
dly = analogRead(Pot)/4;
delay(dly);
break;
case 4:
digitalWrite(ST_X1, LOW);
digitalWrite(ST_X2, LOW);
digitalWrite(ST_Y1, HIGH);
digitalWrite(ST_Y2, LOW);
dly = analogRead(Pot)/4;
delay(dly);
break;
case 5:
digitalWrite(ST_X1, LOW);
digitalWrite(ST_X2, LOW);
digitalWrite(ST_Y1, HIGH);
digitalWrite(ST_Y2, HIGH);
dly = analogRead(Pot)/4;
delay(dly);
break;
case 6:
digitalWrite(ST_X1, LOW);
digitalWrite(ST_X2, LOW);
digitalWrite(ST_Y1, LOW);
digitalWrite(ST_Y2, HIGH);
dly = analogRead(Pot)/4;
delay(dly);
break;
case 7:
digitalWrite(ST_X1, HIGH);
digitalWrite(ST_X2, LOW);
digitalWrite(ST_Y1, LOW);
digitalWrite(ST_Y2, HIGH);
dly = analogRead(Pot)/4;
delay(dly);
break;
}
}
//StopMotor
void StopMotor(){
digitalWrite(ST_X1, LOW);
digitalWrite(ST_X2, LOW);
digitalWrite(ST_Y1, LOW);
digitalWrite(ST_Y2, LOW);
}
ひらおかさんのプログラムサンプル3
サーボモーターが4つ、スイッチが4つ、リセットスイッチが1つ。
//For Monma
//Servo*4 and Switch*4 and ResetSwitch*1
//2009.7.17
//Pin
//DIGITAL PIN (8,9,10,11)
int Servo_pin[4]={8,9,10,11};
//ANALOG IN PIN (0, 1, 2, 3)
int Switch_pin[4]={14,15,16,17};
//ANALOG IN PIN (5)
int ResetSwitch_pin = 19;
//ServoSpeed
int Speed_val[4]={50,50,50,50};
//Value
signed int Servo_val[4]={
0,0,0,0};
int MaxCnt=2000;
//Init
void setup(){
for(int i=0; i<4; i++){
pinMode(Servo_pin[i],OUTPUT);
pinMode(Switch_pin[i],INPUT);
Servo_val[i]=90;
}
pinMode(ResetSwitch_pin,INPUT);
}
//Loop
void loop(){
for(int i=0; i<1; i++){
if(digitalRead(Switch_pin[i])){
Servo_val[i]+=Speed_val[i];
if(Servo_val[i]>MaxCnt)Servo_val[i]=MaxCnt;
}
else{
if(digitalRead(ResetSwitch_pin)==1) Servo_val[i]=90;
}
}
Control_Servo4();
}
void Control_Servo4(){
//Control Servo 4
for(int i=0; i<4; i++){
digitalWrite(Servo_pin[i],HIGH);
}
for(int i=0; i<4; i++){
delayMicroseconds(Servo_val[i]+500/4);
}
for(int i=0; i<4; i++){
digitalWrite(Servo_pin[i],LOW);
}
for(int i=0; i<4; i++){
delayMicroseconds((10000-(Servo_val[i]+500))/4);
}
delayMicroseconds(10000);
}
アルミの板の素材
アルミの板は、NCマシン(いつもブーンという機械)で削れます。
アクリルのように、板をカットして、折り曲げることでいろんな形にできます。
削りやすくできているアルミが、「A5052」です。「快削アルミ」ともいいます。
ホームセンターで売っているアルミの板だと、粘りっこいアルミになっていて、削りにくいです。ロボット系を考えている人は、アルミはA5052にしないと加工がやりにくいです。
オリジナルマインドで買えます。
ベアリングなどの動かす系の部品
オリジナルマインド
回転するものを作りたいときに、きちんとベアリングを入れてあるかどうかが、キーポイントになります。外から見えなくて地味だけど、しっかり作りたい人はいれておいて間違いないです。
ベアリングで、板に軸を固定する方法が紹介されていて、固定方法を考えるのに参考になります。
LEDいろいろ
LEDは、秋月電子で買うのが安いです。大量に欲しいときも、だいたい大丈夫です。
最近、テープ状のLEDを扱ってくれてるので、LEDで手軽に広めに明るくしたいところなどは便利です。
最近は、千石電商がLED向けに、放熱基板を売ってくれてます。手軽にLED照明を作りたい人は千石電商の基板がいいと思います。通販では扱ってないのかな??
その他で、ものすごく明るいLEDが欲しかったりすると、「パワーLED」って呼ばれるものがあります。
これは、ストロベリーリナックスがいいです。
乾電池でパワーLEDをつけられる部品が出ました!
ほかに、パワーLED関係は、オーディオQも多種類あつかっていていいです。オーディオなのにLEDなのはナゾです。。
ロータリーエンコーダ
ボリュームのツマミで、何回転でもできる部分には、ロータリーエンコーダがつかわれてます。
買うときの参考に、通販のページの画像で2つだけポイントを。
1回転の分解度が高いものほど、若干値段も高いです。
千石電商から買えます。
センサーとLEDとモーターが組み合わさったサンプル
//For hiraoka
//Sensor and LED
//and STEPMOTOR
//20090707
//Pin
int ledpin1 = 8;
int ledpin2 = 9;
int ledpin3 = 10;
int ledpin4 = 13;
int ST_X1=2;
int ST_X2=4;
int ST_Y1=3;
int ST_Y2=5;
int Pot=5;
int Switch=6;
//Value
int led1 = 0;
int led2 = 0;
int led3 = 0;
int led4 = 0;
int sensor1 = 0;
int sensor2 = 0;
int sensor3 = 0;
int sensor4 = 0;
int dly;
int Count=0;
void setup(){
pinMode(ledpin1,OUTPUT);
pinMode(ledpin2,OUTPUT);
pinMode(ledpin3,OUTPUT);
pinMode(ledpin4,OUTPUT);
pinMode(ST_X1, OUTPUT);
pinMode(ST_X2, OUTPUT);
pinMode(ST_Y1, OUTPUT);
pinMode(ST_Y2, OUTPUT);
pinMode(Switch,INPUT);
dly = analogRead(Pot)/4;
}
void loop(){
sensor1 = analogRead(0)/4;
sensor2 = analogRead(1)/4;
sensor3 = analogRead(2)/4;
sensor4 = analogRead(5)/4;
led1 = sensor1;
led2 = sensor2;
led3 = sensor3;
//preview
led4 = sensor4;
soft_pwm();
if(digitalRead(Switch)==1){
Count=Count+1;
MoveMotor(Count);
}
else{
StopMotor();
}
}
void soft_pwm(){
for(int Duty=255; Duty>1; Duty--){
if(Duty<=led1){
digitalWrite(ledpin1, HIGH);
}
else{
digitalWrite(ledpin1, LOW);
}
if(Duty<=led2){
digitalWrite(ledpin2, HIGH);
}
else{
digitalWrite(ledpin2, LOW);
}
if(Duty<=led3){
digitalWrite(ledpin3, HIGH);
}
else{
digitalWrite(ledpin3, LOW);
}
if(Duty<=led4){
digitalWrite(ledpin4, HIGH);
}
else{
digitalWrite(ledpin4, LOW);
}
}
digitalWrite(ledpin1,LOW);
digitalWrite(ledpin2,LOW);
digitalWrite(ledpin3,LOW);
digitalWrite(ledpin4,LOW);
}
void MoveMotor(int stp){
int s;
s=stp%8;
switch(s){
case 0:
digitalWrite(ST_X1, HIGH);
digitalWrite(ST_X2, LOW);
digitalWrite(ST_Y1, LOW);
digitalWrite(ST_Y2, LOW);
dly = analogRead(Pot)/4;
delay(dly);
break;
case 1:
digitalWrite(ST_X1, HIGH);
digitalWrite(ST_X2, HIGH);
digitalWrite(ST_Y1, LOW);
digitalWrite(ST_Y2, LOW);
dly = analogRead(Pot)/4;
delay(dly);
break;
case 2:
digitalWrite(ST_X1, LOW);
digitalWrite(ST_X2, HIGH);
digitalWrite(ST_Y1, LOW);
digitalWrite(ST_Y2, LOW);
dly = analogRead(Pot)/4;
delay(dly);
break;
case 3:
digitalWrite(ST_X1, LOW);
digitalWrite(ST_X2, HIGH);
digitalWrite(ST_Y1, HIGH);
digitalWrite(ST_Y2, LOW);
dly = analogRead(Pot)/4;
delay(dly);
break;
case 4:
digitalWrite(ST_X1, LOW);
digitalWrite(ST_X2, LOW);
digitalWrite(ST_Y1, HIGH);
digitalWrite(ST_Y2, LOW);
dly = analogRead(Pot)/4;
delay(dly);
break;
case 5:
digitalWrite(ST_X1, LOW);
digitalWrite(ST_X2, LOW);
digitalWrite(ST_Y1, HIGH);
digitalWrite(ST_Y2, HIGH);
dly = analogRead(Pot)/4;
delay(dly);
break;
case 6:
digitalWrite(ST_X1, LOW);
digitalWrite(ST_X2, LOW);
digitalWrite(ST_Y1, LOW);
digitalWrite(ST_Y2, HIGH);
dly = analogRead(Pot)/4;
delay(dly);
break;
case 7:
digitalWrite(ST_X1, HIGH);
digitalWrite(ST_X2, LOW);
digitalWrite(ST_Y1, LOW);
digitalWrite(ST_Y2, HIGH);
dly = analogRead(Pot)/4;
delay(dly);
break;
}
}
void StopMotor(){
digitalWrite(ST_X1, LOW);
digitalWrite(ST_X2, LOW);
digitalWrite(ST_Y1, LOW);
digitalWrite(ST_Y2, LOW);
}
センサーとLEDで確認するプログラムサンプル
//For hiraoka
//Sensor and LED
//20090707
//Pin
int ledpin1 = 8;
int ledpin2 = 9;
int ledpin3 = 12;
int ledpin4 = 11;
int ledpin5 = 13;
//Value
int led1 = 0;
int led2 = 0;
int led3 = 0;
int led4 = 0;
int led5 = 0;
int sensor1 = 0;
int sensor2 = 0;
int sensor3 = 0;
int sensor4 = 0;
int sensor5 = 0;
void setup(){
pinMode(ledpin1,OUTPUT);
pinMode(ledpin2,OUTPUT);
pinMode(ledpin3,OUTPUT);
pinMode(ledpin4,OUTPUT);
pinMode(ledpin5,OUTPUT);
}
void loop(){
sensor1 = analogRead(0);
sensor2 = analogRead(1);
sensor3 = analogRead(2);
sensor4 = analogRead(3);
sensor5 = analogRead(5);
led1 = sensor1;
led2 = sensor2;
led3 = sensor3;
led4 = sensor4;
led5 = sensor5;
soft_pwm();
}
void soft_pwm(){
for(int Duty=1023; Duty>1; Duty--){
if(Duty<=led1){
digitalWrite(ledpin1, HIGH);
}
else{
digitalWrite(ledpin1, LOW);
}
if(Duty<=led2){
digitalWrite(ledpin2, HIGH);
}
else{
digitalWrite(ledpin2, LOW);
}
if(Duty<=led3){
digitalWrite(ledpin3, HIGH);
}
else{
digitalWrite(ledpin3, LOW);
}
if(Duty<=led4){
digitalWrite(ledpin4, HIGH);
}
else{
digitalWrite(ledpin4, LOW);
}
if(Duty<=led5){
digitalWrite(ledpin5, HIGH);
}
else{
digitalWrite(ledpin5, LOW);
}
}
digitalWrite(ledpin1,LOW);
digitalWrite(ledpin2,LOW);
digitalWrite(ledpin3,LOW);
digitalWrite(ledpin4,LOW);
digitalWrite(ledpin5,LOW);
}
でわくんのプログラムサンプル
/*----
ボタン押してない
・モーター回らない
・LEDも光らない
ボタン押す
・モーター回る
・6つのLEDの位置を時計としてみると、
a:12時6時が光り
b:10時4時が光り
c:8時と2時が光り
d:最後に6つ全部が光る
a~d繰り返し
もう一度スイッチを押すとモーターもLEDも止まる。
LEDの色は青でお願いします
----*/
//PinAssign
int ST_X1=2;
int ST_X2=4;
int ST_Y1=3;
int ST_Y2=5;
int ledPin=13;
int LED1=8;
int LED2=9;
int LED3=10;
int LED4=11;
int LED5=12;
int LED6=13;
//PotentionMeter
int Pot=5;
//Switch
int Switch=6;
int dly;
signed int Count=0;
signed int Dimmention=1;
int switch_status;
void setup(){
pinMode(ST_X1, OUTPUT);
pinMode(ST_X2, OUTPUT);
pinMode(ST_Y1, OUTPUT);
pinMode(ST_Y2, OUTPUT);
pinMode(ledPin, OUTPUT);
//POT is Default AnalogInput
pinMode(Switch,INPUT);
dly = analogRead(Pot)/4;
switch_status=0;
}
void loop(){
if(digitalRead(Switch)==1){
if(switch_status==0){
switch_status=1;
}else{
switch_status=0;
}
}
if(switch_status==1){
Count=Count+1;
if(Count>96){
Count=0;
}else if(Count<0){
Count=96;
}
LightLED(Count);
MoveMotor(Count);
}else{
StopLED();
StopMotor();
}
}
void LightLED(int stp){
int s;
s=(stp/10)%6;
switch(s){
case 0:
digitalWrite(LED1,LOW);
digitalWrite(LED2,HIGH);
digitalWrite(LED3,HIGH);
digitalWrite(LED4,HIGH);
digitalWrite(LED5,HIGH);
digitalWrite(LED6,HIGH);
break;
case 1:
digitalWrite(LED1,HIGH);
digitalWrite(LED2,LOW);
digitalWrite(LED3,HIGH);
digitalWrite(LED4,HIGH);
digitalWrite(LED5,HIGH);
digitalWrite(LED6,HIGH);
break;
case 2:
digitalWrite(LED1,HIGH);
digitalWrite(LED2,HIGH);
digitalWrite(LED3,LOW);
digitalWrite(LED4,HIGH);
digitalWrite(LED5,HIGH);
digitalWrite(LED6,HIGH);
break;
case 3:
digitalWrite(LED1,HIGH);
digitalWrite(LED2,HIGH);
digitalWrite(LED3,HIGH);
digitalWrite(LED4,LOW);
digitalWrite(LED5,HIGH);
digitalWrite(LED6,HIGH);
break;
case 4:
digitalWrite(LED1,HIGH);
digitalWrite(LED2,HIGH);
digitalWrite(LED3,HIGH);
digitalWrite(LED4,HIGH);
digitalWrite(LED5,LOW);
digitalWrite(LED6,HIGH);
break;
case 5:
digitalWrite(LED1,HIGH);
digitalWrite(LED2,HIGH);
digitalWrite(LED3,HIGH);
digitalWrite(LED4,HIGH);
digitalWrite(LED5,HIGH);
digitalWrite(LED6,LOW);
break;
}
}
void StopLED(){
digitalWrite(LED1,HIGH);
digitalWrite(LED2,HIGH);
digitalWrite(LED3,HIGH);
digitalWrite(LED4,HIGH);
digitalWrite(LED5,HIGH);
digitalWrite(LED6,HIGH);
}
void MoveMotor(int stp){
int s;
s=stp%8;
switch(s){
case 0:
digitalWrite(ST_X1, HIGH);
digitalWrite(ST_X2, LOW);
digitalWrite(ST_Y1, LOW);
digitalWrite(ST_Y2, LOW);
dly = analogRead(Pot)/4;
delay(dly);
break;
case 1:
digitalWrite(ST_X1, HIGH);
digitalWrite(ST_X2, HIGH);
digitalWrite(ST_Y1, LOW);
digitalWrite(ST_Y2, LOW);
dly = analogRead(Pot)/4;
delay(dly);
break;
case 2:
digitalWrite(ST_X1, LOW);
digitalWrite(ST_X2, HIGH);
digitalWrite(ST_Y1, LOW);
digitalWrite(ST_Y2, LOW);
dly = analogRead(Pot)/4;
delay(dly);
break;
case 3:
digitalWrite(ST_X1, LOW);
digitalWrite(ST_X2, HIGH);
digitalWrite(ST_Y1, HIGH);
digitalWrite(ST_Y2, LOW);
dly = analogRead(Pot)/4;
delay(dly);
break;
case 4:
digitalWrite(ST_X1, LOW);
digitalWrite(ST_X2, LOW);
digitalWrite(ST_Y1, HIGH);
digitalWrite(ST_Y2, LOW);
dly = analogRead(Pot)/4;
delay(dly);
break;
case 5:
digitalWrite(ST_X1, LOW);
digitalWrite(ST_X2, LOW);
digitalWrite(ST_Y1, HIGH);
digitalWrite(ST_Y2, HIGH);
dly = analogRead(Pot)/4;
delay(dly);
break;
case 6:
digitalWrite(ST_X1, LOW);
digitalWrite(ST_X2, LOW);
digitalWrite(ST_Y1, LOW);
digitalWrite(ST_Y2, HIGH);
dly = analogRead(Pot)/4;
delay(dly);
break;
case 7:
digitalWrite(ST_X1, HIGH);
digitalWrite(ST_X2, LOW);
digitalWrite(ST_Y1, LOW);
digitalWrite(ST_Y2, HIGH);
dly = analogRead(Pot)/4;
delay(dly);
break;
}
}
void StopMotor(){
digitalWrite(ST_X1, LOW);
digitalWrite(ST_X2, LOW);
digitalWrite(ST_Y1, LOW);
digitalWrite(ST_Y2, LOW);
}
プログラムサンプル
//pin select
int MOTOR =11;
int LED=10;
//サウンドのレベル用変数
int sound_level;
//サウンド感度調整ツマミ用変数
int analog0;
//モーターの回る時間調整ツマミ用変数
int analog1;
//LEDの明るさ用変数
int led_blight;
//forループ用変数
int j;
//セットアップ
void setup(){
//モーターピンをアウトプット(電気が出るように)
pinMode(MOTOR,OUTPUT);
//LEDピンもアウトプット(電気が出るように)
pinMode(LED,OUTPUT);
}
//メインループ
void loop(){
//サウンドレベルを読む(analog5ピン)
sound_level=analogRead(5);
//サウンド感度調整ツマミを読む(analog3ピン)
analog0=analogRead(3);
//もしも、サウンドレベルが感度調整ツマミより大きくなったら、
if(sound_level>analog0){
//モーターに電気を流す(回転)
digitalWrite(MOTOR,HIGH);
//LEDの明るさ変数を最大にする
led_blight=1023;
//モーターの回転時間調整ツマミを読む(alanog4ピン)
analog1=analogRead(4);
//モーターの回転調整の数値の回数だけ、delay(1)を繰り返す
for(j=0; j < analog1; j++){
delay(1);
}
//モーターの電気をとめる(回転停止)
digitalWrite(MOTOR,LOW);
//もう一度、モーター回転時間調整ツマミを読む
//その時間を今度は4で割る
analog1=analogRead(4)/4;
//回転時間調整ツマミを4で割った回数だけ、delay(1)を繰り返す
for(j=0; j < analog1; j++){
delay(1);
}
}
//そうじゃないとき(サウンドレベルが感度調整ツマミより大きくないとき)
else{
//LEDの明るさ変数に、0.99を掛け算して、徐々に減らす
//(じんわりと消えていくような場合のテクです)
led_blight*=0.99;
//モーターの電気をストップ(回転停止)
digitalWrite(MOTOR,LOW);
}
//LEDの明るさを実際にピンに反映させる
analogWrite(LED,1023-led_blight);
}
参考リンク
6月17日(水)の授業でみんなの相談をもとに調べたサイトです。
関係ない人も今後のために見てみてください。
木製ヤンセンウォーカー
アクリル+Arduinoでヤンセン(カットデータ付き!)
ペットボトルにいれた人形が上下するおもちゃのしくみ
コピーのトナーでつくる磁性流体
熱に関する実験
熱の実験室
熱の実験コンテスト(これおもしろい!)
BBCでArduinoがとりあげられたそうです〜
カリンバ
関係ない人も今後のために見てみてください。
木製ヤンセンウォーカー
アクリル+Arduinoでヤンセン(カットデータ付き!)
ペットボトルにいれた人形が上下するおもちゃのしくみ
コピーのトナーでつくる磁性流体
熱に関する実験
熱の実験室
熱の実験コンテスト(これおもしろい!)
BBCでArduinoがとりあげられたそうです〜
カリンバ
実用的なステッピングモーターのプログラム その4
10回押したら、一定ステップ回転する。
----
//StepMotor sample
//2009.6.2
//PinAssign
int ST_X1=2;
int ST_X2=4;
int ST_Y1=3;
int ST_Y2=5;
int ledPin=13;
//PotentionMeter
int Pot=5;
//Switch
int Switch=6;
int dly;
signed int Count=0;
signed int Dimmention=1;
int Switch_status=0;
int Switch_count=0;
void setup(){
pinMode(ST_X1, OUTPUT);
pinMode(ST_X2, OUTPUT);
pinMode(ST_Y1, OUTPUT);
pinMode(ST_Y2, OUTPUT);
pinMode(ledPin, OUTPUT);
//POT is Default AnalogInput
pinMode(Switch,INPUT);
dly = analogRead(Pot)/4;
}
void loop(){
if(digitalRead(Switch)==1){
//Debounce
delay(25);
if(Switch_status==0){
Dimmention=1;
Switch_status=1;
Switch_count=Switch_count+1;
digitalWrite(ledPin, HIGH);
}
}else{
if(Switch_status==1){
Dimmention=-1;
Switch_status=0;
digitalWrite(ledPin, LOW);
}
}
if(Switch_count>=10){
Switch_count=0;
for(Count=0; Count<96; Count=Count+1){
MoveMotor(Count);
}
}
}
void MoveMotor(int stp){
int s;
s=stp%8;
switch(s){
case 0:
digitalWrite(ST_X1, HIGH);
digitalWrite(ST_X2, LOW);
digitalWrite(ST_Y1, LOW);
digitalWrite(ST_Y2, LOW);
dly = analogRead(Pot)/4;
delay(dly);
break;
case 1:
digitalWrite(ST_X1, HIGH);
digitalWrite(ST_X2, HIGH);
digitalWrite(ST_Y1, LOW);
digitalWrite(ST_Y2, LOW);
dly = analogRead(Pot)/4;
delay(dly);
break;
case 2:
digitalWrite(ST_X1, LOW);
digitalWrite(ST_X2, HIGH);
digitalWrite(ST_Y1, LOW);
digitalWrite(ST_Y2, LOW);
dly = analogRead(Pot)/4;
delay(dly);
break;
case 3:
digitalWrite(ST_X1, LOW);
digitalWrite(ST_X2, HIGH);
digitalWrite(ST_Y1, HIGH);
digitalWrite(ST_Y2, LOW);
dly = analogRead(Pot)/4;
delay(dly);
break;
case 4:
digitalWrite(ST_X1, LOW);
digitalWrite(ST_X2, LOW);
digitalWrite(ST_Y1, HIGH);
digitalWrite(ST_Y2, LOW);
dly = analogRead(Pot)/4;
delay(dly);
break;
case 5:
digitalWrite(ST_X1, LOW);
digitalWrite(ST_X2, LOW);
digitalWrite(ST_Y1, HIGH);
digitalWrite(ST_Y2, HIGH);
dly = analogRead(Pot)/4;
delay(dly);
break;
case 6:
digitalWrite(ST_X1, LOW);
digitalWrite(ST_X2, LOW);
digitalWrite(ST_Y1, LOW);
digitalWrite(ST_Y2, HIGH);
dly = analogRead(Pot)/4;
delay(dly);
break;
case 7:
digitalWrite(ST_X1, HIGH);
digitalWrite(ST_X2, LOW);
digitalWrite(ST_Y1, LOW);
digitalWrite(ST_Y2, HIGH);
dly = analogRead(Pot)/4;
delay(dly);
break;
}
}
void StopMotor(){
digitalWrite(ST_X1, LOW);
digitalWrite(ST_X2, LOW);
digitalWrite(ST_Y1, LOW);
digitalWrite(ST_Y2, LOW);
}
----
//StepMotor sample
//2009.6.2
//PinAssign
int ST_X1=2;
int ST_X2=4;
int ST_Y1=3;
int ST_Y2=5;
int ledPin=13;
//PotentionMeter
int Pot=5;
//Switch
int Switch=6;
int dly;
signed int Count=0;
signed int Dimmention=1;
int Switch_status=0;
int Switch_count=0;
void setup(){
pinMode(ST_X1, OUTPUT);
pinMode(ST_X2, OUTPUT);
pinMode(ST_Y1, OUTPUT);
pinMode(ST_Y2, OUTPUT);
pinMode(ledPin, OUTPUT);
//POT is Default AnalogInput
pinMode(Switch,INPUT);
dly = analogRead(Pot)/4;
}
void loop(){
if(digitalRead(Switch)==1){
//Debounce
delay(25);
if(Switch_status==0){
Dimmention=1;
Switch_status=1;
Switch_count=Switch_count+1;
digitalWrite(ledPin, HIGH);
}
}else{
if(Switch_status==1){
Dimmention=-1;
Switch_status=0;
digitalWrite(ledPin, LOW);
}
}
if(Switch_count>=10){
Switch_count=0;
for(Count=0; Count<96; Count=Count+1){
MoveMotor(Count);
}
}
}
void MoveMotor(int stp){
int s;
s=stp%8;
switch(s){
case 0:
digitalWrite(ST_X1, HIGH);
digitalWrite(ST_X2, LOW);
digitalWrite(ST_Y1, LOW);
digitalWrite(ST_Y2, LOW);
dly = analogRead(Pot)/4;
delay(dly);
break;
case 1:
digitalWrite(ST_X1, HIGH);
digitalWrite(ST_X2, HIGH);
digitalWrite(ST_Y1, LOW);
digitalWrite(ST_Y2, LOW);
dly = analogRead(Pot)/4;
delay(dly);
break;
case 2:
digitalWrite(ST_X1, LOW);
digitalWrite(ST_X2, HIGH);
digitalWrite(ST_Y1, LOW);
digitalWrite(ST_Y2, LOW);
dly = analogRead(Pot)/4;
delay(dly);
break;
case 3:
digitalWrite(ST_X1, LOW);
digitalWrite(ST_X2, HIGH);
digitalWrite(ST_Y1, HIGH);
digitalWrite(ST_Y2, LOW);
dly = analogRead(Pot)/4;
delay(dly);
break;
case 4:
digitalWrite(ST_X1, LOW);
digitalWrite(ST_X2, LOW);
digitalWrite(ST_Y1, HIGH);
digitalWrite(ST_Y2, LOW);
dly = analogRead(Pot)/4;
delay(dly);
break;
case 5:
digitalWrite(ST_X1, LOW);
digitalWrite(ST_X2, LOW);
digitalWrite(ST_Y1, HIGH);
digitalWrite(ST_Y2, HIGH);
dly = analogRead(Pot)/4;
delay(dly);
break;
case 6:
digitalWrite(ST_X1, LOW);
digitalWrite(ST_X2, LOW);
digitalWrite(ST_Y1, LOW);
digitalWrite(ST_Y2, HIGH);
dly = analogRead(Pot)/4;
delay(dly);
break;
case 7:
digitalWrite(ST_X1, HIGH);
digitalWrite(ST_X2, LOW);
digitalWrite(ST_Y1, LOW);
digitalWrite(ST_Y2, HIGH);
dly = analogRead(Pot)/4;
delay(dly);
break;
}
}
void StopMotor(){
digitalWrite(ST_X1, LOW);
digitalWrite(ST_X2, LOW);
digitalWrite(ST_Y1, LOW);
digitalWrite(ST_Y2, LOW);
}
マリオの音が鳴るプログラム(おまけ)
ちょっと気分転換で。
ハンダ付けの上からスピーカーをつけるのが難しいので、Arduinoから基板を外してください。
スピーカーのピンを、10番ピンと、GNDピンに差し込んで準備完了。
----
int SpeakerPin = 10;
unsigned int i;
unsigned int j;
void setup(){
pinMode(SpeakerPin, OUTPUT);
}
void mario_1up(){
for (i=0; i<97; i++){
digitalWrite(SpeakerPin,HIGH);
delayMicroseconds(379);
digitalWrite(SpeakerPin,LOW);
delayMicroseconds(379);
}
for (i=0; i<235; i++){
digitalWrite(SpeakerPin,HIGH);
delayMicroseconds(319);
digitalWrite(SpeakerPin,LOW);
delayMicroseconds(319);
}
for (i=0; i<396; i++){
digitalWrite(SpeakerPin,HIGH);
delayMicroseconds(189);
digitalWrite(SpeakerPin,LOW);
delayMicroseconds(189);
}
for (i=0; i<315; i++){
digitalWrite(SpeakerPin,HIGH);
delayMicroseconds(238);
digitalWrite(SpeakerPin,LOW);
delayMicroseconds(238);
}
for (i=0; i<353; i++){
digitalWrite(SpeakerPin,HIGH);
delayMicroseconds(212);
digitalWrite(SpeakerPin,LOW);
delayMicroseconds(212);
}
for (i=0; i<471; i++){
digitalWrite(SpeakerPin,HIGH);
delayMicroseconds(159);
digitalWrite(SpeakerPin,LOW);
delayMicroseconds(159);
}
}
void get_coin(){
for (i=0; i<250; i++){
digitalWrite(SpeakerPin,HIGH);
delayMicroseconds(253);
digitalWrite(SpeakerPin,LOW);
delayMicroseconds(253);
}
for (i=0; i<500; i++){
digitalWrite(SpeakerPin,HIGH);
delayMicroseconds(189);
digitalWrite(SpeakerPin,LOW);
delayMicroseconds(189);
}
delay(50);
}
void loop(){
for(j=0; j<10; j++){
get_coin();
delay(50);
}
mario_1up();
delay(500);
}
ハンダ付けの上からスピーカーをつけるのが難しいので、Arduinoから基板を外してください。
スピーカーのピンを、10番ピンと、GNDピンに差し込んで準備完了。
----
int SpeakerPin = 10;
unsigned int i;
unsigned int j;
void setup(){
pinMode(SpeakerPin, OUTPUT);
}
void mario_1up(){
for (i=0; i<97; i++){
digitalWrite(SpeakerPin,HIGH);
delayMicroseconds(379);
digitalWrite(SpeakerPin,LOW);
delayMicroseconds(379);
}
for (i=0; i<235; i++){
digitalWrite(SpeakerPin,HIGH);
delayMicroseconds(319);
digitalWrite(SpeakerPin,LOW);
delayMicroseconds(319);
}
for (i=0; i<396; i++){
digitalWrite(SpeakerPin,HIGH);
delayMicroseconds(189);
digitalWrite(SpeakerPin,LOW);
delayMicroseconds(189);
}
for (i=0; i<315; i++){
digitalWrite(SpeakerPin,HIGH);
delayMicroseconds(238);
digitalWrite(SpeakerPin,LOW);
delayMicroseconds(238);
}
for (i=0; i<353; i++){
digitalWrite(SpeakerPin,HIGH);
delayMicroseconds(212);
digitalWrite(SpeakerPin,LOW);
delayMicroseconds(212);
}
for (i=0; i<471; i++){
digitalWrite(SpeakerPin,HIGH);
delayMicroseconds(159);
digitalWrite(SpeakerPin,LOW);
delayMicroseconds(159);
}
}
void get_coin(){
for (i=0; i<250; i++){
digitalWrite(SpeakerPin,HIGH);
delayMicroseconds(253);
digitalWrite(SpeakerPin,LOW);
delayMicroseconds(253);
}
for (i=0; i<500; i++){
digitalWrite(SpeakerPin,HIGH);
delayMicroseconds(189);
digitalWrite(SpeakerPin,LOW);
delayMicroseconds(189);
}
delay(50);
}
void loop(){
for(j=0; j<10; j++){
get_coin();
delay(50);
}
mario_1up();
delay(500);
}
実用的なステッピングモーターのプログラム その3
スイッチを押して、回転方向を切り替えます。
こちらで解説
----
//StepMotor sample
//2009.6.2
//PinAssign
int ST_X1=2;
int ST_X2=4;
int ST_Y1=3;
int ST_Y2=5;
int ledPin=13;
//PotentionMeter
int Pot=5;
//Switch
int Switch=6;
int dly;
signed int Count=0;
signed int Dimmention=1;
int Switch_status=0;
void setup(){
pinMode(ST_X1, OUTPUT);
pinMode(ST_X2, OUTPUT);
pinMode(ST_Y1, OUTPUT);
pinMode(ST_Y2, OUTPUT);
pinMode(ledPin, OUTPUT);
//POT is Default AnalogInput
pinMode(Switch,INPUT);
dly = analogRead(Pot)/4;
}
void loop(){
if(digitalRead(Switch)==1){
if(Switch_status==0){
Dimmention=1;
Switch_status=1;
}
}else{
if(Switch_status==1){
Dimmention=-1;
Switch_status=0;
}
}
Count=Count+Dimmention;
if(Count>96){
Count=0;
}else if(Count<0){
Count=96;
}
MoveMotor(Count);
}
void MoveMotor(int stp){
int s;
s=stp%8;
switch(s){
case 0:
digitalWrite(ST_X1, HIGH);
digitalWrite(ST_X2, LOW);
digitalWrite(ST_Y1, LOW);
digitalWrite(ST_Y2, LOW);
dly = analogRead(Pot)/4;
delay(dly);
break;
case 1:
digitalWrite(ST_X1, HIGH);
digitalWrite(ST_X2, HIGH);
digitalWrite(ST_Y1, LOW);
digitalWrite(ST_Y2, LOW);
dly = analogRead(Pot)/4;
delay(dly);
break;
case 2:
digitalWrite(ST_X1, LOW);
digitalWrite(ST_X2, HIGH);
digitalWrite(ST_Y1, LOW);
digitalWrite(ST_Y2, LOW);
dly = analogRead(Pot)/4;
delay(dly);
break;
case 3:
digitalWrite(ST_X1, LOW);
digitalWrite(ST_X2, HIGH);
digitalWrite(ST_Y1, HIGH);
digitalWrite(ST_Y2, LOW);
dly = analogRead(Pot)/4;
delay(dly);
break;
case 4:
digitalWrite(ST_X1, LOW);
digitalWrite(ST_X2, LOW);
digitalWrite(ST_Y1, HIGH);
digitalWrite(ST_Y2, LOW);
dly = analogRead(Pot)/4;
delay(dly);
break;
case 5:
digitalWrite(ST_X1, LOW);
digitalWrite(ST_X2, LOW);
digitalWrite(ST_Y1, HIGH);
digitalWrite(ST_Y2, HIGH);
dly = analogRead(Pot)/4;
delay(dly);
break;
case 6:
digitalWrite(ST_X1, LOW);
digitalWrite(ST_X2, LOW);
digitalWrite(ST_Y1, LOW);
digitalWrite(ST_Y2, HIGH);
dly = analogRead(Pot)/4;
delay(dly);
break;
case 7:
digitalWrite(ST_X1, HIGH);
digitalWrite(ST_X2, LOW);
digitalWrite(ST_Y1, LOW);
digitalWrite(ST_Y2, HIGH);
dly = analogRead(Pot)/4;
delay(dly);
break;
}
}
void StopMotor(){
digitalWrite(ST_X1, LOW);
digitalWrite(ST_X2, LOW);
digitalWrite(ST_Y1, LOW);
digitalWrite(ST_Y2, LOW);
}
こちらで解説
----
//StepMotor sample
//2009.6.2
//PinAssign
int ST_X1=2;
int ST_X2=4;
int ST_Y1=3;
int ST_Y2=5;
int ledPin=13;
//PotentionMeter
int Pot=5;
//Switch
int Switch=6;
int dly;
signed int Count=0;
signed int Dimmention=1;
int Switch_status=0;
void setup(){
pinMode(ST_X1, OUTPUT);
pinMode(ST_X2, OUTPUT);
pinMode(ST_Y1, OUTPUT);
pinMode(ST_Y2, OUTPUT);
pinMode(ledPin, OUTPUT);
//POT is Default AnalogInput
pinMode(Switch,INPUT);
dly = analogRead(Pot)/4;
}
void loop(){
if(digitalRead(Switch)==1){
if(Switch_status==0){
Dimmention=1;
Switch_status=1;
}
}else{
if(Switch_status==1){
Dimmention=-1;
Switch_status=0;
}
}
Count=Count+Dimmention;
if(Count>96){
Count=0;
}else if(Count<0){
Count=96;
}
MoveMotor(Count);
}
void MoveMotor(int stp){
int s;
s=stp%8;
switch(s){
case 0:
digitalWrite(ST_X1, HIGH);
digitalWrite(ST_X2, LOW);
digitalWrite(ST_Y1, LOW);
digitalWrite(ST_Y2, LOW);
dly = analogRead(Pot)/4;
delay(dly);
break;
case 1:
digitalWrite(ST_X1, HIGH);
digitalWrite(ST_X2, HIGH);
digitalWrite(ST_Y1, LOW);
digitalWrite(ST_Y2, LOW);
dly = analogRead(Pot)/4;
delay(dly);
break;
case 2:
digitalWrite(ST_X1, LOW);
digitalWrite(ST_X2, HIGH);
digitalWrite(ST_Y1, LOW);
digitalWrite(ST_Y2, LOW);
dly = analogRead(Pot)/4;
delay(dly);
break;
case 3:
digitalWrite(ST_X1, LOW);
digitalWrite(ST_X2, HIGH);
digitalWrite(ST_Y1, HIGH);
digitalWrite(ST_Y2, LOW);
dly = analogRead(Pot)/4;
delay(dly);
break;
case 4:
digitalWrite(ST_X1, LOW);
digitalWrite(ST_X2, LOW);
digitalWrite(ST_Y1, HIGH);
digitalWrite(ST_Y2, LOW);
dly = analogRead(Pot)/4;
delay(dly);
break;
case 5:
digitalWrite(ST_X1, LOW);
digitalWrite(ST_X2, LOW);
digitalWrite(ST_Y1, HIGH);
digitalWrite(ST_Y2, HIGH);
dly = analogRead(Pot)/4;
delay(dly);
break;
case 6:
digitalWrite(ST_X1, LOW);
digitalWrite(ST_X2, LOW);
digitalWrite(ST_Y1, LOW);
digitalWrite(ST_Y2, HIGH);
dly = analogRead(Pot)/4;
delay(dly);
break;
case 7:
digitalWrite(ST_X1, HIGH);
digitalWrite(ST_X2, LOW);
digitalWrite(ST_Y1, LOW);
digitalWrite(ST_Y2, HIGH);
dly = analogRead(Pot)/4;
delay(dly);
break;
}
}
void StopMotor(){
digitalWrite(ST_X1, LOW);
digitalWrite(ST_X2, LOW);
digitalWrite(ST_Y1, LOW);
digitalWrite(ST_Y2, LOW);
}
実用的なステッピングモーターのプログラム その2
スイッチを押している間、逆回転します。
こちらで解説
---
//StepMotor sample
//2009.6.2
//PinAssign
int ST_X1=2;
int ST_X2=4;
int ST_Y1=3;
int ST_Y2=5;
int ledPin=13;
//PotentionMeter
int Pot=5;
//Switch
int Switch=6;
int dly;
signed int Count=0;
signed int Dimmention=1;
void setup(){
pinMode(ST_X1, OUTPUT);
pinMode(ST_X2, OUTPUT);
pinMode(ST_Y1, OUTPUT);
pinMode(ST_Y2, OUTPUT);
pinMode(ledPin, OUTPUT);
//POT is Default AnalogInput
pinMode(Switch,INPUT);
dly = analogRead(Pot)/4;
}
void MoveMotor(int stp){
int s;
s=stp%8;
switch(s){
case 0:
digitalWrite(ST_X1, HIGH);
digitalWrite(ST_X2, LOW);
digitalWrite(ST_Y1, LOW);
digitalWrite(ST_Y2, LOW);
dly = analogRead(Pot)/4;
delay(dly);
break;
case 1:
digitalWrite(ST_X1, HIGH);
digitalWrite(ST_X2, HIGH);
digitalWrite(ST_Y1, LOW);
digitalWrite(ST_Y2, LOW);
dly = analogRead(Pot)/4;
delay(dly);
break;
case 2:
digitalWrite(ST_X1, LOW);
digitalWrite(ST_X2, HIGH);
digitalWrite(ST_Y1, LOW);
digitalWrite(ST_Y2, LOW);
dly = analogRead(Pot)/4;
delay(dly);
break;
case 3:
digitalWrite(ST_X1, LOW);
digitalWrite(ST_X2, HIGH);
digitalWrite(ST_Y1, HIGH);
digitalWrite(ST_Y2, LOW);
dly = analogRead(Pot)/4;
delay(dly);
break;
case 4:
digitalWrite(ST_X1, LOW);
digitalWrite(ST_X2, LOW);
digitalWrite(ST_Y1, HIGH);
digitalWrite(ST_Y2, LOW);
dly = analogRead(Pot)/4;
delay(dly);
break;
case 5:
digitalWrite(ST_X1, LOW);
digitalWrite(ST_X2, LOW);
digitalWrite(ST_Y1, HIGH);
digitalWrite(ST_Y2, HIGH);
dly = analogRead(Pot)/4;
delay(dly);
break;
case 6:
digitalWrite(ST_X1, LOW);
digitalWrite(ST_X2, LOW);
digitalWrite(ST_Y1, LOW);
digitalWrite(ST_Y2, HIGH);
dly = analogRead(Pot)/4;
delay(dly);
break;
case 7:
digitalWrite(ST_X1, HIGH);
digitalWrite(ST_X2, LOW);
digitalWrite(ST_Y1, LOW);
digitalWrite(ST_Y2, HIGH);
dly = analogRead(Pot)/4;
delay(dly);
break;
}
}
void StopMotor(){
digitalWrite(ST_X1, LOW);
digitalWrite(ST_X2, LOW);
digitalWrite(ST_Y1, LOW);
digitalWrite(ST_Y2, LOW);
}
void loop(){
if(digitalRead(Switch)==1){
Dimmention=1;
}else{
Dimmention=-1;
}
Count=Count+Dimmention;
if(Count>96){
Count=0;
}else if(Count<0){
Count=96;
}
MoveMotor(Count);
}
こちらで解説
---
//StepMotor sample
//2009.6.2
//PinAssign
int ST_X1=2;
int ST_X2=4;
int ST_Y1=3;
int ST_Y2=5;
int ledPin=13;
//PotentionMeter
int Pot=5;
//Switch
int Switch=6;
int dly;
signed int Count=0;
signed int Dimmention=1;
void setup(){
pinMode(ST_X1, OUTPUT);
pinMode(ST_X2, OUTPUT);
pinMode(ST_Y1, OUTPUT);
pinMode(ST_Y2, OUTPUT);
pinMode(ledPin, OUTPUT);
//POT is Default AnalogInput
pinMode(Switch,INPUT);
dly = analogRead(Pot)/4;
}
void MoveMotor(int stp){
int s;
s=stp%8;
switch(s){
case 0:
digitalWrite(ST_X1, HIGH);
digitalWrite(ST_X2, LOW);
digitalWrite(ST_Y1, LOW);
digitalWrite(ST_Y2, LOW);
dly = analogRead(Pot)/4;
delay(dly);
break;
case 1:
digitalWrite(ST_X1, HIGH);
digitalWrite(ST_X2, HIGH);
digitalWrite(ST_Y1, LOW);
digitalWrite(ST_Y2, LOW);
dly = analogRead(Pot)/4;
delay(dly);
break;
case 2:
digitalWrite(ST_X1, LOW);
digitalWrite(ST_X2, HIGH);
digitalWrite(ST_Y1, LOW);
digitalWrite(ST_Y2, LOW);
dly = analogRead(Pot)/4;
delay(dly);
break;
case 3:
digitalWrite(ST_X1, LOW);
digitalWrite(ST_X2, HIGH);
digitalWrite(ST_Y1, HIGH);
digitalWrite(ST_Y2, LOW);
dly = analogRead(Pot)/4;
delay(dly);
break;
case 4:
digitalWrite(ST_X1, LOW);
digitalWrite(ST_X2, LOW);
digitalWrite(ST_Y1, HIGH);
digitalWrite(ST_Y2, LOW);
dly = analogRead(Pot)/4;
delay(dly);
break;
case 5:
digitalWrite(ST_X1, LOW);
digitalWrite(ST_X2, LOW);
digitalWrite(ST_Y1, HIGH);
digitalWrite(ST_Y2, HIGH);
dly = analogRead(Pot)/4;
delay(dly);
break;
case 6:
digitalWrite(ST_X1, LOW);
digitalWrite(ST_X2, LOW);
digitalWrite(ST_Y1, LOW);
digitalWrite(ST_Y2, HIGH);
dly = analogRead(Pot)/4;
delay(dly);
break;
case 7:
digitalWrite(ST_X1, HIGH);
digitalWrite(ST_X2, LOW);
digitalWrite(ST_Y1, LOW);
digitalWrite(ST_Y2, HIGH);
dly = analogRead(Pot)/4;
delay(dly);
break;
}
}
void StopMotor(){
digitalWrite(ST_X1, LOW);
digitalWrite(ST_X2, LOW);
digitalWrite(ST_Y1, LOW);
digitalWrite(ST_Y2, LOW);
}
void loop(){
if(digitalRead(Switch)==1){
Dimmention=1;
}else{
Dimmention=-1;
}
Count=Count+Dimmention;
if(Count>96){
Count=0;
}else if(Count<0){
Count=96;
}
MoveMotor(Count);
}
実用的なステッピングモーターのプログラム その1
モーターの回転を、指定したステップ数で行うプログラムです。
こちらに解説
----
//StepMotor sample
//
//PinAssign
int ST_X1=2;
int ST_X2=4;
int ST_Y1=3;
int ST_Y2=5;
int ledPin=13;
//PotentionMeter
int Pot=5;
//Switch
int Switch=6;
int dly;
int Count=0;
void setup(){
pinMode(ST_X1, OUTPUT);
pinMode(ST_X2, OUTPUT);
pinMode(ST_Y1, OUTPUT);
pinMode(ST_Y2, OUTPUT);
pinMode(ledPin, OUTPUT);
//POT is Default AnalogInput
pinMode(Switch,INPUT);
dly = analogRead(Pot)/4;
}
void MoveMotor(int stp){
int s;
s=stp%8;
switch(s){
case 0:
digitalWrite(ST_X1, HIGH);
digitalWrite(ST_X2, LOW);
digitalWrite(ST_Y1, LOW);
digitalWrite(ST_Y2, LOW);
dly = analogRead(Pot)/4;
delay(dly);
break;
case 1:
digitalWrite(ST_X1, HIGH);
digitalWrite(ST_X2, HIGH);
digitalWrite(ST_Y1, LOW);
digitalWrite(ST_Y2, LOW);
dly = analogRead(Pot)/4;
delay(dly);
break;
case 2:
digitalWrite(ST_X1, LOW);
digitalWrite(ST_X2, HIGH);
digitalWrite(ST_Y1, LOW);
digitalWrite(ST_Y2, LOW);
dly = analogRead(Pot)/4;
delay(dly);
break;
case 3:
digitalWrite(ST_X1, LOW);
digitalWrite(ST_X2, HIGH);
digitalWrite(ST_Y1, HIGH);
digitalWrite(ST_Y2, LOW);
dly = analogRead(Pot)/4;
delay(dly);
break;
case 4:
digitalWrite(ST_X1, LOW);
digitalWrite(ST_X2, LOW);
digitalWrite(ST_Y1, HIGH);
digitalWrite(ST_Y2, LOW);
dly = analogRead(Pot)/4;
delay(dly);
break;
case 5:
digitalWrite(ST_X1, LOW);
digitalWrite(ST_X2, LOW);
digitalWrite(ST_Y1, HIGH);
digitalWrite(ST_Y2, HIGH);
dly = analogRead(Pot)/4;
delay(dly);
break;
case 6:
digitalWrite(ST_X1, LOW);
digitalWrite(ST_X2, LOW);
digitalWrite(ST_Y1, LOW);
digitalWrite(ST_Y2, HIGH);
dly = analogRead(Pot)/4;
delay(dly);
break;
case 7:
digitalWrite(ST_X1, HIGH);
digitalWrite(ST_X2, LOW);
digitalWrite(ST_Y1, LOW);
digitalWrite(ST_Y2, HIGH);
dly = analogRead(Pot)/4;
delay(dly);
break;
}
}
void StopMotor(){
digitalWrite(ST_X1, LOW);
digitalWrite(ST_X2, LOW);
digitalWrite(ST_Y1, LOW);
digitalWrite(ST_Y2, LOW);
}
void loop(){
if(digitalRead(Switch)==1){
Count=Count+1;
MoveMotor(Count);
}
else{
StopMotor();
}
}
こちらに解説
----
//StepMotor sample
//
//PinAssign
int ST_X1=2;
int ST_X2=4;
int ST_Y1=3;
int ST_Y2=5;
int ledPin=13;
//PotentionMeter
int Pot=5;
//Switch
int Switch=6;
int dly;
int Count=0;
void setup(){
pinMode(ST_X1, OUTPUT);
pinMode(ST_X2, OUTPUT);
pinMode(ST_Y1, OUTPUT);
pinMode(ST_Y2, OUTPUT);
pinMode(ledPin, OUTPUT);
//POT is Default AnalogInput
pinMode(Switch,INPUT);
dly = analogRead(Pot)/4;
}
void MoveMotor(int stp){
int s;
s=stp%8;
switch(s){
case 0:
digitalWrite(ST_X1, HIGH);
digitalWrite(ST_X2, LOW);
digitalWrite(ST_Y1, LOW);
digitalWrite(ST_Y2, LOW);
dly = analogRead(Pot)/4;
delay(dly);
break;
case 1:
digitalWrite(ST_X1, HIGH);
digitalWrite(ST_X2, HIGH);
digitalWrite(ST_Y1, LOW);
digitalWrite(ST_Y2, LOW);
dly = analogRead(Pot)/4;
delay(dly);
break;
case 2:
digitalWrite(ST_X1, LOW);
digitalWrite(ST_X2, HIGH);
digitalWrite(ST_Y1, LOW);
digitalWrite(ST_Y2, LOW);
dly = analogRead(Pot)/4;
delay(dly);
break;
case 3:
digitalWrite(ST_X1, LOW);
digitalWrite(ST_X2, HIGH);
digitalWrite(ST_Y1, HIGH);
digitalWrite(ST_Y2, LOW);
dly = analogRead(Pot)/4;
delay(dly);
break;
case 4:
digitalWrite(ST_X1, LOW);
digitalWrite(ST_X2, LOW);
digitalWrite(ST_Y1, HIGH);
digitalWrite(ST_Y2, LOW);
dly = analogRead(Pot)/4;
delay(dly);
break;
case 5:
digitalWrite(ST_X1, LOW);
digitalWrite(ST_X2, LOW);
digitalWrite(ST_Y1, HIGH);
digitalWrite(ST_Y2, HIGH);
dly = analogRead(Pot)/4;
delay(dly);
break;
case 6:
digitalWrite(ST_X1, LOW);
digitalWrite(ST_X2, LOW);
digitalWrite(ST_Y1, LOW);
digitalWrite(ST_Y2, HIGH);
dly = analogRead(Pot)/4;
delay(dly);
break;
case 7:
digitalWrite(ST_X1, HIGH);
digitalWrite(ST_X2, LOW);
digitalWrite(ST_Y1, LOW);
digitalWrite(ST_Y2, HIGH);
dly = analogRead(Pot)/4;
delay(dly);
break;
}
}
void StopMotor(){
digitalWrite(ST_X1, LOW);
digitalWrite(ST_X2, LOW);
digitalWrite(ST_Y1, LOW);
digitalWrite(ST_Y2, LOW);
}
void loop(){
if(digitalRead(Switch)==1){
Count=Count+1;
MoveMotor(Count);
}
else{
StopMotor();
}
}
ステッピングモーターの回転について
いままで、ステッピングモーターを回すのに、モーターの中の4つの電磁石をArduinoの4つのピンをつかって切り替えてきました。
厳密にいうと違いますが(2相の磁石を切り替えてるので個数が4つじゃない)、こんな感じでイメージしておいていいと思います。
さて、今までは、4つの電磁石のうち1つだけを磁石にして、回転させてきましたが、これだといろいろ問題が出てきてしまうので、実用的に使われてはいません。
どんな問題かというと、、
バケツリレーを思い浮かべてください。
隣の人に、水のたっぷり入ったバケツを渡すとき、自分と隣の人の2人が一瞬だけバケツを持ち合うことで、水をこぼすことなく、スムーズにリレーできます。
これが、自分と隣の人が完全に分かれて、バケツを持つのは1人だけにしてしまうと、どうなるでしょうか。
おそらく、バケツリレーは成り立つと思いますが、バケツを落としたり、重さが全部自分にかかるので、やたら疲れてしまいます。
ステッピングモーターの中でもこんなことが起きてます。
なので、通常は、2つの電磁石をオンにする瞬間も必要になります。
参考サイト
▼今までのプログラム(抜粋)
-----
digitalWrite(ST_X1, HIGH);
digitalWrite(ST_X2, LOW);
digitalWrite(ST_Y1, LOW);
digitalWrite(ST_Y2, LOW);
delay(25);
digitalWrite(ST_X1, LOW);
digitalWrite(ST_X2, HIGH);
digitalWrite(ST_Y1, LOW);
digitalWrite(ST_Y2, LOW);
delay(25);
digitalWrite(ST_X1, LOW);
digitalWrite(ST_X2, LOW);
digitalWrite(ST_Y1, HIGH);
digitalWrite(ST_Y2, LOW);
delay(25);
digitalWrite(ST_X1, LOW);
digitalWrite(ST_X2, LOW);
digitalWrite(ST_Y1, LOW);
digitalWrite(ST_Y2, HIGH);
delay(25);
----
▼改良したプログラム(抜粋)
----
digitalWrite(ST_X1, HIGH);
digitalWrite(ST_X2, LOW);
digitalWrite(ST_Y1, LOW);
digitalWrite(ST_Y2, LOW);
delay(25);
digitalWrite(ST_X1, HIGH);
digitalWrite(ST_X2, HIGH);
digitalWrite(ST_Y1, LOW);
digitalWrite(ST_Y2, LOW);
delay(25);
digitalWrite(ST_X1, LOW);
digitalWrite(ST_X2, HIGH);
digitalWrite(ST_Y1, LOW);
digitalWrite(ST_Y2, LOW);
delay(25);
digitalWrite(ST_X1, LOW);
digitalWrite(ST_X2, HIGH);
digitalWrite(ST_Y1, HIGH);
digitalWrite(ST_Y2, LOW);
delay(25);
digitalWrite(ST_X1, LOW);
digitalWrite(ST_X2, LOW);
digitalWrite(ST_Y1, HIGH);
digitalWrite(ST_Y2, LOW);
delay(25);
digitalWrite(ST_X1, LOW);
digitalWrite(ST_X2, LOW);
digitalWrite(ST_Y1, HIGH);
digitalWrite(ST_Y2, HIGH);
delay(25);
digitalWrite(ST_X1, LOW);
digitalWrite(ST_X2, LOW);
digitalWrite(ST_Y1, LOW);
digitalWrite(ST_Y2, HIGH);
delay(25);
digitalWrite(ST_X1, HIGH);
digitalWrite(ST_X2, LOW);
digitalWrite(ST_Y1, LOW);
digitalWrite(ST_Y2, HIGH);
delay(25);
----
厳密にいうと違いますが(2相の磁石を切り替えてるので個数が4つじゃない)、こんな感じでイメージしておいていいと思います。
さて、今までは、4つの電磁石のうち1つだけを磁石にして、回転させてきましたが、これだといろいろ問題が出てきてしまうので、実用的に使われてはいません。
どんな問題かというと、、
バケツリレーを思い浮かべてください。
隣の人に、水のたっぷり入ったバケツを渡すとき、自分と隣の人の2人が一瞬だけバケツを持ち合うことで、水をこぼすことなく、スムーズにリレーできます。
これが、自分と隣の人が完全に分かれて、バケツを持つのは1人だけにしてしまうと、どうなるでしょうか。
おそらく、バケツリレーは成り立つと思いますが、バケツを落としたり、重さが全部自分にかかるので、やたら疲れてしまいます。
ステッピングモーターの中でもこんなことが起きてます。
なので、通常は、2つの電磁石をオンにする瞬間も必要になります。
参考サイト
▼今までのプログラム(抜粋)
-----
digitalWrite(ST_X1, HIGH);
digitalWrite(ST_X2, LOW);
digitalWrite(ST_Y1, LOW);
digitalWrite(ST_Y2, LOW);
delay(25);
digitalWrite(ST_X1, LOW);
digitalWrite(ST_X2, HIGH);
digitalWrite(ST_Y1, LOW);
digitalWrite(ST_Y2, LOW);
delay(25);
digitalWrite(ST_X1, LOW);
digitalWrite(ST_X2, LOW);
digitalWrite(ST_Y1, HIGH);
digitalWrite(ST_Y2, LOW);
delay(25);
digitalWrite(ST_X1, LOW);
digitalWrite(ST_X2, LOW);
digitalWrite(ST_Y1, LOW);
digitalWrite(ST_Y2, HIGH);
delay(25);
----
▼改良したプログラム(抜粋)
----
digitalWrite(ST_X1, HIGH);
digitalWrite(ST_X2, LOW);
digitalWrite(ST_Y1, LOW);
digitalWrite(ST_Y2, LOW);
delay(25);
digitalWrite(ST_X1, HIGH);
digitalWrite(ST_X2, HIGH);
digitalWrite(ST_Y1, LOW);
digitalWrite(ST_Y2, LOW);
delay(25);
digitalWrite(ST_X1, LOW);
digitalWrite(ST_X2, HIGH);
digitalWrite(ST_Y1, LOW);
digitalWrite(ST_Y2, LOW);
delay(25);
digitalWrite(ST_X1, LOW);
digitalWrite(ST_X2, HIGH);
digitalWrite(ST_Y1, HIGH);
digitalWrite(ST_Y2, LOW);
delay(25);
digitalWrite(ST_X1, LOW);
digitalWrite(ST_X2, LOW);
digitalWrite(ST_Y1, HIGH);
digitalWrite(ST_Y2, LOW);
delay(25);
digitalWrite(ST_X1, LOW);
digitalWrite(ST_X2, LOW);
digitalWrite(ST_Y1, HIGH);
digitalWrite(ST_Y2, HIGH);
delay(25);
digitalWrite(ST_X1, LOW);
digitalWrite(ST_X2, LOW);
digitalWrite(ST_Y1, LOW);
digitalWrite(ST_Y2, HIGH);
delay(25);
digitalWrite(ST_X1, HIGH);
digitalWrite(ST_X2, LOW);
digitalWrite(ST_Y1, LOW);
digitalWrite(ST_Y2, HIGH);
delay(25);
----
ステッピングモーターのプログラム(3)
スイッチを押している間、回転するバージョン
-----
//StepMotor sample
//PinAssign
int ST_X1=2;
int ST_X2=4;
int ST_Y1=3;
int ST_Y2=5;
int ledPin=13;
//PotentionMeter
int Pot=5;
//Switch
int Switch=6;
int dly;
void setup(){
pinMode(ST_X1, OUTPUT);
pinMode(ST_X2, OUTPUT);
pinMode(ST_Y1, OUTPUT);
pinMode(ST_Y2, OUTPUT);
pinMode(ledPin, OUTPUT);
//POT is Default AnalogInput
pinMode(Switch,INPUT);
dly = analogRead(Pot)/4;
}
void loop(){
if(digitalRead(Switch)==1){
digitalWrite(ledPin,HIGH);
digitalWrite(ST_X1, HIGH);
digitalWrite(ST_X2, LOW);
digitalWrite(ST_Y1, LOW);
digitalWrite(ST_Y2, LOW);
dly = analogRead(Pot)/4;
delay(dly);
digitalWrite(ST_X1, HIGH);
digitalWrite(ST_X2, HIGH);
digitalWrite(ST_Y1, LOW);
digitalWrite(ST_Y2, LOW);
dly = analogRead(Pot)/4;
delay(dly);
digitalWrite(ST_X1, LOW);
digitalWrite(ST_X2, HIGH);
digitalWrite(ST_Y1, LOW);
digitalWrite(ST_Y2, LOW);
dly = analogRead(Pot)/4;
delay(dly);
digitalWrite(ledPin,LOW);
digitalWrite(ST_X1, LOW);
digitalWrite(ST_X2, HIGH);
digitalWrite(ST_Y1, HIGH);
digitalWrite(ST_Y2, LOW);
dly = analogRead(Pot)/4;
delay(dly);
digitalWrite(ST_X1, LOW);
digitalWrite(ST_X2, LOW);
digitalWrite(ST_Y1, HIGH);
digitalWrite(ST_Y2, LOW);
dly = analogRead(Pot)/4;
delay(dly);
digitalWrite(ST_X1, LOW);
digitalWrite(ST_X2, LOW);
digitalWrite(ST_Y1, HIGH);
digitalWrite(ST_Y2, HIGH);
dly = analogRead(Pot)/4;
delay(dly);
digitalWrite(ST_X1, LOW);
digitalWrite(ST_X2, LOW);
digitalWrite(ST_Y1, LOW);
digitalWrite(ST_Y2, HIGH);
dly = analogRead(Pot)/4;
delay(dly);
digitalWrite(ST_X1, HIGH);
digitalWrite(ST_X2, LOW);
digitalWrite(ST_Y1, LOW);
digitalWrite(ST_Y2, HIGH);
dly = analogRead(Pot)/4;
delay(dly);
}
else{
digitalWrite(ST_X1, LOW);
digitalWrite(ST_X2, LOW);
digitalWrite(ST_Y1, LOW);
digitalWrite(ST_Y2, LOW);
}
}
ステッピングモーターのプログラム(2)
モーターのスピードを簡単に変更できるバージョン
「dly」という変数で一括してスピードコントロールできます。
-----
//StepMotor sample
//Pin Assgin
int ST_X1=2;
int ST_X2=4;
int ST_Y1=3;
int ST_Y2=5;
int ledPin=13;
//DelayTime
int dly=2;
void setup(){
pinMode(ST_X1, OUTPUT);
pinMode(ST_X2, OUTPUT);
pinMode(ST_Y1, OUTPUT);
pinMode(ST_Y2, OUTPUT);
pinMode(ledPin, OUTPUT);
}
void loop(){
digitalWrite(ledPin,HIGH);
digitalWrite(ST_X1, HIGH);
digitalWrite(ST_X2, LOW);
digitalWrite(ST_Y1, LOW);
digitalWrite(ST_Y2, LOW);
delay(dly);
digitalWrite(ST_X1, HIGH);
digitalWrite(ST_X2, HIGH);
digitalWrite(ST_Y1, LOW);
digitalWrite(ST_Y2, LOW);
delay(dly);
digitalWrite(ST_X1, LOW);
digitalWrite(ST_X2, HIGH);
digitalWrite(ST_Y1, LOW);
digitalWrite(ST_Y2, LOW);
delay(dly);
digitalWrite(ledPin,LOW);
digitalWrite(ST_X1, LOW);
digitalWrite(ST_X2, HIGH);
digitalWrite(ST_Y1, HIGH);
digitalWrite(ST_Y2, LOW);
delay(dly);
digitalWrite(ST_X1, LOW);
digitalWrite(ST_X2, LOW);
digitalWrite(ST_Y1, HIGH);
digitalWrite(ST_Y2, LOW);
delay(dly);
digitalWrite(ST_X1, LOW);
digitalWrite(ST_X2, LOW);
digitalWrite(ST_Y1, HIGH);
digitalWrite(ST_Y2, HIGH);
delay(dly);
digitalWrite(ST_X1, LOW);
digitalWrite(ST_X2, LOW);
digitalWrite(ST_Y1, LOW);
digitalWrite(ST_Y2, HIGH);
delay(dly);
digitalWrite(ST_X1, HIGH);
digitalWrite(ST_X2, LOW);
digitalWrite(ST_Y1, LOW);
digitalWrite(ST_Y2, HIGH);
delay(dly);
}
ステッピングモーターのプログラム(1)
まず、モーターをつないで動作確認をするので、以下のプログラムを書いてください。
今回使うモーターは「ステッピングモーター」というモーターで、4つのコイルが90度ずつの一に入っていて、1つ1つを時間差で電磁石にすることで、軸についた永久磁石が反発を起こしてクルっと回ります。リニアモーターカーみたいな原理。「水に沈む前に次の足を出す」ような感じ。
---
//StepMotor sample
//Pin Assign
int ST_X1=2;
int ST_X2=4;
int ST_Y1=3;
int ST_Y2=5;
int ledPin=13;
void setup(){
pinMode(ST_X1, OUTPUT);
pinMode(ST_X2, OUTPUT);
pinMode(ST_Y1, OUTPUT);
pinMode(ST_Y2, OUTPUT);
pinMode(ledPin, OUTPUT);
}
void loop(){
digitalWrite(ledPin,HIGH);
digitalWrite(ST_X1, HIGH);
digitalWrite(ST_X2, LOW);
digitalWrite(ST_Y1, LOW);
digitalWrite(ST_Y2, LOW);
delay(25);
digitalWrite(ST_X1, LOW);
digitalWrite(ST_X2, HIGH);
digitalWrite(ST_Y1, LOW);
digitalWrite(ST_Y2, LOW);
delay(25);
digitalWrite(ledPin,LOW);
digitalWrite(ST_X1, LOW);
digitalWrite(ST_X2, LOW);
digitalWrite(ST_Y1, HIGH);
digitalWrite(ST_Y2, LOW);
delay(25);
digitalWrite(ST_X1, LOW);
digitalWrite(ST_X2, LOW);
digitalWrite(ST_Y1, LOW);
digitalWrite(ST_Y2, HIGH);
delay(25);
}
登録:
投稿 (Atom)