이종훈's 작업실

Log +736

부팅시 HELLO를 한번 띄우도록 했습니다. 





디스플레이를 구현했으니 이제 기능을 하나씩 덧붙여갑니다. 

처음에는 온도센서 값을 시리얼로 출력해보니 역시나! 제대로 작동하지 않는군요.

왜 아무리 간단하고 몇번씩 해본 것이라도 처음엔 꼭 버그를 낼까요?

확인해보니 100k 써미스터인데 같이 연결하는 저항을 10K 로 연결해놓았습니다.

거기다 스케치는 number[digitTemp[i]] 를 출력해야 하는데 digitTemp[i] 를 출력하도록 했더군요.


이제 온도는 잘 표시됩니다.





Comment +0

회로제작과 프로그래밍을 번갈아가면서 하다보니 혼란이 오네요.

정리할겸 조금 자세히 써봅니다



첫번째 74HC595가 글자 및 LED 표시를, 두번째 74HC595가 자리수 담당을 합니다.

Common Anode라서 표시해야 하는 위치의 세그먼트가 0이 됩니다. 




A3~A9까지의 LED와 B,C,D,E 4자리의 숫자 표시를 합니다.

F0,F14,A3 LED는 사용하지 않습니다. 

알파벳 핀이 공통 Anode 입니다. 







전체 연결은 다음과 같습니다. 






숫자가 한번에 표시되는게 아니고 각 자리의 신호가 순차적으로 들어가게 됩니다.

이를 위해서 숫자를 분리해서 표시하는 스케치를 간단하게 짜봤습니다. 






그랬더니 이상하게 나오는군요. 1000이 999로, 100이 99로 나옵니다.

for 문에서 증가하는 i를 이용해서 스케치 길이를 줄이려 했습니다.

pow() 함수에서 내부적으로 처리할 때 float로 처리되는건지 엉뚱한 결과값이 나오네요







수정했습니다. 정상적으로 나오는군요. 








이후 수정된 스케치를 아두이노에 업로드했더니 이상하게 나옵니다. 







원인을 찾는 중입니다. 





저는 74HC595를 연결할 때 첫번째 74HC595가 숫자를 담당하고 두번째가 자리수를 담당하도록 했습니다. 

shiftOut(dataPin, clockPin, LSBFIRST, A);  

shiftOut(dataPin, clockPin, LSBFIRST, A);  

그래서 위의 구문에서도 첫번째 ShiftOut이 숫자, 두번째가 자리수일줄 알았더니 아니더군요.

LSBFIRST / MSBFIRST 와 상관없이 첫번째 ShiftOut이 자리수를 표시하고 두번째가 숫자를 표시합니다.




수정이후 숫자가 제대로 표시됩니다. 

보기엔 동시에 전부 들어오는 것 같아 보이지만 실제로는 왼쪽부터 순서대로 빠르게 깜박이고 있는 상태입니다.








마지막으로 디스플레이될 LED의 데이터 처리를 합니다. 

왼쪽3개의 LED는 배터리 잔량표시용으로 오른쪽은 히터의 상태를 나타낼 예정입니다.

배터리 관련 변수나 히터 상태의 변수가 따로 쓰일 테니 스케치에선 따로 취급됩니다.

하지만 디스플레이될때는 하나의 Anode로 묶인 LED들이라 출력신호를 묶어야 합니다. 


별거 없고 그냥 논리합(and)을 하면 됩니다. 

SignalLED = BatLevel[i]&HeatLevel[j]; 

같은 식으로 사용하게 되겠죠







스케치를 올려보니 이제 LED까지 잘 나옵니다. 

왼쪽 끝의 LED들은 사용하지 않을 예정입니다. 

글루건인데 정보가 그리 많을 필요가 없죠






눈으로는 잘 구별가지 않지만 흔들어보면 이렇게 깜박임이 발생하는게 보입니다. 



Comment +0



하드웨어 스펙이 확실히 정해져 있어야 아두이노 스케치 작성이 편합니다.

이글캐드에서 그냥 패드로 연결하려다가 심볼이 확실히 있어야 보기 편할 것 같아서 라이브러리를 작성했습니다. 

라이브러리를 만들어도 이 FND 재고가 대여섯개 뿐이라 많이 쓸일은 없겠죠





74595(A)가 LED를 제어하고 74595(B)가 common anode를 담당해서 각 자리를 점등합니다.

다만 좌우로 있는 별개의 LED중 두어개는 74595(A)의 신호선이 모자라 연결하지 않기로 했습니다. 

74595(B)에서 담당할 수도 있지만 그러면 제어신호를 복잡하게 줘야 하네요.


이렇게 할 경우의 문제는 각 세그먼트를 모두 동시에 디스플레이하는건 힘들다는 것입니다.

4자리의 숫자를 다르게 디스플레이 하려면 각 자리를 순차적으로 표시해야 합니다.


각 자리를 켜서 표시하고 끈 후 다시 다음 자리를 켜서 표시하는 방식입니다

이걸 피하려면 각 자리마다 74595를 하나씩 배당해야 하죠.

그러면 4자리+표시 LED까지 최소5개의 74595칩을 넣어야 합니다.






원래 생각했던 것과 연결이 달라져서 출력신호를 다시 기록했습니다.

다 해놓고 보니 별도의 LED 신호는 생각 안한거라 또 추가해야 하네요;;








하드웨어가 없이는 스케치를 업로드해서 테스트해볼수가 없죠

브레드보드에 연결하는 방법도 없는 건 아닙니다.

하지만 그럴 경우 수정도 너무 정신없고 정신없어서 에러도 많이 납니다.

만드는 공이 더 들어도 아예 회로를 구성하는게 더 편하고 빨리 끝나는 것 같습니다. 







1차로 만든 회로는 글루건 내장용이라 너무 작아서 CNC로 잘 깎이지가 않더군요

부품을 DIP으로 바꾸고 테스트용으로 별도의 회로를 만들었습니다. 








이제 열심히 스케치를 짜야겠군요

Comment +0

Hakaday 피드를 읽다가 흥미로운 게 있어서 정리해봤습니다.





Spectrum Analyzer 앱 링크: https://play.google.com/store/apps/details?id=com.raspw.SpectrumAnalyze

무료앱입니다. 모든 기능 제한 해제하는 인앱 구매는 0.99$




테스트를 위해 DC 모터와 RPM미터를 준비했습니다.

모터축에는 종이를 테이프로 붙였습니다. 

이렇게 하면 풍절음이 발생하기 때문에 스펙트럼 애널라이저에도 잘 측정되고 빛 반사로 RPM미터에도 잘 측정됩니다. 







RPM미터로는 14491RPM 이 나왔군요.





앱을 처음 실행하고 모터음을 측정하면 이렇게 보입니다.






줌 아웃을 해서 더 넓게 보면 우측에 뾰족한 피크(Peak) 패턴이 보이는 걸 알 수 있습니다. 







이 피크들 사이의 간격을 알면 됩니다.







줌인하고 손으로 이동시켜서 정확한 수치를 읽습니다.

6,747Hz 가 나오는군요.






옆 피크의 Hz는 6,507Hz 가 됩니다. 

그러면 간격은 6747 - 6507 = 240Hz 입니다. 






더 정확하게 재고 싶으면 여러 피크들 간의 간격을 평균 내면 됩니다. 

여기서는 7,230Hz





5칸 옆의 피크는 6020 입니다. 

그러면 ( 7230 - 6020 ) /5 = 242Hz 가 되겠네요



Hz 란 , 1초에 몇 번 진동하는가 하는 진동수의 단위입니다. 

242Hz 는 1초에 242번 진동한다는 뜻이죠.

모터의 회전소리가 1초에 242번 들린다는 겁니다.

우리가 알고 싶은 것은 RPM 으로 1분에 몇 번 회전하는가 하는 수치입니다.

1분은 60초 이므로 Hz 에 60을 곱하면 됩니다.


242 * 60 = 14,520 RPM 이 나오네요


RPM 미터로 잰 14491 과 거의 같은 수치가 나오는 걸 볼 수 있습니다. 


그 외에도 다른 방식으로도 측정할 수 있습니다.

칼날이 3개짜리인 회전공구의 경우 나누기 3 을 해야 합니다.

띠톱 같은 긴 형태의 공구는 길이당 칼날 수를 세서 계산하면 됩니다. 

풍절음이 어떻게 발생하는가 생각하면 여러 기구의 측정에 사용할 수 있을 것 같습니다.

Comment +0

만물상(링크) 에서 구매했던 미니 세그먼트 디스플레이입니다. 

이걸 보며 다시금 생각하니 전 복고형 디스플레이에 로망이 있는듯 합니다.

VFD 나 닉시 튜브같은거 참 좋아합니다. 

그래도 막상 쓰려면 일단 실용성이 좋아야 해서 닉시 튜브같은건 안쓰지만요.









개발을 위해 일단 납땜을 합니다. 


위 구매링크에 정보가 있었는데 그걸 보기 전이라 일일이 훑어가며 추적해서 기록했습니다.

이제 이걸 제어하기 위한 방법을 알아봐야 하겠군요.







바로 얼마전 구입해둔 MAX7219 칩을 사용해 드라이빙하려고 했습니다.

그런데 데이터쉬트를 읽어보니 MAX7219 는 common cathode 용이네요..

음극을 제어해 on/off 를 하기 때문에 제가 common anode 형 FND로는 맞지가 않습니다. 


http://marco-difeo.de/2013/02/21/drive-max7219max7221-with-common-anode-displays/

조금 검색해보니 MAX7219를 이용해 common anode를 제어하는 방법도 있는것 같습니다.

하지만 제가 전혀 이해할 수 없는 내용이라 다른 방법을 찾아봅니다.





http://www.hardcopyworld.com/ngine/aduino/index.php/archives/2826 

이 링크를 참조해서 74_595 쉬프트 레지스터를 사용하기로 합니다. 


https://www.lelong.com.my/8-digit-74hc595-segment-7-red-led-display-shift-ioline-150002647-2018-05-Sale-P.htm 

http://www.instructables.com/id/Arduino-powered-7-seg-LED-display-using-Shift-Regi/

이 링크도 읽어보며 공부합니다. 


간만에 카페에서 작업하며 정리해 봤습니다. 




출력을 위해선 데이터를 int형에서 char 형으로 변경할 필요가 있습니다.

https://www.instructables.com/id/Converting-integer-to-character/

