지난번 arduino 전압계에 이어 요번엔 자전거용 속도계를 만들어봤습니다.
회로는 전압계와 비슷합니다. 전압계는 아날로그 입력을 사용했고, 속도계는 디지털입력을 사용한다는 차이뿐
하지만 프로그램은 약간더 복잡하지요.
[플러그하우스판매]아두이노 두에밀라노브 1개
TRIMMER(가변저항) WIW1036(3323 Series)-10KΩ 1개 |
속도를 측정하기 위해서 한바퀴 회전하는데 걸리는 시간을 측정했습니다.
일반적으로 판매되는 자전거용 속도계와 원리는 같습니다.
자석 스위치를 앞바퀴 프레임에 붙이고 자석은 바퀴살에 붙였습니다. 자석이 스위치옆을 지날때마다 스위치가 단락됩니다.
자석 스위치는 위와 같이 생겼습니다. 표면이 유리인데 납땜하고 약간 비틀었더니 부서져 버려서 하나는 망가져 버렸습니다.
자석을 스위치 근처로 가져가면 스위치가 단락됩니다.
검은색 전기 테이프로 대충 고정했습니다. 프레임에 스위치의 간격조절도 테이프를 대충 말아서 높이를 줬습니다.
고정도 대충하고 자석
바퀴살에 붙어있는것이 nd 자석이라불리는 지름 10mm짜리 네오디움자석을 테이프로 고정해서 붙였습니다.
자석과 스위치의 간격은 약 1cm 정도 되는데 동작은 잘하네요.
스위치의 선은 브레이크 라인을 타고 올라와 아르두이노가 있는 빵판에 연결됩니다.
왼쪽은 LCD모듈 오른쪽은 9v 배터리, 아래로 아르두이노가 있네요.
자전거에 장착은 검정테이프 하나가 다입니다. 떨어질까봐 조마 조마 ^^;
자전거를 살짝 움직여보니 시속5km라고 찍혔네요. 옆에 RPS는 초당 앞바퀴 회전수....나중에 페달 회전수가 들어가야 하는데,
스위치를 하나 망가트리는 바람에 바퀴 회전수가 들어갔습니다.
천천히 가니 10km는 그냥 나오더군요. 한강을 살짝 달려보았습니다. 최고 속도 32km 나오더군요.
대충 맞는거 같기도 하고....어차피 숫자 계산이니 틀리면 고치면 되겠죠.
다음에 gps를 가져가서 속도를 비교해봐야겠네요. 그때까지 분해가 안된다면....ㅋㅋㅋ
자전거를 멈췄을때 속도가 0이 안되는 문제 -> 스위치가 on 됐을때만 속도를 계산하기 때문
페달 회정수 측정 -> 스위치 구입
외관 디자인 자전거고정 -> OTL
바퀴둘레 = 26인치 * 25.4 * 3.14 = 2074 mm = 2.074 m = 0.002074 km
속도(시속) -> 한바퀴회전시간(ms) : 0.002074 km(바퀴둘레) = 1000ms * 60 * 60 (1시간) : 1시간동안 이동거리
속도(km/h) = 7466.4 / 한바퀴회전시간(ms)
#include <stdio.h>
#include <LiquidCrystal_pepsiman.h>
// LiquidCrystal display with:
// rs. rw, e, d4, d5, d6, d7 - LCD pin name
// 4, 5, 6, 11, 12, 13, 14 - LCD pin #
LiquidCrystal lcd(2,3,4, 8,9,10,11); // arduino pin #
char buf[33]={0};
unsigned long time, oldtime, delta;
float spd=0;
int ledpin = 13, swpin=12, swval=0, oldswval=0;
void setup()
{
Serial.begin(9600);
pinMode(ledpin, OUTPUT);
pinMode(swpin, INPUT);
lcd.clear();
lcd.print("hello, world!.............");
}
void loop()
{
swval = digitalRead(swpin);
if (oldswval == LOW && swval == HIGH)
{
time = millis();
delta = millis() - oldtime;
//26" * 25.4 * 3.141592 = 2.074m, 0.002174 km;
// * 3600 = 7446.4 km/s
spd = 7466.4 / (float)delta;
sprintf(buf, "SPD %3ld RPS %4ld", (long)spd, (long)(1.0 / (float)delta * 1000.0));
Serial.println(buf);
lcd.clear();
lcd.print(buf);
oldtime = time;
digitalWrite(ledpin, HIGH);
delay(20);
}
digitalWrite(ledpin, LOW);
oldswval = swval;
}
2009/04/20 - arduino에서 LCD 구동하기 (미해결)
2009/04/23 - arduino 에서 LCD 구동하기 2
'Arduino/AVR > 2. Arduino프로젝트' 카테고리의 다른 글
아두이노를 인터넷에 연결해보자 - arduino ethernet shield 호환모듈 WIZ811MJ (1) | 2009.06.08 |
---|---|
아두이노(arduino)를 이용한 도트매트릭스(dotmatrix 8x8 2색) (15) | 2009.06.03 |
arduino 전압계 (0) | 2009.05.04 |
arduino 에서 LCD 구동하기 2 (4) | 2009.04.23 |
arduino에서 LCD 구동하기 (미해결) (0) | 2009.04.20 |