日本と海外

日本と海外の国の比較と名古屋愛知情報

arduinoで超音波距離センサーHC-ST4と28BYJ制御

物体までの距離をArduinoとHC-SR04(4ピンの超音波距離測定器:Amazon.co.jp: VKLSVAN 2個 HC-SR04 超音波距離センサーモジュール Arduinoに互換 : 産業・研究開発用品)

で測定するスケッチ。ほとんどを変数化しているので、//-----------------------------以前の数値は可変である。

TRIG はHC-SR04のTrigピンをarduinoの3ピンにEchoを2に、Vccを+5VGrndをGNDにつなげる。 温度は測っていないので25度とした。安価なのでしょうがないが、高くなってもよければ、温度測定のできる精度の高い物もある。

 

int TRIG = 3;
int ECHO = 2;
int TusinSokudo=9600;
int mati1 = 100;
//
double duration = 0;
double distance = 0;
double speed_of_sound = 331.5 + 0.6 * 25; // 25℃の気温の想定
//-------------------------------------------------------------------------
void setup() {
  Serial.begin( TusinSokudo );

  pinMode(ECHO, INPUT );
  pinMode(TRIG, OUTPUT );
}

void loop() {
  digitalWrite(TRIG, LOW); 
  delayMicroseconds(1); 
  digitalWrite( TRIG, HIGH );
  delayMicroseconds( 1 ); 
  digitalWrite( TRIG, LOW );
  duration = pulseIn( ECHO, HIGH ); // 往復にかかった時間が返却される[マイクロ秒]

//  if (duration > 0) {
    duration = duration / 2; // 往路にかかった時間
    distance = duration * speed_of_sound * 100 / 1000000;
    Serial.print("Distance:");
    Serial.print(distance);
    Serial.println(" cm");
//  }

  delay(mati1);
}
 

 

以下はステップモータ2つのコントローラ付き回転させ、HC-SR04を使って超音波で距離を測定するARDUINO IDEの スケッチである。
夫々の説明は検索に委ねる。
2つのbyj48を回転させる。#define で示したようにのそれぞれコントローラのin1ー>arduino 4につなげる。
arduinoの4-7と8-11を使っている。
また、HC-SR04のecho、trigerはarduinoの2,3と繋げる。
電源5V、とGNDはそれぞれ繋げる。
 
 
/*                      
hc-s40dで障害物との距離和測り、ステッパーBYJ48で運転制御                    
*/                      
#define IN1 4                
#define IN2 5                
#define IN3 6                
#define IN4 7                
                     
#define IN5 8                
#define IN6 9                
#define IN7 10                  
#define IN8 11                  
                     
const int NBSTEPS = 4096;            
const int STEPTIME  = 900;
const int echo=2;
const int trige=3;

int Step  = 0;                
int mati0 = 20;
int mati1=2;                
boolean Clockwise = true;              
//---------------------------------------------                    
int arrayDefault[4] = { LOW,  LOW,  LOW,  LOW };      
                     
int stepsMatrix[8][4] = {              
    { LOW,  LOW,  LOW,  HIGH  },        
    { LOW,  LOW,  HIGH, HIGH  },        
    { LOW,  LOW,  HIGH, LOW },        
    { LOW,  HIGH, HIGH, LOW },        
    { LOW,  HIGH, LOW,  LOW },        
    { HIGH, HIGH, LOW,  LOW },        
    { HIGH, LOW,  LOW,  LOW },        
    { HIGH, LOW,  LOW,  HIGH  },        
};                      
                     
unsigned  long  lastTime;                
unsigned  long  time;                
                                     
int sokudo=9600;                      
                     
int duration  = 0;                  
int distance  = 0;                  
int speed_of_sound  = 331.5 + 0.6 * 25; //  25℃の気温の想定    
                     
void  setup() {   //    *****     SETUP() ************  
    Serial.begin(9600);                
    Serial.println("STERT ! ");            
                     
    pinMode(IN1,  OUTPUT);                
    pinMode(IN2,  OUTPUT);                
    pinMode(IN3,  OUTPUT);                
    pinMode(IN4,  OUTPUT);                
                     
    pinMode(IN5,  OUTPUT);                
    pinMode(IN6,  OUTPUT);                
    pinMode(IN7,  OUTPUT);                
    pinMode(IN8,  OUTPUT);                
                   
  Serial.begin( sokudo  );                
  pinMode(echo, INPUT );                
  pinMode(trige,  OUTPUT  );                
}                    
                     
void  loop()  {   //    *****     loop()  ************  
    unsigned  long  currentMicros;              
    int stepsLeft = NBSTEPS;            
    time  = 0;              
    while (stepsLeft  > 0)  {        
        currentMicros = micros();        
        if  (currentMicros  - lastTime  >=  STEPTIME) {
            stepper();          
            time  +=  micros()  - lastTime;
            lastTime  = micros();    
            stepsLeft--;          
        }            
    }                
    Serial.println(time);                
    Serial.println("STOP!");                  
    delay(10  * mati0);            
    //回転方向切り替え                  
    Clockwise = !Clockwise;            
    stepsLeft = NBSTEPS;              
}                    
                     
void  writeStep(int outArray[4])  {              
    for (int  i = 0;  i < 4;  i++)  {
        digitalWrite(IN1  + i,  outArray[i]);      
                     
        digitalWrite(IN5  + i,  outArray[i]);   //******************************    
    }                
}                    
                     
void  stepper() {                
    if  *1 {
        writeStep(stepsMatrix[Step]);            
    } else  {            
        writeStep(arrayDefault);              
    }                
    setDirection();                
}                    
                     
void  setDirection()  {                
    (Clockwise) ? (Step++)  : (Step--);        
    if  (Step > 7)  {        
        Step  = 0;          
    } else  if  (Step < 0)  {    
        Step  = 7;          
    }                
                 
  digitalWrite(trige, LOW);                
  delayMicroseconds(mati1);                  
  digitalWrite( trige,  HIGH  );              
  delayMicroseconds(  mati0 );                
  digitalWrite( trige,  LOW );              
  duration  = pulseIn(  echo, HIGH  );  //  往復にかかった時間が返却される[マイクロ秒]      
                     
  if  (duration > 0)  {          
      duration  = duration  / 2;  //  往路にかかった時間  
      distance  = duration  * speed_of_sound  * 100 / 1000000;
      Serial.print("Distance:");                
      Serial.print(distance);              
      Serial.println("  cm");            
  }                  
                     
  delay(20*mati0);                    
}
 

 

*1:Step  >=  0)  &&  (Step < 8