이 방법을 사용합니다.



Comment +0

글루건은 별로 좋아하지 않는 공구입니다.

접착성이 아주 좋은것도 아니고 마무리가 깔끔하지도 않고

수정하거나 제거하는것이 어렵습니다. 

구조의 간단함에 비해 쓰기도 거추장스러운 편입니다. 

그래도 가끔 필요할때가 없지는 않은 그런 공구죠.


모 카페에서 우연히 이런 제품을 공구했던걸 보고 

사용상의 불편함을 어느정도 덜어줄 수 있을 것 같다는 생각이 들었습니다.

공구는 끝나서 알리익스프레스에서 구매했는데 9.57$ 였습니다. 








1.5V AA배터리가 4개 직렬로 들어갑니다. 








구조는 그냥 스위치 on/off 에 LED 하나가 연결된 구조입니다. 

심지어 납땜이 제대로 안되어 스위치에 전선이 연결되어있질 않네요






18650배터리를 넣을 생각이라서 내부를 갈아냅니다. 








내부를 잘 갈아내면 아슬아슬하게 18650이 2개 들어갑니다. 

직렬로 만들면 빠르게 예열되어 신속하게 사용할 수 있죠.

병렬로 만들면 작업시간이 길어져 오랫동안 작업할 수 있을겁니다. 

어느쪽이 나을지 테스트를 위해 자작 온도센서(링크)를 붙였습니다. 







5V 공급시 0.5A 정도를 소모합니다. 







20분이 넘어서야 간신히 90도를 넘더군요

나오는 글루도 덜 녹아서 뻣뻣합니다. 

배터리 1개로는 최대 4.2V 밖에 나오지 않으니 이대로는 쓸 수 없고 승압회로를 붙여야 합니다.







2개 직렬전압을 설정하면 빠르게 가열되어 3분안에 100도를 초과합니다. 









2배터리를 병렬로 잡고 승압회로를 연결해 봤습니다.

사용시간과 빠른 예열시간을 동시에 잡을 수 있지 않을까 하는 생각이었습니다.







이때 전류는 거의 1A 정도 됩니다.







이 경우 승압회로가 너무 뜨거워져 여기에도 온도센서를 붙여봤습니다.(만들자마자 잘 써먹는군요)

승압회로 부품중 인덕터의 온도(CH1)가 히터(CH3)보다 빠르게 올라가네요.


아두이노를 넣을 생각이었는데 제어를 모두 아두이노에 맡길 생각입니다.

2개 직렬로 하고 온도센서를 붙여 제어를 아두이노가 처리하도록 하면 배터리 관리와 빠른 가열의 두마리 토끼를 잡을 수 있을 것 같습니다. 



Comment +0

BigNumber는 큰 수 처리에 정말 좋은 라이브러리지만 

초보자를 위한 라이브러리는 아닌 듯.



참조1)

loop 바깥에서

BigNumber a="1234567890.0987654321"; 로 전역선언후 시리얼로 출력해 보면

a=1234567890

로 나온다. 


BigNumber a=1234567890.0987654321; 로 따옴표를 떼면

a=32767로 나옴. 



특이하게도 

BigNumber a='1234567890.0987654321'; 로 홑따옴표를 붙이면

a=12849가 된다. 


BigNumber a="1234567890.0987654321"; 를 loop 안쪽에서 선언하면 

a=1234567890.0987654321 로 제대로 나온다.



BigNumber a = "123556.2342" 형태나 BigNumber a ("143563245.21345245") 형태로 사용해야 한다. 

이 라이브러리는 숫자를 String 취급하는 것 같은데 

그렇다고 실제로 String으로 생각하고 스케치를 하면 오류를 뿜는다. 

문자열 길이를 측정하는 length() 같은 함수를 쓸 수 없다. 




참조2)

LED 디스플레이에 숫자 표기를 정확히 하기 위해서는 숫자의 자리수가 얼마인지 셀 수 있어야 한다.

디스플레이의 자릿수를 벗어나면 정리해 주어야 한다.


숫자의 길이를 측정하려면 
char s = n.toString();  //n을 문자열로 치환하여 s에 저장

length = strlen(s);        //s의 길이를 구하여 length에 저장

같은 식으로 사용해야 한다. 


하지만 이 경우 소수점이 포함되어 계산되므로 

1 -> 1자리수

1.00 -> 4자리수 로 계산되는 문제가 있다.



문제1)

1이상의 수는 어떻게든 처리가 가능하다.

하지만 1 미만의 수는 소수점 때문에 처리가 매우 곤란해진다. 

1 = 1.0000000 과 같이 나오는데 이 경우 0.000000을 어떻게 처리해야 하는가?


문제2)

소수점 이하의 수는 자리수를 어떻게 계산하는가?

1 이상의 수는 10씩 나눠가면서 그 수가 0보다 큰지 아닌지 체크하고
0보다 크면 다시 10 나누는 식으로 자릿수를 계산할 수 있다.

456 
10을 나눈다. = 45.6   (1회)
1보다 큰가? ->yes
10을 나눈다 = 4.56    (2회)
1보다 큰가? ->yes
10을 나눈다 = 0.456  (3회)
1보다 큰가? ->no

3회 반복했으므로 자릿수는 3

하지만 1보다 작은 수는 어떻게 처리해야 하는가?
ex)0.000123


추측1)

123.456을 123 과 0.456으로 분리할 수 있다면 위의 문제들을 해결하기 쉬울 것 같다.
분리하는 방법은?



http://cafe.naver.com/arduinostory/52325


https://arduino.stackexchange.com/questions/1013/how-do-i-split-an-incoming-string





Comment +0

케이스를 자르고 다듬어가며 맞춰봅니다.







케이싱 작업을 끝내고 온도 보정을 위해 측정해 봤습니다. 

상황에 따라 다르긴 한데 1도 정도 높게 나오는 편이네요







스케치를 수정하고 다시 업로드해 줍니다







갖고있던 범폰을 다 쓴지라 3M 범폰을 한세트 구매해 봤는데 좋네요.







나머지 빈칸엔 배터리 전압표시라도 할까 생각했습니다.

AAA배터리로 변경해서 그것도 딱히 중요하진 않고 당분간 이대로 쓸 생각입니다


Comment +0


Attiny85로 진행을 하다가 Arduino pro mini로 변경했습니다.

그런데 중간에 전원을 잠깐 반대로 넣었더니 이번에는 LCD I2C 보드가 죽었습니다.

원래 고장났던 걸 한번 고쳤던 것이라 아예 떼어냈습니다.

프로 미니로 변경하면서 보드 구겨넣기도 힘들었던지라 eagleCAD로 새로 보드를 제작합니다.












그리고 CNC로 깎아냈습니다.








점퍼 작업하고요







아두이노 프로 미니의 보드에는 Aref 핀이 나와있지 않기 때문에

20번 핀에서 Aref 선을 따로 뺍니다.






기본 전원에서 LM1117-3.3V 를 통과하여 레퍼런스 전압을 만들었습니다.

이제 보니 컨덴서 한두개 정도는 넣어줄걸 그랬군요.






LM1117에서 나온 Aref 전원을 아두이노와 센서에 연결하고 

스케치의 setup에서 Aref 설정을 했습니다. 








전체적으로 납땜을 하고 스케치 수정을 마무리했습니다. 

케이스를 변경해서 AAA 건전지 3개를 집어 넣을 수 있도록 만들었습니다.

자주 쓰지는 않을 것 같아서 리튬 집어넣기는 애매하더군요.







LCD 칸이 여유가 없어서 가독성이 안좋습니다. 







라벨링을 하고 가운데에 네임펜으로 선을 그어 구별했습니다. 









잘 되는군요. 온도는 0.8~1도 정도 높게 나오는 것 같아 보정이 필요할 것 같습니다.

케이싱만 하면 끝납니다. 

Comment +0

가끔 물체 표면의 온도를 봐야 할 필요가 있습니다. 



현재 위와 같은 온도계를 갖고 있습니다. 

편하고 쓰기 좋습니다만 가끔 아주 좁은 포인트의 온도를 재야 하거나 

좁은 면적 안에서 작은 부품 한두개의 온도를 측정하기엔 무리가 있죠.







괜히 이런 장비를 쇼핑몰에서 뒤적여 봅니다.

갖고는 싶지만 가격도 가격이고 제가 쓸일이 많지도 않습니다. 

특정 포인트 두어군데의 온도만 확인하면 됩니다. 

그래서 그냥 만들기로 합니다. 





온도측정 센서로는 흔하게 쓰는 3D 프린터의 100K 써미스터가 있습니다. 

하지만 약간 원형이고 유리로 쌓여있어 실제로 쓰면 측정시에 약간 딜레이가 있습니다. 





같은 물건이지만 박막형으로 된 100K 써미스터가 있습니다.

표면이 필름만으로 둘러쌓여있어 온도센싱이 빠릅니다.

테이프로 그냥 표면에 붙이면 온도를 빠르고 정확하게 측정할 수 있습니다.







알리에서 주문했습니다. 







온도 디스플레이만 하면 됩니다.

OLED 디스플레이와 8*2 character LCD 사이에서 고민하다

LCD은 이럴 때 안쓰면 쓸일이 없을 것 같아 LCD를 쓰기로 합니다.







아날로그 입력과 LCD 출력용 I2C 통신만 하면 되기에

Attiny85 보드를 사용하기로 결정합니다. 

이런 단순한 프로젝트에 쓰기 딱이지요

(... 라고 생각했었습니다)






배터리를 내장해서 완전 휴대용으로 만들지

USB 입력을 전원으로 쓸지 고민을 했습니다.

일단은 USB 전원으로 진행하고 마지막에 결정해야겠습니다.




부품함에서 케이스로 쓸 깡통을 골라봅니다.







대충 맞는것을 확인합니다.







I2C LCD 테스트입니다.






본격적으로 스케치를 합니다.

100K 써미스터를 아두이노에서 사용하는 방법를 검색해보면 자료가 많이 나옵니다.

저는 Adafruit(링크) 의 자료를 참조했습니다.




몇번 수정하고 업로드하며 테스트하다가 2개의 Attiny보드가 날아갔습니다.

특별한 일이 없는데도 불구하고 갑자기 작동이 안됩니다.

이렇게 쌓인 보드가 4개가 되었습니다.




새다리님의 블로그(링크)를 참조하여 펌웨어를 다시 구워봅니다.


