블로그 이미지
래머
오늘도 열심히 개발하는 개발자입니다.

calendar

1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31

Notice

2019. 2. 6. 18:56 아두이노

LCD            NODEMCU

SDD/MISO        D6

LED            3.3V

SCK            D5

SDI/MOIS        D7

DC/RS         임의의핀

RESET          임의의핀

CS            임의의핀

GND            

VCC


'아두이노' 카테고리의 다른 글

Node mcu 와이파이 속도 테스트  (0) 2017.11.26
nodemcu v3 핀맵  (0) 2017.11.12
밸런싱로봇 종합사항  (3) 2015.12.21
밸런싱로놋 mpu6050 센서방향  (0) 2015.12.19
MPU6050 자이로 가속도 센서  (0) 2015.07.25
posted by 래머
2017. 11. 26. 00:12 아두이노

노드 mcu 라는 재미있는 녀석을 발견해서 가지고 놀다가 

와이 파이 전송속도가 얼마정도 나올지 테스트 해보고 싶어졌습니다.


대충 서버를 만들고, 노드 mcu쪽은 와이파이 클라이언트 예제를 좀 수정했는데


테스트 방법은 다음과 같습니다.


서버측에서는 tcp서버소켓을 열고 특정포트를 리슨하고 있습니다.


클라이언트쪽에서는 와이파이연결을 초기화 하고, 서버의 ip와 포트에 WIFIClient를 통해서 접속합니다.


접속이 이루어지면 노드쪽에서는 특정한 값으로 초기화된 1024바이트 길이의 배열을 전송을 하고

서버에서는 클라이언트의 내용을 수신해서 내용물을 검사해서 오류가 있는지 확인하고

수신된 바이트 수를 기록해뒀다가 

매1초 경과시 마다 수신받은 바이트수를 출력하는 형태입니다.


클라이언트(노드mcu)는 일단 서버에 패킷을 보내고 나서 서버로 부터 다음 패킷을 보내라는 응답을 

받기전까지는 다음 패킷을 보내지 않습니다.


아래는 테스트 영상입니다.


해외어떤사이트에서 노드mcu전송속도가 형편없다고 들었는데

비록 내부 네트워크간의 전송이지만 생각보다 속도가 잘나오는거 같습니다.

70kb ~ 200kb정도 나오는거 같습니다.


한가지 문제점은 노드mcu에 달린 안테나가 부실해서 그런지 전력소모가 많아서 그런지 모르겠는데 

매우 불안정해서 연결이 매우 쉽게 끊어지는거 같습니다.



'아두이노' 카테고리의 다른 글

NodeMcu TFT lcd 연결  (0) 2019.02.06
nodemcu v3 핀맵  (0) 2017.11.12
밸런싱로봇 종합사항  (3) 2015.12.21
밸런싱로놋 mpu6050 센서방향  (0) 2015.12.19
MPU6050 자이로 가속도 센서  (0) 2015.07.25
posted by 래머
2017. 11. 12. 01:02 아두이노


'아두이노' 카테고리의 다른 글

NodeMcu TFT lcd 연결  (0) 2019.02.06
Node mcu 와이파이 속도 테스트  (0) 2017.11.26
밸런싱로봇 종합사항  (3) 2015.12.21
밸런싱로놋 mpu6050 센서방향  (0) 2015.12.19
MPU6050 자이로 가속도 센서  (0) 2015.07.25
posted by 래머
2015. 12. 21. 13:11 아두이노

일단 아래 소스를 다운로드 해주세요. 라이브러리 없이 밸런싱 로봇 소스만 포함한 소스입니다. pid쪽으로 약간의 수정이 된 버전입니다.


아두이노스케치용소스.zip



가장처음으로 모터드라이버와 아두이노의 회로배선상태되도 소스를 수정합니다.

아래 사진에 보이는 부분입니다.



두번째는 센서와 차체의 방향에 따라서 각도를 읽어 오는 부분을 수정합니다. 바퀴축과 나란한 축이 X축이면 아래와 같이 m_Gyro.GetKalAngleX()를통해서 x축 각도를 읽도록하고 Y축이라면 m_Gyro.GetKalAngleY()를 통해서 Y축각도를 읽도록 합니다.



