반응형

가끔 아니 어쩌면 자주 3D 공간안에서 물체의 위치를 지정할때 이 물체가 저쪽에 닿는 면에 딱 위치하고 싶은데... 할때가 있죠? 

예를 들면 나무나 돌덩이 이런걸 랜덤하게 막 생성한 다음 굴곡진 지형에 모두 딱 안착시키고 싶다거나요.

또는 어떤 물체를 기준으로 어떤 방향으로 뻗어 나갈때 무엇인가 닿는 물체가 있는지 검사하고 싶을때도 있지요.

이때 사용되는 개체가 바로 Ray 입니다.

실제로 Ray를 알기 전과 알고난 뒤는 정말 다른 세계라고 할수 있겠습니다.

 

자 오늘은 Ray 에 대하여 알아보도록 하겠습니다.

3D 는 정말 놀라울 정도로 기하학적인 수학의 결정체라 할 수 있겠습니다. 이를 구현하기 위하여 정말 얼마만큼의 수학적 노력이 있었는지 상상이 안될 정도 입니다.

오늘은 그 결정체중의 하나인 Ray에 대하여 알아볼텐데요. 3DS MAX 에서 Ray 는 두가지 명령어를 통해 사용됩니다.

intersectRay 와 intersectRayEx, intersectRayScene 이렇게 세가지 입니다. 사용하는 목적에 따라 구분하여 사용하시면 되는데요. 각각은 아래와 같습니다.

  • intersectRay : Ray 와 대상물체를 지정한 뒤 부딧히는 위치를 알아낸다.
  • intersectRayEx : 위와 동일하며 부딪힌 Face 정보와 부딪힌 면의 normal 정보를 돌려준다
  • intersectRayScene : 대상 개체를 지정하지 않고 Scene 내의 어떤 물체든 부딪힌 정보를 돌려준다. (느림)

사용하는 방법은 간단한데요, 먼저 Ray 를 생성해주고 필요하면 Ray의 출발 위치(pos)와 방향(dir)을 변경할 수 있습니다.

myRay = ray [0,0,0] [0,0,-1]

ray 를 생성하는 구문 인데요, [0,0,0] 위치를 출발점으로 하고 [0,0,-1] 을 방향으로 하는 ray 가 만들어 지게 됩니다. [0,0,-1] 이라 하면 z 축을 기준으로 아래쪽을 바라보는 방향이라고 보면 되겠죠? 

 

이렇게 만들어진 Ray를 위의 명령어와 함께 사용해볼까요?

임시로 테스트용 Scene 을 만들어 봄

먼저 위와 같은 Scene 을 만들어서 테스트 해보려 합니다. 노란색 공이 지면에 부딪히는 위치로 이동 시킬거에요. 중간에 네모 박스가 있지만 네모박스는 무시하고 지면에 위치시켜야 한다면 아래와 같이 intersectray 를 이용하여 위치시킬 수 있습니다.

-- ray 를 생성해 준다
myRay = ray [0,0,0] [0,0,-1]

-- 이동시킬 물체를 지정하자
obj = $Sphere001

-- ray 의 출발 위치를 물체의 중심으로 설정해보자
myRay.pos = obj.pos

-- 위치 검출에 사용될 지형을 지정해보자
tern = $terrain_01

-- intersectray 를 이용하여 지형과 부딪히는 위치를 찾아내자
interResult = intersectray tern myRay

-- 어떤 결과가 나왔는지 print 를 이용해서 살펴보자
print(interResult)

-- 부딪힌 위치에 오브젝트를 위치시키자
obj.pos = interResult.pos

요렇게 하면 어떻게 되냐면요

지면에 정확하게 안착함

요렇게 노란 공이 지면에 달라 붙게 됩니다. 코드에 주석을 달아 놓았으니 따로 설명은 안드려도 될 것 같은데요. 한가지만 설명해 드리자면 intersectray의 결과값을 보면 (ray [-1.62331,11.1008,1.22501] [-0.407511,-0.107746,0.906822]) 요런 식으로 ray 의 형식으로 결과가 나옵니다. ray 는 pos 와 dir 의 속성이 있지 않습니까?? 여기서 결과값의 pos 정보가 바로 부딧힌 면의 위치 정보가 됩니다. 그 뒤에 나오는 [-0.407511,-0.107746,0.906822] 는 부딪힌 면의 normal 값으로 만약 공이 부딪힌 다음 튕겨나간다거나 하는 다음 동작이 필요하다면 반드시 필요한 정보이지요.

어쨌든 intersectray 만 보자면 부딪힌 위치와 각도를 ray 의 형태로 돌려준다는 것을 알 수 있었습니다. 특징이라 하면 , 특정 개체를 대상으로 하기 때문에 속도가 매우 빠릅니다. 사실상 성능을 고려하지 않아도 되는 함수죠.

그런데 만약 부딪힌 면이 어디인지 알아야 하고 부딪힌 개체에도 뭔가 추가적인 액션이 필요할 수 있겠습니다. 사람일은 모르는거자나요? 누군가는 저 지형개체에 어떤 face에 물체가 부딪혔는지를 알아야 할수도 있지 않겠습니까? 이 때 intersectrayex 라는 함수를 이용하게 됩니다.

이번에는 intersectray 대신에 intersectrayex 를 사용해 볼 겁니다. 사용방법은 동일하고요. intersectrayEx [node] [ray] 와 같이 사용해 주면 됩니다.

-- intersectray 를 이용하여 지형과 부딪히는 위치를 찾아내자
interResult = intersectrayex tern myRay

-- 어떤 결과가 나왔는지 print 를 이용해서 살펴보자
print(interResult)

-- 결과는? 
#((ray [-1.62331,11.1008,1.22501] [-0.382998,-0.128105,0.914823]), 240, [0.383149,0.282177,0.334673])

아까와는 결과가 조금 다르죠? #(oo,oo,oo) 형태로 나온걸 보면 배열로 결과가 나온걸 알 수 있습니다. 총 3개의 리턴값이 나왔는데요.

  • (ray [-1.62331,11.1008,1.22501] [-0.382998,-0.128105,0.914823])
  • 240
  • [0.383149,0.282177,0.334673]

intersectray 와 마찬가지로 첫번째 결과에는 부딪힌 면의 위치, 방향을 담는 ray 정보가, 두번째에는 어떤 숫자가 나왔고요, 세번째에는 point3 형식으로 좌표가 나왔는데, 딱보니 위에 ray 에 부딪힌 면의 방향이라는 것을 알 수 있겠습니다. 두번째 숫자는 뭐냐고요?

부딪힌 face 의 index 임을 알 수 있다.

바로 부딪힌 mesh 의 face 인덱스 입니다. 240 번이죠? 바로 저부분에 부딪힌 것 입니다. (이번에는 이동은 하지 않았기 때문에..) 만약 동일하게 이동해야 한다면 배열 안의 개체에서 위치 정보를 뽑아내야 하므로 interResult[1].pos 와 같은 방법으로 부딪힌 면의 위치를 가져오면 됩니다.

이런 기능을 이용해서 부딪힌 면의 색상을 바꾸어 준다거나 해당 face를 삭제하는 등의 기능을 넣을 수 있겠지요? 뭐 레이저총에 맞은 face 가 폭파되며 사라지는 등의...  네.. 그럴때 꼭 필요한 훌륭한 명령어 입니다.

참고로 intersectray 나 intersectrayex 는 mesh 오브젝트에서 정확한 정보를 받아 올 수 있습니다. 가끔 기본 primatine 에 modifier 로 edit_poly 같은것을 씌운 경우에는 동작하지 않을 수 있으니 만약 결과값이 undefined 와 같은 값이 나온다면 검출에 사용된 모델링을 mesh 로 변경한 뒤 (convertTomesh obj) 검사를 진행하시면 됩니다.

 

끝으로 intersectRayScene 은 위와는 다르게 Ray 가 어떤 개체에 부딪히는지 알수 없을 때 사용합니다.

모두 동일하고 해당 명령만 intersectRayScene 으로 변경해서 돌려볼까요?

interResult = intersectrayScene myRay

요렇게 말이죠. 이번에는 대상을 특정하지 않기 때문에 함수 뒤에 인자가 ray 개체 하나만 들어갔습니다. 

결과를 볼까요? 

#(#($Editable_Mesh:terrain_01 @ [-4.616531,-2.612816,0.000000], (ray [-1.62331,11.1008,1.22501] [-0.382998,-0.128105,0.914823])), #($Sphere:Sphere001 @ [-1.623309,11.100846,65.260162], (ray [-1.62331,11.1008,61.9389] [0,0,-1])), #($Box:Box001 @ [15.646946,18.567043,19.666662], (ray [-1.62331,11.1008,26.4499] [0,0,1])))

뭔가 무시무시하게 길게 나왔죠?

이녀석도 역시 배열 개체이므로 하나씩 보면 

#($Editable_Mesh:terrain_01 @ [-4.616531,-2.612816,0.000000], (ray [-1.62331,11.1008,1.22501] [-0.382998,-0.128105,0.914823]))
#($Sphere:Sphere001 @ [-1.623309,11.100846,65.260162], (ray [-1.62331,11.1008,61.9389] [0,0,-1]))
#($Box:Box001 @ [15.646946,18.567043,19.666662], (ray [-1.62331,11.1008,26.4499] [0,0,1]))

요렇게 3개의 개체와 부딪혔다는 정보를 돌려준 것을 알 수 있습니다. 심지어는 본인(sphere) 에도 부딪힌 정보를 돌려 받았다는 것을 알 수 있네요 ㄷㄷㄷ. (저걸 원한건 아닌데) 부딪힌 정보를 보면 역시 내부 정보 역시 배열인데요, 첫번째는 부딪힌 대상 개체, 두번째는 부딪힌 위치정보 (ray 속성) 라는걸 알 수 있습니다.

만약 개체에 어떤 특정할만한 속성이 있다면 해당 개체에 물체를 위치 시킬 수 있습니다.

-- ray 를 생성해 준다
myRay = ray [0,0,0] [0,0,-1]

-- 이동시킬 물체를 지정하자
obj = $Sphere001

-- ray 의 출발 위치를 물체의 중심으로 설정해보자
myRay.pos = obj.pos

-- 위치 검출에 사용될 지형을 지정해보자
tern = $terrain_01

-- intersectray 를 이용하여 지형과 부딪히는 위치를 찾아내자
interResult = intersectrayScene myRay

-- 어떤 결과가 나왔는지 print 를 이용해서 살펴보자
print(interResult)

for i = 1 to interResult.count do
(
	testObj = interResult[i][1]
	if (findString testObj.name "Box") != undefined then
	(
		obj.pos = interResult[i][2].pos
	)
)

요렇게요. 

코드에서는 Box 라는 이름을 포함하는 개체를 만나면 해당 개체에 위치하도록 하는 코드 입니다.

이게 사실 한두개일 때는 간단한 이야기 인데 지면에 위치 시켜야 하는 개체가 수십개 ~ 수백개가 되면 일이 커집니다. 그럴때는 스크립트가 필요한 시점인거죠.

예를 들면 이렇게요..

이 많은 공들을 지면에 붙이라고?

 

모두 sphere 라는 이름을 갖고 있기때문에 간단하게 처리할 수 있겠네요. 지면에 닿는 개체는 지면에 닿도록 하고 box 에 닿는 개체는 box 에 위치시키도록 하겠습니다. 

sphere 의 중심을 기준으로 하다보니 약간 파뭍히는 대상이 있었는데요, sphere 의 반지름 만큼 위쪽으로 위치하도록 코드를 짜 보겠습니다.

-- ray 를 생성해 준다
myRay = ray [0,0,0] [0,0,-1]

-- 이름이 sphere 로 시작되는 모든 개체를 변수 objs 에 담자.
objs = execute("$Sphere*")

for obj in objs do
(
	-- 각 sphere 의 중심점으로 ray 의 위치를 지정함
	myRay.pos = obj.pos
	
	-- intersectray 를 이용하여 지형과 부딪히는 위치를 찾아내자
	interResult = intersectrayScene myRay


	for i = 1 to interResult.count do
	(
		testObj = interResult[i][1]
		if (findString testObj.name "Box") != undefined then
		(
			obj.pos = interResult[i][2].pos
			-- 파묻히지 않도록 반지름 만큼 위로 올림
			obj.pos.z += obj.radius
		)
		else if (findString testObj.name "terrain") != undefined then
		(
			--- 부딪힌 정보가 terrain 일때 해당 위치로 이동 시킴 
			obj.pos = interResult[i][2].pos
		-- 파묻히지 않도록 반지름 만큼 위로 올림
			obj.pos.z += obj.radius
		)
	)
)

 

뭐 별거 없죠? 위에서 설명한 것을 반복문만 추가했을 뿐 입니다.

결과는요?

한번에 모두 지면에 안착 성공

요렇게 예쁘게 안착된 것을 확인 할 수 있습니다.

물론 저는 본 기능을 설명 드리기 위해 위와 같은 예제를 들었지만요. 실제 제가 사용하는 함수에는 몇초만에 수천번 이상 위치를 검출하며 ray 가 사용되는 케이스가 허다분 합니다.

저는 주로 자동으로 모델링을 할때 모델링의 위치, 크기, 배치, 부딪힘, 확장 범위 등을 검사할때 사용하는데요, 이런 검사들을 통해 사람이 손을 데지 않고도 아주 정교한 모델링을 할 수 있는 근간이 됩니다.

참고로 intersectRayScene 의 경우 scene 의 모든 개체에 대하여 검사가 이루어지기 때문에 Scene 내에 아주 많은(수만개 이상의) node 들이 자리잡고 있는 경우에는 속도가 매우 느려질 수 있습니다. 그래서 시작 위치를 기준으로 반경내에 들어오는 대상을 먼저 골라낸 다음 속도가 빠른 intersectRay 를 이용하여 각각 부딪힌 위치를 검출하는 방식으로 사용하고 있습니다. 프로그래밍이라는게 그렇자나요. ㅎ 높은 성능과 효율성을 위해 다양하고 창의적인 방법으로 접근해 가는게 바로 프로그래밍의 묘미이지요.