안되는군요.






이리저리 다시 체크해 보지만 안됩니다. 

결국 다른 새 Attiny85로 진행해 보다가 황당한 결과가 나왔습니다.

2개의 아날로그 입력을 동시에 진행하면 옆의 센서에 영향을 받아서 값이 오르락 내리락 합니다.

여러가지로 수정해 봤지만 역부족이라 포기하고 Arduino Pro Mini로 보드를 바꿔 다시 진행하려 합니다.



Comment +0

얼굴에 고글을 뒤집어쓰면 안면부에 땀이 꽤 납니다. 

고글에 통기구가 있긴 하지만 통풍이 원활치 않아서 소형 팬을 달았습니다. 






어디서 분해해놨는지 모르겠는 소형 블로워 5V 팬.

5V 라 리튬건전지 하나로 돌릴 수 있어서 좋습니다.

얇고 빳빳한 종이 찾다가 재활용쓰레기통에서 애들 장난감 박스 추출.






막상 잘라보니 제대로 되지 않아서 팜플렛 종이로 교체했습니다. 







모양 잘라서 맞추고 순간접착제로 팬과 결합 후.

기기에 고정하는건 3M 양면접착제로 해서 나중에 깨끗하게 뗄 수 있습니다. 







내부에 먼지거름용 스폰지가 두껍게 있는데 공기순환에 너무 방해되는 듯 하여 

떼어서 옆으로 붙여놨습니다. 혹시나 필요없게 되면 다시 쓸수 있게요.

스폰지가 없으면 위에서 빛이 들어오는 것이 바로 보이기 때문에 VR 사용시 방해가 됩니다. 

팬만 장착하면 틈새로 약간 빛이 들어오긴 하는데

얼굴에 썼을 때는 빛이 전혀 보이지 않습니다. 









배터리는 18650 하나를 전면에 양면테잎으로 붙였습니다. 

완성사진은 없네요. 

사용해 보니 특히 눈에 땀 맺히는게 없어져서 좋습니다. 

Comment +0



숫자를 입력할 때마다 한자리씩 늘어나므로 

LED 디스플레이의 커서 위치는 한자리씩 이동해야 합니다. 


length() 함수를 이용해서 커서 위치를 계산해 표시하도록 했습니다.

그랬더니 일정 자릿수가 넘어가면 자릿수가 엉뚱하게 0이 되더군요.

모니터링을 해 봤더니 string 형식의 범위를 벗어나는 문제였습니다. 

BigNumber 사용하느라 생각을 못 했는데 이것도 어찌보면 당연히 발생되는 문제죠.



추가로 생각을 하다 보니 134123456.134526 같이 소수점 자리수가 늘어나면 그에 대한 처리도 해야 합니다. 

숫자를 제대로 체크하려면 BigNumber 함수에서 소수점 이하 자리수를 정확하게 알아야 합니다. 

BigNumber::setScale(3) 으로 하면 100 이 100.000으로 표시됩니다. 



한참 고민을 하다가 자리수를 계산하는 별도의 함수를 만들면 된다는 생각이 들었습니다. 

12341234 를 10씩 나눠가면서 1보다 크거나 같은지 계산하고

1보다 작아지는 순간 이 과정을 몇번 반복했는지 체크하면 자리수를 알아낼 수 있습니다.

반면 소수점 이하 자리수는 이렇게 체크할 수가 없습니다. 

어찌어찌 하면 될 것 같은데.. 머리속에서 맴돌기만 하고 구체화가 안되네요.

이건 조금 더 고민해 봐야겠습니다. 












Grang Total, MR, +-*/ 등의 일반 계산기에서 보여주는 표시를

LED로 표시하도록 했습니다. 

5개의 핀으로 끝내려 했는데 Low BAT 표시등도 넣어야 해서 

6개의 핀으로 3*3 매트릭스를 만들려고 테스트해봤습니다. 


사칙연산 표시는 그냥 디스플레이에 같이 표기해도 되는지라 LED를 넣을지 뺄지 생각중입니다. 

Comment +0


VR 기기를 구매해서 한동안 빠져 살았습니다. 

오랫동안 갖고 싶었던 기계인데 너무 비싸서 구매를 주저하고 있었죠.

블프 세일때 저렴하게 올라와서 구매를 결정했습니다. 










그래도 최근 며칠간은 계산기 스케치를 다시 파고들었습니다. 아주 조금이지만요.

BigNumber 라이브러리와 LedDisplay 라이브러리를 조합해서 쓰려니 자료형과 변수형이 머릿속에서 마구 꼬입니다.






키패드 누르는 대로 첫번째 숫자가 자릿수 올라가며 디스플레이되고 있습니다. 

겨우 한걸음 떼었네요 

Comment +0

아두이노에서 10여자리 이상의 큰 수나 소수점 이하의 수를 처리하는 문제는

며칠간의 공부 끝에 내 능력으로는 힘들겠구나 하고 결론을 내렸습니다;


그래서 계속 구글링을 했는데 며칠간의 검색 끝에 결국 괜찮은 라이브러리를 찾았습니다.

https://github.com/nickgammon/BigNumber


BigNumber.zip


원문 도큐먼트가 개발자 개인 블로그 에 있길래 혹시 사라질 지 몰라 카피했습니다. 

일단 예문과 결과값을 보면 제가 원하는 부분을 확실히 해결해 줄 수 있을 듯 합니다. 


우린 답을 찾을 것이다. 늘 그랬듯이. 구글에서.


 

Posted byNick Gammon   Australia  (21,293 posts)  [Biography] bio   Forum Administrator
DateTue 31 Jan 2012 09:00 PM (UTC)

Amended on Sat 23 Aug 2014 03:49 AM (UTC) by Nick Gammon

Message
I love big numbers ... they are so ... big!

So in the spirit of getting your Arduino to handle nice, big, numbers I have ported (with pretty minimal effort on my part) the GNU "bc" library to an Arduino library. This can be downloaded from:

http://www.gammon.com.au/Arduino/BigNumber.zip

Just unzip into your "libraries" folder.

Also now available from GitHub:

https://github.com/nickgammon/BigNumber

Factorials


Example sketch:


// BigNumber test: factorials
#include "BigNumber.h"

// function to display a big number and free it afterwards
void printBignum (BigNumber & n)
{
  char * s = n.toString ();
  Serial.println (s);
  free (s);
}  // end of printBignum

void setup ()
{
  Serial.begin (115200);
  Serial.println ();
  BigNumber::begin ();  // initialize library
 
  //factorials
  BigNumber fact = 1;

  for (int i = 2; i <= 200; i++)
  {
    Serial.print (i);
    Serial.print ("! = ");
    fact *= i;
    printBignum (fact);
  }

}  // end of setup

void loop () { }



Output from above:


2! = 2
3! = 6
4! = 24
5! = 120
6! = 720
7! = 5040
8! = 40320
9! = 362880
10! = 3628800
11! = 39916800
12! = 479001600
13! = 6227020800
14! = 87178291200
15! = 1307674368000
16! = 20922789888000
17! = 355687428096000
18! = 6402373705728000
19! = 121645100408832000
20! = 2432902008176640000
21! = 51090942171709440000
22! = 1124000727777607680000
23! = 25852016738884976640000
24! = 620448401733239439360000
25! = 15511210043330985984000000
26! = 403291461126605635584000000
27! = 10888869450418352160768000000
28! = 304888344611713860501504000000
29! = 8841761993739701954543616000000
30! = 265252859812191058636308480000000
31! = 8222838654177922817725562880000000
32! = 263130836933693530167218012160000000
33! = 8683317618811886495518194401280000000
34! = 295232799039604140847618609643520000000
35! = 10333147966386144929666651337523200000000
36! = 371993326789901217467999448150835200000000
37! = 13763753091226345046315979581580902400000000
38! = 523022617466601111760007224100074291200000000
39! = 20397882081197443358640281739902897356800000000
40! = 815915283247897734345611269596115894272000000000
41! = 33452526613163807108170062053440751665152000000000
42! = 1405006117752879898543142606244511569936384000000000
43! = 60415263063373835637355132068513997507264512000000000
44! = 2658271574788448768043625811014615890319638528000000000
45! = 119622220865480194561963161495657715064383733760000000000
46! = 5502622159812088949850305428800254892961651752960000000000
47! = 258623241511168180642964355153611979969197632389120000000000
48! = 12413915592536072670862289047373375038521486354677760000000000
49! = 608281864034267560872252163321295376887552831379210240000000000
50! = 30414093201713378043612608166064768844377641568960512000000000000
51! = 1551118753287382280224243016469303211063259720016986112000000000000
52! = 80658175170943878571660636856403766975289505440883277824000000000000
53! = 4274883284060025564298013753389399649690343788366813724672000000000000
54! = 230843697339241380472092742683027581083278564571807941132288000000000000
55! = 12696403353658275925965100847566516959580321051449436762275840000000000000
56! = 710998587804863451854045647463724949736497978881168458687447040000000000000
57! = 40526919504877216755680601905432322134980384796226602145184481280000000000000
58! = 2350561331282878571829474910515074683828862318181142924420699914240000000000000
59! = 138683118545689835737939019720389406345902876772687432540821294940160000000000000
60! = 8320987112741390144276341183223364380754172606361245952449277696409600000000000000
61! = 507580213877224798800856812176625227226004528988036003099405939480985600000000000000
62! = 31469973260387937525653122354950764088012280797258232192163168247821107200000000000000
63! = 1982608315404440064116146708361898137544773690227268628106279599612729753600000000000000
64! = 126886932185884164103433389335161480802865516174545192198801894375214704230400000000000000
65! = 8247650592082470666723170306785496252186258551345437492922123134388955774976000000000000000
66! = 544344939077443064003729240247842752644293064388798874532860126869671081148416000000000000000
67! = 36471110918188685288249859096605464427167635314049524593701628500267962436943872000000000000000
68! = 2480035542436830599600990418569171581047399201355367672371710738018221445712183296000000000000000
69! = 171122452428141311372468338881272839092270544893520369393648040923257279754140647424000000000000000
70! = 11978571669969891796072783721689098736458938142546425857555362864628009582789845319680000000000000000
71! = 850478588567862317521167644239926010288584608120796235886430763388588680378079017697280000000000000000
72! = 61234458376886086861524070385274672740778091784697328983823014963978384987221689274204160000000000000000
73! = 4470115461512684340891257138125051110076800700282905015819080092370422104067183317016903680000000000000000
74! = 330788544151938641225953028221253782145683251820934971170611926835411235700971565459250872320000000000000000
75! = 24809140811395398091946477116594033660926243886570122837795894512655842677572867409443815424000000000000000000
76! = 1885494701666050254987932260861146558230394535379329335672487982961844043495537923117729972224000000000000000000
77! = 145183092028285869634070784086308284983740379224208358846781574688061991349156420080065207861248000000000000000000
78! = 11324281178206297831457521158732046228731749579488251990048962825668835325234200766245086213177344000000000000000000
79! = 894618213078297528685144171539831652069808216779571907213868063227837990693501860533361810841010176000000000000000000
80! = 71569457046263802294811533723186532165584657342365752577109445058227039255480148842668944867280814080000000000000000000
...