소스를 업로드 하고 밸런싱로봇 작동상태를 확인합니다.

만일 바퀴가 움직이지 않으면, 아두이노와 모터드라이버의 핀연결 상태가 소스에서 설정한 핀과 일치하는지 확인합니다.

배선상태와 핀설정이 일치한다면, 테스터기 같은것으로 모터드라이버의 출력측을 측정해서 출력이 있는지 확인합니다. 출력이 있고, 차체의 기울어짐에 따라서 출력전압 극성에 변동이 있다면 일단 소스와 회로 구성은 올바르지만, 모터를 구동시킬만큼 출력전류가 충분하지 않아서 그러것입니다.

이때는 아래소스에 보이는 것처럼 PID_SCALE을 높여 보시기 바랍니다. 모터가 움직일때까지 해당값을 조금씩 높여가면서 테스트 해봅니다.

저부분은 원래 소스에는 없던 부분입니다. 새로 추가한 부분인데,


소스상에도 설명되어 있지만, 제공된 소스는 제가 만든 밸런싱 로봇에 맞게 PID설정이 되어 있습니다. 밸런싱로봇의 무게나, 무게중심, 모터특성등에 따라서 적절한 PID값을 조정해야 합니다. 최적의 PID값을 찾아내지 못하면 밸런싱 로봇의 중심잡기는 실패 하게 됩니다.

PID_SCALE조정으로 바퀴가 움직이고, 기울어짐에 따라 회전 방향이 정상적으로 바뀐다면 30%정도는 성공한것입니다.

만일 기울어진 방향과 반대 방향으로 모터가 움직인다면 반대로 움직이는 쪽 부분만 http://eltgroup.tistory.com/299 글을 참고해서 코드를 수정합니다


이제남은 일은 최적의 PID값을 찾는 일입니다. 밸런싱로봇을만들때 가장 힘든부분입니다. 운이좋아 PID_SCALE값 조정만으로 밸런스가 유지된다면 따로 PID값 조정할 필요는 없습니다.



위소스에 보이는것처럼, PID_KP, PID_KI, PID_KD 값을 자신의 차체에 맞는 값으로 찾아서 수정해야 합니다.

동역학이론을 동원해서 실험과 특성을 추출해서 계산해내지 않는이상은, 3가지 값을 조금씩 바꿔가면서 차체가 밸런스를 잡을때까지 무한 수정 노가다를 할 수 밖에 없습니다.


'아두이노' 카테고리의 다른 글

Node mcu 와이파이 속도 테스트  (0) 2017.11.26
nodemcu v3 핀맵  (0) 2017.11.12
밸런싱로놋 mpu6050 센서방향  (0) 2015.12.19
MPU6050 자이로 가속도 센서  (0) 2015.07.25
DHT11 온습도 센서  (0) 2015.05.25
posted by 래머
2015. 12. 19. 21:58 아두이노



위사진에 보이는것처럼 센서의 y축이 차체의 바퀴와 나란히 배치되어 있습니다.

센서의 Y각도를 추출해서 밸런싱에 이용하고 있습니다.

아래는 올리신 사진인데, 사진이 흐려 자세히 보이지는 않지만 센서의 x축이 바퀴축과 나란한것 같습니다.




위사진에 보면 mpu6050의 int핀에 선이 연결되어 있는것 같습니다. 해당 핀에 LOW, HIGH신호를 가하는것에 따라서 mpu6050 i2c통신 주소가 달라집니다.

일단 소스코드상에서는 해당 핀에 아무것도 연결하지 않은 상태의 주소로 설정되어 있으니, 해당 핀에 연결된 선은 빼주시기 바랍니다.


그리고 소스코드상에서는y축의 각도 변화를 추출하는데, 위의 차체에서는 차체가 기울더라도 x축을 중심으로 기울기에 변화가 있기 때문에, 올바르지 않게 작동하게 될겁니다.