오늘은 이만 마칩니다. 내용이 길어기니 힘드네요 ㅋ

2021.03.24 - [DEV/MAX SCRIPT] - 3DS MAX 스크립트 레퍼런스 (헬프파일) 다운 받기

 

3DS MAX 스크립트 레퍼런스 (헬프파일) 다운 받기

스크립트 초급자든 중급자든 반드시 필요한 것 하나를 꼽으라면 저는 레퍼런스라고 생각합니다. 기존에는 3DS MAX 설치 시에 함께 설치되어 스크립트 작성 창에서 F1 키를 누르면 chm 파일 형식의

diy-dev-design.tistory.com

2021.02.24 - [DEV/MAX SCRIPT] - 3da max script 점과 점 사이의 거리 구하기

 

3da max script 점과 점 사이의 거리 구하기

간단하게 포스팅을 남기려고 합니다. 제목 그대로 버텍스 간 거리 구하기 입니다. 아니 정확히는 두개의 point3 사이의 거리를 구하는 방법을 소개해 드릴까 합니다. 그리고 용용 편으로 두 점사

diy-dev-design.tistory.com

2020.04.29 - [DEV/MAX SCRIPT] - 3DS MAX 스크립트로 개체 선택하기

 

3DS MAX 스크립트로 개체 선택하기

Max Script 를 이용하여 무엇인가를 하려면 필수 요소라고 할 수 있는 것 중의 하나가 개체를 선택하거나 지정하는 방법입니다. 여기서 개체는 3D Scene 안의 오브젝트, 스플라인, 헬퍼 등과 같은 사

diy-dev-design.tistory.com

 

반응형
반응형

딸내미 : "아빠! 할머니 집에서 가져오는 계란은 유정란이야?"

나 : "그럼~. 암탉도 있고 수탉도 있으니 유정란이겠지?"

딸내미 : "그럼 내가 저거 품으면 병아리가 나오는 거야?"

나 : "흠... 아니.... 아마 안될껄..... 쩝."

딸내미 : "아빠아~~~아~~ 나 병아리 나오는거 보고 싶어~~"

 

 

네..

그래서 만들기로 했습니다.

 

직접 만드는 바로 병아리 부화기!

 

시골 처갓집에서 올라오는 동안 대충 머리로 구상을 하고 인터넷을 좀 찾아보며 스펙을 구상해 봅니다.

 

필요한 사양

  • - 37.5 도 정도의 온도를 유지할 것
  • 습도는 60프로이상, 부화 2~3일 전부터는 70프로 이상을 유지할 것

 

간단하네요.

아마 이런식으로 만들면 되지 않을까 하고 딸내미랑 앉아서 구상을 해봤습니다.

그림은제가, 글씨는 딸내미가 쓴 계란 부화기 구상도

대충 감이 오시죠? 할로겐 램프가 열이 많이 나므로 조명 역할도 하고 내부를 덥혀주는 역할을 하며 내부 공기가 균일한 온도를 갖도록 작은 팬으로 공기를 순환 시킵니다. 온도 센서를 이용하여 특정 온도보다 높아지면 램프를 꺼주고, 낮아지면 켜주는 간단한 회로가 되겠네요.

저는 지난번에 구입해 놓은 마이크로비트를 이용하기로 했습니다. 디스플레이가 달려있으므로 현재 온도를 바로 알수 있다는 장점이 있고요, 또 코딩하는 과정을 딸내미에게 보여주며 설명을 해주기 위함입니다. 아무래도 아두이노 보다는 마이크로 비트의 코딩 블럭이 아이들에게는 더 재미있고 쉽겠죠? ㅎ

 

재료준비

필요한 재료를 모아 봅니다.

  • 적당한 크기의 스티로폼 박스
  • 마이크로 비트 (또는 아두이노)
  • 온습도센서 (DHT11)
  • 할로겐 램프
  • 12V 소형 냉각 팬 (공기 순환용)
  • N 채널 MOSFET (그냥 릴레이 사용 가능)
  • 3.3V 정전압 장치 (아두이노 사용할 경우 불필요)
  • 전선들과 12V 아답터

네. 재료들도 심플하네요. 다행히 저는 모두 집에 있는 재료여서 따로 구입은 필요하지 않았고 바로 제작에 들어가기로 했습니다.

적당히 주워모은 재료들 입니다.

먼저 오늘의 주인공

마이크로비트와 온습도 센서 쉴드

몸값도 귀하신 마이크로비트 되시겠고요~

그 다음 선수들은요. 

할로겐 램프, 3.3V 정전압모듈(diy), 스위칭용 mosfet, 12v 팬

네. 마이크로비트에 비하면 하찮기 그지 없는 떨거지 부품들이고요~

 

끝으로 여기서 안쓰이면 쓰레기가 될 스티로폼 상자가 되시겠습니다.

모든 부품 집합!

 

 

제작 시작!

자 먼저 상자 뚜껑에 fan 과 램프를 장착합니다.

원래 설계에는 옆에 fan 을 그려놨는데 할로겐 램프에서 열이 많이 나면 스티로폼이 녹을 것 같아 할로겐 램프의 열을 아래쪽으로 바로 쏴주기로 했습니다.

램프와 팬 장착 완료

적당한 나사로 팬을 고정하고 램프를 터미널에 물려 아이스크림 막대기에  본드로 붙여 박스 뚜껑에 꼽았습니다.

 

다음은 메인 보드 입니다.

12V 전원을 인가 받아 12V 팬을 상시 구동하여 주고, 마이크로 비트에는 3.3V 를 보내주며 중간에 스위치가 마이크로 비트의 제어를 받아 할로겐 램프를 켰다 껐다 할겁니다.

완성된 메인보드

보드를 너무 작게 자른 바람에 땜질이 조금 힘들긴했지만 필요한건 다 넣었네요.

참고로 3.3V 레귤레이터는 마이크로 비트 구동을 위한 것이므로 아두이노를 사용하시면 그냥 12V 를 vcc 에 연결하시면 됩니다. 

그리고 중간에 작은 MOSFET 이 하나 있는데, 마이크로 비트의 신호 1, 0 을 받아 할로겐 램프를 켰다 껏다 하는 스위치 역할을 할겁니다. 그냥 일반적인 릴레이를 사용하셔도 아무 문제 없습니다.

자 그럼 의도한 데로 동작하는지 테스트를 해봤습니다. 물론 아직 온도 제어는 못해봤기에 할로겐램프, 팬, 마이크로비트가 켜지는지 정도만 테스트를 해봤습니다.

각 부품들 , 정상 동작 확인!

 

자 그럼 이제 프로그래밍을 하고 박스에 나머지 부품을 설치해보겠습니다.

 

마이크로 비트를 컴퓨터에 연결하고 아래와 같이 코드를 작성합니다.

코드 작성 완료

뭐 별건 없고요. 먼저 온습도 센서인 DHT11 라이브러리를 넣어주어야 해서 우측 톱니바퀴 -> 확장프로그램 으로 들어가신 뒤에 상단검색창에 DHT11 을 검색하신뒤 나오는 것을 클릭해주면 주황색으로 된 블럭들이 추가된 것을 볼 수 있습니다.

온도와, 습도를 저장하기 위한 변수를 2개 만들었고요, 디스플레이에 한번은 온도, 한번은 습도가 표시되도록 상태를 기록할 변수도 하나 만들었습니다.

현재온도가 -999 같은 이상한 값이 들어오기도 하여서 0 보다 클때만 동작하도록 했고요, 온도가 37도보다 낮으면 램프를 켜주고 38도 보다 높으면 램프를 끄도록 해 놨습니다.

위에서 말했지만 저의 경우 P0 핀을 MOSFET 에 연결하여 램프를 켜고 끌껀데요, 릴레이 쉴드 같은걸 이용해서 만드셔도 무방합니다. 다만 릴레이의 딱딱 거리는 소리가 듣고 싶지 않아 MOSFET을 사용했다고 보시면 됩니다.

간단하죠??

아직 헷갈리시는 분을 위해 간단히 구성도를 다시 올려보겠습니다.

병아리부화기 micro:bit 구성도

 

자 이제 코딩도 완료 되었고 박스에 설치를 해보겠습니다.

마이크로 비트의 온도가 항상 잘 보이도록 상다 위에 꼽아 주고요, 각종 선들을 구멍을 뚫어 연결합니다.

그리고 옆쪽에 내부가 보이도록 창을 크게 내고 안쪽과 바깥쪽에 각각 투명 시트를 붙여서 단열을 해주었습니다.

내부에는 계란 판을 잘라서 한번에 8개를 넣을 수 있도록 해주었고 종지를 하나 넣어 물을 담아 놓았습니다.

그 결과는~

두구두구

 

병아리 부화기 완성

 

쨔잔~ ㅋ

딸내미가 꾸며 준다고 이것 저것 하고 있습니다. ㅋㅋㅋ

온도도 프로그래밍 한데로 잘 동작하는 것 같습니다. 습도도 60프로 이상 잘 올라가네요.

다음에 처갓집에 갈때 가져가서 금방 낳은 신선한 계란을 담아가지고 올라오면 될것 같네요. 어짜피 12V 로 동작하므로 차량의 트렁크에 넣어서 시거잭에 연결하면 올라오는 동안도 잘 부화가 진행될거라 생각합니다.

 

취미생활을 즐기는 것은 매우 즐거운 일인데요, 아이와 함께 하는 취미생활은 더욱 즐거운 것 같습니다.

여러분들도 자녀들과 계란부화기 어떠세요? ㅋ

마트에서 유정란을 구입해서 넣어도 절반 정도는 부화가 된다고 하네요? ㅋ

한번 재미삼아 시도해 보셔도 좋을 것 같습니다.

자 그럼 오늘의 포스트는 이만~

 

다음에 부화기에서 병아리가 나오면 다시 포스팅 하겠습니다.

2022.10.28 - [DIY/micro:bit] - [DIY] 직접만든 부화기로 병아리 부화시키기

 

[DIY] 직접만든 부화기로 병아리 부화시키기

딸내미랑 만들었던 병아리 부화기! 과연 동작할까? 시골에 있는 처갓집에서 돌아오는 길에 닭장에 들러 방금 낳았는지 아직 온기가 남아있는 청계란을 하나 들고 왔습니다. 딸아이가 두시간가

diy-dev-design.tistory.com

 

2021.09.26 - [DIY/micro:bit] - [마이크로비트] 시작해보자. micro bit (마이크로비트)

 

[마이크로비트] 시작해보자. micro bit (마이크로비트)

요즘 학생들도 코딩교육이 한창인지 저희 아들도 학교에서 코딩 교육을 진행하다고 하기에 어떤 걸로 배우는가 물어봤습니다. 아들 : 마이크로비트, BBC 에서 만든거래. 저: ??? 네. 아두이노만 알

diy-dev-design.tistory.com

2021.02.06 - [DIY] - [DIY]닌텐도 스위치 - 조이콘 조이스틱 교체하기 #초보용#간단수리

 

[DIY]닌텐도 스위치 - 조이콘 조이스틱 교체하기 #초보용#간단수리

지난 크리스마스에 아이들 선물로 스위치를 사주었습니다. 아이들은 흥분했고 이틀만에 대리석 바닥에 LCD 쪽으로 정확히 떨어지는 모습을 슬로우 비디오처럼 바라본 저역시 흥분했습니다. -_-;;

diy-dev-design.tistory.com

2020.10.28 - [DIY/Arduino] - 아두이노로 아이방 스탠드 개조하기 - 자동 꺼짐 기능

 

아두이노로 아이방 스탠드 개조하기 - 자동 꺼짐 기능

아이가 유치원에서 너무나 예쁜 스탠드를 만들어 왔습니다.. AAA 건전지가 들어가는 예쁜 스탠드. 스텐드 옆면에 예쁘게 그림을 그려서 본인이 자는 방에 가져다 두고는 "오늘부터 얘가 나를 지

diy-dev-design.tistory.com

2019.10.13 - [DIY] - [DIY] 아이방 수면등 만들기 (feat. 아이그림)

 

[DIY] 아이방 수면등 만들기 (feat. 아이그림)

아이들은 창의적이다. 시키지도 않았던 생각치도 않았던 아무 많은 그림을 시도 때도 없이 시간과 장소 불문, 심지어는 종이를 불문하고 마구마구 그려댄다. 그래서 A4 용지를 내주었더니 그럴

diy-dev-design.tistory.com

 

반응형
반응형

고장난 블루투스 스피커 고쳐드립니다~

라고 광고를 한것도 아닌데.. 지인이 스피커가 고장났다며 대뜸 고쳐줄 수 있냐고 물건을 보내왔습니다. 유명한 브랜드인지는 모르겠는데 ssaper 라는 브랜드네요. 

 

요렇게 생긴 녀석입니다.

 

어쨌든 충전이 되지 않는다며 고칠수 있냐고 하는데.. 제가 뭐 무슨 전파사 (?) 기사님도 아니고 대뜸 고장났으니 고쳐 달라고 하면 그게 다 고쳐 질리도 없고요...

그래서 이야기 했습니다.

"네. 고쳐볼께요."

 

뭥미

 

전해 들은데로 뒷면에 USB 충전 단자에 케이블을 연결해도 뭐 반응이 없네요.

그간의 경험들을 비추어 볼때 이건 모다?

배터리가 완전 방전되었다? 아니면 케이블이 단선되었다?

이거 둘중에 하나라고 생각했습니다.

 

그래서 뒷판을 열고 배터리의 전압을 체크해보았더니 아니나 다를까? 저압이 전혀 찍히지 않는 것이 아니겠습니까? 딱보니 18650에 보호회로가 붙어있는데.. 아마 보호회로가 최저 전압 아래로 내려갔기 때문에 차단을 시킨것 같네요.