Powers



// BigNumber test: powers
#include "BigNumber.h"

// function to display a big number and free it afterwards
void printBignum (BigNumber & n)
{
  char * s = n.toString ();
  Serial.println (s);
  free (s);
}  // end of printBignum


void setup ()
{
  Serial.begin (115200);
  Serial.println ();
  BigNumber::begin ();  // initialize library

  Serial.println ("--- powers of 2 ---");
  
  BigNumber a = 2;

  for (int i = 1; i <= 300; i++)
  {
    Serial.print ("2^");
    Serial.print (i);
    Serial.print (" = ");
    BigNumber p = a.pow (i);
    printBignum (p);
  }  // end of for loop

  Serial.println ("--- powers of 3 ---");
  
  a = 3;

  for (int i = 1; i <= 300; i++)
  {
    Serial.print ("3^");
    Serial.print (i);
    Serial.print (" = ");
    BigNumber p = a.pow (i);
    printBignum (p);
  }  // end of for loop

}  // end of setup

void loop () { }


Output from above:


--- powers of 2 ---
2^1 = 2
2^2 = 4
2^3 = 8
2^4 = 16
2^5 = 32
2^6 = 64
2^7 = 128
2^8 = 256
2^9 = 512
2^10 = 1024
2^11 = 2048
2^12 = 4096
2^13 = 8192
2^14 = 16384
2^15 = 32768
2^16 = 65536
2^17 = 131072
2^18 = 262144
2^19 = 524288
2^20 = 1048576
2^21 = 2097152
2^22 = 4194304
2^23 = 8388608
2^24 = 16777216
2^25 = 33554432
2^26 = 67108864
2^27 = 134217728
2^28 = 268435456
2^29 = 536870912
2^30 = 1073741824
2^31 = 2147483648
2^32 = 4294967296
2^33 = 8589934592
2^34 = 17179869184
2^35 = 34359738368
2^36 = 68719476736
2^37 = 137438953472
2^38 = 274877906944
2^39 = 549755813888
2^40 = 1099511627776
2^41 = 2199023255552
2^42 = 4398046511104
2^43 = 8796093022208
2^44 = 17592186044416
2^45 = 35184372088832
2^46 = 70368744177664
2^47 = 140737488355328
2^48 = 281474976710656
2^49 = 562949953421312
2^50 = 1125899906842624
2^51 = 2251799813685248
2^52 = 4503599627370496
2^53 = 9007199254740992
2^54 = 18014398509481984
2^55 = 36028797018963968
2^56 = 72057594037927936
2^57 = 144115188075855872
2^58 = 288230376151711744
2^59 = 576460752303423488
2^60 = 1152921504606846976
2^61 = 2305843009213693952
2^62 = 4611686018427387904
2^63 = 9223372036854775808
2^64 = 18446744073709551616
2^65 = 36893488147419103232
2^66 = 73786976294838206464
2^67 = 147573952589676412928
2^68 = 295147905179352825856
2^69 = 590295810358705651712
2^70 = 1180591620717411303424
2^71 = 2361183241434822606848
2^72 = 4722366482869645213696
2^73 = 9444732965739290427392
2^74 = 18889465931478580854784
2^75 = 37778931862957161709568
2^76 = 75557863725914323419136
2^77 = 151115727451828646838272
2^78 = 302231454903657293676544
2^79 = 604462909807314587353088
2^80 = 1208925819614629174706176
2^81 = 2417851639229258349412352
2^82 = 4835703278458516698824704
2^83 = 9671406556917033397649408
2^84 = 19342813113834066795298816
2^85 = 38685626227668133590597632
2^86 = 77371252455336267181195264
2^87 = 154742504910672534362390528
2^88 = 309485009821345068724781056
2^89 = 618970019642690137449562112
2^90 = 1237940039285380274899124224
2^91 = 2475880078570760549798248448
2^92 = 4951760157141521099596496896
2^93 = 9903520314283042199192993792
2^94 = 19807040628566084398385987584
2^95 = 39614081257132168796771975168
2^96 = 79228162514264337593543950336
2^97 = 158456325028528675187087900672
2^98 = 316912650057057350374175801344
2^99 = 633825300114114700748351602688
2^100 = 1267650600228229401496703205376
2^101 = 2535301200456458802993406410752
2^102 = 5070602400912917605986812821504
2^103 = 10141204801825835211973625643008
2^104 = 20282409603651670423947251286016
2^105 = 40564819207303340847894502572032
2^106 = 81129638414606681695789005144064
2^107 = 162259276829213363391578010288128
2^108 = 324518553658426726783156020576256
2^109 = 649037107316853453566312041152512
2^110 = 1298074214633706907132624082305024
2^111 = 2596148429267413814265248164610048
2^112 = 5192296858534827628530496329220096
2^113 = 10384593717069655257060992658440192
2^114 = 20769187434139310514121985316880384
2^115 = 41538374868278621028243970633760768
2^116 = 83076749736557242056487941267521536
2^117 = 166153499473114484112975882535043072
2^118 = 332306998946228968225951765070086144
2^119 = 664613997892457936451903530140172288
2^120 = 1329227995784915872903807060280344576
2^121 = 2658455991569831745807614120560689152
2^122 = 5316911983139663491615228241121378304
2^123 = 10633823966279326983230456482242756608
2^124 = 21267647932558653966460912964485513216
2^125 = 42535295865117307932921825928971026432
2^126 = 85070591730234615865843651857942052864
2^127 = 170141183460469231731687303715884105728
2^128 = 340282366920938463463374607431768211456
2^129 = 680564733841876926926749214863536422912
2^130 = 1361129467683753853853498429727072845824
2^131 = 2722258935367507707706996859454145691648
2^132 = 5444517870735015415413993718908291383296
2^133 = 10889035741470030830827987437816582766592
2^134 = 21778071482940061661655974875633165533184
2^135 = 43556142965880123323311949751266331066368
2^136 = 87112285931760246646623899502532662132736
2^137 = 174224571863520493293247799005065324265472
2^138 = 348449143727040986586495598010130648530944
2^139 = 696898287454081973172991196020261297061888
2^140 = 1393796574908163946345982392040522594123776
2^141 = 2787593149816327892691964784081045188247552
2^142 = 5575186299632655785383929568162090376495104
2^143 = 11150372599265311570767859136324180752990208
2^144 = 22300745198530623141535718272648361505980416
2^145 = 44601490397061246283071436545296723011960832
2^146 = 89202980794122492566142873090593446023921664
2^147 = 178405961588244985132285746181186892047843328
2^148 = 356811923176489970264571492362373784095686656
2^149 = 713623846352979940529142984724747568191373312
2^150 = 1427247692705959881058285969449495136382746624
2^151 = 2854495385411919762116571938898990272765493248
2^152 = 5708990770823839524233143877797980545530986496
2^153 = 11417981541647679048466287755595961091061972992
2^154 = 22835963083295358096932575511191922182123945984
2^155 = 45671926166590716193865151022383844364247891968
2^156 = 91343852333181432387730302044767688728495783936
2^157 = 182687704666362864775460604089535377456991567872
2^158 = 365375409332725729550921208179070754913983135744
2^159 = 730750818665451459101842416358141509827966271488
2^160 = 1461501637330902918203684832716283019655932542976
2^161 = 2923003274661805836407369665432566039311865085952
2^162 = 5846006549323611672814739330865132078623730171904
2^163 = 11692013098647223345629478661730264157247460343808
2^164 = 23384026197294446691258957323460528314494920687616
2^165 = 46768052394588893382517914646921056628989841375232
2^166 = 93536104789177786765035829293842113257979682750464
2^167 = 187072209578355573530071658587684226515959365500928
2^168 = 374144419156711147060143317175368453031918731001856
2^169 = 748288838313422294120286634350736906063837462003712
2^170 = 1496577676626844588240573268701473812127674924007424
2^171 = 2993155353253689176481146537402947624255349848014848
2^172 = 5986310706507378352962293074805895248510699696029696
2^173 = 11972621413014756705924586149611790497021399392059392
2^174 = 23945242826029513411849172299223580994042798784118784
2^175 = 47890485652059026823698344598447161988085597568237568
2^176 = 95780971304118053647396689196894323976171195136475136
2^177 = 191561942608236107294793378393788647952342390272950272
2^178 = 383123885216472214589586756787577295904684780545900544
2^179 = 766247770432944429179173513575154591809369561091801088
2^180 = 1532495540865888858358347027150309183618739122183602176
2^181 = 3064991081731777716716694054300618367237478244367204352
2^182 = 6129982163463555433433388108601236734474956488734408704
2^183 = 12259964326927110866866776217202473468949912977468817408
2^184 = 24519928653854221733733552434404946937899825954937634816
2^185 = 49039857307708443467467104868809893875799651909875269632
2^186 = 98079714615416886934934209737619787751599303819750539264
2^187 = 196159429230833773869868419475239575503198607639501078528
2^188 = 392318858461667547739736838950479151006397215279002157056
2^189 = 784637716923335095479473677900958302012794430558004314112
2^190 = 1569275433846670190958947355801916604025588861116008628224
2^191 = 3138550867693340381917894711603833208051177722232017256448
2^192 = 6277101735386680763835789423207666416102355444464034512896
2^193 = 12554203470773361527671578846415332832204710888928069025792
2^194 = 25108406941546723055343157692830665664409421777856138051584
2^195 = 50216813883093446110686315385661331328818843555712276103168
2^196 = 100433627766186892221372630771322662657637687111424552206336
2^197 = 200867255532373784442745261542645325315275374222849104412672
2^198 = 401734511064747568885490523085290650630550748445698208825344
2^199 = 803469022129495137770981046170581301261101496891396417650688
2^200 = 1606938044258990275541962092341162602522202993782792835301376
...
--- powers of 3 ---
3^1 = 3
3^2 = 9
3^3 = 27
3^4 = 81
3^5 = 243
3^6 = 729
3^7 = 2187
3^8 = 6561
3^9 = 19683
3^10 = 59049
3^11 = 177147
3^12 = 531441
3^13 = 1594323
3^14 = 4782969
3^15 = 14348907
3^16 = 43046721
3^17 = 129140163
3^18 = 387420489
3^19 = 1162261467
3^20 = 3486784401
3^21 = 10460353203
3^22 = 31381059609
3^23 = 94143178827
3^24 = 282429536481
3^25 = 847288609443
3^26 = 2541865828329
3^27 = 7625597484987
3^28 = 22876792454961
3^29 = 68630377364883
3^30 = 205891132094649
3^31 = 617673396283947
3^32 = 1853020188851841
3^33 = 5559060566555523
3^34 = 16677181699666569
3^35 = 50031545098999707
3^36 = 150094635296999121
3^37 = 450283905890997363
3^38 = 1350851717672992089
3^39 = 4052555153018976267
3^40 = 12157665459056928801
3^41 = 36472996377170786403
3^42 = 109418989131512359209
3^43 = 328256967394537077627
3^44 = 984770902183611232881
3^45 = 2954312706550833698643
3^46 = 8862938119652501095929
3^47 = 26588814358957503287787
3^48 = 79766443076872509863361
3^49 = 239299329230617529590083
3^50 = 717897987691852588770249
3^51 = 2153693963075557766310747
3^52 = 6461081889226673298932241
3^53 = 19383245667680019896796723
3^54 = 58149737003040059690390169
3^55 = 174449211009120179071170507
3^56 = 523347633027360537213511521
3^57 = 1570042899082081611640534563
3^58 = 4710128697246244834921603689
3^59 = 14130386091738734504764811067
3^60 = 42391158275216203514294433201
3^61 = 127173474825648610542883299603
3^62 = 381520424476945831628649898809
3^63 = 1144561273430837494885949696427
3^64 = 3433683820292512484657849089281
3^65 = 10301051460877537453973547267843
3^66 = 30903154382632612361920641803529
3^67 = 92709463147897837085761925410587
3^68 = 278128389443693511257285776231761
3^69 = 834385168331080533771857328695283
3^70 = 2503155504993241601315571986085849
3^71 = 7509466514979724803946715958257547
3^72 = 22528399544939174411840147874772641
3^73 = 67585198634817523235520443624317923
3^74 = 202755595904452569706561330872953769
3^75 = 608266787713357709119683992618861307
3^76 = 1824800363140073127359051977856583921
3^77 = 5474401089420219382077155933569751763
3^78 = 16423203268260658146231467800709255289
3^79 = 49269609804781974438694403402127765867
3^80 = 147808829414345923316083210206383297601
3^81 = 443426488243037769948249630619149892803
3^82 = 1330279464729113309844748891857449678409
3^83 = 3990838394187339929534246675572349035227
3^84 = 11972515182562019788602740026717047105681
3^85 = 35917545547686059365808220080151141317043
3^86 = 107752636643058178097424660240453423951129
3^87 = 323257909929174534292273980721360271853387
3^88 = 969773729787523602876821942164080815560161
3^89 = 2909321189362570808630465826492242446680483
3^90 = 8727963568087712425891397479476727340041449
3^91 = 26183890704263137277674192438430182020124347
3^92 = 78551672112789411833022577315290546060373041
3^93 = 235655016338368235499067731945871638181119123
3^94 = 706965049015104706497203195837614914543357369
3^95 = 2120895147045314119491609587512844743630072107
3^96 = 6362685441135942358474828762538534230890216321
3^97 = 19088056323407827075424486287615602692670648963
3^98 = 57264168970223481226273458862846808078011946889
3^99 = 171792506910670443678820376588540424234035840667
3^100 = 515377520732011331036461129765621272702107522001
3^101 = 1546132562196033993109383389296863818106322566003
3^102 = 4638397686588101979328150167890591454318967698009
3^103 = 13915193059764305937984450503671774362956903094027
3^104 = 41745579179292917813953351511015323088870709282081
3^105 = 125236737537878753441860054533045969266612127846243
3^106 = 375710212613636260325580163599137907799836383538729
3^107 = 1127130637840908780976740490797413723399509150616187
3^108 = 3381391913522726342930221472392241170198527451848561
3^109 = 10144175740568179028790664417176723510595582355545683
3^110 = 30432527221704537086371993251530170531786747066637049
3^111 = 91297581665113611259115979754590511595360241199911147
3^112 = 273892744995340833777347939263771534786080723599733441
3^113 = 821678234986022501332043817791314604358242170799200323
3^114 = 2465034704958067503996131453373943813074726512397600969
3^115 = 7395104114874202511988394360121831439224179537192802907
3^116 = 22185312344622607535965183080365494317672538611578408721
3^117 = 66555937033867822607895549241096482953017615834735226163
3^118 = 199667811101603467823686647723289448859052847504205678489
3^119 = 599003433304810403471059943169868346577158542512617035467
3^120 = 1797010299914431210413179829509605039731475627537851106401
3^121 = 5391030899743293631239539488528815119194426882613553319203
3^122 = 16173092699229880893718618465586445357583280647840659957609
3^123 = 48519278097689642681155855396759336072749841943521979872827
3^124 = 145557834293068928043467566190278008218249525830565939618481
3^125 = 436673502879206784130402698570834024654748577491697818855443
3^126 = 1310020508637620352391208095712502073964245732475093456566329
3^127 = 3930061525912861057173624287137506221892737197425280369698987
3^128 = 11790184577738583171520872861412518665678211592275841109096961
3^129 = 35370553733215749514562618584237555997034634776827523327290883
3^130 = 106111661199647248543687855752712667991103904330482569981872649
3^131 = 318334983598941745631063567258138003973311712991447709945617947
3^132 = 955004950796825236893190701774414011919935138974343129836853841
3^133 = 2865014852390475710679572105323242035759805416923029389510561523
3^134 = 8595044557171427132038716315969726107279416250769088168531684569
3^135 = 25785133671514281396116148947909178321838248752307264505595053707
3^136 = 77355401014542844188348446843727534965514746256921793516785161121
3^137 = 232066203043628532565045340531182604896544238770765380550355483363
3^138 = 696198609130885597695136021593547814689632716312296141651066450089
3^139 = 2088595827392656793085408064780643444068898148936888424953199350267
3^140 = 6265787482177970379256224194341930332206694446810665274859598050801
3^141 = 18797362446533911137768672583025790996620083340431995824578794152403
3^142 = 56392087339601733413306017749077372989860250021295987473736382457209
3^143 = 169176262018805200239918053247232118969580750063887962421209147371627
3^144 = 507528786056415600719754159741696356908742250191663887263627442114881
3^145 = 1522586358169246802159262479225089070726226750574991661790882326344643
3^146 = 4567759074507740406477787437675267212178680251724974985372646979033929
3^147 = 13703277223523221219433362313025801636536040755174924956117940937101787
3^148 = 41109831670569663658300086939077404909608122265524774868353822811305361
3^149 = 123329495011708990974900260817232214728824366796574324605061468433916083
3^150 = 369988485035126972924700782451696644186473100389722973815184405301748249
3^151 = 1109965455105380918774102347355089932559419301169168921445553215905244747
3^152 = 3329896365316142756322307042065269797678257903507506764336659647715734241
3^153 = 9989689095948428268966921126195809393034773710522520293009978943147202723
3^154 = 29969067287845284806900763378587428179104321131567560879029936829441608169
3^155 = 89907201863535854420702290135762284537312963394702682637089810488324824507
3^156 = 269721605590607563262106870407286853611938890184108047911269431464974473521
3^157 = 809164816771822689786320611221860560835816670552324143733808294394923420563
3^158 = 2427494450315468069358961833665581682507450011656972431201424883184770261689
3^159 = 7282483350946404208076885500996745047522350034970917293604274649554310785067
3^160 = 21847450052839212624230656502990235142567050104912751880812823948662932355201
...