두가지 방법이 있는데, 한가지는 첫번째사진과 같이 축을 일치 시켜주는 방법이고, 다른 방법은 소스코드상에서

Y축 기울기를 측정하는 부분을 x축 기울기 측정으로 바꾸는 겁니다. 두번째가 더간단할거 같네요.

기울기를 측정하는 부분은 소스코드상에서 아래부분과 같습니다. 

CSelfBlancer.h 파일의 내부에 보시면 Update() 함수가 있습니다.

붉은원으로 표시해놓은 부분에 보시면 원래는 저부분이

m_Gyro.GetKalAngleY() 라고 되어 있습니다. 이것을 아래 그림에 나온것처럼 m_Gyro.GetKalAngleX()라고 바꿔주시면됩니다.



위와같이 수정하시고, 업로드 하신다음에 정상적이라면 바퀴축을 기준으로 차체를 기울일경우 기울인방향으로 모터가 회전해야 합니다.

만일 기울인 반대 방향으로 모터가 회전한다면, 정방향/역방향이 바뀐경우이니

그때는 단순하게 모터드라이버에 연결된 선을 서로 바꿔서 연결하거나 아니면 아래와 같이 소스코드 부분을 수정하시면됩니다.

역시 같은 소스인 CSelfBlancer.h 파일을 열어서

아래 사진에 표시 해놓은 부분을 수정하시면 되는데

g_Motor.Backward 부분과 g_Motor.Forward 부분을 서로 바꿔주시면 됩니다.


그러니까 아래 그림의 UpdateLeft함수와 UpdateRight함수 내부에 보시면 


g_Motor.Backward 부분과 g_Motor.Forward가 있는데

g_Motor.Backward(true, (uint8_t)(-fControl)); 를 g_Motor.Forward(true, (uint8_t)(-fControl)); 로바꾸고

g_Motor.Forward(true, (uint8_t)fControl); 는 g_Motor.Backward(true, (uint8_t)fControl); 처럼


Backward와 Forward를 서로 바꾸면 됩니다.







'아두이노' 카테고리의 다른 글

nodemcu v3 핀맵  (0) 2017.11.12
밸런싱로봇 종합사항  (3) 2015.12.21
MPU6050 자이로 가속도 센서  (0) 2015.07.25
DHT11 온습도 센서  (0) 2015.05.25
아두이노 visual studio 연동  (0) 2015.05.16
posted by 래머
2015. 7. 25. 18:58 아두이노

자이로 와 가속도 센서가 포함된 센서입니다.

매우 유명하여 딱히 설명할 필요가 없는 센서인데,

예제또한 풍부합니다.

하지만 깔끔하게 센서제어 및 액세스에 관련한 부분만 만들어진것은 안보이는것 같아

제가 참고 했던 예제중 하나를 클래스로 래핑하여, 라이브러리화 했습니다.


사용법은 아래와 같습니다.


첨부 파일을 아두이노 라이브러리에 추가 하시고 사용하면됩니다.

칼만필터라는 예제를 수정한 버전인데 혹 이미 같은 라이브러리를 추가해놓으신경우에는

에러가 날 수 도 있겠습니다.

그런경우에는 CMPU6050.h 파일만 칼만필터 라이브러리 폴더내에 복사해 넣으시면되겠습니다.


첨부라이브러리

KalmanFilter.zip


예제소스코드


mpu6050test.zip



아두이노 작품 메뉴에 있는 밸런싱 로봇은 아래 라이브러리를 활용하여 만든것이니, 동작에 별문제 없다고 생각합니다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
#include <Arduino.h>
#include <Wire.h>
#include <Kalman.h>
#include <CMPU6050.h>
 
//mpu6050 매니저입니다. 단순히 누군가 만들어놓은 유명한 예제에서 mpu6050부분만 뽑아 클래스화 시킨겁니다.
CMpu6050Manager g_Mpu6050;
 
void setup()
{
  g_Mpu6050.Init(); //setup에서 반드시 한번 호출해 줍니다.
  Serial.begin(9600);
}
 