배터리를 꺼내서 강제로 전원을 연결해서 동작 전압까지 전압을 올려보았습니다. 한 3.2V 까지 올리니 스피커가 켜지더군요. 

후후훗

이걸로 다 고친건가?

 

조립을 하고 켜보니 잘 켜지네요. 역쉬~

 

그런데

 

잠시후에 배터리가 부족하여 잠시후 전원을 끈다네요?

얼른 충전 케이블을 연결 했지만 반응은 역시 없었고 전원이 곧 꺼졌습니다.

 

이런... 처음부터 충전이 안되는게 문제였는데... 

 

제품의 뒷면

 

충격 흡수용 고무를 떼어내고

나사 4개를 풀어주면 뒷판 뚜껑이 열립니다.

 

배터리 보호 필름이 벗겨진건 아까 전에 강제로 충전을 하느라고... 쿨럭

결국 다시 열었습니다.

자세히 살펴보니 USB 포트와 회로 기판이 영 불안하게 붙어있는것이 보이네요.

빨간 동그라미 부분이 떨어진 듯 보인다

보통 충전할때 케이블을 위아래로 제껴보다 보면 안되던 충전이 되는경우가 있지 않습니까? 이게 보니 회로기판과 충전 포트의 납땜이 살짝 떨어져서 그런거였더라고요. 이번에는 확실히 떨여져있는게 보이네요.

그동안 마구잡이로 충전선을 막 꺽인체로 사용하거나 한게 피로가 누적되어서 납땜된 부분이 떨어져 나간듯 합니다.

 

뭐 이게 정답인지는 모르겠지만 대충 감이 옵니다. 이부분만 제대로 땜질이 되면 정상 동작할 것 같은 느낌이 옵니다.

(사실 다른 부분이 문제이면 고치지도 못합니다)

 

워낙 작은 핀들이 있기에 심혈을 기울여 납땜을 시도합니다.

5개의 핀중 양쪽 두개만 중요한 핀 입니다. 나머지는 사용되는지도 모르겠네요.

 

자 일단 땜질을 완료 하였습니다. 확실히 이전과 차이가 있죠? 각 핀들이 기판에 잘 붙어 있는 것처럼 보입니다.

 

이제 충전이 되는지가 관건이네요.

쨔잔~ ㅋㅋ

불이 들어오고 충전이 되기 시작합니다.

배터리가 한번 저전압으로 떨어진 적이 있으니 좀 불안한 감이 있기는 하지만 돈받고 고쳐주는 것도 아니고 제가 뭐 멀쩡한 배터리를 쌓아놓고 있는 것도 아니어서 일단은 이 상태로 주인에게 보냈습니다.

 

몇 시간씩은 사용하지 못하겠지만 당장 사용하는데에는 무리가 없을 것 같습니다.

 

자. 

결론은 .

역시 전자제품의 고장은 선이 끊어 지거나, 연결된 부분이 떨어지는게 고작이다~ 이겁니다.

생각보다 문제의 해결방법이 멀리 있지 않으니 이 포스트를 보시는 분들도 앞으로 뭔가 고장이 나면 대뜸 버리고 새걸로 사시지 마시고 고쳐서 사용하는 것도 한번 고려해 보심이 어떨까 하는 생각입니다.

무엇인가를 고친다는 것, 생각보다 즐거운 일입니다.

그럼 이만 마치겠습니다.

 

2022.05.21 - [DIY/micro:bit] - [DIY] micro:bit - 병아리 부화기 만들어 보기 (초딩도 가능)

 

[DIY] micro:bit - 병아리 부화기 만들어 보기 (초딩도 가능)

딸내미 : "아빠! 할머니 집에서 가져오는 계란은 유정란이야?" 나 : "그럼~. 암탉도 있고 수탉도 있으니 유정란이겠지?" 딸내미 : "그럼 내가 저거 품으면 병아리가 나오는 거야?" 나 : "흠... 아니....

diy-dev-design.tistory.com

2020.06.29 - [DIY] - [repair]피스넷 하이엔드 고장 수리기 - 빨간불 깜빡깜박

 

[repair]피스넷 하이엔드 고장 수리기 - 빨간불 깜빡깜박

이놈의 블루투스 스피커가 애물단지네요. 막상 소리가 좋아 어디 야외에 나갈때나 집에서도 컴퓨터 스피커보다는 훨씬 음악듣기 좋은 피스넷 하이엔드. 또 고장이네요. 오늘은 충전기를 꼽으면

diy-dev-design.tistory.com

 

2020.05.17 - [DIY] - [재활용] 고장난 LED 바 수리하기 > 화장대 조명 만들기

 

[재활용] 고장난 LED 바 수리하기 > 화장대 조명 만들기

저의 보물창고 바로 폐 배터리, 형광등 수거함 입니다. 지나는 길에 기웃거려 보니 LED 바가 버려진게 있더군요. LED 바 금액 자체가 비싼건 아니지만 사실 일부러 돈주고 살만큼 효과적인 조명기

diy-dev-design.tistory.com

 

2020.03.10 - [DIY] - [수리기] 닌텐도 Wii 리모컨 고장 수리. #간단 #초보 가능

 

[수리기] 닌텐도 Wii 리모컨 고장 수리. #간단 #초보 가능

저희 집에 단연 없어서는 안될 1순위 가전 제품중의 하나가 바로 닌텐도 Wii 입니다. 아이들이 게임을 하는 동안도 몸을 사용하며 게임 자체보다는 가족들이나 친구들과 많은 이야기를 나누고 웃

diy-dev-design.tistory.com

 

2022.03.26 - [DIY] - [DIY]고장난 무민양품 USB 탁상용 선풍기 수리하기

 

[DIY]고장난 무민양품 USB 탁상용 선풍기 수리하기

사무실을 이사하다보면 각 종 쓰레기가 쏟아져 나오는데 간혹 쓸만한 것들이 나오는 경우가 있습니다. 오호~ 이건 무민 양품의 USB 선풍기! 뭐 고장 났으니 버렸겠지 싶어 지나쳐 가다가 ... 고치

diy-dev-design.tistory.com

 

2022.03.20 - [DIY] - [DIY]냉동실 문앞에 물이 고여있다? 냉동실 수리기

 

[DIY]냉동실 문앞에 물이 고여있다? 냉동실 수리기

결혼하면서 산 냉장고. 무려 15년 이넘는 시간을 잘 사용하고 있는 LG 디오스 냉장고. 가전은 역시 LG 인가 싶었는데... 냉동실 문앞에 물이 고여 있는 것이 발견되었습니다. 냉동실에 문제가 생긴

diy-dev-design.tistory.com

 

 

반응형
반응형

사무실을 이사하다보면 각 종 쓰레기가 쏟아져 나오는데 간혹 쓸만한 것들이 나오는 경우가 있습니다.

오호~ 이건 무민 양품의 USB 선풍기!

 

뭐 고장 났으니 버렸겠지 싶어 지나쳐 가다가 ... 고치면 되지. ㅋ

 

바로 집어 들었죠.

요즘은 신형이 나온것 같지만 뭐 선풍기가 신형이고 구형이 무슨 상관이 있던가요. 바람만 잘 나오면 됩니다.

 

전원을 연결 해보니 뒤쪽 팬이 돌지 않았고 회전 기능도 동작하지 않았습니다.

음.. 일단 분해해 본 결과 내부 구조는 너무나 간단한 회로로 구성되어 있어 딱히 고장날 곳이 없었고 단선된 곳도 없었으며 각 모터에 전원을 인가 해본 결과 마부치 모터가 수명이 다한 것 같아 모터만 갈아주면 될 것 같았습니다

 

알리에서 동일한 규격의 모터를 구매합니다.

쇼핑은 즐거운 것~

모터 규격은 마부치 14415 모터

 

5개 묶음으로 파는게 있길레 1만원 안쪽으로 구입을 했다. 2개는 수리에 사용하고 나머지는 뭐 쓸데가 있겠지.

약 한달여의 시간이 지나 모터가 도착했습니다.

음.. 뭔가 중고스러운 느낌이 있지만 동작만 잘되면 .. 뭐 .. . 찝찝

 

수리에 필요한 부품과 도구들

어쨌든 이제 수리를 위해 선풍기를 분해 해 봅니다.

 

뒤쪽 커버 분리

먼저 뒤쪽 커버는 반시계 방향으로 손으로 잡고 돌리면 딸깍 하면서 분리가 되게 됩니다.

 

그 다음 바닥 중앙의 나사를 풀어 줍니다.

바닥면 회전 기어 부분

그럼 바닥면이 분리가 되는데요, 동그라미 친 곳에 걸림 부분을 밀어 넣으며 바닥판을 제껴서 분리하면 됩니다. 물론 반대쪽도 걸리는 부분이 있으니 반대쪽도 걸리는 부분을 안쪽으로 밀면서 빼면 됩니다.

밀어내서 빠지게 된 상태

이때 4개의 동그란 플라스틱 부품(아마 회전시 베어링 역할을 하는 듯)을 잃어 버리지 않도록 주의 합니다. 고정 장치 같은게 없어 툭 하고 떨어져 잃어 버릴 수 있습니다.

 

다음은 뒤쪽 선풍기 날을 분리 합니다. 분리는 그냥 손으로 잡고 빼면 빠집니다.

뒤쪽 본체 중앙 부분에 구멍이 있는데 이 부분에 나사가 꼽혀있으니 풀어주시고요, 해당 나사를 분리하면 선풍기 본체의 앞부분 커버도 분리가 됩니다.

 

전면 커버가 분리된 상태

전면 팬도 손으로 당기면 쑥 빠집니다.

 

본체 수리를 위하여 양쪽의 두개의 나사를 풀어주자

그런 다음 사진에 표시된 위치에 있는 전면의 선풍기 모터 좌우로 나사를 풀어주면 본체 내부 몸통이 앞뒤로 분리 됩니다. 

총 4개의 나사를 풀어주면 본체가 완전히 분리가 되는 것이죠.

수리를 위하여 모든 커버를 분해한 상태

아래 쪽에 회전을 담당하는 모터가 있고 위쪽에 앞뒤로 모터가 있는데 모두 동일한 규격의 모터 입니다. 제가 5개를 산 이유를 아시겠죠? 나중에 이중에 다른 하나가 고장난다고 하더라도 여분의 모터로 교체를 해 주면 됩니다.

 

반응형

 

먼저 아래쪽에 회전을 담당하는 모터를 교체해 봅니다.

납때땜되어 있는 부분을 떼어낸뒤 모터만 교체하자

회전 용 기어 부품 안쪽에 뭉치를 살살 제껴서 젖힌 다음 납땜 되어 있는 선을 떼어 냅니다.

그리고 모터를 고정하고 있는 나사 2개를 풀어주고 살살 기어가 망가지지 않게 모터를 빼내면 모터 분리가 됩니다.

 

기존 모터에 끼워져 있는 웜 기어를 빼서 새로운 모터에 장착합니다.

모터 중심 축에 웜기어를 빼내야 하는데요, 플라스틱 기어다 보니까 그냥 빼면 쑥 빠집니다. 손으로 꼭 잡고 빼면 됩니다.

이제 새로 구입한 모터에 웜기어를 장착 해주고 원위치 시킨다음 나사 2개를 끼워 모터를 고정합니다.

 

+ - 에 맞게 다시 선을 인두로 납을 녹여 붙여주면 끝.

 

모터가 잘 도는지 확인한 뒤에 위쪽 후면 선풍기 용 모터도 동일한 방법으로 교체를 해 줍니다.

간단하군요.

 

조립은 분해의 역순으로 해주면 되겠죠.

선들이 몸체에 끼이지 않게 살살 맞춰가며 다시 조립하면 됩니다. 

상단 양쪽 나사를 끼운 뒤 선풍기 앞 날개를 달아주고, 전면 커버를 덮은 뒤 뒤쪽 나사를 끼워줍니다. 

마지막으로 바닥면을 조립해 줍니다.

바닥면 기어 및 부품

바닥면은 위 사진처럼 세팅해 놓은 뒤 덮개를 덮고 나사를 조이면 됩니다.

 

수리가 끝났네요.

동작이 잘 되는지 볼까요? 

 

참쉽죠?

 

네 이렇게 해서 또하나 수리를 완료 하였습니다.

무민양품 제품은 저렴한 편은 아니지만 디자인도 예쁘고 오래 사용해도 질리지 않는 그런 제품입니다. 저도 하나 구입할까 했었는데 가격이 만만치 않아 미루던 차에 잘 되었네요.

고장나면 바로 버리는 그런 시대에 살고 있지만 한번쯤 살펴보고 간단하게 고칠 수 있다면 고쳐서 사용하면 더 좋지 않을까 생각을 해봅니다.

 

 

아 그리고.. 여담인데요, 저 선풍기가 기본적으로 모터 2개를 동시에 사용하기 때문에 전력 사용이 많을 것이라 생각했는데요, 외장 배터리 하나로도 밤새 동작이 될 만큼 전기를 적게 사용하더군요.

실제로 모터에 1.5v 건전지 하나만 연결해도 모터가 동작이 되는 신기한 놈이네요.

여분의 모터가 있으니 어디 다른데 쓸데가 있는지 한번 고민해 봐야겠습니다.

 

2023.02.12 - [DIY] - [DIY] D 형 건전지 변환 홀더 만들기 - 3D print

 

[DIY] D 형 건전지 변환 홀더 만들기 - 3D print

도대체 왜 D 형 건전지 같은 무시무시하고 쓰잘데기 없는 것 같은 크기의 배터리를 만든걸까? 물론 망간 건전지 시절에는 장시간 사용해야 하는 기구에 많은 전력을 담아야 하면 물리적으로 건

diy-dev-design.tistory.com

2022.03.20 - [DIY] - [DIY]냉동실 문앞에 물이 고여있다? 냉동실 수리기

 