Who would have thought your humble Arduino could calculate 100 factorial! Or 2 to the power 300! It runs pretty fast too. 

Calculate e



// BigNumber test: calculate e
#include "BigNumber.h"

// function to display a big number and free it afterwards
void printBignum (BigNumber & n)
{
  char * s = n.toString ();
  Serial.println (s);
  free (s);
}  // end of printBignum

void setup ()
{
  Serial.begin (115200);
  Serial.println ();

  BigNumber::begin (50);  // max around 160 on the Uno

  // some big numbers
  BigNumber n = 1, e = 1, one = 1;

  int i = 1;
  BigNumber E;  // previous result

  unsigned long start = millis ();
  do
  { 
    E = e;
    n *= i++;  // n is i factorial
    e += one / n;
  }  while (e != E);
  unsigned long time = millis () - start;

  printBignum (e);
  Serial.print (time);
  Serial.println (" mS");
} // end of setup

void loop () { }


Output:


2.71828182845904523536028747135266249775724709369978
629 mS


Theory:

http://en.wikipedia.org/wiki/E_%28mathematical_constant%29

E can be calculated as:


1 + (1/1!) + (1/2!) + (1/3!) ...


That's why the code above is calculating running factorials, and adding the inverse of the factorial to the running total. The code breaks out of the loop when, for the desired number of decimal places, the calculated value doesn't change. That is, at this level of precision, the new amount added does not change the result.

BigNumber class


The C++ BigNumber class handles allocation and deallocation in the constructor and destructor.

For example, factorials can be produced like this:

Code:


  BigNumber::begin ();  // initialize library
 
  //factorials
  BigNumber fact = 1;

  for (int i = 2; i <= 200; i++)
  {
    Serial.print (i);
    Serial.print ("! = ");
    fact *= i;
    printBignum (fact);
  }


The normal arithmetic operations are supported (eg. assignment, add, subtract, divide, multiply, modulus). Also things like a++ or a--.

Also comparisons can be done in the natural way.

The only memory allocation you have to worry about is when you get a number to print. Since the library may have to return any size number, it does a malloc to store the number (plus a sign, and decimal point if required). It is up to you to free that string. eg.


