LV3

ランダムコントローラー3

一時停止・再開ボタンとパターン選択ボタンを付けました
cr3ケース
今までスケッチの書き換えで行っていた6種のランダムパターンと1種の固定パターンをボタンで選択できるようにしてみました

動作はこんな感じです


■作り方
1.配線を組みパソコンとArduinoをUSBで繋ぐ
cr3配線

2.下記スケッチをコピーしてArduino IDEのスケッチに貼り付ける
(IDEに元からあるスケッチは消してから貼り付ける)
ArduinoIDE
    
3.書込み(コンパイル)で出来上がり。
書込み(コンパイル)

これを2個作りタッパー等でケースを作って出来上がり

■パターンについて
ブッブッブッブと動く固定パターンで始まり
弱めで長い回転(ランダム)
弱めで小刻み(ランダム)
普通で長い回転(ランダム)
普通で小刻み(ランダム)
強めで長い回転(ランダム)
強めで小刻み(ランダム)
最初に戻る

回転方向、速度、時間全てランダムで動くので
パターンが1周回った目安として固定パターンを入れてあります

※時間を元にしたランダム処理なので左右タイミングをずらして動かして下さい
※作成、使用、部品の購入は自己責任でお願いします



//#############################################
//スケッチはここからコピー
//#############################################
//プログラムの配布は人様の関数を使っているため禁止とさせて頂きます
#include <time.h>

const int m1_cw  = 10;        //正回転ピン
const int m1_ccw = 11;        //逆回転ピン
const int a_pin =   0;        //アナログピン番号(ボリューム用)
const int SW1 (8);            //スイッチ1   
const int SW2 (12);           //スイッチ2   

volatile unsigned long time_prev = 0, time_now , time2;
unsigned long time_chat = 300;
volatile signed char state , count = 0;
volatile bool g_pause = 1;

//セットアップ
void setup() {
    pinMode(SW1, INPUT_PULLUP);//スイッチ1プルアップ
    pinMode(SW2, INPUT_PULLUP);//スイッチ2プルアップ
}

//メイン処理
void loop() {
    
    int ii;
    
    if (digitalRead(SW1) == LOW) pause();    //一時停止
    if (digitalRead(SW2) == LOW && g_pause == 0) countup();
    
    state = 0;
  
    while (state == 0 && g_pause == 0) {
        //RCtrl(最小速度,最大速度,最小時間,最大時間) ※速度は100ぐらい~255まで
        switch (count) {
        case 1:
            RCtrl(100,175,500,1000);    //弱めで長い回転
            break;
        case 2:
            RCtrl(100,175,100,300);     //弱めで小刻み
            break;
        case 3:
            RCtrl(175,255,500,1000);    //普通で長い回転
            break;
        case 4:
            RCtrl(175,255,100,300);     //普通で小刻み
            break;
        case 5:
            RCtrl(200,255,500,1000);    //強めで長い回転
            break;
        case 6:
            RCtrl(200,255,100,300);     //強めで小刻み
            break;
        default :
            //PCtrl(速度,時間,方向) ※速度は100ぐらい~255まで
            PCtrl(volume(100,255),300,0);           //固定パターン
            PCtrl(0,300,0);
            break;
        }

        break;
      }
}

//ボタンカウントアップ
void countup () {
    time_now = millis();
    if (time_now - time_prev > time_chat) {
        if (count < 6) count++;
        else count = 0;
    }
    state = 1;
    time_prev = time_now;
}

//一時停止
void pause () {
    time_now = millis();
    if (time_now - time_prev > time_chat) {
        if (g_pause ==1) g_pause=0;
        else g_pause = 1;
    }
    state = 1;
    time_prev = time_now;
}

//「苦C」ランダム:minからmaxの間のランダム値を返す
int GetRandom(int min, int max){
    static int flag;

    if (flag == 0) {
        srand((unsigned int)time(NULL));
        flag = 1;
    }
    return min + (int)(rand() * (max - min + 1.0) / (1.0 + RAND_MAX));
}

//回転OFF
void Roff(){
    analogWrite(m1_cw,0);
    analogWrite(m1_ccw,0);
    delay(1);
}

//ランダムコントロール
void RCtrl(int pwr_min,int pwr_max,int dly_min,int dly_max){
    bool lrot;
    int rev_time , l_pwr;
    
    lrot = GetRandom(0,1);                                  //回転方向ランダム
    l_pwr = GetRandom(pwr_min,volume (pwr_min,pwr_max));    //回転速度ランダム
    rev_time = GetRandom(dly_min,dly_max);                  //回転時間ランダム
    time_now = millis();
    
    do {
        if (lrot==0){
            analogWrite(m1_cw,l_pwr); 
        } else if (lrot==1) {
            analogWrite(m1_ccw,l_pwr); 
        }
        time2 = millis();
    } while (time2 - time_now < rev_time && digitalRead(SW1) == HIGH && digitalRead(SW2) == HIGH);
    
    time_now = millis();
    Roff();                                                 //回転OFF
}

//固定パターンコントロール
void PCtrl(int m_pwr,int m_dly,bool m_rot){
    
    time_now = millis();
    
    do {
        if (m_rot==0){
            analogWrite(m1_cw,m_pwr); 
        } else if (m_rot==1) {
            analogWrite(m1_ccw,m_pwr); 
        }
        time2 = millis();
    } while (time2 - time_now < m_dly && digitalRead(SW1) == HIGH && digitalRead(SW2) == HIGH);
    
    time_now = millis();
    Roff();                                                 //回転OFF
}

//ボリューム値をvpwr_minからvpwr_maxに変換
int volume (int vpwr_min,int vpwr_max) {
    int val;
    val = map(analogRead(a_pin), 0, 1023, vpwr_min, vpwr_max);
    return val;
}
//#############################################
//スケッチはここまでコピー
//#############################################


部品の購入等はこちら

自作コストまとめ

自作にかかったコストをまとめてみました 一部曖昧な表記や値段が変わっている物もあります 消費税や送料は計算には入れておりません ■必須工具類 1,490円~ 元々持っている物が結構あると思いますが一応計算に含めました はんだこて、はんだをダイソーで済ませば少し安くなります。当ブログの工作程度なら十分か...

関連記事

コメント

非公開コメント

このページのトップへ