[DIY]냉동실 문앞에 물이 고여있다? 냉동실 수리기

결혼하면서 산 냉장고. 무려 15년 이넘는 시간을 잘 사용하고 있는 LG 디오스 냉장고. 가전은 역시 LG 인가 싶었는데... 냉동실 문앞에 물이 고여 있는 것이 발견되었습니다. 냉동실에 문제가 생긴

diy-dev-design.tistory.com

2021.10.18 - [DIY] - [DIY] 지역난방 보일러 분배기에서 '딱딱' 소리나는 문제 해결 방법

 

[DIY] 지역난방 보일러 분배기에서 '딱딱' 소리나는 문제 해결 방법

갑자기 다가온 한파로 모두가 깜짝 놀라 롱패딩을 꺼내 입은 어제 였습니다. 인터넷 커뮤니티에서는 이것이 'K-날씨' 라며 한국의 기온 변화에 대해 우스개 소리를 할 정도였습니다. 저희집도 아

diy-dev-design.tistory.com

2022.01.25 - [DIY/RC] - 20년된 엔진 RC 카 전동화 해보자 [kyosho inferno]

 

20년된 엔진 RC 카 전동화 해보자 [kyosho inferno]

당근에 RC 키워드를 올려놓은지 어언 2년! 드디어 대물이 물었습니다. 무려 kyosho inferno 라는 1/8 버기와 traxxas slash 2wd 차량 두대가 3만원이라는 놀라운 금액에 올라온 것이죠. 바로 챔질하고 get! 와

diy-dev-design.tistory.com

2021.02.06 - [DIY] - [DIY]닌텐도 스위치 - 조이콘 조이스틱 교체하기 #초보용#간단수리

 

[DIY]닌텐도 스위치 - 조이콘 조이스틱 교체하기 #초보용#간단수리

지난 크리스마스에 아이들 선물로 스위치를 사주었습니다. 아이들은 흥분했고 이틀만에 대리석 바닥에 LCD 쪽으로 정확히 떨어지는 모습을 슬로우 비디오처럼 바라본 저역시 흥분했습니다. -_-;;

diy-dev-design.tistory.com

 

반응형
반응형

결혼하면서 산 냉장고.

무려 15년 이넘는 시간을 잘 사용하고 있는 LG 디오스 냉장고.

가전은 역시 LG 인가 싶었는데... 냉동실 문앞에 물이 고여 있는 것이 발견되었습니다. 

냉동실에서 물이 흘러 나왔다

냉동실에 문제가 생긴건 아닐까 하여 살펴 보았지만 냉동실 내에 넣어 둔 식품들은 별다른 문제 없이 꽁꽁 잘 얼어 있더군요. 

어쨌거나 찝찝하기 그지 없어 잘 살펴 보니 바닥쪽에 물이 고여 얼어있었습니다.

아마 그쪽에서 흘러 나온듯 하여 문제를 해결해보기로 합니다.

 

먼저 김치 냉장고를 냉동 모드로 변경한 뒤 냉동실에 있는 것들을 모조리 옮겨놓고 냉장고 전원을 내립니다.

내부를 모두 비운 냉동실

우선 냉동실 내부의 서랍과 선반들을 모두 분리해 냅니다.

그런 다음 뒤쪽 덮개를 떼어내야 하는데요. 상단, 하단으로 구분되어 있는데, 우선 상단 가운데 있는 나사를 풀어내고 위쪽부터 뜯어냅니다. 

뜯어 낼때는 양쪽에 고정 걸쇠가 있는데요, 별다른 도구는 필요하지 않고 살살힘을 주어 한쪽씩 당기면 투툭! 하며 빠집니다.

위쪽 덮개를 먼저 떼어낸다.

전선 정리 홀더 같은 곳에 있는 전선 (내부 조명용) 을 함께 제거하면 위와 같은 모습이 됩니다.

그다음 아래쪽 덮개를 떼어내야 하는데 아래쪽은 별도로 나사 같은 것으로 고정되어 있지는 않고 그냥 윗부분을 좌우 한쪽씩 잡고 당기면서 떼어내면 하나씩 걸쇠가 풀리면서 분리가 됩니다. 분리 방법은 제품마다 다르겠으나 큰 차이는 없을 것으로 생각됩니다.

하부 덮개를 떼어낸 모습

하부 덮개를 떼어내니 안쪽에 열교환기가 보이는데요, 아래쪽에 어마어마 한 얼음이 얼어 있습니다. 

 

반응형

 

딱봐도 여기가 문제군요.

아래쪽을 확대하여 찍어 본 모습

엄청나게 얼어있는 얼음을 살살 제거해 줍시다.

드라이를 이용해서 얼음과 주변을 좀 녹여 준 뒤 1자 드라이버와 망치를 이용해서 살살 쳐서 얼음을 깨 주었습니다.

드라이버로 녹이는게 가장 안전하겠지만 아주 단단히 얼어있는 얼음이기 때문에 녹이는데 시간이 많이 걸릴 것으로 보여 벽면이나 부품에 달라 붙어있는 부분만 우선 녹여낸 뒤 얼음을 깨 내면 부품에 손상 없이 얼음만 똑 떼어낼 수 있습니다.

아래쪽 얼음도 깨주었다. 어마어마 하군

 

중간 중간 아래쪽에 있는 얼음도 깨주었습니다. 주변이 살짝 녹을 정도면 조금만 톡톡 쳐줘도 덩어리로 얼음이 툭 깨져 나옵니다.

한참을 녹이고 부시고 반복한 상태

10여분 정도 사투한 결과 이제 거의 얼음이 해결되어 가고 있습니다.

과연 저것만 깨내면 문제가 해결되는 것일까요?

 

보이는 얼음을 일단 다 제거하고 보니 ... 수정한 구멍이 발견되었습니다.

아래쪽에 구멍이 하나 있는데 역시 얼음으로 막혀있다.

네.. 얼음을 모두 제거 하고 보니 아래쪽으로 구멍이 보이는군요.

그런데 구멍 역시 얼어 있습니다. 뭔가 구조상 물이 빠지는 구멍처럼 생겼는데 얼음이 여길 막고 있는 느낌이네요. 아마 여길 따라 흘러내려가야 할 물이 얼어서 구멍을 막고 , 막힌 구멍 때문에 물이 고여서 얼고, 또 그위로 물이 흘러 넘쳐 문 밖 까지 나온것으로 보여지네요.

네, 그럼 구멍 안쪽의 얼음도 녹여보기로 합니다.

드라이를 이용하여 좀 녹여 보았지만 녹은 물이 고여 아래쪽으로 열이 잘 전달이 되지 않는 것 같습니다. 

그래서 도구를 하나 추가하였습니다.

어항용 호스를 낀 주사기

네 보이는 그대로 어항용 호스를 낀 주사기를 하나 준비하였습니다. 호스로 녹은 물을 빨아내서 드라이의 열이 바로 얼음에 닿을 수 있도록 합니다.

드라이로 계속해서 녹인다
구멍 안쪽에 녹아있는 물을 빨아낸다

요렇게 몇변을 반복하다 보니 드라이 바람이 구멍 안쪽까지 잘 안들어 가는 것 같네요.

그래서 물을 조금 끓여서 부어 주고 드라이버로 살살 저어 주었더니 갑자기 아래로 쭉 하고 물이 내려가더군요. 

 

호스가 끝까지 들어감

네.. 호스가 끝까지 들어갔고 물은 빨아내지지 않네요. 

뭔가 해결이 된 것 같습니다. ㅎㅎ

 

이제 떼어낸 모든 부품을 다시 조립하면 끝!

냉동실은 다시 정상 적으로 잘 구동되는 걸 보니 문제가 해결된것 같습니다. (물론 전에도 문제 없이 동작했지만요 -_-;;)

한시간 정도 걸렸으려나요? 냉장실에 있는 음식들이 상할까봐 급하게 진행을 했는데요, 저와 같은 문제가 생기셨다면 당황하지 마시고 저처럼 진행하시면 되겠습니다.

 

 

끝으로 오늘 저런 사태가 왜 나타난건지 생각해 보았습니다. 

요즘 냉장고를 사용하다 보면 예전처럼 안쪽에 성애가 꽉 끼거나 하는 문제가 없죠? 왜 그럴까요? 

아까 사진에 보았던 열 교환기에 분명히 성애가 잔뜩 붙어 있을 줄 알았는데 아니더라고요. 

바로 아래쪽에 있는 부품에서 주기적으로 열을 발생시켜 위쪽 열교환기에 붙은 성애를 녹여주는거죠. 그럼 성애가 녹아서 물이되고 물은 흘러내려 아래 구멍으로 빠져 나가게 됩니다. 

그런데 예전 냉장고 처럼 아래쪽에 물받이 같은 것은 또 없죠? 오래전 냉장고들은 아래쪽에 넓적한 물받이 같은게 있어서 어떤 이유에서 생겼든 물이 고이도록 되어있는데요, 이렇게 흘러나온 물이 과연 어디로 가는 걸까요?

냉동실 제일 아래 부분이 불룩한 것으로 보면 그 안에 컴프레셔가 들어있을 텐데요. 아마 컴프레셔 열로 흘러나온 물을 증발시키는 것이 아닌가 생각됩니다. 그럼 따로 물받이 같은걸 통해 물을 받아서 버려야할 필요는 없겠습니다.

역시 놀라운 석학들의 머리를 통해 만들어진 제품이다 싶습니다.

2022.07.18 - [DIY] - 나만의 특별한 롱보드 DIY - 원피스 현상 수배 버전

 

나만의 특별한 롱보드 DIY - 원피스 현상 수배 버전

딸내미가 롱보드에 관심이 있길레 바로 당근을 뒤적거려 매우매우 훌륭하신 판매자 분을 만난 덕에 덜컥 구입해 버린 롱보드! 6만원이라는 저렴한 가격에 구입한 물건은 무려 클래식 보드 데크

diy-dev-design.tistory.com

2021.10.18 - [DIY] - [DIY] 지역난방 보일러 분배기에서 '딱딱' 소리나는 문제 해결 방법

 

[DIY] 지역난방 보일러 분배기에서 '딱딱' 소리나는 문제 해결 방법

갑자기 다가온 한파로 모두가 깜짝 놀라 롱패딩을 꺼내 입은 어제 였습니다. 인터넷 커뮤니티에서는 이것이 'K-날씨' 라며 한국의 기온 변화에 대해 우스개 소리를 할 정도였습니다. 저희집도 아

diy-dev-design.tistory.com

2021.02.06 - [DIY] - [DIY]닌텐도 스위치 - 조이콘 조이스틱 교체하기 #초보용#간단수리

 

[DIY]닌텐도 스위치 - 조이콘 조이스틱 교체하기 #초보용#간단수리

지난 크리스마스에 아이들 선물로 스위치를 사주었습니다. 아이들은 흥분했고 이틀만에 대리석 바닥에 LCD 쪽으로 정확히 떨어지는 모습을 슬로우 비디오처럼 바라본 저역시 흥분했습니다. -_-;;

diy-dev-design.tistory.com

 

2020.03.16 - [DIY] - 욕실장(싱크대) 경첩 셀프 교체하기 #노하우, #주부도 가능

 

욕실장(싱크대) 경첩 셀프 교체하기 #노하우, #주부도 가능

이사를 하고 보니 집에 손볼곳이 한두군데가 아니었습니다. 이번에는 욕실장 경첩 입니다. 전세로 이사를 하고나니 내 집도 아닌데 뭘 고쳐가면서 살아... 하는 생각도 들지만 막상 지저분하고

diy-dev-design.tistory.com

 

 

 

반응형
반응형

자 어느새 목표했던 RC headtracking FPV 만들기의 종착역을 다가가고 있습니다.

앞서 소개해 드렸던 2축 서보마운트 제작 및 서보컨트롤과 mpu6050 을 이용하여 2축 서보모터를 제어하는 내용은 잘 보셨나요? 아직 못보신분은 아래 글을 참고 부탁드립니다

2022.01.31 - [DIY/Arduino] - [아두이노]2축 서보모터 초간단 제어하기, 간단한 프레임 제작까지

 

[아두이노]2축 서보모터 초간단 제어하기, 간단한 프레임 제작까지

뭔가 목표가 생기면 과정이 분명해 진다. RC 카에 헤드트래킹을 이용한 FPV 를 구현하려는 목표가 생기고나니 과정을 잘 정리하는게 필요하겠다 싶어 포스트를 남깁니다. 우선 첫번째 스텝으로 2

diy-dev-design.tistory.com

2022.01.31 - [DIY/Arduino] - [아두이노]mpu6050 을 이용하여 2축 서보모터 제어하기

 

[아두이노]mpu6050 을 이용하여 2축 서보모터 제어하기

아두이노와 같은 마이크로 칩을 이용하여 무엇인가를 해보다 보면 정말 놀라운 경험들을 많이 하게 됩니다. 그 중 하나가 바로 mpu6050 같은 센서가 될 수 있겠습니다. 요 조그만 칩을 이용하여 기

diy-dev-design.tistory.com

 

반응형

 

오늘은 앞에서 소개해드린 mp6050 을 이용하여 측정한 회전 정보를 이용하여 서보모터를 제어하는 것을 응용하여 무선으로 서보모터를 제어하는 과정을 소개해 드릴 예정인데요, 여기에서는 아주아주 놀랍고 멋진 무선 송수신 칩인 nrf24L01 칩을 이용하여 구현을 할 계획입니다.

nrf24L01 칩의 경우 저렴하면서도 놀라운 성능을 보여주는 아주아주 애정하는 부품입니다.

실제로 해당 칩을 이용하여 RC 카 조종장치와 수신 장치를 만들기도 한적이 있습니다. 제어되는 범위, 거리도 아주 훌륭하고 신호 수준도 좋으며 중요한 것은 1개의 송신부에서 여러개의 수신장치를 제어할 수 있는 멋진 칩 입니다. 게다가 송신과 수신을 하나의 칩에서 지원하고 있으므로 양방향 통신을 구현하는데에도 어려움이 없습니다.

