본문 바로가기
Arduino/AVR/2. Arduino프로젝트

아두이노(arduino)를 이용한 자전거 속도계

by pepsiman 2009. 5. 10.
LCD를 연결하고나니 활용방안이 많네요.
지난번 arduino 전압계에 이어 요번엔 자전거용 속도계를 만들어봤습니다.

회로는 전압계와 비슷합니다. 전압계는 아날로그 입력을 사용했고, 속도계는 디지털입력을 사용한다는 차이뿐
하지만 프로그램은 약간더 복잡하지요.

사용부품

[플러그하우스판매]아두이노 두에밀라노브 1개
usb케이블 1개
[디바이스마트]점퍼와이어 (피복 안에 선이 하나로 된 전선) 1m 이상
캐릭터LCD 16x2 14핀(또는 16핀 - 백라이트지원) 1개
핀헤더 Single 1x40Pin Straight(2.54mm) 1개
ND자석 (네오디움) 10pi x 2T 1개
리드스위치 PMC1001 1개
(* 리드스위치는 잘 망가지니 여분으로 하나 정도는 더 구입하시길)
9v 배터리스넵  Snap.I-3(for 9V)  1개
dc 플러그 2.5pi 1개
브레드보드 WBU-D, WBU-T 각 1개
저항 10K옴 1개
TRIMMER(가변저항) WIW1036(3323 Series)-10KΩ 1개

기타 [디바이스마트 또는 동네 전파사]
인두 1개
실납 1개
니퍼 1개
전연 테이프 1개


자전거에 장착해야 하기 때문에 좀더 튼튼하게(?) 고정했습니다. 고무줄로...^^;;



속도를 측정하기 위해서 한바퀴 회전하는데 걸리는 시간을 측정했습니다.
일반적으로 판매되는 자전거용 속도계와 원리는 같습니다.
자석 스위치를 앞바퀴 프레임에 붙이고 자석은 바퀴살에 붙였습니다. 자석이 스위치옆을 지날때마다 스위치가 단락됩니다.

자석 스위치는 위와 같이 생겼습니다. 표면이 유리인데 납땜하고 약간 비틀었더니 부서져 버려서 하나는 망가져 버렸습니다.
자석을 스위치 근처로 가져가면 스위치가 단락됩니다.

검은색 전기 테이프로 대충 고정했습니다. 프레임에 스위치의 간격조절도 테이프를 대충 말아서 높이를 줬습니다.

고정도 대충하고 자석

바퀴살에 붙어있는것이 nd 자석이라불리는 지름 10mm짜리 네오디움자석을 테이프로 고정해서 붙였습니다.

자석과 스위치의 간격은 약 1cm 정도 되는데 동작은 잘하네요.
스위치의 선은 브레이크 라인을 타고 올라와 아르두이노가 있는 빵판에 연결됩니다.

왼쪽은 LCD모듈 오른쪽은 9v 배터리, 아래로 아르두이노가 있네요.
자전거에 장착은 검정테이프 하나가 다입니다. 떨어질까봐 조마 조마 ^^;
자전거를 살짝 움직여보니 시속5km라고 찍혔네요. 옆에 RPS는 초당 앞바퀴 회전수....나중에 페달 회전수가 들어가야 하는데,
스위치를 하나 망가트리는 바람에 바퀴 회전수가 들어갔습니다.

 천천히 가니 10km는 그냥 나오더군요. 한강을 살짝 달려보았습니다. 최고 속도 32km 나오더군요.
대충 맞는거 같기도 하고....어차피 숫자 계산이니 틀리면 고치면 되겠죠.
다음에 gps를 가져가서 속도를 비교해봐야겠네요. 그때까지 분해가 안된다면....ㅋㅋㅋ

To Do
자전거를 멈췄을때 속도가 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)


두번째 압축 파일은 아두이노 개발툴 설치 폴더의 hardware\libraries\LiquidCrystal_pepsiman 폴더에 압축을 풀어주세요.
(이 파일은 플러그 하우스LCD용 파일입니다. 다른 LCD는 Arduino 사이트의 LiquidCrystal 라이브러리를 사용하세요)
소스코드
#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;
}


추가) 회로에 대한 문의가 있어서 추가 합니다.

솔찍히 회로 라고 할만한게 없습니다 ^^;
리드 스위치를 아두이노의 12번 핀에 연결하면 끝입니다.(하나는 GND, 하나는 아두이노의 D12)

추가) 전원(베터리)에 대한 문의가 있어서 추가합니다.

아두이노는 기본적으로 아답터 단자로 들어오는 7~12v 전압을 5v로 바꿔주는 레귤레이터를 내장하고 있습니다.
따라서 9v전지용 스넵단자와 아답터 단자를 구입해서 선으로 연결해 주기만하면 
아답터 단자로 9v전지를 연결해 아두이노의 전원으로 사용할 수 있습니다.