์์์ ์ด์ผ๊ธฐ ํ ๊ฒ์ฒ๋ผ ๋ค์ํ ์ผ์, ๋ค์ํ ๋ชจํฐ๋ฅผ ๋์ ํด๋ณด๋ ๊ณผ์ ์ ๊ฑฐ์ณค๋ค..
์ฌ์ฉํด๋ดค๋ ์ผ์๋ก๋
- ๊ฐ์๋ ์ผ์
- ๋ ์ด์ ๊ฑฐ๋ฆฌ ์ผ์
- ์ด์ํ ๊ฑฐ๋ฆฌ ์ผ์
- ๊ฒ์ดํธ ์ผ์
์ด๋ฐ ์ผ์๋ค์ด ์์๊ณ , ๋ชจํฐ๋ก๋ dc๋ชจํฐ, servo ๋ชจํฐ, step ๋ชจํฐ ๋ค์ ์ฌ์ฉํด๋ณด๋ฉด์ ๊ฐ๊ฐ์ง ๋ค์ํ ์ ๋ง๊ฐ์ ์ฒดํํ๋ค.
๊ฐ์ฅ ๋จผ์ ์๋ ํ๊ฒ์ ๊ฑฐ๋ฆฌ ์ธก์ ์ ํตํ ์ฃผ๊ธฐ ์ธก์ ์ผ๋ก ๊ฐ์ฅ ๊ฐ์ด๋ฐ ๋ถ๋ถ์์์ ๊ฑฐ๋ฆฌ, ์ฆ ๊ฐ์ฅ ์งง์ ๊ฑฐ๋ฆฌ๊ฐ ์ธก์ ๋๊ฒ ํ ๋ค ๊ทธ๋ค๋ฅผ ์์ง์ด๊ธฐ ์์ํ์ฌ ์งง์ ๊ฑฐ๋ฆฌ๊ฐ ์ด 3๋ฒ ์ธก์ ๋์ด ๊ทธ๊ฒ์ ์ฃผ๊ธฐ๋ก ํ์ฌ ์์ง์ด๋ ๋ฐฉ๋ฒ์ ์๋ํ์๋ค.
#include <Servo.h>
#include <Wire.h>
#include <VL53L0X.h>
#include <IRremote.h>
int remote = 7;
int LENGTH = 180; // ์ํ๋ ๋์ด
int MAXA = 60; // ์ํ๋ ์ต๋ ๊ฐ๋
int AVERAGE_COUNT = 3; // ํ๊ท ์ ๋ด๊ธฐ ์ํด ๋ชจ์ผ๋ ๊ฐ
VL53L0X sensor;
Servo servo;
IRrecv irrecv(remote);
decode_results results;
// -------------------- ๋ณ์ ----------------------------------
int angle = 0, al = 0; // angle์ ๋ชจํฐ ๊ฐ๋, al์ average length, T๋ ์ฃผ๊ธฐ
int k = 0, i= 1, j = 1, t = 1; // l, i, j, t๋ ์ซ์ ์นด์ดํ
๋ณ์
int summm = 0; // summ์ ์ง๊ธ์ ๋์ด์ ํฉ, aver๋ ์ง๊ธ์ 3๊ฐ์ ๊ฐ์ ํ๊ท
int average[500]; // ํ๊ท ๊ฐ ์งํฉ ( 1000 -> 500 )
int min_mm[500]; // ํ๊ท ๊ฐ ์ค ์กฐ๊ฑด์ ๋ง๋ ๊ฐ ์งํฉ ( 1000 -> 500 )
unsigned long timeval[30]; // min_mm์ ์๊ฐ
unsigned long T=0; // ์ฃผ๊ธฐ
float a=0, b=0, c=0;
int q=0, w=0, e=0, r=0;
// ------------------------------------------------------------
void setup()
{
servo.attach(5);
irrecv.enableIRIn();
pinMode(5, OUTPUT);
pinMode(remote, INPUT);
Serial.begin(9600);
Wire.begin();
sensor.init();
// -------------------- sensor -------------------------
sensor.setTimeout(500);
if (!sensor.init())
{
Serial.println("Failed to detect and initialize sensor!");
while (1) {}
}
#if defined LONG_RANGE
// lower the return signal rate limit (default is 0.25 MCPS)
sensor.setSignalRateLimit(0.1);
// increase laser pulse periods (defaults are 14 and 10 PCLKs)
sensor.setVcselPulsePeriod(VL53L0X::VcselPeriodPreRange, 18);
sensor.setVcselPulsePeriod(VL53L0X::VcselPeriodFinalRange, 14);
#endif
#if defined HIGH_SPEED
// reduce timing budget to 20 ms (default is about 33 ms)
sensor.setMeasurementTimingBudget(20000);
#elif defined HIGH_ACCURACY
// increase timing budget to 200 ms
sensor.setMeasurementTimingBudget(200000);
#endif
// ------------------------------------------------------------
}
void loop()
{
// ------------------- ์ฃผ๊ธฐ๋ฅผ ๋ง๋๋ ํจ์ ----------------------
if(T == 0)
{
int aver; // aver๋ ์ง๊ธ์ 3๊ฐ์ ๊ฐ์ ํ๊ท
Serial.print("๊ฑฐ๋ฆฌ๋ : ");
Serial.print(sensor.readRangeSingleMillimeters());
if (sensor.timeoutOccurred()) {
Serial.print(" TIMEOUT");
}
Serial.println();
summm += sensor.readRangeSingleMillimeters();
Serial.print("summm์ ๊ฐ์ : ");
Serial.println(summm);
Serial.print("k์ ๊ฐ์ : ");
Serial.println(k);
k++;
aver = 0;
if( k == AVERAGE_COUNT )
{
aver = summm/AVERAGE_COUNT;
summm = 0;
k = 0;
average[i] = aver;
Serial.print(" ํ๊ท ๊ฐ์ : ");
Serial.println(aver);
i++;
}
j = i;
if(average[j] <=average[j+1] && average[j] <= average[j-1])
{
timeval[t] = millis();
t++;
}
if(timeval[10] != 0)
{
T = timeval[10] - timeval[8]; // ํน์ ๋ชจ๋ฅผ ์๋ชป๋ ๊ฐ์ด timeval ํจ์์ ๋ค์ด๊ฐ ๊ฒ์ ๋๋นํด์ ์ฃผ๊ธฐ ์ค์
}
if(T != 0)
{
Serial.print("์ฃผ๊ธฐ๋ : ");
Serial.println(T);
}
// ------------------------------------------------------------
}
else
{
servo.write(45);
Serial.println(sensor.readRangeSingleMillimeters());
al = sensor.readRangeSingleMillimeters();
if( al < LENGTH ) // al์ ๋ฐ๋ฅ๊น์ง์ average length
{
a = 0.25;
b = 0.25;
c = 0.25;
q = T * a;
w = T * b * 10;
e = T * c /4 ;
r = ( T * (1 - (a + c + b)) ) * 10;
/* if (irrecv.decode(&results)){ // ์ ์ธ์ ๋ฆฌ๋ชจ์ปจ์ ์ ํธ๋ฅผ ๋ฐ์ ๋
switch (results.value) {
case FFC23D: // ์์ ๋ฒํผ์ ๋๋ ์ ๋
a = ;
b = ;
c = ;
moving(a, b, c);
break;
}
}*/
for (angle = MAXA; angle > 0; angle--)
{
servo.write(angle); //angle(๊ฐ๋)๊ฐ์ผ๋ก ์๋ณด๋ชจํฐ ์ ์ด
delay(q); //delay๋ก ๊ฐ๋์ ๋ณํ ์๋๋ฅผ ์กฐ์ (0.1์ด ๋จ์)
}
delay(w);
for (angle = 0; angle < MAXA; angle++)
{
servo.write(angle); //angle(๊ฐ๋)๊ฐ์ผ๋ก ์๋ณด๋ชจํฐ ์ ์ด
delay(e); //delay๋ก ๊ฐ๋์ ๋ณํ ์๋๋ฅผ ์กฐ์ (0.1์ด ๋จ์)
}
delay(r);
}
}
}
์ด๋ฌํ ๋ฐฉ์์ผ๋ก ์ฝ๋๋ฅผ ๊ตฌ์ฑํ์ ๋ ๋ฌธ์ ๊ฐ ์ฌ๋ฌ๊ฐ๊ฐ ์๊ฒผ๋ค..
์ฒซ๋ฒ์งธ๋ ์ธก์ ์ด ๋๋ฆฌ๋ค๋ ์ ์ด์๋ค. ๊ทธ๋ค์ ์ฃผ๊ธฐ๊ฐ ๊ฑฐ์ 1์ด์ผ ์ ๋๋ก ์งง์๊ธฐ ๋๋ฌธ์ ๋ ์ดํด์๊ฐ 100ms๊ฐ ๋๋ ์ผ์์๋ ๊ฑฐ๋ฆฌ์ธก์ ์ผ์์ ์ข ๋ฅ๋ค์ ํ๋ค์๋ค. ๋ํ ์ด๋ ์ฃผ๊ธฐ ์ธก์ ์ ๋ค์ด๊ฐ๋ ์ฝ๋๊ฐ ์๋นํ ๋นํจ์จ์ ์ด๊ณ ๋ณ์๋ฅผ ๊ณ์ ์ ์ฅํ๋ ๋ฐ๋์ ์ฐ๋ ธ๋ก ๋ถ๊ฐ๋ฅํ๊ณ ๋ฉ๊ฐ๊น์ง ๊ฐ์ผํ๋ฉฐ ๋ณ์๋ฅผ ์ฃผ๊ธฐ์ ์ผ๋ก ์ง์์ฃผ๋ ์ฝ๋๊ฐ ํ์ํ๋ค.
๋ฐ๋ผ์ ์ด๋ฌํ ๋ฌธ์ ๋ค์ ํด๊ฒฐํ๊ธฐ ์ํด์ ๊ฐ์๋ ์ผ์๋ฅผ ์ด์ฉํด๋ณด๋ ํฐ ๋ชจํ์ ๋ ๋๊ธฐ ์์ํ๋ค.