void loop()
{
 
  //매 루프마다 호출되게 해줍니다.
  g_Mpu6050.Update();
  
  //x값은 -90 ~ 90
  //y값은 -180 ~ 180범위
  //상보 필터(Complementary Filter) 
  float companglex = g_Mpu6050.GetCompAngleX();
  float compangley = g_Mpu6050.GetCompAngleY();
  
  //칼만 필터, 
  float kalmananglex = g_Mpu6050.GetKalAngleX();
  float kalmanangley = g_Mpu6050.GetKalAngleY();
 
  Serial.print("kalx : ");
  Serial.print(kalmananglex, 2);
  
  Serial.print("\tkaly : ");
  Serial.print(kalmanangley, 2);
  
  Serial.println();
  
  delay(500);
}
cs




'아두이노' 카테고리의 다른 글

밸런싱로봇 종합사항  (3) 2015.12.21
밸런싱로놋 mpu6050 센서방향  (0) 2015.12.19
DHT11 온습도 센서  (0) 2015.05.25
아두이노 visual studio 연동  (0) 2015.05.16
아두이노 tone()함수  (0) 2015.05.12
posted by 래머
2015. 5. 25. 00:25 아두이노

온도 및 습도 측정에 많이 사용되는 센서인듯합니다.

생긴것은 아래와 같습니다.



4개의 연결핀을 가지고 있는데, 

1 ~ 4번까지 순서되로, 


1 : 5v공급

2 : 센서출력

3 : 연결하지 않음

4 : Gnd


입니다.

센서 단독으로 가지고 계신경우 사용하기 위해서, 센서출력 2번과 1번사이에 10kOhm의 저항을 연결하라고 합니다.


제가 가지고 있는것은 아래 그림과 같이 모듈형태로되 있는데요, 저항이 미리 연결되어 있습니다. 모듈의 장점은 센서를 사용하기 위해서 필요한 부가 부품들이

미리 추가되어 있어서 따로 회로구성할 필요가 없다는 것이겠습니다.


그림에 표시해놓은것처럼 순서되로, 신호선, 5v, Gnd입니다.


해당센서 사용하기 위해서 데이터시트를 참조해서 직접 제어 코드를 만들 수도 있겠지만, 조금만 검색해보면

누군가 만들어놓은 쓰기 편한 라이브러리가 있습니다.


라이브러리는 바로아래 첨부해놓은것을 받으시면됩니다.

DHT_sensor.zip


라이브러리 압축을 푸시고 아두이노의 라이브러리 디렉터리내에 옮기면되는데

아두이노 설치된디렉터리에 보면 아래 사진에 나온것처럼 libraries 라는 폴더가 있습니다.



저기 안에 위에서 받아서 압축푼 폴더를 째로 넣어주시면되는데, 복사하고 나면 아래 처림되겠죠.



DHT_sensor 폴더 안에 들어가보면 아래 그림과 같이 몇개의 파일과 예제가 보입니다.


위사진에 보이는 DHT.h를 아두이노 프로젝트에 include 해서 사용하시면되는데요.

사용법은 매우 간단합니다.


일단 DHT11 센서와 아두이노를 연결합니다.

처음설명했던것처럼 5v, gnd연결하시고, 신호선은 아두이노의 디지털핀중에서 적당한 핀을 연결하시면되겠습니다.

예제에서는 2번핀을 연결하도록 하겠습니다.


///////여기부터 소스--------------------------------------------------------------------------------------------------

#include <dht.h>       //라이브러리 헤더를 포함시키고

#define DHT11_PIN 2     //센서와 연결할 핀으로 디지털 2번을 사용하겠습니다.


/*

DHT클래스가 dht계열 센서의 조작관련 기능을 제공하는 클래스입니다.

아래처럼 해당 클래스 인스턴스를 선언하시고 생성자에 전달될 인자에는 순서되로, 신호핀 번호, dht센서종류

를 기입해주시면되겠습니다.


DHT dht(DHTPIN, DHTTYPE);

*/


DHT dht(DHT11_PIN, 11); //dhttype 에는 dht11센서를 사용할꺼기 때문에 11을 줬습니다.


//setup함수에서 dht센서를 초기화 시키면되는데,