일단 오늘 도전할 목표는 앞서 말씀 드렸던것 처럼 mp6050 자이로 센서에서 측정된 회전 값을 NRF24L01 칩을 이용하여 보내고 또다른 NRF24L01 칩에서 이 신호를 받아 2축 서보모터를 제어하는 과제가 되겠습니다.

이전 포스팅에서 소개해 드린 것에서 무선 송수신이 추가만 되었을 뿐 크게 달라지는 건 없습니다.

무선 송수신을 위한 라이브러리는 웹상에도 많이 있고요, 아래 첨부해둔 라이브러리를 받으셔서 바로 내문서-아두이노 폴더에 넣으셔도 됩니다.

RF24-master.zip
0.39MB
SPI.zip
0.01MB

 

자 이젠 무선 송수신 칩이 들어오면서 배선이 조금 복잡해 집니다.

차근차근 따라 오시면 됩니다.

 

NRF24L01 칩에 대하여

여기서 NRF24L01 칩 외에 추가 준비물이 필요한데요, 준비물은 바로 10uf 전해콘덴서 입니다. 이 전해 콘덴서를 nrf24l01 의 전원 (3.3v) 단에 연결을 해 주셔야 문제 없이 잘 동작합니다. 용량은 가능하면 10uf 로 준비해 주세요, 제가 처음 테스트 할 때 전해 콘덴서 용량이야 뭔들 중요하랴... 싶어 용량이 안 맞는 부품을 적당히 연결해서 해보았지만 잘 안되서 정말 골머리를 썩었는데요, 10uf 콘덴서를 달면 정말 거짓말처럼 동작이 잘 됩니다. 

물론 소스코드나 배선에 실수는 없어야 겠지요.

 

한가지더, nrf24l01 칩은 몇가지 타입이 있는데요, 크기가 작은 SMD 타입과 일반 핀이 달려있는 Dip 타입, 그리고 원거리 송수신이 가능한 PA LN 타입이 있습니다. 핀 구성은 모두 동일하고 배열만 약간 차이가 있으며 코드는 모두 동일하게 지원 합니다. 저는 소형화된 부품이 좋아 보통은 SMD 타입 부품을 사용하고요, 배선이 일렬로 되어 있어 브래드 보드 등에 테스트 하기도 편리한 점이 장점이라 할 수 있습니다. 해외 어떤 사용자 분은 성능도 SMD 타입이 좋다고 하시는데.. 실제로 그런지는 잘 모르겠습니다. (- -)>;;

DIP 타입을 이용하실 경우 확장 보드가 있으면 조금더 편리하게 사용하실 수 있지만 부피가 조금 커진다고 보시면 되고, PA-LNA 보드는 DIP 타입의 확장보드와 호환이 가능하며 아래쪽에 SMD 타입과 같은 보드 실장을 위한 연결 단자가 있으므로 보드에 바로 연결이 가능합니다. PA-LNA 보드의 경우 NRF24L01 칩이 기본 탑제되어 있고 위에서 말씀드린것과 같이 코드 및 배선은 동일하게 하시면 되며 원거리까지 송수신이 가능하므로 무선으로 멀리까지 신호를 보내고 받아야 하는 경우 사용하시면 되겠습니다.

 

배선 시작

자 이제 배선을 해보겠습니다.

 

먼저 제가 사용할 SMD 타입은 만능기판에 바로 핀을 꼽기가 어려운데요. 그래서 생각해낸 것이 아래와 같은부품을 이용하는 것 입니다.

14pin smd 부품을 만능기판에 사용하기 위한 pcb 보드

가운데 있는 보드를 가운데를 잘라주고 반쪽만 사용하게 되는데요, 이 pcb 를 이용하면 NRF24L01 SMD 칩의 핀 간격과 정확히 일치 하게 되며 실제로 사용하지 않는 가장 오른쪽 IRQ 는 무시하고 왼쪽부터 맞추어 납을 흘려넣어 납땜을 해주면 됩니다.

하단의 구멍에는 1.24mm pin 이 정확히 맞으므로 일렬로 배열된 핀을 만능기판에 꼽아 사용할 수 있게 됩니다.

위에서 말씀드린 10uF 전해 콘덴서까지 연결하게 되면 아래와 같은 모양이 됩니다.

만능기판용으로 제작된 SMD 타입의 NRF24L01 칩

 

NRF24L01 칩은 아래와 같은 핀 구성을 하고 있고요, 각각 아두이노와 그림처럼 연결하시면 됩니다.

NRF24L01 SMD PINOUT

 

아두이노 핀 연결방법

 

CE, CSN 은 각각 7번 8번에 연결하여야 하는데 이 두핀은 위치가 바뀌어도 상관 없습니다. 코드상에서 정의해준 핀의 번호와 일치하기만 하면 되고요, 나머지 핀은 지정된 핀에 연결하시면 됩니다.

저처럼 SMD 타입을 사용할 경우 전원은 아두이노의 반드시 3.3V 에 연결해 주셔야 하고 dip 타입을 사용하시는 경우 확장보드를 이용하시면 5V 를 바로 연결하셔도 되며 10uf 전해 콘덴서는 필요 없습니다.

 

특별 초대손님이 있다고?

자~ 오늘의 특별 초대손님이 계신데요...

두구두구

두구

두구

 

 

아두이노 RC 카 수신기

짜잔~

네~ 바로 아두이노로 제작한 RC 카 수신기 입니다. 물론 송신기도 아두이노로 만들었었습니다.

해당 보드는 왼쪽 상단에 3핀 소켓을 통해 ESC 로부터 전원을 입력 받고 신호 선을 통해 모터스피드(속도)를 제어하게 되고요, 우측 아래 두개의 3핀 소켓을 통해 조향서보와 2-speed gear 의 조작용 서보에 연결하게 제작되었습니다. 오늘은 해당 두개의 서보모터 핀을 이용하여 x,y 축을 제어해 보도록 할 계획입니다. 보드 중간에 가로로 보이는 구멍이 NRF24L01 보드를 장착하기 위한 소켓입니다.

무선 모듈을 연결하면 아래와 같은 모양이 됩니다.

NRF24L01 보드가 장착된 아두이노 RC 카 수신기

한동안 즐겁게 가지고 놀았었는데요, 일반적인 RC 카 수신기에 비하면 덩치가 조금 크기는 하지만 4개의 2pin 포트를 통해 헤드라이트나 후미등, 좌우측 깜박이 등을 이 보드 하나로 제어할 수 있어 멀펑 보드가 별도로 필요하지 않으므로 나름 쓸만하다고 할 수 있겠습니다. 

언제 시간이 나면 핀 사진의 커넥터 대신 일반 적인 RC 카에 많이 사용하는 후타바 짹이나 JR 커넥터 등을 이용하여 부피를 줄여볼 계획입니다. 나중에 작업하게 되면 소개해 드리겠습니다.,

 

배선은 송신부, 수신부 두개의 아두이노에 동일하게 해주시면 되고 송신부와 수신부는 코드에서 정의를 해주게 됩니다.

 

배선이 완료된 송신부 입니다.

아두이노나노, NRF24L01, MPU6050 이 연결되어 있다.

네 사진상으로는 조금 복잡하지만 기존 설명드린데로 잘 연결 하셨다면 어려움 없이 잘 하실 수 있으리라 믿습니다.

 

수신기 쪽을 볼까요?

아두이노 나노, NRF24L01, 2개의 서보모터가 연결되어 있다

네 수신부에는 예상하시다 시피 두개의 서보모터와 NRF24L01 보드가 연결되어 있습니다.

 

 

코딩을 해보자

코드를 볼까요?

 

먼저 송신부 입니다. 기존 작성해 놓은 mp6050 코드에 무선 송수신 코드만 추가할 예정입니다.

// init for nrf24L01 
#include <SPI.h>
#include <nRF24L01.h>
#include <RF24.h>

RF24 radio(8,7);  //  CE, CSN 
const byte address[6] = "00001"; //송신기와 수신기 동일한 주소 사용
int msg[8]; 


//pinout smd version
//3.3v  --- 3.3v
//GND  ---  GND
//CE   ---  8
//CSN  ---  7
//SCK  ---  13
//MOSI ---  11
//MISO ---  12
//IRQ  ---  none

// init for mpu6050
#include "I2Cdev.h"
#include "MPU6050_6Axis_MotionApps_V6_12.h"
#if I2CDEV_IMPLEMENTATION == I2CDEV_ARDUINO_WIRE
#include "Wire.h"
#endif

MPU6050 mpu;
#define OUTPUT_READABLE_YAWPITCHROLL
#define INTERRUPT_PIN 2  // use pin 2 on Arduino Uno & most boards
#define LED_PIN 13 // (Arduino is 13, Teensy is 11, Teensy++ is 6)
bool blinkState = false;

// MPU control/status vars
bool dmpReady = false;  // set true if DMP init was successful
uint8_t mpuIntStatus;   // holds actual interrupt status byte from MPU
uint8_t devStatus;      // return status after each device operation (0 = success, !0 = error)
uint16_t packetSize;    // expected DMP packet size (default is 42 bytes)
uint16_t fifoCount;     // count of all bytes currently in FIFO
uint8_t fifoBuffer[64]; // FIFO storage buffer

// orientation/motion vars
Quaternion q;           // [w, x, y, z]         quaternion container
VectorInt16 aa;         // [x, y, z]            accel sensor measurements
VectorInt16 gy;         // [x, y, z]            gyro sensor measurements
VectorInt16 aaReal;     // [x, y, z]            gravity-free accel sensor measurements
VectorInt16 aaWorld;    // [x, y, z]            world-frame accel sensor measurements
VectorFloat gravity;    // [x, y, z]            gravity vector
float euler[3];         // [psi, theta, phi]    Euler angle container
float ypr[3];           // [yaw, pitch, roll]   yaw/pitch/roll container and gravity vector

volatile bool mpuInterrupt = false;     // indicates whether MPU interrupt pin has gone high
void dmpDataReady() {
  mpuInterrupt = true;
}

void setup() {

  // join I2C bus (I2Cdev library doesn't do this automatically)
  #if I2CDEV_IMPLEMENTATION == I2CDEV_ARDUINO_WIRE
    Wire.begin();
    Wire.setClock(400000); // 400kHz I2C clock. Comment this line if having compilation difficulties
  #elif I2CDEV_IMPLEMENTATION == I2CDEV_BUILTIN_FASTWIRE
    Fastwire::setup(400, true);
  #endif
  
  Serial.begin(115200);
  while (!Serial); // wait for Leonardo enumeration, others continue immediately

 
  // initialize device
  Serial.println(F("Initializing I2C devices..."));
  mpu.initialize();
  pinMode(INTERRUPT_PIN, INPUT);

  // verify connection
  Serial.println(F("Testing device connections..."));
  Serial.println(mpu.testConnection() ? F("MPU6050 connection successful") : F("MPU6050 connection failed"));

  // wait for ready
  Serial.println(F("\nSend any character to begin DMP programming and demo: "));
  //while (Serial.available() && Serial.read()); // empty buffer
  //while (!Serial.available());                 // wait for data
  //while (Serial.available() && Serial.read()); // empty buffer again

  // load and configure the DMP
  Serial.println(F("Initializing DMP..."));
  devStatus = mpu.dmpInitialize();

  // supply your own gyro offsets here, scaled for min sensitivity
  mpu.setXGyroOffset(51);
  mpu.setYGyroOffset(8);
  mpu.setZGyroOffset(21);
  mpu.setXAccelOffset(1150);
  mpu.setYAccelOffset(-50);
  mpu.setZAccelOffset(1060);
  // make sure it worked (returns 0 if so)
  if (devStatus == 0) {
    // Calibration Time: generate offsets and calibrate our MPU6050
    mpu.CalibrateAccel(6);
    mpu.CalibrateGyro(6);
    Serial.println();
    mpu.PrintActiveOffsets();
    // turn on the DMP, now that it's ready
    Serial.println(F("Enabling DMP..."));
    mpu.setDMPEnabled(true);

    // enable Arduino interrupt detection
    Serial.print(F("Enabling interrupt detection (Arduino external interrupt "));
    Serial.print(digitalPinToInterrupt(INTERRUPT_PIN));
    Serial.println(F(")..."));
    attachInterrupt(digitalPinToInterrupt(INTERRUPT_PIN), dmpDataReady, RISING);
    mpuIntStatus = mpu.getIntStatus();

    // set our DMP Ready flag so the main loop() function knows it's okay to use it
    Serial.println(F("DMP ready! Waiting for first interrupt..."));
    dmpReady = true;

    // get expected DMP packet size for later comparison
    packetSize = mpu.dmpGetFIFOPacketSize();
  } else {
    // ERROR!
    // 1 = initial memory load failed
    // 2 = DMP configuration updates failed
    // (if it's going to break, usually the code will be 1)
    Serial.print(F("DMP Initialization failed (code "));
    Serial.print(devStatus);
    Serial.println(F(")"));
  }

  // Radio setup
  //setupRadio();
  
  msg[0] = 0; 
  msg[1] = 0; 
  msg[2] = 0; 
  msg[3] = 0;
  msg[4] = 0; 
  msg[5] = 0; 
  msg[6] = 0; 
  msg[7] = 0;
  
  radio.begin();
  radio.openWritingPipe(address); //이전에 설정한 5글자 문자열인 데이터를 보낼 수신의 주소를 설정
  radio.setPALevel(RF24_PA_MIN); //전원공급에 관한 파워레벨을 설정합니다. 모듈 사이가 가까우면 최소로 설정합니다.
  radio.stopListening();  //모듈을 송신기로 설정
}