// function to display a big number and free it afterwards
void printBignum (BigNumber n)
{
  char * s = n.toString ();
  Serial.println (s);
  free (s);
}  // end of printBignum


An important parameter is the "scale" of the number, which you can set with setScale (n). The scale is effectively the number of decimal places.

For example:


  BigNumber::begin ();  // initialize library

  BigNumber a, b = 2, c;
 
  BigNumber::setScale (0);
  a = BigNumber (1) / BigNumber (3);
  c = b.sqrt ();
  Serial.print ("1/3 = ");
  printBignum (a);
  Serial.print ("sqrt(2) = ");
  printBignum (c);


Output:


1/3 = 0
sqrt(2) = 1


Change the scale to setScale (20) and we get:


1/3 = 0.33333333333333333333
sqrt(2) = 1.41421356237309504880


Change the scale to setScale (100) and we get:


1/3 = 0.3333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333
sqrt(2) = 1.4142135623730950488016887242096980785696718753769480731766797379907324784621070388503875343276415727



So clearly the scale is affecting the results. Note that, of course, the larger the scale the slower the calculation and the more memory it will require.

Some caveats



  • Working with large numbers is necessarily slow - the larger the number, or the more decimal places, the slower.

  • Each digit requires a byte of memory, plus some overhead (eg. where the decimal point is) - large numbers will soon gobble up the available memory.

  • Doing a toString also requires memory - a byte per digit, plus the sign, decimal point, and trailing 0x00 byte.

  • An "error" condition inside the library (eg. running out of memory) calls exit(), effectively sending the library into a tight loop.

  • You may need to cast some numbers to avoid "ambiguous" warnings from the compiler.

  • If you only have 2048 bytes of RAM, you clearly need to use a library like this with caution. Running out of memory will be quite likely unless you closely manage the size of your numbers, and how many you have.

  • Memory fragmentation will quite possibly be a problem, particularly if you calculate numbers of different sizes (eg. factorials).


The supplied library has some example code (eg. powers, factorials, sine calculations, e^x, and ln(x) ).

Note that cosine and tangent can effectively be calculated from the sine.

- Nick Gammon

www.gammon.com.au, www.mushclient.com
[Go to top] top

Posted byNick Gammon   Australia  (21,293 posts)  [Biography] bio   Forum Administrator
DateReply #1 on Tue 22 Jan 2013 05:28 AM (UTC)

Amended on Tue 22 Jan 2013 06:16 AM (UTC) by Nick Gammon

Message
Improvements to printing


Thanks to suggestions from Paul Stoffregen, the library has now been modified to allow you to directly print big numbers.

For example, the Factorials example now looks like this:


// BigNumber test: factorials
#include "BigNumber.h"

void setup ()
{
  Serial.begin (115200);
  while (!Serial) ;
  delay(500);
  Serial.println ();
  BigNumber::begin ();  // initialize library
 
  //factorials
  BigNumber fact = 1;

  for (int i = 2; i <= 200; i++)
  {
    Serial.print(i);
    Serial.print("! = ");
    fact *= i;
    Serial.println (fact);
  }

}  // end of setup

void loop () { }


Modified line in bold. This was done by deriving the BigNumber class from the Printable class. This means that you can now print big numbers from any class derived from Stream (eg. Serial, Serial1, etc.).

Also changed slightly to support chips which did not have an exit() function defined in their library.

- Nick Gammon

www.gammon.com.au, www.mushclient.com






Comment +0

정수만 갖고 코딩하는것도 초보 수준인데 개념만 살짝 갖고 있는 float 변수형의 16자리수 계산에 대해 개념을 잡으려니 안개처럼 몽실몽실하게 흩어지는군요.





출처: http://elenoa.tistory.com/241

일단 부동소수점이 정확하기 힘들다는 것은 알았습니다.

이진수로 십진수를 계산하기 때문에 어쩔 수 없는 문제지요. 

예전에 인텔도 CPU에서 부동소수점 처리에 결함이 생긴 펜티업 칩 때문에 큰 손실을 본 적이 있습니다(링크)

그리고 저는 고작 10여자리의 부동소수점 때문에 골머리를 썩고 있네요.





아두이노의 레퍼런스를 읽어봅니다





6-7자리의 정확도를 갖고 있다는군요. 

거기다 저는 연산을 해야 하기 때문에 곱셈/덧셈을 할때마다 정확한 자리수가 줄어들겠죠?

생각해보니 이것도 큰 문제네요. 소숫점 이하 50자리까지 정확하다고 해도 그 숫자끼리 몇번 곱하면 곱할때마다 자릿수의 절반씩은 믿을 수 없게 될텐데요





double 을 사용한다고 해도 모자랍니다. 




비슷한 문제를 저만 겪는 건 아닐 것 같아 검색을 해보니 포럼에 비슷한 토론이 많이 있는데 딱히 이거다 하는 해결책은 안보이는군요.





하드웨어의 한계도 있어서 이런 물건도 나오는 듯 합니다. 




그 와중에 GitHub에서 SoftFloat 이라는 아두이노 라이브러리를 찾았는데

description이 하나도 없어서 이해를 못하겠네요;; 헤더파일 보고 해석할 역량은 안되는데 말이죠

https://github.com/mmoller2k/Float64



Comment +0

큰 청소기를 들고 왔다갔다 하는게 힘들어 창고에서 쓸 적당한 청소기가 있었으면 좋겠다 싶었습니다. 

딱히 급하지도 않고 꼭 필요한것도 아니라 

중고로 하나 살까 생각하고 중고나라도 살짝 기웃거리던 중이었죠

그러다가 밤중에 누가 버린 청소기 2대를 발견합니다.

하나는 충전식, 하나는 일반형.


하나만 건져도 다행이겠다 싶어 일단 2개 다 들고왔습니다. 







일반형 청소기는 전선이 끊어져 있더군요

일단 연결해서 켜보니 모터는 쌩쌩하게 잘 돌아가길래 전선을 사왔습니다. 






고장난것도 아닌데 왜 전선이 끊어져 있는지는 의문이네요






끊어진 부분에서 그냥 납땜으로 연결하려고 했는데 외피가 이미 찢어져 있습니다.

불안하니 그냥 교체해주기로 합니다. 






태옆을 풀어야 하는 문제가 있군요.

잘 풀어서 케이블 타이로 묶어놓으면 그냥 그대로 다시 쉽게 끼울 수 있지 않을까 합니다.






실패했습니다.








내부에는 이렇게 슬립링이 있습니다. 

열어본 김에 좀 닦아줬습니다. 






전선 외피가 가늘어서 고정이 잘 되지 않습니다. 






케이블 타이로 묶어서 걸리도록 해 줬습니다. 







태엽을 원래대로 감아줍니다. 이거 꽤 힘들더군요.






욕나옵니다. 






힘들게 다시 끼워놓고 끝단에 플러그를 연결합니다.

몇번 테스트해보니 당기는 힘에 전선이 내부에서 끊어져 버렸습니다. 






며칠전에 쓰고 남은 자전거용 핸들바 그립을 감아줬습니다. 






다 했나 싶었는데 이번에는 뚜껑만 씌우면 전선이 무조건 감기는 증상이 생겼습니다. 

오늘은 욕을 좀 많이 했습니다. 

뚜껑 부분에 전선감개 스위치가 있는데 그걸 갈아내서 높이를 낮춰도 마찬가지길래

내부 브레이크 부품을 빼냈습니다. 






라이타로 지져서 위쪽으로 살짝 휘었습니다. 






이제는 잘 됩니다. 





그리고 전원을 켜보니 모터 소리는 쌩쌩한데 흡입력이 개판입니다. 



내부에 헤파필터를 꺼냈습니다. 전 사용자가 한번도 청소를 안한 모양입니다.

이제는 욕나올 기력도 없습니다. 






에어로 불다가 덩어리가 안 빠져서 아예 철사로 긁어냈습니다. 

몇년동안이나 필터청소를 안하면 이렇게 되는지 모르겠습니다.





 


물청소해도 되는 필터라 나머지는 물청소하고 이제 건조중입니다. 

땟물이 한 드럼은 나온 것 같습니다. 




충전식 청소기는 니켈수소 배터리라 수명 다 되서 버린 것 같은데 

이것도 리튬으로 교체하고 사용할 예정입니다. 

Comment +5


키보드 매트릭스를 테스트하는 중인데 이상하게 2열의 1,2,3 등의 숫자만 입력이 안되더군요






핀에 문제가 있나 하고 핀아웃도 다시 확인하고






배선설정과 실제 스케치간에 연결이 다른부분이 있나 다시 확인해봤습니다. 

문제는 그냥 제가 시리얼로 결과를 확인하고 있다는 것이었지요

Tx 핀으로 입력을 하는데 그걸 시리얼 출력으로 쓰고있으니 당연히 안되는 것이었습니다. 




수정해서 키패드 입력을 LED 디스플레이로 하는건 금방 되었는데

본격적으로 계획을 짜보니 이게 생각보다 난이도가 상당히 높네요.

스케치를 짜려고 보니 생각해야 할 부분이 많습니다.


1. 키패드 매트릭스는 사칙연산 부호 등 때문에 char 형태로 데이터를 주고받음 -> '0' 문자를 숫자로 변경하는건 쉬움. 

2. 25개의 매트릭스 입력에 따라 숫자, 문자 등으로 분류하여 각각 다른 계산을 해야함 -> 역시 어렵진 않을듯. 

3. 계산기의 자리수는 16자리이므로 최대 9999999999999999 까지 표시할 수 있다. 

소수점을 사용해야 하므로 float 변수를 사용하는데 소수점 이하를 표시하려면

앞에 표시될 '0.' 글자를 빼면 소수점 14자리까지 쓸 수 있어야 한다. 

기본적으로 디스플레이에서 float 함수를 쓰면 소수점 2번째 자리까지만 표시되며

"%f" 형을 사용해 float 형을 출력하면 이하 숫자의 오류가 생긴다. 

dtostrf() 함수를 사용하면 3번째이하 자리수를 처리할 수 있지만 

소수점 이하 자리수를 정확히 알고 있는 경우가 아니면 역시 오류가 생긴다 ->갑자기 최종보스 출현한 난이도..;


검색해보니 부동소수점 문제는 원래 어렵더군요.. 

아두이노 계산기 예제라고 나와있는것도 죄다 정수처리만 가능한 간단형 버전이고요.



