ロータリーエンコーダ



ボリュームのツマミで、何回転でもできる部分には、ロータリーエンコーダがつかわれてます。
買うときの参考に、通販のページの画像で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);
}


ベアリングホルダ

http://www.originalmind.co.jp/cargo5/bearingholder/

Arduinoと木とレーザーカット

アクリルだけだと素材の幅が少ないので、木の加工例を。

http://jp.makezine.com/blog/2009/06/wooden_mini_jansen_walker_robot_par.html

http://jp.makezine.com/blog/2009/07/laser_cutting_for_3d_objects.html

センサーと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);
}