void loop() {

  // if programming failed, don't try to do anything
  if (!dmpReady) return;
  // read a packet from FIFO
  if (mpu.dmpGetCurrentFIFOPacket(fifoBuffer)) { // Get the Latest packet 

  #ifdef OUTPUT_READABLE_YAWPITCHROLL
    // display Euler angles in degrees
    mpu.dmpGetQuaternion(&q, fifoBuffer);
    mpu.dmpGetGravity(&gravity, &q);
    mpu.dmpGetYawPitchRoll(ypr, &q, &gravity);
    
    float angle_x = (ypr[0] * 180 / M_PI) * -1 + 90 ; //* -1 + 90;
    float angle_y = (ypr[1] * 180 / M_PI) + 90 ; //* -1 + 30;    
   
    if (angle_y < 60) angle_y = 60;
    if (angle_y > 120) angle_y = 120;
    
    if (angle_x < 30) angle_x = 30;
    if (angle_x > 150) angle_x = 150;

    msg[0] = int(angle_x);
    msg[1] = int(angle_y);
    
    radio.write(&msg, sizeof(msg)); //해당 메시지를 수신기로 보냄
    
    Serial.print("ypr\tx:");
    Serial.print(int(angle_x));
    Serial.print("\ty:");
    Serial.print(int(angle_y));
    Serial.print("\t");
    
    

  #endif
  }
  Serial.println(".");
  delay(10);
  
}

아무래도 셋업해주는 부분이 약간 생소할 수 있겠습니다만 저도 인터넷에서 긁어 모은 코드를 조합하였을 뿐 상세하게는 모른답니다. 중요한 것은 노드의 이름을 정해주었는데요, 수신부에서도 동일한 이름을 지정해 주어야 한다는 점과, 다른 분들과의 혼선을 막기 위하여는 해당 이름을 유니크한 이름으로 정해주는 것이 좋다는 것 정도 입니다.

제가 사용한 코드는 (존경하는)새다리 님의 코드를 참고 하였고 NRF24L01 로 검색하시면 해외 여러 개발자 분들이 올려주신 멋진 코드들이 많이 있으므로 참고하시면 좋을 것 같습니다.

 

이번에는 수신부 입니다.

 #include <SPI.h> 
#include <nRF24L01.h>
#include <RF24.h>

RF24 radio(8,7); //  CE, CSN 
const byte address[6] = "00001"; //송신기와 수신기 동일한 주소 사용
int msg[8]; 

//pinout smd version
//NRF24L01    ARDUINO
//3.3v    ---   3.3v
//GND     ---   GND
//CE      ---   8
//CSN     ---   7
//SCK     ---   13
//MOSI    ---   11
//MISO    ---   12
//IRQ     ---   none

#include <Servo.h>

Servo myservo_LR;   
Servo myservo_UD; 

int pin_servo_LR = 9;
int pin_servo_UD = 10;

void setup() {
  radio.begin();
  radio.openReadingPipe(1, address);
  radio.setPALevel(RF24_PA_MIN); //
  // RF24_PA_MIN / RF24_PA_LOW / RF24_PA_HIGH / RF24_PA_MAX
  radio.startListening(); //수신기로 설정
  
  //setting 2 servo
  myservo_LR.attach(pin_servo_LR);
  myservo_LR.write (90);
  myservo_UD.attach(pin_servo_UD);
  myservo_UD.write (90);
}

void loop() {

  if (radio.available()) {
    radio.read(&msg, sizeof(msg));
    for(int i = 0; i < 8 ; i ++)
    {
      Serial.print(msg[i]);
      Serial.print("\t");
    }

    int angle_x = int(msg[0]);
    int angle_y = int(msg[1]);
    
    if (angle_x < 150 && angle_x > 30)
    {
      myservo_LR.write (angle_x);          
    }
    if (angle_y < 120 && angle_y > 60)
    {
      myservo_UD.write(angle_y);
    }
  }
}

수신부는 서보모터 제어코드와 무선 수신 코드가 있는데요, 송신부에 비하면 간단하게 구성되어 있습니다.

무선 패킷이 들어오면 동작하도록 되어 있으므로 수신에 실패하면 아무런 동작도 하지 않도록 되어 있으며 만약을 대비하여 잘못된 값이 수신되더라도 서보모터에 전달되지 않도록 최대, 최소 범위를 제한하여 서보에 입력되도록 하였습니다.

 

과연 잘 동작 할런지???

동작하는 모습을 볼까요?

 

 

ㅋㅋ 네 잘 되는군요. 이제 뭐 거의 다 온 것 같습니다.

다음 편에는 카메라를 연결하고 차량안에 장착할 준비를 한번 해봐야 겠습니다.

머릿속에 아주 좋은 그림이 있거든요~ ㅎㅎ

기대해 주세요 ~ ^^

2022.01.31 - [DIY/Arduino] - [아두이노]2축 서보모터 초간단 제어하기, 간단한 프레임 제작까지

 

[아두이노]2축 서보모터 초간단 제어하기, 간단한 프레임 제작까지

뭔가 목표가 생기면 과정이 분명해 진다. RC 카에 헤드트래킹을 이용한 FPV 를 구현하려는 목표가 생기고나니 과정을 잘 정리하는게 필요하겠다 싶어 포스트를 남깁니다. 우선 첫번째 스텝으로 2

diy-dev-design.tistory.com

2022.01.31 - [DIY/Arduino] - [아두이노]mpu6050 을 이용하여 2축 서보모터 제어하기

 

[아두이노]mpu6050 을 이용하여 2축 서보모터 제어하기

아두이노와 같은 마이크로 칩을 이용하여 무엇인가를 해보다 보면 정말 놀라운 경험들을 많이 하게 됩니다. 그 중 하나가 바로 mpu6050 같은 센서가 될 수 있겠습니다. 요 조그만 칩을 이용하여 기

diy-dev-design.tistory.com

 

2020.10.29 - [DIY] - [DIY] 오래된 다목적 캠핑용 랜턴 ▶ LED 램프, 충전식으로 교체하기

 

[DIY] 오래된 다목적 캠핑용 랜턴 ▶ LED 램프, 충전식으로 교체하기

처갓집 구석에서 재미있는 물건을 하나 발견했습니다. 마침 캠핑 전용 랜턴이 하나 있었으면 하는 차에 이게 왠 떡인가요 ㅋ 언제부터 처갓집에 있었는지는 모르겠지만 사용하지 않는 것이 분

diy-dev-design.tistory.com

 

2019.10.13 - [DIY] - [DIY] 아이방 수면등 만들기 (feat. 아이그림)

 

[DIY] 아이방 수면등 만들기 (feat. 아이그림)

아이들은 창의적이다. 시키지도 않았던 생각치도 않았던 아무 많은 그림을 시도 때도 없이 시간과 장소 불문, 심지어는 종이를 불문하고 마구마구 그려댄다. 그래서 A4 용지를 내주었더니 그럴

diy-dev-design.tistory.com

 

반응형
반응형

아두이노와 같은 마이크로 칩을 이용하여 무엇인가를 해보다 보면 정말 놀라운 경험들을 많이 하게 됩니다. 그 중 하나가 바로 mpu6050 같은 센서가 될 수 있겠습니다.

요 조그만 칩을 이용하여 기울어진 정도나 각도, 나침반과 같은 방향 등을 알아낼 수 있다니 놀랍지 않으신가요?

요 조그만 칩이라고 했는데 이미지는 엄청 큰 mpu6050

오늘 소개해 드릴 내용은 RC Headtracking FPV 만들기의 두번째 스탭인 6축 자이로 센서를 이용한 움직임 신호 받기와 해당 신호를 이용 하여 2축 서보모터를 제어하는 내용 입니다.

헤드트래킹 무선 FPV 를 만들기 위하여 지난 포스트에서 2축 서보모터 마운트를 아주~ 아~~~주 간단하게 만드는 방법을 소개해 드렸었는데요, 해당 프레임에 부착한 서보모터를 이번 시간에 자이로 센서를 이용하여 제어를 해보도록 하겠습니다.

 

2022.01.31 - [DIY/Arduino] - 2축 서보모터 초간단 제어하기, 간단한 프레임 제작까지

 

2축 서보모터 초간단 제어하기, 간단한 프레임 제작까지

뭔가 목표가 생기면 과정이 분명해 진다. RC 카에 헤드트래킹을 이용한 FPV 를 구현하려는 목표가 생기고나니 과정을 잘 정리하는게 필요하겠다 싶어 포스트를 남깁니다. 우선 첫번째 스텝으로 2

diy-dev-design.tistory.com

 

먼저 라이브러리를 받아야 할텐데요,  아래 첨부된 라이브러리를 다운 받으셔서 바로 내문서- Arduino-libraries 폴더에 압축을 해제하여 넣으시면 됩니다. 

 

MPU6050.zip
0.10MB
I2Cdev.zip
0.01MB

 

요렇게 넣으면 됩니다.

 

혹시 Wire.h 라이브러리가 없으시면 아래 파일도 다운 받으시면 됩니다.

Wire.zip
0.01MB

 

반응형

 

mpu6050 라이브러리를 받으시면 예제 소스코드가 들어있을 텐데요, 저는 여기서 시작 이후 실제 회전하는 값, 즉 상대 회전 값만을 이용할 계획이고 아래의 코드를 이용하여 회전 값을 추출할 계획입니다. 본 포스트에서 소개해 드리는 예제 외에도 라이브러리가 제공하는 예제 코드를 실행해보시면 다른 창작품 제작에도 도움이 될 수 있을 것 같습니다. ^^

 

기존 조이스틱 대신 이번에는 mpu6050 보드를 연결해야 하는데요. I2C 방식으로 연결할 것이므로 선은 4가닥만 있으면 되며 vcc 는 3.3v 에 연결해 주시고, GND 는 아두이노의 GND 에 연결, SDA 는 아두이노의 A4 번SCL 은 아두이노의 A5에 연결하시면 됩니다. (다른 핀은 안됩니다. 정확히 A4, A5에 연결해 주셔야 합니다)

 

코딩을 해보자

mpu6050 에 대한 자세한 내용은 이미 여러분들께서 다루어 주시고 있으므로 저는 실제 이번 프로젝트에 사용한 코드만 보여드리도록 하겠습니다.

 

#include <Servo.h>
#include "I2Cdev.h"
#include "MPU6050_6Axis_MotionApps_V6_12.h"
#if I2CDEV_IMPLEMENTATION == I2CDEV_ARDUINO_WIRE
#include "Wire.h"
#endif

MPU6050 mpu;
#define OUTPUT_READABLE_YAWPITCHROLL
#define INTERRUPT_PIN 2  // use pin 2 on Arduino Uno & most boards
#define LED_PIN 13 // (Arduino is 13, Teensy is 11, Teensy++ is 6)
bool blinkState = false;

// MPU control/status vars
bool dmpReady = false;  // set true if DMP init was successful
uint8_t mpuIntStatus;   // holds actual interrupt status byte from MPU
uint8_t devStatus;      // return status after each device operation (0 = success, !0 = error)
uint16_t packetSize;    // expected DMP packet size (default is 42 bytes)
uint16_t fifoCount;     // count of all bytes currently in FIFO
uint8_t fifoBuffer[64]; // FIFO storage buffer

// orientation/motion vars
Quaternion q;           // [w, x, y, z]         quaternion container
VectorInt16 aa;         // [x, y, z]            accel sensor measurements
VectorInt16 gy;         // [x, y, z]            gyro sensor measurements
VectorInt16 aaReal;     // [x, y, z]            gravity-free accel sensor measurements
VectorInt16 aaWorld;    // [x, y, z]            world-frame accel sensor measurements
VectorFloat gravity;    // [x, y, z]            gravity vector
float euler[3];         // [psi, theta, phi]    Euler angle container
float ypr[3];           // [yaw, pitch, roll]   yaw/pitch/roll container and gravity vector

volatile bool mpuInterrupt = false;     // indicates whether MPU interrupt pin has gone high
void dmpDataReady() {
  mpuInterrupt = true;
}

Servo myservo_LR;   // streering servo
Servo myservo_UD;  // 2speed gear box servo

int pin_servo_LR = 9;
int pin_servo_UD = 10;

int pin_x = A3;
int pin_y = A4;
int angle_x = 512 ;
int angle_y = 512 ;

void setup() {

  // join I2C bus (I2Cdev library doesn't do this automatically)
  #if I2CDEV_IMPLEMENTATION == I2CDEV_ARDUINO_WIRE
    Wire.begin();
    Wire.setClock(400000); // 400kHz I2C clock. Comment this line if having compilation difficulties
  #elif I2CDEV_IMPLEMENTATION == I2CDEV_BUILTIN_FASTWIRE
    Fastwire::setup(400, true);
  #endif
  
  Serial.begin(115200);
  while (!Serial); // wait for Leonardo enumeration, others continue immediately

 
  // initialize device
  Serial.println(F("Initializing I2C devices..."));
  mpu.initialize();
  pinMode(INTERRUPT_PIN, INPUT);

  // verify connection
  Serial.println(F("Testing device connections..."));
  Serial.println(mpu.testConnection() ? F("MPU6050 connection successful") : F("MPU6050 connection failed"));

  // wait for ready
  Serial.println(F("\nSend any character to begin DMP programming and demo: "));
  //while (Serial.available() && Serial.read()); // empty buffer
  //while (!Serial.available());                 // wait for data
  //while (Serial.available() && Serial.read()); // empty buffer again

  // load and configure the DMP
  Serial.println(F("Initializing DMP..."));
  devStatus = mpu.dmpInitialize();

  // supply your own gyro offsets here, scaled for min sensitivity
  mpu.setXGyroOffset(51);
  mpu.setYGyroOffset(8);
  mpu.setZGyroOffset(21);
  mpu.setXAccelOffset(1150);
  mpu.setYAccelOffset(-50);
  mpu.setZAccelOffset(1060);
  // make sure it worked (returns 0 if so)
  if (devStatus == 0) {
    // Calibration Time: generate offsets and calibrate our MPU6050
    mpu.CalibrateAccel(6);
    mpu.CalibrateGyro(6);
    Serial.println();
    mpu.PrintActiveOffsets();
    // turn on the DMP, now that it's ready
    Serial.println(F("Enabling DMP..."));
    mpu.setDMPEnabled(true);

    // enable Arduino interrupt detection
    Serial.print(F("Enabling interrupt detection (Arduino external interrupt "));
    Serial.print(digitalPinToInterrupt(INTERRUPT_PIN));
    Serial.println(F(")..."));
    attachInterrupt(digitalPinToInterrupt(INTERRUPT_PIN), dmpDataReady, RISING);
    mpuIntStatus = mpu.getIntStatus();

    // set our DMP Ready flag so the main loop() function knows it's okay to use it
    Serial.println(F("DMP ready! Waiting for first interrupt..."));
    dmpReady = true;

    // get expected DMP packet size for later comparison
    packetSize = mpu.dmpGetFIFOPacketSize();
  } else {
    // ERROR!
    // 1 = initial memory load failed
    // 2 = DMP configuration updates failed
    // (if it's going to break, usually the code will be 1)
    Serial.print(F("DMP Initialization failed (code "));
    Serial.print(devStatus);
    Serial.println(F(")"));
  }

  
  myservo_LR.attach(pin_servo_LR);
  myservo_LR.write (90);
  myservo_UD.attach(pin_servo_UD);
  myservo_UD.write (90);
}