913425.45 를 출력하면 저렇게 나옵니다.

일단 정확하게 출력하는것도 문제지만 그걸 또 연산처리해야한다는 점이 엄청 골치아프네요

Comment +2

  • 하얀마음얀1004 2017.10.31 08:48 신고

    몇년전에 구매한 버튼이 여러개 달린 LCD에는 아나로그 입력핀 1개에 여러개의 저항에 버튼을 달아 저항값을 읽어 눌린 버튼을 처리하는것을 보았습니다.
    핀이 부족할 때는 그방법도 좋을것 같습니다.

    • 그 문제는 해결되었습니다. 지금은 float 형의 소수점 이하 10자리까지 제대로 표시하는 문제가 남아있는데 이건 검색을 해봐도 어렵네요..

이렇게 하면 좋겠다 하고 생각만 하고 있었는데

마침 다이소에 자전거용 그립 테이프가 있길래 사와서 작업했습니다. 




보통 로드에 많이 쓰이는 드롭바에 감는 손잡이용 테이프입니다. 

말은 테이프지만 끈끈하거나 하지는 않고 푹신하고 늘어나는 충격흡수 고무 같은 재질입니다. 




마감용으로 전용 테이프가 있기도 하지만 전기 절연 테이프도 많이 씁니다. 

저는 이렇게 손이 자주 닿을 부분에는 일반 절연 테이프를 쓰지 않고 3M 제품을 따로 씁니다. 

일반 제품은 수명이 짧아서 금방 끈끈이가 녹아서 지저분해지고 떨어집니다. 




언제부터 썼는지 기억이 안나는 펜치입니다.

손잡이 고무가 다 늘어나서 결국 벗겨지고

절연테이프나 전선 수축튜브 등으로 손잡이를 만들어 썼는데

별로 오래 가질 못하더군요





원래는 한쪽만 테이프로 마감하고 반대쪽은 자전거 핸들 파이프 속으로 들어가서 마감하게 되어 있습니다. 





잠깐 테스트를 해보니 절연테이프 마감보다 

순간 접착제가 더 잘 고정될 것 같습니다. 




 

순간접착제로 아주 잘 붙습니다. 






최대한 당겨 붙였는데 두께가 있다보니 원래 손잡이보다는 약간 굵어졌습니다.

그래도 그립감은 나쁘지 않네요





조심해서 썼는데도 접착제와 함께 테이프가 손에 묻었군요


Comment +0

아예 AVR 정품 AVR ISP 를 사고싶은 마음도 있지만 

이건 그냥 장비병인 것 같습니다.  쇼핑몰만 둘러보다 포기.




Aliexpress에서 호환 AVRISP MKii 를 샀는데 도착하고 보니 Vcc 에 전원이 안 들어오는 불량품이네요..

일단 Dispute 넣고 그냥 아두이노에 ArduinoISP 넣고 Atmega128에 부트로더를 구웠습니다. 



사실 지난번 ISP 드라이버 안 잡혔을때 이렇게 할까 했지만 미루다 보니 이렇게 됐네요

그냥 아두이노 보드 하나 잡아서 ISP를 따로 만들어 두어야 하나 생각중입니다. 






마찬가지로 지난번에 케이스에 넣었던 FTDI 보드로 업로드했더니 잘 됩니다. 

Blink로 빨간색 LED를 껐다 켰다 해 보았습니다. 






처음에 Atmega128을 쓰려고 했던 이유가 아두이노 핀이 모자랄 것 같아서였습니다

마침 Atmega128 칩도 많이 있는 이유도 있었죠.

그런데 아두이노 보드를 하나하나 체크해 보니 핀이 모자르진 않다는 걸 알게 되었습니다. 

오히려 딱 맞게 쓰고 한두개는 여유있을 정도네요


덕분에 좀 쉽게 갈 수 있을 것 같습니다. 





항상 CNC로 보드를 깎아 버리는걸 선호하지만

이번에는 추가로 주변회로가 어떻게 변할 지 몰라서 

전용 테스트 보드를 만들기에는 문제가 있습니다. 

일반 단면 만능기판에 테스트 보드를 구성하기로 했습니다. 




LED 디스플레이 선을 연결하고 테스트해봤습니다. 

이번 작업은 여기까지입니다.




Comment +0

e홈 카페에서 공구했던 중국산 파워 서플라이를 쓰고 있습니다. 


최대 30V 10A 까지 출력되는 물건인데


최근에는 12V 이상으로 올라가질 않더군요.


카페에서 고장관련 검색하다 보니 저항을 교체해보라는 얘기가 있어 뜯어봤습니다. 




내부의 조절 저항은 1KOhm 저항이고 2가지 종류로 되어 있습니다. 











새로 산 저항은 정상적으로 1KOhm이 나옵니다. 








파워 서플라이에서 뜯어낸 저항은 3KOhm이 넘게 나오는군요.









기판에서 가변저항을 교체하고 끼워보니 나사산이 튀어나오질 않습니다. 








비교해 보니 손잡이 길이가 차이가 나네요









안쪽의 턱을 잘라내고 다시 끼워보니 약간이나마 튀어나옵니다. 











볼트로 조여 고정합니다. 










노브 사이즈도 미묘하게 달라서 원래 노브는 헐거워 빠져버리더군요.


다른 노브로 교체했습니다. 









원래대로 30V 까지 잘 올라갑니다. 









조절도 잘 되는군요. 






처음엔 저항이 문제일거라 생각도 못하고 나름 비싸게 산거 버려야 하나 하고 걱정했는데


다행히 저렴하게 수리가 가능했네요






------------------------------------------------------------------------------------------------


그리고 수리한지 일주일만에 청소기 모터에 전원넣다가 폭발했다는 소식입니다. 어흑..

Comment +0


입구 맨앞에 있던 부스. 


병뚜껑을 손으로 튕겨 멀리 갈수록 점수가 높게 나옵니다. 









올해도 어김없이 참가하신 김용승님의 로봇 자판기. 


아예 바퀴가 달려 자판기 자체가 움직이더군요









페어 구석에서는 이런 모습이 한창입니다. 










오로카 팀의 부스입니다. 





라즈베리 파이를 이용한 로봇과 다른 여러가지 프로젝트들을 많이 하시는 곳이죠




 


회로와 배터리, 모터 구성으로 볼 때 무게가 약간은 있을 듯 합니다.


그런데 저만한 사이즈의 헬륨 풍선으로 충분히 떠오르더군요











아이와 같이 참가한 부스도 있고 중학생, 고등학생 부스도 꽤 있습니다. 










자작중인 DLP 프린터를 들고나오셨는데 저도 만들다 만 경험이 있어서 반갑더군요


얘기를 좀 해보니 저랑 비슷한 트러블이 있었습니다. 


하향식의 경우 출력 크기를 확보하기 어렵고 


기구물이 레진 속으로 들어가는 만큼 레진 수면이 올라오는 데 맞춰 촛점이 안맞는 문제가 있고


책상이 흔들리거나 할 경우 레진 수면이 흔들리는 만큼 매끈한 표면을 얻기 힘들고 등등..


저는 이제 중지한 프로젝트지만 잘 되시길 바랍니다. 







참여형 프로젝트들은 항상 인기가 많습니다. 











요즘은 메이커 열풍에 힘입어 학습용 키트도 많이 나오죠.











4$ 저금통. 동전을 4개 넣을때까지 4딸라! 외쳐대는 드라마의 한 장면이 나옵니다. 


단순히 금속성 물체를 체크하는 게 아니고 10원짜리 100원짜리 구별해가며 총액이 표시됩니다. 


궁금해서 물어봤는데 입력부의 동전 체크기가 동전을 구별해서 시리얼로 데이터를 보내준다네요







개성적인 자작 자동차들도 많이 나옵니다. 








행사에 가면 사진보다는 관람에 흥미가 많아서 


꼭 끝나고 나면 사진이 별로 없네요



올해까진 정말 개인적으로 불가능했는데


내년에는 진지하게 참가해볼까 생각을 다시한번 해봅니다. 


Comment +0


변환보드를 하나 살까 했는데 변환보드 하나에 6000원이라 


에라 하고 이글캐드를 실행해서 보드를 만들고 CNC로 깎았습니다. 


역시나 패턴이 좁아서 실패를 두어번 했네요










USBASP로 부트로더를 심으려고 하는데 안됩니다. 


에러 메세지를 보니 USBASP가 안 잡힌답니다.  


분명 드라이버를 설치했는데 말이죠.


부트로더를 쓸 때마다 최신 운영체제에 대응이 늦어 골때리는 경우가 자주 생기는군요


단순히 시키는 대로 해볼 뿐이라 이런 경우 어떻게 대응해야 하는지 잘 모르고 그대로 스톱됩니다. 






원래 계획대로 쉬프트 레지스터를 쓸지 말지 생각중입니다. 

Comment +0

기계식 키보드의 키를 심어서 계산기를 만들면

타격감과 오타율이 적은 계산기를 만들 수 있지 않을까 하던 중에

단순히 기존 계산기를 모딩하지 않고 아예 아두이노로 제작할까 하는 생각이 들었습니다. 






그리고 디스플레이를 전에 구해놓은 HCMS-2912 디스플레이를 이용해서 만들면 

참 이쁜 물건이 될 것 같더군요.







계산기의 키패드는 보통 5열 5행이기 때문에

5*5 키패드 매트릭스가 필요합니다. 








5*5 매트릭스는 10개의 입력핀이 필요하기 때문에

아두이노에서 직접 입력을 받는건 힘들고

74HC165 같은 쉬프트 레지스터를 이용하게 됩니다. 









그래서 74HC165 를 일단 몇개 구매했습니다. 

그리고 아두이노 보드를 계산기 기판에 그대로 심으면 높이 차이가 많이 생겨 케이스를 씌우는 데 무리가 따를 것 같아

아예 계산기 보드에 아두이노를 포함시키려 했습니다. 







그런데 부품박스를 열어보니 ATMEGA168 옆에 ATMEGA128 칩이 보입니다. 






검색해보니(링크) 아두이노로 사용 가능합니다. 







핀 수가 훨씬 많기 때문에 쉬프트 레지스터 없이 바로 사용이 가능하겠네요


결국 ATMEGA168(아두이노)+쉬프트 레지스터 로 가느냐

아니면 ATMEGA128 을 아두이노로 만들어서 쓰느냐 하는 문제인데