void setup()

{

dht.begin(); //이함수를 통해서 초기화시작합니다.


//센서의 출력결과를 시리얼 모니터를 통해서 확인하기 위해서 시리얼도 초기화 시키겠습니다.

Serial.begin(9600);


}


//이제 매 루프마다 센서값을 읽어서 시리얼 포트에 출력해봅니다.

//dht11 센서는 측정주기가 매우 느리다고 합니다. 제가 테스트해본결과도 온도변화를 즉각 감지하지 못하고 온도가 변하고 나서 한참있다가

//변화된 온도가 측정되는것을 확인했습니다.

void loop()

{

float h = dht.readHumidity();   //습도를 읽습니다.


float t = dht.readTemperature(); //섭씨 온도를 읽습니다.


float f = dht.readTemperature(true); //화씨 온도를 읽습니다.


//이제 읽은 결과를 시리얼로 출력합니다.

Serial.print("Humidity: "); 

Serial.print(h);

Serial.print(" %\t");      //\t 기호는 탭을 뜻합니다.

Serial.print("Temperature: "); 

Serial.print(t);

Serial.print(" *C ");

Serial.print(f);

Serial.print(" *F\t");


delay(2000); //2초마다 한번씩 센서값을 읽도록 2초 딜레이를 줬습니다.

}

//소스끝------------------------------------------------------------------------------------------------------------------------

보시는 것처럼 라이브러리를 사용하면 매우 간편하게 dht11 센서를 사용할 수 있습니다.



'아두이노' 카테고리의 다른 글

밸런싱로놋 mpu6050 센서방향  (0) 2015.12.19
MPU6050 자이로 가속도 센서  (0) 2015.07.25
아두이노 visual studio 연동  (0) 2015.05.16
아두이노 tone()함수  (0) 2015.05.12
HC-SR04 초음파센서  (0) 2015.05.11
posted by 래머
2015. 5. 16. 00:07 아두이노

기본 아두이노에서 제공하는 스케치 툴은 간단하고 가벼워서

정말 심플한 테스트용 스케치를 작성하는데 이용시에는, 조금 불편해도 못쓸정도는 아닙니다.


하지만 조금만 코드량이 늘어나거나 하면 사용하기가 여간 불편한게 아니죠.

비주얼 스튜디오나 이클립스에 길들여진 저로서는 정말 최악의 에디터 입니다.


그래서 혹시 비주얼 스튜디오의 편집기를 그대로 이용할 수있는 방법이 없는지 검색해보니,

역시나 있군요.


아두이노 for 비주얼 스튜디오라는 것인데, 

해당 설치 파일을 다음 사이트에서 다운로드 받아 설치 하시면

비주얼 스튜디오에서도 아두이노프로젝트 생성및 업로드 까지 가능합니다.

ArduinoForVisulStudio는 다음 사이트에서 다운로드 가능합니다.


http://www.visualmicro.com/page/Arduino-Visual-Studio-Downloads.aspx?from=newstuff


최신버전에서는 비주얼 스튜디오 2013버전이상과 기본 아두이노 ide가 필요하다고 나와 있네요.


Download Latest Visual Micro


간단하게 위에 링크를 클릭해서 다운로드 할 수도 있습니다.


예전에는 비주얼 스튜디오는 무조건 유료였는데, 언제 부터인가 무료버전을 배포하기 시작하네요.


https://www.visualstudio.com/products/visual-studio-community-vs


위의 링크에서 다운로드 가능합니다.  2013 커뮤니티 버전이네요.

비주얼 스튜디오를 먼저 설치하시고, 다음으로 ArduinoForVisulStudio를 설치합니다. 처음설치하시는 분은

ArduinoForVisulStudio 설치중에 아두이노 ide의 경로를 물어 볼 수 있는데, 적절히 설정해주시면되겠습니다.


아두이노 for VS를 설치하시고 비주얼 스튜디오를 실행해보면 메뉴의 New에 아두이노 스케치 프로젝트를