void loop() {

  // if programming failed, don't try to do anything
  if (!dmpReady) return;
  // read a packet from FIFO
  if (mpu.dmpGetCurrentFIFOPacket(fifoBuffer)) { // Get the Latest packet 

  #ifdef OUTPUT_READABLE_YAWPITCHROLL
    // display Euler angles in degrees
    mpu.dmpGetQuaternion(&q, fifoBuffer);
    mpu.dmpGetGravity(&gravity, &q);
    mpu.dmpGetYawPitchRoll(ypr, &q, &gravity);
    
    float angle_x = (ypr[0] * 180 / M_PI) * -1 + 90 ; //* -1 + 90;
    float angle_y = (ypr[1] * 180 / M_PI) + 90 ; //* -1 + 30;    
   
    if (angle_y < 60) angle_y = 60;
    if (angle_y > 120) angle_y = 120;
    
    if (angle_x < 30) angle_x = 30;
    if (angle_x > 150) angle_x = 150;

    myservo_LR.write (angle_x);  
    myservo_UD.write (angle_y);
  
    Serial.print("ypr\tx:");
    Serial.print(int(angle_x));
    Serial.print("\ty:");
    Serial.print(int(angle_y));
    Serial.print("\t");
    
    

  #endif
  }
  Serial.println(".");
  delay(10);
  
}

 

코드가 조금 길어졌기는 하지만 기존 첫번째 과정에 mpu6050 관련 코드가 추가되었고 크게 달라진것은 없습니다. mpu6050 관련된 상세한 코드는 저도 잘 모르고요. 그냥 예제에서 긁어온 코드입니다. ^^;; (불필요한 내용이 들어 있을 수도 있고요... 어쨌든 위의 코드면 잘 실행됩니다.)

위 코드에서 아래 부분이 실제 회전 값을 받아서 내가 원하는 각도로 세팅하는 부분인데요. 입력 값이 최초 실행된 위치로부터의 상대 값이므로 가만히 있으면 0 이 들어오게 됩니다. 그러므로 기준이 되는 앵글을 더해주면 기준이 되는 앵글에  + - 로 각도가 변경되게 되며 저의 x 위치에 -1 이 들어있는 것은 서보 모터의 설치 방향 때문에 방향을 뒤집어 주기 위함입니다. Y 값 역시 서보모터의 방향이 저와 다른 방향으로 설치되어 반대로 움직인다면 센서의 값에 -1 을 곱해 주시면 됩니다.

	float angle_x = (ypr[0] * 180 / M_PI) * -1 + 90 ; //* -1 + 90;
    float angle_y = (ypr[1] * 180 / M_PI) + 90 ; //* -1 + 30;    
   
    if (angle_y < 60) angle_y = 60;
    if (angle_y > 120) angle_y = 120;
    
    if (angle_x < 30) angle_x = 30;
    if (angle_x > 150) angle_x = 150;

 

어쨌든 서보모터 제어를 위한 부분은 이전에 소개해 드린 코드 그대로 가져왔고요, 회전 정보를 받아 서보모터로 전달하는 과정에서 축의 기준위치, 방향 등을 변경해주기 위하여 위와 같이 약간의 코드가 추가되었습니다. if 구문을 이용하여 입력된 값 + 기준값이 모터의 최대 회전 범위 보다 크다면 최대 회전 범위의 값으로 설정을 해주면 됩니다.

 

저는 기준위치를 서보의 상하, 좌우 90도를 기준으로 설정하였고 상하로는 ±30도씩, 좌우로는 ±60도씩 움직일 수 있도록 하였습니다.

참 쉽죠?

 

이것은 동영상은 아닙니다.&amp;nbsp;

 

과연 잘 동작할런지??

자 구동 되는 모습은 아래와 같습니다.

 

 

 

아주 잘 되죠?

기존 조이스틱이 움직이는 범위에 비하여 출력되는 범위가 리니어 하지 않은지 휙휙 움직이던것에 비하면 아주 아주 잘 동작하는 것을 확인할 수 있습니다. 

 

이렇게 mpu6050 6축 지자기센서를 이용하여 2축 서보모터를 제어하는 것까지 마쳤습니다. 

생각보다 어렵지 않죠?

다음은 이제 대망의 무선 입니다. 

다음 포스트를 기대해 주세요.

2022.01.31 - [DIY/Arduino] - [아두이노]NRF24L01을 이용하여 무선으로 mpu6050 신호 전달하기

 

[아두이노]NRF24L01을 이용하여 무선으로 mpu6050 신호 전달하기

자 어느새 목표했던 RC headtracking FPV 만들기의 종착역을 다가가고 있습니다. 앞서 소개해 드렸던 2축 서보마운트 제작 및 서보컨트롤과 mpu6050 을 이용하여 2축 서보모터를 제어하는 내용은 잘 보

diy-dev-design.tistory.com

 

2022.01.25 - [DIY/RC] - 20년된 엔진 RC 카 전동화 해보자 [kyosho inferno]

 

20년된 엔진 RC 카 전동화 해보자 [kyosho inferno]

당근에 RC 키워드를 올려놓은지 어언 2년! 드디어 대물이 물었습니다. 무려 kyosho inferno 라는 1/8 버기와 traxxas slash 2wd 차량 두대가 3만원이라는 놀라운 금액에 올라온 것이죠. 바로 챔질하고 get! 와

diy-dev-design.tistory.com

 

2022.01.31 - [DIY/Arduino] - 2축 서보모터 초간단 제어하기, 간단한 프레임 제작까지

 

2축 서보모터 초간단 제어하기, 간단한 프레임 제작까지

뭔가 목표가 생기면 과정이 분명해 진다. RC 카에 헤드트래킹을 이용한 FPV 를 구현하려는 목표가 생기고나니 과정을 잘 정리하는게 필요하겠다 싶어 포스트를 남깁니다. 우선 첫번째 스텝으로 2

diy-dev-design.tistory.com

 

2020.11.29 - [DIY/RC] - 1/24 완벽한 RC 카 RGT ADVENTURE

 

1/24 완벽한 RC 카 RGT ADVENTURE

rock crawler 라는 단어를 안다면 당신은 이미 로맨티스트. 네 그렇습니다. 일반인은 흔히 접하는 용어는 아니지만 RC 카에 관심이 조금이라도 있는 분은 아주 익숙한 단어일거에요. SCX10 으로 시작

diy-dev-design.tistory.com

 

반응형
반응형

뭔가 목표가 생기면 과정이 분명해 진다.

RC 카에 헤드트래킹을 이용한 FPV 를 구현하려는 목표가 생기고나니 과정을 잘 정리하는게 필요하겠다 싶어 포스트를 남깁니다.

우선 첫번째 스텝으로 2축으로 제어가 가능한 서보모터 마운트를 만들고 서보모터를 제어하는 것인데요, 이미 언젠가 사용하겠지 싶어서 구입해 둔 2축 서보모터 마운트가 있기에 이 부분은 간단히 해결될 거라 생각했습니다.

 

바로 중국에서 구입한 이런 제품이죠.

9g 서보모터를 이용하여 바로 연결이 가능하도록 나온 제품이고 약간 헷갈리기는 하지만 조립이 어렵지는 않습니다. 

그런데 너무 쉽게 생각한게 오산이었을까요?

일단 어떻게 연결해도 약간 제가 생각하는 머리의 움직임과 괴리감이 있었습니다. 

사람은 목이라는 놀라운 구조에 의해 상하좌우 회전이 거의 동일한 한 점에서 이루어 집니다. 심지어는 틸트까지 되죠, 3축이 하나의 구조에서 이루어지는 놀라운 구조가 아닐수 없습니다. 

제가 구입하였던 2축 서보 마운트는 그런 개념에서 완전히 빗나가 있더군요. 일단 x, y 축의 회전 축이 상당히 어긋나 있다는 점이 첫번째 문제점이었고 두번째로는 기본 각도가 수평에서 시작한다는 점 이었습니다.

위의 사진에서 보이는 것처럼 상단 평평한 면이 이미 최대 상향(y축) 각도인데요, 말하자면 더이상 고개를 들거나 또는 내리는건 불가능한 상태 입니다. 물론 90도를 꺽은 상태에서 카메라를 부착하는 방법도 있지만 그렇게 되면 축에서 더욱 멀어지게 되므로 이미 상당한 수준의 거북목이 진행된 것처럼 되어 버립니다. 무슨 목을 쭉 앞으로 뺀 거북이처럼 회전이 되게 되는 것이죠.

세번째 문제는 전체 부품의 부피가 너무 크다는 것인데요, RC 카 운전석 안에 장착을 해야 하는데 이런 저런 부품이 너무 자리를 많이 차지하더군요, 음...

반응형

 

2축 서보 연결을 위한 브라켓 제작하기

그래서 아주 간단한 구조에 부피도 아주 작은 2축 회전축을 만들어 보기로 하였습니다.

제 포스트를 보시는 분도 제가 만든 것처럼 구현하시면 축의 위치를 거의 같은 선상에 두고 사람의 머리처럼 제어되는 축을 만드실 수 있을 거에요.

 

서보모터2개를 연결해주는 부품 제작
최종 회전각도를 고려하여 수정

저는 3D 프린터를 이용하여 핵심 부품을 출력하였습니다만, 구조상 그냥 L 자 꺽쇠를 이용하여 만드시는 것도 가능합니다. 필요하신 크기로 가공만 하면 되는 것이죠. 

 

프린팅 중

저는 부품의 부피를 최소화 하기 위하여 서보모터의 고정 부품 안쪽으로 브라켓이 장착되도록 제작을 하였습니다.

 

출력된 프린트 물에 서보모터 부작을 위한 부품 장착

 

9g 서보모터에 부착된 상태
다른각도에서 본 모습

 

이렇게 되면 상단의 서보모터는 Y 축(상하회전)을 제어하고 하단의 서보모터는 X 축(좌우회전)을 제어하게 되는데요, 우리의 목의 구조를 봐도 보통 회전은 귀를 중심으로 머리통이 상하로 움직이고 좌우 회전은 목 전체가 회전되므로 상대적으로 제가 만든것과 유사한 구조로 움직이는 것을 알 수 있습니다. 물론 사람의 목은 대단히 유연하고 훌륭한 관절이어서 상하회전이 꼭 한군데서 이루어지는 것은 아닙니다만 유사한 움직임이 구현되기는 합니다.

제가 만든 것처럼 브라켓의 상하 길이를 작게 만들게 되면 상하 회전 움직임에 제약이 있기는 합니다. 서보모터에 부딪힐 수 있기 때문인데요, 사람의 목이 상하로 180도를 움직이지 않는 것을 고려해보면 크게 문제될 것은 없어 보입니다.

만약 서보모터의 동작 범위 전체를 커버하기를 원하시면 브라켓의 상하 길이를 서보모터의 회전 반경보다 크게 제작하면 문제 없이 동작하게 됩니다.

 

아두이노와 연결을 해보자

자 이제 아두이노로 잘 제어가 되는지 확인해 보도록 하겠습니다.

2축 제어를 위하여 간단하게 2축 아날로그 조이스틱을 연결하고 제어를 해봅니다.

연결은 아래와 같이 하시면 됩니다.

소스코드는 아주 간단합니다.

아날로그 신호를 받아 서보모터를 움직이는 기본 소스코드 그대로 약간만 응용하면 구현이 가능합니다.

다만 저처럼 상하 움직임에 제한이 있는 경우는 서보로 가는 신호에 제한을 주어야 합니다.

#include <Servo.h>

Servo myservo_LR;   // streering servo
Servo myservo_UD;  // 2speed gear box servo

int pin_servo_LR = 9;
int pin_servo_UD = 10;

int pin_x = A3;
int pin_y = A4;
int angle_x = 512 ;
int angle_y = 512 ;
void setup() {

  myservo_LR.attach(pin_servo_LR);
  myservo_LR.write (90);
  myservo_UD.attach(pin_servo_UD);
  myservo_UD.write (90);
}

void loop() {
  angle_x = analogRead(pin_x);
  angle_y = analogRead(pin_y);
  
  angle_x = map(angle_x, 0, 1024, 30, 150);
  angle_y = map(angle_y, 0, 1024, 60, 120);

  myservo_LR.write (angle_x);  
  myservo_UD.write (angle_y);

  delay(10);
  
}

90도를 기준 각도로 하여 상하는 60~120도, 좌우는 30~150도의 움직임을 범위로 하였습니다.