ATMEGA128이 쓸데없이 재고가 많은 관계로 이걸 쓰기로 했습니다. 






Comment +0


아두이노 프로 미니 버전을 쓰려면 FTDI 보드를 연결해야 합니다. 


그냥 쓰기엔 좀 불편한 부분이 있어 아예 케이스에 집어넣자 생각했습니다 


깡통을 고르다가 보니 민트 케이스가 적당해 보입니다. 











드릴로 뚫고 줄질을 합니다.











하다보니 귀찮아져서 전동조각기로 뚫어냈습니다. 


그리고 다시 줄로 세세한 마무리를 합니다.














에폭시 퍼티로 살짝 붙여놨습니다. 


어차피 얇은 철판에는 오랫동안 튼튼하게 붙어있기 힘듭니다. 


배선완료후 윗면을 다시 퍼티로 덮어서 고정할 생각입니다. 











3.3V / 5V 전원 선택 점퍼를 스위치로 교체하고, RX / TX LED를 외부로 연결했습니다.












이쁘긴 하지만 뭔가 다른 부품들과 위화감이 좀 있군요.







Comment +2

  • 홍경식 2018.01.09 15:11 신고

    안녕하세요?
    저도 저렇게 작은 보드의 케이스를 만드려고 하는데, 잘 만드셨군요.
    절연때문에 플라스틱 케이스를 쓰려고 합니다.


자전거 헬멧 내피가 이젠 도저히 사용할 수 없을 지경으로 삭았습니다. 


헬멧 자체는 손상이 전혀 없고, 제 두상에도 잘 맞는 헬멧이라 새로 살 생각은 들지 않네요


인터넷을 뒤져봐도 같은 제품의 내피는 나오지 않았습니다. 












일단은 더 삭아서 끊어지기 전에 A4용지에 대고 본을 그렸습니다. 






 






다이소에서 산 땀수건을 3겹이 되도로 접으면 적당한 크기가 되네요


시침을 하기는 영 귀찮고 해서 종이본을 딱풀로 붙여버렸습니다. 






어머니가 쓰시는 재봉틀을 빌렸습니다. 


저는 재봉틀 사용법은 아는데 잘 쓸줄 아는 건 아닌 뭐 그런 수준입니다. 












시침을 재봉틀로 해놓고 선을 따라 잘랐습니다. 


재봉가위의 날카롭기는 엄청나더군요







딱풀로 붙인 종이본을 물에 불려 떼어냅니다. 


이 과정에서 땀수건의 올이 많이 풀리더군요. 


애초에 딱풀은 쓰지 말고 바느질로만 고정할 걸 그랬습니다. 









어느 패턴이 올이 잘 안 풀릴지 이것저것 테스트해보는중










재봉은 초보자라 그리 깔끔하진 않습니다. 


그래도 뭐 헬멧 내피로 들어갈거라 보일 일도 없고 해서 그냥 이대로 마무리했습니다. 









잘된 곳은 잘됐는데 안된 곳은 걸레 꿰메놓은 것 같네요.












헬멧과의 접착은 벨크로로 하게 되어 있습니다. 



역시 다이소에서 구매한 벨크로 테잎을 사용합니다. 










모양은 좀 거시기 하지만 머리에 잘 맞고 좋네요

Comment +0

예전에 포스팅(링크) 한 적이 있듯이


저가형 다이모 라벨기에도 수축튜브 라벨을 사용 가능합니다. 


알리익스프레스에서 주문한 수축튜브 라벨이 도착해서 테스트 해봤습니다. 



3가지 사이즈 세트로 주문했습니다. 









그런데 주문실수로 안맞는 사이즈 1개가 포함되어 왔네요..





사이즈는 총 5종류이고 제가 갖고있는 라벨프린터에는 왼쪽 3개를 시켰어야 하는데


셀러에게 주문시 말한다는걸 잊고 그냥 주문해 버렸습니다. 


쓰지도 못할 3/4" 사이즈가 들어간 세트가 도착했군요.









수축전의 튜브는 보통 쓰는 수축튜브보다는 얇은 느낌입니다. 






일단 있는것만 출력해 봅니다 .









폰트가 너무 가늘면 잘 정착되지 않는 것 같습니다. 


저렇게 나오긴 해도 긁어서 떨어지거나 하진 않습니다. 










7파이(수축전) 인 수축튜브입니다.


수축후 대략 4파이 정도 됩니다. 









글자도 같이 수축되고 가시성도 좋네요. 









5파이 짜리를 테스트해 보는데 잘 나오지 않는 듯 했습니다. 


첫 부분을 손으로 좀 뽑아보니 그때부턴 잘 나옵니다. 










수축전 5파이, 수축후 3파이 입니다. 












마음에 듭니다. 


평균적으로 제가 쓰는 전선들은 가는 것들이라 


제일 작은 사이즈를 주문했어야 하는데 못한 게 아쉽네요.

Comment +0


만들던거는 몇가지 있긴 한데 별 의욕이 안생겨서 그냥 책이나 읽으면서 놀고 있습니다. 







그래도 프린터 문제는 해결해야 겠기에.. 


익스트루터가 자꾸 드득거리며 압출이 잘 안되는 문제는 한참 원인을 찾고 보니


제가 구입한 중국산 PLA 필라멘트가 무려 230도에서 녹는 괴랄한 물건이었기 때문인데요. 


왠지모르게 이참에 익스트루더를 좋은거로 바꾸고 싶은 욕망이 솟아올라


Titan Aero 익스트루더를 구매했습니다. 











요런 구조입니다. 기어로 감속하기 때문에 스탭모터를 아주 작은걸 써도 되고, 그만큼 무게를 가볍게 할 수 있습니다. 


Titan 'Aero' 버전은 전면에 CNC 가공 플레이트를 달아 아래쪽 길이를 짧게 할 수 있습니다. 


제가 자작한 CoreXY 구조상 Aero 버전으로 하지 않으면 Z축 높이에서 손해를 많이 보기 때문에


약간 더 비싼 Aero 버전으로 장착했습니다. 










타이밍 풀리 고정하는 M3 볼트가 은근히 휘어져서 보강부품 출력중. 


이후엔 Bltouch 장착 예정입니다. 출력배드가 살짝 휘어져서 전체 배드를 동시에 사용하는게 힘드네요.


Marlin 펌웨어 도큐를 보면 bltouch 장착하고 레벨링을 해서 휘어진 배드에서도 출력이 가능한 듯 한데


일단 펌웨어 수정해가며 직접 부딪혀봐야할듯. 





추가로 각종 센서들이 자꾸 문제가 있어 확인해 보았습니다. 


Ramps 보드가 너무 오래되어 핀들이 죄다 꺼멓게 부식된게 원인인듯; 


몇번 꽂았다 뺐다 반복하니 해결은 됐습니다만 조만간 또 그럴게 확실하여 새 보드로 교체해야 겠습니다. 


중국산이 싸고 좋기는 한데 도금이 개판이라 전자부품 수명이 너무 짧네요. 





Comment +0

저같은 사람들이 항상 그렇듯 각종 상자에 부품들이 쌓여 있다가 


점점 뭐가 어디에 있는지 알 수 없는 상황이 되기 전에


가끔씩 정리를 해야만 하는 상황이 오죠.






그러다가 운 좋게도 몇년 전에 사놓고는 뚜껑을 분실해서 쓰지도 못하고 있었던 열전사 프린터의 뚜껑을 찾아냈습니다. 










adafruit 에서 라이브러리와 소스를 제공(링크) 하고 있어 연결후 긴 텍스트만 출력하도록 수정해서 업로드해봤더니 잘 되는군요.


 









이런 종류의 프린터에는 감열지라는 특수 종이를 사용하죠. 


열을 가하면 검게 변색되는 코팅처리가 되어 있어 프린터에서 잉크를 찍는 게 아니라 열을 가해서 글자를 인쇄합니다. 


잉크 리필이나 청소 등 유지보수가 거의 필요 없는 장점이 있는 대신


용지 자체의 내구성이 떨어져 장기 보관시 잉크가 흐려져 지워지는 단점이 있습니다. 










하여간, 이 감열지를 꽤 많이 갖고는 있습니다. 










문제는 제가 갖고있는건 79mm 용지라는거죠. 


저 프린터는 57mm 용지를 사용하고요. 









용지 가격이 비싸진 않습니다만 50롤씩 판매하거나 하는 경우가 많고 


5롤 이하 소량으로 판매하는 곳은 찾기 힘듭니다. 


79mm 용지만 많이 갖고있어도 어차피 향후 10년간은 쓸데가 없을 것 같아 


잘라서 사용하기로 마음을 먹었습니다. 












포맥스를 적당히 잘라 구조를 만들어 봤습니다. 


종이가 들어가는 곳의 폭을 정확히 79mm 로 만들었고요











57mm 거리에 정확하게 칼날을 박습니다. 












그리고 종이를 끼워 당기면 이렇게 잘라집니다. 











은근히 재밌습니다. 








신나게 자릅니다. 










어디에 쓸지 고민좀 해봐야겠습니다. 

Comment +0

한참 고민하다가 그냥 본명 사용했습니다. 


이제는 어차피 얼굴책 때문에 실명이랑 온라인명 구분하기도 애매하고.. 

Comment +0


100K 서미스터와 히터를 구리 테이프로 감았습니다. 


구리 테이프가 없다면 철물점에서 파는 알루미늄 테이프도 괜찮습니다. 








히터의 저항은 5.6옴이니


옴의 법칙 I = V / R 에 의해


리튬이온 배터리로 구동시 3.7V / 5.6Ohm = 0.66A 정도가 흐르게 됩니다. 











IRF510 MOSFET으로 간단하게 스위칭 회로를 만들었습니다. 








서미스터 온도체크 스케치는 adafruit의 것을 참조해서 스케치에서 10K 로 된 부분을 100K 로 수정해서 사용했습니다. 


https://learn.adafruit.com/thermistor/using-a-thermistor


 AREF 에 연결하여 레퍼런스 전압을 이용하면 더 정확하게 온도를 구할 수 있더군요








단순 ON/OFF 입니다. 50도 이하 ON, 50도 이상 OFF...








그냥 켜두면 위와 같은 온도편차 그래프를 보입니다. 








손을 접촉시키면 그래프에 변동이 심해집니다. 


PID 컨트롤까진 필요 없을 듯도 합니다. 


Comment +0

', 'auto'); ga('send', 'pageview');