スローモーター用パターン(LV3以上用)

6v60rpmと6v100rpmに絞って使っていくことにしたので
スローモーター用に作り直しました

パターンは「長い回転」「小刻み回転」「固定回転」の3種で
ボタンを押す毎に、この順番で切り替わります

回転数の強弱を以下のように変更しました
今までは最小値を基準にランダム値を強弱させていました
通常仕様100

矢印
スローモーターだと若干ですが物足りなさを感じる時があったり
動作音がとても静かなので最大値を基準にランダム値を強弱させてみました
最大値の4.74vは固定で、ボリュームツマミを回す事で最小値の方が2.97v~4.74v間で強弱します
スロー仕様100

ギヤ比で回転数を落とし高い電圧でしっかり回すので
力強いスロー回転をさせる事が出来ます
イメージ的には、自転車の一番軽いギヤで坂道をグイグイ上るような感じです


実際使用してみましたが、なかなか良い感じだと思います
たまに感じてた物足りなさは無くなり、気が付いたら30分以上経ってました
ちなみに左乳首を小刻み回転、右乳首を長い回転にするのがお気に入りです



今回シリアルモニタでランダム値を確認できるようにしておきました
Arduino IDEのメニューバー→ツール→シリアルモニタで表示できます
※パソコンとArduinoが繋がってる状態で
シリアルモニタ説明シリアルモニタ9600

邪魔な場合はスケッチから下記の
    Serial.begin(9600);//シリアル通信


    //シリアルモニタ
    if (lrot == 0) {
      Serial.print("F");
    }else{
      Serial.print("R");
    }
    Serial.print(l_pwr);
    Serial.print(" ");
    Serial.print(rev_time);
    Serial.println("ms");
の部分を削除するかコメントアウトして下さい



//#############################################
//スケッチはここからコピー
//#############################################
//プログラムの配布は人様の関数を使っているため禁止とさせて頂きます
#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プルアップ
    Serial.begin(9600);//シリアル通信
}

//メイン処理
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(160,255,100,300);    //スローモーター用小刻み
            break;
        case 2:
            PCtrl(volume(100,255),300,0); //固定パターン
            PCtrl(0,300,0);
            break;
        default :         
            RCtrl(160,255,500,1000);    //スローモーター用長い回転
            break;
        }
        break;
      }
}

//ボタンカウントアップ
void countup () {
    time_now = millis();
    if (time_now - time_prev > time_chat) {
        if (count < 2) count++; //パターンは1種
        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(volume (pwr_min,pwr_max),pwr_max);    //回転速度ランダムスローモーター用
    rev_time = GetRandom(dly_min,dly_max);                  //回転時間ランダム
    time_now = millis();

    //シリアルモニタ
    if (lrot == 0) {
      Serial.print("F");
    }else{
      Serial.print("R");
    }
    Serial.print(l_pwr);
    Serial.print(" ");
    Serial.print(rev_time);
    Serial.println("ms");
          
    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;
}
//#############################################
//スケッチはここまでコピー
//#############################################
関連記事

コメント

非公開コメント

このページのトップへ