생성할 수 있는 메뉴가 추가되어 있는것을 볼 수 있습니다. 해당 메뉴 항목을 통해서 아두이노 프로젝트를 생성할 수 있습니다.




비주얼 스튜디오 Tools메뉴에 보시면 아두이노관련 선택 메뉴가 추가된것을 볼수 있는데(Visual Micro), 여기서브 항목에 보시면

아두이노 보드를 선택하거나 포트 선택 시리얼 모니터등 아두이노관련 메뉴를 볼 수 있습니다.



스케치 작성이 끝나고 업로드가 필요하다면 Build메뉴의 Build Solution 을 통해서 변경사항을 빌드하거나 Rebuild Solution메뉴를 통해서

프로젝트 전체를 다시 빌드 할 수 있습니다.





빌드가 끝났다면 이제 업로드를 하면되는데, 아래 사진에 나온것처럼 Project메뉴에 있는 Upload Last Sketch Build항목을 통해서 아두이노 보드에

스케치를 업로드 할 수 있습니다.


이렇게 한번 설정해놓으시면 차후부터는 비주얼 스튜디오의 편리한 에디터로 마음껏 아두이노 프로젝트를 작업할 수 있습니다.


'아두이노' 카테고리의 다른 글

MPU6050 자이로 가속도 센서  (0) 2015.07.25
DHT11 온습도 센서  (0) 2015.05.25
아두이노 tone()함수  (0) 2015.05.12
HC-SR04 초음파센서  (0) 2015.05.11
digitalRead() 함수  (0) 2015.05.10
posted by 래머
2015. 5. 12. 20:05 아두이노

http://www.arduino.cc/en/Reference/Tone

tone()

Description

Generates a square wave of the specified frequency (and 50% duty cycle) on a pin. A duration can be specified, otherwise the wave continues until a call to noTone(). The pin can be connected to a piezo buzzer or other speaker to play tones.

핀에 지정된 주파수의 직각파를(50%듀티사이클)생성한다. 지속시간을 지정할 수 있으며, 그렇지 않을경우 noTone()호출전까지 지속된다. 핀에는 소리를 플레이 하기 위한 피에조 부저나 스피커를 연결할 수 있다.

Only one tone can be generated at a time. If a tone is already playing on a different pin, the call to tone() will have no effect. If the tone is playing on the same pin, the call will set its frequency.

오직하나의 톤만 동시에 생성할 수 있다. 만일 다른 톤이 이미 플레이 중인경우, 새로운 tone()의 호출은 아무런 효과를 가지지 않는다. 만일 같은 핀에 다시 tone을 호출하면, 지정된 주파수로 변경될것이다.

Use of the tone() function will interfere with PWM output on pins 3 and 11 (on boards other than the Mega).

tone()함수를 사용하는것은 3과 11번 핀의 pwm출력을 간섭하게 될것이다.(메가외의 다른보드에서)

It is not possible to generate tones lower than 31Hz. For technical details, see Brett Hagman's notes.

31Hz이하의 톤생성은 불가능하다. 자세한 기술사항은 Brett Hagman's notes를 보라.

NOTE: if you want to play different pitches on multiple pins, you need to call noTone() on one pin before calling tone() on the next pin.

주의 : 만일 여러개의 핀에서 다른 피치의 톤을 플레이 하기 원할경우, 다른핀에 tone()함수를 호출전에 noTone()을 호출할 필요가 있다.

'아두이노' 카테고리의 다른 글

DHT11 온습도 센서  (0) 2015.05.25
아두이노 visual studio 연동  (0) 2015.05.16
HC-SR04 초음파센서  (0) 2015.05.11
digitalRead() 함수  (0) 2015.05.10
아두이노 digitalWrite() 함수  (0) 2015.05.10
posted by 래머
2015. 5. 11. 03:38 아두이노



초음파를 쏘고 반사되어 돌아 오는 초음파를 감지 해서 물체까지의 거리를 측정하는 원리입니다.

스펙상 약간씩 차이가 있는데 대략 2cm ~ 2m까지 범위의 측정이 가능하다고 합니다.

장애물 검출 할때 가장 흔하게 사용하는 센서 인듯합니다.