자 이제 테스트를 해볼까요?

 

 

 

잘 동작하네요.

 

일단 첫번째 관문은 통과한 셈 입니다.

다음 편에는 mp6050 을 이용하여 회전한 각도 만큼 서보모터를 움직이는 방법을 알아보도록 하겠습니다.

아래 링크된 글을 이용하여 바로 보실 수 있습니다.

 

그럼 이만~

 

2022.01.31 - [DIY/Arduino] - [아두이노]mpu6050 을 이용하여 2축 서보모터 제어하기

 

[아두이노]mpu6050 을 이용하여 2축 서보모터 제어하기

아두이노와 같은 마이크로 칩을 이용하여 무엇인가를 해보다 보면 정말 놀라운 경험들을 많이 하게 됩니다. 그 중 하나가 바로 mpu6050 같은 센서가 될 수 있겠습니다. 요 조그만 칩을 이용하여 기

diy-dev-design.tistory.com

 

2022.01.31 - [DIY/Arduino] - [아두이노]NRF24L01을 이용하여 무선으로 mpu6050 신호 전달하기

 

[아두이노]NRF24L01을 이용하여 무선으로 mpu6050 신호 전달하기

자 어느새 목표했던 RC headtracking FPV 만들기의 종착역을 다가가고 있습니다. 앞서 소개해 드렸던 2축 서보마운트 제작 및 서보컨트롤과 mpu6050 을 이용하여 2축 서보모터를 제어하는 내용은 잘 보

diy-dev-design.tistory.com

 

2020.06.29 - [DIY/Arduino] - C# 에서 아두이노로 시리얼 통신 하기

 

C# 에서 아두이노로 시리얼 통신 하기

카테고리를 c# 으로 해야 할지 Arduino 로 해야할지 조금 고민이 되는 포스트 입니다. 음.... arduino 로 하는게 좋겠네요. 따지고 보면 C# 으로 만든 어플이 중요한게 아니라 아두에노에서 시리얼 통신

diy-dev-design.tistory.com

 

2020.10.28 - [DIY/Arduino] - 아두이노로 아이방 스탠드 개조하기 - 자동 꺼짐 기능

 

아두이노로 아이방 스탠드 개조하기 - 자동 꺼짐 기능

아이가 유치원에서 너무나 예쁜 스탠드를 만들어 왔습니다.. AAA 건전지가 들어가는 예쁜 스탠드. 스텐드 옆면에 예쁘게 그림을 그려서 본인이 자는 방에 가져다 두고는 "오늘부터 얘가 나를 지

diy-dev-design.tistory.com

 

반응형
반응형

당근에 RC 키워드를 올려놓은지 어언 2년!

드디어 대물이 물었습니다.

무려 kyosho inferno 라는 1/8 버기와 traxxas slash 2wd 차량 두대가 3만원이라는 놀라운 금액에 올라온 것이죠.

바로 챔질하고 get!

 

이렇게 두대가 무려 3만원!! 판매자느님 감사합니다!

 

와우 ! 판매자님 너무너무 감사합니다!

 

완전 대박 거래를 성공했고 차량을 보니 일단 두대 모두 송신기는 없는 상태였고 traxxas 슬래시는 전륜 서스펜션이 축이 휘어 정상 적으로 움직이지 않는 상태였고요,  kyosho inferno 차량은 몬트에 알아보니 거의 20년이 되었다고 하네요. ㅋㅋ

kyosho inferno 차량은 엔진으로 구동하는 RC 였는데.. 구조도 생소하고... 조금 알아보니 엔진을 관리할 엄두가 나지를 않더라고요, .. 게다가 엔진이 아예 굳어 버린 상태였습니다. 플라이 휠이 꿈쩍도 하지 않았습니다. 

그래서 익숙한 전기모터와 배터리 타입으로 변경하여 사용하면 어떨까 생각이 들어 인터네을 좀 찾아 보았고.. 전동화 키트라는것을 팔고 있었습니다.

일단 몬트에 전동화 관련 문의를 해보았습니다.

답변은...

 

네.. 이런 식이네요. 20년이 넘었다는 이야기, 그냥 중고 버기를 사는게 낫다는 이야기 였습니다.

과연..

...

저런 구형 차량을 전동화 한다는 것은 어리석은 생각일까요.. 

하지만 어리석은 중생은 그럼에도 불구하고 전동화를 해보기로 합니다. 

 

20년 되었다는 이야기를 듣고 보니 구닥다리처럼 보이는 RC 카

 

일단 엔진및 구동관련 부품을 다 탈거하기로 합니다.

오래묵은 부품들을 떼어내는게 만만치가 않네요.

기름탱크 제거

 

일단 기름탱크와 간단한 부품을 떼어냅니다.

흙먼지가 엄청나네요. 

 

기름때에 늘어 붙은 흙먼지가 엄청나다

송수신기 박스와 조향용 서보마운트를 제거하는데까지 성공.

 

그런데... 엔진 블럭이 영 떨어지지 않네요.

아주 강력한 나사 본드를 이용해서 조여놓은 것 같습니다. 힘으로만 돌리려고 하니 십자 나사머리가 다 뭉개질 것 같아 특단의 조치를 취합니다.

 

바로 불.꽃.토.치!

 

나사를 풀기 위하여 토치를 이용하여 가열시켜준다.

 

다행히 하체가 금속재질이므로 부담없이 지져줍니다.

연기가 피어오를 때까지 지져 줍니다. 연기가 피어오른 다는건 나사와 블럭 사이에 발라져있었던 본드가 타고 있다는 이야기이므로 연기가 모락모락 나면 그때 다시 나사를 풀어주면 됩니다.

굳어 버린 번데기 나사를 폴때도 동일한 방법으로 열을 가해주면 쉽게 풀 수 있습니다. 나사 머리가 망가지기 전에 꼭 기억하세요~

 

엔진까지 탈거된 상태

일단 센터디프를 제외한 모든 부품 탈거 완료.

청소를 조금 해주고 센터 디프까지 떼어낸 뒤 전동화를 위한 계획을 세워봅니다.

 

깔끔해진 차체

으흠! 깨끗해졌습니다.

여기에 모터와 변속기, 배터리가 얹어지면 전동화 되는것 아닌가?? 하는 가.벼.운 생각으로 도전을 시작합니다.

 

그리고 몬트카페에서 모터와 변속기, 일명 모변이라고 하죠, 검색 신공에 들어갑니다. 역시 좋은 매물이 나오는 것을 기다려야 합니다.

사실 이정도 차량에 어떤 모변이 적당한지 감이 잘 오지 않아서 처음에는 서밋에서 탈거해서 판매하는 모변을 구해볼까 싶었습니다. 

 

그러던 와중에 하비윙 모변 세트가 나왔고 트랙사스 송수신기 세트까지 16 만원에 나온 것을 보고 낼름 구입했습니다. 어짜피 송신기도 필요하고 트랙사스 수신기가 있으면 다른 송신기가 하나 고장나도 집에 있는 트랙사스 송신기로 대체하여 사용도 가능하니까요. 

3만원에 산 차체에 16만원이 더해졌으므로 현재까지 19만원!

 

우선 기존 서보 마운트가 엔진용으로 나와서 브래이크를 담당하는 서보까지 두대의 서보를 올릴 수 있는 마운트여서 길이가 불필요하게 길더군요. 그래서 서보 하나만 딱 올릴 수 있는 마운트를 직접 제작하기로 하였습니다.

전에 18650 적출 후 분해해 놓은 폐 보조배터리 케이스를 이용하기로 합니다.

모터 마운트 제작을 위해 기존에 뜯어 놓은 보조 배터리 케이스를 활용함

 

요렇게 적당한 위치에 올려놓고 움직이지 않도록 위아래를 자석으로 대충 고정합니다.

 

그리고 스프레이를 마구 뿌려 댑니다.

스프레이가 엉망진창으로 뿌려진 모습

 

음... 표면 청소를 하지 않고 기름기가 덕지 덕지 뭍은 상태여서 그런지.. 스프레이가 영 아름답지 못하게 칠해지는 군요.

뭐 상관은 없습니다.

 

정확한 모양을 얻었다.

자 요렇게 실제 제가 필요한 모양이 정확히 전사 되었습니다. ㅋ

이제 잘라내기만 하면 됩니다.

그라인더를 이용해서 윙윙 가루를 날리며 고분분투를 하다 보면 요렇게 똭!

직접 자작한 서보 마운트&amp;amp;nbsp;

 

나오게 되죠. 

굳!

 

그사이 모터와 변속기, 송수신기가 택배로 도착하여 대충 구도를 잡기 위하여 올려 보았습니다.

모터의 위치를 어디에 하는게 좋을까 자리잡아 봅니다.

으흠~ 대충 각이 나오는 듯 합니다. 

그런데 모터를 고정시킬 마운트가 필요합니다. 하.. 진작에 시킬걸 .. 알리에 적당해 보이는 부품을 주문 하였습니다.

배터리도 올려야하니 알리에 배터리 트래이도 주문합니다.

 

 

약 2주 정도 시간이 흐른뒤 도착!

배터리 트래이.

배터리 트레이는 무려 2개가 동시에 올라가는 사이즈입니다.

4S 로 사용할 예정이었으므로 매우 굿!

 

모터 마운트
모터 마운트

2만원 정도가 추가되어 총 21만원의 투자가 이루어 졌습니다. 송수신기는 어짜피 별도로 구매했어야 하므로 15만원정도 들었다고 생각해야 할까요.

 

어쨌든... 장착을 해보려는 순간! 

바로 그 순간!

 

그런데 바닥면 구멍과 규격이 맞지 않는군요! OTL

왜 저에게 이런 시련이...

쩝...

...

음...

...

 

결국 구멍을 다시 뚫기로 합니다.

어짜피 배터리 트래이도 얹으려면 구멍 뚫는 것은 피할 수 없긴 하죠.

솔직히 정위치에 구멍을 뚫을 자신이 없기는 합니다. 드릴도 후지고 ... 보루방(탁상 드릴) 같은 공구가 있을리 없습니다.

역시나

엉망으로 위치가 안맞아 구멍을 갈아내고 난리를 쳤습니다.

 

한참을 드릴링 한 끝에... 구멍도 엉망진창이긴 하지만 결국 장착에 성공하긴 했습니다.

드디어 주요 부품 조립 완료

 

모변의 무게와 배터리 2개의 무게가 비슷 하길레 무게 균형을 맞추기 위하여 양쪽으로 배치를 하였습니다.

ESC (변속기) 는 양면 테이프로 붙이기로 합니다.

모든게 완벽하지는 않았지만 그래도 예상했던 모든 부품 장착완료!!

 

모터 및 배터리가 장착 완료된 상태

 

오 제법 모양이 나옵니다. 단단하게 고정이 되었습니다.

모터를 동작시켜보니 엄청난 굉음과 함께 엄청난 속도로 바퀴가 회전합니다!

 

끼얏홋~

 

드디어 전동화 성공!!

 

20년된 엔진 RC 카 드디어 전동화 완료!

 

20만원에 전동화 버기카가 손에 들어온 셈 입니다. 

뭐 생각보다 저렴하지는 않았지만 매우 즐거운 경험이었습니다.

 

 

 

그리고 첫 출격!!!

 

두구두구두구

 

두구두구

 

위~~~~잉~~~!!!

 

슝~~~~

 

 

첫출격에 바퀴 3개가 한꺼번에 와장창! 깨져버인 인퍼노!

 

 

 

 

 

 

 

 

 

 

집을 나선지 3분만에 저 얕은 턱에 걸리면서 바퀴가 와장창 부서져 버렸습니다 ㅜㅜ

20년된 플라스틱이 다 썩었나봅니다. 100년이 지나도 썩지 않는다던 플라스틱!

이건 뭐 포스틱처럼 바사삭 부서졌네요. 

 

네 이제야 카페에서 새로 사는게 낫다는 이야기가 머릿속을 스칩니다.

인터넷을 바퀴를 주문하려고 보니 휠 hex 가 사이즈가 안맞는군요.

 

네.... 20년 전에 비하여 규격이 바뀌었나 봅니다. 

제 인퍼노는 17mm 가 아닌 19mm 헥스 고정 부품이고 19mm 부품은 파는 곳이 없군요. 세월이 흐른만큼 규격이 바뀌었나 봅니다.

어찌어찌 17mm 헥스 부품과 바퀴를 주문했는데.. 또 기다림의 시작입니다.

결국 돈이 줄줄 들어가게 생긴걸까요... ㅜㅜ

이래서 사람들이 하는 이야기를 잘 들어야 합니다. 

좋은 경험이었고 어짜피 바퀴도 주문한 이상 이제는 다시 장창해서 즐길 수 있기만을 기다려 봅니다.

이상으로 엔진 RC 전동화 이야기를 마칩니다. 

전동화 컨버전 완료된 모습

그럼 이만~

 

 

2020.11.29 - [DIY/RC] - 1/24 완벽한 RC 카 RGT ADVENTURE

 

1/24 완벽한 RC 카 RGT ADVENTURE

rock crawler 라는 단어를 안다면 당신은 이미 로맨티스트. 네 그렇습니다. 일반인은 흔히 접하는 용어는 아니지만 RC 카에 관심이 조금이라도 있는 분은 아주 익숙한 단어일거에요. SCX10 으로 시작

diy-dev-design.tistory.com

 

2020.01.20 - [DIY/PaperCraft] - JEEP WRANGLER RC BODY on HS18311

 

JEEP WRANGLER RC BODY on HS18311

대륙의 실수라고 제가 올린 중국산 RC 카 모델이 있습니다. HS18311 인데요. 썬더 스톰이라는 녀석이죠. 2019/12/23 - [DIY/RC] - [대륙의 실수] 가성비 RC 카 Storm Thunder, HS118311 [대륙의 실수] 가성비 RC..

diy-dev-design.tistory.com

 

 

반응형

+ Recent posts