장점은 첫째로 매우 싸다는 것입니다. 국내에서도 2000원 이하 가격대에서 구매 가능합니다.

가격에 비해서 꽤 쓸만한 정도의 측정치를 제공합니다.

그리고 사용하기 매우 쉬운편입니다.


단점은 일단 그렇게 정밀하지 않습니다. 오차가 꽤 있는 편이고 환경조건에 따라서 오차가 커집니다.

두번째 단점은 초음파를 반시 시키지 않고 통과 또는 흡수 하는 재질에서는 측정이 안되거나 측정오차가 있습니다.

흔히 이불같은 천 재질에서는 측정이 잘안되는것 같습니다.


사용법은 다음과 같습니다. 

Vcc와 GND에는 전원을 연결합니다. Vcc에는 5v를 공급합니다. 3.3v를 공급해도 동작은 하는데 측정치가 다르게 나옵니다.

Echo외 Trig핀에는 아두이노 디지털 핀을 연결합니다.

Trig핀은 초음파 발산제어를 Echo핀은 수신된 초음파 관련 데이터를 수신하는 통로입니다.


트리거핀에 2us 동안 LOW 출력 후 다시 5us동안 HIGH를 가합니다. 이후 다시 LOW를 가합니다.

에코핀을 통해서 펄스 입력 형태로 측정된 데이터를 수신합니다.


아래는 제어 소스 코드입니다.


#include <Arduino.h>


class CSonicSensorMng

{

protected:

char m_cTrig;

char m_cEcho;

public:

CSonicSensorMng(char trig, char echo)

{

m_cTrig = trig;

m_cEcho = echo;

}


     //아두이노 setup함수내에서 한번호출해줍니다.

void Init()

{

pinMode(m_cTrig, OUTPUT);

pinMode(m_cEcho, INPUT);

}


//장애물과의 거리를 센티미터로 구함

float GetDistance() {return GetDistanceOne();}

float GetDistanceMulti()

{

//5회 센서값 읽기를 시도해서, 최소, 최대값을 제한 나머지값의 평균을 구함


float dist[5];

float fMin = 1000.0f;

float fMax = -1000.0f;


for (int i = 0;i < 5; ++i)

{

dist[i] = GetDistanceOne();


if (fMin > dist[i])

fMin = dist[i];


if (fMax < dist[i])

fMax = dist[i];

}

float fAvr = 0.0f;

bool bMin = true;

bool bMax = true;


for (int i = 0;i < 5; ++i)

{

if (bMin && dist[i] == fMin)

{

bMin = false;

continue;

}


if (bMax && dist[i] == fMax)

{

bMax = false;

continue;

}


fAvr += dist[i];

}


return fAvr * (1.0f / 3.0f);

}


    //cm단위로 거리 측정

float GetDistanceOne()

{

digitalWrite(m_cTrig, LOW);

delayMicroseconds(2);

digitalWrite(m_cTrig, HIGH);

delayMicroseconds(5);

digitalWrite(m_cTrig, LOW);


long lp = pulseIn(m_cEcho, HIGH, 11600);


return (float)lp/29.0f/2.0f;

}

};


 



소스 사용법은 대략 아래처럼합니다.


#define TRIG_PIN 4

#define ECHO_PIN 5


CSonicSensorMng g_SonicSensor(TRIG_PIN, ECHO_PIN);


void setup()

{

Serial.begin(9600);

g_SonicSensor.Init(); //초음파 센서와 연결된 핀의 입출력 관련 초기화를 합니다.

}


void loop()

{

float fDistance = g_SonicSensor.GetDistance();

Serial.print("distance = ");

Serial.print(fDistance, 2);

Serial.println("cm");

delay(300);

}

'아두이노' 카테고리의 다른 글

아두이노 visual studio 연동  (0) 2015.05.16
아두이노 tone()함수  (0) 2015.05.12
digitalRead() 함수  (0) 2015.05.10
아두이노 digitalWrite() 함수  (0) 2015.05.10
아두이노 나노  (0) 2015.05.07
posted by 래머
prev 1 2 3 next